Merge pull request 'dev_yi' (#1) from dev_yi into main

Reviewed-on: #1
This commit is contained in:
张壹 2025-02-03 12:07:58 +08:00
commit 2df0007b20
33 changed files with 35291 additions and 341 deletions

BIN
GCTL_logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

105
README.md
View File

@ -1,2 +1,105 @@
# gctl_potential
![logo](GCTL_logo.jpg)
# GCTL Potential
GCTL Potential 是地球物理计算工具与库Geophysical Computational Tools & Library, GCTL的重力和磁力场正演模拟模块。该模块提供了一系列用于计算重力场和磁场的核心功能。
## 功能特性
### 重力场计算 (G-Kernel)
- 2D模型计算
- `gkernel_triangle2d`: 二维三角形体
- `gkernel_rectangle2d`: 二维矩形体
- `gkernel_polygon`: 二维多边形体
- 3D模型计算
- `gkernel_triangle`: 三维三角形体
- `gkernel_sphere`: 球体
- `gkernel_block`: 长方体
- `gkernel_tetrahedron`: 四面体
- `gkernel_tricone`: 三锥体
- `gkernel_tesseroid`: 曲面格网体(需要 GCTL_POTENTIAL_TESS 选项)
### 磁场计算 (M-Kernel)
- `mkernel_dipole`: 偶极子
- `mkernel_block`: 长方体
- `mkernel_triangle`: 三角形体
- `mkernel_tricone`: 三锥体
- `mkernel_tetrahedron`: 四面体
- 标准实现
- Ren2017 实现方法
- `mkernel_tesseroid`: 曲面格网体(需要 GCTL_POTENTIAL_MAGTESS 选项)
### 网格与数据结构
- `gm_data`: 基础数据结构
- `gm_regular_grid`: 规则网格
- `gm_regular_mesh_2d`: 二维规则网格
- `gm_regular_mesh_3d`: 三维规则网格
- `gm_regular_mesh_sph_3d`: 三维球面规则网格
- `gm_tet_mesh`: 四面体网格
## 依赖
- Eigen (矩阵运算库)
- autodiff (自动微分库,用于梯度计算)
## 许可证
GCTL Potential 采用双重许可证方案:
1. GNU Lesser General Public License v2 或更高版本
2. 商业许可证(需单独购买)
## 作者
- Yi Zhang (yizhang-geo@zju.edu.cn)
## 安装
使用 CMake 构建系统:
```bash
mkdir build
cd build
cmake ..
make
make install
```
## 示例
`example` 目录下提供了丰富的示例代码,展示了各种计算功能的使用方法:
### 重力场计算示例
- `gobser_tri2d_ex.cpp`: 二维三角形体重力场计算
- 演示了如何读取 GMSH 格式的网格文件
- 计算重力位、重力分量和重力梯度张量
- 结果输出为 DSV 格式
- `gobser_tri2d_sph_ex.cpp`: 球面坐标系下的二维三角形体重力场计算
### 磁场计算示例
- `mobser_tetra_ex.cpp`: 四面体磁场计算
- 展示了标准实现和 Ren2017 方法的对比
- 包含磁位、磁场分量和 ΔT 异常计算
- 支持 NetCDF 格式输出
- `mobser_tetra_ex2.cpp`: 四面体磁场计算的另一个示例
- `mobser_block_ex.cpp`: 长方体磁场计算
- `mobser_tricone_ex.cpp`: 三锥体磁场计算
- `mobser_tesseroid_ex.cpp`: 曲面格网体磁场计算
- `mobser_dipole_ex.cpp`: 偶极子磁场计算
- `mobser_tri_ex.cpp`: 三角形体磁场计算
- `mobser_tri_sph_ex.cpp`: 球面坐标系下的三角形体磁场计算
### 特殊功能示例
- `power_spectrum_ex.cpp`: 功率谱计算示例
- `read_IGRF_ex.cpp`: IGRF 地磁场模型数据读取示例
- `mobser_block_gradient_ex.cpp`: 长方体磁场梯度计算
### 数据格式支持
- 网格文件格式:
- GMSH 格式 (.msh)
- Tetgen 格式 (.node, .ele)
- 输出格式:
- DSV (Delimiter-Separated Values)
- NetCDF
- 文本格式
所有示例代码都包含详细的注释,并提供了完整的数据输入输出流程。用户可以根据需要修改示例代码中的参数来适应自己的应用场景。
## 注意事项
- 某些功能(如 tesseroid 计算)需要在编译时启用特定选项
- 商业用途请联系作者获取商业许可证

View File

@ -0,0 +1,10 @@
//+
SetFactory("OpenCASCADE");
Circle(1) = {0, -100, 0, 20, 0, 2*Pi};
//+
Curve Loop(1) = {1};
//+
Plane Surface(1) = {1};
//+
Physical Surface("Body", 2) = {1};

View File

@ -0,0 +1,202 @@
X Y Vx Vz Vxx Vxz Vzx Vzz
-500 0 0.0318575695325 0.00637151390649 5.88139745215e-05 2.45058227173e-05 2.45058227173e-05 -5.88139745215e-05
-495 0 0.0321542531032 0.00649580870773 5.98638345862e-05 2.5216549831e-05 2.5216549831e-05 -5.98638345862e-05
-490 0 0.0324562523665 0.00662372497276 6.09403884939e-05 2.59546200452e-05 2.59546200452e-05 -6.09403884939e-05
-485 0 0.0327637028692 0.00675540265344 6.20444719184e-05 2.67213398872e-05 2.67213398872e-05 -6.20444719184e-05
-480 0 0.0330767444064 0.006890988418 6.31769487241e-05 2.75180901884e-05 2.75180901884e-05 -6.31769487241e-05
-475 0 0.0333955211651 0.00703063603475 6.43387117239e-05 2.83463309624e-05 2.83463309624e-05 -6.43387117239e-05
-470 0 0.0337201818698 0.00717450678081 6.55306834159e-05 2.92076066434e-05 2.92076066434e-05 -6.55306834159e-05
-465 0 0.0340508799335 0.00732276987816 6.67538166924e-05 3.01035517149e-05 3.01035517149e-05 -6.67538166924e-05
-460 0 0.0343877736109 0.00747560295888 6.80090955104e-05 3.10358967607e-05 3.10358967607e-05 -6.80090955104e-05
-455 0 0.0347310261554 0.00763319256163 6.92975355123e-05 3.20064749733e-05 3.20064749733e-05 -6.92975355123e-05
-450 0 0.0350808059793 0.00779573466206 7.06201845857e-05 3.3017229157e-05 3.3017229157e-05 -7.06201845857e-05
-445 0 0.0354372868156 0.00796343523946 7.19781233457e-05 3.40702192675e-05 3.40702192675e-05 -7.19781233457e-05
-440 0 0.0358006478832 0.00813651088255 7.33724655224e-05 3.51676305336e-05 3.51676305336e-05 -7.33724655224e-05
-435 0 0.0361710740532 0.00831518943751 7.48043582351e-05 3.63117822092e-05 3.63117822092e-05 -7.48043582351e-05
-430 0 0.0365487560157 0.00849971070132 7.62749821273e-05 3.75051370094e-05 3.75051370094e-05 -7.62749821273e-05
-425 0 0.0369338904481 0.00869032716427 7.77855513392e-05 3.87503112898e-05 3.87503112898e-05 -7.77855513392e-05
-420 0 0.0373266801818 0.00888730480519 7.93373132824e-05 4.0050086032e-05 4.0050086032e-05 -7.93373132824e-05
-415 0 0.0377273343674 0.00909092394396 8.09315481854e-05 4.14074187048e-05 4.14074187048e-05 -8.09315481854e-05
-410 0 0.0381360686374 0.00930148015547 8.25695683649e-05 4.28254560779e-05 4.28254560779e-05 -8.25695683649e-05
-405 0 0.0385531052638 0.00951928525033 8.42527171775e-05 4.43075480693e-05 4.43075480693e-05 -8.42527171775e-05
-400 0 0.0389786733103 0.00974466832758 8.59823675963e-05 4.5857262718e-05 4.5857262718e-05 -8.59823675963e-05
-395 0 0.0394130087756 0.00997797690521 8.77599203484e-05 4.74784023799e-05 4.74784023799e-05 -8.77599203484e-05
-390 0 0.0398563547266 0.010219578135 8.95868015415e-05 4.91750212543e-05 4.91750212543e-05 -8.95868015415e-05
-385 0 0.0403089614182 0.0104698601086 9.14644596945e-05 5.09514443586e-05 5.09514443586e-05 -9.14644596945e-05
-380 0 0.0407710863965 0.0107292332622 9.33943620754e-05 5.28122880783e-05 5.28122880783e-05 -9.33943620754e-05
-375 0 0.0412429945814 0.0109981318884 9.53779902354e-05 5.47624824318e-05 5.47624824318e-05 -9.53779902354e-05
-370 0 0.0417249583257 0.0112770157637 9.74168346095e-05 5.68072952018e-05 5.68072952018e-05 -9.74168346095e-05
-365 0 0.0422172574429 0.0115663719022 9.95123880359e-05 5.8952358098e-05 5.8952358098e-05 -9.95123880359e-05
-360 0 0.0427201792011 0.0118667164448 0.000101666138022 6.12036951306e-05 6.12036951306e-05 -0.000101666138022
-355 0 0.0432340182738 0.0121785966968 0.000103879557563 6.35677533892e-05 6.35677533892e-05 -0.000103879557563
-350 0 0.0437590766408 0.0125025933259 0.000106154094277 6.6051436439e-05 6.6051436439e-05 -0.000106154094277
-345 0 0.0442956634305 0.0128393227335 0.000108491157607 6.86621405627e-05 6.86621405627e-05 -0.000108491157607
-340 0 0.0448440946922 0.0131894396154 0.000110892103772 7.14077940959e-05 7.14077940959e-05 -0.000110892103772
-335 0 0.045404693087 0.0135536397275 0.000113358218134 7.42969001219e-05 7.42969001219e-05 -0.000113358218134
-330 0 0.0459777874834 0.0139326628737 0.000115890694551 7.73385828147e-05 7.73385828147e-05 -0.000115890694551
-325 0 0.046563712441 0.0143272961357 0.000118490611284 8.05426377357e-05 8.05426377357e-05 -0.000118490611284
-320 0 0.0471628075641 0.0147383773638 0.000121158902884 8.39195864129e-05 8.39195864129e-05 -0.000121158902884
-315 0 0.0477754167033 0.0151667989534 0.000123896327454 8.74807355519e-05 8.74807355519e-05 -0.000123896327454
-310 0 0.0484018869805 0.0156135119292 0.000126703428568 9.12382412451e-05 9.12382412451e-05 -0.000126703428568
-305 0 0.0490425676083 0.0160795303634 0.00012958049099 9.52051785651e-05 9.52051785651e-05 -0.00012958049099
-300 0 0.0496978084706 0.0165659361569 0.000132527489255 9.93956169413e-05 9.93956169413e-05 -0.000132527489255
-295 0 0.050367958426 0.0170738842122 0.000135544027977 0.000103824701728 0.000103824701728 -0.000135544027977
-290 0 0.051053363289 0.0176046080307 0.00013862927259 0.000108508742378 0.000108508742378 -0.00013862927259
-285 0 0.0517543634389 0.018159425768 0.000141781869041 0.000113465307622 0.000113465307622 -0.000141781869041
-280 0 0.0524712909946 0.0187397467838 0.00014499985068 0.000118713328042 0.000118713328042 -0.00014499985068
-275 0 0.0532044664893 0.0193470787234 0.000148280530362 0.000124273206398 0.000124273206398 -0.000148280530362
-270 0 0.0539541949621 0.0199830351711 0.000151620375424 0.000130166935976 0.000130166935976 -0.000151620375424
-265 0 0.0547207613783 0.0206493439163 0.000155014862868 0.000136418227182 0.000136418227182 -0.000155014862868
-260 0 0.0555044252679 0.0213478558723 0.000158458311629 0.000143052642443 0.000143052642443 -0.000158458311629
-255 0 0.0563054144619 0.0220805546909 0.000161943688353 0.000150097739319 0.000150097739319 -0.000161943688353
-250 0 0.0571239177824 0.0228495671129 0.000165462382542 0.000157583221469 0.000157583221469 -0.000165462382542
-245 0 0.0579600765218 0.0236571740905 0.000169003946287 0.000165541096813 0.000165541096813 -0.000169003946287
-240 0 0.0588139745215 0.0245058227173 0.000172555793098 0.00017400584178 0.00017400584178 -0.000172555793098
-235 0 0.0596856266289 0.025398138991 0.000176102849501 0.000183014569962 0.000183014569962 -0.000176102849501
-230 0 0.0605749652795 0.0263369414259 0.000179627152173 0.000192607202797 0.000192607202797 -0.000179627152173
-225 0 0.0614818249121 0.0273252555165 0.000183107382327 0.000202826638885 0.000202826638885 -0.000183107382327
-220 0 0.0624059238787 0.0283663290358 0.000186518327906 0.000213718917393 0.000213718917393 -0.000186518327906
-215 0 0.0633468434634 0.0294636481225 0.000189830262915 0.000225333369367 0.000225333369367 -0.000189830262915
-210 0 0.0643040035665 0.0306209540793 0.000193008231812 0.000237722748859 0.000237722748859 -0.000193008231812
-205 0 0.0652766345442 0.0318422607533 0.000196011225492 0.000250943333183 0.000250943333183 -0.000196011225492
-200 0 0.0662637446275 0.0331318723138 0.000198791233883 0.00026505497851 0.00026505497851 -0.000198791233883
-195 0 0.0672640822612 0.0344944011596 0.000201292158771 0.000280121113008 0.000280121113008 -0.000201292158771
-190 0 0.0682760926206 0.0359347855898 0.000203448569174 0.000296208644775 0.000296208644775 -0.000203448569174
-185 0 0.0692978674737 0.0374583067425 0.000205184280574 0.000313387755675 0.000313387755675 -0.000205184280574
-180 0 0.0703270874585 0.0390706041436 0.000206410738872 0.000331731544615 0.000331731544615 -0.000206410738872
-175 0 0.0713609557527 0.0407776890016 0.000207025190316 0.000351315474475 0.000351315474475 -0.000207025190316
-170 0 0.0723961220224 0.0425859541308 0.000206908620327 0.000372216565668 0.000372216565668 -0.000206908620327
-165 0 0.073428595457 0.0445021790648 0.000205923447788 0.000394512265719 0.000394512265719 -0.000205923447788
-160 0 0.0744536456489 0.0465335285306 0.000203910967718 0.00041827890814 0.00041827890814 -0.000203910967718
-155 0 0.0754656900607 0.0486875419747 0.000200688545539 0.000443589655023 0.000443589655023 -0.000200688545539
-150 0 0.0764581668779 0.0509721112519 0.000196046581738 0.000470511796172 0.000470511796172 -0.000196046581738
-145 0 0.0774233921917 0.0533954428908 0.000189745288597 0.000499103253452 0.000499103253452 -0.000189745288597
-140 0 0.078352400742 0.05596600053 0.00018151135307 0.000529408113122 0.000529408113122 -0.00018151135307
-135 0 0.0792347699266 0.0586924221679 0.0001710346049 0.000561450982651 0.000561450982651 -0.0001710346049
-130 0 0.080058427524 0.0615834057877 0.000157964869864 0.000595229944416 0.000595229944416 -0.000157964869864
-125 0 0.0808094446677 0.0646475557342 0.000141909268685 0.000630707860821 0.000630707860821 -0.000141909268685
-120 0 0.081471817165 0.0678931809708 0.000122430326341 0.000667801780041 0.000667801780041 -0.000122430326341
-115 0 0.0820272403893 0.0713280351211 9.90453878431e-05 0.000706370207873 0.000706370207873 -9.90453878431e-05
-110 0 0.0824548858487 0.0749589871352 7.12279968253e-05 0.000746198061979 0.000746198061979 -7.12279968253e-05
-105 0 0.082731191271 0.0787916107343 3.8412081333e-05 0.00078697922731 0.00078697922731 -3.8412081333e-05
-100 0 0.0828296807844 0.0828296807844 4.05284089438e-18 0.000828296807844 0.000828296807844 -4.05284089438e-18
-95 0 0.0827208375771 0.0870745658706 -4.46242847431e-05 0.000869601446277 0.000869601446277 4.46242847431e-05
-90 0 0.0823720582386 0.091524509154 -9.60754515982e-05 0.000910188488825 0.000910188488825 9.60754515982e-05
-85 0 0.0817477255927 0.096173794815 -0.000154938914724 0.000949175333443 0.000949175333443 0.000154938914724
-80 0 0.0808094446677 0.101011805835 -0.00022173323232 0.000985481032533 0.000985481032533 0.00022173323232
-75 0 0.079516493553 0.106021991404 -0.000296861575931 0.00101781111748 0.00101781111748 0.000296861575931
-70 0 0.0778265457035 0.111180779576 -0.000380551661637 0.00104465162018 0.00104465162018 0.000380551661637
-65 0 0.0756967205763 0.116456493194 -0.00047278470875 0.00106427726645 0.00106427726645 0.00047278470875
-60 0 0.0730850124568 0.121808354095 -0.000573215783975 0.00107477959495 0.00107477959495 0.000573215783975
-55 0 0.0699521296452 0.127185690264 -0.000681090356692 0.00107412099263 0.00107412099263 0.000681090356692
-50 0 0.0662637446275 0.132527489255 -0.00079516493553 0.00106021991404 0.00106021991404 0.00079516493553
-45 0 0.0619931082794 0.137762462843 -0.000913642944843 0.00103107040797 0.00103107040797 0.000913642944843
-40 0 0.0571239177824 0.142809794456 -0.00103413989089 0.000984895134178 0.000984895134178 0.00103413989089
-35 0 0.0516532530504 0.147580723001 -0.00115369340253 0.000920325221388 0.000920325221388 0.00115369340253
-30 0 0.0455943196978 0.151981065659 -0.00126883275 0.000836593021979 0.000836593021979 0.00126883275
-25 0 0.0389786733103 0.155914693241 -0.00137571788154 0.000733716203488 0.000733716203488 0.00137571788154
-20 0 0.0318575695325 0.159287847662 -0.00147034936304 0.000612645567932 0.000612645567932 0.00147034936304
-15 0 0.0243021068316 0.162014045544 -0.00154883843051 0.000475346832892 0.000475346832892 0.00154883843051
-10 0 0.016401916987 0.16401916987 -0.00160771265516 0.000324790435386 0.000324790435386 0.00160771265516
-5 0 0.0082623122977 0.165246245954 -0.00164422075151 0.000164834160553 0.000164834160553 0.00164422075151
0 0 7.52788673411e-16 0.165659361569 -0.00165659361569 -7.66014245849e-18 -7.66014245849e-18 0.00165659361569
5 0 -0.0082623122977 0.165246245954 -0.00164422075151 -0.000164834160553 -0.000164834160553 0.00164422075151
10 0 -0.016401916987 0.16401916987 -0.00160771265516 -0.000324790435386 -0.000324790435386 0.00160771265516
15 0 -0.0243021068316 0.162014045544 -0.00154883843051 -0.000475346832892 -0.000475346832892 0.00154883843051
20 0 -0.0318575695325 0.159287847662 -0.00147034936304 -0.000612645567932 -0.000612645567932 0.00147034936304
25 0 -0.0389786733103 0.155914693241 -0.00137571788154 -0.000733716203488 -0.000733716203488 0.00137571788154
30 0 -0.0455943196978 0.151981065659 -0.00126883275 -0.000836593021979 -0.000836593021979 0.00126883275
35 0 -0.0516532530504 0.147580723001 -0.00115369340253 -0.000920325221388 -0.000920325221388 0.00115369340253
40 0 -0.0571239177824 0.142809794456 -0.00103413989089 -0.000984895134178 -0.000984895134178 0.00103413989089
45 0 -0.0619931082794 0.137762462843 -0.000913642944843 -0.00103107040797 -0.00103107040797 0.000913642944843
50 0 -0.0662637446275 0.132527489255 -0.00079516493553 -0.00106021991404 -0.00106021991404 0.00079516493553
55 0 -0.0699521296452 0.127185690264 -0.000681090356692 -0.00107412099263 -0.00107412099263 0.000681090356692
60 0 -0.0730850124568 0.121808354095 -0.000573215783975 -0.00107477959495 -0.00107477959495 0.000573215783975
65 0 -0.0756967205763 0.116456493194 -0.00047278470875 -0.00106427726645 -0.00106427726645 0.00047278470875
70 0 -0.0778265457035 0.111180779576 -0.000380551661637 -0.00104465162018 -0.00104465162018 0.000380551661637
75 0 -0.079516493553 0.106021991404 -0.000296861575931 -0.00101781111748 -0.00101781111748 0.000296861575931
80 0 -0.0808094446677 0.101011805835 -0.00022173323232 -0.000985481032533 -0.000985481032533 0.00022173323232
85 0 -0.0817477255927 0.096173794815 -0.000154938914724 -0.000949175333443 -0.000949175333443 0.000154938914724
90 0 -0.0823720582386 0.091524509154 -9.60754515982e-05 -0.000910188488825 -0.000910188488825 9.60754515982e-05
95 0 -0.0827208375771 0.0870745658706 -4.46242847431e-05 -0.000869601446277 -0.000869601446277 4.46242847431e-05
100 0 -0.0828296807844 0.0828296807844 -1.3813386834e-18 -0.000828296807844 -0.000828296807844 1.3813386834e-18
105 0 -0.082731191271 0.0787916107343 3.8412081333e-05 -0.00078697922731 -0.00078697922731 -3.8412081333e-05
110 0 -0.0824548858487 0.0749589871352 7.12279968253e-05 -0.000746198061979 -0.000746198061979 -7.12279968253e-05
115 0 -0.0820272403893 0.0713280351211 9.90453878431e-05 -0.000706370207873 -0.000706370207873 -9.90453878431e-05
120 0 -0.081471817165 0.0678931809708 0.000122430326341 -0.000667801780041 -0.000667801780041 -0.000122430326341
125 0 -0.0808094446677 0.0646475557342 0.000141909268685 -0.000630707860821 -0.000630707860821 -0.000141909268685
130 0 -0.080058427524 0.0615834057877 0.000157964869864 -0.000595229944416 -0.000595229944416 -0.000157964869864
135 0 -0.0792347699266 0.0586924221679 0.0001710346049 -0.000561450982651 -0.000561450982651 -0.0001710346049
140 0 -0.078352400742 0.05596600053 0.00018151135307 -0.000529408113122 -0.000529408113122 -0.00018151135307
145 0 -0.0774233921917 0.0533954428908 0.000189745288597 -0.000499103253452 -0.000499103253452 -0.000189745288597
150 0 -0.0764581668779 0.0509721112519 0.000196046581738 -0.000470511796172 -0.000470511796172 -0.000196046581738
155 0 -0.0754656900607 0.0486875419747 0.000200688545539 -0.000443589655023 -0.000443589655023 -0.000200688545539
160 0 -0.0744536456489 0.0465335285306 0.000203910967718 -0.00041827890814 -0.00041827890814 -0.000203910967718
165 0 -0.073428595457 0.0445021790648 0.000205923447788 -0.000394512265719 -0.000394512265719 -0.000205923447788
170 0 -0.0723961220224 0.0425859541308 0.000206908620327 -0.000372216565668 -0.000372216565668 -0.000206908620327
175 0 -0.0713609557527 0.0407776890016 0.000207025190316 -0.000351315474475 -0.000351315474475 -0.000207025190316
180 0 -0.0703270874585 0.0390706041436 0.000206410738872 -0.000331731544615 -0.000331731544615 -0.000206410738872
185 0 -0.0692978674737 0.0374583067425 0.000205184280574 -0.000313387755675 -0.000313387755675 -0.000205184280574
190 0 -0.0682760926206 0.0359347855898 0.000203448569174 -0.000296208644775 -0.000296208644775 -0.000203448569174
195 0 -0.0672640822612 0.0344944011596 0.000201292158771 -0.000280121113008 -0.000280121113008 -0.000201292158771
200 0 -0.0662637446275 0.0331318723138 0.000198791233883 -0.00026505497851 -0.00026505497851 -0.000198791233883
205 0 -0.0652766345442 0.0318422607533 0.000196011225492 -0.000250943333183 -0.000250943333183 -0.000196011225492
210 0 -0.0643040035665 0.0306209540793 0.000193008231812 -0.000237722748859 -0.000237722748859 -0.000193008231812
215 0 -0.0633468434634 0.0294636481225 0.000189830262915 -0.000225333369367 -0.000225333369367 -0.000189830262915
220 0 -0.0624059238787 0.0283663290358 0.000186518327906 -0.000213718917393 -0.000213718917393 -0.000186518327906
225 0 -0.0614818249121 0.0273252555165 0.000183107382327 -0.000202826638885 -0.000202826638885 -0.000183107382327
230 0 -0.0605749652795 0.0263369414259 0.000179627152173 -0.000192607202797 -0.000192607202797 -0.000179627152173
235 0 -0.0596856266289 0.025398138991 0.000176102849501 -0.000183014569962 -0.000183014569962 -0.000176102849501
240 0 -0.0588139745215 0.0245058227173 0.000172555793098 -0.00017400584178 -0.00017400584178 -0.000172555793098
245 0 -0.0579600765218 0.0236571740905 0.000169003946287 -0.000165541096813 -0.000165541096813 -0.000169003946287
250 0 -0.0571239177824 0.0228495671129 0.000165462382542 -0.000157583221469 -0.000157583221469 -0.000165462382542
255 0 -0.0563054144619 0.0220805546909 0.000161943688353 -0.000150097739319 -0.000150097739319 -0.000161943688353
260 0 -0.0555044252679 0.0213478558723 0.000158458311629 -0.000143052642443 -0.000143052642443 -0.000158458311629
265 0 -0.0547207613783 0.0206493439163 0.000155014862868 -0.000136418227182 -0.000136418227182 -0.000155014862868
270 0 -0.0539541949621 0.0199830351711 0.000151620375424 -0.000130166935976 -0.000130166935976 -0.000151620375424
275 0 -0.0532044664893 0.0193470787234 0.000148280530362 -0.000124273206398 -0.000124273206398 -0.000148280530362
280 0 -0.0524712909946 0.0187397467838 0.00014499985068 -0.000118713328042 -0.000118713328042 -0.00014499985068
285 0 -0.0517543634389 0.018159425768 0.000141781869041 -0.000113465307622 -0.000113465307622 -0.000141781869041
290 0 -0.051053363289 0.0176046080307 0.00013862927259 -0.000108508742378 -0.000108508742378 -0.00013862927259
295 0 -0.050367958426 0.0170738842122 0.000135544027977 -0.000103824701728 -0.000103824701728 -0.000135544027977
300 0 -0.0496978084706 0.0165659361569 0.000132527489255 -9.93956169413e-05 -9.93956169413e-05 -0.000132527489255
305 0 -0.0490425676083 0.0160795303634 0.00012958049099 -9.52051785651e-05 -9.52051785651e-05 -0.00012958049099
310 0 -0.0484018869805 0.0156135119292 0.000126703428568 -9.12382412451e-05 -9.12382412451e-05 -0.000126703428568
315 0 -0.0477754167033 0.0151667989534 0.000123896327454 -8.74807355519e-05 -8.74807355519e-05 -0.000123896327454
320 0 -0.0471628075641 0.0147383773638 0.000121158902884 -8.3919586413e-05 -8.3919586413e-05 -0.000121158902884
325 0 -0.046563712441 0.0143272961357 0.000118490611284 -8.05426377357e-05 -8.05426377357e-05 -0.000118490611284
330 0 -0.0459777874834 0.0139326628737 0.000115890694551 -7.73385828147e-05 -7.73385828147e-05 -0.000115890694551
335 0 -0.045404693087 0.0135536397275 0.000113358218134 -7.42969001219e-05 -7.42969001219e-05 -0.000113358218134
340 0 -0.0448440946922 0.0131894396154 0.000110892103772 -7.14077940958e-05 -7.14077940958e-05 -0.000110892103772
345 0 -0.0442956634305 0.0128393227335 0.000108491157607 -6.86621405627e-05 -6.86621405627e-05 -0.000108491157607
350 0 -0.0437590766408 0.0125025933259 0.000106154094277 -6.6051436439e-05 -6.6051436439e-05 -0.000106154094277
355 0 -0.0432340182738 0.0121785966968 0.000103879557563 -6.35677533892e-05 -6.35677533892e-05 -0.000103879557563
360 0 -0.0427201792011 0.0118667164448 0.000101666138022 -6.12036951305e-05 -6.12036951305e-05 -0.000101666138022
365 0 -0.0422172574429 0.0115663719022 9.95123880359e-05 -5.8952358098e-05 -5.8952358098e-05 -9.95123880359e-05
370 0 -0.0417249583257 0.0112770157637 9.74168346095e-05 -5.68072952018e-05 -5.68072952018e-05 -9.74168346095e-05
375 0 -0.0412429945814 0.0109981318884 9.53779902354e-05 -5.47624824318e-05 -5.47624824318e-05 -9.53779902354e-05
380 0 -0.0407710863965 0.0107292332622 9.33943620754e-05 -5.28122880783e-05 -5.28122880783e-05 -9.33943620754e-05
385 0 -0.0403089614182 0.0104698601086 9.14644596945e-05 -5.09514443586e-05 -5.09514443586e-05 -9.14644596945e-05
390 0 -0.0398563547266 0.010219578135 8.95868015415e-05 -4.91750212543e-05 -4.91750212543e-05 -8.95868015415e-05
395 0 -0.0394130087756 0.00997797690521 8.77599203484e-05 -4.74784023799e-05 -4.74784023799e-05 -8.77599203484e-05
400 0 -0.0389786733103 0.00974466832758 8.59823675963e-05 -4.5857262718e-05 -4.5857262718e-05 -8.59823675963e-05
405 0 -0.0385531052638 0.00951928525033 8.42527171775e-05 -4.43075480693e-05 -4.43075480693e-05 -8.42527171775e-05
410 0 -0.0381360686374 0.00930148015547 8.25695683649e-05 -4.28254560779e-05 -4.28254560779e-05 -8.25695683649e-05
415 0 -0.0377273343674 0.00909092394396 8.09315481854e-05 -4.14074187048e-05 -4.14074187048e-05 -8.09315481854e-05
420 0 -0.0373266801818 0.00888730480519 7.93373132824e-05 -4.0050086032e-05 -4.0050086032e-05 -7.93373132824e-05
425 0 -0.0369338904481 0.00869032716427 7.77855513392e-05 -3.87503112898e-05 -3.87503112898e-05 -7.77855513392e-05
430 0 -0.0365487560157 0.00849971070132 7.62749821273e-05 -3.75051370094e-05 -3.75051370094e-05 -7.62749821273e-05
435 0 -0.0361710740532 0.00831518943751 7.48043582351e-05 -3.63117822092e-05 -3.63117822092e-05 -7.48043582351e-05
440 0 -0.0358006478832 0.00813651088256 7.33724655225e-05 -3.51676305336e-05 -3.51676305336e-05 -7.33724655225e-05
445 0 -0.0354372868156 0.00796343523945 7.19781233457e-05 -3.40702192675e-05 -3.40702192675e-05 -7.19781233457e-05
450 0 -0.0350808059793 0.00779573466206 7.06201845857e-05 -3.3017229157e-05 -3.3017229157e-05 -7.06201845857e-05
455 0 -0.0347310261554 0.00763319256163 6.92975355123e-05 -3.20064749733e-05 -3.20064749733e-05 -6.92975355123e-05
460 0 -0.0343877736109 0.00747560295888 6.80090955104e-05 -3.10358967607e-05 -3.10358967607e-05 -6.80090955104e-05
465 0 -0.0340508799335 0.00732276987817 6.67538166924e-05 -3.01035517149e-05 -3.01035517149e-05 -6.67538166924e-05
470 0 -0.0337201818698 0.00717450678081 6.55306834159e-05 -2.92076066434e-05 -2.92076066434e-05 -6.55306834159e-05
475 0 -0.0333955211651 0.00703063603475 6.43387117238e-05 -2.83463309624e-05 -2.83463309624e-05 -6.43387117238e-05
480 0 -0.0330767444064 0.006890988418 6.31769487241e-05 -2.75180901884e-05 -2.75180901884e-05 -6.31769487241e-05
485 0 -0.0327637028692 0.00675540265343 6.20444719184e-05 -2.67213398872e-05 -2.67213398872e-05 -6.20444719184e-05
490 0 -0.0324562523665 0.00662372497276 6.09403884939e-05 -2.59546200452e-05 -2.59546200452e-05 -6.09403884939e-05
495 0 -0.0321542531033 0.00649580870773 5.98638345862e-05 -2.5216549831e-05 -2.5216549831e-05 -5.98638345862e-05
500 0 -0.0318575695325 0.00637151390649 5.88139745215e-05 -2.45058227173e-05 -2.45058227173e-05 -5.88139745215e-05

4
data/shell2d/config.toml Normal file
View File

@ -0,0 +1,4 @@
input-file = "data/shell2d/shell2d_model"
output-file = "data/shell2d/shell2d_model_out"
rho-name = "block"
ab-rho = 0.1

31
data/shell2d/plot.gnu Normal file
View File

@ -0,0 +1,31 @@
# 设置终端为png格式输出文件名为"plot.png"
set terminal png size 800,600
set output "plot.png"
# 设置数据文件的格式,指定分隔符为逗号
set datafile separator ","
set key outside
# 设置子图布局为2行1列
set multiplot layout 2,1
# 第一幅子图
set xlabel "angle (deg)"
set ylabel "gravity (mGal)"
set xrange [10:-10]
set key top left inside
plot "data/shell2d/shell2d_model_out.csv" using 2:3 with lines title "Vx", \
"data/shell2d/shell2d_model_out.csv" using 2:4 with lines title "Vz"
# 第二幅子图
set xlabel "angle (deg)"
set ylabel "gradient (Eo)"
set xrange [10:-10]
set key top left inside
plot "data/shell2d/shell2d_model_out.csv" using 2:5 with lines title "Vxx", \
"data/shell2d/shell2d_model_out.csv" using 2:6 with lines title "Vxz", \
"data/shell2d/shell2d_model_out.csv" using 2:7 with lines title "Vzx", \
"data/shell2d/shell2d_model_out.csv" using 2:8 with lines title "Vzz"
# 结束多图模式
unset multiplot

View File

@ -0,0 +1,49 @@
lc=10000.0;
deg=10.0;
h=300000.0;
R=6371000.0;
r=R - h;
deg_bk=1.0;
h_bk=75000.0;
R_bk=6321000.0;
r_bk=R_bk - h_bk;
Point(1) = {0, 0, 0, lc};
Point(2) = {R*Sin(deg*Pi/180.0), R*Cos(deg*Pi/180.0), 0, lc};
Point(3) = {r*Sin(deg*Pi/180.0), r*Cos(deg*Pi/180.0), 0, 4*lc};
Point(4) = {-1.0*r*Sin(deg*Pi/180.0), r*Cos(deg*Pi/180.0), 0, 4*lc};
Point(5) = {-1.0*R*Sin(deg*Pi/180.0), R*Cos(deg*Pi/180.0), 0, lc};
Point(6) = {R_bk*Sin(deg_bk*Pi/180.0), R_bk*Cos(deg_bk*Pi/180.0), 0, lc};
Point(7) = {r_bk*Sin(deg_bk*Pi/180.0), r_bk*Cos(deg_bk*Pi/180.0), 0, 2*lc};
Point(8) = {-1.0*r_bk*Sin(deg_bk*Pi/180.0), r_bk*Cos(deg_bk*Pi/180.0), 0, 2*lc};
Point(9) = {-1.0*R_bk*Sin(deg_bk*Pi/180.0), R_bk*Cos(deg_bk*Pi/180.0), 0, lc};
Line(1) = {2, 3};
Circle(2) = {3, 1, 4};
Line(3) = {4, 5};
Circle(4) = {5, 1, 2};
Physical Curve(1) = {1, 3};
Physical Curve(2) = {2};
Physical Curve(3) = {4};
Line(5) = {6, 7};
Circle(6) = {7, 1, 8};
Line(7) = {8, 9};
Circle(8) = {9, 1, 6};
Curve Loop(1) = {8, 5, 6, 7};
Plane Surface(1) = {1};
Curve Loop(2) = {4, 1, 2, 3};
Plane Surface(2) = {1, 2};
Physical Surface("block", 1) = {1};
Physical Surface("shell", 2) = {2};
Mesh 2;
Mesh.MshFileVersion = 2.2;
Save "shell2d_model.msh";

View File

@ -0,0 +1,202 @@
rad,deg,gx,gz,gxx,gxz,gzx,gzz
6.381e+06,10,19.5758,3.46563,1.69621e-05,2.6536e-08,2.6536e-08,-1.6944e-05
6.381e+06,9.9,19.7847,3.501,1.73497e-05,9.24959e-08,9.24959e-08,-1.7287e-05
6.381e+06,9.8,19.9977,3.53746,1.7749e-05,1.61855e-07,1.61855e-07,-1.76404e-05
6.381e+06,9.7,20.2148,3.57505,1.81605e-05,2.34805e-07,2.34805e-07,-1.80045e-05
6.381e+06,9.6,20.4363,3.61383,1.85847e-05,3.11549e-07,3.11549e-07,-1.83798e-05
6.381e+06,9.5,20.6623,3.65383,1.90221e-05,3.92305e-07,3.92305e-07,-1.87667e-05
6.381e+06,9.4,20.8928,3.69513,1.94733e-05,4.77304e-07,4.77304e-07,-1.91657e-05
6.381e+06,9.3,21.1281,3.73776,1.99389e-05,5.66793e-07,5.66793e-07,-1.95773e-05
6.381e+06,9.2,21.3683,3.78179,2.04194e-05,6.61038e-07,6.61038e-07,-2.00021e-05
6.381e+06,9.1,21.6135,3.82729,2.09155e-05,7.6032e-07,7.6032e-07,-2.04406e-05
6.381e+06,9,21.8639,3.87431,2.14279e-05,8.64942e-07,8.64942e-07,-2.08934e-05
6.381e+06,8.9,22.1197,3.92293,2.19573e-05,9.75227e-07,9.75227e-07,-2.13611e-05
6.381e+06,8.8,22.3811,3.97321,2.25044e-05,1.09152e-06,1.09152e-06,-2.18443e-05
6.381e+06,8.7,22.6482,4.02524,2.30701e-05,1.2142e-06,1.2142e-06,-2.23439e-05
6.381e+06,8.6,22.9212,4.0791,2.36551e-05,1.34365e-06,1.34365e-06,-2.28605e-05
6.381e+06,8.5,23.2004,4.13488,2.42604e-05,1.48031e-06,1.48031e-06,-2.33948e-05
6.381e+06,8.4,23.4859,4.19265,2.48869e-05,1.62464e-06,1.62464e-06,-2.39478e-05
6.381e+06,8.3,23.7781,4.25254,2.55356e-05,1.77712e-06,1.77712e-06,-2.45201e-05
6.381e+06,8.2,24.077,4.31463,2.62074e-05,1.9383e-06,1.9383e-06,-2.51129e-05
6.381e+06,8.1,24.383,4.37903,2.69036e-05,2.10874e-06,2.10874e-06,-2.5727e-05
6.381e+06,8,24.6963,4.44587,2.76254e-05,2.28906e-06,2.28906e-06,-2.63635e-05
6.381e+06,7.9,25.0171,4.51527,2.83738e-05,2.47993e-06,2.47993e-06,-2.70234e-05
6.381e+06,7.8,25.3459,4.58735,2.91504e-05,2.68206e-06,2.68206e-06,-2.77079e-05
6.381e+06,7.7,25.6828,4.66227,2.99564e-05,2.89624e-06,2.89624e-06,-2.84182e-05
6.381e+06,7.6,26.0281,4.74017,3.07934e-05,3.12329e-06,3.12329e-06,-2.91556e-05
6.381e+06,7.5,26.3823,4.8212,3.16629e-05,3.36414e-06,3.36414e-06,-2.99215e-05
6.381e+06,7.4,26.7455,4.90555,3.25667e-05,3.61976e-06,3.61976e-06,-3.07174e-05
6.381e+06,7.3,27.1183,4.99339,3.35065e-05,3.89123e-06,3.89123e-06,-3.15447e-05
6.381e+06,7.2,27.501,5.08492,3.44842e-05,4.1797e-06,4.1797e-06,-3.24053e-05
6.381e+06,7.1,27.8939,5.18035,3.55018e-05,4.48645e-06,4.48645e-06,-3.33007e-05
6.381e+06,7,28.2975,5.27991,3.65617e-05,4.81285e-06,4.81285e-06,-3.4233e-05
6.381e+06,6.9,28.7122,5.38383,3.76659e-05,5.16039e-06,5.16039e-06,-3.52041e-05
6.381e+06,6.8,29.1386,5.49237,3.88171e-05,5.53071e-06,5.53071e-06,-3.62161e-05
6.381e+06,6.7,29.577,5.60581,4.00179e-05,5.9256e-06,5.9256e-06,-3.72714e-05
6.381e+06,6.6,30.0281,5.72446,4.12711e-05,6.34701e-06,6.34701e-06,-3.83724e-05
6.381e+06,6.5,30.4923,5.84863,4.25797e-05,6.79708e-06,6.79708e-06,-3.95217e-05
6.381e+06,6.4,30.9703,5.97867,4.3947e-05,7.27815e-06,7.27815e-06,-4.0722e-05
6.381e+06,6.3,31.4627,6.11495,4.53764e-05,7.79281e-06,7.79281e-06,-4.19765e-05
6.381e+06,6.2,31.9701,6.25789,4.68717e-05,8.34387e-06,8.34387e-06,-4.32883e-05
6.381e+06,6.1,32.4932,6.40793,4.8437e-05,8.93446e-06,8.93446e-06,-4.46608e-05
6.381e+06,6,33.0328,6.56553,5.00764e-05,9.56802e-06,9.56802e-06,-4.60978e-05
6.381e+06,5.9,33.5896,6.73122,5.17947e-05,1.02483e-05,1.02483e-05,-4.76032e-05
6.381e+06,5.8,34.1644,6.90556,5.35968e-05,1.09796e-05,1.09796e-05,-4.91813e-05
6.381e+06,5.7,34.7582,7.08917,5.54881e-05,1.17665e-05,1.17665e-05,-5.08366e-05
6.381e+06,5.6,35.3719,7.28269,5.74743e-05,1.26142e-05,1.26142e-05,-5.25741e-05
6.381e+06,5.5,36.0065,7.48688,5.95618e-05,1.35283e-05,1.35283e-05,-5.43991e-05
6.381e+06,5.4,36.663,7.70251,6.17572e-05,1.45154e-05,1.45154e-05,-5.63174e-05
6.381e+06,5.3,37.3426,7.93046,6.40678e-05,1.55824e-05,1.55824e-05,-5.8335e-05
6.381e+06,5.2,38.0465,8.17168,6.65015e-05,1.67375e-05,1.67375e-05,-6.04586e-05
6.381e+06,5.1,38.776,8.42722,6.90667e-05,1.79894e-05,1.79894e-05,-6.26954e-05
6.381e+06,5,39.5325,8.69824,7.17726e-05,1.93483e-05,1.93483e-05,-6.5053e-05
6.381e+06,4.9,40.3174,8.986,7.46291e-05,2.08253e-05,2.08253e-05,-6.75398e-05
6.381e+06,4.8,41.1323,9.29191,7.7647e-05,2.24331e-05,2.24331e-05,-7.01647e-05
6.381e+06,4.7,41.9789,9.61752,8.08378e-05,2.4186e-05,2.4186e-05,-7.29374e-05
6.381e+06,4.6,42.859,9.96454,8.42141e-05,2.61002e-05,2.61002e-05,-7.58682e-05
6.381e+06,4.5,43.7746,10.3349,8.77895e-05,2.81941e-05,2.81941e-05,-7.89684e-05
6.381e+06,4.4,44.7277,10.7307,9.15785e-05,3.04886e-05,3.04886e-05,-8.22499e-05
6.381e+06,4.3,45.7206,11.1543,9.5597e-05,3.30074e-05,3.30074e-05,-8.57254e-05
6.381e+06,4.2,46.7557,11.6085,9.98619e-05,3.57777e-05,3.57777e-05,-8.94088e-05
6.381e+06,4.1,47.8354,12.096,0.000104391,3.88308e-05,3.88308e-05,-9.33147e-05
6.381e+06,4,48.9626,12.6204,0.000109205,4.22023e-05,4.22023e-05,-9.74584e-05
6.381e+06,3.9,50.1402,13.1853,0.000114324,4.59335e-05,4.59335e-05,-0.000101856
6.381e+06,3.8,51.3713,13.795,0.00011977,5.0072e-05,5.0072e-05,-0.000106525
6.381e+06,3.7,52.6592,14.4543,0.000125565,5.46729e-05,5.46729e-05,-0.000111482
6.381e+06,3.6,54.0076,15.1686,0.000131735,5.98001e-05,5.98001e-05,-0.000116745
6.381e+06,3.5,55.4203,15.9442,0.000138304,6.55284e-05,6.55284e-05,-0.000122332
6.381e+06,3.4,56.9012,16.7882,0.000145295,7.19446e-05,7.19446e-05,-0.000128258
6.381e+06,3.3,58.4545,17.7086,0.000152733,7.91509e-05,7.91509e-05,-0.000134538
6.381e+06,3.2,60.0847,18.7147,0.000160639,8.72667e-05,8.72667e-05,-0.000141184
6.381e+06,3.1,61.7963,19.8174,0.00016903,9.64332e-05,9.64332e-05,-0.0001482
6.381e+06,3,63.5939,21.0289,0.000177916,0.000106816,0.000106816,-0.000155585
6.381e+06,2.9,65.482,22.3636,0.000187298,0.000118613,0.000118613,-0.000163325
6.381e+06,2.8,67.465,23.8381,0.00019716,0.000132054,0.000132054,-0.000171388
6.381e+06,2.7,69.5468,25.4718,0.000207463,0.000147416,0.000147416,-0.000179716
6.381e+06,2.6,71.7307,27.2873,0.000218132,0.000165023,0.000165023,-0.000188219
6.381e+06,2.5,74.0186,29.311,0.000229045,0.000185259,0.000185259,-0.000196752
6.381e+06,2.4,76.4104,31.5736,0.000240008,0.000208574,0.000208574,-0.000205102
6.381e+06,2.3,78.9034,34.1113,0.000250725,0.000235493,0.000235493,-0.000212953
6.381e+06,2.2,81.4906,36.9659,0.00026076,0.000266621,0.000266621,-0.000219851
6.381e+06,2.1,84.1586,40.1864,0.000269476,0.000302637,0.000302637,-0.000225147
6.381e+06,2,86.8858,43.829,0.000275957,0.000344278,0.000344278,-0.000227925
6.381e+06,1.9,89.638,47.9579,0.000278906,0.000392295,0.000392295,-0.000226908
6.381e+06,1.8,92.364,52.6444,0.000276515,0.000447358,0.000447358,-0.000220335
6.381e+06,1.7,94.989,57.9655,0.000266309,0.000509879,0.000509879,-0.00020583
6.381e+06,1.6,97.407,63.9991,0.000245006,0.000579704,0.000579704,-0.000180286
6.381e+06,1.5,99.4717,70.8151,0.000208463,0.000655604,0.000655604,-0.00013984
6.381e+06,1.4,100.989,78.4599,0.000151893,0.00073454,0.00073454,-8.01286e-05
6.381e+06,1.3,101.712,86.9319,7.06728e-05,0.000810793,0.000810793,2.88724e-06
6.381e+06,1.2,101.358,96.1495,-3.78868e-05,0.000875464,0.000875464,0.000111208
6.381e+06,1.1,99.6383,105.921,-0.00017192,0.000917346,0.000917346,0.00024235
6.381e+06,1,96.3255,115.935,-0.000322963,0.000926163,0.000926163,0.000387608
6.381e+06,0.9,91.3201,125.802,-0.000477057,0.000897199,0.000897199,0.00053342
6.381e+06,0.8,84.6836,135.128,-0.000619649,0.000833742,0.000833742,0.000666208
6.381e+06,0.7,76.6121,143.595,-0.000740811,0.000744974,0.000744974,0.000777214
6.381e+06,0.6,67.3704,150.999,-0.000836994,0.000641429,0.000641429,0.00086386
6.381e+06,0.5,57.2301,157.239,-0.000909443,0.000531619,0.000531619,0.000927999
6.381e+06,0.4,46.4313,162.291,-0.000961693,0.000420974,0.000420974,0.000973449
6.381e+06,0.3,35.1701,166.169,-0.000997711,0.000312213,0.000312213,0.00100425
6.381e+06,0.2,23.6007,168.906,-0.00102093,0.000206152,0.000206152,0.0010238
6.381e+06,0.1,11.8444,170.533,-0.00103385,0.000102421,0.000102421,0.00103457
6.381e+06,0,7.95866e-11,171.073,-0.001038,1.08948e-15,1.08948e-15,0.001038
6.381e+06,-0.1,-11.8444,170.533,-0.00103385,-0.000102421,-0.000102421,0.00103457
6.381e+06,-0.2,-23.6007,168.906,-0.00102093,-0.000206152,-0.000206152,0.0010238
6.381e+06,-0.3,-35.1701,166.169,-0.000997711,-0.000312213,-0.000312213,0.00100425
6.381e+06,-0.4,-46.4313,162.291,-0.000961693,-0.000420974,-0.000420974,0.000973449
6.381e+06,-0.5,-57.2301,157.239,-0.000909443,-0.000531619,-0.000531619,0.000927999
6.381e+06,-0.6,-67.3704,150.999,-0.000836994,-0.000641429,-0.000641429,0.00086386
6.381e+06,-0.7,-76.6121,143.595,-0.000740811,-0.000744974,-0.000744974,0.000777214
6.381e+06,-0.8,-84.6836,135.128,-0.000619649,-0.000833742,-0.000833742,0.000666208
6.381e+06,-0.9,-91.3201,125.802,-0.000477057,-0.000897199,-0.000897199,0.00053342
6.381e+06,-1,-96.3255,115.935,-0.000322963,-0.000926163,-0.000926163,0.000387608
6.381e+06,-1.1,-99.6383,105.921,-0.00017192,-0.000917346,-0.000917346,0.00024235
6.381e+06,-1.2,-101.358,96.1495,-3.78868e-05,-0.000875464,-0.000875464,0.000111208
6.381e+06,-1.3,-101.712,86.9319,7.06728e-05,-0.000810793,-0.000810793,2.88724e-06
6.381e+06,-1.4,-100.989,78.4599,0.000151893,-0.00073454,-0.00073454,-8.01286e-05
6.381e+06,-1.5,-99.4717,70.8151,0.000208463,-0.000655604,-0.000655604,-0.00013984
6.381e+06,-1.6,-97.407,63.9991,0.000245006,-0.000579704,-0.000579704,-0.000180286
6.381e+06,-1.7,-94.989,57.9655,0.000266309,-0.000509879,-0.000509879,-0.00020583
6.381e+06,-1.8,-92.364,52.6444,0.000276515,-0.000447358,-0.000447358,-0.000220335
6.381e+06,-1.9,-89.638,47.9579,0.000278906,-0.000392295,-0.000392295,-0.000226908
6.381e+06,-2,-86.8858,43.829,0.000275957,-0.000344278,-0.000344278,-0.000227925
6.381e+06,-2.1,-84.1586,40.1864,0.000269476,-0.000302637,-0.000302637,-0.000225147
6.381e+06,-2.2,-81.4906,36.9659,0.00026076,-0.000266621,-0.000266621,-0.000219851
6.381e+06,-2.3,-78.9034,34.1113,0.000250725,-0.000235493,-0.000235493,-0.000212953
6.381e+06,-2.4,-76.4104,31.5736,0.000240008,-0.000208574,-0.000208574,-0.000205102
6.381e+06,-2.5,-74.0186,29.311,0.000229045,-0.000185259,-0.000185259,-0.000196752
6.381e+06,-2.6,-71.7307,27.2873,0.000218132,-0.000165023,-0.000165023,-0.000188219
6.381e+06,-2.7,-69.5468,25.4718,0.000207463,-0.000147416,-0.000147416,-0.000179716
6.381e+06,-2.8,-67.465,23.8381,0.00019716,-0.000132054,-0.000132054,-0.000171388
6.381e+06,-2.9,-65.482,22.3636,0.000187298,-0.000118613,-0.000118613,-0.000163325
6.381e+06,-3,-63.5939,21.0289,0.000177916,-0.000106816,-0.000106816,-0.000155585
6.381e+06,-3.1,-61.7963,19.8174,0.00016903,-9.64332e-05,-9.64332e-05,-0.0001482
6.381e+06,-3.2,-60.0847,18.7147,0.000160639,-8.72667e-05,-8.72667e-05,-0.000141184
6.381e+06,-3.3,-58.4545,17.7086,0.000152733,-7.91509e-05,-7.91509e-05,-0.000134538
6.381e+06,-3.4,-56.9012,16.7882,0.000145295,-7.19446e-05,-7.19446e-05,-0.000128258
6.381e+06,-3.5,-55.4203,15.9442,0.000138304,-6.55284e-05,-6.55284e-05,-0.000122332
6.381e+06,-3.6,-54.0076,15.1686,0.000131735,-5.98001e-05,-5.98001e-05,-0.000116745
6.381e+06,-3.7,-52.6592,14.4543,0.000125565,-5.46729e-05,-5.46729e-05,-0.000111482
6.381e+06,-3.8,-51.3713,13.795,0.00011977,-5.0072e-05,-5.0072e-05,-0.000106525
6.381e+06,-3.9,-50.1402,13.1853,0.000114324,-4.59335e-05,-4.59335e-05,-0.000101856
6.381e+06,-4,-48.9626,12.6204,0.000109205,-4.22023e-05,-4.22023e-05,-9.74584e-05
6.381e+06,-4.1,-47.8354,12.096,0.000104391,-3.88308e-05,-3.88308e-05,-9.33147e-05
6.381e+06,-4.2,-46.7557,11.6085,9.98619e-05,-3.57777e-05,-3.57777e-05,-8.94088e-05
6.381e+06,-4.3,-45.7206,11.1543,9.5597e-05,-3.30074e-05,-3.30074e-05,-8.57254e-05
6.381e+06,-4.4,-44.7277,10.7307,9.15785e-05,-3.04886e-05,-3.04886e-05,-8.22499e-05
6.381e+06,-4.5,-43.7746,10.3349,8.77895e-05,-2.81941e-05,-2.81941e-05,-7.89684e-05
6.381e+06,-4.6,-42.859,9.96454,8.42141e-05,-2.61002e-05,-2.61002e-05,-7.58682e-05
6.381e+06,-4.7,-41.9789,9.61752,8.08378e-05,-2.4186e-05,-2.4186e-05,-7.29374e-05
6.381e+06,-4.8,-41.1323,9.29191,7.7647e-05,-2.24331e-05,-2.24331e-05,-7.01647e-05
6.381e+06,-4.9,-40.3174,8.986,7.46291e-05,-2.08253e-05,-2.08253e-05,-6.75398e-05
6.381e+06,-5,-39.5325,8.69824,7.17726e-05,-1.93483e-05,-1.93483e-05,-6.5053e-05
6.381e+06,-5.1,-38.776,8.42722,6.90667e-05,-1.79894e-05,-1.79894e-05,-6.26954e-05
6.381e+06,-5.2,-38.0465,8.17168,6.65015e-05,-1.67375e-05,-1.67375e-05,-6.04586e-05
6.381e+06,-5.3,-37.3426,7.93046,6.40678e-05,-1.55824e-05,-1.55824e-05,-5.8335e-05
6.381e+06,-5.4,-36.663,7.70251,6.17572e-05,-1.45154e-05,-1.45154e-05,-5.63174e-05
6.381e+06,-5.5,-36.0065,7.48688,5.95618e-05,-1.35283e-05,-1.35283e-05,-5.43991e-05
6.381e+06,-5.6,-35.3719,7.28269,5.74743e-05,-1.26142e-05,-1.26142e-05,-5.25741e-05
6.381e+06,-5.7,-34.7582,7.08917,5.54881e-05,-1.17665e-05,-1.17665e-05,-5.08366e-05
6.381e+06,-5.8,-34.1644,6.90556,5.35968e-05,-1.09796e-05,-1.09796e-05,-4.91813e-05
6.381e+06,-5.9,-33.5896,6.73122,5.17947e-05,-1.02483e-05,-1.02483e-05,-4.76032e-05
6.381e+06,-6,-33.0328,6.56553,5.00764e-05,-9.56802e-06,-9.56802e-06,-4.60978e-05
6.381e+06,-6.1,-32.4932,6.40793,4.8437e-05,-8.93446e-06,-8.93446e-06,-4.46608e-05
6.381e+06,-6.2,-31.9701,6.25789,4.68717e-05,-8.34387e-06,-8.34387e-06,-4.32883e-05
6.381e+06,-6.3,-31.4627,6.11495,4.53764e-05,-7.79281e-06,-7.79281e-06,-4.19765e-05
6.381e+06,-6.4,-30.9703,5.97867,4.3947e-05,-7.27815e-06,-7.27815e-06,-4.0722e-05
6.381e+06,-6.5,-30.4923,5.84863,4.25797e-05,-6.79708e-06,-6.79708e-06,-3.95217e-05
6.381e+06,-6.6,-30.0281,5.72446,4.12711e-05,-6.34701e-06,-6.34701e-06,-3.83724e-05
6.381e+06,-6.7,-29.577,5.60581,4.00179e-05,-5.9256e-06,-5.9256e-06,-3.72714e-05
6.381e+06,-6.8,-29.1386,5.49237,3.88171e-05,-5.53071e-06,-5.53071e-06,-3.62161e-05
6.381e+06,-6.9,-28.7122,5.38383,3.76659e-05,-5.16039e-06,-5.16039e-06,-3.52041e-05
6.381e+06,-7,-28.2975,5.27991,3.65617e-05,-4.81285e-06,-4.81285e-06,-3.4233e-05
6.381e+06,-7.1,-27.8939,5.18035,3.55018e-05,-4.48645e-06,-4.48645e-06,-3.33007e-05
6.381e+06,-7.2,-27.501,5.08492,3.44842e-05,-4.1797e-06,-4.1797e-06,-3.24053e-05
6.381e+06,-7.3,-27.1183,4.99339,3.35065e-05,-3.89123e-06,-3.89123e-06,-3.15447e-05
6.381e+06,-7.4,-26.7455,4.90555,3.25667e-05,-3.61976e-06,-3.61976e-06,-3.07174e-05
6.381e+06,-7.5,-26.3823,4.8212,3.16629e-05,-3.36414e-06,-3.36414e-06,-2.99215e-05
6.381e+06,-7.6,-26.0281,4.74017,3.07934e-05,-3.12329e-06,-3.12329e-06,-2.91556e-05
6.381e+06,-7.7,-25.6828,4.66227,2.99564e-05,-2.89624e-06,-2.89624e-06,-2.84182e-05
6.381e+06,-7.8,-25.3459,4.58735,2.91504e-05,-2.68206e-06,-2.68206e-06,-2.77079e-05
6.381e+06,-7.9,-25.0171,4.51527,2.83738e-05,-2.47993e-06,-2.47993e-06,-2.70234e-05
6.381e+06,-8,-24.6963,4.44587,2.76254e-05,-2.28906e-06,-2.28906e-06,-2.63635e-05
6.381e+06,-8.1,-24.383,4.37903,2.69036e-05,-2.10874e-06,-2.10874e-06,-2.5727e-05
6.381e+06,-8.2,-24.077,4.31463,2.62074e-05,-1.9383e-06,-1.9383e-06,-2.51129e-05
6.381e+06,-8.3,-23.7781,4.25254,2.55356e-05,-1.77712e-06,-1.77712e-06,-2.45201e-05
6.381e+06,-8.4,-23.4859,4.19265,2.48869e-05,-1.62464e-06,-1.62464e-06,-2.39478e-05
6.381e+06,-8.5,-23.2004,4.13488,2.42604e-05,-1.48031e-06,-1.48031e-06,-2.33948e-05
6.381e+06,-8.6,-22.9212,4.0791,2.36551e-05,-1.34365e-06,-1.34365e-06,-2.28605e-05
6.381e+06,-8.7,-22.6482,4.02524,2.30701e-05,-1.2142e-06,-1.2142e-06,-2.23439e-05
6.381e+06,-8.8,-22.3811,3.97321,2.25044e-05,-1.09152e-06,-1.09152e-06,-2.18443e-05
6.381e+06,-8.9,-22.1197,3.92293,2.19573e-05,-9.75227e-07,-9.75227e-07,-2.13611e-05
6.381e+06,-9,-21.8639,3.87431,2.14279e-05,-8.64942e-07,-8.64942e-07,-2.08934e-05
6.381e+06,-9.1,-21.6135,3.82729,2.09155e-05,-7.6032e-07,-7.6032e-07,-2.04406e-05
6.381e+06,-9.2,-21.3683,3.78179,2.04194e-05,-6.61038e-07,-6.61038e-07,-2.00021e-05
6.381e+06,-9.3,-21.1281,3.73776,1.99389e-05,-5.66793e-07,-5.66793e-07,-1.95773e-05
6.381e+06,-9.4,-20.8928,3.69513,1.94733e-05,-4.77304e-07,-4.77304e-07,-1.91657e-05
6.381e+06,-9.5,-20.6623,3.65383,1.90221e-05,-3.92305e-07,-3.92305e-07,-1.87667e-05
6.381e+06,-9.6,-20.4363,3.61383,1.85847e-05,-3.11549e-07,-3.11549e-07,-1.83798e-05
6.381e+06,-9.7,-20.2148,3.57505,1.81605e-05,-2.34805e-07,-2.34805e-07,-1.80045e-05
6.381e+06,-9.8,-19.9977,3.53746,1.7749e-05,-1.61855e-07,-1.61855e-07,-1.76404e-05
6.381e+06,-9.9,-19.7847,3.501,1.73497e-05,-9.24959e-08,-9.24959e-08,-1.7287e-05
6.381e+06,-10,-19.5758,3.46563,1.69621e-05,-2.6536e-08,-2.6536e-08,-1.6944e-05
1 rad deg gx gz gxx gxz gzx gzz
2 6.381e+06 10 19.5758 3.46563 1.69621e-05 2.6536e-08 2.6536e-08 -1.6944e-05
3 6.381e+06 9.9 19.7847 3.501 1.73497e-05 9.24959e-08 9.24959e-08 -1.7287e-05
4 6.381e+06 9.8 19.9977 3.53746 1.7749e-05 1.61855e-07 1.61855e-07 -1.76404e-05
5 6.381e+06 9.7 20.2148 3.57505 1.81605e-05 2.34805e-07 2.34805e-07 -1.80045e-05
6 6.381e+06 9.6 20.4363 3.61383 1.85847e-05 3.11549e-07 3.11549e-07 -1.83798e-05
7 6.381e+06 9.5 20.6623 3.65383 1.90221e-05 3.92305e-07 3.92305e-07 -1.87667e-05
8 6.381e+06 9.4 20.8928 3.69513 1.94733e-05 4.77304e-07 4.77304e-07 -1.91657e-05
9 6.381e+06 9.3 21.1281 3.73776 1.99389e-05 5.66793e-07 5.66793e-07 -1.95773e-05
10 6.381e+06 9.2 21.3683 3.78179 2.04194e-05 6.61038e-07 6.61038e-07 -2.00021e-05
11 6.381e+06 9.1 21.6135 3.82729 2.09155e-05 7.6032e-07 7.6032e-07 -2.04406e-05
12 6.381e+06 9 21.8639 3.87431 2.14279e-05 8.64942e-07 8.64942e-07 -2.08934e-05
13 6.381e+06 8.9 22.1197 3.92293 2.19573e-05 9.75227e-07 9.75227e-07 -2.13611e-05
14 6.381e+06 8.8 22.3811 3.97321 2.25044e-05 1.09152e-06 1.09152e-06 -2.18443e-05
15 6.381e+06 8.7 22.6482 4.02524 2.30701e-05 1.2142e-06 1.2142e-06 -2.23439e-05
16 6.381e+06 8.6 22.9212 4.0791 2.36551e-05 1.34365e-06 1.34365e-06 -2.28605e-05
17 6.381e+06 8.5 23.2004 4.13488 2.42604e-05 1.48031e-06 1.48031e-06 -2.33948e-05
18 6.381e+06 8.4 23.4859 4.19265 2.48869e-05 1.62464e-06 1.62464e-06 -2.39478e-05
19 6.381e+06 8.3 23.7781 4.25254 2.55356e-05 1.77712e-06 1.77712e-06 -2.45201e-05
20 6.381e+06 8.2 24.077 4.31463 2.62074e-05 1.9383e-06 1.9383e-06 -2.51129e-05
21 6.381e+06 8.1 24.383 4.37903 2.69036e-05 2.10874e-06 2.10874e-06 -2.5727e-05
22 6.381e+06 8 24.6963 4.44587 2.76254e-05 2.28906e-06 2.28906e-06 -2.63635e-05
23 6.381e+06 7.9 25.0171 4.51527 2.83738e-05 2.47993e-06 2.47993e-06 -2.70234e-05
24 6.381e+06 7.8 25.3459 4.58735 2.91504e-05 2.68206e-06 2.68206e-06 -2.77079e-05
25 6.381e+06 7.7 25.6828 4.66227 2.99564e-05 2.89624e-06 2.89624e-06 -2.84182e-05
26 6.381e+06 7.6 26.0281 4.74017 3.07934e-05 3.12329e-06 3.12329e-06 -2.91556e-05
27 6.381e+06 7.5 26.3823 4.8212 3.16629e-05 3.36414e-06 3.36414e-06 -2.99215e-05
28 6.381e+06 7.4 26.7455 4.90555 3.25667e-05 3.61976e-06 3.61976e-06 -3.07174e-05
29 6.381e+06 7.3 27.1183 4.99339 3.35065e-05 3.89123e-06 3.89123e-06 -3.15447e-05
30 6.381e+06 7.2 27.501 5.08492 3.44842e-05 4.1797e-06 4.1797e-06 -3.24053e-05
31 6.381e+06 7.1 27.8939 5.18035 3.55018e-05 4.48645e-06 4.48645e-06 -3.33007e-05
32 6.381e+06 7 28.2975 5.27991 3.65617e-05 4.81285e-06 4.81285e-06 -3.4233e-05
33 6.381e+06 6.9 28.7122 5.38383 3.76659e-05 5.16039e-06 5.16039e-06 -3.52041e-05
34 6.381e+06 6.8 29.1386 5.49237 3.88171e-05 5.53071e-06 5.53071e-06 -3.62161e-05
35 6.381e+06 6.7 29.577 5.60581 4.00179e-05 5.9256e-06 5.9256e-06 -3.72714e-05
36 6.381e+06 6.6 30.0281 5.72446 4.12711e-05 6.34701e-06 6.34701e-06 -3.83724e-05
37 6.381e+06 6.5 30.4923 5.84863 4.25797e-05 6.79708e-06 6.79708e-06 -3.95217e-05
38 6.381e+06 6.4 30.9703 5.97867 4.3947e-05 7.27815e-06 7.27815e-06 -4.0722e-05
39 6.381e+06 6.3 31.4627 6.11495 4.53764e-05 7.79281e-06 7.79281e-06 -4.19765e-05
40 6.381e+06 6.2 31.9701 6.25789 4.68717e-05 8.34387e-06 8.34387e-06 -4.32883e-05
41 6.381e+06 6.1 32.4932 6.40793 4.8437e-05 8.93446e-06 8.93446e-06 -4.46608e-05
42 6.381e+06 6 33.0328 6.56553 5.00764e-05 9.56802e-06 9.56802e-06 -4.60978e-05
43 6.381e+06 5.9 33.5896 6.73122 5.17947e-05 1.02483e-05 1.02483e-05 -4.76032e-05
44 6.381e+06 5.8 34.1644 6.90556 5.35968e-05 1.09796e-05 1.09796e-05 -4.91813e-05
45 6.381e+06 5.7 34.7582 7.08917 5.54881e-05 1.17665e-05 1.17665e-05 -5.08366e-05
46 6.381e+06 5.6 35.3719 7.28269 5.74743e-05 1.26142e-05 1.26142e-05 -5.25741e-05
47 6.381e+06 5.5 36.0065 7.48688 5.95618e-05 1.35283e-05 1.35283e-05 -5.43991e-05
48 6.381e+06 5.4 36.663 7.70251 6.17572e-05 1.45154e-05 1.45154e-05 -5.63174e-05
49 6.381e+06 5.3 37.3426 7.93046 6.40678e-05 1.55824e-05 1.55824e-05 -5.8335e-05
50 6.381e+06 5.2 38.0465 8.17168 6.65015e-05 1.67375e-05 1.67375e-05 -6.04586e-05
51 6.381e+06 5.1 38.776 8.42722 6.90667e-05 1.79894e-05 1.79894e-05 -6.26954e-05
52 6.381e+06 5 39.5325 8.69824 7.17726e-05 1.93483e-05 1.93483e-05 -6.5053e-05
53 6.381e+06 4.9 40.3174 8.986 7.46291e-05 2.08253e-05 2.08253e-05 -6.75398e-05
54 6.381e+06 4.8 41.1323 9.29191 7.7647e-05 2.24331e-05 2.24331e-05 -7.01647e-05
55 6.381e+06 4.7 41.9789 9.61752 8.08378e-05 2.4186e-05 2.4186e-05 -7.29374e-05
56 6.381e+06 4.6 42.859 9.96454 8.42141e-05 2.61002e-05 2.61002e-05 -7.58682e-05
57 6.381e+06 4.5 43.7746 10.3349 8.77895e-05 2.81941e-05 2.81941e-05 -7.89684e-05
58 6.381e+06 4.4 44.7277 10.7307 9.15785e-05 3.04886e-05 3.04886e-05 -8.22499e-05
59 6.381e+06 4.3 45.7206 11.1543 9.5597e-05 3.30074e-05 3.30074e-05 -8.57254e-05
60 6.381e+06 4.2 46.7557 11.6085 9.98619e-05 3.57777e-05 3.57777e-05 -8.94088e-05
61 6.381e+06 4.1 47.8354 12.096 0.000104391 3.88308e-05 3.88308e-05 -9.33147e-05
62 6.381e+06 4 48.9626 12.6204 0.000109205 4.22023e-05 4.22023e-05 -9.74584e-05
63 6.381e+06 3.9 50.1402 13.1853 0.000114324 4.59335e-05 4.59335e-05 -0.000101856
64 6.381e+06 3.8 51.3713 13.795 0.00011977 5.0072e-05 5.0072e-05 -0.000106525
65 6.381e+06 3.7 52.6592 14.4543 0.000125565 5.46729e-05 5.46729e-05 -0.000111482
66 6.381e+06 3.6 54.0076 15.1686 0.000131735 5.98001e-05 5.98001e-05 -0.000116745
67 6.381e+06 3.5 55.4203 15.9442 0.000138304 6.55284e-05 6.55284e-05 -0.000122332
68 6.381e+06 3.4 56.9012 16.7882 0.000145295 7.19446e-05 7.19446e-05 -0.000128258
69 6.381e+06 3.3 58.4545 17.7086 0.000152733 7.91509e-05 7.91509e-05 -0.000134538
70 6.381e+06 3.2 60.0847 18.7147 0.000160639 8.72667e-05 8.72667e-05 -0.000141184
71 6.381e+06 3.1 61.7963 19.8174 0.00016903 9.64332e-05 9.64332e-05 -0.0001482
72 6.381e+06 3 63.5939 21.0289 0.000177916 0.000106816 0.000106816 -0.000155585
73 6.381e+06 2.9 65.482 22.3636 0.000187298 0.000118613 0.000118613 -0.000163325
74 6.381e+06 2.8 67.465 23.8381 0.00019716 0.000132054 0.000132054 -0.000171388
75 6.381e+06 2.7 69.5468 25.4718 0.000207463 0.000147416 0.000147416 -0.000179716
76 6.381e+06 2.6 71.7307 27.2873 0.000218132 0.000165023 0.000165023 -0.000188219
77 6.381e+06 2.5 74.0186 29.311 0.000229045 0.000185259 0.000185259 -0.000196752
78 6.381e+06 2.4 76.4104 31.5736 0.000240008 0.000208574 0.000208574 -0.000205102
79 6.381e+06 2.3 78.9034 34.1113 0.000250725 0.000235493 0.000235493 -0.000212953
80 6.381e+06 2.2 81.4906 36.9659 0.00026076 0.000266621 0.000266621 -0.000219851
81 6.381e+06 2.1 84.1586 40.1864 0.000269476 0.000302637 0.000302637 -0.000225147
82 6.381e+06 2 86.8858 43.829 0.000275957 0.000344278 0.000344278 -0.000227925
83 6.381e+06 1.9 89.638 47.9579 0.000278906 0.000392295 0.000392295 -0.000226908
84 6.381e+06 1.8 92.364 52.6444 0.000276515 0.000447358 0.000447358 -0.000220335
85 6.381e+06 1.7 94.989 57.9655 0.000266309 0.000509879 0.000509879 -0.00020583
86 6.381e+06 1.6 97.407 63.9991 0.000245006 0.000579704 0.000579704 -0.000180286
87 6.381e+06 1.5 99.4717 70.8151 0.000208463 0.000655604 0.000655604 -0.00013984
88 6.381e+06 1.4 100.989 78.4599 0.000151893 0.00073454 0.00073454 -8.01286e-05
89 6.381e+06 1.3 101.712 86.9319 7.06728e-05 0.000810793 0.000810793 2.88724e-06
90 6.381e+06 1.2 101.358 96.1495 -3.78868e-05 0.000875464 0.000875464 0.000111208
91 6.381e+06 1.1 99.6383 105.921 -0.00017192 0.000917346 0.000917346 0.00024235
92 6.381e+06 1 96.3255 115.935 -0.000322963 0.000926163 0.000926163 0.000387608
93 6.381e+06 0.9 91.3201 125.802 -0.000477057 0.000897199 0.000897199 0.00053342
94 6.381e+06 0.8 84.6836 135.128 -0.000619649 0.000833742 0.000833742 0.000666208
95 6.381e+06 0.7 76.6121 143.595 -0.000740811 0.000744974 0.000744974 0.000777214
96 6.381e+06 0.6 67.3704 150.999 -0.000836994 0.000641429 0.000641429 0.00086386
97 6.381e+06 0.5 57.2301 157.239 -0.000909443 0.000531619 0.000531619 0.000927999
98 6.381e+06 0.4 46.4313 162.291 -0.000961693 0.000420974 0.000420974 0.000973449
99 6.381e+06 0.3 35.1701 166.169 -0.000997711 0.000312213 0.000312213 0.00100425
100 6.381e+06 0.2 23.6007 168.906 -0.00102093 0.000206152 0.000206152 0.0010238
101 6.381e+06 0.1 11.8444 170.533 -0.00103385 0.000102421 0.000102421 0.00103457
102 6.381e+06 0 7.95866e-11 171.073 -0.001038 1.08948e-15 1.08948e-15 0.001038
103 6.381e+06 -0.1 -11.8444 170.533 -0.00103385 -0.000102421 -0.000102421 0.00103457
104 6.381e+06 -0.2 -23.6007 168.906 -0.00102093 -0.000206152 -0.000206152 0.0010238
105 6.381e+06 -0.3 -35.1701 166.169 -0.000997711 -0.000312213 -0.000312213 0.00100425
106 6.381e+06 -0.4 -46.4313 162.291 -0.000961693 -0.000420974 -0.000420974 0.000973449
107 6.381e+06 -0.5 -57.2301 157.239 -0.000909443 -0.000531619 -0.000531619 0.000927999
108 6.381e+06 -0.6 -67.3704 150.999 -0.000836994 -0.000641429 -0.000641429 0.00086386
109 6.381e+06 -0.7 -76.6121 143.595 -0.000740811 -0.000744974 -0.000744974 0.000777214
110 6.381e+06 -0.8 -84.6836 135.128 -0.000619649 -0.000833742 -0.000833742 0.000666208
111 6.381e+06 -0.9 -91.3201 125.802 -0.000477057 -0.000897199 -0.000897199 0.00053342
112 6.381e+06 -1 -96.3255 115.935 -0.000322963 -0.000926163 -0.000926163 0.000387608
113 6.381e+06 -1.1 -99.6383 105.921 -0.00017192 -0.000917346 -0.000917346 0.00024235
114 6.381e+06 -1.2 -101.358 96.1495 -3.78868e-05 -0.000875464 -0.000875464 0.000111208
115 6.381e+06 -1.3 -101.712 86.9319 7.06728e-05 -0.000810793 -0.000810793 2.88724e-06
116 6.381e+06 -1.4 -100.989 78.4599 0.000151893 -0.00073454 -0.00073454 -8.01286e-05
117 6.381e+06 -1.5 -99.4717 70.8151 0.000208463 -0.000655604 -0.000655604 -0.00013984
118 6.381e+06 -1.6 -97.407 63.9991 0.000245006 -0.000579704 -0.000579704 -0.000180286
119 6.381e+06 -1.7 -94.989 57.9655 0.000266309 -0.000509879 -0.000509879 -0.00020583
120 6.381e+06 -1.8 -92.364 52.6444 0.000276515 -0.000447358 -0.000447358 -0.000220335
121 6.381e+06 -1.9 -89.638 47.9579 0.000278906 -0.000392295 -0.000392295 -0.000226908
122 6.381e+06 -2 -86.8858 43.829 0.000275957 -0.000344278 -0.000344278 -0.000227925
123 6.381e+06 -2.1 -84.1586 40.1864 0.000269476 -0.000302637 -0.000302637 -0.000225147
124 6.381e+06 -2.2 -81.4906 36.9659 0.00026076 -0.000266621 -0.000266621 -0.000219851
125 6.381e+06 -2.3 -78.9034 34.1113 0.000250725 -0.000235493 -0.000235493 -0.000212953
126 6.381e+06 -2.4 -76.4104 31.5736 0.000240008 -0.000208574 -0.000208574 -0.000205102
127 6.381e+06 -2.5 -74.0186 29.311 0.000229045 -0.000185259 -0.000185259 -0.000196752
128 6.381e+06 -2.6 -71.7307 27.2873 0.000218132 -0.000165023 -0.000165023 -0.000188219
129 6.381e+06 -2.7 -69.5468 25.4718 0.000207463 -0.000147416 -0.000147416 -0.000179716
130 6.381e+06 -2.8 -67.465 23.8381 0.00019716 -0.000132054 -0.000132054 -0.000171388
131 6.381e+06 -2.9 -65.482 22.3636 0.000187298 -0.000118613 -0.000118613 -0.000163325
132 6.381e+06 -3 -63.5939 21.0289 0.000177916 -0.000106816 -0.000106816 -0.000155585
133 6.381e+06 -3.1 -61.7963 19.8174 0.00016903 -9.64332e-05 -9.64332e-05 -0.0001482
134 6.381e+06 -3.2 -60.0847 18.7147 0.000160639 -8.72667e-05 -8.72667e-05 -0.000141184
135 6.381e+06 -3.3 -58.4545 17.7086 0.000152733 -7.91509e-05 -7.91509e-05 -0.000134538
136 6.381e+06 -3.4 -56.9012 16.7882 0.000145295 -7.19446e-05 -7.19446e-05 -0.000128258
137 6.381e+06 -3.5 -55.4203 15.9442 0.000138304 -6.55284e-05 -6.55284e-05 -0.000122332
138 6.381e+06 -3.6 -54.0076 15.1686 0.000131735 -5.98001e-05 -5.98001e-05 -0.000116745
139 6.381e+06 -3.7 -52.6592 14.4543 0.000125565 -5.46729e-05 -5.46729e-05 -0.000111482
140 6.381e+06 -3.8 -51.3713 13.795 0.00011977 -5.0072e-05 -5.0072e-05 -0.000106525
141 6.381e+06 -3.9 -50.1402 13.1853 0.000114324 -4.59335e-05 -4.59335e-05 -0.000101856
142 6.381e+06 -4 -48.9626 12.6204 0.000109205 -4.22023e-05 -4.22023e-05 -9.74584e-05
143 6.381e+06 -4.1 -47.8354 12.096 0.000104391 -3.88308e-05 -3.88308e-05 -9.33147e-05
144 6.381e+06 -4.2 -46.7557 11.6085 9.98619e-05 -3.57777e-05 -3.57777e-05 -8.94088e-05
145 6.381e+06 -4.3 -45.7206 11.1543 9.5597e-05 -3.30074e-05 -3.30074e-05 -8.57254e-05
146 6.381e+06 -4.4 -44.7277 10.7307 9.15785e-05 -3.04886e-05 -3.04886e-05 -8.22499e-05
147 6.381e+06 -4.5 -43.7746 10.3349 8.77895e-05 -2.81941e-05 -2.81941e-05 -7.89684e-05
148 6.381e+06 -4.6 -42.859 9.96454 8.42141e-05 -2.61002e-05 -2.61002e-05 -7.58682e-05
149 6.381e+06 -4.7 -41.9789 9.61752 8.08378e-05 -2.4186e-05 -2.4186e-05 -7.29374e-05
150 6.381e+06 -4.8 -41.1323 9.29191 7.7647e-05 -2.24331e-05 -2.24331e-05 -7.01647e-05
151 6.381e+06 -4.9 -40.3174 8.986 7.46291e-05 -2.08253e-05 -2.08253e-05 -6.75398e-05
152 6.381e+06 -5 -39.5325 8.69824 7.17726e-05 -1.93483e-05 -1.93483e-05 -6.5053e-05
153 6.381e+06 -5.1 -38.776 8.42722 6.90667e-05 -1.79894e-05 -1.79894e-05 -6.26954e-05
154 6.381e+06 -5.2 -38.0465 8.17168 6.65015e-05 -1.67375e-05 -1.67375e-05 -6.04586e-05
155 6.381e+06 -5.3 -37.3426 7.93046 6.40678e-05 -1.55824e-05 -1.55824e-05 -5.8335e-05
156 6.381e+06 -5.4 -36.663 7.70251 6.17572e-05 -1.45154e-05 -1.45154e-05 -5.63174e-05
157 6.381e+06 -5.5 -36.0065 7.48688 5.95618e-05 -1.35283e-05 -1.35283e-05 -5.43991e-05
158 6.381e+06 -5.6 -35.3719 7.28269 5.74743e-05 -1.26142e-05 -1.26142e-05 -5.25741e-05
159 6.381e+06 -5.7 -34.7582 7.08917 5.54881e-05 -1.17665e-05 -1.17665e-05 -5.08366e-05
160 6.381e+06 -5.8 -34.1644 6.90556 5.35968e-05 -1.09796e-05 -1.09796e-05 -4.91813e-05
161 6.381e+06 -5.9 -33.5896 6.73122 5.17947e-05 -1.02483e-05 -1.02483e-05 -4.76032e-05
162 6.381e+06 -6 -33.0328 6.56553 5.00764e-05 -9.56802e-06 -9.56802e-06 -4.60978e-05
163 6.381e+06 -6.1 -32.4932 6.40793 4.8437e-05 -8.93446e-06 -8.93446e-06 -4.46608e-05
164 6.381e+06 -6.2 -31.9701 6.25789 4.68717e-05 -8.34387e-06 -8.34387e-06 -4.32883e-05
165 6.381e+06 -6.3 -31.4627 6.11495 4.53764e-05 -7.79281e-06 -7.79281e-06 -4.19765e-05
166 6.381e+06 -6.4 -30.9703 5.97867 4.3947e-05 -7.27815e-06 -7.27815e-06 -4.0722e-05
167 6.381e+06 -6.5 -30.4923 5.84863 4.25797e-05 -6.79708e-06 -6.79708e-06 -3.95217e-05
168 6.381e+06 -6.6 -30.0281 5.72446 4.12711e-05 -6.34701e-06 -6.34701e-06 -3.83724e-05
169 6.381e+06 -6.7 -29.577 5.60581 4.00179e-05 -5.9256e-06 -5.9256e-06 -3.72714e-05
170 6.381e+06 -6.8 -29.1386 5.49237 3.88171e-05 -5.53071e-06 -5.53071e-06 -3.62161e-05
171 6.381e+06 -6.9 -28.7122 5.38383 3.76659e-05 -5.16039e-06 -5.16039e-06 -3.52041e-05
172 6.381e+06 -7 -28.2975 5.27991 3.65617e-05 -4.81285e-06 -4.81285e-06 -3.4233e-05
173 6.381e+06 -7.1 -27.8939 5.18035 3.55018e-05 -4.48645e-06 -4.48645e-06 -3.33007e-05
174 6.381e+06 -7.2 -27.501 5.08492 3.44842e-05 -4.1797e-06 -4.1797e-06 -3.24053e-05
175 6.381e+06 -7.3 -27.1183 4.99339 3.35065e-05 -3.89123e-06 -3.89123e-06 -3.15447e-05
176 6.381e+06 -7.4 -26.7455 4.90555 3.25667e-05 -3.61976e-06 -3.61976e-06 -3.07174e-05
177 6.381e+06 -7.5 -26.3823 4.8212 3.16629e-05 -3.36414e-06 -3.36414e-06 -2.99215e-05
178 6.381e+06 -7.6 -26.0281 4.74017 3.07934e-05 -3.12329e-06 -3.12329e-06 -2.91556e-05
179 6.381e+06 -7.7 -25.6828 4.66227 2.99564e-05 -2.89624e-06 -2.89624e-06 -2.84182e-05
180 6.381e+06 -7.8 -25.3459 4.58735 2.91504e-05 -2.68206e-06 -2.68206e-06 -2.77079e-05
181 6.381e+06 -7.9 -25.0171 4.51527 2.83738e-05 -2.47993e-06 -2.47993e-06 -2.70234e-05
182 6.381e+06 -8 -24.6963 4.44587 2.76254e-05 -2.28906e-06 -2.28906e-06 -2.63635e-05
183 6.381e+06 -8.1 -24.383 4.37903 2.69036e-05 -2.10874e-06 -2.10874e-06 -2.5727e-05
184 6.381e+06 -8.2 -24.077 4.31463 2.62074e-05 -1.9383e-06 -1.9383e-06 -2.51129e-05
185 6.381e+06 -8.3 -23.7781 4.25254 2.55356e-05 -1.77712e-06 -1.77712e-06 -2.45201e-05
186 6.381e+06 -8.4 -23.4859 4.19265 2.48869e-05 -1.62464e-06 -1.62464e-06 -2.39478e-05
187 6.381e+06 -8.5 -23.2004 4.13488 2.42604e-05 -1.48031e-06 -1.48031e-06 -2.33948e-05
188 6.381e+06 -8.6 -22.9212 4.0791 2.36551e-05 -1.34365e-06 -1.34365e-06 -2.28605e-05
189 6.381e+06 -8.7 -22.6482 4.02524 2.30701e-05 -1.2142e-06 -1.2142e-06 -2.23439e-05
190 6.381e+06 -8.8 -22.3811 3.97321 2.25044e-05 -1.09152e-06 -1.09152e-06 -2.18443e-05
191 6.381e+06 -8.9 -22.1197 3.92293 2.19573e-05 -9.75227e-07 -9.75227e-07 -2.13611e-05
192 6.381e+06 -9 -21.8639 3.87431 2.14279e-05 -8.64942e-07 -8.64942e-07 -2.08934e-05
193 6.381e+06 -9.1 -21.6135 3.82729 2.09155e-05 -7.6032e-07 -7.6032e-07 -2.04406e-05
194 6.381e+06 -9.2 -21.3683 3.78179 2.04194e-05 -6.61038e-07 -6.61038e-07 -2.00021e-05
195 6.381e+06 -9.3 -21.1281 3.73776 1.99389e-05 -5.66793e-07 -5.66793e-07 -1.95773e-05
196 6.381e+06 -9.4 -20.8928 3.69513 1.94733e-05 -4.77304e-07 -4.77304e-07 -1.91657e-05
197 6.381e+06 -9.5 -20.6623 3.65383 1.90221e-05 -3.92305e-07 -3.92305e-07 -1.87667e-05
198 6.381e+06 -9.6 -20.4363 3.61383 1.85847e-05 -3.11549e-07 -3.11549e-07 -1.83798e-05
199 6.381e+06 -9.7 -20.2148 3.57505 1.81605e-05 -2.34805e-07 -2.34805e-07 -1.80045e-05
200 6.381e+06 -9.8 -19.9977 3.53746 1.7749e-05 -1.61855e-07 -1.61855e-07 -1.76404e-05
201 6.381e+06 -9.9 -19.7847 3.501 1.73497e-05 -9.24959e-08 -9.24959e-08 -1.7287e-05
202 6.381e+06 -10 -19.5758 3.46563 1.69621e-05 -2.6536e-08 -2.6536e-08 -1.6944e-05

32762
data/stt/mag_obs.csv Normal file

File diff suppressed because it is too large Load Diff

BIN
data/stt/mag_obs.nc Normal file

Binary file not shown.

BIN
data/stt/mag_obs_ren17.nc Normal file

Binary file not shown.

View File

@ -12,6 +12,8 @@ macro(add_example name switch)
endif()
endmacro()
add_example(gobser_tri2d_ex ON)
add_example(gobser_tri2d_sph_ex ON)
add_example(mobser_dipole_ex OFF)
add_example(mobser_block_ex OFF)
add_example(mobser_block_gradient_ex OFF)

View File

@ -0,0 +1,79 @@
/********************************************************
*
*
*
*
*
*
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#include "gctl/core.h"
#include "gctl/io.h"
#include "../lib/potential.h"
using namespace gctl;
int main(int argc, char *argv[])
{
array<vertex2dc> vert;
array<triangle2d> elem;
gmshio gio;
gio.init_file("data/cylinder2d/cylinder2d", Input);
gio.set_packed(NotPacked, Input);
gio.read_mesh(elem, vert);
for (size_t i = 0; i < elem.size(); i++)
{
if (cross(*elem[i].vert[1] - *elem[i].vert[0], *elem[i].vert[2] - *elem[i].vert[0]) < 0.0)
{
vertex2dc *tmp = elem[i].vert[0]; elem[i].vert[0] = elem[i].vert[1]; elem[i].vert[1] = tmp;
}
}
array<double> rho(elem.size(), 1.0);
array<point2dc> obsp(201);
obsp.sequence(point2dc(-500.0, 0.0), point2dc(5.0, 0.0));
array<double> vx(obsp.size()), vz(obsp.size());
array<double> vxx(obsp.size()), vzz(obsp.size());
array<double> vxz(obsp.size()), vzx(obsp.size());
gobser(vx, elem, obsp, rho, gctl::Vx);
gobser(vz, elem, obsp, rho, gctl::Vz);
gobser(vxx, elem, obsp, rho, gctl::Txx);
gobser(vxz, elem, obsp, rho, gctl::Txz);
gobser(vzx, elem, obsp, rho, gctl::Tzx);
gobser(vzz, elem, obsp, rho, gctl::Tzz);
geodsv_io tio;
tio.init_table(obsp.size(), 8);
tio.set_column_names({"X", "Y", "Vx", "Vz", "Vxx", "Vxz", "Vzx", "Vzz"});
tio.fill_column_point2dc(obsp, "X", "Y");
tio.fill_column(vx, "Vx", 12);
tio.fill_column(vz, "Vz", 12);
tio.fill_column(vxx, "Vxx", 12);
tio.fill_column(vxz, "Vxz", 12);
tio.fill_column(vzx, "Vzx", 12);
tio.fill_column(vzz, "Vzz", 12);
tio.save_text("data/cylinder2d/gravity_2d");
return 0;
}

View File

@ -0,0 +1,114 @@
/********************************************************
*
*
*
*
*
*
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#include "gctl/core.h"
#include "gctl/geometry.h"
#include "gctl/io.h"
#include "../lib/potential.h"
#include "toml.hpp"
using namespace gctl;
int main(int argc, char *argv[]) try
{
toml::value toml_data = toml::parse(argv[1]);
std::string in_file = toml::find<std::string>(toml_data, "input-file");
std::string out_file = toml::find<std::string>(toml_data, "output-file");
std::string rho_name = toml::find<std::string>(toml_data, "rho-name");
double ab_rho = toml::find<double>(toml_data, "ab-rho");
// read model
array<triangle2d> ele;
array<vertex2dc> vert;
array<gmsh_physical_group> phys;
_2i_vector ele_tag;
gmshio mio;
mio.init_file(in_file, Input);
mio.set_packed(NotPacked, Input);
mio.read_mesh(ele, vert, &ele_tag);
mio.read_physical_groups(phys);
for (size_t i = 0; i < ele.size(); i++)
{
if (cross(*ele[i].vert[1] - *ele[i].vert[0], *ele[i].vert[2] - *ele[i].vert[0]) < 0.0)
{
vertex2dc *tmp = ele[i].vert[0]; ele[i].vert[0] = ele[i].vert[1]; ele[i].vert[1] = tmp;
}
}
array<double> rho(ele.size());
for (size_t i = 0; i < ele.size(); i++)
{
if (ele_tag[i][0] == mio.physical_name2tag(phys, rho_name)) rho[i] = ab_rho;
else rho[i] = 0.0;
}
// calculate gravity
array<point2dp> obsp;
grid_points_1d(obsp, 100.0, 80.0, -0.1, 6381000.0);
array<double> gx(obsp.size());
array<double> gz(obsp.size());
array<double> gxx(obsp.size());
array<double> gxz(obsp.size());
array<double> gzx(obsp.size());
array<double> gzz(obsp.size());
gobser(gx, ele, obsp, rho, Vx, FullMsg);
gobser(gz, ele, obsp, rho, Vz, FullMsg);
gobser(gxx, ele, obsp, rho, Txx, FullMsg);
gobser(gxz, ele, obsp, rho, Txz, FullMsg);
gobser(gzx, ele, obsp, rho, Tzx, FullMsg);
gobser(gzz, ele, obsp, rho, Tzz, FullMsg);
array<double> r(obsp.size()), d(obsp.size());
for (size_t i = 0; i < obsp.size(); i++)
{
r[i] = obsp[i].rad;
d[i] = deg(obsp[i].arc) - 90.0;
}
geodsv_io gio;
gio.init_table(obsp.size(), 8);
gio.set_column_names({"rad", "deg", "gx", "gz", "gxx", "gxz", "gzx", "gzz"});
gio.fill_column(r, "rad");
gio.fill_column(d, "deg");
gio.fill_column(gx, "gx");
gio.fill_column(gz, "gz");
gio.fill_column(gxx, "gxx");
gio.fill_column(gxz, "gxz");
gio.fill_column(gzx, "gzx");
gio.fill_column(gzz, "gzz");
gio.save_csv(out_file);
system("gnuplot data/shell2d/plot.gnu");
return 0;
}
catch (std::exception &e)
{
GCTL_ShowWhatError(e.what(), GCTL_ERROR_ERROR, 0, 0, 0);
}

View File

@ -31,17 +31,36 @@
using namespace gctl;
int main(int argc, char const *argv[])
bool clockwise(const triangle &t)
{
if (dot(cross(*t.vert[1] - *t.vert[0], *t.vert[2] - *t.vert[0]), *t.vert[0]) < 0) return true;
else return false;
}
int main(int argc, char const *argv[]) try
{
array<vertex3dc> top_node, btm_node;
array<mag_tricone> top_ele, btm_ele;
array<magcone_ren17> top_ele, btm_ele;
gmshio fio;
fio.init_file("data/stt/stt_1d_6371200_sph.msh", gctl::Input);
fio.set_packed(gctl::Packed, gctl::Input);
fio.init_file("data/stt/sph_rect.msh", gctl::Input);
fio.set_packed(gctl::NotPacked, gctl::Input);
fio.read_mesh(top_ele, top_node);
fio.read_mesh(btm_ele, btm_node);
// 确定三角形顶点排序
triangle t;
vertex3dc *v = nullptr;
for (size_t i = 0; i < top_ele.size(); i++)
{
t.set(*top_ele[i].vert[0], *top_ele[i].vert[1], *top_ele[i].vert[2]);
if (clockwise(t))
{
v = top_ele[i].vert[0]; top_ele[i].vert[0] = top_ele[i].vert[1]; top_ele[i].vert[1] = v;
v = btm_ele[i].vert[0]; btm_ele[i].vert[0] = btm_ele[i].vert[1]; btm_ele[i].vert[1] = v;
}
}
vertex3dc origin(point3dc(0.0, 0.0, 0.0), top_node.size());
for (size_t i = 0; i < top_ele.size(); i++)
{
@ -68,49 +87,34 @@ int main(int argc, char const *argv[])
mag_B[i] = magkernel_single(md, cen_c);
}
array<magcone_para> top_para, btm_para;
// 计算磁体参数
array<magcone_para_ren17> top_para, btm_para;
array<double> sus(top_ele.size(), 0.01);
callink_magnetic_para(top_ele, top_para, mag_B);
callink_magnetic_para(btm_ele, btm_para, mag_B);
// 设置观测点位
array<point3ds> obsp(top_ele.size());
for (size_t i = 0; i < top_ele.size(); i++)
{
cen_c = 1.0/3.0*(*top_ele[i].vert[0] + *top_ele[i].vert[1] + *top_ele[i].vert[2]);
obsp[i] = cen_c.c2s();
obsp[i].rad += 200000;
}
array<point3ds> obsp;
grid_points_2d(obsp, 10.0, 55.0, 20.0, 65.0, 0.25, 0.25, 6371200.0 + 100000);
// 正演计算
array<double> obsval(obsp.size());
array<point3dc> obsgrad;
// 正演磁分量数据
set_magcone_ren17_tolerance(1e-30);
magobser(obsgrad, top_ele, btm_ele, obsp, sus, ShortMsg);
// 保存网格
fio.init_file("data/stt/stt_1d_out.msh", gctl::Output);
fio.set_packed(gctl::NotPacked, gctl::Output);
fio.save_mesh(top_ele, top_node);
geodsv_io fout;
fout.init_table(obsp.size(), 6);
fout.set_column_names({"rad", "lon", "lat", "Br", "Bt", "Bp"});
fout.fill_column_point3ds(obsp, "rad", "lon", "lat");
fout.fill_column_point3dc(obsgrad, "Br", "Bt", "Bp", 12);
fout.save_csv("data/stt/mag_obs");
for (int i = 0; i < obsp.size(); ++i)
{
obsval[i] = obsgrad[i].x;
}
fio.save_data("Br", obsval, ElemData);
for (int i = 0; i < obsp.size(); ++i)
{
obsval[i] = obsgrad[i].y;
}
fio.save_data("Bt", obsval, ElemData);
for (int i = 0; i < obsp.size(); ++i)
{
obsval[i] = obsgrad[i].z;
}
fio.save_data("Bp", obsval, ElemData);
system("xyz2nc -t data/stt/mag_obs.csv -g data/stt/mag_obs_ren17.nc -r 10/55/20/65 -i 0.25/0.25 -c 1,2,3,4,5 -l x,y,Br,Bt,Bp -d ','");
return 0;
}
catch (std::exception &e)
{
GCTL_ShowWhatError(e.what(), GCTL_ERROR_ERROR, 0, 0, 0);
}

View File

@ -48,6 +48,7 @@
#include "potential/mkernel_block.h"
#include "potential/mkernel_triangle.h"
#include "potential/mkernel_tricone.h"
#include "potential/mkernel_tricone_Ren2017.h"
#include "potential/mkernel_tetrahedron.h"
#include "potential/mkernel_tetrahedron_Ren2017.h"

View File

@ -42,6 +42,12 @@ typedef void (*gkernel_triangle2d_ptr)(gctl::matrix<double> &out_kernel, const g
void gkernel_triangle2d_vz(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vx(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vxx(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vxz(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vzx(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vzz(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
@ -65,6 +71,15 @@ void gctl::gkernel(matrix<double> &out_kernel, const array<triangle2d> &ele,
case Vz:
triangle_kernel = gkernel_triangle2d_vz;
break;
case Vx:
triangle_kernel = gkernel_triangle2d_vx;
break;
case Txx:
triangle_kernel = gkernel_triangle2d_vxx;
break;
case Txz:
triangle_kernel = gkernel_triangle2d_vxz;
break;
case Tzx:
triangle_kernel = gkernel_triangle2d_vzx;
break;
@ -72,12 +87,59 @@ void gctl::gkernel(matrix<double> &out_kernel, const array<triangle2d> &ele,
triangle_kernel = gkernel_triangle2d_vzz;
break;
default:
triangle_kernel = gkernel_triangle2d_vz;
throw std::invalid_argument("Invalid gravitational field type!");
break;
}
return triangle_kernel(out_kernel, ele, obsp, verbose);
}
typedef void (*gkernel_triangle2d_ptr2)(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vxx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vxz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vzx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gkernel_triangle2d_vzz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose);
void gctl::gkernel(matrix<double> &out_kernel, const array<triangle2d> &ele,
const array<point2dp> &obsp, gravitational_field_type_e comp_id, verbose_type_e verbose)
{
gkernel_triangle2d_ptr2 triangle_kernel2;
switch (comp_id)
{
case Vz:
triangle_kernel2 = gkernel_triangle2d_vz2;
break;
case Vx:
triangle_kernel2 = gkernel_triangle2d_vx2;
break;
case Txx:
triangle_kernel2 = gkernel_triangle2d_vxx2;
break;
case Txz:
triangle_kernel2 = gkernel_triangle2d_vxz2;
break;
case Tzx:
triangle_kernel2 = gkernel_triangle2d_vzx2;
break;
case Tzz:
triangle_kernel2 = gkernel_triangle2d_vzz2;
break;
default:
throw std::invalid_argument("Invalid gravitational field type!");
break;
}
return triangle_kernel2(out_kernel, ele, obsp, verbose);
}
/**
* @brief callback interface of the gravitational observations of 2D triangular elements
*
@ -92,6 +154,12 @@ typedef void (*gobser_triangle2d_ptr)(gctl::array<double> &out_obs, const gctl::
void gobser_triangle2d_vz(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vx(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vxx(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vxz(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vzx(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vzz(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
@ -116,6 +184,15 @@ void gctl::gobser(array<double> &out_obs, const array<triangle2d> &ele, const ar
case Vz:
triangle_obser = gobser_triangle2d_vz;
break;
case Vx:
triangle_obser = gobser_triangle2d_vx;
break;
case Txx:
triangle_obser = gobser_triangle2d_vxx;
break;
case Txz:
triangle_obser = gobser_triangle2d_vxz;
break;
case Tzx:
triangle_obser = gobser_triangle2d_vzx;
break;
@ -123,13 +200,63 @@ void gctl::gobser(array<double> &out_obs, const array<triangle2d> &ele, const ar
triangle_obser = gobser_triangle2d_vzz;
break;
default:
triangle_obser = gobser_triangle2d_vz;
throw std::invalid_argument("Invalid gravitational field type!");
break;
}
return triangle_obser(out_obs, ele, obsp, rho, verbose);
}
typedef void (*gobser_triangle2d_ptr2)(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vxx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vxz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vzx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gobser_triangle2d_vzz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose);
void gctl::gobser(array<double> &out_obs, const array<triangle2d> &ele, const array<point2dp> &obsp,
const array<double> &rho, gravitational_field_type_e comp_id, verbose_type_e verbose)
{
gobser_triangle2d_ptr2 triangle_obser2;
switch (comp_id)
{
case Vz:
triangle_obser2 = gobser_triangle2d_vz2;
break;
case Vx:
triangle_obser2 = gobser_triangle2d_vx2;
break;
case Txx:
triangle_obser2 = gobser_triangle2d_vxx2;
break;
case Txz:
triangle_obser2 = gobser_triangle2d_vxz2;
break;
case Tzx:
triangle_obser2 = gobser_triangle2d_vzx2;
break;
case Tzz:
triangle_obser2 = gobser_triangle2d_vzz2;
break;
default:
throw std::invalid_argument("Invalid gravitational field type!");
break;
}
return triangle_obser2(out_obs, ele, obsp, rho, verbose);
}
double gkernel_triangle2d_vz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
double gkernel_triangle2d_vx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
double gkernel_triangle2d_vxx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
double gkernel_triangle2d_vxz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
double gkernel_triangle2d_vzx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
double gkernel_triangle2d_vzz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr);
@ -174,7 +301,79 @@ void gkernel_triangle2d_vz(gctl::matrix<double> &out_kernel, const gctl::array<g
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel.at(i, j) = gkernel_triangle2d_vz_sig(ele.get(j), obsp.get(i));
out_kernel[i][j] = gkernel_triangle2d_vz_sig(ele.get(j), obsp.get(i));
}
}
return;
}
void gkernel_triangle2d_vx(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vx");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel[i][j] = gkernel_triangle2d_vx_sig(ele.get(j), obsp.get(i));
}
}
return;
}
void gkernel_triangle2d_vxx(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vxx");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel[i][j] = gkernel_triangle2d_vxx_sig(ele.get(j), obsp.get(i));
}
}
return;
}
void gkernel_triangle2d_vxz(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vxz");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel[i][j] = gkernel_triangle2d_vxz_sig(ele.get(j), obsp.get(i));
}
}
return;
@ -198,7 +397,7 @@ void gkernel_triangle2d_vzx(gctl::matrix<double> &out_kernel, const gctl::array<
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel.at(i, j) = gkernel_triangle2d_vzx_sig(ele.get(j), obsp.get(i));
out_kernel[i][j] = gkernel_triangle2d_vzx_sig(ele.get(j), obsp.get(i));
}
}
return;
@ -222,12 +421,196 @@ void gkernel_triangle2d_vzz(gctl::matrix<double> &out_kernel, const gctl::array<
#pragma omp parallel for private (j) schedule(guided)
for (j = 0; j < e_size; j++)
{
out_kernel.at(i, j) = gkernel_triangle2d_vzz_sig(ele.get(j), obsp.get(i));
out_kernel[i][j] = gkernel_triangle2d_vzz_sig(ele.get(j), obsp.get(i));
}
}
return;
}
void gkernel_triangle2d_vz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc, obsg;
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vz");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, obsg) schedule(guided)
for (j = 0; j < e_size; j++)
{
obsg.x = gkernel_triangle2d_vx_sig(ele.get(j), &obsc);
obsg.y = gkernel_triangle2d_vz_sig(ele.get(j), &obsc);
out_kernel[i][j] = obsg.y*sin(obsp[i].arc) - obsg.x*cos(obsp[i].arc);
}
}
}
void gkernel_triangle2d_vx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc, obsg;
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vx");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, obsg) schedule(guided)
for (j = 0; j < e_size; j++)
{
obsg.x = gkernel_triangle2d_vx_sig(ele.get(j), &obsc);
obsg.y = gkernel_triangle2d_vz_sig(ele.get(j), &obsc);
out_kernel[i][j] = -1.0*obsg.y*cos(obsp[i].arc) + obsg.x*sin(obsp[i].arc);
}
}
}
void gkernel_triangle2d_vxx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vxx");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, t) schedule(guided)
for (j = 0; j < e_size; j++)
{
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_kernel[i][j] = sin(obsp[i].arc)*(t[0][0]*sin(obsp[i].arc) - t[1][0]*cos(obsp[i].arc))
- cos(obsp[i].arc)*(t[0][1]*sin(obsp[i].arc) - t[1][1]*cos(obsp[i].arc));
}
}
}
void gkernel_triangle2d_vxz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vxz");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, t) schedule(guided)
for (j = 0; j < e_size; j++)
{
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_kernel[i][j] = -1.0*cos(obsp[i].arc)*(t[0][0]*sin(obsp[i].arc) - t[1][0]*cos(obsp[i].arc))
+ sin(obsp[i].arc)*(t[0][1]*sin(obsp[i].arc) - t[1][1]*cos(obsp[i].arc));
}
}
}
void gkernel_triangle2d_vzx2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vzx");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, t) schedule(guided)
for (j = 0; j < e_size; j++)
{
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_kernel[i][j] = sin(obsp[i].arc)*(t[1][0]*sin(obsp[i].arc) - t[0][0]*cos(obsp[i].arc))
- cos(obsp[i].arc)*(t[1][1]*sin(obsp[i].arc) - t[0][1]*cos(obsp[i].arc));
}
}
}
void gkernel_triangle2d_vzz2(gctl::matrix<double> &out_kernel, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_kernel.resize(o_size, e_size);
gctl::progress_bar bar(o_size, "gkernel_vzz");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
obsc = obsp[i].p2c();
#pragma omp parallel for private (j, t) schedule(guided)
for (j = 0; j < e_size; j++)
{
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_kernel[i][j] = -1.0*cos(obsp[i].arc)*(t[1][0]*sin(obsp[i].arc) - t[0][0]*cos(obsp[i].arc))
+ sin(obsp[i].arc)*(t[1][1]*sin(obsp[i].arc) - t[0][1]*cos(obsp[i].arc));
}
}
}
void gobser_triangle2d_vz(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
@ -246,7 +629,79 @@ void gobser_triangle2d_vz(gctl::array<double> &out_obs, const gctl::array<gctl::
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs.at(i) += gkernel_triangle2d_vz_sig(ele.get(j), obsp.get(i)) * rho[j];
out_obs[i] += gkernel_triangle2d_vz_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
}
void gobser_triangle2d_vx(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vx");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] += gkernel_triangle2d_vx_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
}
void gobser_triangle2d_vxx(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vxx");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] += gkernel_triangle2d_vxx_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
}
void gobser_triangle2d_vxz(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dc> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vxz");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] += gkernel_triangle2d_vxz_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
@ -270,7 +725,7 @@ void gobser_triangle2d_vzx(gctl::array<double> &out_obs, const gctl::array<gctl:
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs.at(i) += gkernel_triangle2d_vzx_sig(ele.get(j), obsp.get(i)) * rho[j];
out_obs[i] += gkernel_triangle2d_vzx_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
@ -294,12 +749,192 @@ void gobser_triangle2d_vzz(gctl::array<double> &out_obs, const gctl::array<gctl:
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs.at(i) += gkernel_triangle2d_vzz_sig(ele.get(j), obsp.get(i)) * rho[j];
out_obs[i] += gkernel_triangle2d_vzz_sig(ele.get(j), obsp.get(i)) * rho[j];
}
}
return;
}
void gobser_triangle2d_vz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc, obsg;
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vz");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, obsg, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
obsg.x = gkernel_triangle2d_vx_sig(ele.get(j), &obsc); // 沿x轴正方向的重力值
obsg.y = gkernel_triangle2d_vz_sig(ele.get(j), &obsc); // 沿z轴负方向的重力值
out_obs[i] += (obsg.y*sin(obsp[i].arc) - obsg.x*cos(obsp[i].arc))*rho[j]; // 沿半径负方向的重力值
}
}
return;
}
void gobser_triangle2d_vx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc, obsg;
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vx");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, obsg, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
obsg.x = gkernel_triangle2d_vx_sig(ele.get(j), &obsc); // 沿x轴正方向的重力值
obsg.y = gkernel_triangle2d_vz_sig(ele.get(j), &obsc); // 沿z轴负方向的重力值
out_obs[i] += (-1.0*obsg.y*cos(obsp[i].arc) + obsg.x*sin(obsp[i].arc))*rho[j]; // 沿弧度负方向的重力值
}
}
return;
}
void gobser_triangle2d_vxx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vxx");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, t, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_obs[i] += (sin(obsp[i].arc)*(t[0][0]*sin(obsp[i].arc) - t[1][0]*cos(obsp[i].arc))
- cos(obsp[i].arc)*(t[0][1]*sin(obsp[i].arc) - t[1][1]*cos(obsp[i].arc)))*rho[j];
}
}
}
void gobser_triangle2d_vxz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vxz");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, t, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_obs[i] += (-1.0*cos(obsp[i].arc)*(t[0][0]*sin(obsp[i].arc) - t[1][0]*cos(obsp[i].arc))
+ sin(obsp[i].arc)*(t[0][1]*sin(obsp[i].arc) - t[1][1]*cos(obsp[i].arc)))*rho[j];
}
}
}
void gobser_triangle2d_vzx2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vzx");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, t, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_obs[i] += (sin(obsp[i].arc)*(t[1][0]*sin(obsp[i].arc) - t[0][0]*cos(obsp[i].arc))
- cos(obsp[i].arc)*(t[1][1]*sin(obsp[i].arc) - t[0][1]*cos(obsp[i].arc)))*rho[j];
}
}
}
void gobser_triangle2d_vzz2(gctl::array<double> &out_obs, const gctl::array<gctl::triangle2d> &ele,
const gctl::array<gctl::point2dp> &obsp, const gctl::array<double> &rho, gctl::verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
int e_size = ele.size();
gctl::point2dc obsc;
double t[2][2];
out_obs.resize(o_size, 0.0);
gctl::progress_bar bar(e_size, "gobser_vzz");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i, t, obsc) schedule(guided)
for (i = 0; i < o_size; i++)
{
obsc = obsp[i].p2c();
t[1][0] = gkernel_triangle2d_vzx_sig(ele.get(j), &obsc);
t[1][1] = gkernel_triangle2d_vzz_sig(ele.get(j), &obsc);
t[0][0] = -1.0*t[1][1];
t[0][1] = t[1][0];
out_obs[i] += (-1.0*cos(obsp[i].arc)*(t[1][0]*sin(obsp[i].arc) - t[0][0]*cos(obsp[i].arc))
+ sin(obsp[i].arc)*(t[1][1]*sin(obsp[i].arc) - t[0][1]*cos(obsp[i].arc)))*rho[j];
}
}
}
double gkernel_triangle2d_vz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr)
{
double sum;
@ -317,17 +952,59 @@ double gkernel_triangle2d_vz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_p
Ba = atan2(ele_ptr->vert[n]->y - op_ptr->y, ele_ptr->vert[n]->x - op_ptr->x);
Bb = atan2(ele_ptr->vert[(n+1)%3]->y - op_ptr->y, ele_ptr->vert[(n+1)%3]->x - op_ptr->x);
if (ele_ptr->vert[n]->y - op_ptr->y > 0.0 && ele_ptr->vert[n]->x - op_ptr->x < 0.0) Ba -= 2*GCTL_Pi;
if (ele_ptr->vert[(n+1)%3]->y - op_ptr->y > 0.0 && ele_ptr->vert[(n+1)%3]->x - op_ptr->x < 0.0) Bb -= 2*GCTL_Pi;
B = (ele_ptr->vert[(n+1)%3]->x - ele_ptr->vert[n]->x)*(Ba - Bb);
Ca = pow(ele_ptr->vert[(n+1)%3]->x - op_ptr->x,2) + pow(ele_ptr->vert[(n+1)%3]->y - op_ptr->y,2);
Cb = pow(ele_ptr->vert[n]->x - op_ptr->x,2) + pow(ele_ptr->vert[n]->y - op_ptr->y,2);
C = 0.5*(ele_ptr->vert[(n+1)%3]->y - ele_ptr->vert[n]->y)*(log(Ca) - log(Cb));
sum += A*(B+C);
sum += A*(B + C);
}
return -2.0e+8*GCTL_G0*sum;
}
double gkernel_triangle2d_vx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr)
{
double sum;
double A, B, C;
double Aa, Ab, Ba, Bb, Ca, Cb;
sum = 0.0;
for (int n = 0; n < 3; n++)
{
Aa = (ele_ptr->vert[n]->y - op_ptr->y)*(ele_ptr->vert[(n+1)%3]->x - op_ptr->x) -
(ele_ptr->vert[(n+1)%3]->y - op_ptr->y)*(ele_ptr->vert[n]->x - op_ptr->x);
Ab = pow(ele_ptr->vert[(n+1)%3]->y - ele_ptr->vert[n]->y,2) +
pow(ele_ptr->vert[(n+1)%3]->x - ele_ptr->vert[n]->x,2);
A = Aa/Ab;
Ba = atan2(ele_ptr->vert[n]->y - op_ptr->y, ele_ptr->vert[n]->x - op_ptr->x);
Bb = atan2(ele_ptr->vert[(n+1)%3]->y - op_ptr->y, ele_ptr->vert[(n+1)%3]->x - op_ptr->x);
if (ele_ptr->vert[n]->y - op_ptr->y > 0.0 && ele_ptr->vert[n]->x - op_ptr->x < 0.0) Ba -= 2*GCTL_Pi;
if (ele_ptr->vert[(n+1)%3]->y - op_ptr->y > 0.0 && ele_ptr->vert[(n+1)%3]->x - op_ptr->x < 0.0) Bb -= 2*GCTL_Pi;
B = (ele_ptr->vert[(n+1)%3]->y - ele_ptr->vert[n]->y)*(Ba - Bb);
Ca = pow(ele_ptr->vert[(n+1)%3]->x - op_ptr->x,2) + pow(ele_ptr->vert[(n+1)%3]->y - op_ptr->y,2);
Cb = pow(ele_ptr->vert[n]->x - op_ptr->x,2) + pow(ele_ptr->vert[n]->y - op_ptr->y,2);
C = 0.5*(ele_ptr->vert[(n+1)%3]->x - ele_ptr->vert[n]->x)*(log(Cb) - log(Ca));
sum += A*(B + C);
}
return 2.0e+8*GCTL_G0*sum;
}
double gkernel_triangle2d_vxx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr)
{
return -1.0*gkernel_triangle2d_vzz_sig(ele_ptr, op_ptr);
}
double gkernel_triangle2d_vxz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr)
{
return gkernel_triangle2d_vzx_sig(ele_ptr, op_ptr);
}
double gkernel_triangle2d_vzx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_ptr)
{
double sum;
@ -348,10 +1025,12 @@ double gkernel_triangle2d_vzx_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_
Ax= Aa_x/Ab;
Ba = atan2(ele_ptr->vert[n]->y - op_ptr->y, ele_ptr->vert[n]->x - op_ptr->x);
if (ele_ptr->vert[n]->y - op_ptr->y > 0.0 && ele_ptr->vert[n]->x - op_ptr->x < 0.0) Ba -= 2*GCTL_Pi;
Ba_x = (ele_ptr->vert[n]->y - op_ptr->y)/((ele_ptr->vert[n]->x - op_ptr->x)*(ele_ptr->vert[n]->x - op_ptr->x)
+ (ele_ptr->vert[n]->y - op_ptr->y)*(ele_ptr->vert[n]->y - op_ptr->y));
Bb = atan2(ele_ptr->vert[(n+1)%3]->y - op_ptr->y, ele_ptr->vert[(n+1)%3]->x - op_ptr->x);
if (ele_ptr->vert[(n+1)%3]->y - op_ptr->y > 0.0 && ele_ptr->vert[(n+1)%3]->x - op_ptr->x < 0.0) Bb -= 2*GCTL_Pi;
Bb_x = (ele_ptr->vert[(n+1)%3]->y - op_ptr->y)/((ele_ptr->vert[(n+1)%3]->x - op_ptr->x)*(ele_ptr->vert[(n+1)%3]->x - op_ptr->x)
+ (ele_ptr->vert[(n+1)%3]->y - op_ptr->y)*(ele_ptr->vert[(n+1)%3]->y - op_ptr->y));
@ -391,10 +1070,12 @@ double gkernel_triangle2d_vzz_sig(gctl::triangle2d *ele_ptr, gctl::point2dc *op_
Ay= Aa_y/Ab;
Ba = atan2(ele_ptr->vert[n]->y - op_ptr->y, ele_ptr->vert[n]->x - op_ptr->x);
if (ele_ptr->vert[n]->y - op_ptr->y > 0.0 && ele_ptr->vert[n]->x - op_ptr->x < 0.0) Ba -= 2*GCTL_Pi;
Ba_y = -1.0*(ele_ptr->vert[n]->x - op_ptr->x)/((ele_ptr->vert[n]->x - op_ptr->x)*(ele_ptr->vert[n]->x - op_ptr->x)
+ (ele_ptr->vert[n]->y - op_ptr->y)*(ele_ptr->vert[n]->y - op_ptr->y));
Bb = atan2(ele_ptr->vert[(n+1)%3]->y - op_ptr->y, ele_ptr->vert[(n+1)%3]->x - op_ptr->x);
if (ele_ptr->vert[(n+1)%3]->y - op_ptr->y > 0.0 && ele_ptr->vert[(n+1)%3]->x - op_ptr->x < 0.0) Bb -= 2*GCTL_Pi;
Bb_y = -1.0*(ele_ptr->vert[(n+1)%3]->x - op_ptr->x)/((ele_ptr->vert[(n+1)%3]->x - op_ptr->x)*(ele_ptr->vert[(n+1)%3]->x - op_ptr->x)
+ (ele_ptr->vert[(n+1)%3]->y - op_ptr->y)*(ele_ptr->vert[(n+1)%3]->y - op_ptr->y));

View File

@ -56,6 +56,31 @@ namespace gctl
*/
void gobser(array<double> &out_obs, const array<triangle2d> &ele, const array<point2dc> &obsp,
const array<double> &rho, gravitational_field_type_e comp_id = Vz, verbose_type_e verbose = FullMsg);
/**
* @brief
*
* @param out_kernel
* @param[in] ele
* @param[in] obsp
* @param[in] comp_id
* @param[in] verbose
*/
void gkernel(matrix<double> &out_kernel, const array<triangle2d> &ele, const array<point2dp> &obsp,
gravitational_field_type_e comp_id = Vz, verbose_type_e verbose = FullMsg);
/**
* @brief
*
* @param out_obs
* @param[in] ele
* @param[in] obsp
* @param[in] rho
* @param[in] comp_id
* @param[in] verbose
*/
void gobser(array<double> &out_obs, const array<triangle2d> &ele, const array<point2dp> &obsp,
const array<double> &rho, gravitational_field_type_e comp_id = Vz, verbose_type_e verbose = FullMsg);
}
#endif // _GCTL_GRAV_KERNEL_TRIANGLE2D_H

