initial upload

This commit is contained in:
2025-12-17 10:53:43 +08:00
commit f3f1778f77
308 changed files with 129940 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
# Inversion test
This is a test setup for inversion calculation.
1. Run all cells of `make_test_model.ipynb` for creating
- source, receiver file
- true model
- initial model
2. then run TOMOATT forward with `input_params_pre.yml` for calculating the true arrival times at the stations
-> this will output src_rec_result.dat file which includes the arrival time at each station
3. run TOMOATT in inversion mode with `input_params.yml`.

View File

@@ -0,0 +1,62 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# check the change of objective values\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"fpath='objective_function.txt'\n",
"\n",
"objs=[]\n",
"\n",
"with open(fpath) as f:\n",
" lines = f.readlines()\n",
"\n",
" for l in lines:\n",
" if(l.startswith('i_inv')):\n",
" continue\n",
" objs.append(float(l.strip().split(',')[1]))\n",
"\n",
"\n",
"plt.plot(objs)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"interpreter": {
"hash": "fbd0b2a7df497f398d93ab2f589d8a5daa3108cfb7ff2b90736653cca3aeadc0"
},
"kernelspec": {
"display_name": "Python 3.9.1 64-bit ('3.9.1')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@@ -0,0 +1,119 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"sys.path.append(\"../../utils/\")\n",
"\n",
"from src_rec_file_helper import read_src_rec_file\n",
"\n",
"events_true = read_src_rec_file(\"./src_rec_test_out.dat\")\n",
"events_calc = read_src_rec_file(\"./src_rec_test_out_out.dat\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# check objective function value\n",
"v_obj = 0.0\n",
"for i_ev in range(len(events_true)):\n",
" for i_rec in range(len(events_true[i_ev].rec_list)):\n",
" v_obj += abs(events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time)**2/2.0\n",
"\n",
"print(\"v_obj: \", v_obj)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# calculate summation of difference of arrival times at each receiver\n",
"list_diff_v_obj = []\n",
"for i_ev in range(len(events_true)):\n",
" for i_rec in range(len(events_true[i_ev].rec_list)):\n",
" #tmp_v_obj = abs(events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time)**2/2.0\n",
" tmp_v_obj = events_true[i_ev].rec_list[i_rec].arr_time - events_calc[i_ev].rec_list[i_rec].arr_time\n",
"\n",
" if (i_ev == 0):\n",
" list_diff_v_obj.append(tmp_v_obj)\n",
" else:\n",
" list_diff_v_obj[i_rec] += tmp_v_obj\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# plot list_diff_v_obj on map\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# colormap by list_diff_v_obj\n",
"cmap = plt.get_cmap('viridis')\n",
"norm = plt.Normalize(vmin=min(list_diff_v_obj), vmax=max(list_diff_v_obj))\n",
"\n",
"print(\"min: \", min(list_diff_v_obj))\n",
"print(\"max: \", max(list_diff_v_obj))\n",
"\n",
"list_lon = []\n",
"list_lat = []\n",
"\n",
"for i_rec in range(len(events_true[0].rec_list)):\n",
" list_lon.append(events_true[0].rec_list[i_rec].lon)\n",
" list_lat.append(events_true[0].rec_list[i_rec].lat)\n",
"\n",
"plt.scatter(list_lon, list_lat, c=list_diff_v_obj, cmap=cmap, norm=norm)\n",
"\n",
"# color bar\n",
"plt.colorbar()\n",
"\n",
"# tight \n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.1 64-bit ('3.9.1')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
},
"vscode": {
"interpreter": {
"hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@@ -0,0 +1,284 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# compare result from TOMOATT and fortran code\n",
"\n",
"fpath_kernel_fort = './fortran/ega5/output/kernel_step1_sum'\n",
"fpath_synth_fort = './fortran/ega5/output/syn_step1_event1' # Table\n",
"fpath_adj_fort = './fortran/ega5/output/adj_step1_event1' # TableADJ\n",
"fpath_out_tomoatt = './out_data_sim_0.h5'\n",
"\n",
"# grid information in fortran code\n",
"nr = 55\n",
"nt = 55\n",
"np = 55\n",
"npoints = nr*nt*np\n",
"\n",
"# division\n",
"ndiv_r = 1 \n",
"ndiv_t = 1 \n",
"ndiv_p = 1 "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import h5py\n",
"import numpy\n",
"\n",
"\n",
"# read fortran test file and convert to numpy array\n",
"def read_fortran_result_file(fpath):\n",
" with open(fpath, 'r') as f:\n",
" lines = f.readlines()\n",
" lines = [line.strip() for line in lines]\n",
" lines = [line for line in lines if line]\n",
" lines = [line.split() for line in lines]\n",
" lines = numpy.array(lines, dtype=numpy.float64)\n",
" return lines\n",
"\n",
"fortran_data = read_fortran_result_file(fpath_kernel_fort)\n",
"## change dimension of fortran data\n",
"Ks_fort = fortran_data[:,3].reshape(nr, nt, np)\n",
"Kxi_fort = fortran_data[:,4].reshape(nr, nt, np)\n",
"Keta_fort = fortran_data[:,5].reshape(nr, nt, np)\n",
"\n",
"fortran_synth_data = read_fortran_result_file(fpath_synth_fort).reshape(nr, nt, np)\n",
"fortran_adj_data = read_fortran_result_file(fpath_adj_fort).reshape(nr, nt, np)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# read h5 data\n",
"import sys\n",
"sys.path.append(\"../../utils/\")\n",
"\n",
"from tomoatt_data_retrieval import get_data_from_h5\n",
"\n",
"#Ks_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Ks_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n",
"#Kxi_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Kxi_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n",
"#Keta_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Keta_update_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n",
"\n",
"Ks_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Ks_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p, verbose=True)\n",
"Kxi_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Kxi_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n",
"Keta_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/Keta_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n",
"\n",
"Syn_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/T_res_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)\n",
"Adj_tomoatt = get_data_from_h5(fpath_out_tomoatt, \"Data/adjoint_field_src_0_inv_0000\", nr, nt, np, ndiv_r, ndiv_t, ndiv_p)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# plot slice of Ks_inv\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.animation as animation\n",
"\n",
"\n",
"def plot_slice(data_es, data_fort, slice_ax, id_slice, contour=False, make_anime=False, tag=\"\"):\n",
"\n",
" if (slice_ax == 'r'):\n",
" data_es_v = data_es[ id_slice, :, :]\n",
" data_fort_v = data_fort[id_slice, :, :]\n",
" elif (slice_ax == 't'):\n",
" data_es_v = data_es[ :, id_slice, :]\n",
" data_fort_v = data_fort[:, id_slice, :]\n",
" elif (slice_ax == 'p'):\n",
" data_es_v = data_es[ :, :, id_slice]\n",
" data_fort_v = data_fort[:, :, id_slice]\n",
" else:\n",
" print(\"Error: slice_ax should be 'r', 't' or 'p'\")\n",
" return\n",
"\n",
" # use the same color range for both tomoatt and fortran \n",
" combined_data = numpy.array([data_es_v.flatten(),data_fort_v.flatten()])\n",
" #Get the min and max of all your data\n",
" _min, _max = numpy.amin(combined_data), numpy.amax(combined_data)\n",
" # make the color range symmetric\n",
" if (abs(_min) > abs(_max)):\n",
" if(_min < 0):\n",
" _max = -_min\n",
" else:\n",
" _min = -_max\n",
"\n",
"\n",
"\n",
" # make the color range symmetric\n",
" diff_data = data_es_v-data_fort_v\n",
" _min_diff, _max_diff = numpy.amin(diff_data), numpy.amax(diff_data)\n",
" if (abs(_min_diff) > abs(_max_diff)):\n",
" if (_min_diff < 0):\n",
" _max_diff = -_min_diff\n",
" else:\n",
" _min_diff = -_max_diff\n",
"\n",
" #cmap1=\"viridis\"\n",
" cmap1=\"seismic\"\n",
" cmap2=\"seismic\"\n",
"\n",
" plt.figure(figsize=(20,10))\n",
"\n",
" plt.subplot(1,3,1)\n",
" plt.imshow(data_es_v, cmap=cmap1, vmin=_min, vmax=_max)\n",
" plt.colorbar()\n",
" if(contour):\n",
" plt.contour(data_es_v, colors='k', linewidths=0.5)\n",
" plt.title('result_tomoatt')\n",
"\n",
" plt.subplot(1,3,2)\n",
" plt.imshow(data_fort_v, cmap=cmap1, vmin=_min, vmax=_max)\n",
" plt.colorbar()\n",
" if(contour): \n",
" plt.contour(data_fort_v, colors='k', linewidths=0.5)\n",
" plt.title('result_fort')\n",
" \n",
" plt.subplot(1,3,3)\n",
" plt.imshow(diff_data, cmap=cmap2, vmin=_min_diff, vmax=_max_diff)\n",
" plt.colorbar()\n",
" if(contour):\n",
" plt.contour(diff_data, colors='k', linewidths=0.5) \n",
" plt.title('tomoatt-fort')\n",
"\n",
" if (not make_anime):\n",
" plt.show()\n",
" else:\n",
" plt.savefig(\"out_\"+tag+\"_\"+slice_ax+str(id_slice).zfill(3)+\".png\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plot_slice(Syn_tomoatt, fortran_synth_data, 'r', 20, contour=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"def anime_slices(data_es, data_fort, slice_ax, tag):\n",
"\n",
" if (slice_ax == 'r'):\n",
" n = nr\n",
" elif (slice_ax == 't'):\n",
" n = nt\n",
" elif (slice_ax == 'p'):\n",
" n = np\n",
"\n",
" for i in range(0, n):\n",
" plot_slice(data_es, data_fort, slice_ax, i, contour=True, make_anime=True, tag=tag)\n",
"\n",
" ## make png files to gif\n",
" import subprocess\n",
" subprocess.call([\"convert\", \"-delay\", \"20\", \"-loop\", \"0\", \"out_{}_{}*.png\".format(tag,slice_ax), \"out_{}_{}.gif\".format(tag,slice_ax)])\n",
" # erase png files\n",
" for i in range(0, nr):\n",
" subprocess.call([\"rm\", \"out_{}_{}\".format(tag,slice_ax)+str(i).zfill(3)+\".png\"])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"anime_slices(Ks_tomoatt, Ks_fort, 'r', 'Ks')\n",
"anime_slices(Ks_tomoatt, Ks_fort, 't', 'Ks')\n",
"anime_slices(Ks_tomoatt, Ks_fort, 'p', 'Ks')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"anime_slices(Adj_tomoatt, fortran_adj_data,'r', 'Adj')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"anime_slices(Keta_tomoatt, Keta_fort, 'r', 'Keta')\n",
"anime_slices(Keta_tomoatt, Keta_fort, 't', 'Keta')\n",
"anime_slices(Keta_tomoatt, Keta_fort, 'p', 'Keta')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"anime_slices(Kxi_tomoatt, Kxi_fort, 'r', 'Kxi')\n",
"anime_slices(Kxi_tomoatt, Kxi_fort, 't', 'Kxi')\n",
"anime_slices(Kxi_tomoatt, Kxi_fort, 'p', 'Kxi')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"anime_slices(Adj_tomoatt, fortran_adj_data, 'r', 'adj')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.1 64-bit ('3.9.1')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
},
"vscode": {
"interpreter": {
"hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@@ -0,0 +1,3 @@
mpif90 ega5_sphe_3d_inversion_Tong_3Dinv.f90 -o a5.out
mpirun -n 4 a5.out

View File

@@ -0,0 +1,501 @@
500
12.902894 37.503373 16.794572
17.416074 36.974148 25.587149
10.553441 48.572870 29.755519
17.050082 30.582756 20.557365
7.733536 30.049830 22.686053
2.695465 45.678252 36.050257
19.018349 30.835213 33.695062
16.538200 39.559879 22.351080
2.947435 37.234474 24.550463
15.739527 49.857044 16.506392
15.732578 34.182860 27.127186
1.296549 48.107962 29.948977
14.587690 39.140723 23.153653
18.135532 45.517829 17.105875
8.364121 30.479830 15.883796
9.211189 38.133248 17.858524
4.272898 31.194404 18.573422
6.948694 35.954361 24.462624
12.746088 49.850406 26.847644
11.313107 45.103047 16.301263
3.313507 46.477589 36.875331
10.145642 42.073024 18.769733
8.250413 48.900277 19.475522
13.804441 49.786255 16.530966
17.835237 45.927679 19.912836
11.877357 33.654921 22.852455
12.871971 34.707392 21.890595
4.097522 34.532987 27.568581
17.874029 34.484387 34.692491
3.866172 33.865449 28.496058
16.252330 41.105672 19.464576
1.213538 36.013973 17.977264
14.955385 45.399043 29.827500
17.469489 35.163250 19.273657
7.375320 32.817054 28.313777
18.585662 33.143956 25.800265
15.518612 34.328928 29.752072
18.309939 33.218516 38.096180
5.752131 32.762387 39.124230
12.471990 48.600499 37.709010
8.119302 41.058539 27.574594
13.473451 36.710096 33.310765
12.096579 45.910913 20.602681
12.291621 35.421838 19.609690
6.722855 34.197625 22.922348
19.977008 33.357824 20.801610
14.042122 42.609560 36.961508
8.278199 33.440638 35.377468
10.130480 41.237552 26.524442
9.874228 41.667609 22.900117
2.528995 40.838610 35.938716
15.334613 43.507392 36.217644
2.660098 44.120069 32.041887
1.861117 38.659778 36.102099
17.497575 45.676303 27.354341
11.287530 40.851293 33.379047
18.006903 38.149825 25.683572
9.641227 30.509291 32.005355
11.281402 38.301783 26.210378
17.511430 43.700541 20.496900
6.279207 49.780686 35.342213
10.691969 45.580664 36.011519
15.409820 38.320676 17.830344
19.051727 44.632362 37.180772
1.812418 37.134760 37.694988
4.160294 33.803068 37.492413
19.990846 44.087650 38.916613
6.919528 36.705624 30.282383
3.762207 33.859941 23.084520
6.696542 31.799267 15.983610
5.207515 43.495341 36.539506
15.760515 33.837372 18.996584
16.401076 40.346859 29.422924
3.985079 48.258603 32.826637
16.886675 48.716436 23.605320
18.974327 46.091270 22.697943
7.384952 38.441961 16.463244
4.231388 42.800608 22.558010
3.169625 49.753544 33.780253
3.741493 42.843651 38.277171
1.703036 35.504006 28.680233
2.556739 31.467144 23.718764
8.546980 41.234760 31.150894
13.221493 40.941614 33.480616
6.837920 34.912584 35.820479
7.716762 41.133360 20.876900
10.321416 31.362250 29.092427
17.855166 45.569227 19.744126
5.414400 45.949803 24.029219
10.622310 33.633958 37.349613
18.821079 45.259309 23.690669
6.400983 42.879048 20.743236
10.339512 44.689643 20.088403
14.157235 42.069607 38.833834
17.014583 34.928036 31.302363
12.827352 36.255275 22.938120
7.405344 48.287391 34.564176
3.771071 43.293532 28.422367
11.910684 48.348929 36.441739
3.053959 43.737186 36.600389
8.579958 40.581127 25.851314
11.931197 31.720220 17.810105
7.425585 44.628309 34.089390
1.517343 49.451598 36.749768
13.373374 37.648809 36.512094
4.490529 47.682461 26.286905
17.470296 43.349799 16.006251
19.343889 44.865620 31.299373
15.455612 39.569737 21.775167
13.382569 38.684806 37.606354
16.876219 37.640250 22.490769
5.007780 43.252308 31.761110
14.917810 48.036944 16.404019
18.211096 33.840776 16.319922
7.586946 30.429530 17.767477
15.527441 36.791267 32.576167
8.395652 47.363883 30.734555
8.300918 45.773041 18.973032
12.811946 37.078433 31.654726
11.271027 44.367770 23.614827
7.883254 33.508117 25.081344
9.318537 34.252752 21.126458
10.125988 49.407886 23.732711
15.231482 31.012657 38.326734
17.583612 46.667417 35.223383
3.975712 45.446574 19.293018
6.378385 47.601238 37.559922
2.237225 46.922084 15.276371
18.881117 47.018476 32.117860
7.601149 37.424848 33.048987
1.545623 35.528771 31.054720
15.305942 41.902726 32.920003
8.780450 43.137000 29.771781
15.653881 33.574476 22.550923
8.374878 42.226796 29.428747
1.649332 37.516438 29.602287
15.471741 42.579812 34.244173
14.121526 31.968351 35.539179
19.951984 31.884994 38.930168
5.686047 46.021632 37.620089
3.356280 35.028285 27.812111
17.282928 32.916989 20.503907
17.587365 30.437778 27.868687
16.846272 32.526293 23.686783
5.595438 46.916388 30.602188
10.617813 47.056847 29.509244
3.472421 46.734969 23.827490
9.450474 39.510548 26.858533
7.050903 31.802893 18.651294
16.740378 42.673295 22.941474
8.748832 49.086459 28.498236
11.101980 48.419839 33.467477
1.821840 40.425959 24.967524
18.807331 49.210102 23.627239
16.048152 33.431415 27.275778
4.156495 37.028503 23.441579
8.252786 43.619866 31.044609
6.039243 44.924797 25.445324
15.698418 36.891680 31.709361
13.305460 31.432069 28.565380
1.884098 33.514374 39.083138
19.784318 48.068758 33.412684
10.067793 43.703751 38.394139
9.332467 39.505090 19.017737
12.280919 46.423916 38.722269
18.443031 39.348801 27.023964
15.761264 48.206337 22.708882
7.403360 37.157790 15.624682
11.901780 46.996568 29.408969
19.234729 44.636488 39.127281
4.699343 31.480019 22.985463
8.029268 33.651500 17.282239
9.408798 39.483198 37.726002
2.995543 45.341282 28.914835
1.469270 43.894101 35.258155
17.054291 30.978729 17.580649
5.151633 42.357135 21.048084
11.523488 48.279981 20.451448
12.625369 47.910449 23.809322
10.805510 39.289972 33.099199
16.688680 31.235778 31.772384
5.872404 46.921761 20.735459
7.760370 49.248566 27.412126
14.981766 48.345084 22.449809
17.494891 42.556305 17.939339
16.883756 35.789221 26.232745
18.320859 32.768764 34.301897
17.639973 41.691055 20.038187
9.699485 49.507576 29.079033
18.107852 35.136726 29.376171
18.308439 37.395076 27.395968
7.807415 35.196537 36.702486
19.870463 31.937476 26.900138
3.831742 44.590580 18.565134
15.201851 32.646130 39.026955
15.828158 47.973824 36.504196
13.003291 37.834748 30.167337
6.392706 37.452325 18.574045
16.906282 42.459442 35.050055
13.809721 39.226894 19.719641
2.349331 48.568978 36.858088
13.463109 31.025621 32.611917
7.791103 35.619114 35.466085
15.908805 31.883312 36.337440
12.117860 40.626769 15.503395
17.224971 30.288926 20.225713
7.769806 32.781915 20.240085
19.515691 32.790366 18.423108
13.086107 35.997238 32.187432
19.583843 46.680117 23.645876
5.856651 40.007246 21.179095
7.862932 44.479540 23.893157
6.880727 30.486859 36.304971
12.890612 39.620341 15.500047
17.079175 38.401798 27.785445
5.828536 41.348587 16.106890
16.937460 42.816015 36.720915
3.914160 30.441916 38.949482
19.655249 45.167885 21.419356
5.977111 38.508239 20.391821
6.927604 39.621611 32.875926
18.361222 45.590869 38.069800
10.260030 43.346131 15.879682
2.192603 39.046662 33.248710
19.085453 37.873403 16.629225
12.101016 38.044051 24.990450
5.819428 32.772253 26.474392
12.724981 46.690291 27.925452
18.061294 42.771723 33.725329
14.506720 47.805098 26.622413
19.850651 49.189715 25.849751
15.219038 43.463470 25.041924
19.886991 34.051333 32.426005
7.117638 32.476564 32.376542
5.495352 36.502620 28.691081
16.996145 40.153394 37.204504
6.456862 33.696229 34.883926
2.330674 33.891702 15.484274
16.654256 35.373110 33.898747
5.038885 38.192102 27.689718
14.123672 33.761702 24.479974
1.429166 47.744844 31.788410
4.269137 39.186264 18.096003
2.289546 40.394737 27.797130
8.634843 49.702312 16.408445
4.519147 37.133705 18.956423
15.655447 42.736719 21.384360
12.749631 32.600550 38.708210
4.951746 46.823971 36.767247
9.331854 35.692199 21.771833
10.011062 46.663543 24.723024
19.949108 42.198244 27.340252
10.252827 47.219953 25.322984
16.510059 43.107901 28.874568
6.363226 49.090611 17.454213
10.635868 40.297072 33.028443
16.850642 38.133906 27.489172
1.209319 37.893652 34.507359
12.115913 34.227874 36.364014
12.821762 39.440078 33.040301
18.591223 39.525593 31.873724
8.071489 49.360508 16.522758
8.888324 42.368580 26.650131
8.889626 41.127943 35.902008
10.999334 37.031617 39.494656
18.362983 30.378271 18.297875
4.302350 36.174539 25.849816
7.203800 35.926694 33.803271
5.955434 30.625004 18.539309
18.701156 48.114168 36.495495
9.310080 31.778387 24.469818
4.443713 48.914441 17.652480
6.915923 33.492221 30.512492
12.953648 47.034138 17.407188
13.014381 38.565701 16.404760
3.750504 34.237353 36.468920
14.823263 48.440372 22.486555
15.668423 46.749729 32.080923
15.249817 31.028147 15.608834
13.264813 47.340345 31.103057
15.198867 35.515848 16.671581
9.743653 41.383808 30.090270
13.220311 46.330492 36.129090
3.174404 32.263913 36.140707
6.044751 33.274473 15.721678
11.565608 35.746820 22.653814
16.179206 44.677125 24.020450
11.327136 44.811048 32.693529
1.636618 40.444103 18.356178
10.744547 37.150505 16.214572
13.261026 34.105829 21.999317
3.868859 49.216692 21.453701
18.240428 30.304513 30.673916
7.072615 35.062618 26.710350
9.121655 48.655297 29.967281
5.855663 35.811613 27.420149
12.000977 43.413023 15.537291
6.564213 36.838226 35.870052
7.714274 42.313338 28.048145
2.081489 43.751865 27.701850
8.319217 33.115678 38.739537
14.511302 34.703210 16.585363
9.035614 36.808248 20.909689
14.228832 44.449462 15.947576
10.282913 49.531593 19.906303
17.589859 47.123318 23.446360
4.864052 37.595184 15.336005
5.554797 45.565313 38.282334
10.528200 42.619743 24.326508
11.040215 46.010982 22.617869
11.404083 46.772047 20.275623
8.466629 43.802511 26.377092
14.969797 31.351324 25.339695
14.235184 33.858954 37.025746
8.455785 49.863795 33.265439
8.889406 35.667726 17.308049
6.681788 37.412732 15.346280
8.976410 34.648739 17.568041
10.814533 44.752360 29.627384
10.199468 40.546340 32.494767
14.496903 45.258427 38.066645
3.094126 35.259604 16.746947
8.520395 42.659554 15.880581
17.611133 41.555600 18.232809
14.251795 33.115916 20.736805
7.514731 30.399115 21.351999
5.196915 45.397866 34.915807
19.166354 32.396496 21.352377
13.151796 40.555799 27.727383
5.350548 46.598504 34.378491
9.529635 40.571371 18.426558
9.126816 41.898209 17.050111
13.802897 32.953515 28.238527
15.418929 34.298935 26.833731
12.574792 35.492734 26.555897
16.938654 44.491948 25.265210
10.924080 48.518974 17.175958
7.117455 42.434404 23.654994
14.009338 36.036521 39.017975
19.349324 30.799935 19.716167
14.201462 37.024155 38.578311
2.822673 33.994394 34.302821
13.892456 32.962351 32.359032
15.995095 43.754437 29.772219
12.968758 32.410285 24.381215
1.583361 48.689008 24.016421
15.389693 46.555314 19.407358
17.453486 39.698530 32.665472
12.941524 30.636925 27.452996
13.213848 32.944137 23.119204
5.801494 40.680483 39.987076
16.748570 32.170913 15.378249
5.500054 38.628247 24.922452
9.008471 31.774374 37.808194
14.855098 47.897280 39.249556
18.168511 33.566407 22.346673
17.753149 42.913741 33.127159
19.795910 35.010497 18.833259
13.418894 37.999490 18.797014
10.696075 37.767208 37.509466
1.516162 41.220767 36.769994
9.791821 47.293788 32.327841
15.542095 41.085072 23.263423
16.094111 33.695693 15.819606
11.757946 39.421142 30.979153
16.568937 34.064155 18.969278
6.911632 36.546812 20.978434
4.881109 32.834115 39.250059
14.023054 45.882062 37.160694
9.816248 46.742746 29.781763
8.756145 37.174411 24.408729
17.588240 44.192292 26.619717
17.340343 41.790910 28.580176
12.088289 45.478525 27.897123
2.586683 37.906181 27.284716
14.494787 31.239448 15.065949
19.880752 30.337209 16.025088
12.823786 43.458027 18.855097
15.293022 31.406674 37.847072
13.980302 44.345304 18.989914
8.991872 32.283652 15.894826
10.306169 44.491996 15.351453
9.244054 31.064154 35.461811
11.066989 35.074635 21.009033
9.996705 35.829850 28.967240
11.044099 39.587919 35.338766
1.917792 49.787496 20.053103
1.898804 31.727660 26.029601
17.236757 44.662413 28.599031
8.003001 41.530145 34.147378
11.296640 31.640054 29.667642
7.470842 38.590285 16.251505
4.120357 40.312343 30.229225
8.168395 39.952977 27.957050
14.557243 45.490199 23.005864
8.675602 35.746172 28.944592
13.436976 32.236888 28.823008
17.809797 33.690628 26.829731
8.031168 39.495328 32.948914
14.566420 42.285006 32.930929
10.051800 39.544345 25.797573
15.312497 35.367693 24.154386
2.101328 37.582577 35.819286
14.200961 38.741432 22.349646
17.750624 33.199228 15.433538
5.105492 42.003092 30.932790
10.710424 46.645944 31.550315
4.863936 33.255507 39.528023
10.640629 37.713774 30.208056
3.363033 36.409599 39.058745
11.715459 45.522667 32.434962
13.464532 47.534408 37.701884
5.753267 33.153432 38.744854
18.406300 45.310872 29.325427
13.206913 40.476137 23.713366
8.022162 30.669901 22.709029
3.752878 32.705859 37.542413
1.610955 47.782385 29.385167
3.282363 49.872369 28.006430
15.645580 31.838090 35.763354
4.094538 33.332994 30.739124
19.389613 49.000040 18.201493
12.304495 31.002744 35.347648
16.636205 41.587288 38.509899
16.242905 37.908027 22.830238
5.293874 39.810962 24.214172
17.730042 40.807401 24.413293
10.848526 46.719333 35.651427
7.126381 30.842360 33.846795
5.959882 33.494248 22.053307
19.655118 37.249880 30.995999
17.472236 42.954364 33.867949
8.702629 44.307435 34.928355
14.553503 36.391143 23.208353
16.004125 47.562957 34.801544
11.432695 47.088634 33.492738
18.226320 43.756214 35.926311
3.436149 42.651048 38.536654
13.874327 30.831422 25.310616
14.802646 40.372075 29.327322
17.366240 48.310718 23.205411
18.883354 33.973377 34.189039
4.940024 38.820683 21.764487
6.389472 34.087807 31.184860
9.686298 46.746346 32.711941
14.858616 49.173689 28.350539
12.892325 33.920028 27.283556
10.997502 36.579405 32.044916
17.125470 47.650177 29.239499
10.673225 33.505780 21.271442
15.673616 33.342102 36.331892
19.150955 35.558436 38.191118
7.109812 49.243617 18.690492
6.496059 31.449753 32.600549
16.655108 39.629968 37.582826
10.026644 39.787402 21.084604
7.611422 40.274845 26.509155
19.789113 39.105677 19.207532
2.261065 37.897836 16.342341
3.544031 45.823398 29.063016
8.128766 31.176403 35.862979
1.144189 43.284815 36.664338
11.880560 36.253201 23.576926
16.624167 49.768690 39.240587
15.503963 36.766183 20.953801
17.806003 30.839724 27.752022
8.304373 48.787565 21.408915
10.181775 35.977743 18.438917
17.122472 34.268485 38.754985
5.311906 43.788904 17.804844
12.012478 31.562773 17.345468
19.961598 36.302881 28.623923
19.538837 36.303158 31.781007
4.523682 48.587788 33.198009
13.324998 42.192480 29.795723
1.123948 43.299255 23.155238
17.451114 45.355883 24.606045
4.411658 44.468014 25.506241
3.964021 38.375390 37.494247
3.342860 44.301725 24.667203
16.858232 33.418985 37.621960
17.575051 42.057543 21.681617
3.721699 44.550901 22.869235
4.536435 32.653021 20.354643
12.418668 47.807467 24.510958
3.480837 37.949268 25.698086
17.659928 48.015778 25.153195
3.404855 39.565089 37.688459
19.441124 45.664148 24.812879
15.163402 48.596491 28.147741
7.069610 34.859944 37.842481
10.350486 40.456093 36.237884
19.801801 40.683590 39.924546
7.334750 39.747428 31.758286
18.418554 30.115213 16.453879
5.771517 49.221621 20.668848
18.747257 49.783529 38.782999
12.681107 36.749221 26.025580
18.648049 31.794062 33.729165
3.086854 38.310420 27.893166

View File

@@ -0,0 +1,6 @@
5
12.902894 37.503373 16.794572
17.416074 36.974148 25.587149
10.553441 48.572870 29.755519
17.050082 30.582756 20.557365
7.733536 30.049830 22.686053

View File

@@ -0,0 +1,61 @@
60
0.0 36.472809 29.812050
0.0 42.546922 16.133799
0.0 30.991032 23.169443
0.0 46.965102 39.508986
0.0 47.511915 37.527905
0.0 48.435600 20.814328
0.0 41.863499 15.672084
0.0 32.635381 25.986810
0.0 38.657687 39.966088
0.0 40.746866 34.837968
0.0 42.548883 27.938223
0.0 45.654715 39.054882
0.0 35.547420 37.107352
0.0 34.000382 19.128119
0.0 44.563868 35.283488
0.0 40.983368 32.490992
0.0 41.849069 38.852775
0.0 30.415956 28.399387
0.0 39.547377 26.435165
0.0 32.064886 30.332071
0.0 42.476838 23.230493
0.0 34.956877 26.244838
0.0 42.093400 15.092363
0.0 37.363268 23.303628
0.0 41.913218 33.323567
0.0 43.569418 26.558183
0.0 36.206968 29.037593
0.0 30.241436 25.506620
0.0 44.117881 30.429571
0.0 39.517000 34.746538
0.0 37.361734 22.829658
0.0 49.421317 23.380557
0.0 35.352432 34.053354
0.0 42.126659 22.069541
0.0 40.290506 34.457216
0.0 37.633977 35.795705
0.0 42.640993 22.595143
0.0 41.972681 38.966854
0.0 43.073835 35.660796
0.0 45.484914 23.240725
0.0 44.787236 30.506240
0.0 36.156778 18.188633
0.0 34.670427 29.724995
0.0 48.621299 19.602209
0.0 35.103483 16.672438
0.0 48.315182 37.314071
0.0 42.367526 34.248809
0.0 39.728066 28.578711
0.0 44.531207 26.103171
0.0 31.457146 27.143870
0.0 31.580000 17.230000
0.0 32.120000 19.330000
0.0 49.220000 16.330000
0.0 45.630000 18.290000
0.0 40.870000 19.970000
0.0 48.740000 27.460000
0.0 47.520000 32.420000
0.0 33.250000 33.980000
0.0 30.990000 34.470000
0.0 31.120000 39.100000

View File

@@ -0,0 +1,6 @@
5
0.0 36.472809 29.812050
0.0 42.546922 16.133799
0.0 30.991032 23.169443
0.0 46.965102 39.508986
0.0 47.511915 37.527905

View File

@@ -0,0 +1,737 @@
include "eikon_solver_mpi.f90"
! example: 3-D 3rd order anisotropic eikonal equation in cartesian coordinate (Point source)
! parameter setting:
! domain: R * Theta * Phi = [6275, 6375] * [49^\circ, 51^\circ] * [129^\circ, 131^\circ]
! analytic solution: T = |x-x_s|/c0
! isotropic eik equ: Tx^2 + Ty^2 + Tz^2 = s^2,
! boundary condition: T(x0,y0,z0) = 0 (point source)
! test function: 'FSM_WENO3_PS_sphe_3d' in "eikon_solver.f90"
!
program eikonal_2d
use mpi
! ######################### 参数声明 parameters statement #########################
implicit none
! mesh grid
integer,parameter :: nr=55,nt=55,np=55
double precision,parameter :: pi=3.14159265358979323846264338327950288
double precision,parameter :: rr1=6070,rr2=6400
double precision,parameter :: tt1=(30.0-1.5)/180*pi,tt2=(50.0+1.5)/180*pi
double precision,parameter :: pp1=(15.0-1.5)/180*pi,pp2=(40.0+1.5)/180*pi
double precision :: rr(nr),tt(nt),pp(np),dr,dt,dp
! source (STATIONS) & receiver (EARTHQUAKES)
integer :: nsou
double precision,allocatable :: rsou(:),tsou(:),psou(:) ! source (station)
integer :: nrec
double precision,allocatable :: rrec(:),trec(:),prec(:) ! receiver (earthquake)
! model parameter
double precision,parameter :: gamma = 0.0
double precision :: xi(nr,nt,np),eta(nr,nt,np),zeta(nr,nt,np) ! syn model (ani)
double precision :: xiT(nr,nt,np),etaT(nr,nt,np),zetaT(nr,nt,np) ! true model (ani)
double precision :: sigma1,sigma2,psi
double precision,parameter :: slow_p=0.04,ani_p=0.03
! Eikonal solver
double precision :: aT(nr,nt,np),bT(nr,nt,np),cT(nr,nt,np),fT(nr,nt,np),funT(nr,nt,np) ! true model 真实模型
double precision :: a(nr,nt,np),b(nr,nt,np),c(nr,nt,np),f(nr,nt,np),fun(nr,nt,np) ! syn model 猜测模型
double precision :: uT(nr,nt,np),TableT(nr,nt,np) !true timetable 真实走时场
double precision :: u(nr,nt,np),Table(nr,nt,np) !syn timetable 猜测走时场
!double precision :: T0para(8),tau(nr,nt,np) ! multiplicative factor
! adjoint source
double precision,allocatable :: sourceADJ(:),TtimeT(:,:),Ttime(:,:) ! adjoint source 伴随源,真实走时,合成走时
double precision :: TableADJ(nr,nt,np) ! adjoint field 伴随场
double precision :: Ks(nr,nt,np),Kxi(nr,nt,np),Keta(nr,nt,np) ! event kernel
integer,parameter :: nk = 3 ! number of kernels
double precision :: all_Ks(nr,nt,np),all_Kxi(nr,nt,np),all_Keta(nr,nt,np) ! sensitivity kernel
double precision :: all_Kernel(nr,nt,np,nk) ! kernels for all parameters together
!double precision,parameter :: radius = 40 ! kernel mask radius
! inversion grid
integer,parameter :: ninvr=11,ninvt=10,ninvp=10 ! inversion grid size (coarse)
double precision,parameter :: invr1=6070.0,invr2=6400.0
double precision,parameter :: invt1=30.0/180*pi,invt2=50.0/180*pi
double precision,parameter :: invp1=15.0/180*pi,invp2=40.0/180*pi
integer,parameter :: ngrid=5 ! number of nultigrid (multigrid technique)
double precision :: invr(ngrid,ninvr),invt(ngrid,ninvt),invp(ngrid,ninvp),dinvr,dinvt,dinvp
double precision :: update_value(nr,nt,np,nk) ! parameter update value 更新参数的变化量
! model update (optimization)
double precision :: stepsize ! stepsize
integer,parameter :: MaxIter=1 ! max iteration step
double precision :: old_obj, obj, sou_obj ! 优化目标函数 objective function
double precision,allocatable :: weight_sou(:),weight_rec(:) !weight function
double precision :: dis_ij, dis_zero !weight function
logical :: weight_sou_bool=.false. , weight_rec_bool= .false.
! temp var
double precision :: depth,lat,lon
! output file
character(Len=80) :: filename,form,form2
! loop index
integer :: iir,iit,iip,idi,idj,idk,i,j,k,iter,igrid
! computing time
double precision :: time_begin,time_end,alpha
! mpi parameter
integer :: ierr,myid,nproc
! ############################# main work #############################
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,myid,ierr)
call mpi_comm_size(mpi_comm_world,nproc,ierr)
call CPU_TIME(time_begin) ! program start
! ################### read sources and receivers 读取地震台站数据 ###################
open(10,file='ega5/input/STATIONS_5.txt')
read(10,*) nsou
allocate(rsou(nsou),tsou(nsou),psou(nsou),weight_sou(nsou))
do i=1,nsou
read(10,*) depth,lat,lon
rsou(i) = 6371.0-depth
tsou(i) = lat/180.0*pi
psou(i) = lon/180.0*pi
end do
close(10)
open(10,file='ega5/input/EARTHQUAKES_5.txt')
read(10,*) nrec
allocate(rrec(nrec),trec(nrec),prec(nrec),weight_rec(nrec))
do i=1,nrec
read(10,*) depth,lat,lon
rrec(i) = 6371.0-depth
trec(i) = lat/180.0*pi
prec(i) = lon/180.0*pi
end do
close(10)
! distance based weight -rec 台站权重
if (weight_rec_bool) then
dis_zero = 0
do i=1,nrec-1
do j=i,nrec
call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij)
dis_zero = dis_zero + dis_ij
end do
end do
dis_zero = dis_zero/nrec/(nrec-1)*2
dis_zero = dis_zero/2
do i=1,nrec
weight_rec(i)=0.0
do j=1,nrec
call Epicenter_Distance(trec(i),prec(i),trec(j),prec(j),dis_ij)
weight_rec(i) = weight_rec(i) + exp(-(dis_ij/dis_zero)**2)
end do
weight_rec(i) = 1.0/weight_rec(i)
end do
print *, dis_zero
end if
if (weight_rec_bool) then
! distance based weight - soruce 地震权重
dis_zero = 0
do i=1,nsou-1
do j=i,nsou
call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij)
dis_zero = dis_zero + dis_ij
end do
end do
dis_zero = dis_zero/nsou/(nsou-1)*2
dis_zero = dis_zero/4
do i=1,nsou
weight_sou(i)=0.0
do j=1,nsou
call Epicenter_Distance(tsou(i),psou(i),tsou(j),psou(j),dis_ij)
weight_sou(i) = weight_sou(i) + exp(-(dis_ij/dis_zero)**2)
end do
weight_sou(i) = 1.0/weight_sou(i)
end do
print *, dis_zero
end if
! ---- 记录到 matlab 数据中 matlab record ----
if (myid .eq. 0) then
open(100,file='ega5/output/STATIONS')
open(101,file='ega5/output/EARTHQUAKES')
do i=1,nsou
write(100,'(f13.7,f13.7,f13.7,f13.7)') rsou(i),tsou(i),psou(i),weight_sou(i)
end do
do i=1,nrec
write(101,'(f13.7,f13.7,f13.7,f13.7)') rrec(i),trec(i),prec(i),weight_rec(i)
end do
close(100);close(101)
end if
! ######################### 生成网格 build mesh grid #####################################
! -------- forward modeling grid ----------
dr=(rr2-rr1)/(nr-1); dt=(tt2-tt1)/(nt-1); dp=(pp2-pp1)/(np-1)
do iir=1,nr
rr(iir)=rr1+(iir-1)*dr
end do
do iit=1,nt
tt(iit)=tt1+(iit-1)*dt
end do
do iip=1,np
pp(iip)=pp1+(iip-1)*dp
end do
! -------- inversion multigrid ----------
dinvr=(invr2-invr1)/(ninvr-1); dinvt=(invt2-invt1)/(ninvt-1); dinvp=(invp2-invp1)/(ninvp-1)
do igrid=1,ngrid
do iir=1,ninvr
invr(igrid,iir)=invr1+(iir-1)*dinvr-(igrid-1)*dinvr/ngrid
end do
do iit=1,ninvt
invt(igrid,iit)=invt1+(iit-1)*dinvt-(igrid-1)*dinvt/ngrid
end do
do iip=1,ninvp
invp(igrid,iip)=invp1+(iip-1)*dinvp-(igrid-1)*dinvp/ngrid
end do
end do
! ######################### 构建背景模型 build the synthetic and true model #####################################
do iir=1,nr
do iit=1,nt
do iip=1,np
! synthetic (initial) model
eta(iir,iit,iip)=0.0;
xi(iir,iit,iip)=0.0;
zeta(iir,iit,iip)=gamma*sqrt(eta(iir,iit,iip)**2+xi(iir,iit,iip)**2)
! if (rr(iir)>6351) then ! 6371 - 6351 20 km
! fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7)
! elseif (rr(iir)>6336) then ! 6351 - 6336 15 km
! fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6)
! elseif (rr(iir)>6251) then ! 6336 - 6251 85 km
! fun(iir,iit,iip) = 1.0/(8.04+(6336-rr(iir))/85.0*0.01)
! elseif (rr(iir)>6161) then ! 6251 - 6161 90 km
! fun(iir,iit,iip) = 1.0/(8.05+(6251-rr(iir))/90.0*0.25)
! elseif (rr(iir)>5961) then ! 6161 - 5961 200 km
! fun(iir,iit,iip) = 1.0/(8.30+(6161-rr(iir))/200.0*0.73)
! else
! fun(iir,iit,iip) = 1.0/9.03
! end if
if (rr(iir)>6351) then ! 6371 - 6351 20 km
fun(iir,iit,iip) = 1.0/(5.8+(6371-rr(iir))/20.0*0.7)
elseif (rr(iir)>6336) then ! 6351 - 6336 15 km
fun(iir,iit,iip) = 1.0/(6.5+(6351-rr(iir))/15.0*0.6)
elseif (rr(iir)>5961) then ! 6351 - 6336 15 km
fun(iir,iit,iip) = 1.0/(8.0+(6336-rr(iir))/375.0*1)
else
fun(iir,iit,iip) = 1.0/9.0
end if
!read(100,*) xi(iir,iit,iip)
!read(101,*) eta(iir,iit,iip)
!read(102,*) fun(iir,iit,iip)
a(iir,iit,iip)=1.0+2*zeta(iir,iit,iip);
b(iir,iit,iip)=1.0-2*xi(iir,iit,iip);
c(iir,iit,iip)=1.0+2*xi(iir,iit,iip);
f(iir,iit,iip)=-2*eta(iir,iit,iip);
Table(iir,iit,iip) = 0
! true (target) model
if (tt(iit)>=30.0/180*pi .and. tt(iit)<=50.0/180*pi .and. &
& pp(iip)>=15.0/180*pi .and. pp(iip)<=40.0/180*pi .and. &
& rr(iir)>=6211.0 .and. rr(iir)<=6371.0 ) then
sigma1 = sin(4*pi*(tt(iit)-30.0/180*pi)/(20.0/180*pi))* &
& sin(4*pi*(pp(iip)-15.0/180*pi)/(25.0/180*pi))* &
& sin(2*pi*(rr(iir)-6211)/160.0)
else
sigma1 = 0.0
end if
if (sigma1<0) then
psi = 60.0/180*pi
elseif (sigma1 > 0) then
psi = 150.0/180*pi
else
psi = 0
end if
etaT(iir,iit,iip)=ani_p*abs(sigma1)*sin(2*psi);
xiT(iir,iit,iip)=ani_p*abs(sigma1)*cos(2*psi);
zetaT(iir,iit,iip)=gamma*sqrt(etaT(iir,iit,iip)**2+xiT(iir,iit,iip)**2)
aT(iir,iit,iip)=1.0+2*zetaT(iir,iit,iip);
bT(iir,iit,iip)=1.0-2*xiT(iir,iit,iip);
cT(iir,iit,iip)=1.0+2*xiT(iir,iit,iip);
fT(iir,iit,iip)=-2*etaT(iir,iit,iip);
funT(iir,iit,iip) = fun(iir,iit,iip)/(1+sigma1*slow_p)
!fun(iir,iit,iip) = funT(iir,iit,iip)
!eta(iir,iit,iip)=etaT(iir,iit,iip);
!xi(iir,iit,iip)=xiT(iir,iit,iip);
!zeta(iir,iit,iip)=zetaT(iir,iit,iip)
!a(iir,iit,iip)=aT(iir,iit,iip)
!b(iir,iit,iip)=bT(iir,iit,iip)
!c(iir,iit,iip)=cT(iir,iit,iip)
!f(iir,iit,iip)=fT(iir,iit,iip)
TableT(iir,iit,iip) = 0
u(iir,iit,iip) = 0
end do
end do
end do
! ---- 记录到 matlab 数据中 matlab record ----
if (myid==0) then
open(100,file='ega5/output/model_true')
open(101,file='ega5/output/model_init')
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& funT(iir,iit,iip),xiT(iir,iit,iip),etaT(iir,iit,iip)
write(101,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip)
end do
end do
end do
close(100);close(101)
! --------- 多重网格 multiple grid ------
do igrid=1,Ngrid
select case(igrid)
case (1:9)
write(form,'(I1)') igrid
case (10:99)
write(form,'(I2)') igrid
end select
open(100,file='ega5/output/multigrid'//trim(form))
do iir=1,ninvr
do iit=1,ninvt
do iip=1,ninvp
write(100,'(f13.7,f13.7,f13.7)') &
& invr(igrid,iir),invt(igrid,iit),invp(igrid,iip)
end do
end do
end do
close(100)
end do
end if
! ######################### 计算真实到时 calculate true traveltimes ######################
call mpi_barrier(mpi_comm_world,ierr)
allocate(TtimeT(nsou,nrec)) ! 初始化真实到时表 initiate true traveltimes
allocate(Ttime(nsou,nrec)) ! 初始化合成到时表 initiate syn traveltimes
allocate(sourceADJ(nrec)) ! 初始化伴随源 initiate adjoint source
if (myid==0) then
print *, ' '
print *, '----------------- calculating true timetable ... ----------------'
print *, ' '
end if
do i=1,nsou ! loop sources (STATIONS)
! -------- 求解程函方程 solve eikonal equations ------------
call mpi_barrier(mpi_comm_world,ierr)
!rsou(i)=6371.0; tsou(i)=30.5/180.0*pi; psou(i)=15.5/180.0*pi
call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,aT,bT,cT,fT,TableT,funT,rsou(i),tsou(i),psou(i),u)
call mpi_barrier(mpi_comm_world,ierr)
! -------- 得到真实走时 calculate true arrival time at receiver --------
call Linear_Interp_3D(rr,tt,pp,TableT,nr,nt,np,rrec,trec,prec,TtimeT(i,:),nrec)
!if ((myid.eq.0) .and. 1>0) then
! print *, rsou(i),tsou(i)/pi*180,psou(i)/pi*180
! open(100,file='ega5/output/arrivaltime')
! do j=1,nrec
! write(100,'(i5.3,f8.2,f6.2,f6.2,f8.3)') j, rrec(j),trec(j)/pi*180,prec(j)/pi*180,TtimeT(i,j)
! end do
! close(100)
!end if
end do
print *, '----------------- calculating true timetable over ---------------- '
! ######################## 反演开始 inversion start ##########################
! ----- 初始化反演参数 initiate inversion parameters ----
stepsize = 0.01 ! 迭代步长 stepsize
old_obj = 0; obj = 0 ! 目标函数 objective function
if (myid .eq. 0) then
print *, ' '
print *, '----------------- inversion start ... ----------------'
print *, ' '
end if
do iter = 1,MaxIter
call mpi_barrier(mpi_comm_world,ierr)
if (myid .eq. 0) then
print *, '----------------- iteration ',iter,' starting ... ----------------'
end if
! ----- 初始化参数 initiate parameters ------
all_Ks = 0; all_Kxi = 0; all_Keta = 0;
obj = 0;
if (myid .eq. 0) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
filename='ega5/output/misfit_step'//trim(form)
open(998, file=trim(filename))
end if
do i=1,nsou ! loop sources (STATIONS)
! ######################## 计算合成走时场 calculate synthetic timetable ########################
if (myid .eq. 0) then
print *, '----------------- calculating synthetic timetable ... ----------------'
end if
Table = 20
call mpi_barrier(mpi_comm_world,ierr)
call FSM_WENO3_PS_sphe_3d_mul_mpi(rr,tt,pp,nr,nt,np,a,b,c,f,Table,fun,rsou(i),tsou(i),psou(i),u)
call mpi_barrier(mpi_comm_world,ierr)
! -------- 得到合成走时 calculate synthetic arrival time at receiver --------
call Linear_Interp_3D(rr,tt,pp,Table,nr,nt,np,rrec,trec,prec,Ttime(i,:),nrec)
! -------- 构造伴随源 build adjoint source -------
call Adjoint_Source_Dt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! absolute traveltime difference
if (myid .eq. 0) then
do j=1,nrec
write(998,'(f10.5)') Ttime(i,j)-TtimeT(i,j)
end do
end if
! weighting adjoint source
if (weight_rec_bool) then
do j=1,nrec
sourceADJ(j) = sourceADJ(j) * weight_rec(j)
end do
end if
if (1>0 .and. (myid .eq. 0)) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
select case (i)
case (1:9)
write(form2,'(I1)') i
case (10:99)
write(form2,'(I2)') i
end select
filename='ega5/output/syn_step'//trim(form)//'_event'//trim(form2)
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7)') Table(iir,iit,iip)
end do
end do
end do
close(100)
end if
!
!print *, Ttime(i,:),TtimeT(i,:)
!call Adjoint_Source_Ddt(Ttime(i,:),TtimeT(i,:),nrec,sourceADJ,sou_obj) ! double difference traveltime
!do j=1,nrec-1
! do k=j,nrec
! write(998,'(f10.5)') (Ttime(i,j)-Ttime(i,k))-(TtimeT(i,j)-TtimeT(i,k))
! end do
!end do
! ######################## 计算伴随场 adjoint field ########################
if (myid .eq. 0) then
! print *, '----------------- calculating adjoint field ... ----------------'
end if
call FSM_O1_Adj_sphe_3d(rr,tt,pp,nr,nt,np,Table,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ)
!call FSM_O1_Adj_PS_sphe_3d(rr,tt,pp,nr,nt,np,T0para,tau,TableADJ,zeta,xi,eta,nrec,rrec,trec,prec,sourceADJ)
! ---- 记录到 matlab 数据中 matlab record (adjoint field) ----
if (1>0 .and. (myid .eq. 0)) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
select case (i)
case (1:9)
write(form2,'(I1)') i
case (10:99)
write(form2,'(I2)') i
end select
filename='ega5/output/adj_step'//trim(form)//'_event'//trim(form2)
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7)') TableADJ(iir,iit,iip)
end do
end do
end do
close(100)
end if
! ######################## 计算敏感核 sensitivity kernel ########################
!print *, '----------------- calculating kernel ... ----------------'
call Sensitivity_Kernel(rr,tt,pp,nr,nt,np,Table,TableADJ,gamma,xi,eta,fun,Ks,Kxi,Keta)
! ------- 抹去伴随源处的大函数值 mask the source -------
!print *, '----------------- kernel mask ----------------'
!call Kernel_Mask(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i),radius)
!call Kernel_Mask(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i),radius)
!call Kernel_Mask(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i),radius)
call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Ks,rsou(i),tsou(i),psou(i))
call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Kxi,rsou(i),tsou(i),psou(i))
call Kernel_Mask_new(rr,tt,pp,nr,nt,np,Keta,rsou(i),tsou(i),psou(i))
! ---- 记录到 matlab 数据中 matlab record (adjoint field) ----
if (1<0 .and. myid .eq. 0) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
select case (i)
case (1:9)
write(form2,'(I1)') i
case (10:99)
write(form2,'(I2)') i
end select
filename='ega5/output/kernel_step'//trim(form)//'_event'//trim(form2)
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& Ks(iir,iit,iip),Kxi(iir,iit,iip),Keta(iir,iit,iip)
end do
end do
end do
close(100)
end if
! --------- 敏感核,obj叠加 sum kernels and objective function -------
if (weight_sou_bool) then ! no weight
all_Ks = all_Ks + Ks * weight_sou(i);
all_Kxi = all_Kxi + Kxi * weight_sou(i);
all_Keta = all_Keta + Keta * weight_sou(i);
obj = obj + sou_obj !* weight_sou(i)
else ! source weighted
all_Ks = all_Ks + Ks;
all_Kxi = all_Kxi + Kxi;
all_Keta = all_Keta + Keta;
obj = obj + sou_obj
end if
end do
close(998)
! ---- 记录到 matlab 数据中 matlab record (kernel) ----
if (1>0 .and. myid .eq. 0) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
filename='ega5/output/kernel_step'//trim(form)//'_sum'
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& all_Ks(iir,iit,iip),all_Kxi(iir,iit,iip),all_Keta(iir,iit,iip)
end do
end do
end do
close(100)
end if
! ##################### 模型更新 model update ####################
print *, '----------------- model updating ... ----------------'
all_Kernel(:,:,:,1) = all_Ks;
all_Kernel(:,:,:,2) = all_Kxi;
all_Kernel(:,:,:,3) = all_Keta;
! ------------ 更新速度(慢度) update velocity (slowness) ------------
call Parameter_Update_Multigrid(rr,tt,pp,nr,nt,np,all_Kernel,nk, &
& invr,invt,invp,ninvr,ninvt,ninvp,ngrid,stepsize,update_value)
if (1<0 .and. myid .eq. 0) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
filename='ega5/output/model_update_step'//trim(form)
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& -fun(iir,iit,iip)*update_value(iir,iit,iip,1), &
& -update_value(iir,iit,iip,2),-update_value(iir,iit,iip,3)
end do
end do
end do
close(100)
end if
do iir=1,nr
do iit=1,nt
do iip=1,np
fun(iir,iit,iip) = fun(iir,iit,iip)*(1-update_value(iir,iit,iip,1))
!fun(iir,iit,iip) = fun(iir,iit,iip)
end do
end do
end do
! ------------ 更新xi update xi ------------
do iir=1,nr
do iit=1,nt
do iip=1,np
xi(iir,iit,iip) = xi(iir,iit,iip)-update_value(iir,iit,iip,2)
end do
end do
end do
! ------------ 更新eta update eta ------------
do iir=1,nr
do iit=1,nt
do iip=1,np
eta(iir,iit,iip) = eta(iir,iit,iip)-update_value(iir,iit,iip,3)
end do
end do
end do
! ----------- 更新 update eikonal solver paramater -----------------
do iir=1,nr
do iit=1,nt
do iip=1,np
b(iir,iit,iip)=1.0-2*xi(iir,iit,iip);
c(iir,iit,iip)=1.0+2*xi(iir,iit,iip);
f(iir,iit,iip)=-2*eta(iir,iit,iip);
end do
end do
end do
! ##################### 调整下降步长 modify stepsize #############
if (myid .eq. 0) then
print *, ' '
end if
if (1>0 .and. (myid .eq. 0)) then
open(999,file='ega5/output/obj',access='append')
write(999,'(f9.2,f9.6)') obj, stepsize
close(999)
end if
if (iter == 1 ) then
if (myid .eq. 0) then
write(*,'(a,f9.2)') 'iter 1, obj is', obj
write(*,'(a,f9.6)') 'iter 1, stepsize is', stepsize
end if
elseif (iter >= 2 .and. obj < old_obj) then
!stepsize = min(0.01,stepsize*1.2)
if (myid .eq. 0) then
write(*,'(a,f9.2,a,f9.2)') 'objective function decreases, from', old_obj, ' to', obj
write(*,'(a,f9.6)') 'new stepsize is ', stepsize
end if
elseif (iter >= 2 .and. obj >= old_obj) then
!stepsize = max(0.002,stepsize*0.5)
if (myid .eq. 0) then
write(*,'(a,f9.2,a,f9.2)') 'objective function increases, from', old_obj, ' to', obj
write(*,'(a,f9.6)') 'new stepsize is ', stepsize
end if
end if
print *, '----------------- iteration ',iter,' over ----------------'
print *, ' '
print *, ' '
old_obj = obj
! ---- 记录到 matlab 数据中 matlab record ----
if (1>0 .and. (myid .eq. 0)) then
select case (iter)
case (1:9)
write(form,'(I1)') iter
case (10:99)
write(form,'(I2)') iter
end select
filename='ega5/output/model_step'//trim(form)
open(100,file=trim(filename))
do iir=1,nr
do iit=1,nt
do iip=1,np
write(100,'(f13.7,f13.7,f13.7,f13.7,f13.7,f13.7)') &
& rr(iir),tt(iit),pp(iip), &
& fun(iir,iit,iip),xi(iir,iit,iip),eta(iir,iit,iip)
end do
end do
end do
close(100)
end if
if (myid .eq. 0) then
call CPU_TIME(time_end)
write(*,'(f10.2)') time_end - time_begin
end if
end do
call mpi_finalize(ierr)
end program eikonal_2d

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,54 @@
version : 2
domain :
#min_max_dep : [-21.863,308.8137] # depth in km
min_max_dep : [-29.0,301.0] # depth in km
min_max_lat : [28.5,51.5] # latitude in degree
min_max_lon : [13.5,41.5] # longitude in degree
n_rtp : [55,55,55] # number of nodes
source :
#src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree
#src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree
src_rec_file : 'src_rec_test_out.dat' # source receiver file (if found, src_dep_lat_lon is ignored)
#src_rec_file : 'src_rec_compare_with_fortran_out.dat' # source receiver file (if found, src_dep_lat_lon is ignored)
swap_src_rec : 1 # swap source and receiver (1: yes, 0: no)
model :
init_model_type : '' # 'fd' (input file) or '1d_ak135'
init_model_path : './test_model_init.h5' # path to initial model file (ignored if init_model_type is '1d_*')
inversion :
run_mode : 1 # 0 for forward simulation only, 1 for inversion
optim_method : 2 # optimization method. 0 : "grad_descent", 1 : "lbfgs", 2 : "halve-stepping"
smooth_method : 0 # 0: multigrid parametrization, 1: laplacian smoothing with CG
max_iterations_inv : 100 # maximum number of inversion iterations
step_size : 0.01 # step size for inversion
# parameters for multiparametric inversion
n_inversion_grid : 5 # number of inversion grid sets
n_inv_dep_lat_lon : [11,10,10] # number of the base inversion grid points
min_max_dep_inv : [-29.0, 301.0] # depth in km with R = 6371.0
min_max_lat_inv : [30.0,50.0] # latitude in degree
min_max_lon_inv : [15.0,40.0] # longitude in degree
# parameters for laplacian smoothing
l_smooth_rtp : [1,1,1] # smoothing coefficients for each direction
regularization_weight : 2000.0 # regularization weight
# parameter for halving-stepping or lbfgs
max_sub_iterations : 100 # maximum number of sub-iterations
parallel :
n_sims : 1 # number of simultaneous run
ndiv_rtp : [2,2,2] # number of subdomains
nproc_sub : 1 # number of subprocess used for each subdomain
use_gpu : 0
calculation :
convergence_tolerance : 1e-5
max_iterations : 200
stencil_order : 3 # 1 or 3
sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization

