156 ,rg_dcsource_gll_force&
176 real :: ftmp(3,3,ig_ngll,ig_ngll,ig_ngll)
200 if (ig_myrank == 0)
then
201 write(ig_lst_unit,
'(" ",/,a)')
"computing double-couple sources if any..."
202 call flush(ig_lst_unit)
205 if (ig_ndcsource > 0)
then
207 ios =
init_array_real(rg_dcsource_gll_force,ig_ndcsource,ig_ngll,ig_ngll,ig_ngll,ig_ndof,
"rg_dcsource_gll_force")
213 do iso = 1,ig_ndcsource
215 iel = tg_dcsource(iso)%iel
221 ftmp(1,1,m,l,k) = tg_dcsource(iso)%mxx*rg_hexa_gll_dxidx(m,l,k,iel) &
222 + tg_dcsource(iso)%mxy*rg_hexa_gll_dxidy(m,l,k,iel) &
223 + tg_dcsource(iso)%mxz*rg_hexa_gll_dxidz(m,l,k,iel)
224 ftmp(2,1,m,l,k) = tg_dcsource(iso)%mxx*rg_hexa_gll_detdx(m,l,k,iel) &
225 + tg_dcsource(iso)%mxy*rg_hexa_gll_detdy(m,l,k,iel) &
226 + tg_dcsource(iso)%mxz*rg_hexa_gll_detdz(m,l,k,iel)
227 ftmp(3,1,m,l,k) = tg_dcsource(iso)%mxx*rg_hexa_gll_dzedx(m,l,k,iel) &
228 + tg_dcsource(iso)%mxy*rg_hexa_gll_dzedy(m,l,k,iel) &
229 + tg_dcsource(iso)%mxz*rg_hexa_gll_dzedz(m,l,k,iel)
231 ftmp(1,2,m,l,k) = tg_dcsource(iso)%mxy*rg_hexa_gll_dxidx(m,l,k,iel) &
232 + tg_dcsource(iso)%myy*rg_hexa_gll_dxidy(m,l,k,iel) &
233 + tg_dcsource(iso)%myz*rg_hexa_gll_dxidz(m,l,k,iel)
234 ftmp(2,2,m,l,k) = tg_dcsource(iso)%mxy*rg_hexa_gll_detdx(m,l,k,iel) &
235 + tg_dcsource(iso)%myy*rg_hexa_gll_detdy(m,l,k,iel) &
236 + tg_dcsource(iso)%myz*rg_hexa_gll_detdz(m,l,k,iel)
237 ftmp(3,2,m,l,k) = tg_dcsource(iso)%mxy*rg_hexa_gll_dzedx(m,l,k,iel) &
238 + tg_dcsource(iso)%myy*rg_hexa_gll_dzedy(m,l,k,iel) &
239 + tg_dcsource(iso)%myz*rg_hexa_gll_dzedz(m,l,k,iel)
241 ftmp(1,3,m,l,k) = tg_dcsource(iso)%mxz*rg_hexa_gll_dxidx(m,l,k,iel) &
242 + tg_dcsource(iso)%myz*rg_hexa_gll_dxidy(m,l,k,iel) &
243 + tg_dcsource(iso)%mzz*rg_hexa_gll_dxidz(m,l,k,iel)
244 ftmp(2,3,m,l,k) = tg_dcsource(iso)%mxz*rg_hexa_gll_detdx(m,l,k,iel) &
245 + tg_dcsource(iso)%myz*rg_hexa_gll_detdy(m,l,k,iel) &
246 + tg_dcsource(iso)%mzz*rg_hexa_gll_detdz(m,l,k,iel)
247 ftmp(3,3,m,l,k) = tg_dcsource(iso)%mxz*rg_hexa_gll_dzedx(m,l,k,iel) &
248 + tg_dcsource(iso)%myz*rg_hexa_gll_dzedy(m,l,k,iel) &
249 + tg_dcsource(iso)%mzz*rg_hexa_gll_dzedz(m,l,k,iel)
258 rg_dcsource_gll_force(:,m,l,k,iso) = 0.0
262 rg_dcsource_gll_force(1,m,l,k,iso) = rg_dcsource_gll_force(1,m,l,k,iso) &
263 +
lagrap(p,tg_dcsource(iso)%xi,ig_ngll) &
264 *
lagrap(o,tg_dcsource(iso)%et,ig_ngll) &
265 *
lagrap(n,tg_dcsource(iso)%ze,ig_ngll) &
266 *(ftmp(1,1,p,o,n) *
lagrad(m,tg_dcsource(iso)%xi,ig_ngll) &
267 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
268 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
269 + ftmp(2,1,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
270 *
lagrad(l,tg_dcsource(iso)%et,ig_ngll) &
271 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
272 + ftmp(3,1,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
273 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
274 *
lagrad(k,tg_dcsource(iso)%ze,ig_ngll))
276 rg_dcsource_gll_force(2,m,l,k,iso) = rg_dcsource_gll_force(2,m,l,k,iso) &
277 +
lagrap(p,tg_dcsource(iso)%xi,ig_ngll) &
278 *
lagrap(o,tg_dcsource(iso)%et,ig_ngll) &
279 *
lagrap(n,tg_dcsource(iso)%ze,ig_ngll) &
280 *(ftmp(1,2,p,o,n) *
lagrad(m,tg_dcsource(iso)%xi,ig_ngll) &
281 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
282 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
283 + ftmp(2,2,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
284 *
lagrad(l,tg_dcsource(iso)%et,ig_ngll) &
285 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
286 + ftmp(3,2,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
287 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
288 *
lagrad(k,tg_dcsource(iso)%ze,ig_ngll))
290 rg_dcsource_gll_force(3,m,l,k,iso) = rg_dcsource_gll_force(3,m,l,k,iso) &
291 +
lagrap(p,tg_dcsource(iso)%xi,ig_ngll) &
292 *
lagrap(o,tg_dcsource(iso)%et,ig_ngll) &
293 *
lagrap(n,tg_dcsource(iso)%ze,ig_ngll) &
294 *(ftmp(1,3,p,o,n) *
lagrad(m,tg_dcsource(iso)%xi,ig_ngll) &
295 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
296 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
297 + ftmp(2,3,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
298 *
lagrad(l,tg_dcsource(iso)%et,ig_ngll) &
299 *
lagrap(k,tg_dcsource(iso)%ze,ig_ngll) &
300 + ftmp(3,3,p,o,n) *
lagrap(m,tg_dcsource(iso)%xi,ig_ngll) &
301 *
lagrap(l,tg_dcsource(iso)%et,ig_ngll) &
302 *
lagrad(k,tg_dcsource(iso)%ze,ig_ngll))
311 if (ig_myrank == 0)
then
312 write(ig_lst_unit,
'(a)')
"done"
313 call flush(ig_lst_unit)
346 ,rg_dcsource_user_func
354 real,
allocatable,
dimension(:) :: dum1
355 real,
allocatable,
dimension(:) :: dum2
356 real,
allocatable,
dimension(:) :: dum3
357 real ,
dimension(ig_ncpu) :: dummy
365 integer ,
dimension(MPI_STATUS_SIZE) :: statut
366 integer :: min_loc(1)
367 integer ,
dimension(ig_ncpu) :: ilrcpu
376 character(len=1) :: ctempo
388 open(unit=100,file=trim(cg_prefix)//
".dcs",status=
'old',iostat=ios)
392 if (ig_myrank == 0)
write(ig_lst_unit,
'(a)')
" "
394 read(unit=100,fmt=
'(i10)') ig_ndcsource
396 allocate(tldoco(ig_ndcsource))
398 do iso = 1,ig_ndcsource
404 tldoco(iso)%mxx = 0.0
405 tldoco(iso)%myy = 0.0
406 tldoco(iso)%mzz = 0.0
407 tldoco(iso)%mxy = 0.0
408 tldoco(iso)%mxz = 0.0
409 tldoco(iso)%myz = 0.0
410 tldoco(iso)%shift_time = 0.0
411 tldoco(iso)%rise_time = 0.0
415 tldoco(iso)%dmin = 0.0
416 tldoco(iso)%str = 0.0
417 tldoco(iso)%dip = 0.0
418 tldoco(iso)%rak = 0.0
428 read(unit=100,fmt=*) tldoco(iso)%x,tldoco(iso)%y,tldoco(iso)%z,tldoco(iso)%mw,tldoco(iso)%str,tldoco(iso)%dip,tldoco(iso)%rak,tldoco(iso)%shift_time,tldoco(iso)%rise_time,tldoco(iso)%icur
430 st = tldoco(iso)%str*rg_pi/180.0
431 di = tldoco(iso)%dip*rg_pi/180.0
432 ra = tldoco(iso)%rak*rg_pi/180.0
433 m0 = 10**(1.5*tldoco(iso)%mw + 9.1)
434 tldoco(iso)%mxx = +m0*(sin(di)*cos(ra)*sin(2.0*st) - sin(2.0*di)*sin(ra)*(cos(st))**2)
435 tldoco(iso)%mxy = +m0*(sin(di)*cos(ra)*cos(2.0*st) + 0.5*sin(2.0*di)*sin(ra)* sin(2.0*st))
436 tldoco(iso)%mxz = +m0*(cos(di)*cos(ra)*sin( st) - cos(2.0*di)*sin(ra)* cos(st))
437 tldoco(iso)%myy = -m0*(sin(di)*cos(ra)*sin(2.0*st) + sin(2.0*di)*sin(ra)*(sin(st))**2)
438 tldoco(iso)%myz = +m0*(cos(di)*cos(ra)*cos( st) + cos(2.0*di)*sin(ra)* sin(st))
439 tldoco(iso)%mzz = +m0*sin(2.0*di)*sin(ra)
441 if ( (iso == 1) .and. (tldoco(iso)%icur == 10) )
then
443 open(unit=99,file=trim(cg_prefix)//
".dcf")
445 read(unit= 99,fmt=*,iostat=ios1) ctempo
450 allocate(rg_dcsource_user_func(ig_ndt+1),dum3(ig_ndt+1),dum1(itempo),dum2(itempo))
452 read(unit=99,fmt=*) dum1(i),dum2(i)
456 dum3(i) = (i-1)*rg_dt
458 call
interp_linear(1,itempo,dum1,dum2,ig_ndt+1,dum3,rg_dcsource_user_func)
459 if (ig_myrank == 0)
then
460 open(unit=90,file=trim(cg_prefix)//
".dcf.interp")
462 write(unit=90,fmt=
'(2(E14.7,1X))') dum3(i),rg_dcsource_user_func(i)
470 ,tldoco(iso)%dmin,tldoco(iso)%kgll,tldoco(iso)%lgll,tldoco(iso)%mgll,tldoco(iso)%iel)
473 call mpi_allgather(tldoco(iso)%dmin,1,mpi_real,dummy,1,mpi_real,mpi_comm_world,ios)
474 min_loc = minloc(dummy(1:ig_ncpu))
475 if ( (min_loc(1)-1) == ig_myrank)
then
476 tldoco(iso)%cpu = ig_myrank
481 if (ig_myrank == 0)
then
482 write(ig_lst_unit,
'(a,i8,a,i0)')
"double couple source ",iso,
" computed by cpu ",min_loc(1)-1
489 allocate(tg_dcsource(ilndco))
491 do iso = 1,ig_ndcsource
492 if (tldoco(iso)%cpu == ig_myrank)
then
494 tg_dcsource(j) = tldoco(iso)
497 ig_ndcsource = ilndco
504 call mpi_gather(ig_ndcsource,1,mpi_integer,ilrcpu,1,mpi_integer,0,mpi_comm_world,ios)
506 do iso = 1,ig_ndcsource
508 if (ig_myrank /= 0) call mpi_send(tg_dcsource(iso)%dmin,1,mpi_real,0,100,mpi_comm_world,ios)
512 if (ig_myrank == 0)
then
516 do iso = 1,ig_ndcsource
517 maxdmin = max(maxdmin,tg_dcsource(iso)%dmin)
521 call mpi_recv(rldmin,1,mpi_real,i-1,100,mpi_comm_world,statut,ios)
522 maxdmin = max(maxdmin,rldmin)
526 write(ig_lst_unit,
'(a,e14.7)')
"maximum localisation error of all double couple point sources = ",maxdmin
527 call flush(ig_lst_unit)
530 if (ig_myrank == 0)
write(ig_lst_unit,
'(/,a)')
"no double couple point source computed"
563 ,rg_sfsource_user_func&
572 real,
allocatable,
dimension(:) :: dum1,dum2,dum3
573 real,
dimension(ig_ncpu) :: dummy
577 integer,
dimension(mpi_status_size) :: statut
578 integer,
dimension(1) :: min_loc
579 integer,
dimension(ig_ncpu) :: ilrcpu
588 character(len=1) :: ctempo
600 open(unit=100,file=trim(cg_prefix)//
".sfs",status=
'old',iostat=ios)
604 if (ig_myrank == 0)
write(ig_lst_unit,
'(a)')
" "
606 read(unit=100,fmt=
'(i10)') ig_nsfsource
608 allocate(tlpofo(ig_nsfsource))
610 do ipf = 1,ig_nsfsource
616 tlpofo(ipf)%fac = 0.0
617 tlpofo(ipf)%rise_time = 0.0
618 tlpofo(ipf)%shift_time = 0.0
619 tlpofo(ipf)%var1 = 0.0
620 tlpofo(ipf)%dmin = 0.0
621 tlpofo(ipf)%icur = 0.0
630 read(unit=100,fmt=*) tlpofo(ipf)%x,tlpofo(ipf)%y,tlpofo(ipf)%z,tlpofo(ipf)%fac,tlpofo(ipf)%idir,tlpofo(ipf)%shift_time,tlpofo(ipf)%rise_time,tlpofo(ipf)%icur
632 if ( (ipf == 1) .and. (tlpofo(ipf)%icur == 10) )
then
634 open(unit=99,file=trim(cg_prefix)//
".sff")
636 read(unit= 99,fmt=*,iostat=ios1) ctempo
641 allocate(rg_sfsource_user_func(ig_ndt+1),dum3(ig_ndt+1),dum1(itempo),dum2(itempo))
643 read(unit=99,fmt=*) dum1(i),dum2(i)
647 dum3(i) = (i-1)*rg_dt
649 call
interp_linear(1,itempo,dum1,dum2,ig_ndt+1,dum3,rg_sfsource_user_func)
650 if (ig_myrank == 0)
then
651 open(unit=90,file=trim(cg_prefix)//
".sff.interp")
653 write(unit=90,fmt=
'(2(E14.7,1X))') dum3(i),rg_sfsource_user_func(i)
661 ,tlpofo(ipf)%dmin,tlpofo(ipf)%kgll,tlpofo(ipf)%lgll,tlpofo(ipf)%mgll,tlpofo(ipf)%iel)
664 call mpi_allgather(tlpofo(ipf)%dmin,1,mpi_real,dummy,1,mpi_real,mpi_comm_world,ios)
665 min_loc = minloc(dummy(1:ig_ncpu))
666 if ( (min_loc(1)-1) == ig_myrank)
then
667 tlpofo(ipf)%cpu = ig_myrank
672 if (ig_myrank == 0)
then
673 write(ig_lst_unit,
'(a,i8,a,i0)')
"single force point source ",ipf,
" computed by cpu ",min_loc(1)-1
680 allocate(tg_sfsource(ilnpfo))
682 do ipf = 1,ig_nsfsource
683 if (tlpofo(ipf)%cpu == ig_myrank)
then
685 tg_sfsource(j) = tlpofo(ipf)
688 ig_nsfsource = ilnpfo
695 call mpi_gather(ig_nsfsource,1,mpi_integer,ilrcpu,1,mpi_integer,0,mpi_comm_world,ios)
697 do ipf = 1,ig_nsfsource
699 tg_sfsource(ipf)%iequ = ig_hexa_gll_glonum(tg_sfsource(ipf)%mgll,tg_sfsource(ipf)%lgll,tg_sfsource(ipf)%kgll,tg_sfsource(ipf)%iel)
700 if (ig_myrank /= 0) call mpi_send(tg_sfsource(ipf)%dmin,1,mpi_real,0,100,mpi_comm_world,ios)
704 if (ig_myrank == 0)
then
708 do ipf = 1,ig_nsfsource
709 maxdmin = max(maxdmin,tg_sfsource(ipf)%dmin)
713 call mpi_recv(rldmin,1,mpi_real,i-1,100,mpi_comm_world,statut,ios)
714 maxdmin = max(maxdmin,rldmin)
718 write(ig_lst_unit,
'(a,e14.7)')
"maximum localisation error of all single force point sources = ",maxdmin
719 call flush(ig_lst_unit)
722 if (ig_myrank == 0)
write(ig_lst_unit,
'(/,a)')
"no single force point source computed"
786 integer,
parameter :: iter_max=100
790 xisol = rg_gll_abscissa(tlsrc%mgll)
791 etsol = rg_gll_abscissa(tlsrc%lgll)
792 zesol = rg_gll_abscissa(tlsrc%kgll)
805 call
compute_hexa_jacobian(ihexa,xisol,etsol,zesol,dxidx,dxidy,dxidz,detdx,detdy,detdz,dzedx,dzedy,dzedz,deter)
812 dxi = dxidx*dx + dxidy*dy + dxidz*dz
813 det = detdx*dx + detdy*dy + detdz*dz
814 dze = dzedx*dx + dzedy*dy + dzedz*dz
818 dmin = sqrt( (newx-tlsrc%x)**2 + (newy-tlsrc%y)**2 + (newz-tlsrc%z)**2 )
822 if (mod(iter,iter_max) == 0)
then
This module contains subroutines to allocate arrays and to compute an approximation of the total RAM ...
This module contains subroutines to compute information about receivers and to write receivers' time ...
real function, public lagrap(i, x, n)
function to compute value of order Lagrange polynomial of the GLL node i at abscissa : ...
subroutine, public search_closest_hexa_gll(x, y, z, dmin, kgll, lgll, mgll, iel)
This subroutine searches among all hexahedron elements in cpu myrank the closest GLL node to a point ...
subroutine, public interp_linear(dim_num, data_num, t_data, p_data, interp_num, t_interp, p_interp)
INTERP_LINEAR applies piecewise linear interpolation to data.
subroutine, public compute_hexa_jacobian(ihexa, xisol, etsol, zesol, dxidx, dxidy, dxidz, detdx, detdy, detdz, dzedx, dzedy, dzedz, det)
This subroutine computes jacobian matrix and its determinant at location in hexahedron element ihexa...
This module defines all global variables of EFISPEC3D. Scalar variables are initialized directly in t...
Interface init_array_real to redirect allocation to n-rank arrays.
subroutine, public compute_double_couple_source()
This subroutine pre-computes all double couple point sources defined by type mod_global_variables::ty...
subroutine, public init_double_couple_source()
This subroutine reads all double couple point sources in file *.dcs; sets double couple point sources...
This module contains subroutines to compute global -coordinates of a given point in the physical doma...
subroutine, public compute_hexa_point_coord(ihexa, xi, eta, zeta, x, y, z)
subroutine to compute -coordinates of a point knowing to which hexahedron element it belongs and its ...
type for single force point sources
This module contains subroutines to compute information about sources.
subroutine, public init_single_force_source()
This subroutine reads all single force point sources in file *.sfs; determines to which cpu belong si...
This module contains functions and subroutines to compute tsource functions's time history...
type for double couple point sources
This module contains functions to compute Lagrange polynomials and its derivatives; and to interpolat...
This module contains subroutines to compute jacobian matrix.
real function, public lagrad(i, x, n)
function to compute value of the derivative of order Lagrange polynomial of GLL node i at abscissa ...
subroutine, private compute_source_local_coordinate(tlsrc)
This subroutine solves a nonlinear system by a gradient method to compute local coordinates of a poi...