View File

@ -133,7 +133,7 @@ void gctl::read_IGRF_table(std::string file, array<IGRF_para> &IGRFs, int head_r
}
infile.close();
IGRFs.import_vector(vec_para);
IGRFs.input(vec_para);
destroy_vector(vec_para);
return;
}

View File

@ -31,6 +31,7 @@
#include "gctl/core.h"
#include "gctl/utility.h"
#include "gctl/geometry.h"
#include "gctl/maths.h"
#include "gctl/algorithm.h"
#include "gctl_potential_config.h"

View File

@ -44,9 +44,9 @@ gctl::gm_regular_grid::gm_regular_grid(std::string in_name, std::string in_info,
void gctl::gm_regular_grid::gradient(std::string datname, std::string gradname, gravitational_field_type_e c_type, int order)
{
meshdata *data_ptr = get_data(datname);
mesh_data_value_e value_type = data_ptr->get_valtype();
mesh_data_type_e data_type = data_ptr->get_dattype();
meshdata &data = get_data(datname);
mesh_data_value_e value_type = data.valtype_;
mesh_data_type_e data_type = data.loctype_;
if(value_type != Scalar)
{
@ -59,16 +59,13 @@ void gctl::gm_regular_grid::gradient(std::string datname, std::string gradname,
}
// 检查是否存在与梯度数据同名的数据 若有则检查是否需要重新建立数据
meshdata *new_data_ptr = add_data(gradname, data_type, true, value_type);
array<double> *inval_ptr = (array<double>*) data_ptr->get_datval_ptr();
array<double> *outval_ptr = (array<double>*) new_data_ptr->get_datval_ptr();
meshdata &new_data = add_data(data_type, value_type, gradname, 0.0);
gctl::array<double> ingrid_ex;
int M = -1, N = -1;
int ori_row, ori_col;
if (data_type == NodeData) gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
if (data_type == NodeData) gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
fftw_complex *out= (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
@ -173,7 +170,7 @@ void gctl::gm_regular_grid::gradient(std::string datname, std::string gradname,
{
for (int j = 0; j < rg_xnum; j++)
{
outval_ptr->at(i*rg_xnum+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*rg_xnum+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -183,7 +180,7 @@ void gctl::gm_regular_grid::gradient(std::string datname, std::string gradname,
{
for (int j = 0; j < rg_xnum-1; j++)
{
outval_ptr->at(i*(rg_xnum-1)+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*(rg_xnum-1)+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -196,9 +193,9 @@ void gctl::gm_regular_grid::gradient(std::string datname, std::string gradname,
void gctl::gm_regular_grid::rtp(std::string datname, std::string rtpname, double inc, double dec)
{
meshdata *data_ptr = get_data(datname);
mesh_data_value_e value_type = data_ptr->get_valtype();
mesh_data_type_e data_type = data_ptr->get_dattype();
meshdata &data = get_data(datname);
mesh_data_value_e value_type = data.valtype_;
mesh_data_type_e data_type = data.loctype_;
if(value_type != Scalar)
{
@ -207,16 +204,13 @@ void gctl::gm_regular_grid::rtp(std::string datname, std::string rtpname, double
}
// 检查是否存在与梯度数据同名的数据 若有则检查是否需要重新建立数据
meshdata *new_data_ptr = add_data(rtpname, data_type, true, value_type);
array<double> *inval_ptr = (array<double>*) data_ptr->get_datval_ptr();
array<double> *outval_ptr = (array<double>*) new_data_ptr->get_datval_ptr();
meshdata &new_data = add_data(data_type, value_type, rtpname, 0.0);
gctl::array<double> ingrid_ex;
int M = -1, N = -1;
int ori_row, ori_col;
if (data_type == NodeData) gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
if (data_type == NodeData) gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
fftw_complex *out= (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
@ -312,7 +306,7 @@ void gctl::gm_regular_grid::rtp(std::string datname, std::string rtpname, double
{
for (int j = 0; j < rg_xnum; j++)
{
outval_ptr->at(i*rg_xnum+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*rg_xnum+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -322,7 +316,7 @@ void gctl::gm_regular_grid::rtp(std::string datname, std::string rtpname, double
{
for (int j = 0; j < rg_xnum-1; j++)
{
outval_ptr->at(i*(rg_xnum-1)+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*(rg_xnum-1)+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -337,17 +331,17 @@ void gctl::gm_regular_grid::drtp(std::string datname, std::string incname,
std::string decname, std::string drtpname, int order)
{
// 首先获取数据并确定所有数据类型和格式都是一致的
meshdata *md_ptr = get_data(datname);
mesh_data_value_e dat_valtype = md_ptr->get_valtype();
mesh_data_type_e dat_datype = md_ptr->get_dattype();
meshdata *md_ptr = get_data_ptr(datname);
mesh_data_value_e dat_valtype = md_ptr->valtype_;
mesh_data_type_e dat_datype = md_ptr->loctype_;
md_ptr = get_data(incname);
mesh_data_value_e inc_valtype = md_ptr->get_valtype();
mesh_data_type_e inc_datype = md_ptr->get_dattype();
md_ptr = get_data_ptr(incname);
mesh_data_value_e inc_valtype = md_ptr->valtype_;
mesh_data_type_e inc_datype = md_ptr->loctype_;
md_ptr = get_data(decname);
mesh_data_value_e dec_valtype = md_ptr->get_valtype();
mesh_data_type_e dec_datype = md_ptr->get_dattype();
md_ptr = get_data_ptr(decname);
mesh_data_value_e dec_valtype = md_ptr->valtype_;
mesh_data_type_e dec_datype = md_ptr->loctype_;
std::string err_str;
if (dat_valtype != Scalar)
@ -363,32 +357,35 @@ void gctl::gm_regular_grid::drtp(std::string datname, std::string incname,
}
// 获取数据指针
md_ptr = get_data(datname);
array<double> *dat_ptr = (array<double>*) md_ptr->get_datval_ptr();
md_ptr = get_data_ptr(datname);
array<double> *dat_ptr = &md_ptr->datval_;
md_ptr = get_data(incname);
array<double> *inc_ptr = (array<double>*) md_ptr->get_datval_ptr();
md_ptr = get_data_ptr(incname);
array<double> *inc_ptr = &md_ptr->datval_;
md_ptr = get_data(decname);
array<double> *dec_ptr = (array<double>*) md_ptr->get_datval_ptr();
md_ptr = get_data_ptr(decname);
array<double> *dec_ptr = &md_ptr->datval_;
// 检查是否存在同名的数据 若有则检查是否需要重新建立数据
md_ptr = add_data(drtpname, dat_datype, true, dat_valtype);
add_data(dat_datype, dat_valtype, drtpname, 0.0);
md_ptr = get_data_ptr(drtpname);
// 获取数据指针
array<double> *drtp_ptr = (array<double>*) md_ptr->get_datval_ptr();
array<double> *drtp_ptr = &md_ptr->datval_;
// 新建临时数据并获取数据指针
std::string tmp_name = drtpname+"tmp";
md_ptr = add_data(tmp_name, dat_datype, true, dat_valtype);
array<double> *tmp_ptr = (array<double>*) md_ptr->get_datval_ptr();
add_data(dat_datype, dat_valtype, tmp_name, 0.0);
md_ptr = get_data_ptr(tmp_name);
array<double> *tmp_ptr = &md_ptr->datval_;
std::string diff1_name = drtpname+"diff1";
md_ptr = add_data(diff1_name, dat_datype, true, dat_valtype);
array<double> *diff1_ptr = (array<double>*) md_ptr->get_datval_ptr();
add_data(dat_datype, dat_valtype, diff1_name, 0.0);
md_ptr = get_data_ptr(diff1_name);
array<double> *diff1_ptr = &md_ptr->datval_;
std::string diff2_name = drtpname+"diff2";
md_ptr = add_data(diff2_name, dat_datype, true, dat_valtype);
array<double> *diff2_ptr = (array<double>*) md_ptr->get_datval_ptr();
add_data(dat_datype, dat_valtype, diff2_name, 0.0);
array<double> *diff2_ptr = &md_ptr->datval_;
// 计算平均磁化参数
double meaninc = 0.0, meandec = 0.0;
@ -461,9 +458,9 @@ void gctl::gm_regular_grid::drtp(std::string datname, std::string incname,
void gctl::gm_regular_grid::conti(std::string datname, std::string retname, double height)
{
meshdata *data_ptr = get_data(datname);
mesh_data_value_e value_type = data_ptr->get_valtype();
mesh_data_type_e data_type = data_ptr->get_dattype();
meshdata &data = get_data(datname);
mesh_data_value_e value_type = data.valtype_;
mesh_data_type_e data_type = data.loctype_;
if(value_type != Scalar)
{
@ -471,16 +468,13 @@ void gctl::gm_regular_grid::conti(std::string datname, std::string retname, doub
}
// 检查是否存在与梯度数据同名的数据 若有则检查是否需要重新建立数据
meshdata *new_data_ptr = add_data(retname, data_type, true, value_type);
array<double> *inval_ptr = (array<double>*) data_ptr->get_datval_ptr();
array<double> *outval_ptr = (array<double>*) new_data_ptr->get_datval_ptr();
meshdata &new_data = add_data(data_type, value_type, retname, 0.0);
gctl::array<double> ingrid_ex;
int M = -1, N = -1;
int ori_row, ori_col;
if (data_type == NodeData) gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(*inval_ptr, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
if (data_type == NodeData) gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum, rg_xnum, M, N, ori_row, ori_col);
else gctl::cosine_extrapolate_2d(data.datval_, ingrid_ex, rg_ynum-1, rg_xnum-1, M, N, ori_row, ori_col);
fftw_complex *in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
fftw_complex *out= (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
@ -544,7 +538,7 @@ void gctl::gm_regular_grid::conti(std::string datname, std::string retname, doub
{
for (int j = 0; j < rg_xnum; j++)
{
outval_ptr->at(i*rg_xnum+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*rg_xnum+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -554,7 +548,7 @@ void gctl::gm_regular_grid::conti(std::string datname, std::string retname, doub
{
for (int j = 0; j < rg_xnum-1; j++)
{
outval_ptr->at(i*(rg_xnum-1)+j) = ingrid_ex[(i+ori_row)*N+j+ori_col];
new_data.datval_[i*(rg_xnum-1)+j] = ingrid_ex[(i+ori_row)*N+j+ori_col];
}
}
}
@ -569,9 +563,9 @@ void gctl::gm_regular_grid::conti(std::string datname, std::string retname, doub
void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std::string resname, int wx_size, int wy_size, int x_order, int y_order)
{
meshdata *data_ptr = get_data(datname);
mesh_data_value_e value_type = data_ptr->get_valtype();
mesh_data_type_e data_type = data_ptr->get_dattype();
meshdata &data = get_data(datname);
mesh_data_value_e value_type = data.valtype_;
mesh_data_type_e data_type = data.loctype_;
if(value_type != Scalar)
{
@ -579,11 +573,8 @@ void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std:
}
// 检查是否存在与趋势场局部场数据同名的数据 若有则检查是否需要重新建立数据
meshdata *reg_data_ptr = add_data(regname, data_type, true, value_type);
meshdata *res_data_ptr = add_data(resname, data_type, true, value_type);
array<double> *inval_ptr = (array<double>*) data_ptr->get_datval_ptr();
array<double> *regval_ptr = (array<double>*) reg_data_ptr->get_datval_ptr();
array<double> *resval_ptr = (array<double>*) res_data_ptr->get_datval_ptr();
meshdata &reg_data = add_data(data_type, value_type, regname, 0.0);
meshdata &res_data = add_data(data_type, value_type, resname, 0.0);
matrix<double> data_mat;
if (data_type == NodeData)
@ -593,7 +584,7 @@ void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std:
{
for (size_t j = 0; j < rg_xnum; j++)
{
data_mat[i][j] = inval_ptr->at(i*rg_xnum+j);
data_mat[i][j] = data.datval_[i*rg_xnum+j];
}
}
}
@ -604,7 +595,7 @@ void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std:
{
for (size_t j = 0; j < rg_xnum-1; j++)
{
data_mat[i][j] = inval_ptr->at(i*(rg_xnum-1)+j);
data_mat[i][j] = data.datval_[i*(rg_xnum-1)+j];
}
}
}
@ -617,8 +608,8 @@ void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std:
{
for (size_t j = 0; j < rg_xnum; j++)
{
regval_ptr->at(i*rg_xnum+j) = data_mat[i][j];
resval_ptr->at(i*rg_xnum+j) = inval_ptr->at(i*rg_xnum+j) - data_mat[i][j];
reg_data.datval_[i*rg_xnum+j] = data_mat[i][j];
res_data.datval_[i*rg_xnum+j] = data.datval_[i*rg_xnum+j] - data_mat[i][j];
}
}
}
@ -628,8 +619,8 @@ void gctl::gm_regular_grid::trend(std::string datname, std::string regname, std:
{
for (size_t j = 0; j < rg_xnum-1; j++)
{
regval_ptr->at(i*(rg_xnum-1)+j) = data_mat[i][j];
resval_ptr->at(i*(rg_xnum-1)+j) = inval_ptr->at(i*(rg_xnum-1)+j) - data_mat[i][j];
reg_data.datval_[i*(rg_xnum-1)+j] = data_mat[i][j];
res_data.datval_[i*(rg_xnum-1)+j] = data.datval_[i*(rg_xnum-1)+j] - data_mat[i][j];
}
}
}

View File

@ -48,16 +48,15 @@ void gctl::grav_regular_mesh_2d::gobser(array<double> &out_data, std::string dat
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}

View File

@ -48,16 +48,15 @@ void gctl::gm_regular_mesh_3d::gobser(array<double> &out_data, std::string data_
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -116,16 +115,15 @@ void gctl::gm_regular_mesh_3d::magobser(array<double> &out_data, std::string dat
{
array<double> sus(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -156,16 +154,15 @@ void gctl::gm_regular_mesh_3d::magobser(array<double> &out_data, std::string dat
{
array<double> sus(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}

View File

@ -50,16 +50,15 @@ void gctl::gm_regular_mesh_sph_3d::gobser(array<double> &out_data, std::string d
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -104,16 +103,15 @@ void gctl::gm_regular_mesh_sph_3d::magobser(array<double> &out_data, std::string
{
array<double> sus(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}

View File

@ -66,16 +66,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<double> &out_obs, std::string data_
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -101,16 +100,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<point3dc> &out_obs, std::string dat
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -136,16 +134,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<tensor> &out_obs, std::string data_
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -171,16 +168,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<double> &out_obs, std::string data_
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -206,16 +202,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<point3dc> &out_obs, std::string dat
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -241,16 +236,15 @@ void gctl::gm_tetrahedron_mesh::gobser(array<tensor> &out_obs, std::string data_
{
array<double> rho(get_elenum(), 0.0);
meshdata *data_ptr = get_data(data_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(data_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
rho[i] = val_ptr->at(i);
rho[i] = data.datval_[i];
}
}
}
@ -275,19 +269,18 @@ void gctl::gm_tetrahedron_mesh::gobser(array<tensor> &out_obs, std::string data_
void gctl::gm_tetrahedron_mesh::magkernel(matrix<double> &out_kernel, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -312,19 +305,18 @@ void gctl::gm_tetrahedron_mesh::magkernel(matrix<double> &out_kernel, std::strin
void gctl::gm_tetrahedron_mesh::magkernel(matrix<point3dc> &out_kernel, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -349,19 +341,18 @@ void gctl::gm_tetrahedron_mesh::magkernel(matrix<point3dc> &out_kernel, std::str
void gctl::gm_tetrahedron_mesh::magkernel(matrix<tensor> &out_kernel, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -386,19 +377,18 @@ void gctl::gm_tetrahedron_mesh::magkernel(matrix<tensor> &out_kernel, std::strin
void gctl::gm_tetrahedron_mesh::magobser(array<double> &out_obs, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -423,19 +413,18 @@ void gctl::gm_tetrahedron_mesh::magobser(array<double> &out_obs, std::string sus
void gctl::gm_tetrahedron_mesh::magobser(array<point3dc> &out_obs, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -460,19 +449,18 @@ void gctl::gm_tetrahedron_mesh::magobser(array<point3dc> &out_obs, std::string s
void gctl::gm_tetrahedron_mesh::magobser(array<tensor> &out_obs, std::string sus_name, const array<point3dc> &obsp,
double inclina_deg, double declina_deg, verbose_type_e verbose)
{
meshdata *data_ptr = get_data(sus_name);
mesh_data_value_e vtype = data_ptr->get_valtype();
meshdata &data = get_data(sus_name);
mesh_data_value_e vtype = data.valtype_;
array<double> sus(get_elenum(), 0.0);
if (vtype == Scalar)
{
array<double> *val_ptr = (array<double>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
for (int i = 0; i < data.datval_.size(); i++)
{
if (!std::isnan(val_ptr->at(i)))
if (!std::isnan(data.datval_[i]))
{
sus[i] = val_ptr->at(i);
sus[i] = data.datval_[i];
}
}
}
@ -496,20 +484,12 @@ void gctl::gm_tetrahedron_mesh::magobser(array<tensor> &out_obs, std::string sus
void gctl::gm_tetrahedron_mesh::magobser(array<double> &out_obs, std::string magz_name, const array<point3dc> &obsp, verbose_type_e verbose)
{
meshdata *data_ptr;
mesh_data_value_e vtype;
array<point3dc> magz(get_elenum(), point3dc(0.0, 0.0, 0.0));
data_ptr = get_data(magz_name);
vtype = data_ptr->get_valtype();
meshdata &data = get_data(magz_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Vector)
{
array<point3dc> *val_ptr = (array<point3dc>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
{
magz[i] = val_ptr->at(i);
}
magz = data.export_vector();
}
else
{
@ -531,20 +511,12 @@ void gctl::gm_tetrahedron_mesh::magobser(array<double> &out_obs, std::string mag
void gctl::gm_tetrahedron_mesh::magobser(array<point3dc> &out_obs, std::string magz_name, const array<point3dc> &obsp, verbose_type_e verbose)
{
meshdata *data_ptr;
mesh_data_value_e vtype;
array<point3dc> magz(get_elenum(), point3dc(0.0, 0.0, 0.0));
data_ptr = get_data(magz_name);
vtype = data_ptr->get_valtype();
meshdata &data = get_data(magz_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Vector)
{
array<point3dc> *val_ptr = (array<point3dc>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
{
magz[i] = val_ptr->at(i);
}
magz = data.export_vector();
}
else
{
@ -566,20 +538,12 @@ void gctl::gm_tetrahedron_mesh::magobser(array<point3dc> &out_obs, std::string m
void gctl::gm_tetrahedron_mesh::magobser(array<tensor> &out_obs, std::string magz_name, const array<point3dc> &obsp, verbose_type_e verbose)
{
meshdata *data_ptr;
mesh_data_value_e vtype;
array<point3dc> magz(get_elenum(), point3dc(0.0, 0.0, 0.0));
data_ptr = get_data(magz_name);
vtype = data_ptr->get_valtype();
meshdata &data = get_data(magz_name);
mesh_data_value_e vtype = data.valtype_;
if (vtype == Vector)
{
array<point3dc> *val_ptr = (array<point3dc>*) data_ptr->get_datval_ptr();
for (int i = 0; i < val_ptr->size(); i++)
{
magz[i] = val_ptr->at(i);
}
magz = data.export_vector();
}
else
{

View File

@ -40,7 +40,7 @@ namespace gctl
protected:
array<grav_tetrahedron> grav_ele_;
array<gravtet_para> grav_para_;
array<mag_tetrahedron_ren17> mag_ele_;
array<magtet_ren17> mag_ele_;
array<magtet_para_ren17> mag_para_;
public:

View File

@ -30,7 +30,7 @@
#define GCTL_MAG_TETRA_TOL 1e-16
void gctl::callink_magnetic_para_direct(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para, const array<point3dc> &magz)
void gctl::callink_magnetic_para_direct(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para, const array<point3dc> &magz)
{
point3dc v1, v2, v3, ne, nf;
@ -66,7 +66,7 @@ void gctl::callink_magnetic_para_direct(array<mag_tetrahedron_ren17> &in_tet, ar
return;
}
void gctl::callink_magnetic_para_earth(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para,
void gctl::callink_magnetic_para_earth(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para,
double inclina_deg, double declina_deg, double field_tense)
{
if (declina_deg < -180.0 || declina_deg > 180.0 ||
@ -116,7 +116,7 @@ void gctl::callink_magnetic_para_earth(array<mag_tetrahedron_ren17> &in_tet, arr
return;
}
void gctl::callink_magnetic_para_earth_sph(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para,
void gctl::callink_magnetic_para_earth_sph(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec, double field_tense)
{
if (declina_deg < -180.0 || declina_deg > 180.0 ||
@ -177,7 +177,7 @@ void gctl::callink_magnetic_para_earth_sph(array<mag_tetrahedron_ren17> &in_tet,
return;
}
void gctl::callink_magnetic_para_earth_sph(mag_tetrahedron_ren17 &in_tet, magtet_para_ren17 &out_para,
void gctl::callink_magnetic_para_earth_sph(magtet_ren17 &in_tet, magtet_para_ren17 &out_para,
double inclina_deg, double declina_deg, point3dc *mag_vec, double field_tense)
{
if (declina_deg < -180.0 || declina_deg > 180.0 || inclina_deg < -90 || inclina_deg > 90 || field_tense < 0.0)
@ -232,12 +232,12 @@ void gctl::callink_magnetic_para_earth_sph(mag_tetrahedron_ren17 &in_tet, magtet
}
// declare algorithm for individual element and observation point
double magkernel_tetrahedron_potential_sig(const gctl::mag_tetrahedron_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
gctl::point3dc magkernel_tetrahedron_gradient_sig(const gctl::mag_tetrahedron_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
gctl::tensor magkernel_tetrahedron_tensor_sig(const gctl::mag_tetrahedron_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
double magkernel_tetrahedron_potential_sig(const gctl::magtet_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
gctl::point3dc magkernel_tetrahedron_gradient_sig(const gctl::magtet_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
gctl::tensor magkernel_tetrahedron_tensor_sig(const gctl::magtet_ren17 &ele_ptr, const gctl::point3dc &op_ptr);
// define functions
void gctl::magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren17> &ele,
void gctl::magkernel(matrix<double> &out_kernel, const array<magtet_ren17> &ele,
const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
@ -261,7 +261,7 @@ void gctl::magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren
return;
}
void gctl::magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_ren17> &ele,
void gctl::magkernel(matrix<point3dc> &out_kernel, const array<magtet_ren17> &ele,
const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
@ -287,7 +287,7 @@ void gctl::magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_r
return;
}
void gctl::magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren17> &ele,
void gctl::magkernel(matrix<tensor> &out_kernel, const array<magtet_ren17> &ele,
const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
@ -311,7 +311,7 @@ void gctl::magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren
return;
}
void gctl::magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void gctl::magkernel(matrix<double> &out_kernel, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
double geo_declina, double geo_inclina, verbose_type_e verbose)
{
int i, j;
@ -342,7 +342,7 @@ void gctl::magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren
return;
}
void gctl::magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_ren17> &ele,
void gctl::magkernel(matrix<point3dc> &out_kernel, const array<magtet_ren17> &ele,
const array<point3ds> &obsp, verbose_type_e verbose)
{
int i, j;
@ -391,7 +391,7 @@ void gctl::magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_r
return;
}
void gctl::magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren17> &ele,
void gctl::magkernel(matrix<tensor> &out_kernel, const array<magtet_ren17> &ele,
const array<point3ds> &obsp, verbose_type_e verbose)
{
int i, j;
@ -446,7 +446,7 @@ void gctl::magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren
return;
}
gctl::point3dc gctl::magkernel_single(const mag_tetrahedron_ren17 &ele, const point3ds &obsp)
gctl::point3dc gctl::magkernel_single(const magtet_ren17 &ele, const point3ds &obsp)
{
tensor R;
R[0][0] = sin((0.5-obsp.lat/180.0)*M_PI)*cos((2.0+obsp.lon/180.0)*M_PI);
@ -469,7 +469,7 @@ gctl::point3dc gctl::magkernel_single(const mag_tetrahedron_ren17 &ele, const po
return out_k;
}
void gctl::magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
void gctl::magobser(array<double> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
@ -492,7 +492,7 @@ void gctl::magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &
return;
}
void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
void gctl::magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
@ -517,7 +517,7 @@ void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17>
return;
}
void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
void gctl::magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose)
{
int i, j;
int o_size = obsp.size();
@ -540,7 +540,7 @@ void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &
return;
}
void gctl::magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void gctl::magobser(array<double> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
int i, j;
@ -564,7 +564,7 @@ void gctl::magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &
return;
}
void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void gctl::magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
int i, j;
@ -590,7 +590,7 @@ void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17>
return;
}
void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void gctl::magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
int i, j;
@ -614,7 +614,7 @@ void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &
return;
}
void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void gctl::magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
int i, j;
@ -660,7 +660,7 @@ void gctl::magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17>
return;
}
void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void gctl::magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
int i, j;
@ -712,7 +712,7 @@ void gctl::magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &
return;
}
double magkernel_tetrahedron_potential_sig(const gctl::mag_tetrahedron_ren17 &tet, const gctl::point3dc &site)
double magkernel_tetrahedron_potential_sig(const gctl::magtet_ren17 &tet, const gctl::point3dc &site)
{
double Rij_minus, Rij_plus, Sij_plus, Sij_minus, Rij0, mij0, wi0;
double part1, part2, k0, absw, beta;
@ -767,7 +767,7 @@ double magkernel_tetrahedron_potential_sig(const gctl::mag_tetrahedron_ren17 &te
return out_pot;
}
gctl::point3dc magkernel_tetrahedron_gradient_sig(const gctl::mag_tetrahedron_ren17 &tet, const gctl::point3dc &site)
gctl::point3dc magkernel_tetrahedron_gradient_sig(const gctl::magtet_ren17 &tet, const gctl::point3dc &site)
{
double Rij_minus, Rij_plus, Sij_plus, Sij_minus, Rij0, mij0, wi0;
double beta, Aij, sig, absw;
@ -835,7 +835,7 @@ gctl::point3dc magkernel_tetrahedron_gradient_sig(const gctl::mag_tetrahedron_re
return out_grad;
}
gctl::tensor magkernel_tetrahedron_tensor_sig(const gctl::mag_tetrahedron_ren17 &tet, const gctl::point3dc &site)
gctl::tensor magkernel_tetrahedron_tensor_sig(const gctl::magtet_ren17 &tet, const gctl::point3dc &site)
{
double Rij_minus, Rij_plus, Sij_plus, Sij_minus, Rij0, mij0, wi0;
double beta, sig, absw;

View File

@ -40,7 +40,7 @@ namespace gctl
point3dc te[12]; // 四面体边切线矢量
};
typedef type_tetrahedron<magtet_para_ren17> mag_tetrahedron_ren17; ///< 带magtet_para_ren17属性的四面体结构体
typedef type_tetrahedron<magtet_para_ren17> magtet_ren17; ///< 带magtet_para_ren17属性的四面体结构体
/**
* @brief Calculate the magnetic parameters of given tetrahedral elements.
@ -52,7 +52,7 @@ namespace gctl
* @param out_para Output parameters
* @param magz Magnetic magnetizations
*/
void callink_magnetic_para_direct(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para, const array<point3dc> &magz);
void callink_magnetic_para_direct(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para, const array<point3dc> &magz);
/**
* @brief Calculate the magnetic parameters of given tetrahedral elements.
@ -66,7 +66,7 @@ namespace gctl
* @param declina_deg declination angle
* @param field_tense Tense of the magnetic field
*/
void callink_magnetic_para_earth(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para,
void callink_magnetic_para_earth(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para,
double inclina_deg, double declina_deg, double field_tense = GCTL_T0);
/**
@ -82,7 +82,7 @@ namespace gctl
* @param mag_vec Output magnetization vectors (This is useful for data visualization)
* @param field_tense Tense of the Earth's magnetic field
*/
void callink_magnetic_para_earth_sph(array<mag_tetrahedron_ren17> &in_tet, array<magtet_para_ren17> &out_para,
void callink_magnetic_para_earth_sph(array<magtet_ren17> &in_tet, array<magtet_para_ren17> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec = nullptr, double field_tense = GCTL_T0);
/**
@ -98,52 +98,52 @@ namespace gctl
* @param mag_vec Output magnetization vectors (This is useful for data visualization)
* @param field_tense Tense of the Earth's magnetic field
*/
void callink_magnetic_para_earth_sph(mag_tetrahedron_ren17 &in_tet, magtet_para_ren17 &out_para,
void callink_magnetic_para_earth_sph(magtet_ren17 &in_tet, magtet_para_ren17 &out_para,
double inclina_deg, double declina_deg, point3dc *mag_vec = nullptr, double field_tense = GCTL_T0);
/**
* @brief Calculate the kernel matrix of the magnetic poential data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magkernel(matrix<double> &out_kernel, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the kernel matrix of the magnetic conponents data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix. Directional components are stored accordingly.
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magkernel(matrix<point3dc> &out_kernel, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the kernel matrix of the magnetic tensor data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix. Directional components are stored accordingly.
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magkernel(matrix<tensor> &out_kernel, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the kernel matrix of the deltaT anomaly data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix
* @param ele Magnetic tetrahedrons.
@ -152,33 +152,33 @@ namespace gctl
* @param geo_inclina Inclination angle of the geo-magnetic field.
* @param verbose Output info level
*/
void magkernel(matrix<double> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magkernel(matrix<double> &out_kernel, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
double geo_declina, double geo_inclina, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the kernel matrix of the magnetic conponents data.
*
* @note Use callink_magnetic_para_earth_sph() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth_sph() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix. Directional components are stored accordingly.
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magkernel(matrix<point3dc> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void magkernel(matrix<point3dc> &out_kernel, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the kernel matrix of the magnetic tensor data.
*
* @note Use callink_magnetic_para_earth_sph() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth_sph() to initialize the magtet_ren17 elements.
*
* @param out_kernel Output kernel matrix. Directional components are stored accordingly.
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magkernel(matrix<tensor> &out_kernel, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void magkernel(matrix<tensor> &out_kernel, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
verbose_type_e verbose = FullMsg);
/**
@ -188,48 +188,48 @@ namespace gctl
* @param obsp The observation point
* @return point3dc The returned magnetic componments
*/
point3dc magkernel_single(const mag_tetrahedron_ren17 &ele, const point3ds &obsp);
point3dc magkernel_single(const magtet_ren17 &ele, const point3ds &obsp);
/**
* @brief Calculate magnetic potential data.
*
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the mag_tetrahedron_ren17 elements.
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
void magobser(array<double> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic component data.
*
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the mag_tetrahedron_ren17 elements.
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional components are stored accordingly. Delta_T anomalies could be retrived using the function magnetic_components2deltaT().
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
void magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic tensor data.
*
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the mag_tetrahedron_ren17 elements.
* @note The magnetic susceptibility is impliclity setted using the magnetic magnetization values. Use callink_magnetic_para_direct() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional components are stored accordingly. Delta_T gradient anomalies could be retrived using the function magnetic_tensors2deltaTs().
* @param ele Magnetic tetrahedrons.
* @param obsp Observation sites
* @param verbose Output info level
*/
void magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
void magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic potential data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data
* @param ele Magnetic tetrahedrons.
@ -237,13 +237,13 @@ namespace gctl
* @param sus Magnetic susceptibilities
* @param verbose Output info level
*/
void magobser(array<double> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magobser(array<double> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic component data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional components are stored accordingly. Delta_T anomalies could be retrived using the function magnetic_components2deltaT().
* @param ele Magnetic tetrahedrons.
@ -251,13 +251,13 @@ namespace gctl
* @param sus Magnetic susceptibilities
* @param verbose Output info level
*/
void magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic tensor data.
*
* @note Use callink_magnetic_para_earth() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional tensors are stored accordingly. Delta_T gradient anomalies could be retrived using the function magnetic_tensors2deltaTs().
* @param ele Magnetic tetrahedrons.
@ -265,13 +265,13 @@ namespace gctl
* @param sus Magnetic susceptibilities
* @param verbose Output info level
*/
void magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3dc> &obsp,
void magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3dc> &obsp,
const array<double> &sus, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic component data.
*
* @note Use callink_magnetic_para_earth_sph() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth_sph() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional components are stored accordingly. Delta_T anomalies could be retrived using the function magnetic_components2deltaT().
* @param ele Magnetic tetrahedrons.
@ -279,13 +279,13 @@ namespace gctl
* @param sus Magnetic susceptibilities
* @param verbose Output info level
*/
void magobser(array<point3dc> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void magobser(array<point3dc> &out_obs, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate magnetic tensor data.
*
* @note Use callink_magnetic_para_earth_sph() to initialize the mag_tetrahedron_ren17 elements.
* @note Use callink_magnetic_para_earth_sph() to initialize the magtet_ren17 elements.
*
* @param out_obs Output magnetic field data. Directional tensors are stored accordingly. Delta_T gradient anomalies could be retrived using the function magnetic_tensors2deltaTs().
* @param ele Magnetic tetrahedrons.
@ -293,7 +293,7 @@ namespace gctl
* @param sus Magnetic susceptibilities
* @param verbose Output info level
*/
void magobser(array<tensor> &out_obs, const array<mag_tetrahedron_ren17> &ele, const array<point3ds> &obsp,
void magobser(array<tensor> &out_obs, const array<magtet_ren17> &ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose = FullMsg);
}
#endif // _GCTL_MAG_KERNEL_TETRAHEDRON_REN2017_H

View File

@ -27,7 +27,7 @@
#include "mkernel_tricone.h"
void gctl::callink_magnetic_para(array<mag_tricone> &in_cone, array<magcone_para> &out_para, const array<point3dc> &mag_B)
void gctl::callink_magnetic_para(array<magcone> &in_cone, array<magcone_para> &out_para, const array<point3dc> &mag_B)
{
point3dc v1, v2, v3, ne, nf, mag_z;
@ -63,7 +63,7 @@ void gctl::callink_magnetic_para(array<mag_tricone> &in_cone, array<magcone_para
return;
}
void gctl::callink_magnetic_para_earth_sph(array<mag_tricone> &in_tet, array<magcone_para> &out_para,
void gctl::callink_magnetic_para_earth_sph(array<magcone> &in_tet, array<magcone_para> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec, double field_tense)
{
if (declina_deg < -180.0 || declina_deg > 180.0 ||
@ -122,7 +122,7 @@ void gctl::callink_magnetic_para_earth_sph(array<mag_tricone> &in_tet, array<mag
return;
}
gctl::point3dc gctl::magkernel_single(const mag_tricone &a_ele, const point3ds &a_op, tensor *R_ptr)
gctl::point3dc gctl::magkernel_single(const magcone &a_ele, const point3ds &a_op, tensor *R_ptr)
{
int f,e;
double Le,wf;
@ -175,8 +175,8 @@ gctl::point3dc gctl::magkernel_single(const mag_tricone &a_ele, const point3ds &
return out_c;
}
void gctl::magkernel(matrix<double> &kernel, const array<mag_tricone> &top_ele,
const array<mag_tricone> &btm_ele, const array<point3ds> &obsp,
void gctl::magkernel(matrix<double> &kernel, const array<magcone> &top_ele,
const array<magcone> &btm_ele, const array<point3ds> &obsp,
magnetic_field_type_e comp_type, verbose_type_e verbose)
{
if (comp_type != Bx && comp_type != By && comp_type != Bz)
@ -237,7 +237,7 @@ void gctl::magkernel(matrix<double> &kernel, const array<mag_tricone> &top_ele,
return;
}
void gctl::magkernel(spmat<double> &kernel, const array<mag_tricone> &top_ele, const array<mag_tricone> &btm_ele,
void gctl::magkernel(spmat<double> &kernel, const array<magcone> &top_ele, const array<magcone> &btm_ele,
const array<point3ds> &obsp, double cut_angle, magnetic_field_type_e comp_type, verbose_type_e verbose)
{
if (comp_type != Bx && comp_type != By && comp_type != Bz)
@ -333,8 +333,8 @@ void gctl::magkernel(spmat<double> &kernel, const array<mag_tricone> &top_ele, c
return;
}
void gctl::magobser(array<point3dc> &out_obs, const array<mag_tricone> &top_ele,
const array<mag_tricone> &btm_ele, const array<point3ds> &obsp, const array<double> &sus,
void gctl::magobser(array<point3dc> &out_obs, const array<magcone> &top_ele,
const array<magcone> &btm_ele, const array<point3ds> &obsp, const array<double> &sus,
verbose_type_e verbose)
{
if (top_ele.size() != btm_ele.size())

View File

@ -40,7 +40,7 @@ namespace gctl
double edglen[12]; ///< edge lengths of six edges
};
typedef type_tricone<magcone_para> mag_tricone; ///< 带magcone_para属性的三角锥结构体
typedef type_tricone<magcone_para> magcone; ///< 带magcone_para属性的三角锥结构体
/**
* @brief Calculate the magnetic parameters of given tricone elements.
@ -49,7 +49,7 @@ namespace gctl
* @param out_para Output parameters
* @param mag_B magnetization vecrtors
*/
void callink_magnetic_para(array<mag_tricone> &in_cone, array<magcone_para> &out_para, const array<point3dc> &mag_B);
void callink_magnetic_para(array<magcone> &in_cone, array<magcone_para> &out_para, const array<point3dc> &mag_B);
/**
* @brief Calculate the magnetic parameters of given tricone elements wrt. the spherical coordinates.
@ -64,18 +64,18 @@ namespace gctl
* @param mag_vec Output magnetization vectors (This is useful for data visualization)
* @param field_tense Tense of the Earth's magnetic field
*/
void callink_magnetic_para_earth_sph(array<mag_tricone> &in_tet, array<magcone_para> &out_para,
void callink_magnetic_para_earth_sph(array<magcone> &in_tet, array<magcone_para> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec = nullptr, double field_tense = GCTL_T0);
point3dc magkernel_single(const mag_tricone &a_ele, const point3ds &a_op, tensor *R_ptr = nullptr);
point3dc magkernel_single(const magcone &a_ele, const point3ds &a_op, tensor *R_ptr = nullptr);
void magkernel(matrix<double> &kernel, const array<mag_tricone> &top_ele, const array<mag_tricone> &btm_ele,
void magkernel(matrix<double> &kernel, const array<magcone> &top_ele, const array<magcone> &btm_ele,
const array<point3ds> &obsp, magnetic_field_type_e comp_type = Bz, verbose_type_e verbose = FullMsg);
void magkernel(spmat<double> &kernel, const array<mag_tricone> &top_ele, const array<mag_tricone> &btm_ele,
void magkernel(spmat<double> &kernel, const array<magcone> &top_ele, const array<magcone> &btm_ele,
const array<point3ds> &obsp, double cut_angle, magnetic_field_type_e comp_type = Bz, verbose_type_e verbose = FullMsg);
void magobser(array<point3dc> &out_obs, const array<mag_tricone> &top_ele, const array<mag_tricone> &btm_ele,
void magobser(array<point3dc> &out_obs, const array<magcone> &top_ele, const array<magcone> &btm_ele,
const array<point3ds> &obsp, const array<double> &sus, verbose_type_e verbose = FullMsg);
}

View File

@ -0,0 +1,589 @@
/********************************************************
*
*
*
*
*
*
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#include "mkernel_tricone_Ren2017.h"
#include "cmath"
double mag_tolerance = 1e-16;
void gctl::set_magcone_ren17_tolerance(double tol)
{
if (tol > 0) mag_tolerance = tol;
else throw invalid_argument("Invalid tolerance value. From gctl::set_magcone_ren17_tolerance(...)");
return;
}
void gctl::callink_magnetic_para(array<magcone_ren17> &in_cone, array<magcone_para_ren17> &out_para, const array<point3dc> &mag_B)
{
point3dc v1, v2, v3, ne, nf;
out_para.resize(in_cone.size());
for (int i = 0; i < in_cone.size(); ++i)
{
if (in_cone[i].vert[0] == nullptr || in_cone[i].vert[1] == nullptr ||
in_cone[i].vert[2] == nullptr || in_cone[i].vert[3] == nullptr)
{
throw runtime_error("Invalid vertex pointer. From callink_magnetic_para(...)");
}
for (int f = 0; f < 4; ++f)
{
v1 = *in_cone[i].fget(f, 1) - *in_cone[i].fget(f, 0);
v2 = *in_cone[i].fget(f, 2) - *in_cone[i].fget(f, 0);
nf = cross(v1, v2).normal();
out_para[i].nf[f] = nf;
for (int e = 0; e < 3; ++e)
{
v3 = *in_cone[i].fget(f, (e+1)%3) - *in_cone[i].fget(f, e);
ne = cross(v3, nf).normal();
out_para[i].ne[e+f*3] = ne;
out_para[i].te[e+f*3] = cross(nf, ne).normal();
}
out_para[i].mag_amp[f] = dot(mag_B[i], nf);
}
in_cone[i].att = out_para.get(i);
}
return;
}
void gctl::callink_magnetic_para_earth_sph(array<magcone_ren17> &in_cone, array<magcone_para_ren17> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec, double field_tense)
{
if (declina_deg < -180.0 || declina_deg > 180.0 ||
inclina_deg < -90 || inclina_deg > 90 || field_tense < 0.0)
{
throw invalid_argument("Invalid parameters. From gctl::callink_magnetic_para_earth_sph(...)");
}
point3dc v1, v2, v3, ne, nf, mag_z, c;
point3ds s;
double I = inclina_deg*M_PI/180.0;
double A = declina_deg*M_PI/180.0;
if (mag_vec != nullptr) mag_vec->resize(in_cone.size());
out_para.resize(in_cone.size());
for (int i = 0; i < in_cone.size(); ++i)
{
if (in_cone[i].vert[0] == nullptr || in_cone[i].vert[1] == nullptr ||
in_cone[i].vert[2] == nullptr || in_cone[i].vert[3] == nullptr)
{
throw runtime_error("Invalid vertex pointer. From callink_magnetic_para_earth_sph(...)");
}
// magnetization vector at the local coordinates
// note here the postive direction of the inclination angle is downward
// note here the postive direction of the declination angle is clockwise
mag_z.x = cos(I)*sin(A);
mag_z.y = cos(I)*cos(A);
mag_z.z = -1.0*sin(I);
c = 1.0/3.0*(*in_cone[i].vert[0] + *in_cone[i].vert[1] + *in_cone[i].vert[2]);
s = c.c2s();
// magnetic susceptibility is taken as one here
// rotate the local coordinate system to the regular status
mag_z = field_tense * mag_z.rotate((90.0 - s.lat)*M_PI/180.0, 0.0, (90.0 + s.lon)*M_PI/180.0).normal();
if (mag_vec != nullptr) mag_vec->at(i) = mag_z;
for (int f = 0; f < 4; ++f)
{
v1 = *in_cone[i].fget(f, 1) - *in_cone[i].fget(f, 0);
v2 = *in_cone[i].fget(f, 2) - *in_cone[i].fget(f, 0);
nf = cross(v1, v2).normal();
out_para[i].nf[f] = nf;
for (int e = 0; e < 3; ++e)
{
v3 = *in_cone[i].fget(f, (e+1)%3) - *in_cone[i].fget(f, e);
ne = cross(v3, nf).normal();
out_para[i].ne[e+f*3] = ne;
out_para[i].te[e+f*3] = cross(nf, ne).normal();
}
out_para[i].mag_amp[f] = dot(mag_z, nf);
}
in_cone[i].att = out_para.get(i);
}
return;
}
gctl::point3dc gctl::magkernel_single(const magcone_ren17 &a_ele, const point3ds &a_op, tensor *R_ptr)
{
double Rij_minus, Rij_plus, Sij_plus, Sij_minus, Rij0, mij0, wi0;
double beta, Aij, sig, absw;
gctl::point3dc oi, k1, part1, part2;
// get attribute pointer
if (a_ele.att == nullptr) throw gctl::runtime_error("[gctl_potential::magcone_ren17] Magnetization parameter not set.");
gctl::magcone_para_ren17 *mpara = a_ele.att;
gctl::tensor R;
if (R_ptr != nullptr) R = *R_ptr;
else R = transform_matrix(a_op);
// get the observation site in the local coordinates
gctl::point3dc site = a_op.s2c();
gctl::point3dc out_grad(0.0, 0.0, 0.0);
for (int f = 0; f < 4; ++f)
{
k1.set(0.0, 0.0, 0.0);
for (int j = 0; j < 3; ++j)
{
Rij_minus = (site - *a_ele.fget(f, j)).module();
Rij_plus = (site - *a_ele.fget(f, (j+1)%3)).module();
if (j == 0)
{
wi0 = gctl::dot(site - *a_ele.fget(f, j), mpara->nf[f]);
sig = gctl::sign(wi0);
absw = std::abs(wi0);
}
oi = site - wi0*mpara->nf[f];
Sij_minus = gctl::dot(*a_ele.fget(f, j) - oi, mpara->te[3*f+j]);
Sij_plus = gctl::dot(*a_ele.fget(f, (j+1)%3) - oi, mpara->te[3*f+j]);
mij0 = gctl::dot(*a_ele.fget(f, j) - oi, mpara->ne[3*f+j]);
Rij0 = std::sqrt(wi0*wi0 + mij0*mij0);
part2.set(0.0, 0.0, 0.0);
if (absw > mag_tolerance)
{
beta = atan((mij0*Sij_plus)/(Rij0*Rij0 + absw*Rij_plus))
- atan((mij0*Sij_minus)/(Rij0*Rij0 + absw*Rij_minus));
part2 = sig*beta*mpara->nf[f];
}
if (std::abs(Rij0) > mag_tolerance)
{
Aij = std::log((long double)(Rij_plus+Sij_plus)) - std::log((long double)(Rij_minus+Sij_minus));
}
else if (Sij_plus > 0.0 && Sij_minus > 0.0)
{
Aij = std::log(Sij_plus) - std::log(Sij_minus);
}
else if (Sij_plus < 0.0 && Sij_minus < 0.0)
{
Aij = std::log(-1.0*Sij_minus) - std::log(-1.0*Sij_plus);
}
else
{
throw gctl::runtime_error("[gctl_potential::magcone_ren17] Observation site on edge.");
}
part1 = Aij * mpara->ne[3*f+j];
k1 = k1 - (part1 + part2);
}
// nT -> T 1e-9 / 4*pi*e-7 = 1/(400*pi)*100 = 1/(4*pi) -> A/m
out_grad = out_grad - 1.0/(4.0*GCTL_Pi)*k1*mpara->mag_amp[f];
}
out_grad = R*out_grad;
out_grad.x *= -1.0;
out_grad.y *= -1.0;
return out_grad;
}
gctl::tensor gctl::magkernel_single_tensor(const magcone_ren17 &a_ele, const point3ds &a_op, tensor *R_ptr)
{
double Rij_minus, Rij_plus, Sij_plus, Sij_minus, Rij0, mij0, wi0;
double beta, sig, absw;
double factor_n_mij, factor_tij;
gctl::point3dc oi, grad_Aij;
gctl::point3dc grad_Rij_plus, grad_Rij_minus, grad_Sij_plus, grad_Sij_minus;
gctl::point3dc grad_mij0, grad_Rij0, grad_abs_wi0;
gctl::point3dc grad_a_plus, grad_b_plus, grad_a_minus, grad_b_minus;
gctl::point3dc grad_betaij_plus, grad_betaij_minus, grad_betaij;
double a_plus, b_plus, a_minus, b_minus;
double k3;
gctl::tensor tmp_k, k2;
// get attribute pointer
if (a_ele.att == nullptr) throw gctl::runtime_error("[gctl_potential::magcone_ren17] Magnetization parameter not set.");
gctl::magcone_para_ren17 *mpara = a_ele.att;
gctl::tensor R, R_T;
if (R_ptr != nullptr) R = *R_ptr;
else R = transform_matrix(a_op);
R_T = R.transpose();
// get the observation site in the local coordinates
gctl::point3dc site = a_op.s2c();
gctl::tensor out_tensor(0.0);
for (int f = 0; f < 4; ++f)
{
k2.set(0.0);
k3 = 0.0;
for (int j = 0; j < 3; ++j)
{
Rij_minus = (site - *a_ele.fget(f, j)).module();
Rij_plus = (site - *a_ele.fget(f, (j+1)%3)).module();
if (j == 0)
{
wi0 = gctl::dot(site - *a_ele.fget(f, j), mpara->nf[f]);
sig = gctl::sign(wi0);
absw = std::abs(wi0);
}
oi = site - wi0*mpara->nf[f];
Sij_minus = gctl::dot(*a_ele.fget(f, j) - oi, mpara->te[3*f+j]);
Sij_plus = gctl::dot(*a_ele.fget(f, (j+1)%3) - oi, mpara->te[3*f+j]);
mij0 = gctl::dot(*a_ele.fget(f, j) - oi, mpara->ne[3*f+j]);
Rij0 = std::sqrt(wi0*wi0 + mij0*mij0);
if (std::abs(Rij0) > mag_tolerance)
{
factor_n_mij = -1.0*(Sij_plus/(Rij0*Rij0*Rij_plus) - Sij_minus/(Rij0*Rij0*Rij_minus));
factor_tij = -1.0/Rij_plus + 1.0/Rij_minus;
grad_Aij = (wi0*factor_n_mij)*mpara->nf[f] + factor_tij*mpara->te[3*f+j]
- (mij0*factor_n_mij)*mpara->ne[3*f+j];
}
else
{
factor_tij = -1.0/Rij_plus + 1.0/Rij_minus;
grad_Aij = factor_tij*mpara->te[3*f+j];
}
//tmp_k = gctl::kron(grad_Aij, ne_[e][3*f+j]);
tmp_k = gctl::kron(mpara->ne[3*f+j], grad_Aij);
k2 = k2 - tmp_k;
if (absw > mag_tolerance)
{
grad_Rij_plus = (1.0/Rij_plus)*(site - *a_ele.fget(f, (j+1)%3));
grad_Rij_minus = (1.0/Rij_minus)*(site - *a_ele.fget(f, j));
grad_Sij_plus = -1.0*mpara->te[3*f+j];
grad_Sij_minus = -1.0*mpara->te[3*f+j];
grad_mij0 = -1.0*mpara->ne[3*f+j];
grad_Rij0 = (1.0/Rij0)*(wi0*mpara->nf[f] - mij0*mpara->ne[3*f+j]);
grad_abs_wi0 = sig*mpara->nf[f];
a_plus = Rij0*Rij0 + absw*Rij_plus;
b_plus = mij0*Sij_plus;
grad_a_plus = (2.0*Rij0)*grad_Rij0 + Rij_plus*grad_abs_wi0 + absw*grad_Rij_plus;
grad_b_plus = Sij_plus*grad_mij0 + mij0*grad_Sij_plus;
a_minus = Rij0*Rij0 + absw*Rij_minus;
b_minus = mij0*Sij_minus;
grad_a_minus = (2.0*Rij0)*grad_Rij0 + Rij_minus*grad_abs_wi0 + absw*grad_Rij_minus;
grad_b_minus = Sij_minus*grad_mij0 + mij0*grad_Sij_minus;
grad_betaij_plus = (1.0/(a_plus*a_plus + b_plus*b_plus))*(a_plus*grad_b_plus - b_plus*grad_a_plus);
grad_betaij_minus = (1.0/(a_minus*a_minus + b_minus*b_minus))*(a_minus*grad_b_minus - b_minus*grad_a_minus);
grad_betaij = grad_betaij_plus - grad_betaij_minus;
tmp_k = gctl::kron(grad_betaij, mpara->nf[f]);
k2 = k2 - sig*tmp_k;
}
else
{
if (std::abs(mij0) > mag_tolerance)
{
k3 += (-1.0/mij0)*(Sij_plus/Rij_plus - Sij_minus/Rij_minus);
}
}
}
if (k3 != 0.0)
{
tmp_k = gctl::kron(mpara->nf[f], mpara->nf[f]);
k2 = k2 - k3*tmp_k;
}
// nT -> T 1e-9 / 4*pi*e-7 = 1/(400*pi)*100 = 1/(4*pi) -> A/m
out_tensor = out_tensor - 1.0/(4.0*GCTL_Pi)*k2*mpara->mag_amp[f];
}
out_tensor = R*out_tensor*R_T;
out_tensor[0][0] *= -1.0;
out_tensor[0][1] *= -1.0;
out_tensor[0][2] *= -1.0;
out_tensor[1][0] *= -1.0;
out_tensor[2][0] *= -1.0;
return out_tensor;
}
void gctl::magkernel(matrix<double> &kernel, const array<magcone_ren17> &top_ele,
const array<magcone_ren17> &btm_ele, const array<point3ds> &obsp,
magnetic_field_type_e comp_type, verbose_type_e verbose)
{
if (comp_type != Bx && comp_type != By && comp_type != Bz)
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Invalid magnetic componment type. Must be Bx, By or Bz.");
return;
}
if (top_ele.size() != btm_ele.size())
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Elements' size don't equal.");
return;
}
int i, j;
int o_size = obsp.size();
int e_size = top_ele.size();
kernel.resize(o_size, e_size);
array<tensor> Rs(o_size);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
Rs[i] = transform_matrix(obsp[i]);
}
point3dc mag_b;
gctl::progress_bar bar(o_size*2, "magkernel_componments");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
#pragma omp parallel for private (j, mag_b) shared(i) schedule(guided)
for (j = 0; j < e_size; j++)
{
mag_b = magkernel_single(top_ele[j], obsp[i], Rs.get(i));
if (comp_type == Bx) kernel[i][j] = mag_b.y;
if (comp_type == By) kernel[i][j] = mag_b.z;
if (comp_type == Bz) kernel[i][j] = mag_b.x;
}
}
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i + o_size);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i + o_size);
#pragma omp parallel for private (j, mag_b) shared(i) schedule(guided)
for (j = 0; j < e_size; j++)
{
mag_b = magkernel_single(btm_ele[j], obsp[i], Rs.get(i));
if (comp_type == Bx) kernel[i][j] -= mag_b.y;
if (comp_type == By) kernel[i][j] -= mag_b.z;
if (comp_type == Bz) kernel[i][j] -= mag_b.x;
}
}
return;
}
void gctl::magkernel(spmat<double> &kernel, const array<magcone_ren17> &top_ele,
const array<magcone_ren17> &btm_ele, const array<point3ds> &obsp,
double cut_angle, magnetic_field_type_e comp_type, verbose_type_e verbose)
{
if (comp_type != Bx && comp_type != By && comp_type != Bz)
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Invalid magnetic componment type. Must be Bx, By or Bz.");
return;
}
if (top_ele.size() != btm_ele.size())
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Elements' size don't equal.");
return;
}
int i, j;
int o_size = obsp.size();
int e_size = top_ele.size();
array<tensor> Rs(o_size);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
Rs[i] = transform_matrix(obsp[i]);
}
point3dc cen, mag_b;
mat_node<double> tmp_plt;
std::map<int, int> tri_idx;
std::vector<mat_node<double>> triplts;
gctl::progress_bar bar2(o_size, "initializing triplts");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar2.progressed(i);
else if (verbose == gctl::ShortMsg) bar2.progressed_simple(i);
for (j = 0; j < e_size; j++)
{
cen = 1.0/3.0*(*top_ele[j].vert[0] + *top_ele[j].vert[1] + *top_ele[j].vert[2]);
if (geometry3d::angle(obsp[i].s2c(), cen) < cut_angle*GCTL_Pi/180.0)
{
tmp_plt.r_id = i;
tmp_plt.c_id = j;
tmp_plt.val = 1.0;
tri_idx[j + i*e_size] = triplts.size();
triplts.push_back(tmp_plt);
}
}
}
gctl::progress_bar bar(o_size*2, "magkernel_componments");
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i);
#pragma omp parallel for private (j, mag_b, cen) shared(i, cut_angle) schedule(guided)
for (j = 0; j < e_size; j++)
{
cen = 1.0/3.0*(*top_ele[j].vert[0] + *top_ele[j].vert[1] + *top_ele[j].vert[2]);
if (geometry3d::angle(obsp[i].s2c(), cen) < cut_angle*GCTL_Pi/180.0)
{
mag_b = magkernel_single(top_ele[j], obsp[i], Rs.get(i));
if (comp_type == Bx) triplts[tri_idx[j + i*e_size]].val = mag_b.y;
if (comp_type == By) triplts[tri_idx[j + i*e_size]].val = mag_b.z;
if (comp_type == Bz) triplts[tri_idx[j + i*e_size]].val = mag_b.x;
}
}
}
for (i = 0; i < o_size; i++)
{
if (verbose == gctl::FullMsg) bar.progressed(i + o_size);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(i + o_size);
#pragma omp parallel for private (j, mag_b, cen) shared(i, cut_angle) schedule(guided)
for (j = 0; j < e_size; j++)
{
cen = 1.0/3.0*(*btm_ele[j].vert[0] + *btm_ele[j].vert[1] + *btm_ele[j].vert[2]);
if (geometry3d::angle(obsp[i].s2c(), cen) < cut_angle*GCTL_Pi/180.0)
{
mag_b = magkernel_single(btm_ele[j], obsp[i], Rs.get(i));
if (comp_type == Bx) triplts[tri_idx[j + i*e_size]].val -= mag_b.y;
if (comp_type == By) triplts[tri_idx[j + i*e_size]].val -= mag_b.z;
if (comp_type == Bz) triplts[tri_idx[j + i*e_size]].val -= mag_b.x;
}
}
}
kernel.malloc(o_size, e_size, 0.0);
kernel.set_triplts(triplts);
return;
}
void gctl::magobser(array<point3dc> &out_obs, const array<magcone_ren17> &top_ele,
const array<magcone_ren17> &btm_ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
if (top_ele.size() != btm_ele.size())
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Elements' size don't equal.");
return;
}
int i, j;
int o_size = obsp.size();
int e_size = top_ele.size();
out_obs.resize(o_size, point3dc(0.0, 0.0, 0.0));
array<tensor> Rs(o_size);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
Rs[i] = transform_matrix(obsp[i]);
}
gctl::progress_bar bar(e_size*2, "magobser_componments");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i) shared (j) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] = out_obs[i] + sus[j] * magkernel_single(top_ele[j], obsp[i], Rs.get(i));
}
}
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j + e_size);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j + e_size);
#pragma omp parallel for private (i) shared (j) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] = out_obs[i] - sus[j] * magkernel_single(btm_ele[j], obsp[i], Rs.get(i));
}
}
return;
}
void gctl::magobser(array<tensor> &out_obs, const array<magcone_ren17> &top_ele,
const array<magcone_ren17> &btm_ele, const array<point3ds> &obsp,
const array<double> &sus, verbose_type_e verbose)
{
if (top_ele.size() != btm_ele.size())
{
throw std::runtime_error("[gctl_potential::magcone_ren17] Elements' size don't equal.");
return;
}
int i, j;
int o_size = obsp.size();
int e_size = top_ele.size();
out_obs.resize(o_size, tensor(0.0));
array<tensor> Rs(o_size);
#pragma omp parallel for private (i) schedule(guided)
for (i = 0; i < o_size; i++)
{
Rs[i] = transform_matrix(obsp[i]);
}
gctl::progress_bar bar(e_size*2, "magobser_componments");
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j);
#pragma omp parallel for private (i) shared (j) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] = out_obs[i] + sus[j] * magkernel_single_tensor(top_ele[j], obsp[i], Rs.get(i));
}
}
for (j = 0; j < e_size; j++)
{
if (verbose == gctl::FullMsg) bar.progressed(j + e_size);
else if (verbose == gctl::ShortMsg) bar.progressed_simple(j + e_size);
#pragma omp parallel for private (i) shared (j) schedule(guided)
for (i = 0; i < o_size; i++)
{
out_obs[i] = out_obs[i] - sus[j] * magkernel_single_tensor(btm_ele[j], obsp[i], Rs.get(i));
}
}
return;
}

View File

@ -0,0 +1,142 @@
/********************************************************
*
*
*
*
*
*
* Geophysical Computational Tools & Library (GCTL)
*
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
*
* GCTL is distributed under a dual licensing scheme. You can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation, either version 2
* of the License, or (at your option) any later version. You should have
* received a copy of the GNU Lesser General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*
* If the terms and conditions of the LGPL v.2. would prevent you from using
* the GCTL, please consider the option to obtain a commercial license for a
* fee. These licenses are offered by the GCTL's original author. As a rule,
* licenses are provided "as-is", unlimited in time for a one time fee. Please
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
* to include some description of your company and the realm of its activities.
* Also add information on how to contact you by electronic and paper mail.
******************************************************/
#ifndef _GCTL_MAG_KERNEL_TRICONE_REN2017_H
#define _GCTL_MAG_KERNEL_TRICONE_REN2017_H
#include "gm_data.h"
namespace gctl
{
struct magcone_para_ren17
{
double mag_amp[4]; // 四面体四个面的磁化强度
point3dc nf[4]; // 四面体面外法线矢量
point3dc ne[12]; // 四面体边外法线矢量
point3dc te[12]; // 四面体边切线矢量
};
typedef type_tricone<magcone_para_ren17> magcone_ren17; ///< 带magcone_para_ren17属性的三角锥结构体
/**
* @brief Set the tolerance for calculating the magnetic parameters of tricone elements.
*
* @param tol Tolerance
*/
void set_magcone_ren17_tolerance(double tol);
/**
* @brief Calculate the magnetic parameters of given tricone elements.
*
* @param in_tet Input and output elements
* @param out_para Output parameters
* @param mag_B magnetization vecrtors
*/
void callink_magnetic_para(array<magcone_ren17> &in_cone, array<magcone_para_ren17> &out_para, const array<point3dc> &mag_B);
/**
* @brief Calculate the magnetic parameters of given tricone elements wrt. the spherical coordinates.
*
* @note The value of magnetic susceptibility is taken as one here. This is usefull for calculating
* kernel matrix of the magnetic anomalies.
*
* @param in_tet Input elements
* @param out_para Output parameters
* @param inclina_deg inclination angle of the magnetization vector wrt. the local Cartesian coordinates at every tricone elements
* @param declina_deg declination angle of the magnetization vector wrt. the local Cartesian coordinates at every tricone elements
* @param mag_vec Output magnetization vectors (This is useful for data visualization)
* @param field_tense Tense of the Earth's magnetic field
*/
void callink_magnetic_para_earth_sph(array<magcone_ren17> &in_tet, array<magcone_para_ren17> &out_para,
double inclina_deg, double declina_deg, array<point3dc> *mag_vec = nullptr, double field_tense = GCTL_T0);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
point3dc magkernel_single(const magcone_ren17 &a_ele, const point3ds &a_op, tensor *R_ptr = nullptr);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
tensor magkernel_single_tensor(const magcone_ren17 &a_ele, const point3ds &a_op, tensor *R_ptr = nullptr);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
void magkernel(matrix<double> &kernel, const array<magcone_ren17> &top_ele, const array<magcone_ren17> &btm_ele,
const array<point3ds> &obsp, magnetic_field_type_e comp_type = Bz, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
void magkernel(spmat<double> &kernel, const array<magcone_ren17> &top_ele, const array<magcone_ren17> &btm_ele,
const array<point3ds> &obsp, double cut_angle, magnetic_field_type_e comp_type = Bz, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
void magobser(array<point3dc> &out_obs, const array<magcone_ren17> &top_ele, const array<magcone_ren17> &btm_ele,
const array<point3ds> &obsp, const array<double> &sus, verbose_type_e verbose = FullMsg);
/**
* @brief Calculate the magnetic field vector at a given observation point.
*
* @param a_ele Input element
* @param a_op Input observation point
* @param R_ptr Output rotation matrix
* @return point3dc Magnetic field vector
*/
void magobser(array<tensor> &out_obs, const array<magcone_ren17> &top_ele, const array<magcone_ren17> &btm_ele,
const array<point3ds> &obsp, const array<double> &sus, verbose_type_e verbose = FullMsg);
}
#endif // _GCTL_MAG_KERNEL_TRICONE_REN2017_H

View File

@ -372,8 +372,7 @@ void save_gmsh(const std::vector<std::string> &cmd_units)
// save gmsh <file>
if (cmd_units.size() < 3) throw std::runtime_error("save: insufficient parameters.");
rg.save_gmsh(cmd_units[2], NodeData, OverWrite, NotPacked);
rg.save_gmsh(cmd_units[2], ElemData, Append, NotPacked);
rg.save_gmsh(cmd_units[2], OverWrite, NotPacked);
return;
}
@ -472,7 +471,7 @@ void data_cloud(const std::vector<std::string> &cmd_units)
array<point2dc> posi_arr(posix_vec.size());
array<double> posi_val;
posi_val.import_vector(data_vec);
posi_val.input(data_vec);
for (size_t i = 0; i < posi_arr.size(); i++)
{
posi_arr[i].x = posix_vec[i];
@ -622,16 +621,16 @@ void data_output(const std::vector<std::string> &cmd_units)
{
for (size_t i = 1; i < copy_str.size(); i++)
{
data_ptr = rg.get_data(copy_str[i]);
data_ptr->set_output(true);
data_ptr = rg.get_data_ptr(copy_str[i]);
data_ptr->output_ok_ = true;
}
}
else if (copy_str[0] == "disable")
{
for (size_t i = 1; i < copy_str.size(); i++)
{
data_ptr = rg.get_data(copy_str[i]);
data_ptr->set_output(false);
data_ptr = rg.get_data_ptr(copy_str[i]);
data_ptr->output_ok_ = false;
}
}
else throw std::runtime_error("data-output: invalid operation type.");
@ -649,7 +648,8 @@ void data_rename(const std::vector<std::string> &cmd_units)
copy_str[i - 1] = cmd_units[i];
}
rg.rename_data(copy_str[0], copy_str[1]);
meshdata &data = rg.get_data(copy_str[0]);
data.name_ = copy_str[1];
return;
}
@ -692,7 +692,7 @@ void get_stats(const std::vector<std::string> &cmd_units)
std::vector<double> stats;
for (size_t i = 0; i < copy_str.size(); i++)
{
data_ptr = rg.get_data(copy_str[i]);
data_ptr = rg.get_data_ptr(copy_str[i]);
data_ptr->show_info();
data_ptr->show_stats();
}