View File

@@ -0,0 +1,36 @@
version : 2
domain :
#min_max_dep : [-21.863,308.8137] # depth in km
min_max_dep : [-29.0,301.0] # depth in km
min_max_lat : [28.5,51.5] # latitude in degree
min_max_lon : [13.5,41.5] # longitude in degree
n_rtp : [55,55,55] # number of nodes
source :
#src_dep_lat_lon : [5.0,40.0,24.0] # source depth in km, latitude, longitude in degree
#src_dep_lat_lon : [5750.6370,46.0,36.0] # source depth in km, latitude, longitude in degree
src_rec_file : 'src_rec_test.dat' # source receiver file (if found, src_dep_lat_lon is ignored)
#src_rec_file : 'src_rec_compare_with_fortran.txt' # source receiver file (if found, src_dep_lat_lon is ignored)
swap_src_rec : 1 # swap source and receiver
model :
init_model_type : '' # 'fd' (input file) or '1d_ak135'
init_model_path : './test_model_true.h5' # path to initial model file (ignored if init_model_type is '1d_*')
inversion :
run_mode : 0 # 0 for forward simulation only, 1 for inversion
n_inversion_grid : 1
parallel :
n_sims : 1 # number of simultaneous run
ndiv_rtp : [1,1,1] # number of subdomains
nproc_sub : 8 # number of subprocess used for each subdomain
calculation :
convergence_tolerance : 1e-5
max_iterations : 200
stencil_order : 3 # 1 or 3
sweep_type : 2 # 0: legacy, 1: cuthill-mckee with shm parallelization

