Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
GPIAG-Software
IFOS3D
Commits
2607899f
Commit
2607899f
authored
Aug 12, 2016
by
Tilman Steinweg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
imolemented structs
parent
d000f3eb
Changes
46
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
46 changed files
with
3596 additions
and
3616 deletions
+3596
-3616
src/CPML_coeff.c
src/CPML_coeff.c
+57
-62
src/av_mat.c
src/av_mat.c
+10
-13
src/checkfd_ssg.c
src/checkfd_ssg.c
+19
-20
src/comm_ini.c
src/comm_ini.c
+15
-16
src/comm_ini_s.c
src/comm_ini_s.c
+13
-16
src/conjugategrad.c
src/conjugategrad.c
+22
-22
src/constant_boundary.c
src/constant_boundary.c
+49
-49
src/cpmodel.c
src/cpmodel.c
+38
-24
src/disc_fourier.c
src/disc_fourier.c
+7
-7
src/exchange_Fv.c
src/exchange_Fv.c
+71
-59
src/exchange_s.c
src/exchange_s.c
+49
-53
src/exchange_v.c
src/exchange_v.c
+51
-54
src/fd.h
src/fd.h
+204
-189
src/gradient_F.c
src/gradient_F.c
+50
-50
src/hess_F.c
src/hess_F.c
+53
-53
src/hess_apply.c
src/hess_apply.c
+13
-13
src/hh.c
src/hh.c
+12
-13
src/hh_3DSchach.c
src/hh_3DSchach.c
+9
-9
src/hh_toy_start.c
src/hh_toy_start.c
+7
-8
src/hh_toy_true.c
src/hh_toy_true.c
+27
-28
src/ifos3d.c
src/ifos3d.c
+514
-513
src/lbfgs.c
src/lbfgs.c
+9
-9
src/lbfgs_save.c
src/lbfgs_save.c
+4
-4
src/matcopy.c
src/matcopy.c
+61
-62
src/model2_5D.c
src/model2_5D.c
+12
-12
src/modelupdate.c
src/modelupdate.c
+20
-20
src/outmod.c
src/outmod.c
+4
-4
src/precongrad.c
src/precongrad.c
+46
-46
src/psource.c
src/psource.c
+3
-3
src/readhess.c
src/readhess.c
+7
-7
src/readmod.c
src/readmod.c
+7
-8
src/saveseis.c
src/saveseis.c
+14
-16
src/seismo_ssg.c
src/seismo_ssg.c
+57
-59
src/snap_ssg.c
src/snap_ssg.c
+39
-40
src/surface_ssg.c
src/surface_ssg.c
+157
-159
src/surface_ssg_elastic.c
src/surface_ssg_elastic.c
+109
-110
src/update_s_ssg.c
src/update_s_ssg.c
+422
-424
src/update_s_ssg_CPML.c
src/update_s_ssg_CPML.c
+407
-412
src/update_s_ssg_CPML_elastic.c
src/update_s_ssg_CPML_elastic.c
+226
-230
src/update_s_ssg_elastic.c
src/update_s_ssg_elastic.c
+263
-263
src/update_v_ssg.c
src/update_v_ssg.c
+204
-216
src/update_v_ssg_CPML.c
src/update_v_ssg_CPML.c
+183
-189
src/writemod.c
src/writemod.c
+2
-2
src/zero_grad.c
src/zero_grad.c
+4
-4
src/zero_invers.c
src/zero_invers.c
+13
-13
src/zero_wavefield.c
src/zero_wavefield.c
+33
-33
No files found.
src/CPML_coeff.c
View file @
2607899f
...
...
@@ -84,12 +84,7 @@
#include "fd.h"
void
CPML_coeff
(
float
*
K_x
,
float
*
alpha_prime_x
,
float
*
a_x
,
float
*
b_x
,
float
*
K_x_half
,
float
*
alpha_prime_x_half
,
float
*
a_x_half
,
float
*
b_x_half
,
float
*
K_y
,
float
*
alpha_prime_y
,
float
*
a_y
,
float
*
b_y
,
float
*
K_y_half
,
float
*
alpha_prime_y_half
,
float
*
a_y_half
,
float
*
b_y_half
,
float
*
K_z
,
float
*
alpha_prime_z
,
float
*
a_z
,
float
*
b_z
,
float
*
K_z_half
,
float
*
alpha_prime_z_half
,
float
*
a_z_half
,
float
*
b_z_half
)
void
CPML_coeff
(
st_pml_coeff
*
pml_coeff
)
{
extern
float
DX
,
DY
,
DZ
,
VPPML
,
DT
,
FPML
;
...
...
@@ -126,7 +121,7 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
for
(
i
=
1
;
i
<=
FW
+
1
;
i
++
){
K_x
[
i
]
=
1
.
0
;
pml_coeff
->
K_x
[
i
]
=
1
.
0
;
/* define damping profile at the grid points */
position_in_PML
=
(
FW
-
i
+
1
)
*
DX
;
/*distance to boundary in meter */
...
...
@@ -135,16 +130,16 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
d_x
[
i
]
=
d0_x
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
/* this taken from Gedney page 8.2 */
K_x
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_x
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_x
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_x
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
if
(
alpha_prime_x
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_x[i] < 0.0, i %d"
,
i
);}
if
(
pml_coeff
->
alpha_prime_x
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_x[i] < 0.0, i %d"
,
i
);}
b_x
[
i
]
=
exp
(
-
(
d_x
[
i
]
/
K_x
[
i
]
+
alpha_prime_x
[
i
])
*
DT
);
pml_coeff
->
b_x
[
i
]
=
exp
(
-
(
d_x
[
i
]
/
pml_coeff
->
K_x
[
i
]
+
pml_coeff
->
alpha_prime_x
[
i
])
*
DT
);
/* avoid division by zero outside the PML */
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
a_x
[
i
]
=
d_x
[
i
]
*
(
b_x
[
i
]
-
1
.
0
)
/
(
K_x
[
i
]
*
(
d_x
[
i
]
+
K_x
[
i
]
*
alpha_prime_x
[
i
]));}
else
a_x
[
i
]
=
0
.
0
;
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
pml_coeff
->
a_x
[
i
]
=
d_x
[
i
]
*
(
pml_coeff
->
b_x
[
i
]
-
1
.
0
)
/
(
pml_coeff
->
K_x
[
i
]
*
(
d_x
[
i
]
+
pml_coeff
->
K_x
[
i
]
*
pml_coeff
->
alpha_prime_x
[
i
]));}
else
pml_coeff
->
a_x
[
i
]
=
0
.
0
;
if
(
i
<=
FW
){
...
...
@@ -154,35 +149,35 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
i1
=
i
;
K_x_half
[
i1
]
=
1
.
0
;
pml_coeff
->
K_x_half
[
i1
]
=
1
.
0
;
d_x_half
[
i1
]
=
d0_x
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
if
(
position_in_PML
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR: Position in PML (x-boundary) smaller 0"
);}
/* this taken from Gedney page 8.2 */
K_x_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_x_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_x_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_x_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
/* just in case, for -5 at the end */
if
(
alpha_prime_x_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_x_half[i] < 0.0, i %d"
,
i
);}
if
(
pml_coeff
->
alpha_prime_x_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_x_half[i] < 0.0, i %d"
,
i
);}
b_x_half
[
i1
]
=
exp
(
-
(
d_x_half
[
i1
]
/
K_x_half
[
i1
]
+
alpha_prime_x_half
[
i1
])
*
DT
);
pml_coeff
->
b_x_half
[
i1
]
=
exp
(
-
(
d_x_half
[
i1
]
/
pml_coeff
->
K_x_half
[
i1
]
+
pml_coeff
->
alpha_prime_x_half
[
i1
])
*
DT
);
if
(
abs
(
d_x_half
[
i1
])
>
1.0e-6
){
a_x_half
[
i1
]
=
d_x_half
[
i1
]
*
(
b_x_half
[
i1
]
-
1
.
0
)
/
(
K_x_half
[
i1
]
*
(
d_x_half
[
i1
]
+
K_x_half
[
i1
]
*
alpha_prime_x_half
[
i1
]));}
if
(
abs
(
d_x_half
[
i1
])
>
1.0e-6
){
pml_coeff
->
a_x_half
[
i1
]
=
d_x_half
[
i1
]
*
(
pml_coeff
->
b_x_half
[
i1
]
-
1
.
0
)
/
(
pml_coeff
->
K_x_half
[
i1
]
*
(
d_x_half
[
i1
]
+
pml_coeff
->
K_x_half
[
i1
]
*
pml_coeff
->
alpha_prime_x_half
[
i1
]));}
/* right boundary --> mirroring left boundary*/
l
=
2
*
FW
-
i
+
1
;
if
(
i
>
1
){
K_x
[
l
+
1
]
=
K_x
[
i
];
b_x
[
l
+
1
]
=
b_x
[
i
];
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
a_x
[
l
+
1
]
=
a_x
[
i
];
}
pml_coeff
->
K_x
[
l
+
1
]
=
pml_coeff
->
K_x
[
i
];
pml_coeff
->
b_x
[
l
+
1
]
=
pml_coeff
->
b_x
[
i
];
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
pml_coeff
->
a_x
[
l
+
1
]
=
pml_coeff
->
a_x
[
i
];
}
}
K_x_half
[
l
]
=
K_x_half
[
i
];
b_x_half
[
l
]
=
b_x_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
a_x_half
[
l
]
=
a_x_half
[
i
];
}
pml_coeff
->
K_x_half
[
l
]
=
pml_coeff
->
K_x_half
[
i
];
pml_coeff
->
b_x_half
[
l
]
=
pml_coeff
->
b_x_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_x
[
i
])
>
1.0e-6
){
pml_coeff
->
a_x_half
[
l
]
=
pml_coeff
->
a_x_half
[
i
];
}
}
}
...
...
@@ -194,7 +189,7 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
for
(
i
=
1
;
i
<=
FW
+
1
;
i
++
){
K_y
[
i
]
=
1
.
0
;
pml_coeff
->
K_y
[
i
]
=
1
.
0
;
/* define damping profile at the grid points */
position_in_PML
=
(
FW
-
i
+
1
)
*
DY
;
/*distance to boundary in meter */
...
...
@@ -203,17 +198,17 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
d_y
[
i
]
=
d0_y
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
/* this taken from Gedney page 8.2 */
K_y
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_y
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_y
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_y
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
/* just in case, for -5 at the end */
if
(
alpha_prime_y
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_y[i] < 0.0, i %d"
,
i
);}
if
(
pml_coeff
->
alpha_prime_y
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_y[i] < 0.0, i %d"
,
i
);}
b_y
[
i
]
=
exp
(
-
(
d_y
[
i
]
/
K_y
[
i
]
+
alpha_prime_y
[
i
])
*
DT
);
pml_coeff
->
b_y
[
i
]
=
exp
(
-
(
d_y
[
i
]
/
pml_coeff
->
K_y
[
i
]
+
pml_coeff
->
alpha_prime_y
[
i
])
*
DT
);
/* avoid division by zero outside the PML */
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
a_y
[
i
]
=
d_y
[
i
]
*
(
b_y
[
i
]
-
1
.
0
)
/
(
K_y
[
i
]
*
(
d_y
[
i
]
+
K_y
[
i
]
*
alpha_prime_y
[
i
]));}
else
a_x
[
i
]
=
0
.
0
;
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
pml_coeff
->
a_y
[
i
]
=
d_y
[
i
]
*
(
pml_coeff
->
b_y
[
i
]
-
1
.
0
)
/
(
pml_coeff
->
K_y
[
i
]
*
(
d_y
[
i
]
+
pml_coeff
->
K_y
[
i
]
*
pml_coeff
->
alpha_prime_y
[
i
]));}
else
pml_coeff
->
a_x
[
i
]
=
0
.
0
;
if
(
i
<=
FW
){
...
...
@@ -222,33 +217,33 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
position_norm
=
position_in_PML
/
(
FW
*
DY
);
i1
=
i
;
K_y_half
[
i1
]
=
1
.
0
;
pml_coeff
->
K_y_half
[
i1
]
=
1
.
0
;
d_y_half
[
i1
]
=
d0_y
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
if
(
position_in_PML
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR: Position in PML (y-boundary) <0"
);}
/* this taken from Gedney page 8.2 */
K_y_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_y_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_y_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_y_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
if
(
alpha_prime_y_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_y_half[i] < 0.0, i %d"
,
i
);}
b_y_half
[
i1
]
=
exp
(
-
(
d_y_half
[
i1
]
/
K_y_half
[
i1
]
+
alpha_prime_y_half
[
i1
])
*
DT
);
if
(
pml_coeff
->
alpha_prime_y_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_y_half[i] < 0.0, i %d"
,
i
);}
pml_coeff
->
b_y_half
[
i1
]
=
exp
(
-
(
d_y_half
[
i1
]
/
pml_coeff
->
K_y_half
[
i1
]
+
pml_coeff
->
alpha_prime_y_half
[
i1
])
*
DT
);
if
(
abs
(
d_y_half
[
i1
])
>
1.0e-6
){
a_y_half
[
i1
]
=
d_y_half
[
i1
]
*
(
b_y_half
[
i1
]
-
1
.
0
)
/
(
K_y_half
[
i1
]
*
(
d_y_half
[
i1
]
+
K_y_half
[
i1
]
*
alpha_prime_y_half
[
i1
]));}
if
(
abs
(
d_y_half
[
i1
])
>
1.0e-6
){
pml_coeff
->
a_y_half
[
i1
]
=
d_y_half
[
i1
]
*
(
pml_coeff
->
b_y_half
[
i1
]
-
1
.
0
)
/
(
pml_coeff
->
K_y_half
[
i1
]
*
(
d_y_half
[
i1
]
+
pml_coeff
->
K_y_half
[
i1
]
*
pml_coeff
->
alpha_prime_y_half
[
i1
]));}
/* right boundary --> mirroring left boundary*/
l
=
2
*
FW
-
i
+
1
;
if
(
i
>
1
){
K_y
[
l
+
1
]
=
K_y
[
i
];
b_y
[
l
+
1
]
=
b_y
[
i
];
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
a_y
[
l
+
1
]
=
a_y
[
i
];
}
pml_coeff
->
K_y
[
l
+
1
]
=
pml_coeff
->
K_y
[
i
];
pml_coeff
->
b_y
[
l
+
1
]
=
pml_coeff
->
b_y
[
i
];
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
pml_coeff
->
a_y
[
l
+
1
]
=
pml_coeff
->
a_y
[
i
];
}
}
K_y_half
[
l
]
=
K_y_half
[
i
];
b_y_half
[
l
]
=
b_y_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
a_y_half
[
l
]
=
a_y_half
[
i
];
}
pml_coeff
->
K_y_half
[
l
]
=
pml_coeff
->
K_y_half
[
i
];
pml_coeff
->
b_y_half
[
l
]
=
pml_coeff
->
b_y_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_y
[
i
])
>
1.0e-6
){
pml_coeff
->
a_y_half
[
l
]
=
pml_coeff
->
a_y_half
[
i
];
}
}
}
...
...
@@ -258,7 +253,7 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
for
(
i
=
1
;
i
<=
FW
+
1
;
i
++
){
K_z
[
i
]
=
1
.
0
;
pml_coeff
->
K_z
[
i
]
=
1
.
0
;
/* define damping profile at the grid points */
position_in_PML
=
(
FW
-
i
+
1
)
*
DZ
;
/*distance to boundary in meter */
...
...
@@ -267,16 +262,16 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
d_z
[
i
]
=
d0_z
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
/* this taken from Gedney page 8.2 */
K_z
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_z
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_z
[
i
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_z
[
i
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
/* just in case, for -5 at the end */
if
(
alpha_prime_z
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_z[i] < 0.0, i %d"
,
i
);}
if
(
pml_coeff
->
alpha_prime_z
[
i
]
<
0
.
0
){
fprintf
(
FP
,
"ERROR:alpha_prime_z[i] < 0.0, i %d"
,
i
);}
b_z
[
i
]
=
exp
(
-
(
d_z
[
i
]
/
K_z
[
i
]
+
alpha_prime_z
[
i
])
*
DT
);
pml_coeff
->
b_z
[
i
]
=
exp
(
-
(
d_z
[
i
]
/
pml_coeff
->
K_z
[
i
]
+
pml_coeff
->
alpha_prime_z
[
i
])
*
DT
);
/* avoid division by zero outside the PML */
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
a_z
[
i
]
=
d_z
[
i
]
*
(
b_z
[
i
]
-
1
.
0
)
/
(
K_z
[
i
]
*
(
d_z
[
i
]
+
K_z
[
i
]
*
alpha_prime_z
[
i
]));}
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
pml_coeff
->
a_z
[
i
]
=
d_z
[
i
]
*
(
pml_coeff
->
b_z
[
i
]
-
1
.
0
)
/
(
pml_coeff
->
K_z
[
i
]
*
(
d_z
[
i
]
+
pml_coeff
->
K_z
[
i
]
*
pml_coeff
->
alpha_prime_z
[
i
]));}
if
(
i
<=
FW
){
/* define damping profile at half the grid points (half a grid point in -x)*/
...
...
@@ -285,34 +280,34 @@ void CPML_coeff(float * K_x, float * alpha_prime_x, float * a_x, float * b_x,
i1
=
i
;
K_z_half
[
i1
]
=
1
.
0
;
pml_coeff
->
K_z_half
[
i1
]
=
1
.
0
;
d_z_half
[
i1
]
=
d0_z
*
(
a
*
position_norm
+
b
*
pow
(
position_norm
,
npower
)
+
c
*
pow
(
position_norm
,(
4
)));
if
(
position_in_PML
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR: Position in PML (y-boundary) <0"
);}
/* this taken from Gedney page 8.2 */
K_z_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
alpha_prime_z_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
pml_coeff
->
K_z_half
[
i1
]
=
1
.
0
+
(
k_max_PML
-
1
.
0
)
*
pow
(
position_norm
,
npower
);
pml_coeff
->
alpha_prime_z_half
[
i1
]
=
alpha_max_PML
*
(
1
.
0
-
position_norm
);
if
(
alpha_prime_z_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_z_half[i] < 0.0, i %d"
,
i
);}
if
(
pml_coeff
->
alpha_prime_z_half
[
i1
]
<
0
.
0
)
{
fprintf
(
FP
,
"ERROR:alpha_prime_z_half[i] < 0.0, i %d"
,
i
);}
b_z_half
[
i1
]
=
exp
(
-
(
d_z_half
[
i1
]
/
K_z_half
[
i1
]
+
alpha_prime_z_half
[
i1
])
*
DT
);
pml_coeff
->
b_z_half
[
i1
]
=
exp
(
-
(
d_z_half
[
i1
]
/
pml_coeff
->
K_z_half
[
i1
]
+
pml_coeff
->
alpha_prime_z_half
[
i1
])
*
DT
);
if
(
abs
(
d_z_half
[
i1
])
>
1.0e-6
){
a_z_half
[
i1
]
=
d_z_half
[
i1
]
*
(
b_z_half
[
i1
]
-
1
.
0
)
/
(
K_z_half
[
i1
]
*
(
d_z_half
[
i1
]
+
K_z_half
[
i1
]
*
alpha_prime_z_half
[
i1
]));}
if
(
abs
(
d_z_half
[
i1
])
>
1.0e-6
){
pml_coeff
->
a_z_half
[
i1
]
=
d_z_half
[
i1
]
*
(
pml_coeff
->
b_z_half
[
i1
]
-
1
.
0
)
/
(
pml_coeff
->
K_z_half
[
i1
]
*
(
d_z_half
[
i1
]
+
pml_coeff
->
K_z_half
[
i1
]
*
pml_coeff
->
alpha_prime_z_half
[
i1
]));}
/* right boundary --> mirroring left boundary*/
l
=
2
*
FW
-
i
+
1
;
if
(
i
>
1
){
K_z
[
l
+
1
]
=
K_z
[
i
];
b_z
[
l
+
1
]
=
b_z
[
i
];
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
a_z
[
l
+
1
]
=
a_z
[
i
];
}
pml_coeff
->
K_z
[
l
+
1
]
=
pml_coeff
->
K_z
[
i
];
pml_coeff
->
b_z
[
l
+
1
]
=
pml_coeff
->
b_z
[
i
];
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
pml_coeff
->
a_z
[
l
+
1
]
=
pml_coeff
->
a_z
[
i
];
}
}
K_z_half
[
l
]
=
K_z_half
[
i
];
b_z_half
[
l
]
=
b_z_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
a_z_half
[
l
]
=
a_z_half
[
i
];
}
pml_coeff
->
K_z_half
[
l
]
=
pml_coeff
->
K_z_half
[
i
];
pml_coeff
->
b_z_half
[
l
]
=
pml_coeff
->
b_z_half
[
i
];
/*half a grid point in +x)*/
if
(
abs
(
d_z
[
i
])
>
1.0e-6
){
pml_coeff
->
a_z_half
[
l
]
=
pml_coeff
->
a_z_half
[
i
];
}
}
}
free_vector
(
d_x
,
1
,
2
*
FW
);
...
...
src/av_mat.c
View file @
2607899f
...
...
@@ -25,10 +25,7 @@
#include "fd.h"
void
av_mat
(
float
***
rho
,
float
***
pi
,
float
***
u
,
float
***
taus
,
float
***
taup
,
float
***
uipjp
,
float
***
ujpkp
,
float
***
uipkp
,
float
***
tausipjp
,
float
***
tausjpkp
,
float
***
tausipkp
,
float
***
rjp
,
float
***
rkp
,
float
***
rip
){
void
av_mat
(
st_model
*
mod
,
st_model_av
*
mod_av
){
extern
int
NX
,
NY
,
NZ
,
MYID
,
L
,
VERBOSE
;
...
...
@@ -48,20 +45,20 @@ float *** tausjpkp, float *** tausipkp, float *** rjp, float *** rkp, float
/* harmonic averaging of shear modulus */
uipjp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
u
[
j
][
i
][
k
])
+
(
1
.
0
/
u
[
j
][
i
+
1
][
k
])
+
(
1
.
0
/
u
[
j
+
1
][
i
+
1
][
k
])
+
(
1
.
0
/
u
[
j
+
1
][
i
][
k
]));
ujpkp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
u
[
j
][
i
][
k
])
+
(
1
.
0
/
u
[
j
][
i
][
k
+
1
])
+
(
1
.
0
/
u
[
j
+
1
][
i
][
k
+
1
])
+
(
1
.
0
/
u
[
j
+
1
][
i
][
k
]));
uipkp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
u
[
j
][
i
][
k
])
+
(
1
.
0
/
u
[
j
][
i
][
k
+
1
])
+
(
1
.
0
/
u
[
j
][
i
+
1
][
k
+
1
])
+
(
1
.
0
/
u
[
j
][
i
+
1
][
k
]));
mod_av
->
uipjp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
mod
->
u
[
j
][
i
][
k
])
+
(
1
.
0
/
mod
->
u
[
j
][
i
+
1
][
k
])
+
(
1
.
0
/
mod
->
u
[
j
+
1
][
i
+
1
][
k
])
+
(
1
.
0
/
mod
->
u
[
j
+
1
][
i
][
k
]));
mod_av
->
ujpkp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
mod
->
u
[
j
][
i
][
k
])
+
(
1
.
0
/
mod
->
u
[
j
][
i
][
k
+
1
])
+
(
1
.
0
/
mod
->
u
[
j
+
1
][
i
][
k
+
1
])
+
(
1
.
0
/
mod
->
u
[
j
+
1
][
i
][
k
]));
mod_av
->
uipkp
[
j
][
i
][
k
]
=
4
.
0
/
((
1
.
0
/
mod
->
u
[
j
][
i
][
k
])
+
(
1
.
0
/
mod
->
u
[
j
][
i
][
k
+
1
])
+
(
1
.
0
/
mod
->
u
[
j
][
i
+
1
][
k
+
1
])
+
(
1
.
0
/
mod
->
u
[
j
][
i
+
1
][
k
]));
/* arithmetic averaging of TAU for S-waves and density */
if
(
L
){
tausipjp
[
j
][
i
][
k
]
=
0
.
25
*
(
taus
[
j
][
i
][
k
]
+
taus
[
j
][
i
+
1
][
k
]
+
taus
[
j
+
1
][
i
+
1
][
k
]
+
taus
[
j
+
1
][
i
][
k
]);
tausjpkp
[
j
][
i
][
k
]
=
0
.
25
*
(
taus
[
j
][
i
][
k
]
+
taus
[
j
+
1
][
i
][
k
]
+
taus
[
j
+
1
][
i
][
k
+
1
]
+
taus
[
j
][
i
][
k
+
1
]);
tausipkp
[
j
][
i
][
k
]
=
0
.
25
*
(
taus
[
j
][
i
][
k
]
+
taus
[
j
][
i
+
1
][
k
]
+
taus
[
j
][
i
+
1
][
k
+
1
]
+
taus
[
j
][
i
][
k
+
1
]);
mod_av
->
tausipjp
[
j
][
i
][
k
]
=
0
.
25
*
(
mod
->
taus
[
j
][
i
][
k
]
+
mod
->
taus
[
j
][
i
+
1
][
k
]
+
mod
->
taus
[
j
+
1
][
i
+
1
][
k
]
+
mod
->
taus
[
j
+
1
][
i
][
k
]);
mod_av
->
tausjpkp
[
j
][
i
][
k
]
=
0
.
25
*
(
mod
->
taus
[
j
][
i
][
k
]
+
mod
->
taus
[
j
+
1
][
i
][
k
]
+
mod
->
taus
[
j
+
1
][
i
][
k
+
1
]
+
mod
->
taus
[
j
][
i
][
k
+
1
]);
mod_av
->
tausipkp
[
j
][
i
][
k
]
=
0
.
25
*
(
mod
->
taus
[
j
][
i
][
k
]
+
mod
->
taus
[
j
][
i
+
1
][
k
]
+
mod
->
taus
[
j
][
i
+
1
][
k
+
1
]
+
mod
->
taus
[
j
][
i
][
k
+
1
]);
}
rjp
[
j
][
i
][
k
]
=
0
.
5
*
(
rho
[
j
][
i
][
k
]
+
rho
[
j
+
1
][
i
][
k
]);
rkp
[
j
][
i
][
k
]
=
0
.
5
*
(
rho
[
j
][
i
][
k
]
+
rho
[
j
][
i
][
k
+
1
]);
rip
[
j
][
i
][
k
]
=
0
.
5
*
(
rho
[
j
][
i
][
k
]
+
rho
[
j
][
i
+
1
][
k
]);
mod_av
->
rjp
[
j
][
i
][
k
]
=
0
.
5
*
(
mod
->
rho
[
j
][
i
][
k
]
+
mod
->
rho
[
j
+
1
][
i
][
k
]);
mod_av
->
rkp
[
j
][
i
][
k
]
=
0
.
5
*
(
mod
->
rho
[
j
][
i
][
k
]
+
mod
->
rho
[
j
][
i
][
k
+
1
]);
mod_av
->
rip
[
j
][
i
][
k
]
=
0
.
5
*
(
mod
->
rho
[
j
][
i
][
k
]
+
mod
->
rho
[
j
][
i
+
1
][
k
]);
}
...
...
src/checkfd_ssg.c
View file @
2607899f
...
...
@@ -37,8 +37,7 @@ void err2(char errformat[],char errfilename[]){
err
(
outtxt
);
}
void
checkfd
(
FILE
*
fp
,
float
***
prho
,
float
***
ppi
,
float
***
pu
,
float
***
ptaus
,
float
***
ptaup
,
float
*
peta
,
float
**
srcpos
,
int
nsrc
,
int
**
recpos
,
int
ntr
){
void
checkfd
(
FILE
*
fp
,
st_model
*
mod
,
float
**
srcpos
,
int
nsrc
,
int
**
recpos
,
int
ntr
){
extern
float
DX
,
DY
,
DZ
,
DT
,
TS
,
TIME
,
TSNAP2
;
extern
float
XREC1
,
XREC2
,
YREC1
,
YREC2
,
ZREC1
,
ZREC2
;
...
...
@@ -80,12 +79,12 @@ float *** ptaus, float *** ptaup, float *peta, float **srcpos, int nsrc, int **r
for
(
k
=
1
+
nfw
;
k
<=
(
nz
-
nfw
);
k
++
){
for
(
i
=
1
+
nfw
;
i
<=
(
nx
-
nfw
);
i
++
){
for
(
j
=
ny1
;
j
<=
(
ny
-
nfw
);
j
++
){
if
(
p
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"
p
rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
if
(
mod
->
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
else
{
if
(
L
){
c
=
sqrt
(
p
u
[
j
][
i
][
k
]
*
(
1
.
0
+
L
*
p
taus
[
j
][
i
][
k
])
/
p
rho
[
j
][
i
][
k
]);}
else
c
=
sqrt
(
p
u
[
j
][
i
][
k
]
/
p
rho
[
j
][
i
][
k
]);
c
=
sqrt
(
mod
->
u
[
j
][
i
][
k
]
*
(
1
.
0
+
L
*
mod
->
taus
[
j
][
i
][
k
])
/
mod
->
rho
[
j
][
i
][
k
]);}
else
c
=
sqrt
(
mod
->
u
[
j
][
i
][
k
]
/
mod
->
rho
[
j
][
i
][
k
]);
}
if
(
cmax_s
<
c
)
cmax_s
=
c
;
...
...
@@ -93,13 +92,13 @@ float *** ptaus, float *** ptaup, float *peta, float **srcpos, int nsrc, int **r
frequency of the source */
sum
=
0
.
0
;
for
(
l
=
1
;
l
<=
L
;
l
++
){
ts
=
DT
/
p
eta
[
l
];
sum
=
sum
+
((
w
*
w
*
p
taus
[
j
][
i
][
k
]
*
ts
*
ts
)
/
(
1
.
0
+
w
*
w
*
ts
*
ts
));
ts
=
DT
/
mod
->
eta
[
l
];
sum
=
sum
+
((
w
*
w
*
mod
->
taus
[
j
][
i
][
k
]
*
ts
*
ts
)
/
(
1
.
0
+
w
*
w
*
ts
*
ts
));
}
if
(
p
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"
p
rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
if
(
mod
->
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
else
c
=
sqrt
(
p
u
[
j
][
i
][
k
]
*
(
1
.
0
+
sum
)
/
p
rho
[
j
][
i
][
k
]);
c
=
sqrt
(
mod
->
u
[
j
][
i
][
k
]
*
(
1
.
0
+
sum
)
/
mod
->
rho
[
j
][
i
][
k
]);
if
((
c
>
cwater
)
&&
(
cmin_s
>
c
))
cmin_s
=
c
;
}
}
...
...
@@ -112,24 +111,24 @@ float *** ptaus, float *** ptaup, float *peta, float **srcpos, int nsrc, int **r
for
(
k
=
1
+
nfw
;
k
<=
(
nz
-
nfw
);
k
++
){
for
(
i
=
1
+
nfw
;
i
<=
(
nx
-
nfw
);
i
++
){
for
(
j
=
ny1
;
j
<=
(
ny
-
nfw
);
j
++
){
if
(
p
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"
p
rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
if
(
mod
->
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
else
{
if
(
L
)
c
=
sqrt
(
p
pi
[
j
][
i
][
k
]
*
(
1
.
0
+
L
*
p
taup
[
j
][
i
][
k
])
/
p
rho
[
j
][
i
][
k
]);
else
c
=
sqrt
(
p
pi
[
j
][
i
][
k
]
/
p
rho
[
j
][
i
][
k
]);
if
(
L
)
c
=
sqrt
(
mod
->
pi
[
j
][
i
][
k
]
*
(
1
.
0
+
L
*
mod
->
taup
[
j
][
i
][
k
])
/
mod
->
rho
[
j
][
i
][
k
]);
else
c
=
sqrt
(
mod
->
pi
[
j
][
i
][
k
]
/
mod
->
rho
[
j
][
i
][
k
]);
}
if
(
cmax_p
<
c
)
cmax_p
=
c
;
/* find minimum model phase velocity of P-waves at center
frequency of the source */
sum
=
0
.
0
;
for
(
l
=
1
;
l
<=
L
;
l
++
){
ts
=
DT
/
p
eta
[
l
];
sum
=
sum
+
((
w
*
w
*
p
taup
[
j
][
i
][
k
]
*
ts
*
ts
)
/
(
1
.
0
+
w
*
w
*
ts
*
ts
));
ts
=
DT
/
mod
->
eta
[
l
];
sum
=
sum
+
((
w
*
w
*
mod
->
taup
[
j
][
i
][
k
]
*
ts
*
ts
)
/
(
1
.
0
+
w
*
w
*
ts
*
ts
));
}
if
(
p
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"
p
rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
if
(
mod
->
rho
[
j
][
i
][
k
]
==
0
.
0
)
printf
(
"rho=0 detected from MYID=%d at i=%d,j=%d,k=%d
\n
"
,
MYID
,
i
,
j
,
k
);
else
c
=
sqrt
(
p
pi
[
j
][
i
][
k
]
*
(
1
.
0
+
sum
)
/
p
rho
[
j
][
i
][
k
]);
c
=
sqrt
(
mod
->
pi
[
j
][
i
][
k
]
*
(
1
.
0
+
sum
)
/
mod
->
rho
[
j
][
i
][
k
]);
if
(
cmin_p
>
c
)
cmin_p
=
c
;
}
}
...
...
src/comm_ini.c
View file @
2607899f
...
...
@@ -26,10 +26,7 @@
#include "fd.h"
void
comm_ini
(
float
***
bufferlef_to_rig
,
float
***
bufferrig_to_lef
,
float
***
buffertop_to_bot
,
float
***
bufferbot_to_top
,
float
***
bufferfro_to_bac
,
float
***
bufferbac_to_fro
,
MPI_Request
*
req_send
,
MPI_Request
*
req_rec
){
void
comm_ini
(
st_buffer
*
buffer
,
MPI_Request
*
req_send
,
MPI_Request
*
req_rec
){
extern
int
NX
,
NY
,
NZ
,
INDEX
[
7
],
FDORDER
;
...
...
@@ -50,22 +47,24 @@ MPI_Request *req_send, MPI_Request *req_rec){
nf2
=
nf1
-
1
;
MPI_Bsend_init
(
&
bufferlef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
1
],
TAG1
,
MPI_COMM_WORLD
,
&
req_send
[
0
]);
MPI_Bsend_init
(
&
bufferrig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
2
],
TAG2
,
MPI_COMM_WORLD
,
&
req_send
[
1
]);
MPI_Bsend_init
(
&
bufferfro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
5
],
TAG3
,
MPI_COMM_WORLD
,
&
req_send
[
2
]);
MPI_Bsend_init
(
&
bufferbac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
6
],
TAG4
,
MPI_COMM_WORLD
,
&
req_send
[
3
]);
MPI_Bsend_init
(
&
buffertop_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
3
],
TAG5
,
MPI_COMM_WORLD
,
&
req_send
[
4
]);
MPI_Bsend_init
(
&
bufferbot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
4
],
TAG6
,
MPI_COMM_WORLD
,
&
req_send
[
5
]);
MPI_Bsend_init
(
&
buffer
->
lef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
1
],
TAG1
,
MPI_COMM_WORLD
,
&
req_send
[
0
]);
MPI_Bsend_init
(
&
buffer
->
rig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
2
],
TAG2
,
MPI_COMM_WORLD
,
&
req_send
[
1
]);
MPI_Bsend_init
(
&
buffer
->
fro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
5
],
TAG3
,
MPI_COMM_WORLD
,
&
req_send
[
2
]);
MPI_Bsend_init
(
&
buffer
->
bac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
6
],
TAG4
,
MPI_COMM_WORLD
,
&
req_send
[
3
]);
MPI_Bsend_init
(
&
buffer
->
top_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
3
],
TAG5
,
MPI_COMM_WORLD
,
&
req_send
[
4
]);
MPI_Bsend_init
(
&
buffer
->
bot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
4
],
TAG6
,
MPI_COMM_WORLD
,
&
req_send
[
5
]);
/* initialising of receive of buffer arrays. Same arrays for send and receive
are used. Thus, before starting receive, it is necessary to check if
Bsend has copied data into local buffers, i.e. has completed.
*/
MPI_Recv_init
(
&
bufferlef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
2
],
TAG1
,
MPI_COMM_WORLD
,
&
req_rec
[
0
]);
MPI_Recv_init
(
&
bufferrig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
1
],
TAG2
,
MPI_COMM_WORLD
,
&
req_rec
[
1
]);
MPI_Recv_init
(
&
bufferfro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
6
],
TAG3
,
MPI_COMM_WORLD
,
&
req_rec
[
2
]);
MPI_Recv_init
(
&
bufferbac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
5
],
TAG4
,
MPI_COMM_WORLD
,
&
req_rec
[
3
]);
MPI_Recv_init
(
&
buffertop_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
4
],
TAG5
,
MPI_COMM_WORLD
,
&
req_rec
[
4
]);
MPI_Recv_init
(
&
bufferbot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
3
],
TAG6
,
MPI_COMM_WORLD
,
&
req_rec
[
5
]);
MPI_Recv_init
(
&
buffer
->
lef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
2
],
TAG1
,
MPI_COMM_WORLD
,
&
req_rec
[
0
]);
MPI_Recv_init
(
&
buffer
->
rig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
1
],
TAG2
,
MPI_COMM_WORLD
,
&
req_rec
[
1
]);
MPI_Recv_init
(
&
buffer
->
fro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
6
],
TAG3
,
MPI_COMM_WORLD
,
&
req_rec
[
2
]);
MPI_Recv_init
(
&
buffer
->
bac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
5
],
TAG4
,
MPI_COMM_WORLD
,
&
req_rec
[
3
]);
MPI_Recv_init
(
&
buffer
->
top_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
4
],
TAG5
,
MPI_COMM_WORLD
,
&
req_rec
[
4
]);
MPI_Recv_init
(
&
buffer
->
bot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
3
],
TAG6
,
MPI_COMM_WORLD
,
&
req_rec
[
5
]);
}
src/comm_ini_s.c
View file @
2607899f
...
...
@@ -7,10 +7,7 @@
#include "fd.h"
void
comm_ini_s
(
float
***
bufferlef_to_rig
,
float
***
bufferrig_to_lef
,
float
***
buffertop_to_bot
,
float
***
bufferbot_to_top
,
float
***
bufferfro_to_bac
,
float
***
bufferbac_to_fro
,
MPI_Request
*
req_send
,
MPI_Request
*
req_rec
){
void
comm_ini_s
(
st_buffer
*
buffer
,
MPI_Request
*
req_send
,
MPI_Request
*
req_rec
){
extern
int
NX
,
NY
,
NZ
,
INDEX
[
7
],
FDORDER
;
...
...
@@ -31,22 +28,22 @@ MPI_Request *req_send, MPI_Request *req_rec){
nf2
=
nf1
-
1
;
MPI_Bsend_init
(
&
bufferlef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
1
],
TAG1
,
MPI_COMM_WORLD
,
&
req_send
[
0
]);
MPI_Bsend_init
(
&
bufferrig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
2
],
TAG2
,
MPI_COMM_WORLD
,
&
req_send
[
1
]);
MPI_Bsend_init
(
&
bufferfro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
5
],
TAG3
,
MPI_COMM_WORLD
,
&
req_send
[
2
]);
MPI_Bsend_init
(
&
bufferbac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
6
],
TAG4
,
MPI_COMM_WORLD
,
&
req_send
[
3
]);
MPI_Bsend_init
(
&
buffertop_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
3
],
TAG5
,
MPI_COMM_WORLD
,
&
req_send
[
4
]);
MPI_Bsend_init
(
&
bufferbot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
4
],
TAG6
,
MPI_COMM_WORLD
,
&
req_send
[
5
]);
MPI_Bsend_init
(
&
buffer
->
lef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
1
],
TAG1
,
MPI_COMM_WORLD
,
&
req_send
[
0
]);
MPI_Bsend_init
(
&
buffer
->
rig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
2
],
TAG2
,
MPI_COMM_WORLD
,
&
req_send
[
1
]);
MPI_Bsend_init
(
&
buffer
->
fro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
5
],
TAG3
,
MPI_COMM_WORLD
,
&
req_send
[
2
]);
MPI_Bsend_init
(
&
buffer
->
bac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
6
],
TAG4
,
MPI_COMM_WORLD
,
&
req_send
[
3
]);
MPI_Bsend_init
(
&
buffer
->
top_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
3
],
TAG5
,
MPI_COMM_WORLD
,
&
req_send
[
4
]);
MPI_Bsend_init
(
&
buffer
->
bot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
4
],
TAG6
,
MPI_COMM_WORLD
,
&
req_send
[
5
]);
/* initialising of receive of buffer arrays. Same arrays for send and receive
are used. Thus, before starting receive, it is necessary to check if
Bsend has copied data into local buffers, i.e. has completed.
*/
MPI_Recv_init
(
&
bufferlef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
2
],
TAG1
,
MPI_COMM_WORLD
,
&
req_rec
[
0
]);
MPI_Recv_init
(
&
bufferrig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
1
],
TAG2
,
MPI_COMM_WORLD
,
&
req_rec
[
1
]);
MPI_Recv_init
(
&
bufferfro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
6
],
TAG3
,
MPI_COMM_WORLD
,
&
req_rec
[
2
]);
MPI_Recv_init
(
&
bufferbac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
5
],
TAG4
,
MPI_COMM_WORLD
,
&
req_rec
[
3
]);
MPI_Recv_init
(
&
buffertop_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
4
],
TAG5
,
MPI_COMM_WORLD
,
&
req_rec
[
4
]);
MPI_Recv_init
(
&
bufferbot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
3
],
TAG6
,
MPI_COMM_WORLD
,
&
req_rec
[
5
]);
MPI_Recv_init
(
&
buffer
->
lef_to_rig
[
1
][
1
][
1
],
NY
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
2
],
TAG1
,
MPI_COMM_WORLD
,
&
req_rec
[
0
]);
MPI_Recv_init
(
&
buffer
->
rig_to_lef
[
1
][
1
][
1
],
NY
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
1
],
TAG2
,
MPI_COMM_WORLD
,
&
req_rec
[
1
]);
MPI_Recv_init
(
&
buffer
->
fro_to_bac
[
1
][
1
][
1
],
NX
*
NY
*
nf2
,
MPI_FLOAT
,
INDEX
[
6
],
TAG3
,
MPI_COMM_WORLD
,
&
req_rec
[
2
]);
MPI_Recv_init
(
&
buffer
->
bac_to_fro
[
1
][
1
][
1
],
NX
*
NY
*
nf1
,
MPI_FLOAT
,
INDEX
[
5
],
TAG4
,
MPI_COMM_WORLD
,
&
req_rec
[
3
]);
MPI_Recv_init
(
&
buffer
->
top_to_bot
[
1
][
1
][
1
],
NX
*
NZ
*
nf2
,
MPI_FLOAT
,
INDEX
[
4
],
TAG5
,
MPI_COMM_WORLD
,
&
req_rec
[
4
]);
MPI_Recv_init
(
&
buffer
->
bot_to_top
[
1
][
1
][
1
],
NX
*
NZ
*
nf1
,
MPI_FLOAT
,
INDEX
[
3
],
TAG6
,
MPI_COMM_WORLD
,
&
req_rec
[
5
]);
}
src/conjugategrad.c
View file @
2607899f
...
...
@@ -24,7 +24,7 @@
#include "fd.h"
void
conjugate
(
int
nx
,
int
ny
,
int
nz
,
float
***
grad1
,
float
***
grad2
,
float
***
grad3
,
float
***
gradprior1
,
float
***
gradprior2
,
float
***
gradprior3
,
floa
t
**
*
gradprior
4
,
float
***
gradprior5
,
float
**
*
gradprior
6
,
float
*
beta
,
int
iteration
,
int
cdf
){
void
conjugate
(
int
nx
,
int
ny
,
int
nz
,
st_gradient
*
grad
,
st_gradien
t
*
grad
_
prior
1
,
st_gradient
*
grad
_
prior
2
,
float
*
beta
,
int
iteration
,
int
cdf
){
extern
FILE
*
FP
;
...
...
@@ -43,12 +43,12 @@ void conjugate(int nx,int ny,int nz, float ***grad1, float ***grad2,float ***gra
for
(
j
=
1
;
j
<=
ny
;
j
++
){
for
(
i
=
1
;
i
<=
nx
;
i
++
){
for
(
k
=
1
;
k
<=
nz
;
k
++
){
gradprior1
[
j
][
i
][
k
]
=
grad
1
[
j
][
i
][
k
];
gradprior
2
[
j
][
i
][
k
]
=
grad
2
[
j
][
i
][
k
];
gradprior
3
[
j
][
i
][
k
]
=
grad
3
[
j
][
i
][
k
];
gradprior
4
[
j
][
i
][
k
]
=
grad
1
[
j
][
i
][
k
];
gradprior
5
[
j
][
i
][
k
]
=
grad
2
[
j
][
i
][
k
];
gradprior
6
[
j
][
i
][
k
]
=
grad
3
[
j
][
i
][
k
];
grad
_
prior1
->
vp
[
j
][
i
][
k
]
=
grad
->
vp
[
j
][
i
][
k
];
grad
_
prior
1
->
vs
[
j
][
i
][
k
]
=
grad
->
vs
[
j
][
i
][
k
];
grad
_
prior
1
->
rho
[
j
][
i
][
k
]
=
grad
->
rho
[
j
][
i
][
k
];
grad
_
prior
2
->
vp
[
j
][
i
][
k
]
=
grad
->
vp
[
j
][
i
][
k
];
grad
_
prior
2
->
vs
[
j
][
i
][
k
]
=
grad
->
vs
[
j
][
i
][
k
];
grad
_
prior
2
->
rho
[
j
][
i
][
k
]
=
grad
->
rho
[
j
][
i
][
k
];
}
}
}
...
...
@@ -59,17 +59,17 @@ void conjugate(int nx,int ny,int nz, float ***grad1, float ***grad2,float ***gra
for
(
j
=
1
;
j
<=
ny
;
j
++
){
for
(
i
=
1
;
i
<=
nx
;
i
++
){
for
(
k
=
1
;
k
<=
nz
;
k
++
){
betadum
[
0
]
+=
grad
1
[
j
][
i
][
k
]
*
(
grad
1
[
j
][
i
][
k
]
-
gradprior1
[
j
][
i
][
k
]);
betadum
[
1
]
+=
gradprior1
[
j
][
i
][
k
]
*
gradprior1
[
j
][
i
][
k
];
betadum
[
2
]
+=
grad
2
[
j
][
i
][
k
]
*
(
grad
2
[
j
][
i
][
k
]
-
gradprior
2
[
j
][
i
][
k
]);
betadum
[
3
]
+=
gradprior
2
[
j
][
i
][
k
]
*
gradprior
2
[
j
][
i
][
k
];
betadum
[
4
]
+=
grad
3
[
j
][
i
][
k
]
*
(
grad
3
[
j
][
i
][
k
]
-
gradprior
3
[
j
][
i
][
k
]);
betadum
[
5
]
+=
gradprior
3
[
j
][
i
][
k
]
*
gradprior
3
[
j
][
i
][
k
];
betadum
[
0
]
+=
grad
->
vp
[
j
][
i
][
k
]
*
(
grad
->
vp
[
j
][
i
][
k
]
-
grad
_
prior1
->
vp
[
j
][
i
][
k
]);
betadum
[
1
]
+=
grad
_
prior1
->
vp
[
j
][
i
][
k
]
*
grad
_
prior1
->
vp
[
j
][
i
][
k
];
betadum
[
2
]
+=
grad
->
vs
[
j
][
i
][
k
]
*
(
grad
->
vs
[
j
][
i
][
k
]
-
grad
_
prior
1
->
vs
[
j
][
i
][
k
]);
betadum
[
3
]
+=
grad
_
prior
1
->
vs
[
j
][
i
][
k
]
*
grad
_
prior
1
->
vs
[
j
][
i
][
k
];
betadum
[
4
]
+=
grad
->
rho
[
j
][
i
][
k
]
*
(
grad
->
rho
[
j
][
i
][
k
]
-
grad
_
prior
1
->
rho
[
j
][
i
][
k
]);
betadum
[
5
]
+=
grad
_
prior
1
->
rho
[
j
][
i
][
k
]
*
grad
_
prior
1
->
rho
[
j
][
i
][
k
];
/*save preconditioned gradient for next iteration*/
gradprior1
[
j
][
i
][
k
]
=
grad
1
[
j