View File

@@ -0,0 +1,328 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# notebook for create init and true test model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import math\n",
"\n",
"# grid\n",
"#R_earth = 6378.1370\n",
"R_earth = 6371.0\n",
"\n",
"rr1=6070\n",
"rr2=6400\n",
"tt1=(30.0-1.5)/180*math.pi\n",
"tt2=(50.0+1.5)/180*math.pi\n",
"pp1=(15.0-1.5)/180*math.pi\n",
"pp2=(40.0+1.5)/180*math.pi\n",
"\n",
"n_rtp = [55,55,55]\n",
"n_rtp.reverse()\n",
"dr = (rr2-rr1)/(n_rtp[2]-1)\n",
"dt = (tt2-tt1)/(n_rtp[1]-1)\n",
"dp = (pp2-pp1)/(n_rtp[0]-1)\n",
"rr = np.array([rr1 + x*dr for x in range(n_rtp[2])])\n",
"tt = np.array([tt1 + x*dt for x in range(n_rtp[1])])\n",
"pp = np.array([pp1 + x*dp for x in range(n_rtp[0])])\n",
"\n",
"# initial model\n",
"gamma = 0.0\n",
"s0 = 1.0/6.0\n",
"slow_p=0.04\n",
"ani_p=0.03\n",
"\n",
"eta_init = np.zeros(n_rtp)\n",
"xi_init = np.zeros(n_rtp)\n",
"zeta_init = np.zeros(n_rtp)\n",
"fun_init = np.zeros(n_rtp)\n",
"vel_init = np.zeros(n_rtp)\n",
"a_init = np.zeros(n_rtp)\n",
"b_init = np.zeros(n_rtp)\n",
"c_init = np.zeros(n_rtp)\n",
"f_init = np.zeros(n_rtp)\n",
"\n",
"# true model\n",
"eta_true = np.zeros(n_rtp)\n",
"xi_true = np.zeros(n_rtp)\n",
"zeta_true = np.zeros(n_rtp)\n",
"fun_true = np.zeros(n_rtp)\n",
"vel_true = np.zeros(n_rtp)\n",
"a_true = np.zeros(n_rtp)\n",
"b_true = np.zeros(n_rtp)\n",
"c_true = np.zeros(n_rtp)\n",
"f_true = np.zeros(n_rtp)\n",
"\n",
"c=0\n",
"for ir in range(n_rtp[2]):\n",
" for it in range(n_rtp[1]):\n",
" for ip in range(n_rtp[0]):\n",
" #eta_init[ip,it,ir] = 0.0\n",
" #xi_init[ip,it,ir] = 0.0\n",
" zeta_init[ip,it,ir] = gamma*math.sqrt(eta_init[ip,it,ir]**2 + xi_init[ip,it,ir]**2)\n",
" \n",
" if (rr[ir]>6351):\n",
" fun_init[ip,it,ir] = 1.0/(5.8+(6371-rr[ir])/20.0*0.7)\n",
" elif (rr[ir]>6336):\n",
" fun_init[ip,it,ir] = 1.0/(6.5+(6351-rr[ir])/15.0*0.6)\n",
" elif (rr[ir]>5961):\n",
" fun_init[ip,it,ir] = 1.0/(8.0+(6336-rr[ir])/375.0*1) \n",
" else:\n",
" fun_init[ip,it,ir] = 1.0/9.0\n",
"\n",
" vel_init[ip,it,ir] = 1.0/fun_init[ip,it,ir]\n",
" a_init[ip,it,ir] = 1.0 + 2.0*zeta_init[ip,it,ir]\n",
" b_init[ip,it,ir] = 1.0 - 2.0*xi_init[ip,it,ir]\n",
" c_init[ip,it,ir] = 1.0 + 2.0*xi_init[ip,it,ir]\n",
" f_init[ip,it,ir] = -2.0 * eta_init[ip,it,ir]\n",
"\n",
" # true model\n",
" if (tt[it] >= 30.0/180.0*math.pi and tt[it] <= 50.0/180.0*math.pi \\\n",
" and pp[ip] >= 15.0/180.0*math.pi and pp[ip] <= 40.0/180.0*math.pi \\\n",
" and rr[ir] >= 6211.0 and rr[ir] <= 6371.0):\n",
" c+=1\n",
" sigma = math.sin(4.0*math.pi*(tt[it]-30.0/180.0*math.pi)/(20.0/180.0*math.pi)) \\\n",
" *math.sin(4.0*math.pi*(pp[ip]-15.0/180.0*math.pi)/(25.0/180.0*math.pi)) \\\n",
" *math.sin(2.0*math.pi*(rr[ir]-6211.0)/160.0)\n",
" else:\n",
" sigma = 0.0\n",
"\n",
" if sigma < 0:\n",
" psi = 60.0/180.0*math.pi\n",
" elif sigma > 0:\n",
" psi = 150.0/180.0*math.pi\n",
" else:\n",
" psi = 0.0\n",
"\n",
" eta_true[ip,it,ir] = ani_p*abs(sigma)*math.sin(2.0*psi)\n",
" xi_true[ip,it,ir] = ani_p*abs(sigma)*math.cos(2.0*psi)\n",
" zeta_true[ip,it,ir] = gamma*math.sqrt(eta_true[ip,it,ir]**2 + xi_true[ip,it,ir]**2)\n",
" fun_true[ip,it,ir] = fun_init[ip,it,ir]/(1.0+sigma*slow_p)\n",
" vel_true[ip,it,ir] = 1.0/fun_true[ip,it,ir] \n",
" a_true[ip,it,ir] = 1.0 + 2.0*zeta_true[ip,it,ir]\n",
" b_true[ip,it,ir] = 1.0 - 2.0*xi_true[ip,it,ir]\n",
" c_true[ip,it,ir] = 1.0 + 2.0*xi_true[ip,it,ir]\n",
" f_true[ip,it,ir] = -2.0 * eta_true[ip,it,ir]\n",
"\n",
"\n",
"\n",
"print(\"depminmax {} {}\".format(R_earth-rr1,R_earth-rr2))\n",
"print(c)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# write out\n",
"import h5py\n",
"\n",
"fout_init = h5py.File('test_model_init.h5', 'w')\n",
"fout_true = h5py.File('test_model_true.h5', 'w')\n",
"\n",
"# write out the arrays eta_init, xi_init, zeta_init, fun_init, a_init, b_init, c_init, f_init\n",
"fout_init.create_dataset('eta', data=eta_init.T)\n",
"fout_init.create_dataset('xi', data=xi_init.T)\n",
"fout_init.create_dataset('zeta', data=zeta_init.T)\n",
"fout_init.create_dataset('fun', data=fun_init.T)\n",
"fout_init.create_dataset('fac_a', data=a_init.T)\n",
"fout_init.create_dataset('fac_b', data=b_init.T)\n",
"fout_init.create_dataset('fac_c', data=c_init.T)\n",
"fout_init.create_dataset('fac_f', data=f_init.T)\n",
"fout_init.create_dataset('vel', data=vel_init.T)\n",
"\n",
"# writeout the arrays eta_true, xi_true, zeta_true, fun_true, a_true, b_true, c_true, f_true\n",
"fout_true.create_dataset('eta', data=eta_true.T)\n",
"fout_true.create_dataset('xi', data=xi_true.T)\n",
"fout_true.create_dataset('zeta', data=zeta_true.T)\n",
"fout_true.create_dataset('fun', data=fun_true.T)\n",
"fout_true.create_dataset('fac_a', data=a_true.T)\n",
"fout_true.create_dataset('fac_b', data=b_true.T)\n",
"fout_true.create_dataset('fac_c', data=c_true.T)\n",
"fout_true.create_dataset('fac_f', data=f_true.T)\n",
"fout_true.create_dataset('vel', data=vel_true.T)\n",
"\n",
"fout_init.close()\n",
"fout_true.close()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# prepare src station file\n",
"\n",
"```\n",
" 26 1992 1 1 2 43 56.900 1.8000 98.9000 137.00 2.80 8 305644 <- src  : id_src year month day hour min sec lat lon dep_km mag num_recs id_event\n",
" 26 1 PCBI 1.8900 98.9253 1000.0000 P 10.40 18.000 <- arrival : id_src id_rec name_rec lat lon elevation_m phase epicentral_distance_km arrival_time_sec\n",
" 26 2 MRPI 1.6125 99.3172 1100.0000 P 50.84 19.400\n",
" 26 3 HUTI 2.3153 98.9711 1600.0000 P 57.84 19.200\n",
"\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"random.seed(1145141919810)\n",
"\n",
"# dummys\n",
"year_dummy = 1998\n",
"month_dummy = 1\n",
"day_dummy = 1\n",
"hour_dummy = 0\n",
"minute_dummy = 0\n",
"second_dummy = 0\n",
"mag_dummy = 3.0\n",
"id_dummy = 1000\n",
"st_name_dummy = 'AAAA'\n",
"phase_dummy = 'P'\n",
"dist_dummy = 100.0\n",
"arriv_t_dummy = 0.0\n",
"\n",
"tt1deg = tt1 * 180.0/math.pi\n",
"tt2deg = tt2 * 180.0/math.pi\n",
"pp1deg = pp1 * 180.0/math.pi\n",
"pp2deg = pp2 * 180.0/math.pi\n",
"\n",
"\n",
"n_src = 500\n",
"n_rec = [60 for x in range(n_src)]\n",
"#n_src = 10\n",
"#n_rec = [10 for x in range(n_src)]\n",
"\n",
"\n",
"\n",
"lines = []\n",
"\n",
"pos_src=[]\n",
"pos_rec=[]\n",
"\n",
"# create receiver coordinates\n",
"elev_recs=[]\n",
"lon_recs=[]\n",
"lat_recs=[]\n",
"rec_names=[]\n",
"for i in range(n_rec[0]):\n",
" #elev_recs.append(random.uniform(-100.0,-100.0)) # elevation in m\n",
" elev_recs.append(0) # elevation in m\n",
" lon_recs .append(random.uniform(pp1deg*1.1,pp2deg*0.9))\n",
" lat_recs .append(random.uniform(tt1deg*1.1,tt2deg*0.9))\n",
" rec_names.append(i)\n",
"\n",
"\n",
"\n",
"# create dummy src\n",
"for i_src in range(n_src):\n",
" # define one point in the domain (rr1 bottom, rr2 top)\n",
" dep = random.uniform((R_earth-rr1)*0.1,(R_earth-rr1)*0.9)\n",
" lon = random.uniform(pp1deg,pp2deg)\n",
" lat = random.uniform(tt1deg,tt2deg)\n",
"\n",
" src = [i_src, year_dummy, month_dummy, day_dummy, hour_dummy, minute_dummy, second_dummy, lat, lon, dep, mag_dummy, n_rec[i_src], id_dummy]\n",
" lines.append(src)\n",
"\n",
" pos_src.append([lon,lat,dep])\n",
"\n",
" # create dummy station\n",
" for i_rec in range(n_rec[i_src]):\n",
" #elev_rec = random.uniform(0.0,-10.0) # elevation in m\n",
" #lon_rec = random.uniform(pp1deg,pp2deg)\n",
" #lat_rec = random.uniform(tt1deg,tt2deg)\n",
" elev_rec = elev_recs[i_rec]\n",
" lon_rec = lon_recs[i_rec]\n",
" lat_rec = lat_recs[i_rec]\n",
" st_name_dummy = rec_names[i_rec]\n",
"\n",
"\n",
" rec = [i_src, i_rec, st_name_dummy, lat_rec, lon_rec, elev_rec, phase_dummy, dist_dummy, arriv_t_dummy]\n",
" lines.append(rec)\n",
"\n",
" pos_rec.append([lon_rec,lat_rec,elev_rec])\n",
"\n",
"# write out ev_arrivals file\n",
"fname = 'src_rec_test.dat'\n",
"\n",
"with open(fname, 'w') as f:\n",
" for line in lines:\n",
" for elem in line:\n",
" f.write('{} '.format(elem))\n",
" f.write('\\n')\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# draw src and rec positions\n",
"import matplotlib.pyplot as plt\n",
"\n",
"for i_src in range(n_src):\n",
" plt.scatter(pos_src[i_src][1],pos_src[i_src][0],c='r',marker='o')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# plot receivers\n",
"for i_rec in range(n_rec[0]):\n",
" plt.scatter(pos_rec[i_rec][1],pos_rec[i_rec][0],c='b',marker='o')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.1 64-bit ('3.9.1')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.1"
},
"vscode": {
"interpreter": {
"hash": "02f83e1f4cd9619657a6845405e2dd67c4de23753ba48bca5dce2ebf57b3813a"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}