From c5a14473df524373c11b024a89bab96bd39e75b9 Mon Sep 17 00:00:00 2001 From: Hongjian Fang Date: Thu, 5 May 2016 13:00:39 +0200 Subject: [PATCH] remove example data and add src add src code and remove example data --- bin/DSurfTomo | Bin 0 -> 294584 bytes example/.gmtcommands4 | 10 + example/.gmtdefaults4 | 107 ++ example/DSurfTomo.in | 21 + src/CalSurfG.f90 | 2838 +++++++++++++++++++++++++++++++++++++ src/DSurfTomo | Bin 0 -> 294584 bytes src/Makefile | 20 + src/aprod.f90 | 60 + src/delsph.f90 | 28 + src/gaussian.f90 | 31 + src/lsmrDataModule.f90 | 24 + src/lsmrModule.f90 | 754 ++++++++++ src/lsmrblas.f90 | 360 +++++ src/lsmrblasInterface.f90 | 41 + src/main.f90 | 616 ++++++++ src/surfdisp96.f | 1062 ++++++++++++++ 16 files changed, 5972 insertions(+) create mode 100755 bin/DSurfTomo create mode 100644 example/.gmtcommands4 create mode 100644 example/.gmtdefaults4 create mode 100644 example/DSurfTomo.in create mode 100644 src/CalSurfG.f90 create mode 100755 src/DSurfTomo create mode 100644 src/Makefile create mode 100644 src/aprod.f90 create mode 100644 src/delsph.f90 create mode 100644 src/gaussian.f90 create mode 100644 src/lsmrDataModule.f90 create mode 100644 src/lsmrModule.f90 create mode 100644 src/lsmrblas.f90 create mode 100644 src/lsmrblasInterface.f90 create mode 100644 src/main.f90 create mode 100644 src/surfdisp96.f diff --git a/bin/DSurfTomo b/bin/DSurfTomo new file mode 100755 index 0000000000000000000000000000000000000000..74536d569f4c8c57c5ebcefe436d669cb0c14b01 GIT binary patch literal 294584 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

hGlR|k;qQrKUe#@T58+kFNroKaWv=3kCR&_ZrQ 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

IEO;6(LqBu`d2u9OIt!44=Qs&w3rHiT-!g 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 z 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%0DgDU}WBW!u^R;P<7cZVZGdi3Z-ixQY@sUFe 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 layer) +0.5 2.8 c: minimum velocity, maximum velocity +10 c: maxiter (iteration number) +0.2 c: sparsity fraction +26 c: kmaxRc (followed by periods) +0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 +0 c: kmaxRg +0 c: kmaxLc +0 c: kmaxLg +0 c: synthetic flag(0:real data,1:synthetic) +0.02 c: noiselevel +2.5 c: threshold diff --git a/src/CalSurfG.f90 b/src/CalSurfG.f90 new file mode 100644 index 0000000..312cfa3 --- /dev/null +++ b/src/CalSurfG.f90 @@ -0,0 +1,2838 @@ + subroutine depthkernel(nx,ny,nz,vel,pvRc,sen_vsRc,sen_vpRc,sen_rhoRc, & + iwave,igr,kmaxRc,tRc,depz,minthk) + use omp_lib + implicit none + + integer nx,ny,nz + real vel(nx,ny,nz) + real*8 sen_vpRc(ny*nx,kmaxRc,nz),sen_vsRc(ny*nx,kmaxRc,nz),sen_rhoRc(ny*nx,kmaxRc,nz) + + integer iwave,igr + real minthk + real depz(nz) + integer kmaxRc + real*8 tRc(kmaxRc) + real*8 pvRc(nx*ny,kmaxRc) + + + + real vpz(nz),vsz(nz),rhoz(nz) + real*8 dlncg_dlnvs(kmaxRc,nz),dlncg_dlnvp(kmaxRc,nz),dlncg_dlnrho(kmaxRc,nz) + integer mmax,iflsph,mode,rmax + integer ii,jj,k,i,nn,kk + integer,parameter::NL=200 + integer,parameter::NP=60 + real*8 cg1(NP),cg2(NP),cga,cgRc(NP) + real rdep(NL),rvp(NL),rvs(NL),rrho(NL),rthk(NL) + real depm(NL),vpm(NL),vsm(NL),rhom(NL),thkm(NL) + real dlnVs,dlnVp,dlnrho + + + mmax=nz + iflsph=1 + mode=1 + dlnVs=0.01 + dlnVp=0.01 + dlnrho=0.01 + + !print*,'depth kernel begin...' +!$omp parallel & +!$omp default(private) & +!$omp shared(depz,nx,ny,nz,minthk,dlnvs,dlnvp,dlnrho,kmaxRc,mmax,vel) & +!$omp shared(sen_vpRc,sen_vsRc,sen_rhoRc,tRc,pvRc,iflsph,iwave,mode,igr) +!$omp do + do jj=1,ny + do ii=1,nx + vsz(1:nz)=vel(ii,jj,1:nz) + ! some other emperical relationship maybe better, + do k=1,nz + vpz(k)=0.9409 + 2.0947*vsz(k) - 0.8206*vsz(k)**2+ & + 0.2683*vsz(k)**3 - 0.0251*vsz(k)**4 + rhoz(k)=1.6612*vpz(k) - 0.4721*vpz(k)**2 + & + 0.0671*vpz(k)**3 - 0.0043*vpz(k)**4 + & + 0.000106*vpz(k)**5 + enddo + + call refineGrid2LayerMdl(minthk,mmax,depz,vpz,vsz,rhoz,rmax,rdep,& + rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,igr,kmaxRc,& + tRc,cgRc) + pvRc((jj-1)*nx+ii,1:kmaxRc)=cgRc(1:kmaxRc) + !print*,cgRc(1:kmaxRc) + do kk=1,mmax-1 + depm(kk)=depz(kk) + vsm(kk) = vsz(kk) + vpm(kk) = vpz(kk) + thkm(kk) = depz(kk+1)-depz(kk) + rhom(kk) = rhoz(kk) + enddo + !!half space + depm(mmax) = depz(mmax) + vsm(mmax) = vsz(mmax) + vpm(mmax) = vpz(mmax) + rhom(mmax) = rhoz(mmax) + thkm(mmax) = 0.0 + !! calculate sensitivity kernel + do i = 1, mmax + vsm(i) = vsz(i) - 0.5*dlnVs*vsz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg1) + + vsm(i) = vsz(i) + 0.5*dlnVs*vsz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg2) + vsm(i) = vsz(i) + + do nn = 1,kmaxRc + cga = 0.5*(cg1(nn)+cg2(nn)) + dlncg_dlnvs(nn,i) = (cg2(nn)-cg1(nn))/cga/dlnVs + enddo + + + vpm(i) = vpz(i) - 0.5*dlnVp*vpz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg1) + + vpm(i) = vpz(i) + 0.5*dlnVp*vpz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg2) + vpm(i) = vpz(i) + + do nn = 1,kmaxRc + cga = 0.5*(cg1(nn)+cg2(nn)) + dlncg_dlnvp(nn,i) = (cg2(nn)-cg1(nn))/cga/dlnVp + enddo + rhom(i) = rhoz(i) - 0.5*dlnrho*rhoz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg1) + + rhom(i) = rhoz(i) + 0.5*dlnrho*rhoz(i) + call refineGrid2LayerMdl(minthk,mmax,depm,vpm,vsm,rhom,& + rmax,rdep,rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,& + igr,kmaxRc,tRc,cg2) + rhom(i) = rhoz(i) + + do nn = 1,kmaxRc + cga = 0.5*(cg1(nn)+cg2(nn)) + dlncg_dlnrho(nn,i) = (cg2(nn)-cg1(nn))/cga/dlnrho + enddo + enddo + sen_vsRc((jj-1)*nx+ii,1:kmaxRc,1:mmax)=dlncg_dlnvs(1:kmaxRc,1:mmax) + sen_vpRc((jj-1)*nx+ii,1:kmaxRc,1:mmax)=dlncg_dlnvp(1:kmaxRc,1:mmax) + sen_rhoRc((jj-1)*nx+ii,1:kmaxRc,1:mmax)=dlncg_dlnrho(1:kmaxRc,1:mmax) + ! print*,dlncg_dlnvp(1:kmaxRc,5) + enddo + enddo +!$omp end do +!$omp end parallel + end subroutine depthkernel + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: MODULE +! CODE: FORTRAN 90 +! This module declares variable for global use, that is, for +! USE in any subroutine or function or other module. +! Variables whose values are SAVEd can have their most +! recent values reused in any routine. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE globalp +IMPLICIT NONE +INTEGER, PARAMETER :: i10=SELECTED_REAL_KIND(6) +INTEGER :: checkstat +INTEGER, SAVE :: nvx,nvz,nnx,nnz,fom,gdx,gdz +INTEGER, SAVE :: vnl,vnr,vnt,vnb,nrnx,nrnz,sgdl,rbint +INTEGER, SAVE :: nnxr,nnzr,asgr +INTEGER, DIMENSION (:,:), ALLOCATABLE :: nsts,nstsr,srs +REAL(KIND=i10), SAVE :: gox,goz,dnx,dnz,dvx,dvz,snb,earth +REAL(KIND=i10), SAVE :: goxd,gozd,dvxd,dvzd,dnxd,dnzd +REAL(KIND=i10), SAVE :: drnx,drnz,gorx,gorz +REAL(KIND=i10), SAVE :: dnxr,dnzr,goxr,gozr +REAL(KIND=i10), DIMENSION (:,:), ALLOCATABLE, SAVE :: velv,veln,velnb +REAL(KIND=i10), DIMENSION (:,:), ALLOCATABLE, SAVE :: ttn,ttnr +!REAL(KIND=i10), DIMENSION (:), ALLOCATABLE, SAVE :: rcx,rcz +REAL(KIND=i10), PARAMETER :: pi=3.1415926535898 +!!!-------------------------------------------------------------- +!! modified by Hongjian Fang @ USTC +! real,dimension(:),allocatable,save::rw +! integer,dimension(:),allocatable,save::iw,col +! real,dimension(:,:,:),allocatable::vpf,vsf +! real,dimension(:),allocatable,save::obst,cbst,wt,dtres +!! integer,dimension(:),allocatable,save::cbst_stat +! real,dimension(:,:,:),allocatable,save::sen_vs,sen_vp,sen_rho +!!! real,dimension(:,:,:),allocatable,save::sen_vsRc,sen_vpRc,sen_rhoRc +!!! real,dimension(:,:,:),allocatable,save::sen_vsRg,sen_vpRg,sen_rhoRg +!!! real,dimension(:,:,:),allocatable,save::sen_vsLc,sen_vpLc,sen_rhoLc +!!! real,dimension(:,:,:),allocatable,save::sen_vsLg,sen_vpLg,sen_rhoLg +!!! integer,save:: count1,count2 +! integer*8,save:: nar +! integer,save:: iter,maxiter +!!!-------------------------------------------------------------- +! +! nvx,nvz = B-spline vertex values +! dvx,dvz = B-spline vertex separation +! velv(i,j) = velocity values at control points +! nnx,nnz = Number of nodes of grid in x and z +! nnxr,nnzr = Number of nodes of refined grid in x and z +! gox,goz = Origin of grid (theta,phi) +! goxr, gozr = Origin of refined grid (theta,phi) +! dnx,dnz = Node separation of grid in x and z +! dnxr,dnzr = Node separation of refined grid in x and z +! veln(i,j) = velocity values on a refined grid of nodes +! velnb(i,j) = Backup of veln required for source grid refinement +! ttn(i,j) = traveltime field on the refined grid of nodes +! ttnr(i,j) = ttn for refined grid +! nsts(i,j) = node status (-1=far,0=alive,>0=close) +! nstsr(i,j) = nsts for refined grid +! checkstat = check status of memory allocation +! fom = use first-order(0) or mixed-order(1) scheme +! snb = Maximum size of narrow band as fraction of nnx*nnz +! nrc = number of receivers +! rcx(i),rcz(i) = (x,z) coordinates of receivers +! earth = radius of Earth (in km) +! goxd,gozd = gox,goz in degrees +! dvxd,dvzd = dvx,dvz in degrees +! dnzd,dnzd = dnx,dnz in degrees +! gdx,gdz = grid dicing in x and z +! vnl,vnr,vnb,vnt = Bounds of refined grid +! nrnx,nrnz = Number of nodes in x and z for refined grid +! gorx,gorz = Grid origin of refined grid +! sgdl = Source grid dicing level +! rbint = Ray-boundary intersection (0=no, 1=yes). +! asgr = Apply source grid refinement (0=no,1=yes) +! srs = Source-receiver status (0=no path, 1=path exists) +! +END MODULE globalp + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: MODULE +! CODE: FORTRAN 90 +! This module contains all the subroutines used to calculate +! the first-arrival traveltime field through the grid. +! Subroutines are: +! (1) travel +! (2) fouds1 +! (3) fouds2 +! (4) addtree +! (5) downtree +! (6) updtree +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE traveltime +USE globalp +IMPLICIT NONE +INTEGER ntr +TYPE backpointer + INTEGER(KIND=2) :: px,pz +END TYPE backpointer +TYPE(backpointer), DIMENSION (:), ALLOCATABLE :: btg +! +! btg = backpointer to relate grid nodes to binary tree entries +! px = grid-point in x +! pz = grid-point in z +! ntr = number of entries in binary tree +! + +CONTAINS + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine is passed the location of a source, and from +! this point the first-arrival traveltime field through the +! velocity grid is determined. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE travel(scx,scz,urg) +IMPLICIT NONE +INTEGER :: isx,isz,sw,i,j,ix,iz,urg,swrg +REAL(KIND=i10) :: scx,scz,vsrc,dsx,dsz,ds +REAL(KIND=i10), DIMENSION (2,2) :: vss +! isx,isz = grid cell indices (i,j,k) which contains source +! scx,scz = (r,x,y) location of source +! sw = a switch (0=off,1=on) +! ix,iz = j,k position of "close" point with minimum traveltime +! maxbt = maximum size of narrow band binary tree +! rd2,rd3 = substitution variables +! vsrc = velocity at source +! vss = velocity at nodes surrounding source +! dsx, dsz = distance from source to cell boundary in x and z +! ds = distance from source to nearby node +! urg = use refined grid (0=no,1=yes,2=previously used) +! swrg = switch to end refined source grid computation +! +! The first step is to find out where the source resides +! in the grid of nodes. The cell in which it resides is +! identified by the "north-west" node of the cell. If the +! source lies on the edge or corner (a node) of the cell, then +! this scheme still applies. +! +isx=INT((scx-gox)/dnx)+1 +isz=INT((scz-goz)/dnz)+1 +sw=0 +IF(isx.lt.1.or.isx.gt.nnx)sw=1 +IF(isz.lt.1.or.isz.gt.nnz)sw=1 +IF(sw.eq.1)then + isx=90.0-isx*180.0/pi + isz=isz*180.0/pi + WRITE(6,*)"Source lies outside bounds of model (lat,long)= ",isx,isz + WRITE(6,*)"TERMINATING PROGRAM!!!" + STOP +ENDIF +IF(isx.eq.nnx)isx=isx-1 +IF(isz.eq.nnz)isz=isz-1 +! +! Set all values of nsts to -1 if beginning from a source +! point. +! +IF(urg.NE.2)nsts=-1 +! +! set initial size of binary tree to zero +! +ntr=0 +IF(urg.EQ.2)THEN +! +! In this case, source grid refinement has been applied, so +! the initial narrow band will come from resampling the +! refined grid. +! + DO i=1,nnx + DO j=1,nnz + IF(nsts(j,i).GT.0)THEN + CALL addtree(j,i) + ENDIF + ENDDO + ENDDO +ELSE +! +! In general, the source point need not lie on a grid point. +! Bi-linear interpolation is used to find velocity at the +! source point. +! + nsts=-1 + DO i=1,2 + DO j=1,2 + vss(i,j)=veln(isz-1+j,isx-1+i) + ENDDO + ENDDO + dsx=(scx-gox)-(isx-1)*dnx + dsz=(scz-goz)-(isz-1)*dnz + CALL bilinear(vss,dsx,dsz,vsrc) +! +! Now find the traveltime at the four surrounding grid points. This +! is calculated approximately by assuming the traveltime from the +! source point to each node is equal to the the distance between +! the two points divided by the average velocity of the points +! + DO i=1,2 + DO j=1,2 + ds=SQRT((dsx-(i-1)*dnx)**2+(dsz-(j-1)*dnz)**2) + ttn(isz-1+j,isx-1+i)=2.0*ds/(vss(i,j)+vsrc) + CALL addtree(isz-1+j,isx-1+i) + ENDDO + ENDDO +ENDIF +! +! Now calculate the first-arrival traveltimes at the +! remaining grid points. This is done via a loop which +! repeats the procedure of finding the first-arrival +! of all "close" points, adding it to the set of "alive" +! points and updating the points surrounding the new "alive" +! point. The process ceases when the binary tree is empty, +! in which case all grid points are "alive". +! +DO WHILE(ntr.gt.0) +! +! First, check whether source grid refinement is +! being applied; if so, then there is a special +! exit condition. +! +IF(urg.EQ.1)THEN + ix=btg(1)%px + iz=btg(1)%pz + swrg=0 + IF(ix.EQ.1)THEN + IF(vnl.NE.1)swrg=1 + ENDIF + IF(ix.EQ.nnx)THEN + IF(vnr.NE.nnx)swrg=1 + ENDIF + IF(iz.EQ.1)THEN + IF(vnt.NE.1)swrg=1 + ENDIF + IF(iz.EQ.nnz)THEN + IF(vnb.NE.nnz)swrg=1 + ENDIF + IF(swrg.EQ.1)THEN + nsts(iz,ix)=0 + EXIT + ENDIF +ENDIF +! +! Set the "close" point with minimum traveltime +! to "alive" +! + ix=btg(1)%px + iz=btg(1)%pz + nsts(iz,ix)=0 +! +! Update the binary tree by removing the root and +! sweeping down the tree. +! + CALL downtree +! +! Now update or find values of up to four grid points +! that surround the new "alive" point. +! +! Test points that vary in x +! + DO i=ix-1,ix+1,2 + IF(i.ge.1.and.i.le.nnx)THEN + IF(nsts(iz,i).eq.-1)THEN +! +! This option occurs when a far point is added to the list +! of "close" points +! + IF(fom.eq.0)THEN + CALL fouds1(iz,i) + ELSE + CALL fouds2(iz,i) + ENDIF + CALL addtree(iz,i) + ELSE IF(nsts(iz,i).gt.0)THEN +! +! This happens when a "close" point is updated +! + IF(fom.eq.0)THEN + CALL fouds1(iz,i) + ELSE + CALL fouds2(iz,i) + ENDIF + CALL updtree(iz,i) + ENDIF + ENDIF + ENDDO +! +! Test points that vary in z +! + DO i=iz-1,iz+1,2 + IF(i.ge.1.and.i.le.nnz)THEN + IF(nsts(i,ix).eq.-1)THEN +! +! This option occurs when a far point is added to the list +! of "close" points +! + IF(fom.eq.0)THEN + CALL fouds1(i,ix) + ELSE + CALL fouds2(i,ix) + ENDIF + CALL addtree(i,ix) + ELSE IF(nsts(i,ix).gt.0)THEN +! +! This happens when a "close" point is updated +! + IF(fom.eq.0)THEN + CALL fouds1(i,ix) + ELSE + CALL fouds2(i,ix) + ENDIF + CALL updtree(i,ix) + ENDIF + ENDIF + ENDDO +ENDDO +END SUBROUTINE travel + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine calculates a trial first-arrival traveltime +! at a given node from surrounding nodes using the +! First-Order Upwind Difference Scheme (FOUDS) of +! Sethian and Popovici (1999). +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE fouds1(iz,ix) +IMPLICIT NONE +INTEGER :: j,k,ix,iz,tsw1,swsol +REAL(KIND=i10) :: trav,travm,slown,tdsh,tref +REAL(KIND=i10) :: a,b,c,u,v,em,ri,risti +REAL(KIND=i10) :: rd1 +! +! ix = NS position of node coordinate for determination +! iz = EW vertical position of node coordinate for determination +! trav = traveltime calculated for trial node +! travm = minimum traveltime calculated for trial node +! slown = slowness at (iz,ix) +! tsw1 = traveltime switch (0=first time,1=previously) +! a,b,c,u,v,em = Convenience variables for solving quadratic +! tdsh = local traveltime from neighbouring node +! tref = reference traveltime at neighbouring node +! ri = Radial distance +! risti = ri*sin(theta) at point (iz,ix) +! rd1 = dummy variable +! swsol = switch for solution (0=no solution, 1=solution) +! +! Inspect each of the four quadrants for the minimum time +! solution. +! +tsw1=0 +slown=1.0/veln(iz,ix) +ri=earth +risti=ri*sin(gox+(ix-1)*dnx) +DO j=ix-1,ix+1,2 + DO k=iz-1,iz+1,2 + IF(j.GE.1.AND.j.LE.nnx)THEN + IF(k.GE.1.AND.k.LE.nnz)THEN +! +! There are seven solution options in +! each quadrant. +! + swsol=0 + IF(nsts(iz,j).EQ.0)THEN + swsol=1 + IF(nsts(k,ix).EQ.0)THEN + u=ri*dnx + v=risti*dnz + em=ttn(k,ix)-ttn(iz,j) + a=u**2+v**2 + b=-2.0*u**2*em + c=u**2*(em**2-v**2*slown**2) + tref=ttn(iz,j) + ELSE + a=1.0 + b=0.0 + c=-slown**2*ri**2*dnx**2 + tref=ttn(iz,j) + ENDIF + ELSE IF(nsts(k,ix).EQ.0)THEN + swsol=1 + a=1.0 + b=0.0 + c=-(slown*risti*dnz)**2 + tref=ttn(k,ix) + ENDIF +! +! Now find the solution of the quadratic equation +! + IF(swsol.EQ.1)THEN + rd1=b**2-4.0*a*c + IF(rd1.LT.0.0)rd1=0.0 + tdsh=(-b+sqrt(rd1))/(2.0*a) + trav=tref+tdsh + IF(tsw1.EQ.1)THEN + travm=MIN(trav,travm) + ELSE + travm=trav + tsw1=1 + ENDIF + ENDIF + ENDIF + ENDIF + ENDDO +ENDDO +ttn(iz,ix)=travm +END SUBROUTINE fouds1 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine calculates a trial first-arrival traveltime +! at a given node from surrounding nodes using the +! Mixed-Order (2nd) Upwind Difference Scheme (FOUDS) of +! Popovici and Sethian (2002). +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE fouds2(iz,ix) +IMPLICIT NONE +INTEGER :: j,k,j2,k2,ix,iz,tsw1 +INTEGER :: swj,swk,swsol +REAL(KIND=i10) :: trav,travm,slown,tdsh,tref,tdiv +REAL(KIND=i10) :: a,b,c,u,v,em,ri,risti,rd1 +! +! ix = NS position of node coordinate for determination +! iz = EW vertical position of node coordinate for determination +! trav = traveltime calculated for trial node +! travm = minimum traveltime calculated for trial node +! slown = slowness at (iz,ix) +! tsw1 = traveltime switch (0=first time,1=previously) +! a,b,c,u,v,em = Convenience variables for solving quadratic +! tdsh = local traveltime from neighbouring node +! tref = reference traveltime at neighbouring node +! ri = Radial distance +! risti = ri*sin(theta) at point (iz,ix) +! swj,swk = switches for second order operators +! tdiv = term to divide tref by depending on operator order +! swsol = switch for solution (0=no solution, 1=solution) +! +! Inspect each of the four quadrants for the minimum time +! solution. +! +tsw1=0 +slown=1.0/veln(iz,ix) +ri=earth +risti=ri*sin(gox+(ix-1)*dnx) +DO j=ix-1,ix+1,2 + IF(j.GE.1.AND.j.LE.nnx)THEN + swj=-1 + IF(j.eq.ix-1)THEN + j2=j-1 + IF(j2.GE.1)THEN + IF(nsts(iz,j2).EQ.0)swj=0 + ENDIF + ELSE + j2=j+1 + IF(j2.LE.nnx)THEN + IF(nsts(iz,j2).EQ.0)swj=0 + ENDIF + ENDIF + IF(nsts(iz,j).EQ.0.AND.swj.EQ.0)THEN + swj=-1 + IF(ttn(iz,j).GT.ttn(iz,j2))THEN + swj=0 + ENDIF + ELSE + swj=-1 + ENDIF + DO k=iz-1,iz+1,2 + IF(k.GE.1.AND.k.LE.nnz)THEN + swk=-1 + IF(k.eq.iz-1)THEN + k2=k-1 + IF(k2.GE.1)THEN + IF(nsts(k2,ix).EQ.0)swk=0 + ENDIF + ELSE + k2=k+1 + IF(k2.LE.nnz)THEN + IF(nsts(k2,ix).EQ.0)swk=0 + ENDIF + ENDIF + IF(nsts(k,ix).EQ.0.AND.swk.EQ.0)THEN + swk=-1 + IF(ttn(k,ix).GT.ttn(k2,ix))THEN + swk=0 + ENDIF + ELSE + swk=-1 + ENDIF +! +! There are 8 solution options in +! each quadrant. +! + swsol=0 + IF(swj.EQ.0)THEN + swsol=1 + IF(swk.EQ.0)THEN + u=2.0*ri*dnx + v=2.0*risti*dnz + em=4.0*ttn(iz,j)-ttn(iz,j2)-4.0*ttn(k,ix) + em=em+ttn(k2,ix) + a=v**2+u**2 + b=2.0*em*u**2 + c=u**2*(em**2-slown**2*v**2) + tref=4.0*ttn(iz,j)-ttn(iz,j2) + tdiv=3.0 + ELSE IF(nsts(k,ix).EQ.0)THEN + u=risti*dnz + v=2.0*ri*dnx + em=3.0*ttn(k,ix)-4.0*ttn(iz,j)+ttn(iz,j2) + a=v**2+9.0*u**2 + b=6.0*em*u**2 + c=u**2*(em**2-slown**2*v**2) + tref=ttn(k,ix) + tdiv=1.0 + ELSE + u=2.0*ri*dnx + a=1.0 + b=0.0 + c=-u**2*slown**2 + tref=4.0*ttn(iz,j)-ttn(iz,j2) + tdiv=3.0 + ENDIF + ELSE IF(nsts(iz,j).EQ.0)THEN + swsol=1 + IF(swk.EQ.0)THEN + u=ri*dnx + v=2.0*risti*dnz + em=3.0*ttn(iz,j)-4.0*ttn(k,ix)+ttn(k2,ix) + a=v**2+9.0*u**2 + b=6.0*em*u**2 + c=u**2*(em**2-v**2*slown**2) + tref=ttn(iz,j) + tdiv=1.0 + ELSE IF(nsts(k,ix).EQ.0)THEN + u=ri*dnx + v=risti*dnz + em=ttn(k,ix)-ttn(iz,j) + a=u**2+v**2 + b=-2.0*u**2*em + c=u**2*(em**2-v**2*slown**2) + tref=ttn(iz,j) + tdiv=1.0 + ELSE + a=1.0 + b=0.0 + c=-slown**2*ri**2*dnx**2 + tref=ttn(iz,j) + tdiv=1.0 + ENDIF + ELSE + IF(swk.EQ.0)THEN + swsol=1 + u=2.0*risti*dnz + a=1.0 + b=0.0 + c=-u**2*slown**2 + tref=4.0*ttn(k,ix)-ttn(k2,ix) + tdiv=3.0 + ELSE IF(nsts(k,ix).EQ.0)THEN + swsol=1 + a=1.0 + b=0.0 + c=-slown**2*risti**2*dnz**2 + tref=ttn(k,ix) + tdiv=1.0 + ENDIF + ENDIF +! +! Now find the solution of the quadratic equation +! + IF(swsol.EQ.1)THEN + rd1=b**2-4.0*a*c + IF(rd1.LT.0.0)rd1=0.0 + tdsh=(-b+sqrt(rd1))/(2.0*a) + trav=(tref+tdsh)/tdiv + IF(tsw1.EQ.1)THEN + travm=MIN(trav,travm) + ELSE + travm=trav + tsw1=1 + ENDIF + ENDIF + ENDIF + ENDDO + ENDIF +ENDDO +ttn(iz,ix)=travm +END SUBROUTINE fouds2 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine adds a value to the binary tree by +! placing a value at the bottom and pushing it up +! to its correct position. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE addtree(iz,ix) +IMPLICIT NONE +INTEGER :: ix,iz,tpp,tpc +TYPE(backpointer) :: exch +! +! ix,iz = grid position of new addition to tree +! tpp = tree position of parent +! tpc = tree position of child +! exch = dummy to exchange btg values +! +! First, increase the size of the tree by one. +! +ntr=ntr+1 +! +! Put new value at base of tree +! +nsts(iz,ix)=ntr +btg(ntr)%px=ix +btg(ntr)%pz=iz +! +! Now filter the new value up to its correct position +! +tpc=ntr +tpp=tpc/2 +DO WHILE(tpp.gt.0) + IF(ttn(iz,ix).lt.ttn(btg(tpp)%pz,btg(tpp)%px))THEN + nsts(iz,ix)=tpp + nsts(btg(tpp)%pz,btg(tpp)%px)=tpc + exch=btg(tpc) + btg(tpc)=btg(tpp) + btg(tpp)=exch + tpc=tpp + tpp=tpc/2 + ELSE + tpp=0 + ENDIF +ENDDO +END SUBROUTINE addtree + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine updates the binary tree after the root +! value has been used. The root is replaced by the value +! at the bottom of the tree, which is then filtered down +! to its correct position. This ensures that the tree remains +! balanced. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE downtree +IMPLICIT NONE +INTEGER :: tpp,tpc +REAL(KIND=i10) :: rd1,rd2 +TYPE(backpointer) :: exch +! +! tpp = tree position of parent +! tpc = tree position of child +! exch = dummy to exchange btg values +! rd1,rd2 = substitution variables +! +! Replace root of tree with its last value +! +IF(ntr.EQ.1)THEN + ntr=ntr-1 + RETURN +ENDIF +nsts(btg(ntr)%pz,btg(ntr)%px)=1 +btg(1)=btg(ntr) +! +! Reduce size of tree by one +! +ntr=ntr-1 +! +! Now filter new root down to its correct position +! +tpp=1 +tpc=2*tpp +DO WHILE(tpc.lt.ntr) +! +! Check which of the two children is smallest - use the smallest +! + rd1=ttn(btg(tpc)%pz,btg(tpc)%px) + rd2=ttn(btg(tpc+1)%pz,btg(tpc+1)%px) + IF(rd1.gt.rd2)THEN + tpc=tpc+1 + ENDIF +! +! Check whether the child is smaller than the parent; if so, then swap, +! if not, then we are done +! + rd1=ttn(btg(tpc)%pz,btg(tpc)%px) + rd2=ttn(btg(tpp)%pz,btg(tpp)%px) + IF(rd1.lt.rd2)THEN + nsts(btg(tpp)%pz,btg(tpp)%px)=tpc + nsts(btg(tpc)%pz,btg(tpc)%px)=tpp + exch=btg(tpc) + btg(tpc)=btg(tpp) + btg(tpp)=exch + tpp=tpc + tpc=2*tpp + ELSE + tpc=ntr+1 + ENDIF +ENDDO +! +! If ntr is an even number, then we still have one more test to do +! +IF(tpc.eq.ntr)THEN + rd1=ttn(btg(tpc)%pz,btg(tpc)%px) + rd2=ttn(btg(tpp)%pz,btg(tpp)%px) + IF(rd1.lt.rd2)THEN + nsts(btg(tpp)%pz,btg(tpp)%px)=tpc + nsts(btg(tpc)%pz,btg(tpc)%px)=tpp + exch=btg(tpc) + btg(tpc)=btg(tpp) + btg(tpp)=exch + ENDIF +ENDIF +END SUBROUTINE downtree + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine updates a value on the binary tree. The FMM +! should only produce updated values that are less than their +! prior values. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE updtree(iz,ix) +IMPLICIT NONE +INTEGER :: ix,iz,tpp,tpc +TYPE(backpointer) :: exch +! +! ix,iz = grid position of new addition to tree +! tpp = tree position of parent +! tpc = tree position of child +! exch = dummy to exchange btg values +! +! Filter the updated value to its correct position +! +tpc=nsts(iz,ix) +tpp=tpc/2 +DO WHILE(tpp.gt.0) + IF(ttn(iz,ix).lt.ttn(btg(tpp)%pz,btg(tpp)%px))THEN + nsts(iz,ix)=tpp + nsts(btg(tpp)%pz,btg(tpp)%px)=tpc + exch=btg(tpc) + btg(tpc)=btg(tpp) + btg(tpp)=exch + tpc=tpp + tpp=tpc/2 + ELSE + tpp=0 + ENDIF +ENDDO +END SUBROUTINE updtree + +END MODULE traveltime + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! MAIN PROGRAM +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: PROGRAM +! CODE: FORTRAN 90 +! This program is designed to implement the Fast Marching +! Method (FMM) for calculating first-arrival traveltimes +! through a 2-D continuous velocity medium in spherical shell +! coordinates (x=theta or latitude, z=phi or longitude). +! It is written in Fortran 90, although it is probably more +! accurately described as Fortran 77 with some of the Fortran 90 +! extensions. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!PROGRAM tomo_surf +subroutine CalSurfG(nx,ny,nz,nparpi,vels,iw,rw,col,dsurf, & + goxdf,gozdf,dvxdf,dvzdf,kmaxRc,kmaxRg,kmaxLc,kmaxLg, & + tRc,tRg,tLc,tLg,wavetype,igrt,periods,depz,minthk, & + scxf,sczf,rcxf,rczf,nrc1,nsrcsurf1,knum1,kmax,nsrcsurf,nrcf, & + nar,writepath) +USE globalp +USE traveltime +IMPLICIT NONE +!CHARACTER (LEN=30) ::grid,frechet +!CHARACTER (LEN=40) :: sources,receivers,otimes +!CHARACTER (LEN=30) :: travelt,rtravel,wrays,cdum +INTEGER :: i,j,k,l,nsrc,tnr,urg +INTEGER :: sgs,isx,isz,sw,idm1,idm2,nnxb,nnzb +INTEGER :: ogx,ogz,grdfx,grdfz,maxbt +REAL(KIND=i10) :: x,z,goxb,gozb,dnxb,dnzb +!REAL(KIND=i10), DIMENSION (:,:), ALLOCATABLE :: scxf,sczf +!REAL(KIND=i10), DIMENSION (:,:,:), ALLOCATABLE :: rcxf,rczf +! +! sources = File containing source locations +! receivers = File containing receiver locations +! grid = File containing grid of velocity vertices for +! resampling on a finer grid with cubic B-splines +! frechet = output file containing matrix of frechet derivatives +! travelt = File name for storage of traveltime field +! wttf = Write traveltimes to file? (0=no,>0=source id) +! fom = Use first-order(0) or mixed-order(1) scheme +! nsrc = number of sources +! scx,scz = source location in r,x,z +! scx,scz = source location in r,x,z +! x,z = temporary variables for source location +! fsrt = find source-receiver traveltimes? (0=no,1=yes) +! rtravel = output file for source-receiver traveltimes +! cdum = dummy character variable ! wrgf = write ray geometries to file? (<0=all,0=no,>0=source id.) +! wrays = file containing raypath geometries +! cfd = calculate Frechet derivatives? (0=no, 1=yes) +! tnr = total number of receivers +! sgs = Extent of refined source grid +! isx,isz = cell containing source +! nnxb,nnzb = Backup for nnz,nnx +! goxb,gozb = Backup for gox,goz +! dnxb,dnzb = Backup for dnx,dnz +! ogx,ogz = Location of refined grid origin +! gridfx,grdfz = Number of refined nodes per cell +! urg = use refined grid (0=no,1=yes,2=previously used) +! maxbt = maximum size of narrow band binary tree +! otimes = file containing source-receiver association information +!c----------------------------------------------------------------- +! variables defined by Hongjian Fang + integer nx,ny,nz + integer kmax,nsrcsurf,nrcf + real vels(nx,ny,nz) + real rw(*) + integer iw(*),col(*) + real dsurf(*) + real goxdf,gozdf,dvxdf,dvzdf + integer kmaxRc,kmaxRg,kmaxLc,kmaxLg + real*8 tRc(*),tRg(*),tLc(*),tLg(*) + integer wavetype(nsrcsurf,kmax) + integer periods(nsrcsurf,kmax),nrc1(nsrcsurf,kmax),nsrcsurf1(kmax) + integer knum1(kmax),igrt(nsrcsurf,kmax) + real scxf(nsrcsurf,kmax),sczf(nsrcsurf,kmax),rcxf(nrcf,nsrcsurf,kmax),rczf(nrcf,nsrcsurf,kmax) + integer nar + real minthk + integer nparpi + + + real vpz(nz),vsz(nz),rhoz(nz),depz(nz) + real*8 pvRc(nx*ny,kmaxRc),pvRg(nx*ny,kmaxRg),pvLc(nx*ny,kmaxLc),pvLg(nx*ny,kmaxLg) + real*8 sen_vsRc(nx*ny,kmaxRc,nz),sen_vpRc(nx*ny,kmaxRc,nz) + real*8 sen_rhoRc(nx*ny,kmaxRc,nz) + real*8 sen_vsRg(nx*ny,kmaxRg,nz),sen_vpRg(nx*ny,kmaxRg,nz) + real*8 sen_rhoRg(nx*ny,kmaxRg,nz) + real*8 sen_vsLc(nx*ny,kmaxLc,nz),sen_vpLc(nx*ny,kmaxLc,nz) + real*8 sen_rhoLc(nx*ny,kmaxLc,nz) + real*8 sen_vsLg(nx*ny,kmaxLg,nz),sen_vpLg(nx*ny,kmaxLg,nz) + real*8 sen_rhoLg(nx*ny,kmaxLg,nz) + real*8 sen_vs(nx*ny,kmax,nz),sen_vp(nx*ny,kmax,nz) + real*8 sen_rho(nx*ny,kmax,nz) + real coe_rho(nz-1),coe_a(nz-1) + real*8 velf(ny*nx) + integer kmax1,kmax2,kmax3,count1 + integer igr + integer iwave + integer knumi,srcnum + real,dimension(:,:),allocatable:: fdm + real row(nparpi) + real vpft(nz-1) + real cbst1 + integer ii,jj,kk,nn,istep + integer level,maxlevel,maxleveld,HorizonType,VerticalType,PorS + real,parameter::ftol=1e-4 + integer writepath +gdx=5 +gdz=5 +asgr=1 +sgdl=8 +sgs=8 +earth=6371.0 +fom=1 +snb=0.5 +goxd=goxdf +gozd=gozdf +dvxd=dvxdf +dvzd=dvzdf +nvx=nx-2 +nvz=ny-2 +ALLOCATE(velv(0:nvz+1,0:nvx+1), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE gridder: REAL velv' +ENDIF +! +! Convert from degrees to radians +! +dvx=dvxd*pi/180.0 +dvz=dvzd*pi/180.0 +gox=(90.0-goxd)*pi/180.0 +goz=gozd*pi/180.0 +! +! Compute corresponding values for propagation grid. +! +nnx=(nvx-1)*gdx+1 +nnz=(nvz-1)*gdz+1 +dnx=dvx/gdx +dnz=dvz/gdz +dnxd=dvxd/gdx +dnzd=dvzd/gdz +ALLOCATE(veln(nnz,nnx), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE gridder: REAL veln' +ENDIF + +! +! Call a subroutine which reads in the velocity grid +! +!CALL gridder(grid) +! +! Read in all source coordinates. +! +! +! Now work out, source by source, the first-arrival traveltime +! field plus source-receiver traveltimes +! and ray paths if required. First, allocate memory to the +! traveltime field array +! +ALLOCATE(ttn(nnz,nnx), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: PROGRAM fmmin2d: REAL ttn' +ENDIF + rbint=0 +! +! Allocate memory for node status and binary trees +! +ALLOCATE(nsts(nnz,nnx)) +maxbt=NINT(snb*nnx*nnz) +ALLOCATE(btg(maxbt)) + +allocate(fdm(0:nvz+1,0:nvx+1)) + + if(kmaxRc.gt.0) then + iwave=2 + igr=0 + call depthkernel(nx,ny,nz,vels,pvRc,sen_vsRc,sen_vpRc, & + sen_rhoRc,iwave,igr,kmaxRc,tRc,depz,minthk) + endif + + if(kmaxRg.gt.0) then + iwave=2 + igr=1 + call depthkernel(nx,ny,nz,vels,pvRg,sen_vsRg,sen_vpRg, & + sen_rhoRg,iwave,igr,kmaxRg,tRg,depz,minthk) + endif + + if(kmaxLc.gt.0) then + iwave=1 + igr=0 + call depthkernel(nx,ny,nz,vels,pvLc,sen_vsLc,sen_vpLc, & + sen_rhoLc,iwave,igr,kmaxLc,tLc,depz,minthk) + endif + + if(kmaxLg.gt.0) then + iwave=1 + igr=1 + call depthkernel(nx,ny,nz,vels,pvLg,sen_vsLg,sen_vpLg, & + sen_rhoLg,iwave,igr,kmaxLg,tLg,depz,minthk) + endif + +nar=0 +count1=0 + +sen_vs=0 +sen_vp=0 +sen_rho=0 +kmax1=kmaxRc +kmax2=kmaxRc+kmaxRg +kmax3=kmaxRc+kmaxRg+kmaxLc +do knumi=1,kmax +do srcnum=1,nsrcsurf1(knum1(knumi)) + if(wavetype(srcnum,knum1(knumi))==2.and.igrt(srcnum,knum1(knumi))==0) then + velf(1:nx*ny)=pvRc(1:nx*ny,periods(srcnum,knum1(knumi))) + sen_vs(:,1:kmax1,:)=sen_vsRc(:,1:kmaxRc,:)!(:,nt(istep),:) + sen_vp(:,1:kmax1,:)=sen_vpRc(:,1:kmaxRc,:)!(:,nt(istep),:) + sen_rho(:,1:kmax1,:)=sen_rhoRc(:,1:kmaxRc,:)!(:,nt(istep),:) + endif + if(wavetype(srcnum,knum1(knumi))==2.and.igrt(srcnum,knum1(knumi))==1) then + velf(1:nx*ny)=pvRg(1:nx*ny,periods(srcnum,knum1(knumi))) + sen_vs(:,kmax1+1:kmax2,:)=sen_vsRg(:,1:kmaxRg,:)!(:,nt,:) + sen_vp(:,kmax1+1:kmax2,:)=sen_vpRg(:,1:kmaxRg,:)!(:,nt,:) + sen_rho(:,kmax1+1:kmax2,:)=sen_rhoRg(:,1:kmaxRg,:)!(:,nt,:) + endif + if(wavetype(srcnum,knum1(knumi))==1.and.igrt(srcnum,knum1(knumi))==0) then + velf(1:nx*ny)=pvLc(1:nx*ny,periods(srcnum,knum1(knumi))) + sen_vs(:,kmax2+1:kmax3,:)=sen_vsLc(:,1:kmaxLc,:)!(:,nt,:) + sen_vp(:,kmax2+1:kmax3,:)=sen_vpLc(:,1:kmaxLc,:)!(:,nt,:) + sen_rho(:,kmax2+1:kmax3,:)=sen_rhoLc(:,1:kmaxLc,:)!(:,nt,:) + endif + if(wavetype(srcnum,knum1(knumi))==1.and.igrt(srcnum,knum1(knumi))==1) then + velf(1:nx*ny)=pvLg(1:nx*ny,periods(srcnum,knum1(knumi))) + sen_vs(:,kmax3+1:kmax,:)=sen_vsLg(:,1:kmaxLg,:)!(:,nt,:) + sen_vp(:,kmax3+1:kmax,:)=sen_vpLg(:,1:kmaxLg,:)!(:,nt,:) + sen_rho(:,kmax3+1:kmax,:)=sen_rhoLg(:,1:kmaxLg,:)!(:,nt,:) + endif + +call gridder(velf) + x=scxf(srcnum,knum1(knumi)) + z=sczf(srcnum,knum1(knumi)) +! +! Begin by computing refined source grid if required +! + urg=0 + IF(asgr.EQ.1)THEN +! +! Back up coarse velocity grid to a holding matrix +! + ALLOCATE(velnb(nnz,nnx)) + ! MODIFIEDY BY HONGJIAN FANG @ USTC 2014/04/17 + velnb(1:nnz,1:nnx)=veln(1:nnz,1:nnx) + nnxb=nnx + nnzb=nnz + dnxb=dnx + dnzb=dnz + goxb=gox + gozb=goz +! +! Identify nearest neighbouring node to source +! + isx=INT((x-gox)/dnx)+1 + isz=INT((z-goz)/dnz)+1 + sw=0 + IF(isx.lt.1.or.isx.gt.nnx)sw=1 + IF(isz.lt.1.or.isz.gt.nnz)sw=1 + IF(sw.eq.1)then + isx=90.0-isx*180.0/pi + isz=isz*180.0/pi + WRITE(6,*)"Source lies outside bounds of model (lat,long)= ",isx,isz + WRITE(6,*)"TERMINATING PROGRAM!!!" + STOP + ENDIF + IF(isx.eq.nnx)isx=isx-1 + IF(isz.eq.nnz)isz=isz-1 +! +! Now find rectangular box that extends outward from the nearest source node +! to "sgs" nodes away. +! + vnl=isx-sgs + IF(vnl.lt.1)vnl=1 + vnr=isx+sgs + IF(vnr.gt.nnx)vnr=nnx + vnt=isz-sgs + IF(vnt.lt.1)vnt=1 + vnb=isz+sgs + IF(vnb.gt.nnz)vnb=nnz + nrnx=(vnr-vnl)*sgdl+1 + nrnz=(vnb-vnt)*sgdl+1 + drnx=dvx/REAL(gdx*sgdl) + drnz=dvz/REAL(gdz*sgdl) + gorx=gox+dnx*(vnl-1) + gorz=goz+dnz*(vnt-1) + nnx=nrnx + nnz=nrnz + dnx=drnx + dnz=drnz + gox=gorx + goz=gorz +! +! Reallocate velocity and traveltime arrays if nnx>nnxb or +! nnz 0)THEN + WRITE(6,*)'Error with DEALLOCATE: PROGRAM fmmin2d: velnb' + ENDIF +ENDIF +enddo +enddo +deallocate(fdm) +deallocate(velv,veln,ttn,nsts,btg) +END subroutine +SUBROUTINE gridder(pv) +!subroutine gridder(pv) +!subroutine gridder() +USE globalp +IMPLICIT NONE +INTEGER :: i,j,l,m,i1,j1,conx,conz,stx,stz +REAL(KIND=i10) :: u,sumi,sumj +REAL(KIND=i10), DIMENSION(:,:), ALLOCATABLE :: ui,vi +!CHARACTER (LEN=30) :: grid +! +! u = independent parameter for b-spline +! ui,vi = bspline basis functions +! conx,conz = variables for edge of B-spline grid +! stx,stz = counters for veln grid points +! sumi,sumj = summation variables for computing b-spline +! +!C--------------------------------------------------------------- +double precision pv(*) +!integer count1 +!C--------------------------------------------------------------- +! Open the grid file and read in the velocity grid. +! +!OPEN(UNIT=10,FILE=grid,STATUS='old') +!READ(10,*)nvx,nvz +!READ(10,*)goxd,gozd +!READ(10,*)dvxd,dvzd +!count1=0 +DO i=0,nvz+1 + DO j=0,nvx+1 +! count1=count1+1 +! READ(10,*)velv(i,j) +! velv(i,j)=real(pv(count1)) + velv(i,j)=real(pv(i*(nvx+2)+j+1)) + ENDDO +ENDDO +!CLOSE(10) +! +! Convert from degrees to radians +! +! +! Now dice up the grid +! +ALLOCATE(ui(gdx+1,4), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: Subroutine gridder: REAL ui' +ENDIF +DO i=1,gdx+1 + u=gdx + u=(i-1)/u + ui(i,1)=(1.0-u)**3/6.0 + ui(i,2)=(4.0-6.0*u**2+3.0*u**3)/6.0 + ui(i,3)=(1.0+3.0*u+3.0*u**2-3.0*u**3)/6.0 + ui(i,4)=u**3/6.0 +ENDDO +ALLOCATE(vi(gdz+1,4), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: Subroutine gridder: REAL vi' +ENDIF +DO i=1,gdz+1 + u=gdz + u=(i-1)/u + vi(i,1)=(1.0-u)**3/6.0 + vi(i,2)=(4.0-6.0*u**2+3.0*u**3)/6.0 + vi(i,3)=(1.0+3.0*u+3.0*u**2-3.0*u**3)/6.0 + vi(i,4)=u**3/6.0 +ENDDO +DO i=1,nvz-1 + conz=gdz + IF(i==nvz-1)conz=gdz+1 + DO j=1,nvx-1 + conx=gdx + IF(j==nvx-1)conx=gdx+1 + DO l=1,conz + stz=gdz*(i-1)+l + DO m=1,conx + stx=gdx*(j-1)+m + sumi=0.0 + DO i1=1,4 + sumj=0.0 + DO j1=1,4 + sumj=sumj+ui(m,j1)*velv(i-2+i1,j-2+j1) + ENDDO + sumi=sumi+vi(l,i1)*sumj + ENDDO + veln(stz,stx)=sumi + ENDDO + ENDDO + ENDDO +ENDDO +DEALLOCATE(ui,vi, STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with DEALLOCATE: SUBROUTINE gridder: REAL ui,vi' +ENDIF +END SUBROUTINE gridder + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine is similar to bsplreg except that it has been +! modified to deal with source grid refinement +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE bsplrefine +USE globalp +INTEGER :: i,j,k,l,i1,j1,st1,st2,nrzr,nrxr +INTEGER :: origx,origz,conx,conz,idm1,idm2 +REAL(KIND=i10) :: u,v +REAL(KIND=i10), DIMENSION (4) :: sum +REAL(KIND=i10), DIMENSION(gdx*sgdl+1,gdz*sgdl+1,4) :: ui,vi +! +! nrxr,nrzr = grid refinement level for source grid in x,z +! origx,origz = local origin of refined source grid +! +! Begin by calculating the values of the basis functions +! +nrxr=gdx*sgdl +nrzr=gdz*sgdl +DO i=1,nrzr+1 + v=nrzr + v=(i-1)/v + DO j=1,nrxr+1 + u=nrxr + u=(j-1)/u + ui(j,i,1)=(1.0-u)**3/6.0 + ui(j,i,2)=(4.0-6.0*u**2+3.0*u**3)/6.0 + ui(j,i,3)=(1.0+3.0*u+3.0*u**2-3.0*u**3)/6.0 + ui(j,i,4)=u**3/6.0 + vi(j,i,1)=(1.0-v)**3/6.0 + vi(j,i,2)=(4.0-6.0*v**2+3.0*v**3)/6.0 + vi(j,i,3)=(1.0+3.0*v+3.0*v**2-3.0*v**3)/6.0 + vi(j,i,4)=v**3/6.0 + ENDDO +ENDDO +! +! Calculate the velocity values. +! +origx=(vnl-1)*sgdl+1 +origz=(vnt-1)*sgdl+1 +DO i=1,nvz-1 + conz=nrzr + IF(i==nvz-1)conz=nrzr+1 + DO j=1,nvx-1 + conx=nrxr + IF(j==nvx-1)conx=nrxr+1 + DO k=1,conz + st1=gdz*(i-1)+(k-1)/sgdl+1 + IF(st1.LT.vnt.OR.st1.GT.vnb)CYCLE + st1=nrzr*(i-1)+k + DO l=1,conx + st2=gdx*(j-1)+(l-1)/sgdl+1 + IF(st2.LT.vnl.OR.st2.GT.vnr)CYCLE + st2=nrxr*(j-1)+l + DO i1=1,4 + sum(i1)=0.0 + DO j1=1,4 + sum(i1)=sum(i1)+ui(l,k,j1)*velv(i-2+i1,j-2+j1) + ENDDO + sum(i1)=vi(l,k,i1)*sum(i1) + ENDDO + idm1=st1-origz+1 + idm2=st2-origx+1 + IF(idm1.LT.1.OR.idm1.GT.nnz)CYCLE + IF(idm2.LT.1.OR.idm2.GT.nnx)CYCLE + veln(idm1,idm2)=sum(1)+sum(2)+sum(3)+sum(4) + ENDDO + ENDDO + ENDDO +ENDDO +END SUBROUTINE bsplrefine +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine calculates all receiver traveltimes for +! a given source and writes the results to file. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!SUBROUTINE srtimes(scx,scz,rcx1,rcz1,cbst1) +SUBROUTINE srtimes(scx,scz,rcx1,rcz1,cbst1) +USE globalp +IMPLICIT NONE +INTEGER :: i,k,l,irx,irz,sw,isx,isz,csid +INTEGER, PARAMETER :: noray=0,yesray=1 +INTEGER, PARAMETER :: i5=SELECTED_REAL_KIND(6) +REAL(KIND=i5) :: trr +REAL(KIND=i5), PARAMETER :: norayt=0.0 +REAL(KIND=i10) :: drx,drz,produ,scx,scz +REAL(KIND=i10) :: rcx1,rcz1,cbst1 +REAL(KIND=i10) :: sred,dpl,rd1,vels,velr +REAL(KIND=i10), DIMENSION (2,2) :: vss +!!------------------------------------------------------ +! modified by Hongjian Fang @ USTC + integer no_p,nsrc + real dist +! real cbst(*) !note that the type difference(kind=i5 vs real) +! integer cbst_stat(*) +!!------------------------------------------------------ +! +! irx,irz = Coordinates of cell containing receiver +! trr = traveltime value at receiver +! produ = dummy multiplier +! drx,drz = receiver distance from (i,j,k) grid node +! scx,scz = source coordinates +! isx,isz = source cell location +! sred = Distance from source to receiver +! dpl = Minimum path length in source neighbourhood. +! vels,velr = velocity at source and receiver +! vss = velocity at four grid points about source or receiver. +! csid = current source ID +! noray = switch to indicate no ray present +! norayt = default value given to null ray +! yesray = switch to indicate that ray is present +! +! Determine source-receiver traveltimes one at a time. +! +!0605DO i=1,nrc +!0605 IF(srs(i,csid).EQ.0)THEN +!0605! WRITE(10,*)noray,norayt +!0605 CYCLE +!0605 ENDIF +! +! The first step is to locate the receiver in the grid. +! + irx=INT((rcx1-gox)/dnx)+1 + irz=INT((rcz1-goz)/dnz)+1 + sw=0 + IF(irx.lt.1.or.irx.gt.nnx)sw=1 + IF(irz.lt.1.or.irz.gt.nnz)sw=1 + IF(sw.eq.1)then + irx=90.0-irx*180.0/pi + irz=irz*180.0/pi + WRITE(6,*)"srtimes Receiver lies outside model (lat,long)= ",irx,irz + WRITE(6,*)"TERMINATING PROGRAM!!!!" + STOP + ENDIF + IF(irx.eq.nnx)irx=irx-1 + IF(irz.eq.nnz)irz=irz-1 +! +! Location of receiver successfully found within the grid. Now approximate +! traveltime at receiver using bilinear interpolation from four +! surrounding grid points. Note that bilinear interpolation is a poor +! approximation when traveltime gradient varies significantly across a cell, +! particularly near the source. Thus, we use an improved approximation in this +! case. First, locate current source cell. +! + isx=INT((scx-gox)/dnx)+1 + isz=INT((scz-goz)/dnz)+1 + dpl=dnx*earth + rd1=dnz*earth*SIN(gox) + IF(rd1.LT.dpl)dpl=rd1 + rd1=dnz*earth*SIN(gox+(nnx-1)*dnx) + IF(rd1.LT.dpl)dpl=rd1 + sred=((scx-rcx1)*earth)**2 + sred=sred+((scz-rcz1)*earth*SIN(rcx1))**2 + sred=SQRT(sred) + IF(sred.LT.dpl)sw=1 + IF(isx.EQ.irx)THEN + IF(isz.EQ.irz)sw=1 + ENDIF + IF(sw.EQ.1)THEN +! +! Compute velocity at source and receiver +! + DO k=1,2 + DO l=1,2 + vss(k,l)=veln(isz-1+l,isx-1+k) + ENDDO + ENDDO + drx=(scx-gox)-(isx-1)*dnx + drz=(scz-goz)-(isz-1)*dnz + CALL bilinear(vss,drx,drz,vels) + DO k=1,2 + DO l=1,2 + vss(k,l)=veln(irz-1+l,irx-1+k) + ENDDO + ENDDO + drx=(rcx1-gox)-(irx-1)*dnx + drz=(rcz1-goz)-(irz-1)*dnz + CALL bilinear(vss,drx,drz,velr) + trr=2.0*sred/(vels+velr) + ELSE + drx=(rcx1-gox)-(irx-1)*dnx + drz=(rcz1-goz)-(irz-1)*dnz + trr=0.0 + DO k=1,2 + DO l=1,2 + produ=(1.0-ABS(((l-1)*dnz-drz)/dnz))*(1.0-ABS(((k-1)*dnx-drx)/dnx)) + trr=trr+ttn(irz-1+l,irx-1+k)*produ + ENDDO + ENDDO + ENDIF +! WRITE(10,*)yesray,trr +!!----------------------------------------------------------------- +! modified bu Hongjian Fang @ USTC +! count2=count2+1 +! cbst((no_p-1)*nsrc*nrc+(csid-1)*nrc+i)=trr + cbst1=trr +! call delsph(scx,scz,rcx(i),rcz(i),dist) +! travel_path(count2)=dist +!cbst_stat((no_p-1)*nsrc*nrc+(csid-1)*nrc+i)=yesray +!0605ENDDO +END SUBROUTINE srtimes + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine calculates ray path geometries for each +! source-receiver combination. It will also compute +! Frechet derivatives using these ray paths if required. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!SUBROUTINE rpaths(wrgf,csid,cfd,scx,scz) +!SUBROUTINE rpaths() +SUBROUTINE rpaths(scx,scz,fdm,surfrcx,surfrcz,writepath) +USE globalp +IMPLICIT NONE +INTEGER, PARAMETER :: i5=SELECTED_REAL_KIND(5,10) +INTEGER, PARAMETER :: nopath=0 +INTEGER :: i,j,k,l,m,n,ipx,ipz,ipxr,ipzr,nrp,sw +!fang!INTEGER :: wrgf,cfd,csid,ipxo,ipzo,isx,isz +INTEGER :: ipxo,ipzo,isx,isz +INTEGER :: ivx,ivz,ivxo,ivzo,nhp,maxrp +INTEGER :: ivxt,ivzt,ipxt,ipzt,isum,igref +INTEGER, DIMENSION (4) :: chp +REAL(KIND=i5) :: rayx,rayz +REAL(KIND=i10) :: dpl,rd1,rd2,xi,zi,vel,velo +REAL(KIND=i10) :: v,w,rigz,rigx,dinc,scx,scz +REAL(KIND=i10) :: dtx,dtz,drx,drz,produ,sred +REAL(KIND=i10), DIMENSION (:), ALLOCATABLE :: rgx,rgz +!fang!REAL(KIND=i5), DIMENSION (:,:), ALLOCATABLE :: fdm +REAL(KIND=i10), DIMENSION (4) :: vrat,vi,wi,vio,wio +!fang!------------------------------------------------ +real fdm(0:nvz+1,0:nvx+1) +REAL(KIND=i10) surfrcx,surfrcz +integer writepath +!fang!------------------------------------------------ +! +! ipx,ipz = Coordinates of cell containing current point +! ipxr,ipzr = Same as ipx,apz except for refined grid +! ipxo,ipzo = Coordinates of previous point +! rgx,rgz = (x,z) coordinates of ray geometry +! ivx,ivz = Coordinates of B-spline vertex containing current point +! ivxo,ivzo = Coordinates of previous point +! maxrp = maximum number of ray points +! nrp = number of points to describe ray +! dpl = incremental path length of ray +! xi,zi = edge of model coordinates +! dtx,dtz = components of gradT +! wrgf = Write out raypaths? (<0=all,0=no,>0=souce id) +! cfd = calculate Frechet derivatives? (0=no,1=yes) +! csid = current source id +! fdm = Frechet derivative matrix +! nhp = Number of ray segment-B-spline cell hit points +! vrat = length ratio of ray sub-segment +! chp = pointer to incremental change in x or z cell +! drx,drz = distance from reference node of cell +! produ = variable for trilinear interpolation +! vel = velocity at current point +! velo = velocity at previous point +! v,w = local variables of x,z +! vi,wi = B-spline basis functions at current point +! vio,wio = vi,wi for previous point +! ivxt,ivzt = temporary ivr,ivx,ivz values +! rigx,rigz = end point of sub-segment of ray path +! ipxt,ipzt = temporary ipx,ipz values +! dinc = path length of ray sub-segment +! rayr,rayx,rayz = ray path coordinates in single precision +! isx,isz = current source cell location +! scx,scz = current source coordinates +! sred = source to ray endpoint distance +! igref = ray endpoint lies in refined grid? (0=no,1=yes) +! nopath = switch to indicate that no path is present +! +! Allocate memory to arrays for storing ray path geometry +! +maxrp=nnx*nnz +ALLOCATE(rgx(maxrp+1), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE rpaths: REAL rgx' +ENDIF +ALLOCATE(rgz(maxrp+1), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE rpaths: REAL rgz' +ENDIF +! +! Allocate memory to partial derivative array +! +!fang!IF(cfd.EQ.1)THEN +!fang! ALLOCATE(fdm(0:nvz+1,0:nvx+1), STAT=checkstat) +!fang! IF(checkstat > 0)THEN +!fang! WRITE(6,*)'Error with ALLOCATE: SUBROUTINE rpaths: REAL fdm' +!fang! ENDIF +!fang!ENDIF +! +! Locate current source cell +! +IF(asgr.EQ.1)THEN + isx=INT((scx-goxr)/dnxr)+1 + isz=INT((scz-gozr)/dnzr)+1 +ELSE + isx=INT((scx-gox)/dnx)+1 + isz=INT((scz-goz)/dnz)+1 +ENDIF +! +! Set ray incremental path length equal to half width +! of cell +! + dpl=dnx*earth + rd1=dnz*earth*SIN(gox) + IF(rd1.LT.dpl)dpl=rd1 + rd1=dnz*earth*SIN(gox+(nnx-1)*dnx) + IF(rd1.LT.dpl)dpl=rd1 + dpl=0.5*dpl +! +! Loop through all the receivers +! +!fang!DO i=1,nrc +! +! If path does not exist, then cycle the loop +! +fdm=0 +!fang! IF(cfd.EQ.1)THEN +!fang! fdm=0.0 +!fang! ENDIF +!fang! IF(srs(i,csid).EQ.0)THEN +!fang! IF(wrgf.EQ.csid.OR.wrgf.LT.0)THEN +!fang! WRITE(40)nopath +!fang! ENDIF +!fang! IF(cfd.EQ.1)THEN +!fang! WRITE(50)nopath +!fang! ENDIF +!fang! CYCLE +!fang! ENDIF +! +! The first step is to locate the receiver in the grid. +! + ipx=INT((surfrcx-gox)/dnx)+1 + ipz=INT((surfrcz-goz)/dnz)+1 + sw=0 + IF(ipx.lt.1.or.ipx.ge.nnx)sw=1 + IF(ipz.lt.1.or.ipz.ge.nnz)sw=1 + IF(sw.eq.1)then + ipx=90.0-ipx*180.0/pi + ipz=ipz*180.0/pi + WRITE(6,*)"rpath Receiver lies outside model (lat,long)= ",ipx,ipz + WRITE(6,*)"TERMINATING PROGRAM!!!" + STOP + ENDIF + IF(ipx.eq.nnx)ipx=ipx-1 + IF(ipz.eq.nnz)ipz=ipz-1 +! +! First point of the ray path is the receiver +! + rgx(1)=surfrcx + rgz(1)=surfrcz +! +! Test to see if receiver is in source neighbourhood +! + sred=((scx-rgx(1))*earth)**2 + sred=sred+((scz-rgz(1))*earth*SIN(rgx(1)))**2 + sred=SQRT(sred) + IF(sred.LT.2.0*dpl)THEN + rgx(2)=scx + rgz(2)=scz + nrp=2 + sw=1 + ENDIF +! +! If required, see if receiver lies within refined grid +! + IF(asgr.EQ.1)THEN + ipxr=INT((surfrcx-goxr)/dnxr)+1 + ipzr=INT((surfrcz-gozr)/dnzr)+1 + igref=1 + IF(ipxr.LT.1.OR.ipxr.GE.nnxr)igref=0 + IF(ipzr.LT.1.OR.ipzr.GE.nnzr)igref=0 + IF(igref.EQ.1)THEN + IF(nstsr(ipzr,ipxr).NE.0.OR.nstsr(ipzr+1,ipxr).NE.0)igref=0 + IF(nstsr(ipzr,ipxr+1).NE.0.OR.nstsr(ipzr+1,ipxr+1).NE.0)igref=0 + ENDIF + ELSE + igref=0 + ENDIF +! +! Due to the method for calculating traveltime gradient, if the +! the ray end point lies in the source cell, then we are also done. +! + IF(sw.EQ.0)THEN + IF(asgr.EQ.1)THEN + IF(igref.EQ.1)THEN + IF(ipxr.EQ.isx)THEN + IF(ipzr.EQ.isz)THEN + rgx(2)=scx + rgz(2)=scz + nrp=2 + sw=1 + ENDIF + ENDIF + ENDIF + ELSE + IF(ipx.EQ.isx)THEN + IF(ipz.EQ.isz)THEN + rgx(2)=scx + rgz(2)=scz + nrp=2 + sw=1 + ENDIF + ENDIF + ENDIF + ENDIF +! +! Now trace ray from receiver to "source" +! + DO j=1,maxrp + IF(sw.EQ.1)EXIT +! +! Calculate traveltime gradient vector for current cell using +! a first-order or second-order scheme. +! + IF(igref.EQ.1)THEN +! +! In this case, we are in the refined grid. +! +! First order scheme applied here. +! + dtx=ttnr(ipzr,ipxr+1)-ttnr(ipzr,ipxr) + dtx=dtx+ttnr(ipzr+1,ipxr+1)-ttnr(ipzr+1,ipxr) + dtx=dtx/(2.0*earth*dnxr) + dtz=ttnr(ipzr+1,ipxr)-ttnr(ipzr,ipxr) + dtz=dtz+ttnr(ipzr+1,ipxr+1)-ttnr(ipzr,ipxr+1) + dtz=dtz/(2.0*earth*SIN(rgx(j))*dnzr) + ELSE +! +! Here, we are in the coarse grid. +! +! First order scheme applied here. +! + dtx=ttn(ipz,ipx+1)-ttn(ipz,ipx) + dtx=dtx+ttn(ipz+1,ipx+1)-ttn(ipz+1,ipx) + dtx=dtx/(2.0*earth*dnx) + dtz=ttn(ipz+1,ipx)-ttn(ipz,ipx) + dtz=dtz+ttn(ipz+1,ipx+1)-ttn(ipz,ipx+1) + dtz=dtz/(2.0*earth*SIN(rgx(j))*dnz) + ENDIF +! +! Calculate the next ray path point +! + rd1=SQRT(dtx**2+dtz**2) + rgx(j+1)=rgx(j)-dpl*dtx/(earth*rd1) + rgz(j+1)=rgz(j)-dpl*dtz/(earth*SIN(rgx(j))*rd1) +! +! Determine which cell the new ray endpoint +! lies in. +! + ipxo=ipx + ipzo=ipz + IF(asgr.EQ.1)THEN +! +! Here, we test to see whether the ray endpoint lies +! within a cell of the refined grid +! + ipxr=INT((rgx(j+1)-goxr)/dnxr)+1 + ipzr=INT((rgz(j+1)-gozr)/dnzr)+1 + igref=1 + IF(ipxr.LT.1.OR.ipxr.GE.nnxr)igref=0 + IF(ipzr.LT.1.OR.ipzr.GE.nnzr)igref=0 + IF(igref.EQ.1)THEN + IF(nstsr(ipzr,ipxr).NE.0.OR.nstsr(ipzr+1,ipxr).NE.0)igref=0 + IF(nstsr(ipzr,ipxr+1).NE.0.OR.nstsr(ipzr+1,ipxr+1).NE.0)igref=0 + ENDIF + ipx=INT((rgx(j+1)-gox)/dnx)+1 + ipz=INT((rgz(j+1)-goz)/dnz)+1 + ELSE + ipx=INT((rgx(j+1)-gox)/dnx)+1 + ipz=INT((rgz(j+1)-goz)/dnz)+1 + igref=0 + ENDIF +! +! Test the proximity of the source to the ray end point. +! If it is less than dpl then we are done +! + sred=((scx-rgx(j+1))*earth)**2 + sred=sred+((scz-rgz(j+1))*earth*SIN(rgx(j+1)))**2 + sred=SQRT(sred) + sw=0 + IF(sred.LT.2.0*dpl)THEN + rgx(j+2)=scx + rgz(j+2)=scz + nrp=j+2 + sw=1 +!fang! IF(cfd.NE.1)EXIT + ENDIF +! +! Due to the method for calculating traveltime gradient, if the +! the ray end point lies in the source cell, then we are also done. +! + IF(sw.EQ.0)THEN + IF(asgr.EQ.1)THEN + IF(igref.EQ.1)THEN + IF(ipxr.EQ.isx)THEN + IF(ipzr.EQ.isz)THEN + rgx(j+2)=scx + rgz(j+2)=scz + nrp=j+2 + sw=1 + !fang! IF(cfd.NE.1)EXIT + ENDIF + ENDIF + ENDIF + ELSE + IF(ipx.EQ.isx)THEN + IF(ipz.EQ.isz)THEN + rgx(j+2)=scx + rgz(j+2)=scz + nrp=j+2 + sw=1 + !fang! IF(cfd.NE.1)EXIT + ENDIF + ENDIF + ENDIF + ENDIF +! +! Test whether ray path segment extends beyond +! box boundaries +! + IF(ipx.LT.1)THEN + rgx(j+1)=gox + ipx=1 + rbint=1 + ENDIF + IF(ipx.GE.nnx)THEN + rgx(j+1)=gox+(nnx-1)*dnx + ipx=nnx-1 + rbint=1 + ENDIF + IF(ipz.LT.1)THEN + rgz(j+1)=goz + ipz=1 + rbint=1 + ENDIF + IF(ipz.GE.nnz)THEN + rgz(j+1)=goz+(nnz-1)*dnz + ipz=nnz-1 + rbint=1 + ENDIF +! +! Calculate the Frechet derivatives if required. +! + !fang! IF(cfd.EQ.1)THEN +! +! First determine which B-spline cell the refined cells +! containing the ray path segment lies in. If they lie +! in more than one, then we need to divide the problem +! into separate parts (up to three). +! + ivx=INT((ipx-1)/gdx)+1 + ivz=INT((ipz-1)/gdz)+1 + ivxo=INT((ipxo-1)/gdx)+1 + ivzo=INT((ipzo-1)/gdz)+1 +! +! Calculate up to two hit points between straight +! ray segment and cell faces. +! + nhp=0 + IF(ivx.NE.ivxo)THEN + nhp=nhp+1 + IF(ivx.GT.ivxo)THEN + xi=gox+(ivx-1)*dvx + ELSE + xi=gox+ivx*dvx + ENDIF + vrat(nhp)=(xi-rgx(j))/(rgx(j+1)-rgx(j)) + chp(nhp)=1 + ENDIF + IF(ivz.NE.ivzo)THEN + nhp=nhp+1 + IF(ivz.GT.ivzo)THEN + zi=goz+(ivz-1)*dvz + ELSE + zi=goz+ivz*dvz + ENDIF + rd1=(zi-rgz(j))/(rgz(j+1)-rgz(j)) + IF(nhp.EQ.1)THEN + vrat(nhp)=rd1 + chp(nhp)=2 + ELSE + IF(rd1.GE.vrat(nhp-1))THEN + vrat(nhp)=rd1 + chp(nhp)=2 + ELSE + vrat(nhp)=vrat(nhp-1) + chp(nhp)=chp(nhp-1) + vrat(nhp-1)=rd1 + chp(nhp-1)=2 + ENDIF + ENDIF + ENDIF + nhp=nhp+1 + vrat(nhp)=1.0 + chp(nhp)=0 +! +! Calculate the velocity, v and w values of the +! first point +! + drx=(rgx(j)-gox)-(ipxo-1)*dnx + drz=(rgz(j)-goz)-(ipzo-1)*dnz + vel=0.0 + DO l=1,2 + DO m=1,2 + produ=(1.0-ABS(((m-1)*dnz-drz)/dnz)) + produ=produ*(1.0-ABS(((l-1)*dnx-drx)/dnx)) + IF(ipzo-1+m.LE.nnz.AND.ipxo-1+l.LE.nnx)THEN + vel=vel+veln(ipzo-1+m,ipxo-1+l)*produ + ENDIF + ENDDO + ENDDO + drx=(rgx(j)-gox)-(ivxo-1)*dvx + drz=(rgz(j)-goz)-(ivzo-1)*dvz + v=drx/dvx + w=drz/dvz +! +! Calculate the 12 basis values at the point +! + vi(1)=(1.0-v)**3/6.0 + vi(2)=(4.0-6.0*v**2+3.0*v**3)/6.0 + vi(3)=(1.0+3.0*v+3.0*v**2-3.0*v**3)/6.0 + vi(4)=v**3/6.0 + wi(1)=(1.0-w)**3/6.0 + wi(2)=(4.0-6.0*w**2+3.0*w**3)/6.0 + wi(3)=(1.0+3.0*w+3.0*w**2-3.0*w**3)/6.0 + wi(4)=w**3/6.0 + ivxt=ivxo + ivzt=ivzo +! +! Now loop through the one or more sub-segments of the +! ray path segment and calculate partial derivatives +! + DO k=1,nhp + velo=vel + vio=vi + wio=wi + IF(k.GT.1)THEN + IF(chp(k-1).EQ.1)THEN + ivxt=ivx + ELSE IF(chp(k-1).EQ.2)THEN + ivzt=ivz + ENDIF + ENDIF +! +! Calculate the velocity, v and w values of the +! new point +! + rigz=rgz(j)+vrat(k)*(rgz(j+1)-rgz(j)) + rigx=rgx(j)+vrat(k)*(rgx(j+1)-rgx(j)) + ipxt=INT((rigx-gox)/dnx)+1 + ipzt=INT((rigz-goz)/dnz)+1 + drx=(rigx-gox)-(ipxt-1)*dnx + drz=(rigz-goz)-(ipzt-1)*dnz + vel=0.0 + DO m=1,2 + DO n=1,2 + produ=(1.0-ABS(((n-1)*dnz-drz)/dnz)) + produ=produ*(1.0-ABS(((m-1)*dnx-drx)/dnx)) + IF(ipzt-1+n.LE.nnz.AND.ipxt-1+m.LE.nnx)THEN + vel=vel+veln(ipzt-1+n,ipxt-1+m)*produ + ENDIF + ENDDO + ENDDO + drx=(rigx-gox)-(ivxt-1)*dvx + drz=(rigz-goz)-(ivzt-1)*dvz + v=drx/dvx + w=drz/dvz +! +! Calculate the 8 basis values at the new point +! + vi(1)=(1.0-v)**3/6.0 + vi(2)=(4.0-6.0*v**2+3.0*v**3)/6.0 + vi(3)=(1.0+3.0*v+3.0*v**2-3.0*v**3)/6.0 + vi(4)=v**3/6.0 + wi(1)=(1.0-w)**3/6.0 + wi(2)=(4.0-6.0*w**2+3.0*w**3)/6.0 + wi(3)=(1.0+3.0*w+3.0*w**2-3.0*w**3)/6.0 + wi(4)=w**3/6.0 +! +! Calculate the incremental path length +! + IF(k.EQ.1)THEN + dinc=vrat(k)*dpl + ELSE + dinc=(vrat(k)-vrat(k-1))*dpl + ENDIF +! +! Now compute the 16 contributions to the partial +! derivatives. +! + DO l=1,4 + DO m=1,4 + rd1=vi(m)*wi(l)/vel**2 + rd2=vio(m)*wio(l)/velo**2 + rd1=-(rd1+rd2)*dinc/2.0 + !fang! rd1=vi(m)*wi(l) + !fang! rd2=vio(m)*wio(l) + !fang! rd1=(rd1+rd2)*dinc/2.0 + rd2=fdm(ivzt-2+l,ivxt-2+m) + fdm(ivzt-2+l,ivxt-2+m)=rd1+rd2 + ENDDO + ENDDO + ENDDO + !fang! ENDIF +!fang! IF(j.EQ.maxrp.AND.sw.EQ.0)THEN +!fang! WRITE(6,*)'Error with ray path detected!!!' +!fang! WRITE(6,*)'Source id: ',csid +!fang! WRITE(6,*)'Receiver id: ',i +!fang! ENDIF + ENDDO +! +! Write ray paths to output file +! +!fang! IF(wrgf.EQ.csid.OR.wrgf.LT.0)THEN + if(writepath == 1) then + WRITE(40,*)'#',nrp + DO j=1,nrp + rayx=(pi/2-rgx(j))*180.0/pi + rayz=rgz(j)*180.0/pi + WRITE(40,*)rayx,rayz + ENDDO + endif +!fang! ENDIF +! +! Write partial derivatives to output file +! +!fang! IF(cfd.EQ.1)THEN +!fang!! +!fang!! Determine the number of non-zero elements. +!fang!! +!fang! isum=0 +!fang! DO j=0,nvz+1 +!fang! DO k=0,nvx+1 +!fang! IF(ABS(fdm(j,k)).GE.ftol)isum=isum+1 +!fang! ENDDO +!fang! ENDDO +!fang! WRITE(50)isum +!fang! isum=0 +!fang! DO j=0,nvz+1 +!fang! DO k=0,nvx+1 +!fang! isum=isum+1 +!fang! IF(ABS(fdm(j,k)).GE.ftol)WRITE(50)isum,fdm(j,k) +!fang! ENDDO +!fang! ENDDO +!fang! ENDIF +!fang!ENDDO +!fang!IF(cfd.EQ.1)THEN +!fang! DEALLOCATE(fdm, STAT=checkstat) +!fang! IF(checkstat > 0)THEN +!fang! WRITE(6,*)'Error with DEALLOCATE: SUBROUTINE rpaths: fdm' +!fang! ENDIF +!fang!ENDIF +DEALLOCATE(rgx,rgz, STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with DEALLOCATE: SUBROUTINE rpaths: rgx,rgz' +ENDIF +END SUBROUTINE rpaths + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! TYPE: SUBROUTINE +! CODE: FORTRAN 90 +! This subroutine is passed four node values which lie on +! the corners of a rectangle and the coordinates of a point +! lying within the rectangle. It calculates the value at +! the internal point by using bilinear interpolation. +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +SUBROUTINE bilinear(nv,dsx,dsz,biv) +USE globalp +IMPLICIT NONE +INTEGER :: i,j +REAL(KIND=i10) :: dsx,dsz,biv +REAL(KIND=i10), DIMENSION(2,2) :: nv +REAL(KIND=i10) :: produ +! +! nv = four node vertex values +! dsx,dsz = distance between internal point and top left node +! dnx,dnz = width and height of node rectangle +! biv = value at internal point calculated by bilinear interpolation +! produ = product variable +! +biv=0.0 +DO i=1,2 + DO j=1,2 + produ=(1.0-ABS(((i-1)*dnx-dsx)/dnx))*(1.0-ABS(((j-1)*dnz-dsz)/dnz)) + biv=biv+nv(i,j)*produ + ENDDO +ENDDO +END SUBROUTINE bilinear + + + subroutine refineGrid2LayerMdl(minthk0,mmax,dep,vp,vs,rho,& + rmax,rdep,rvp,rvs,rrho,rthk) +!!--------------------------------------------------------------------c +!!refine grid based model to layerd based model +!!INPUT: minthk: is the minimum thickness of the refined layered model +!! mmax: number of depth grid points in the model +!! dep, vp, vs, rho: the depth-grid model parameters +!! rmax: number of layers in the fined layered model +!! rdep, rvp, rvs, rrho, rthk: the refined layered velocity model +!! + implicit none + integer NL + parameter (NL=200) + integer mmax,rmax + real minthk0 + real minthk + real dep(*),vp(*),vs(*),rho(*) + real rdep(NL),rvp(NL),rvs(NL),rrho(NL),rthk(NL) + integer nsublay(NL) + real thk,newthk,initdep + integer i,j,k,ngrid + + k = 0 + initdep = 0.0 + do i = 1, mmax-1 + thk = dep(i+1)-dep(i) + minthk = thk/minthk0 + nsublay(i) = int((thk+1.0e-4)/minthk) + 1 + ngrid = nsublay(i)+1 + newthk = thk/nsublay(i) + do j = 1, nsublay(i) + k = k + 1 + rthk(k) = newthk + rdep(k) = initdep + rthk(k) + initdep = rdep(k) + rvp(k) = vp(i)+(2*j-1)*(vp(i+1)-vp(i))/(2*nsublay(i)) + rvs(k) = vs(i)+(2*j-1)*(vs(i+1)-vs(i))/(2*nsublay(i)) + rrho(k) = rho(i)+(2*j-1)*(rho(i+1)-rho(i))/(2*nsublay(i)) + enddo + enddo +!! half space model + k = k + 1 + rthk(k) = 0.0 + rvp(k) = vp(mmax) + rvs(k) = vs(mmax) + rrho(k) = rho(mmax) + + rmax = k + +!! do i = 1, mmax +!! write(*,*) dep(i),vp(i),vs(i),rho(i) +!! enddo +!! print *, '---------------------------------' +!! do i = 1, rmax +!! write(*,*) rdep(i),rthk(i),rvp(i),rvs(i),rrho(i) +!! enddo + + return + end +subroutine synthetic(nx,ny,nz,nparpi,vels,obst, & + goxdf,gozdf,dvxdf,dvzdf,kmaxRc,kmaxRg,kmaxLc,kmaxLg, & + tRc,tRg,tLc,tLg,wavetype,igrt,periods,depz,minthk, & + scxf,sczf,rcxf,rczf,nrc1,nsrcsurf1,knum1,kmax,nsrcsurf,nrcf,noiselevel) + +USE globalp +USE traveltime +IMPLICIT NONE +!CHARACTER (LEN=30) ::grid,frechet +!CHARACTER (LEN=40) :: sources,receivers,otimes +!CHARACTER (LEN=30) :: travelt,rtravel,wrays,cdum +INTEGER :: i,j,k,l,nsrc,tnr,urg +INTEGER :: sgs,isx,isz,sw,idm1,idm2,nnxb,nnzb +INTEGER :: ogx,ogz,grdfx,grdfz,maxbt +REAL(KIND=i10) :: x,z,goxb,gozb,dnxb,dnzb +!REAL(KIND=i10), DIMENSION (:,:), ALLOCATABLE :: scxf,sczf +!REAL(KIND=i10), DIMENSION (:,:,:), ALLOCATABLE :: rcxf,rczf +! +! sources = File containing source locations +! receivers = File containing receiver locations +! grid = File containing grid of velocity vertices for +! resampling on a finer grid with cubic B-splines +! frechet = output file containing matrix of frechet derivatives +! travelt = File name for storage of traveltime field +! wttf = Write traveltimes to file? (0=no,>0=source id) +! fom = Use first-order(0) or mixed-order(1) scheme +! nsrc = number of sources +! scx,scz = source location in r,x,z +! scx,scz = source location in r,x,z +! x,z = temporary variables for source location +! fsrt = find source-receiver traveltimes? (0=no,1=yes) +! rtravel = output file for source-receiver traveltimes +! cdum = dummy character variable ! wrgf = write ray geometries to file? (<0=all,0=no,>0=source id.) +! wrays = file containing raypath geometries +! cfd = calculate Frechet derivatives? (0=no, 1=yes) +! tnr = total number of receivers +! sgs = Extent of refined source grid +! isx,isz = cell containing source +! nnxb,nnzb = Backup for nnz,nnx +! goxb,gozb = Backup for gox,goz +! dnxb,dnzb = Backup for dnx,dnz +! ogx,ogz = Location of refined grid origin +! gridfx,grdfz = Number of refined nodes per cell +! urg = use refined grid (0=no,1=yes,2=previously used) +! maxbt = maximum size of narrow band binary tree +! otimes = file containing source-receiver association information +!c----------------------------------------------------------------- +! variables defined by Hongjian Fang + integer nx,ny,nz + integer kmax,nsrcsurf,nrcf + real vels(nx,ny,nz) + real obst(*) + real goxdf,gozdf,dvxdf,dvzdf + integer kmaxRc,kmaxRg,kmaxLc,kmaxLg + real*8 tRc(*),tRg(*),tLc(*),tLg(*) + integer wavetype(nsrcsurf,kmax) + integer periods(nsrcsurf,kmax),nrc1(nsrcsurf,kmax),nsrcsurf1(kmax) + integer knum1(kmax),igrt(nsrcsurf,kmax) + real scxf(nsrcsurf,kmax),sczf(nsrcsurf,kmax),rcxf(nrcf,nsrcsurf,kmax),rczf(nrcf,nsrcsurf,kmax) + real minthk + integer nparpi + + + real vpz(nz),vsz(nz),rhoz(nz),depz(nz) + real*8 pvRc(nx*ny,kmaxRc),pvRg(nx*ny,kmaxRg),pvLc(nx*ny,kmaxLc),pvLg(nx*ny,kmaxLg) + real*8 velf(ny*nx) + integer kmax1,kmax2,kmax3,count1 + integer igr + integer iwave + integer knumi,srcnum + real cbst1 + real noiselevel + real gaussian + external gaussian + integer ii,jj,kk,nn,istep +gdx=5 +gdz=5 +asgr=1 +sgdl=8 +sgs=8 +earth=6371.0 +fom=1 +snb=0.5 +goxd=goxdf +gozd=gozdf +dvxd=dvxdf +dvzd=dvzdf +nvx=nx-2 +nvz=ny-2 +ALLOCATE(velv(0:nvz+1,0:nvx+1), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE gridder: REAL velv' +ENDIF +! +! Convert from degrees to radians +! +dvx=dvxd*pi/180.0 +dvz=dvzd*pi/180.0 +gox=(90.0-goxd)*pi/180.0 +goz=gozd*pi/180.0 +! +! Compute corresponding values for propagation grid. +! +nnx=(nvx-1)*gdx+1 +nnz=(nvz-1)*gdz+1 +dnx=dvx/gdx +dnz=dvz/gdz +dnxd=dvxd/gdx +dnzd=dvzd/gdz +ALLOCATE(veln(nnz,nnx), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: SUBROUTINE gridder: REAL veln' +ENDIF + +! +! Call a subroutine which reads in the velocity grid +! +!CALL gridder(grid) +! +! Read in all source coordinates. +! +! +! Now work out, source by source, the first-arrival traveltime +! field plus source-receiver traveltimes +! and ray paths if required. First, allocate memory to the +! traveltime field array +! +ALLOCATE(ttn(nnz,nnx), STAT=checkstat) +IF(checkstat > 0)THEN + WRITE(6,*)'Error with ALLOCATE: PROGRAM fmmin2d: REAL ttn' +ENDIF + rbint=0 +! +! Allocate memory for node status and binary trees +! +ALLOCATE(nsts(nnz,nnx)) +maxbt=NINT(snb*nnx*nnz) +ALLOCATE(btg(maxbt)) + +!allocate(fdm(0:nvz+1,0:nvx+1)) + + if(kmaxRc.gt.0) then + iwave=2 + igr=0 + call caldespersion(nx,ny,nz,vels,pvRc, & + iwave,igr,kmaxRc,tRc,depz,minthk) + endif + + if(kmaxRg.gt.0) then + iwave=2 + igr=1 + call caldespersion(nx,ny,nz,vels,pvRg, & + iwave,igr,kmaxRg,tRg,depz,minthk) + endif + + if(kmaxLc.gt.0) then + iwave=1 + igr=0 + call caldespersion(nx,ny,nz,vels,pvLc, & + iwave,igr,kmaxLc,tLc,depz,minthk) + endif + + if(kmaxLg.gt.0) then + iwave=1 + igr=1 + call caldespersion(nx,ny,nz,vels,pvLg, & + iwave,igr,kmaxLg,tLg,depz,minthk) + endif + +!nar=0 +count1=0 + +!sen_vs=0 +!sen_vp=0 +!sen_rho=0 +kmax1=kmaxRc +kmax2=kmaxRc+kmaxRg +kmax3=kmaxRc+kmaxRg+kmaxLc +do knumi=1,kmax +do srcnum=1,nsrcsurf1(knum1(knumi)) + if(wavetype(srcnum,knum1(knumi))==2.and.igrt(srcnum,knum1(knumi))==0) then + velf(1:nx*ny)=pvRc(1:nx*ny,periods(srcnum,knum1(knumi))) +! sen_vs(:,1:kmax1,:)=sen_vsRc(:,1:kmaxRc,:)!(:,nt(istep),:) +! sen_vp(:,1:kmax1,:)=sen_vpRc(:,1:kmaxRc,:)!(:,nt(istep),:) +! sen_rho(:,1:kmax1,:)=sen_rhoRc(:,1:kmaxRc,:)!(:,nt(istep),:) + endif + if(wavetype(srcnum,knum1(knumi))==2.and.igrt(srcnum,knum1(knumi))==1) then + velf(1:nx*ny)=pvRg(1:nx*ny,periods(srcnum,knum1(knumi))) +! sen_vs(:,kmax1+1:kmax2,:)=sen_vsRg(:,1:kmaxRg,:)!(:,nt,:) +! sen_vp(:,kmax1+1:kmax2,:)=sen_vpRg(:,1:kmaxRg,:)!(:,nt,:) +! sen_rho(:,kmax1+1:kmax2,:)=sen_rhoRg(:,1:kmaxRg,:)!(:,nt,:) + endif + if(wavetype(srcnum,knum1(knumi))==1.and.igrt(srcnum,knum1(knumi))==0) then + velf(1:nx*ny)=pvLc(1:nx*ny,periods(srcnum,knum1(knumi))) +! sen_vs(:,kmax2+1:kmax3,:)=sen_vsLc(:,1:kmaxLc,:)!(:,nt,:) +! sen_vp(:,kmax2+1:kmax3,:)=sen_vpLc(:,1:kmaxLc,:)!(:,nt,:) +! sen_rho(:,kmax2+1:kmax3,:)=sen_rhoLc(:,1:kmaxLc,:)!(:,nt,:) + endif + if(wavetype(srcnum,knum1(knumi))==1.and.igrt(srcnum,knum1(knumi))==1) then + velf(1:nx*ny)=pvLg(1:nx*ny,periods(srcnum,knum1(knumi))) +! sen_vs(:,kmax3+1:kmax,:)=sen_vsLg(:,1:kmaxLg,:)!(:,nt,:) +! sen_vp(:,kmax3+1:kmax,:)=sen_vpLg(:,1:kmaxLg,:)!(:,nt,:) +! sen_rho(:,kmax3+1:kmax,:)=sen_rhoLg(:,1:kmaxLg,:)!(:,nt,:) + endif + +call gridder(velf) + x=scxf(srcnum,knum1(knumi)) + z=sczf(srcnum,knum1(knumi)) +! +! Begin by computing refined source grid if required +! + urg=0 + IF(asgr.EQ.1)THEN +! +! Back up coarse velocity grid to a holding matrix +! + ALLOCATE(velnb(nnz,nnx)) +! MODIFIEDY BY HONGJIAN FANG @ USTC 2014/04/17 + velnb(1:nnz,1:nnx)=veln(1:nnz,1:nnx) + nnxb=nnx + nnzb=nnz + dnxb=dnx + dnzb=dnz + goxb=gox + gozb=goz +! +! Identify nearest neighbouring node to source +! + isx=INT((x-gox)/dnx)+1 + isz=INT((z-goz)/dnz)+1 + sw=0 + IF(isx.lt.1.or.isx.gt.nnx)sw=1 + IF(isz.lt.1.or.isz.gt.nnz)sw=1 + IF(sw.eq.1)then + isx=90.0-isx*180.0/pi + isz=isz*180.0/pi + WRITE(6,*)"Source lies outside bounds of model (lat,long)= ",isx,isz + WRITE(6,*)"TERMINATING PROGRAM!!!" + STOP + ENDIF + IF(isx.eq.nnx)isx=isx-1 + IF(isz.eq.nnz)isz=isz-1 +! +! Now find rectangular box that extends outward from the nearest source node +! to "sgs" nodes away. +! + vnl=isx-sgs + IF(vnl.lt.1)vnl=1 + vnr=isx+sgs + IF(vnr.gt.nnx)vnr=nnx + vnt=isz-sgs + IF(vnt.lt.1)vnt=1 + vnb=isz+sgs + IF(vnb.gt.nnz)vnb=nnz + nrnx=(vnr-vnl)*sgdl+1 + nrnz=(vnb-vnt)*sgdl+1 + drnx=dvx/REAL(gdx*sgdl) + drnz=dvz/REAL(gdz*sgdl) + gorx=gox+dnx*(vnl-1) + gorz=goz+dnz*(vnt-1) + nnx=nrnx + nnz=nrnz + dnx=drnx + dnz=drnz + gox=gorx + goz=gorz +! +! Reallocate velocity and traveltime arrays if nnx>nnxb or +! nnz 0)THEN + WRITE(6,*)'Error with DEALLOCATE: PROGRAM fmmin2d: velnb' + ENDIF +ENDIF +enddo +enddo +!deallocate(fdm) +deallocate(velv,veln,ttn,nsts,btg) +END subroutine +subroutine caldespersion(nx,ny,nz,vel,pvRc, & + iwave,igr,kmaxRc,tRc,depz,minthk) + use omp_lib + implicit none + + integer nx,ny,nz + real vel(nx,ny,nz) + + integer iwave,igr + real minthk + real depz(nz) + integer kmaxRc + real*8 tRc(kmaxRc) + real*8 pvRc(nx*ny,kmaxRc) + + + + real vpz(nz),vsz(nz),rhoz(nz) + integer mmax,iflsph,mode,rmax + integer ii,jj,k,i,nn,kk + integer,parameter::NL=200 + integer,parameter::NP=60 + real*8 cg1(NP),cg2(NP),cga,cgRc(NP) + real rdep(NL),rvp(NL),rvs(NL),rrho(NL),rthk(NL) + real depm(NL),vpm(NL),vsm(NL),rhom(NL),thkm(NL) + real dlnVs,dlnVp,dlnrho + + + mmax=nz + iflsph=1 + mode=1 + dlnVs=0.01 + dlnVp=0.01 + dlnrho=0.01 + +!$omp parallel & +!$omp default(private) & +!$omp shared(depz,nx,ny,nz,minthk,kmaxRc,mmax,vel) & +!$omp shared(tRc,pvRc,iflsph,iwave,mode,igr) +!$omp do + do jj=1,ny + do ii=1,nx + vsz(1:nz)=vel(ii,jj,1:nz) + ! some other emperical relationship maybe better, + do k=1,nz + vpz(k)=0.9409 + 2.0947*vsz(k) - 0.8206*vsz(k)**2+ & + 0.2683*vsz(k)**3 - 0.0251*vsz(k)**4 + rhoz(k)=1.6612*vpz(k) - 0.4721*vpz(k)**2 + & + 0.0671*vpz(k)**3 - 0.0043*vpz(k)**4 + & + 0.000106*vpz(k)**5 + enddo + + call refineGrid2LayerMdl(minthk,mmax,depz,vpz,vsz,rhoz,rmax,rdep,& + rvp,rvs,rrho,rthk) + call surfdisp96(rthk,rvp,rvs,rrho,rmax,iflsph,iwave,mode,igr,kmaxRc,& + tRc,cgRc) + pvRc((jj-1)*nx+ii,1:kmaxRc)=cgRc(1:kmaxRc) + enddo + enddo +!$omp end do +!$omp end parallel + end subroutine + + diff --git a/src/DSurfTomo b/src/DSurfTomo new file mode 100755 index 0000000000000000000000000000000000000000..74536d569f4c8c57c5ebcefe436d669cb0c14b01 GIT binary patch literal 294584 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

hGlR|k;qQrKUe#@T58+kFNroKaWv=3kCR&_ZrQ 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

IEO;6(LqBu`d2u9OIt!44=Qs&w3rHiT-!g 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 z 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%0DgDU}WBW!u^R;P<7cZVZGdi3Z-ixQY@sUFe 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 +! Michael Saunders +! Systems Optimization Laboratory (SOL) +! Stanford University +! Stanford, CA 94305-4026, USA +! +! 17 Jul 2010: F90 LSMR derived from F90 LSQR and lsqr.m. +! 07 Sep 2010: Local reorthogonalization now works (localSize > 0). +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +module lsmrModule + + use lsmrDataModule, only : dp + use lsmrblasInterface, only : dnrm2, dscal + implicit none + private + public :: LSMR + +contains + + !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +! subroutine LSMR ( m, n, Aprod1, Aprod2, b, damp, & +! atol, btol, conlim, itnlim, localSize, nout, & +! x, istop, itn, normA, condA, normr, normAr, normx ) + subroutine LSMR ( m, n, leniw, lenrw,iw,rw, b, damp, & + atol, btol, conlim, itnlim, localSize, nout, & + x, istop, itn, normA, condA, normr, normAr, normx ) + + integer, intent(in) :: leniw + integer, intent(in) :: lenrw + integer, intent(in) :: iw(leniw) + real, intent(in) :: rw(lenrw) + + integer, intent(in) :: m, n, itnlim, localSize, nout + integer, intent(out) :: istop, itn + real(dp), intent(in) :: b(m) + real(dp), intent(out) :: x(n) + real(dp), intent(in) :: atol, btol, conlim, damp + real(dp), intent(out) :: normA, condA, normr, normAr, normx + + interface + subroutine aprod(mode,m,n,x,y,leniw,lenrw,iw,rw) ! y := y + A*x + use lsmrDataModule, only : dp + integer, intent(in) :: mode,lenrw + integer, intent(in) :: leniw + real, intent(in) :: rw(lenrw) + integer, intent(in) :: iw(leniw) + integer, intent(in) :: m,n + real(dp), intent(inout) :: x(n) + real(dp), intent(inout) :: y(m) + end subroutine aprod +! subroutine Aprod1(m,n,x,y) ! y := y + A*x +! use lsmrDataModule, only : dp +! integer, intent(in) :: m,n +! real(dp), intent(in) :: x(n) +! real(dp), intent(inout) :: y(m) +! end subroutine Aprod1 +! +! subroutine Aprod2(m,n,x,y) ! x := x + A'*y +! use lsmrDataModule, only : dp +! integer, intent(in) :: m,n +! real(dp), intent(inout) :: x(n) +! real(dp), intent(in) :: y(m) +! end subroutine Aprod2 + end interface + + !------------------------------------------------------------------- + ! LSMR finds a solution x to the following problems: + ! + ! 1. Unsymmetric equations: Solve A*x = b + ! + ! 2. Linear least squares: Solve A*x = b + ! in the least-squares sense + ! + ! 3. Damped least squares: Solve ( A )*x = ( b ) + ! ( damp*I ) ( 0 ) + ! in the least-squares sense + ! + ! where A is a matrix with m rows and n columns, b is an m-vector, + ! and damp is a scalar. (All quantities are real.) + ! The matrix A is treated as a linear operator. It is accessed + ! by means of subroutine calls with the following purpose: + ! + ! call Aprod1(m,n,x,y) must compute y = y + A*x without altering x. + ! call Aprod2(m,n,x,y) must compute x = x + A'*y without altering y. + ! + ! LSMR uses an iterative method to approximate the solution. + ! The number of iterations required to reach a certain accuracy + ! depends strongly on the scaling of the problem. Poor scaling of + ! the rows or columns of A should therefore be avoided where + ! possible. + ! + ! For example, in problem 1 the solution is unaltered by + ! row-scaling. If a row of A is very small or large compared to + ! the other rows of A, the corresponding row of ( A b ) should be + ! scaled up or down. + ! + ! In problems 1 and 2, the solution x is easily recovered + ! following column-scaling. Unless better information is known, + ! the nonzero columns of A should be scaled so that they all have + ! the same Euclidean norm (e.g., 1.0). + ! + ! In problem 3, there is no freedom to re-scale if damp is + ! nonzero. However, the value of damp should be assigned only + ! after attention has been paid to the scaling of A. + ! + ! The parameter damp is intended to help regularize + ! ill-conditioned systems, by preventing the true solution from + ! being very large. Another aid to regularization is provided by + ! the parameter condA, which may be used to terminate iterations + ! before the computed solution becomes very large. + ! + ! Note that x is not an input parameter. + ! If some initial estimate x0 is known and if damp = 0, + ! one could proceed as follows: + ! + ! 1. Compute a residual vector r0 = b - A*x0. + ! 2. Use LSMR to solve the system A*dx = r0. + ! 3. Add the correction dx to obtain a final solution x = x0 + dx. + ! + ! This requires that x0 be available before and after the call + ! to LSMR. To judge the benefits, suppose LSMR takes k1 iterations + ! to solve A*x = b and k2 iterations to solve A*dx = r0. + ! If x0 is "good", norm(r0) will be smaller than norm(b). + ! If the same stopping tolerances atol and btol are used for each + ! system, k1 and k2 will be similar, but the final solution x0 + dx + ! should be more accurate. The only way to reduce the total work + ! is to use a larger stopping tolerance for the second system. + ! If some value btol is suitable for A*x = b, the larger value + ! btol*norm(b)/norm(r0) should be suitable for A*dx = r0. + ! + ! Preconditioning is another way to reduce the number of iterations. + ! If it is possible to solve a related system M*x = b efficiently, + ! where M approximates A in some helpful way + ! (e.g. M - A has low rank or its elements are small relative to + ! those of A), LSMR may converge more rapidly on the system + ! A*M(inverse)*z = b, + ! after which x can be recovered by solving M*x = z. + ! + ! NOTE: If A is symmetric, LSMR should not be used! + ! Alternatives are the symmetric conjugate-gradient method (CG) + ! and/or SYMMLQ. + ! SYMMLQ is an implementation of symmetric CG that applies to + ! any symmetric A and will converge more rapidly than LSMR. + ! If A is positive definite, there are other implementations of + ! symmetric CG that require slightly less work per iteration + ! than SYMMLQ (but will take the same number of iterations). + ! + ! + ! Notation + ! -------- + ! The following quantities are used in discussing the subroutine + ! parameters: + ! + ! Abar = ( A ), bbar = (b) + ! (damp*I) (0) + ! + ! r = b - A*x, rbar = bbar - Abar*x + ! + ! normr = sqrt( norm(r)**2 + damp**2 * norm(x)**2 ) + ! = norm( rbar ) + ! + ! eps = the relative precision of floating-point arithmetic. + ! On most machines, eps is about 1.0e-7 and 1.0e-16 + ! in single and double precision respectively. + ! We expect eps to be about 1e-16 always. + ! + ! LSMR minimizes the function normr with respect to x. + ! + ! + ! Parameters + ! ---------- + ! m input m, the number of rows in A. + ! + ! n input n, the number of columns in A. + ! + ! Aprod1, Aprod2 See above. + ! + ! damp input The damping parameter for problem 3 above. + ! (damp should be 0.0 for problems 1 and 2.) + ! If the system A*x = b is incompatible, values + ! of damp in the range 0 to sqrt(eps)*norm(A) + ! will probably have a negligible effect. + ! Larger values of damp will tend to decrease + ! the norm of x and reduce the number of + ! iterations required by LSMR. + ! + ! The work per iteration and the storage needed + ! by LSMR are the same for all values of damp. + ! + ! b(m) input The rhs vector b. + ! + ! x(n) output Returns the computed solution x. + ! + ! atol input An estimate of the relative error in the data + ! defining the matrix A. For example, if A is + ! accurate to about 6 digits, set atol = 1.0e-6. + ! + ! btol input An estimate of the relative error in the data + ! defining the rhs b. For example, if b is + ! accurate to about 6 digits, set btol = 1.0e-6. + ! + ! conlim input An upper limit on cond(Abar), the apparent + ! condition number of the matrix Abar. + ! Iterations will be terminated if a computed + ! estimate of cond(Abar) exceeds conlim. + ! This is intended to prevent certain small or + ! zero singular values of A or Abar from + ! coming into effect and causing unwanted growth + ! in the computed solution. + ! + ! conlim and damp may be used separately or + ! together to regularize ill-conditioned systems. + ! + ! Normally, conlim should be in the range + ! 1000 to 1/eps. + ! Suggested value: + ! conlim = 1/(100*eps) for compatible systems, + ! conlim = 1/(10*sqrt(eps)) for least squares. + ! + ! Note: Any or all of atol, btol, conlim may be set to zero. + ! The effect will be the same as the values eps, eps, 1/eps. + ! + ! itnlim input An upper limit on the number of iterations. + ! Suggested value: + ! itnlim = n/2 for well-conditioned systems + ! with clustered singular values, + ! itnlim = 4*n otherwise. + ! + ! localSize input No. of vectors for local reorthogonalization. + ! 0 No reorthogonalization is performed. + ! >0 This many n-vectors "v" (the most recent ones) + ! are saved for reorthogonalizing the next v. + ! localSize need not be more than min(m,n). + ! At most min(m,n) vectors will be allocated. + ! + ! nout input File number for printed output. If positive, + ! a summary will be printed on file nout. + ! + ! istop output An integer giving the reason for termination: + ! + ! 0 x = 0 is the exact solution. + ! No iterations were performed. + ! + ! 1 The equations A*x = b are probably compatible. + ! Norm(A*x - b) is sufficiently small, given the + ! values of atol and btol. + ! + ! 2 damp is zero. The system A*x = b is probably + ! not compatible. A least-squares solution has + ! been obtained that is sufficiently accurate, + ! given the value of atol. + ! + ! 3 damp is nonzero. A damped least-squares + ! solution has been obtained that is sufficiently + ! accurate, given the value of atol. + ! + ! 4 An estimate of cond(Abar) has exceeded conlim. + ! The system A*x = b appears to be ill-conditioned, + ! or there could be an error in Aprod1 or Aprod2. + ! + ! 5 The iteration limit itnlim was reached. + ! + ! itn output The number of iterations performed. + ! + ! normA output An estimate of the Frobenius norm of Abar. + ! This is the square-root of the sum of squares + ! of the elements of Abar. + ! If damp is small and the columns of A + ! have all been scaled to have length 1.0, + ! normA should increase to roughly sqrt(n). + ! A radically different value for normA may + ! indicate an error in Aprod1 or Aprod2. + ! + ! condA output An estimate of cond(Abar), the condition + ! number of Abar. A very high value of condA + ! may again indicate an error in Aprod1 or Aprod2. + ! + ! normr output An estimate of the final value of norm(rbar), + ! the function being minimized (see notation + ! above). This will be small if A*x = b has + ! a solution. + ! + ! normAr output An estimate of the final value of + ! norm( Abar'*rbar ), the norm of + ! the residual for the normal equations. + ! This should be small in all cases. (normAr + ! will often be smaller than the true value + ! computed from the output vector x.) + ! + ! normx output An estimate of norm(x) for the final solution x. + ! + ! Subroutines and functions used + ! ------------------------------ + ! BLAS dscal, dnrm2 + ! USER Aprod1, Aprod2 + ! + ! Precision + ! --------- + ! The number of iterations required by LSMR will decrease + ! if the computation is performed in higher precision. + ! At least 15-digit arithmetic should normally be used. + ! "real(dp)" declarations should normally be 8-byte words. + ! If this ever changes, the BLAS routines dnrm2, dscal + ! (Lawson, et al., 1979) will also need to be changed. + ! + ! + ! Reference + ! --------- + ! http://www.stanford.edu/group/SOL/software/lsmr.html + ! ------------------------------------------------------------------ + ! + ! LSMR development: + ! 21 Sep 2007: Fortran 90 version of LSQR implemented. + ! Aprod1, Aprod2 implemented via f90 interface. + ! 17 Jul 2010: LSMR derived from LSQR and lsmr.m. + ! 07 Sep 2010: Local reorthogonalization now working. + !------------------------------------------------------------------- + + intrinsic :: abs, dot_product, min, max, sqrt + + ! Local arrays and variables + real(dp) :: h(n), hbar(n), u(m), v(n), w(n), localV(n,min(localSize,m,n)) + logical :: damped, localOrtho, localVQueueFull, prnt, show + integer :: i, localOrthoCount, localOrthoLimit, localPointer, localVecs, & + pcount, pfreq + real(dp) :: alpha, alphabar, alphahat, & + beta, betaacute, betacheck, betad, betadd, betahat, & + normb, c, cbar, chat, ctildeold, ctol, & + d, maxrbar, minrbar, normA2, & + rho, rhobar, rhobarold, rhodold, rhoold, rhotemp, & + rhotildeold, rtol, s, sbar, shat, stildeold, & + t1, taud, tautildeold, test1, test2, test3, & + thetabar, thetanew, thetatilde, thetatildeold, & + zeta, zetabar, zetaold + + ! Local constants + real(dp), parameter :: zero = 0.0_dp, one = 1.0_dp + character(len=*), parameter :: enter = ' Enter LSMR. ' + character(len=*), parameter :: exitt = ' Exit LSMR. ' + character(len=*), parameter :: msg(0:7) = & + (/ 'The exact solution is x = 0 ', & + 'Ax - b is small enough, given atol, btol ', & + 'The least-squares solution is good enough, given atol', & + 'The estimate of cond(Abar) has exceeded conlim ', & + 'Ax - b is small enough for this machine ', & + 'The LS solution is good enough for this machine ', & + 'Cond(Abar) seems to be too large for this machine ', & + 'The iteration limit has been reached ' /) + !------------------------------------------------------------------- + + + ! Initialize. + + localVecs = min(localSize,m,n) + show = nout > 0 + if (show) then + write(nout, 1000) enter,m,n,damp,atol,conlim,btol,itnlim,localVecs + end if + + pfreq = 20 ! print frequency (for repeating the heading) + pcount = 0 ! print counter + damped = damp > zero ! + + !------------------------------------------------------------------- + ! Set up the first vectors u and v for the bidiagonalization. + ! These satisfy beta*u = b, alpha*v = A(transpose)*u. + !------------------------------------------------------------------- + u(1:m) = b(1:m) + v(1:n) = zero + x(1:n) = zero + + alpha = zero + beta = dnrm2 (m, u, 1) + + if (beta > zero) then + call dscal (m, (one/beta), u, 1) + ! call Aprod2(m, n, v, u) ! v = A'*u + call aprod(2,m,n,v,u,leniw,lenrw,iw,rw) + alpha = dnrm2 (n, v, 1) + end if + + if (alpha > zero) then + call dscal (n, (one/alpha), v, 1) + w = v + end if + + normAr = alpha*beta + if (normAr == zero) go to 800 + + ! Initialization for local reorthogonalization. + + localOrtho = .false. + if (localVecs > 0) then + localPointer = 1 + localOrtho = .true. + localVQueueFull = .false. + localV(:,1) = v + end if + + ! Initialize variables for 1st iteration. + + itn = 0 + zetabar = alpha*beta + alphabar = alpha + rho = 1 + rhobar = 1 + cbar = 1 + sbar = 0 + + h = v + hbar(1:n) = zero + x(1:n) = zero + + ! Initialize variables for estimation of ||r||. + + betadd = beta + betad = 0 + rhodold = 1 + tautildeold = 0 + thetatilde = 0 + zeta = 0 + d = 0 + + ! Initialize variables for estimation of ||A|| and cond(A). + + normA2 = alpha**2 + maxrbar = 0_dp + minrbar = 1e+30_dp + + ! Items for use in stopping rules. + normb = beta + istop = 0 + ctol = zero + if (conlim > zero) ctol = one/conlim + normr = beta + + ! Exit if b=0 or A'b = 0. + + normAr = alpha * beta + if (normAr == 0) then + if (show) then + write(nout,'(a)') msg(1) + end if + return + end if + + ! Heading for iteration log. + + if (show) then + if (damped) then + write(nout,1300) + else + write(nout,1200) + end if + test1 = one + test2 = alpha/beta + write(nout, 1500) itn,x(1),normr,normAr,test1,test2 + end if + + !=================================================================== + ! Main iteration loop. + !=================================================================== + do + itn = itn + 1 + + !---------------------------------------------------------------- + ! Perform the next step of the bidiagonalization to obtain the + ! next beta, u, alpha, v. These satisfy + ! beta*u = A*v - alpha*u, + ! alpha*v = A'*u - beta*v. + !---------------------------------------------------------------- + call dscal (m,(- alpha), u, 1) + ! call Aprod1(m, n, v, u) ! u = A*v + call aprod ( 1,m,n,v,u,leniw,lenrw,iw,rw ) + beta = dnrm2 (m, u, 1) + + if (beta > zero) then + call dscal (m, (one/beta), u, 1) + if (localOrtho) then ! Store v into the circular buffer localV. + call localVEnqueue ! Store old v for local reorthog'n of new v. + end if + call dscal (n, (- beta), v, 1) + + !call Aprod2(m, n, v, u) ! v = A'*u + call aprod ( 2,m,n,v,u,leniw,lenrw,iw,rw ) + if (localOrtho) then ! Perform local reorthogonalization of V. + call localVOrtho ! Local-reorthogonalization of new v. + end if + alpha = dnrm2 (n, v, 1) + if (alpha > zero) then + call dscal (n, (one/alpha), v, 1) + end if + end if + + ! At this point, beta = beta_{k+1}, alpha = alpha_{k+1}. + + !---------------------------------------------------------------- + ! Construct rotation Qhat_{k,2k+1}. + + alphahat = d2norm(alphabar, damp) + chat = alphabar/alphahat + shat = damp/alphahat + + ! Use a plane rotation (Q_i) to turn B_i to R_i. + + rhoold = rho + rho = d2norm(alphahat, beta) + c = alphahat/rho + s = beta/rho + thetanew = s*alpha + alphabar = c*alpha + + ! Use a plane rotation (Qbar_i) to turn R_i^T into R_i^bar. + + rhobarold = rhobar + zetaold = zeta + thetabar = sbar*rho + rhotemp = cbar*rho + rhobar = d2norm(cbar*rho, thetanew) + cbar = cbar*rho/rhobar + sbar = thetanew/rhobar + zeta = cbar*zetabar + zetabar = - sbar*zetabar + + ! Update h, h_hat, x. + + hbar = h - (thetabar*rho/(rhoold*rhobarold))*hbar + x = x + (zeta/(rho*rhobar))*hbar + h = v - (thetanew/rho)*h + + ! Estimate ||r||. + + ! Apply rotation Qhat_{k,2k+1}. + betaacute = chat* betadd + betacheck = - shat* betadd + + ! Apply rotation Q_{k,k+1}. + betahat = c*betaacute + betadd = - s*betaacute + + ! Apply rotation Qtilde_{k-1}. + ! betad = betad_{k-1} here. + + thetatildeold = thetatilde + rhotildeold = d2norm(rhodold, thetabar) + ctildeold = rhodold/rhotildeold + stildeold = thetabar/rhotildeold + thetatilde = stildeold* rhobar + rhodold = ctildeold* rhobar + betad = - stildeold*betad + ctildeold*betahat + + ! betad = betad_k here. + ! rhodold = rhod_k here. + + tautildeold = (zetaold - thetatildeold*tautildeold)/rhotildeold + taud = (zeta - thetatilde*tautildeold)/rhodold + d = d + betacheck**2 + normr = sqrt(d + (betad - taud)**2 + betadd**2) + + ! Estimate ||A||. + normA2 = normA2 + beta**2 + normA = sqrt(normA2) + normA2 = normA2 + alpha**2 + + ! Estimate cond(A). + maxrbar = max(maxrbar,rhobarold) + if (itn > 1) then + minrbar = min(minrbar,rhobarold) + end if + condA = max(maxrbar,rhotemp)/min(minrbar,rhotemp) + + !---------------------------------------------------------------- + ! Test for convergence. + !---------------------------------------------------------------- + + ! Compute norms for convergence testing. + normAr = abs(zetabar) + normx = dnrm2(n, x, 1) + + ! Now use these norms to estimate certain other quantities, + ! some of which will be small near a solution. + + test1 = normr /normb + test2 = normAr/(normA*normr) + test3 = one/condA + t1 = test1/(one + normA*normx/normb) + rtol = btol + atol*normA*normx/normb + + ! The following tests guard against extremely small values of + ! atol, btol or ctol. (The user may have set any or all of + ! the parameters atol, btol, conlim to 0.) + ! The effect is equivalent to the normAl tests using + ! atol = eps, btol = eps, conlim = 1/eps. + + if (itn >= itnlim) istop = 7 + if (one+test3 <= one) istop = 6 + if (one+test2 <= one) istop = 5 + if (one+t1 <= one) istop = 4 + + ! Allow for tolerances set by the user. + + if ( test3 <= ctol) istop = 3 + if ( test2 <= atol) istop = 2 + if ( test1 <= rtol) istop = 1 + + !---------------------------------------------------------------- + ! See if it is time to print something. + !---------------------------------------------------------------- + prnt = .false. + if (show) then + if (n <= 40) prnt = .true. + if (itn <= 10) prnt = .true. + if (itn >= itnlim-10) prnt = .true. + if (mod(itn,10) == 0) prnt = .true. + if (test3 <= 1.1*ctol) prnt = .true. + if (test2 <= 1.1*atol) prnt = .true. + if (test1 <= 1.1*rtol) prnt = .true. + if (istop /= 0) prnt = .true. + + if (prnt) then ! Print a line for this iteration + if (pcount >= pfreq) then ! Print a heading first + pcount = 0 + if (damped) then + write(nout,1300) + else + write(nout,1200) + end if + end if + pcount = pcount + 1 + write(nout,1500) itn,x(1),normr,normAr,test1,test2,normA,condA + end if + end if + + if (istop /= 0) exit + end do + !=================================================================== + ! End of iteration loop. + !=================================================================== + + ! Come here if normAr = 0, or if normal exit. + +800 if (damped .and. istop==2) istop=3 ! Decide if istop = 2 or 3. + if (show) then ! Print the stopping condition. + write(nout, 2000) & + exitt,istop,itn, & + exitt,normA,condA, & + exitt,normb, normx, & + exitt,normr,normAr + write(nout, 3000) & + exitt, msg(istop) + end if + + return + + 1000 format(// a, ' Least-squares solution of Ax = b' & + / ' The matrix A has', i7, ' rows and', i7, ' columns' & + / ' damp =', es22.14 & + / ' atol =', es10.2, 15x, 'conlim =', es10.2 & + / ' btol =', es10.2, 15x, 'itnlim =', i10 & + / ' localSize (no. of vectors for local reorthogonalization) =', i7) + 1200 format(/ " Itn x(1) norm r A'r ", & + ' Compatible LS norm A cond A') + 1300 format(/ " Itn x(1) norm rbar Abar'rbar", & + ' Compatible LS norm Abar cond Abar') + 1500 format(i6, 2es17.9, 5es10.2) + 2000 format(/ a, 5x, 'istop =', i2, 15x, 'itn =', i8 & + / a, 5x, 'normA =', es12.5, 5x, 'condA =', es12.5 & + / a, 5x, 'normb =', es12.5, 5x, 'normx =', es12.5 & + / a, 5x, 'normr =', es12.5, 5x, 'normAr =', es12.5) + 3000 format(a, 5x, a) + + contains + + function d2norm( a, b ) + + real(dp) :: d2norm + real(dp), intent(in) :: a, b + + !------------------------------------------------------------------- + ! d2norm returns sqrt( a**2 + b**2 ) + ! with precautions to avoid overflow. + ! + ! 21 Mar 1990: First version. + ! 17 Sep 2007: Fortran 90 version. + ! 24 Oct 2007: User real(dp) instead of compiler option -r8. + !------------------------------------------------------------------- + + intrinsic :: abs, sqrt + real(dp) :: scale + real(dp), parameter :: zero = 0.0_dp + + scale = abs(a) + abs(b) + if (scale == zero) then + d2norm = zero + else + d2norm = scale*sqrt((a/scale)**2 + (b/scale)**2) + end if + + end function d2norm + + !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + subroutine localVEnqueue + + ! Store v into the circular buffer localV. + + if (localPointer < localVecs) then + localPointer = localPointer + 1 + else + localPointer = 1 + localVQueueFull = .true. + end if + localV(:,localPointer) = v + + end subroutine localVEnqueue + + !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + subroutine localVOrtho + + ! Perform local reorthogonalization of current v. + + real(dp) :: d + + if (localVQueueFull) then + localOrthoLimit = localVecs + else + localOrthoLimit = localPointer + end if + + do localOrthoCount = 1, localOrthoLimit + d = dot_product(v,localV(:,localOrthoCount)) + v = v - d * localV(:,localOrthoCount) + end do + + end subroutine localVOrtho + + end subroutine LSMR + + !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +end module LSMRmodule diff --git a/src/lsmrblas.f90 b/src/lsmrblas.f90 new file mode 100644 index 0000000..31574e2 --- /dev/null +++ b/src/lsmrblas.f90 @@ -0,0 +1,360 @@ +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! File lsmrblas.f90 (double precision) +! +! This file contains the following BLAS routines +! dcopy, ddot, dnrm2, dscal +! required by subroutines LSMR and Acheck. +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! +!! DCOPY copies a vector X to a vector Y. +! +! Discussion: +! This routine uses double precision real arithmetic. +! The routine uses unrolled loops for increments equal to one. +! +! Modified: +! 16 May 2005 +! +! Author: +! Jack Dongarra +! Fortran90 translation by John Burkardt. +! +! Reference: +! +! Jack Dongarra, Jim Bunch, Cleve Moler, Pete Stewart, +! LINPACK User's Guide, +! SIAM, 1979, +! ISBN13: 978-0-898711-72-1, +! LC: QA214.L56. +! +! Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, +! Algorithm 539, +! Basic Linear Algebra Subprograms for Fortran Usage, +! ACM Transactions on Mathematical Software, +! Volume 5, Number 3, September 1979, pages 308-323. +! +! Parameters: +! +! Input, integer N, the number of elements in DX and DY. +! +! Input, real ( kind = 8 ) DX(*), the first vector. +! +! Input, integer INCX, the increment between successive entries of DX. +! +! Output, real ( kind = 8 ) DY(*), the second vector. +! +! Input, integer INCY, the increment between successive entries of DY. + + + subroutine dcopy(n,dx,incx,dy,incy) + + implicit none +! double precision dx(*),dy(*) + real(4) dx(*),dy(*) + integer i,incx,incy,ix,iy,m,n + + if ( n <= 0 ) then + return + end if + + if ( incx == 1 .and. incy == 1 ) then + + m = mod ( n, 7 ) + + if ( m /= 0 ) then + dy(1:m) = dx(1:m) + end if + + do i = m+1, n, 7 + dy(i) = dx(i) + dy(i + 1) = dx(i + 1) + dy(i + 2) = dx(i + 2) + dy(i + 3) = dx(i + 3) + dy(i + 4) = dx(i + 4) + dy(i + 5) = dx(i + 5) + dy(i + 6) = dx(i + 6) + end do + + else + + if ( 0 <= incx ) then + ix = 1 + else + ix = ( -n + 1 ) * incx + 1 + end if + + if ( 0 <= incy ) then + iy = 1 + else + iy = ( -n + 1 ) * incy + 1 + end if + + do i = 1, n + dy(iy) = dx(ix) + ix = ix + incx + iy = iy + incy + end do + end if + return +end subroutine dcopy + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +!! DDOT forms the dot product of two vectors. +! +! Discussion: +! This routine uses double precision real arithmetic. +! This routine uses unrolled loops for increments equal to one. +! +! Modified: +! 16 May 2005 +! +! Author: +! Jack Dongarra +! Fortran90 translation by John Burkardt. +! +! Reference: +! Jack Dongarra, Jim Bunch, Cleve Moler, Pete Stewart, +! LINPACK User's Guide, +! SIAM, 1979, +! ISBN13: 978-0-898711-72-1, +! LC: QA214.L56. +! +! Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, +! Algorithm 539, +! Basic Linear Algebra Subprograms for Fortran Usage, +! ACM Transactions on Mathematical Software, +! Volume 5, Number 3, September 1979, pages 308-323. +! +! Parameters: +! +! Input, integer N, the number of entries in the vectors. +! +! Input, real ( kind = 8 ) DX(*), the first vector. +! +! Input, integer INCX, the increment between successive entries in DX. +! +! Input, real ( kind = 8 ) DY(*), the second vector. +! +! Input, integer INCY, the increment between successive entries in DY. +! +! Output, real ( kind = 8 ) DDOT, the sum of the product of the +! corresponding entries of DX and DY. + + + ! double precision function ddot(n,dx,incx,dy,incy) + real(4) function ddot(n,dx,incx,dy,incy) + + implicit none + ! double precision dx(*),dy(*),dtemp + real(4) dx(*),dy(*),dtemp + integer i,incx,incy,ix,iy,m,n + + ddot = 0.0d0 + dtemp = 0.0d0 + if ( n <= 0 ) then + return + end if + +! Code for unequal increments or equal increments +! not equal to 1. + + if ( incx /= 1 .or. incy /= 1 ) then + + if ( 0 <= incx ) then + ix = 1 + else + ix = ( - n + 1 ) * incx + 1 + end if + + if ( 0 <= incy ) then + iy = 1 + else + iy = ( - n + 1 ) * incy + 1 + end if + + do i = 1, n + dtemp = dtemp + dx(ix) * dy(iy) + ix = ix + incx + iy = iy + incy + end do + +! Code for both increments equal to 1. + + else + + m = mod ( n, 5 ) + + do i = 1, m + dtemp = dtemp + dx(i) * dy(i) + end do + + do i = m+1, n, 5 + dtemp = dtemp + dx(i)*dy(i) + dx(i+1)*dy(i+1) + dx(i+2)*dy(i+2) & + + dx(i+3)*dy(i+3) + dx(i+4)*dy(i+4) + end do + + end if + + ddot = dtemp + return +end function ddot + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!*****************************************************************************80 +! +!! DNRM2 returns the euclidean norm of a vector. +! +! Discussion: +! This routine uses double precision real arithmetic. +! DNRM2 ( X ) = sqrt ( X' * X ) +! +! Modified: +! 16 May 2005 +! +! Author: +! Sven Hammarling +! Fortran90 translation by John Burkardt. +! +! Reference: +! Jack Dongarra, Jim Bunch, Cleve Moler, Pete Stewart, +! LINPACK User's Guide, +! SIAM, 1979, +! ISBN13: 978-0-898711-72-1, +! LC: QA214.L56. +! +! Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, +! Algorithm 539, +! Basic Linear Algebra Subprograms for Fortran Usage, +! ACM Transactions on Mathematical Software, +! Volume 5, Number 3, September 1979, pages 308-323. +! +! Parameters: +! +! Input, integer N, the number of entries in the vector. +! +! Input, real ( kind = 8 ) X(*), the vector whose norm is to be computed. +! +! Input, integer INCX, the increment between successive entries of X. +! +! Output, real ( kind = 8 ) DNRM2, the Euclidean norm of X. +! + + ! double precision function dnrm2 ( n, x, incx) + real(4) function dnrm2 ( n, x, incx) + implicit none + integer ix,n,incx + ! double precision x(*), ssq,absxi,norm,scale + real(4) x(*), ssq,absxi,norm,scale + + if ( n < 1 .or. incx < 1 ) then + norm = 0.d0 + else if ( n == 1 ) then + norm = abs ( x(1) ) + else + scale = 0.d0 + ssq = 1.d0 + + do ix = 1, 1 + ( n - 1 )*incx, incx + if ( x(ix) /= 0.d0 ) then + absxi = abs ( x(ix) ) + if ( scale < absxi ) then + ssq = 1.d0 + ssq * ( scale / absxi )**2 + scale = absxi + else + ssq = ssq + ( absxi / scale )**2 + end if + end if + end do + norm = scale * sqrt ( ssq ) + end if + + dnrm2 = norm + return +end function dnrm2 + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! DSCAL scales a vector by a constant. +! +! Discussion: +! This routine uses double precision real arithmetic. +! +! Modified: +! 08 April 1999 +! +! Author: +! Jack Dongarra +! Fortran90 translation by John Burkardt. +! +! Reference: +! Jack Dongarra, Jim Bunch, Cleve Moler, Pete Stewart, +! LINPACK User's Guide, +! SIAM, 1979, +! ISBN13: 978-0-898711-72-1, +! LC: QA214.L56. +! +! Charles Lawson, Richard Hanson, David Kincaid, Fred Krogh, +! Algorithm 539, +! Basic Linear Algebra Subprograms for Fortran Usage, +! ACM Transactions on Mathematical Software, +! Volume 5, Number 3, September 1979, pages 308-323. +! +! Parameters: +! +! Input, integer N, the number of entries in the vector. +! +! Input, real ( kind = 8 ) SA, the multiplier. +! +! Input/output, real ( kind = 8 ) X(*), the vector to be scaled. +! +! Input, integer INCX, the increment between successive entries of X. +! + + subroutine dscal(n,sa,x,incx) + + implicit none + + integer i + integer incx + integer ix + integer m + integer n + !double precision sa + !double precision x(*) + + real(4) sa + real(4) x(*) + if ( n <= 0 ) then + return + else if ( incx == 1 ) then + m = mod ( n, 5 ) + x(1:m) = sa * x(1:m) + + do i = m+1, n, 5 + x(i) = sa * x(i) + x(i+1) = sa * x(i+1) + x(i+2) = sa * x(i+2) + x(i+3) = sa * x(i+3) + x(i+4) = sa * x(i+4) + end do + else + if ( 0 <= incx ) then + ix = 1 + else + ix = ( - n + 1 ) * incx + 1 + end if + + do i = 1, n + x(ix) = sa * x(ix) + ix = ix + incx + end do + + end if + + return +end subroutine dscal +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/src/lsmrblasInterface.f90 b/src/lsmrblasInterface.f90 new file mode 100644 index 0000000..58cefa0 --- /dev/null +++ b/src/lsmrblasInterface.f90 @@ -0,0 +1,41 @@ +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! File lsmrblasInterface.f90 +! +! BLAS1 Interfaces: ddot dnrm2 dscal +! +! Maintained by Michael Saunders . +! +! 19 Dec 2008: lsqrblasInterface module implemented. +! Metcalf and Reid recommend putting interfaces in a module. +! 16 Jul 2010: LSMR version derived from LSQR equivalent. +!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +module lsmrblasInterface + + implicit none + public :: ddot, dnrm2, dscal + + interface ! Level 1 BLAS + function ddot (n,dx,incx,dy,incy) + use lsmrDataModule, only : dp + integer, intent(in) :: n,incx,incy + real(dp), intent(in) :: dx(*),dy(*) + real(dp) :: ddot + end function ddot + + function dnrm2 (n,dx,incx) + use lsmrDataModule, only : dp + integer, intent(in) :: n,incx + real(dp), intent(in) :: dx(*) + real(dp) :: dnrm2 + end function dnrm2 + + subroutine dscal (n,sa,x,incx) + use lsmrDataModule, only : dp + integer, intent(in) :: n,incx + real(dp), intent(in) :: sa + real(dp), intent(inout) :: x(*) + end subroutine dscal + end interface + +end module lsmrblasInterface diff --git a/src/main.f90 b/src/main.f90 new file mode 100644 index 0000000..1500f88 --- /dev/null +++ b/src/main.f90 @@ -0,0 +1,616 @@ + ! CODE FOR SURFACE WAVE TOMOGRAPHY USING DISPERSION MEASUREMENTS + ! VERSION: + ! 1.0 + ! AUTHOR: + ! HONGJIAN FANG. fanghj@mail.ustc.edu.cn + ! PURPOSE: + ! DIRECTLY INVERT SURFACE WAVE DISPERSION MEASUREMENTS FOR 3-D + ! STUCTURE WITHOUT THE INTERMEDIATE STEP OF CONSTUCTION THE PHASE + ! OR GROUP VELOCITY MAPS. + ! REFERENCE: + ! Fang, H., Yao, H., Zhang, H., Huang, Y. C., & van der Hilst, R. D. + ! (2015). Direct inversion of surface wave dispersion for + ! three-dimensional shallow crustal structure based on ray tracing: + ! methodology and application. Geophysical Journal International, + ! 201(3), 1251-1263. + ! HISTORY: + ! 2015/01/31 START TO REORGONIZE THE MESSY CODE + ! + + program SurfTomo + use lsmrModule, only:lsmr + use lsmrblasInterface, only : dnrm2 + implicit none + +! VARIABLE DEFINE + + character inputfile*80 + character logfile*100 + character outmodel*100 + character outsyn*100 + logical ex + character dummy*40 + character datafile*80 + + integer nx,ny,nz + real goxd,gozd + real dvxd,dvzd + integer nsrc,nrc + real weight,weight0 + real damp + real minthk + integer kmax,kmaxRc,kmaxRg,kmaxLc,kmaxLg + real*8,dimension(:),allocatable:: tRc,tRg,tLc,tLg + real,dimension(:),allocatable:: depz + integer itn + integer nout + integer localSize + real mean,std_devs,balances,balanceb + integer msurf + real,parameter:: tolr=1e-4 + real,dimension(:),allocatable:: obst,dsyn,cbst,wt,dtres,dist,datweight + real,dimension(:),allocatable:: pvall,depRp,pvRp + real sta1_lat,sta1_lon,sta2_lat,sta2_lon + real dist1 + integer dall + integer istep + real,parameter :: pi=3.1415926535898 + integer checkstat + integer ii,jj,kk + real, dimension (:,:), allocatable :: scxf,sczf + real, dimension (:,:,:), allocatable :: rcxf,rczf + integer,dimension(:,:),allocatable::wavetype,igrt,nrc1 + integer,dimension(:),allocatable::nsrc1,knum1 + integer,dimension(:,:),allocatable::periods + real,dimension(:),allocatable::rw + integer,dimension(:),allocatable::iw,col + real,dimension(:),allocatable::dv,norm + real,dimension(:,:,:),allocatable::vsf + real,dimension(:,:,:),allocatable::vsftrue + character strf + integer veltp,wavetp + real velvalue + integer knum,knumo,err + integer istep1,istep2 + integer period + integer knumi,srcnum,count1 + integer HorizonType,VerticalType + character line*200 + integer iter,maxiter + integer maxnar + real acond + real anorm + real arnorm + real rnorm + real xnorm + character str1 + real atol,btol + real conlim + integer istop + integer itnlim + integer lenrw,leniw + integer nar,nar_tmp,nars + integer count3,nvz,nvx + integer m,maxvp,n + integer i,j,k + real Minvel,MaxVel + real spfra + real noiselevel + integer ifsyn + integer writepath + real averdws + real maxnorm + real threshold,threshold0 + +! OPEN FILES FIRST TO OUTPUT THE PROCESS + open(34,file='IterVel.out') + nout=36 + open(nout,file='lsmr.txt') + +! OUTPUT PROGRAM INFOMATION + write(*,*) + write(*,*),' S U R F T O M O' + write(*,*),'PLEASE contact Hongjain Fang & + (fanghj@mail.ustc.edu.cn) if you find any bug' + write(*,*) + +! READ INPUT FILE + if (iargc() < 1) then + write(*,*) 'input file [SurfTomo.in(default)]:' + read(*,'(a)') inputfile + if (len_trim(inputfile) <=1 ) then + inputfile = 'SurfTomo.in' + else + inputfile = inputfile(1:len_trim(inputfile)) + endif + else + call getarg(1,inputfile) + endif + inquire(file = inputfile, exist = ex) + if (.not. ex) stop 'unable to open the inputfile' + + open(10,file=inputfile,status='old') + read(10,'(a30)')dummy + read(10,'(a30)')dummy + read(10,'(a30)')dummy + read(10,*)datafile + read(10,*) nx,ny,nz + read(10,*) goxd,gozd + read(10,*) dvxd,dvzd + read(10,*) nsrc + read(10,*) weight0,damp + read(10,*) minthk + read(10,*) Minvel,Maxvel + read(10,*) maxiter + read(10,*) spfra + read(10,*) kmaxRc + write(*,*) 'model origin:latitude,longitue' + write(*,'(2f10.4)') goxd,gozd + write(*,*) 'grid spacing:latitude,longitue' + write(*,'(2f10.4)') dvxd,dvzd + write(*,*) 'model dimension:nx,ny,nz' + write(*,'(3i5)') nx,ny,nz + write(logfile,'(a,a)')trim(inputfile),'.log' + open(66,file=logfile) + write(66,*) + write(66,*),' S U R F T O M O' + write(66,*),'PLEASE contact Hongjain Fang & + (fanghj@mail.ustc.edu.cn) if you find any bug' + write(66,*) + write(66,*) 'model origin:latitude,longitue' + write(66,'(2f10.4)') goxd,gozd + write(66,*) 'grid spacing:latitude,longitue' + write(66,'(2f10.4)') dvxd,dvzd + write(66,*) 'model dimension:nx,ny,nz' + write(66,'(3i5)') nx,ny,nz + if(kmaxRc.gt.0)then + allocate(tRc(kmaxRc),& + stat=checkstat) + if (checkstat > 0) stop 'error allocating RP' + read(10,*)(tRc(i),i=1,kmaxRc) + write(*,*)'Rayleigh wave phase velocity used,periods:(s)' + write(*,'(50f6.2)')(tRc(i),i=1,kmaxRc) + write(66,*)'Rayleigh wave phase velocity used,periods:(s)' + write(66,'(50f6.2)')(tRc(i),i=1,kmaxRc) + endif + read(10,*)kmaxRg + if(kmaxRg.gt.0)then + allocate(tRg(kmaxRg), stat=checkstat) + if (checkstat > 0) stop 'error allocating RP' + read(10,*)(tRg(i),i=1,kmaxRg) + write(*,*)'Rayleigh wave group velocity used,periods:(s)' + write(*,'(50f6.2)')(tRg(i),i=1,kmaxRg) + write(66,*)'Rayleigh wave group velocity used,periods:(s)' + write(66,'(50f6.2)')(tRg(i),i=1,kmaxRg) + endif + read(10,*)kmaxLc + if(kmaxLc.gt.0)then + allocate(tLc(kmaxLc), stat=checkstat) + if (checkstat > 0) stop 'error allocating RP' + read(10,*)(tLc(i),i=1,kmaxLc) + write(*,*)'Love wave phase velocity used,periods:(s)' + write(*,'(50f6.2)')(tLc(i),i=1,kmaxLc) + write(66,*)'Love wave phase velocity used,periods:(s)' + write(66,'(50f6.2)')(tLc(i),i=1,kmaxLc) + endif + read(10,*)kmaxLg + if(kmaxLg.gt.0)then + allocate(tLg(kmaxLg), stat=checkstat) + if (checkstat > 0) stop 'error allocating RP' + read(10,*)(tLg(i),i=1,kmaxLg) + write(*,*)'Love wave group velocity used,periods:(s)' + write(*,'(50f6.2)')(tLg(i),i=1,kmaxLg) + write(66,*)'Love wave group velocity used,periods:(s)' + write(66,'(50f6.2)')(tLg(i),i=1,kmaxLg) + endif + read(10,*)ifsyn + read(10,*)noiselevel + read(10,*) threshold0 + close(10) + nrc=nsrc + kmax=kmaxRc+kmaxRg+kmaxLc+kmaxLg + +! READ MEASUREMENTS + open(unit=87,file=datafile,status='old') + allocate(scxf(nsrc,kmax),sczf(nsrc,kmax),& + rcxf(nrc,nsrc,kmax),rczf(nrc,nsrc,kmax),stat=checkstat) + if(checkstat > 0)then + write(6,*)'error with allocate' + endif + allocate(periods(nsrc,kmax),wavetype(nsrc,kmax),& + nrc1(nsrc,kmax),nsrc1(kmax),knum1(kmax),& + igrt(nsrc,kmax),stat=checkstat) + if(checkstat > 0)then + write(6,*)'error with allocate' + endif + allocate(obst(nrc*nsrc*kmax),dist(nrc*nsrc*kmax),& + stat=checkstat) + allocate(pvall(nrc*nsrc*kmax),depRp(nrc*nsrc*kmax),& + pvRp(nrc*nsrc*kmax),stat=checkstat) + IF(checkstat > 0)THEN + write(6,*)'error with allocate' + ENDIF + istep=0 + istep2=0 + dall=0 + knumo=12345 + knum=0 + istep1=0 + do + read(87,'(a)',iostat=err) line + if(err.eq.0) then + if(line(1:1).eq.'#') then + read(line,*) str1,sta1_lat,sta1_lon,period,wavetp,veltp + if(wavetp.eq.2.and.veltp.eq.0) knum=period + if(wavetp.eq.2.and.veltp.eq.1) knum=kmaxRc+period + if(wavetp.eq.1.and.veltp.eq.0) knum=kmaxRg+kmaxRc+period + if(wavetp.eq.1.and.veltp.eq.1) knum=kmaxLc+kmaxRg+& + kmaxRc+period + if(knum.ne.knumo) then + istep=0 + istep2=istep2+1 + endif + istep=istep+1 + istep1=0 + sta1_lat=(90.0-sta1_lat)*pi/180.0 + sta1_lon=sta1_lon*pi/180.0 + scxf(istep,knum)=sta1_lat + sczf(istep,knum)=sta1_lon + periods(istep,knum)=period + wavetype(istep,knum)=wavetp + igrt(istep,knum)=veltp + nsrc1(knum)=istep + knum1(istep2)=knum + knumo=knum + else + read(line,*) sta2_lat,sta2_lon,velvalue + istep1=istep1+1 + dall=dall+1 + sta2_lat=(90.0-sta2_lat)*pi/180.0 + sta2_lon=sta2_lon*pi/180.0 + rcxf(istep1,istep,knum)=sta2_lat + rczf(istep1,istep,knum)=sta2_lon + call delsph(sta1_lat,sta1_lon,sta2_lat,sta2_lon,dist1) + dist(dall)=dist1 + obst(dall)=dist1/velvalue + pvall(dall)=velvalue + nrc1(istep,knum)=istep1 + endif + else + exit + endif + enddo + close(87) + allocate(depz(nz), stat=checkstat) + maxnar = dall*nx*ny*nz*spfra!sparsity fraction + maxvp = (nx-2)*(ny-2)*(nz-1) + allocate(dv(maxvp), stat=checkstat) + allocate(norm(maxvp), stat=checkstat) + allocate(vsf(nx,ny,nz), stat=checkstat) + allocate(vsftrue(nx,ny,nz), stat=checkstat) + + allocate(rw(maxnar), stat=checkstat) + if(checkstat > 0)then + write(6,*)'error with allocate: real rw' + endif + allocate(iw(2*maxnar+1), stat=checkstat) + if(checkstat > 0)then + write(6,*)'error with allocate: integer iw' + endif + allocate(col(maxnar), stat=checkstat) + if(checkstat > 0)then + write(6,*)'error with allocate: integer iw' + endif + allocate(cbst(dall+maxvp),dsyn(dall),datweight(dall),wt(dall+maxvp),dtres(dall+maxvp),& + stat=checkstat) + +! MEASUREMENTS STATISTICS AND READ INITIAL MODEL + write(*,'(a,i7)') 'Number of all measurements',dall + + open(10,file='MOD',status='old') + read(10,*) (depz(i),i=1,nz) + do k = 1,nz + do j = 1,ny + read(10,*)(vsf(i,j,k),i=1,nx) + enddo + enddo + close(10) + write(*,*) 'grid points in depth direction:(km)' + write(*,'(50f6.2)') depz + + + +! CHECKERBOARD TEST + if (ifsyn == 1) then + write(*,*) 'Checkerboard Resolution Test Begin' + vsftrue = vsf + + open(11,file='MOD.true',status='old') + do k = 1,nz + do j = 1,ny + read(11,*) (vsftrue(i,j,k),i=1,nx) + enddo + enddo + close(11) + + call synthetic(nx,ny,nz,maxvp,vsftrue,obst,& + goxd,gozd,dvxd,dvzd,kmaxRc,kmaxRg,kmaxLc,kmaxLg,& + tRc,tRg,tLc,tLg,wavetype,igrt,periods,depz,minthk,& + scxf,sczf,rcxf,rczf,nrc1,nsrc1,knum1,kmax,& + nsrc,nrc,noiselevel) + endif + + + +! ITERATE UNTILL CONVERGE + writepath = 0 + do iter = 1,maxiter + iw = 0 + rw = 0.0 + col = 0 + +! COMPUTE SENSITIVITY MATRIX + if (iter == maxiter) then + writepath = 1 + open(40,file='raypath.out') + endif + write(*,*) 'computing sensitivity matrix...' + call CalSurfG(nx,ny,nz,maxvp,vsf,iw,rw,col,dsyn,& + goxd,gozd,dvxd,dvzd,kmaxRc,kmaxRg,kmaxLc,kmaxLg,& + tRc,tRg,tLc,tLg,wavetype,igrt,periods,depz,minthk,& + scxf,sczf,rcxf,rczf,nrc1,nsrc1,knum1,kmax,& + nsrc,nrc,nar,writepath) + + do i = 1,dall + cbst(i) = obst(i) - dsyn(i) + enddo + + threshold = threshold0+(maxiter/2-iter)/3*0.5 + do i = 1,dall + datweight(i) = 1.0 + if(abs(cbst(i)) > threshold) then + datweight(i) = exp(-(abs(cbst(i))-threshold)) + endif + cbst(i) = cbst(i)*datweight(i) + enddo + + do i = 1,nar + rw(i) = rw(i)*datweight(iw(1+i)) + enddo + + norm=0 + do i=1,nar + norm(col(i))=norm(col(i))+abs(rw(i)) + enddo + averdws=0 + maxnorm=0 + do i=1,maxvp + averdws = averdws+norm(i) + if(norm(i)>maxnorm) maxnorm=norm(i) + enddo + averdws=averdws/maxvp + write(66,*)'Maximum and Average DWS values:',maxnorm,averdws + write(66,*)'Threshold is:',threshold + +! WRITE OUT RESIDUAL FOR THE FIRST AND LAST ITERATION + if(iter.eq.1) then + open(88,file='residualFirst.dat') + do i=1,dall + write(88,*) dist(i),dsyn(i),obst(i), & + dsyn(i)*datweight(i),obst(i)*datweight(i),datweight(i) + enddo + close(88) + endif + if(iter.eq.maxiter) then + open(88,file='residualLast.dat') + do i=1,dall + write(88,*) dist(i),dsyn(i),obst(i), & + dsyn(i)*datweight(i),obst(i)*datweight(i),datweight(i) + enddo + close(88) + endif + + +! ADDING REGULARIZATION TERM + weight=dnrm2(dall,cbst,1)**2/dall*weight0 + nar_tmp=nar + nars=0 + + count3=0 + nvz=ny-2 + nvx=nx-2 + do k=1,nz-1 + do j=1,nvz + do i=1,nvx + if(i==1.or.i==nvx.or.j==1.or.j==nvz.or.k==1.or.k==nz-1)then + count3=count3+1 + col(nar+1)=(k-1)*nvz*nvx+(j-1)*nvx+i + rw(nar+1)=2.0*weight + iw(1+nar+1)=dall+count3 + cbst(dall+count3)=0 + nar=nar+1 + else + count3=count3+1 + col(nar+1)=(k-1)*nvz*nvx+(j-1)*nvx+i + rw(nar+1)=6.0*weight + iw(1+nar+1)=dall+count3 + rw(nar+2)=-1.0*weight + iw(1+nar+2)=dall+count3 + col(nar+2)=(k-1)*nvz*nvx+(j-1)*nvx+i-1 + rw(nar+3)=-1.0*weight + iw(1+nar+3)=dall+count3 + col(nar+3)=(k-1)*nvz*nvx+(j-1)*nvx+i+1 + rw(nar+4)=-1.0*weight + iw(1+nar+4)=dall+count3 + col(nar+4)=(k-1)*nvz*nvx+(j-2)*nvx+i + rw(nar+5)=-1.0*weight + iw(1+nar+5)=dall+count3 + col(nar+5)=(k-1)*nvz*nvx+j*nvx+i + rw(nar+6)=-1.0*weight + iw(1+nar+6)=dall+count3 + col(nar+6)=(k-2)*nvz*nvx+(j-1)*nvx+i + rw(nar+7)=-1.0*weight + iw(1+nar+7)=dall+count3 + col(nar+7)=k*nvz*nvx+(j-1)*nvx+i + cbst(dall+count3)=0 + nar=nar+7 + endif + enddo + enddo + enddo + m = dall + count3 + n = maxvp + + iw(1)=nar + do i=1,nar + iw(1+nar+i)=col(i) + enddo + if (nar > maxnar) stop 'increase sparsity fraction(spfra)' + +! CALLING IRLS TO SOLVE THE PROBLEM + + leniw = 2*nar+1 + lenrw = nar + dv = 0 + atol = 1e-3 + btol = 1e-3 + conlim = 1200 + itnlim = 1000 + istop = 0 + anorm = 0.0 + acond = 0.0 + arnorm = 0.0 + xnorm = 0.0 + localSize = n/4 + + call LSMR(m, n, leniw, lenrw,iw,rw,cbst, damp,& + atol, btol, conlim, itnlim, localSize, nout,& + dv, istop, itn, anorm, acond, rnorm, arnorm, xnorm) + if(istop==3) print*,'istop = 3, large condition number' + + + mean = sum(cbst(1:dall))/dall + std_devs = sqrt(sum(cbst(1:dall)**2)/dall - mean**2) + write(*,'(i2,a)'),iter,'th iteration...' + write(*,'(a,f7.3)'),'weight is:',weight + write(*,'(a,f8.1,a,f8.2,a,f8.3)'),'mean,std_devs and chi sqrue of & + residual: ',mean*1000,'ms ',1000*std_devs,'ms ',& + dnrm2(dall,cbst,1)**2/sqrt(real(dall)) + write(66,'(i2,a)'),iter,'th iteration...' + write(66,'(a,f7.3)'),'weight is:',weight + write(66,'(a,f8.1,a,f8.2,a,f8.3)'),'mean,std_devs and chi sqrue of & + residual: ',mean*1000,'ms ',1000*std_devs,'ms ',& + dnrm2(dall,cbst,1)**2/sqrt(real(dall)) + + write(*,'(a,2f7.4)'),'min and max velocity variation ',& + minval(dv),maxval(dv) + write(66,'(a,2f7.4)'),'min and max velocity variation ',& + minval(dv),maxval(dv) + + do k=1,nz-1 + do j=1,ny-2 + do i=1,nx-2 + if(dv((k-1)*(nx-2)*(ny-2)+(j-1)*(nx-2)+i).ge.0.500) then + dv((k-1)*(nx-2)*(ny-2)+(j-1)*(nx-2)+i)=0.500 + endif + if(dv((k-1)*(nx-2)*(ny-2)+(j-1)*(nx-2)+i).le.-0.500) then + dv((k-1)*(nx-2)*(ny-2)+(j-1)*(nx-2)+i)=-0.500 + endif + vsf(i+1,j+1,k)=vsf(i+1,j+1,k)+dv((k-1)*(nx-2)*(ny-2)+(j-1)*(nx-2)+i) + if(vsf(i+1,j+1,k).lt.Minvel) vsf(i+1,j+1,k)=Minvel + if(vsf(i+1,j+1,k).gt.Maxvel) vsf(i+1,j+1,k)=Maxvel + enddo + enddo + enddo + write(34,*)',OUTPUT S VELOCITY AT ITERATION',iter + do k=1,nz + do j=1,ny + write(34,'(100f7.3)') (vsf(i,j,k),i=1,nx) + enddo + enddo + write(34,*)',OUTPUT DWS AT ITERATION',iter + do k=1,nz-1 + do j=2,ny-1 + write(34,'(100f8.1)') (norm((k-1)*(ny-2)*(nx-2)+(j-2)*(nx-2)+i-1),i=2,nx-1) + enddo + enddo + + enddo !end iteration + +! OUTPUT THE VELOCITY MODEL + + write(*,*),'Program finishes successfully' + write(66,*),'Program finishes successfully' + + if(ifsyn == 1) then + open(65,file='Vs_model.real') + write(outsyn,'(a,a)') trim(inputfile),'Syn.dat' + open(63,file=outsyn) + do k=1,nz-1 + do j=1,ny-2 + do i=1,nx-2 + write(65,'(5f8.4)') gozd+(j-1)*dvzd,goxd-(i-1)*dvxd,depz(k),vsftrue(i,j,k) + write(63,'(5f8.4)') gozd+(j-1)*dvzd,goxd-(i-1)*dvxd,depz(k),vsf(i,j,k) + enddo + enddo + enddo + close(65) + close(63) + write(*,*),'Output True velocity model & + to Vs_model.real' + write(*,*),'Output inverted shear velocity model & + to ',outsyn + write(66,*),'Output True velocity model & + to Vs_model.real' + write(66,*),'Output inverted shear velocity model & + to ',outsyn + else + write(outmodel,'(a,a)') trim(inputfile),'Measure.dat' + open(64,file=outmodel) + do k=1,nz-1 + do j=1,ny-2 + do i=1,nx-2 + write(64,'(5f8.4)') gozd+(j-1)*dvzd,goxd-(i-1)*dvxd,depz(k),vsf(i,j,k) + enddo + enddo + enddo + close(64) + write(*,*),'Output inverted shear velocity model & + to ',outmodel + write(66,*),'Output inverted shear velocity model & + to ',outmodel + endif + + close(34) + close(40) + close(nout) !close lsmr.txt + close(66) !close surf_tomo.log + deallocate(obst) + deallocate(dsyn) + deallocate(dist) + deallocate(depz) + deallocate(scxf,sczf) + deallocate(rcxf,rczf) + deallocate(wavetype,igrt,nrc1) + deallocate(nsrc1,knum1,periods) + deallocate(rw) + deallocate(iw,col) + deallocate(cbst,wt,dtres,datweight) + deallocate(dv) + deallocate(norm) + deallocate(vsf) + deallocate(vsftrue) + if(kmaxRc.gt.0) then + deallocate(tRc) + endif + if(kmaxRg.gt.0) then + deallocate(tRg) + endif + if(kmaxLc.gt.0) then + deallocate(tLc) + endif + if(kmaxLg.gt.0) then + deallocate(tLg) + endif + + end program diff --git a/src/surfdisp96.f b/src/surfdisp96.f new file mode 100644 index 0000000..1e61103 --- /dev/null +++ b/src/surfdisp96.f @@ -0,0 +1,1062 @@ +c----------------------------------------------------------------------c +c c +c COMPUTER PROGRAMS IN SEISMOLOGY c +c VOLUME IV c +c c +c PROGRAM: SRFDIS c +c c +c COPYRIGHT 1986, 1991 c +c D. R. Russell, R. B. Herrmann c +c Department of Earth and Atmospheric Sciences c +c Saint Louis University c +c 221 North Grand Boulevard c +c St. Louis, Missouri 63103 c +c U. S. A. c +c c +c----------------------------------------------------------------------c +c This is a combination of program 'surface80' which search the poles +c on C-T domain, and the program 'surface81' which search in the F-K +c domain. The input data is slightly different with its precessors. +c -Wang 06/06/83. +c +c The program calculates the dispersion values for any +c layered model, any frequency, and any mode. +c +c This program will accept one liquid layer at the surface. +c In such case ellipticity of rayleigh wave is that at the +c top of solid array. Love wave communications ignore +c liquid layer. +c +c Program developed by Robert B Herrmann Saint Louis +c univ. Nov 1971, and revised by C. Y. Wang on Oct 1981. +c Modified for use in surface wave inversion, and +c addition of spherical earth flattening transformation, by +c David R. Russell, St. Louis University, Jan. 1984. +c +c Changes +c 28 JAN 2003 - fixed minor but for sphericity correction by +c saving one parameter in subroutine sphere +c 20 JUL 2004 - removed extraneous line at line 550 +c since dc not defined +c if(dabs(c1-c2) .le. dmin1(1.d-6*c1,0.005d+0*dc) )go to 1000 +c 28 DEC 2007 - changed the Earth flattening to now use layer +c midpoint and the Biswas (1972: PAGEOPH 96, 61-74, 1972) +c density mapping for P-SV - note a true comparison +c requires the ability to handle a fluid core for SH and SV +c Also permit one layer with fluid is base of the velocity is 0.001 km/sec +c----- +c 13 JAN 2010 - modified by Huajian Yao at MIT for calculation of +c group or phase velocities +c----- + + subroutine surfdisp96(thkm,vpm,vsm,rhom,nlayer,iflsph,iwave, + & mode,igr,kmax,t,cg) + + parameter(LER=0,LIN=5,LOT=66) + integer NL, NL2, NLAY + parameter(NL=200,NLAY=200,NL2=NL+NL) + integer NP + parameter (NP=60) + +c----- +c LIN - unit for FORTRAN read from terminal +c LOT - unit for FORTRAN write to terminal +c LER - unit for FORTRAN error output to terminal +c NL - layers in model +c NP - number of unique periods +c----- +c----- parameters +c thkm, vpm, vsm, rhom: model for dispersion calculation +c nlayer - I4: number of layers in the model +c iflsph - I4: 0 flat earth model, 1 spherical earth model +c iwave - I4: 1 Love wave, 2 Rayleigh wave +c mode - I4: ith mode of surface wave, 1 fundamental, 2 first higher, .... +c igr - I4: 0 phase velocity, > 0 group velocity +c kmax - I4: number of periods (t) for dispersion calculation +c t - period vector (t(NP)) +c cg - output phase or group velocities (vector,cg(NP)) +c----- + real*4 thkm(NLAY),vpm(NLAY),vsm(NLAY),rhom(NLAY) + integer nlayer,iflsph,iwave,mode,igr,kmax + double precision twopi,one,onea + double precision cc,c1,clow,cm,dc,t1 + double precision t(NP),c(NP),cb(NP),cg(NP) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) +c common/modl/ d,a,b,rho,rtp,dtp,btp +c common/para/ mmax,llw,twopi + integer*4 iverb(2) + integer*4 llw + integer*4 nsph, ifunc, idispl, idispr, is, ie + real*4 sone0, ddc0, h0, sone, ddc, h + +c maximum number of layers in the model + mmax = nlayer +c is the model flat (nsph = 0) or sphere (nsph = 1) + nsph = iflsph + +c----- +c save current values + do 39 i=1,mmax + b(i) = vsm(i) + a(i) = vpm(i) + d(i) = thkm(i) + rho(i) = rhom(i) +c print *,d(i), b(i) + 39 continue + + if(iwave.eq.1)then + idispl = kmax + idispr = 0 + elseif(iwave.eq.2)then + idispl = 0 + idispr = kmax + endif + + iverb(1) = 0 + iverb(2) = 0 +c ---- constant value + sone0 = 1.500 +c ---- phase velocity increment for searching root + ddc0 = 0.005 +c ---- frequency increment (%) for calculating group vel. using g = dw/dk = dw/d(w/c) + h0 = 0.005 +c ---- period range is:ie for calculation of dispersion + +c----- +c check for water layer +c----- + llw=1 + if(b(1).le.0.0) llw=2 + twopi=2.d0*3.141592653589793d0 + one=1.0d-2 + if(nsph.eq.1) call sphere(0,0,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + JMN = 1 + betmx=-1.e20 + betmn=1.e20 +c----- +c find the extremal velocities to assist in starting search +c----- + do 20 i=1,mmax + if(b(i).gt.0.01 .and. b(i).lt.betmn)then + betmn = b(i) + jmn = i + jsol = 1 + elseif(b(i).le.0.01 .and. a(i).lt.betmn)then + betmn = a(i) + jmn = i + jsol = 0 + endif + if(b(i).gt.betmx) betmx=b(i) + 20 continue +cc WRITE(6,*)'betmn, betmx:',betmn, betmx +c if(idispl.gt.0)then +cc open(1,file='tmpsrfi.06',form='unformatted', +cc 1 access='sequential') +cc rewind 1 +c read(*,*) lovdispfile +c open(1, file = lovdispfile); +c endif +c if(idispr.gt.0)then +cc open(2,file='tmpsrfi.07',form='unformatted', +cc 1 access='sequential') +cc rewind 2 +c read(*,*) raydispfile +c open(2, file = raydispfile); +c endif + do 2000 ifunc=1,2 + if(ifunc.eq.1.and.idispl.le.0) go to 2000 + if(ifunc.eq.2.and.idispr.le.0) go to 2000 + if(nsph.eq.1) call sphere(ifunc,1,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + ddc = ddc0 + sone = sone0 + h = h0 +c read(*,*) kmax,mode,ddc,sone,igr,h +c write(*,*) kmax,mode,ddc,sone,igr,h +c read(*,*) (t(i),i=1,kmax) +c write(*,*) (t(i),i=1,kmax) +cc write(ifunc,*) mmax,nsph +cc write(ifunc,*) (btp(i),i=1,mmax) +cc write(ifunc,*) (dtp(i),i=1,mmax) +cc do 420 i=1,mmax +cc write(ifunc,*) d(i),a(i),b(i),rho(i) +cc 420 continue +c write(ifunc,*) kmax,igr,h + if(sone.lt. 0.01) sone=2.0 + onea=dble(sone) +c----- +c get starting value for phase velocity, +c which will correspond to the +c VP/VS ratio +c----- + if(jsol.eq.0)then +c----- +c water layer +c----- + cc1 = betmn + else +c----- +c solid layer solve halfspace period equation +c----- + call gtsolh(a(jmn),b(jmn),cc1) + endif +c----- +c back off a bit to get a starting value at a lower phase velocity +c----- + cc1=.95*cc1 + CC1=.90*CC1 + cc=dble(cc1) + dc=dble(ddc) + dc = dabs(dc) + c1=cc + cm=cc + do 450 i=1,kmax + cb(i)=0.0d0 + c(i)=0.0d0 + 450 continue + ift=999 + do 1800 iq=1,mode + is = 1 + ie = kmax +c read(*,*) is,ie +c write(*,*) 'is =', is, ', ie = ', ie + itst=ifunc + do 1600 k=is,ie + if(k.ge.ift) go to 1700 + t1=dble(t(k)) + if(igr.gt.0)then + t1a=t1/(1.+h) + t1b=t1/(1.-h) + t1=dble(t1a) + else + t1a=sngl(t1) + tlb=0.0 + endif +c----- +c get initial phase velocity estimate to begin search +c +c in the notation here, c() is an array of phase velocities +c c(k-1) is the velocity estimate of the present mode +c at the k-1 period, while c(k) is the phase velocity of the +c previous mode at the k period. Since there must be no mode +c crossing, we make use of these values. The only complexity +c is that the dispersion may be reversed. +c +c The subroutine getsol determines the zero crossing and refines +c the root. +c----- + if(k.eq.is .and. iq.eq.1)then + c1 = cc + clow = cc + ifirst = 1 + elseif(k.eq.is .and. iq.gt.1)then + c1 = c(is) + one*dc + clow = c1 + ifirst = 1 + elseif(k.gt.is .and. iq.gt.1)then + ifirst = 0 +c clow = c(k) + one*dc +c c1 = c(k-1) -onea*dc + clow = c(k) + one*dc + c1 = c(k-1) + if(c1 .lt. clow)c1 = clow + elseif(k.gt.is .and. iq.eq.1)then + ifirst = 0 + c1 = c(k-1) - onea*dc + clow = cm + endif +c----- +c bracket root and refine it +c----- + call getsol(t1,c1,clow,dc,cm,betmx,iret,ifunc,ifirst,d,a,b,rho,rtp,dtp,btp,mmax,llw) + if(iret.eq.-1)goto 1700 + c(k) = c1 +c----- +c for group velocities compute near above solution +c----- + if(igr.gt.0) then + t1=dble(t1b) + ifirst = 0 + clow = cb(k) + one*dc + c1 = c1 -onea*dc + call getsol(t1,c1,clow,dc,cm,betmx,iret,ifunc,ifirst,d,a,b,rho,rtp,dtp,btp,mmax,llw) +c----- +c test if root not found at slightly larger period +c----- + if(iret.eq.-1)then + c1 = c(k) + endif + cb(k)=c1 + else + c1 = 0.0d+00 + endif + cc0 = sngl(c(k)) + cc1 = sngl(c1) + if(igr.eq.0) then +c ----- output only phase velocity +c write(ifunc,*) itst,iq,t(k),cc0,0.0 + cg(k) = cc0 + else +c ----- calculate group velocity and output phase and group velocities + gvel = (1/t1a-1/t1b)/(1/(t1a*cc0)-1/(t1b*cc1)) + cg(k) = gvel +c write(ifunc,*) itst,iq,t(k),(cc0+cc1)/2,gvel +c ----- print *, itst,iq,t(k),t1a,t1b,cc0,cc1,gvel + endif + 1600 continue + go to 1800 + 1700 if(iq.gt.1) go to 1750 + if(iverb(ifunc).eq.0)then + iverb(ifunc) = 1 + write(LOT,*)'improper initial value in disper - no zero found' + write(*,*)'WARNING:improper initial value in disper - no zero found' + write(LOT,*)'in fundamental mode ' + write(LOT,*)'This may be due to low velocity zone ' + write(LOT,*)'causing reverse phase velocity dispersion, ' + write(LOT,*)'and mode jumping.' + write(LOT,*)'due to looking for Love waves in a halfspace' + write(LOT,*)'which is OK if there are Rayleigh data.' + write(LOT,*)'If reverse dispersion is the problem,' + write(LOT,*)'Get present model using OPTION 28, edit sobs.d,' + write(LOT,*)'Rerun with onel large than 2' + write(LOT,*)'which is the default ' +c----- +c if we have higher mode data and the model does not find that +c mode, just indicate (itst=0) that it has not been found, but +c fill out file with dummy results to maintain format - note +c eigenfunctions will not be found for these values. The subroutine +c 'amat' in 'surf' will worry about this in building up the +c input file for 'surfinv' +c----- + write(LOT,*)'ifunc = ',ifunc ,' (1=L, 2=R)' + write(LOT,*)'mode = ',iq-1 + write(LOT,*)'period= ',t(k), ' for k,is,ie=',k,is,ie + write(LOT,*)'cc,cm = ',cc,cm + write(LOT,*)'c1 = ',c1 + write(LOT,*)'d,a,b,rho (d(mmax)=control ignore)' + write(LOT,'(4f15.5)')(d(i),a(i),b(i),rho(i),i=1,mmax) + write(LOT,*)' c(i),i=1,k (NOTE may be part)' + write(LOT,*)(c(i),i=1,k) + endif +c if(k.gt.0)goto 1750 +c go to 2000 + 1750 ift=k + itst=0 + do 1770 i=k,ie + t1a=t(i) +c write(ifunc,*) itst,iq,t1a,0.0,0.0 + cg(i) = 0.0 + 1770 continue + 1800 continue +c close(ifunc,status='keep') + 2000 continue +c close(3,status='keep') + + end + + + + + + + subroutine gtsolh(a,b,c) +c----- +c starting solution +c----- + real*4 kappa, k2, gk2 + c = 0.95*b + do 100 i=1,5 + gamma = b/a + kappa = c/b + k2 = kappa**2 + gk2 = (gamma*kappa)**2 + fac1 = sqrt(1.0 - gk2) + fac2 = sqrt(1.0 - k2) + fr = (2.0 - k2)**2 - 4.0*fac1*fac2 + frp = -4.0*(2.0-k2) *kappa + 1 +4.0*fac2*gamma*gamma*kappa/fac1 + 2 +4.0*fac1*kappa/fac2 + frp = frp/b + c = c - fr/frp + 100 continue + return + end + + subroutine getsol(t1,c1,clow,dc,cm,betmx,iret,ifunc,ifirst,d,a,b,rho,rtp,dtp,btp,mmax,llw) +c----- +c subroutine to bracket dispersion curve +c and then refine it +c----- +c t1 - period +c c1 - initial guess on low side of mode +c clow - lowest possible value for present mode in a +c reversed direction search +c dc - phase velocity search increment +c cm - minimum possible solution +c betmx - maximum shear velocity +c iret - 1 = successful +c - -1= unsuccessful +c ifunc - 1 - Love +c - 2 - Rayleigh +c ifirst - 1 this is first period for a particular mode +c - 0 this is not the first period +c (this is to define period equation sign +c for mode jumping test) +c----- + parameter (NL=200) + real*8 wvno, omega, twopi + real*8 c1, c2, cn, cm, dc, t1, clow + real*8 dltar, del1, del2, del1st, plmn + save del1st + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) + integer llw,mmax +c----- +c to avoid problems in mode jumping with reversed dispersion +c we note what the polarity of period equation is for phase +c velocities just beneath the zero crossing at the +c first period computed. +c----- +c bracket solution +c----- + twopi=2.d0*3.141592653589793d0 + omega=twopi/t1 + wvno=omega/c1 + del1 = dltar(wvno,omega,ifunc,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + if(ifirst.eq.1)del1st = del1 + plmn = dsign(1.0d+00,del1st)*dsign(1.0d+00,del1) + if(ifirst.eq.1)then + idir = +1 + elseif(ifirst.ne.1 .and. plmn.ge.0.0d+00)then + idir = +1 + elseif(ifirst.ne.1 .and. plmn.lt.0.0d+00)then + idir = -1 + endif +c----- +c idir indicates the direction of the search for the +c true phase velocity from the initial estimate. +c Usually phase velocity increases with period and +c we always underestimate, so phase velocity should increase +c (idir = +1). For reversed dispersion, we should look +c downward from the present estimate. However, we never +c go below the floor of clow, when the direction is reversed +c----- + 1000 continue + if(idir.gt.0)then + c2 = c1 + dc + else + c2 = c1 - dc + endif + if(c2.le.clow)then + idir = +1 + c1 = clow + endif + if(c2.le.clow)goto 1000 + omega=twopi/t1 + wvno=omega/c2 + del2 = dltar(wvno,omega,ifunc,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + if (dsign(1.0d+00,del1).ne.dsign(1.0d+00,del2)) then + go to 1300 + endif + c1=c2 + del1=del2 +c check that c1 is in region of solutions + if(c1.lt.cm) go to 1700 + if(c1.ge.(betmx+dc)) go to 1700 + go to 1000 +c----- +c root bracketed, refine it +c----- + 1300 call nevill(t1,c1,c2,del1,del2,ifunc,cn,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + c1 = cn + if(c1.gt.(betmx)) go to 1700 + iret = 1 + return + 1700 continue + iret = -1 + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + subroutine sphere(ifunc,iflag,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c----- +c Transform spherical earth to flat earth +c +c Schwab, F. A., and L. Knopoff (1972). Fast surface wave and free +c mode computations, in Methods in Computational Physics, +c Volume 11, +c Seismology: Surface Waves and Earth Oscillations, +c B. A. Bolt (ed), +c Academic Press, New York +c +c Love Wave Equations 44, 45 , 41 pp 112-113 +c Rayleigh Wave Equations 102, 108, 109 pp 142, 144 +c +c Revised 28 DEC 2007 to use mid-point, assume linear variation in +c slowness instead of using average velocity for the layer +c Use the Biswas (1972:PAGEOPH 96, 61-74, 1972) density mapping +c +c ifunc I*4 1 - Love Wave +c 2 - Rayleigh Wave +c iflag I*4 0 - Initialize +c 1 - Make model for Love or Rayleigh Wave +c----- + parameter(NL=200,NP=60) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) + integer mmax,llw +c common/modl/ d,a,b,rho,rtp,dtp,btp +c common/para/ mmax,llw,twopi + double precision z0,z1,r0,r1,dr,ar,tmp,twopi + save dhalf + ar=6370.0d0 + dr=0.0d0 + r0=ar + d(mmax)=1.0 + if(iflag.eq.0) then + do 5 i=1,mmax + dtp(i)=d(i) + rtp(i)=rho(i) + 5 continue + do 10 i=1,mmax + dr=dr+dble(d(i)) + r1=ar-dr + z0=ar*dlog(ar/r0) + z1=ar*dlog(ar/r1) + d(i)=z1-z0 +c----- +c use layer midpoint +c----- + TMP=(ar+ar)/(r0+r1) + a(i)=a(i)*tmp + b(i)=b(i)*tmp + btp(i)=tmp + r0=r1 + 10 continue + dhalf = d(mmax) + else + d(mmax) = dhalf + do 30 i=1,mmax + if(ifunc.eq.1)then + rho(i)=rtp(i)*btp(i)**(-5) + else if(ifunc.eq.2)then + rho(i)=rtp(i)*btp(i)**(-2.275) + endif + 30 continue + endif + d(mmax)=0.0 + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + subroutine nevill(t,c1,c2,del1,del2,ifunc,cc,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c----- +c hybrid method for refining root once it has been bracketted +c between c1 and c2. interval halving is used where other schemes +c would be inefficient. once suitable region is found neville s +c iteration method is used to find root. +c the procedure alternates between the interval halving and neville +c techniques using whichever is most efficient +c----- +c the control integer nev means the following: +c +c nev = 0 force interval halving +c nev = 1 permit neville iteration if conditions are proper +c nev = 2 neville iteration is being used +c----- + parameter (NL=200,NP=60) + implicit double precision (a-h,o-z) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) + dimension x(20),y(20) + integer llw,mmax +c common/modl/ d,a,b,rho,rtp,dtp,btp +c common/para/ mmax,llw,twopi +c----- +c initial guess +c----- + omega = twopi/t + call half(c1,c2,c3,del3,omega,ifunc,d,a,b,rho,rtp,dtp,btp, + & mmax,llw,twopi,a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + nev = 1 + nctrl=1 + 100 continue + nctrl=nctrl+1 + if(nctrl.ge.100) go to 1000 +c----- +c make sure new estimate is inside the previous values. If not +c perform interval halving +c----- + if(c3 .lt. dmin1(c1,c2) .or. c3. gt.dmax1(c1,c2))then + nev = 0 + call half(c1,c2,c3,del3,omega,ifunc,d,a,b,rho,rtp,dtp,btp, + & mmax,llw,twopi,a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + endif + s13 = del1 - del3 + s32 = del3 - del2 +c----- +c define new bounds according to the sign of the period equation +c----- + if(dsign(1.d+00,del3)*dsign(1.d+00,del1) .lt.0.0d+00)then + c2 = c3 + del2 = del3 + else + c1 = c3 + del1 = del3 + endif +c----- +c check for convergence. A relative error criteria is used +c----- + if(dabs(c1-c2).le.1.d-6*c1) go to 1000 +c----- +c if the slopes are not the same between c1, c3 and c3 +c do not use neville iteration +c----- + if(dsign (1.0d+00,s13).ne.dsign (1.0d+00,s32)) nev = 0 +c----- +c if the period equation differs by more than a factor of 10 +c use interval halving to avoid poor behavior of polynomial fit +c----- + ss1=dabs(del1) + s1=0.01*ss1 + ss2=dabs(del2) + s2=0.01*ss2 + if(s1.gt.ss2.or.s2.gt.ss1 .or. nev.eq.0) then + call half(c1,c2,c3,del3,omega,ifunc,d,a,b,rho,rtp,dtp,btp, + & mmax,llw,twopi,a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + nev = 1 + m = 1 + else + if(nev.eq.2)then + x(m+1) = c3 + y(m+1) = del3 + else + x(1) = c1 + y(1) = del1 + x(2) = c2 + y(2) = del2 + m = 1 + endif +c----- +c perform Neville iteration. Note instead of generating y(x) +c we interchange the x and y of formula to solve for x(y) when +c y = 0 +c----- + do 900 kk = 1,m + j = m-kk+1 + denom = y(m+1) - y(j) + if(dabs(denom).lt.1.0d-10*abs(y(m+1)))goto 950 + x(j)=(-y(j)*x(j+1)+y(m+1)*x(j))/denom + 900 continue + c3 = x(1) + wvno = omega/c3 + del3 = dltar(wvno,omega,ifunc,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + nev = 2 + m = m + 1 + if(m.gt.10)m = 10 + goto 951 + 950 continue + call half(c1,c2,c3,del3,omega,ifunc,d,a,b,rho,rtp,dtp,btp, + & mmax,llw,twopi,a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + nev = 1 + m = 1 + 951 continue + endif + goto 100 + 1000 continue + cc = c3 + return + end + + subroutine half(c1,c2,c3,del3,omega,ifunc,d,a,b,rho,rtp,dtp,btp, + & mmax,llw,twopi,a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + implicit double precision (a-h,o-z) + parameter(NL=200) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) + c3 = 0.5*(c1 + c2) + wvno=omega/c3 + del3 = dltar(wvno,omega,ifunc,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + function dltar(wvno,omega,kk,d,a,b,rho,rtp,dtp,btp,mmax,llw,twop) +c & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) +c control the way to P-SV or SH. +c + implicit double precision (a-h,o-z) + parameter(NL=200) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) +c + if(kk.eq.1)then +c love wave period equation + dltar = dltar1(wvno,omega,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) + elseif(kk.eq.2)then +c rayleigh wave period equation + dltar = dltar4(wvno,omega,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + endif + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + function dltar1(wvno,omega,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c find SH dispersion values. +c + parameter (NL=200,NP=60) + implicit double precision (a-h,o-z) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) + integer llw,mmax +c common/modl/ d,a,b,rho,rtp,dtp,btp +c common/para/ mmax,llw,twopi +c +c Haskell-Thompson love wave formulation from halfspace +c to surface. +c + beta1=dble(b(mmax)) + rho1=dble(rho(mmax)) + xkb=omega/beta1 + wvnop=wvno+xkb + wvnom=dabs(wvno-xkb) + rb=dsqrt(wvnop*wvnom) + e1=rho1*rb + e2=1.d+00/(beta1*beta1) + mmm1 = mmax - 1 + do 600 m=mmm1,llw,-1 + beta1=dble(b(m)) + rho1=dble(rho(m)) + xmu=rho1*beta1*beta1 + xkb=omega/beta1 + wvnop=wvno+xkb + wvnom=dabs(wvno-xkb) + rb=dsqrt(wvnop*wvnom) + q = dble(d(m))*rb + if(wvno.lt.xkb)then + sinq = dsin(q) + y = sinq/rb + z = -rb*sinq + cosq = dcos(q) + elseif(wvno.eq.xkb)then + cosq=1.0d+00 + y=dble(d(m)) + z=0.0d+00 + else + fac = 0.0d+00 + if(q.lt.16)fac = dexp(-2.0d+0*q) + cosq = ( 1.0d+00 + fac ) * 0.5d+00 + sinq = ( 1.0d+00 - fac ) * 0.5d+00 + y = sinq/rb + z = rb*sinq + endif + e10=e1*cosq+e2*xmu*z + e20=e1*y/xmu+e2*cosq + xnor=dabs(e10) + ynor=dabs(e20) + if(ynor.gt.xnor) xnor=ynor + if(xnor.lt.1.d-40) xnor=1.0d+00 + e1=e10/xnor + e2=e20/xnor + 600 continue + dltar1=e1 + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + function dltar4(wvno,omga,d,a,b,rho,rtp,dtp,btp,mmax,llw,twopi) +c & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) +c find P-SV dispersion values. +c + parameter (NL=200,NP=60) + implicit double precision (a-h,o-z) + dimension e(5),ee(5),ca(5,5) + real*4 d(NL),a(NL),b(NL),rho(NL),rtp(NL),dtp(NL),btp(NL) +c common/modl/ d,a,b,rho,rtp,dtp,btp +c common/para/ mmax,llw,twopi +c common/ovrflw/ a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz +c + omega=omga + if(omega.lt.1.0d-4) omega=1.0d-4 + wvno2=wvno*wvno + xka=omega/dble(a(mmax)) + xkb=omega/dble(b(mmax)) + wvnop=wvno+xka + wvnom=dabs(wvno-xka) + ra=dsqrt(wvnop*wvnom) + wvnop=wvno+xkb + wvnom=dabs(wvno-xkb) + rb=dsqrt(wvnop*wvnom) + t = dble(b(mmax))/omega +c----- +c E matrix for the bottom half-space. +c----- + gammk = 2.d+00*t*t + gam = gammk*wvno2 + gamm1 = gam - 1.d+00 + rho1=dble(rho(mmax)) + e(1)=rho1*rho1*(gamm1*gamm1-gam*gammk*ra*rb) + e(2)=-rho1*ra + e(3)=rho1*(gamm1-gammk*ra*rb) + e(4)=rho1*rb + e(5)=wvno2-ra*rb +c----- +c matrix multiplication from bottom layer upward +c----- + mmm1 = mmax-1 + do 500 m = mmm1,llw,-1 + xka = omega/dble(a(m)) + xkb = omega/dble(b(m)) + t = dble(b(m))/omega + gammk = 2.d+00*t*t + gam = gammk*wvno2 + wvnop=wvno+xka + wvnom=dabs(wvno-xka) + ra=dsqrt(wvnop*wvnom) + wvnop=wvno+xkb + wvnom=dabs(wvno-xkb) + rb=dsqrt(wvnop*wvnom) + dpth=dble(d(m)) + rho1=dble(rho(m)) + p=ra*dpth + q=rb*dpth + beta=dble(b(m)) +c----- +c evaluate cosP, cosQ,.... in var. +c evaluate Dunkin's matrix in dnka. +c----- + call var(p,q,ra,rb,wvno,xka,xkb,dpth,w,cosp,exa, + & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + call dnka(ca,wvno2,gam,gammk,rho1, + & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + do 200 i=1,5 + cr=0.0d+00 + do 100 j=1,5 + cr=cr+e(j)*ca(j,i) + 100 continue + ee(i)=cr + 200 continue + call normc(ee,exa) + do 300 i = 1,5 + e(i)=ee(i) + 300 continue + 500 continue + if(llw.ne.1) then +c----- +c include water layer. +c----- + xka = omega/dble(a(1)) + wvnop=wvno+xka + wvnom=dabs(wvno-xka) + ra=dsqrt(wvnop*wvnom) + dpth=dble(d(1)) + rho1=dble(rho(1)) + p = ra*dpth + beta = dble(b(1)) + znul = 1.0d-05 + call var(p,znul,ra,znul,wvno,xka,znul,dpth,w,cosp,exa, + & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) + w0=-rho1*w + dltar4 = cosp*e(1) + w0*e(2) + else + dltar4 = e(1) + endif + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + subroutine var(p,q,ra,rb,wvno,xka,xkb,dpth,w,cosp,exa,a0,cpcq, + & cpy,cpz,cqw,cqx,xy,xz,wy,wz) +c----- +c find variables cosP, cosQ, sinP, sinQ, etc. +c as well as cross products required for compound matrix +c----- +c To handle the hyperbolic functions correctly for large +c arguments, we use an extended precision procedure, +c keeping in mind that the maximum precision in double +c precision is on the order of 16 decimal places. +c +c So cosp = 0.5 ( exp(+p) + exp(-p)) +c = exp(p) * 0.5 * ( 1.0 + exp(-2p) ) +c becomes +c cosp = 0.5 * (1.0 + exp(-2p) ) with an exponent p +c In performing matrix multiplication, we multiply the modified +c cosp terms and add the exponents. At the last step +c when it is necessary to obtain a true amplitude, +c we then form exp(p). For normalized amplitudes at any depth, +c we carry an exponent for the numerator and the denominator, and +c scale the resulting ratio by exp(NUMexp - DENexp) +c +c The propagator matrices have three basic terms +c +c HSKA cosp cosq +c DUNKIN cosp*cosq 1.0 +c +c When the extended floating point is used, we use the +c largest exponent for each, which is the following: +c +c Let pex = p exponent > 0 for evanescent waves = 0 otherwise +c Let sex = s exponent > 0 for evanescent waves = 0 otherwise +c Let exa = pex + sex +c +c Then the modified matrix elements are as follow: +c +c Haskell: cosp -> 0.5 ( 1 + exp(-2p) ) exponent = pex +c cosq -> 0.5 ( 1 + exp(-2q) ) * exp(q-p) +c exponent = pex +c (this is because we are normalizing all elements in the +c Haskell matrix ) +c Compound: +c cosp * cosq -> normalized cosp * cosq exponent = pex + qex +c 1.0 -> exp(-exa) +c----- + implicit double precision (a-h,o-z) +c common/ovrflw/ a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz + exa=0.0d+00 + a0=1.0d+00 +c----- +c examine P-wave eigenfunctions +c checking whether c> vp c=vp or c < vp +c----- + pex = 0.0d+00 + sex = 0.0d+00 + if(wvno.lt.xka)then + sinp = dsin(p) + w=sinp/ra + x=-ra*sinp + cosp=dcos(p) + elseif(wvno.eq.xka)then + cosp = 1.0d+00 + w = dpth + x = 0.0d+00 + elseif(wvno.gt.xka)then + pex = p + fac = 0.0d+00 + if(p.lt.16)fac = dexp(-2.0d+00*p) + cosp = ( 1.0d+00 + fac) * 0.5d+00 + sinp = ( 1.0d+00 - fac) * 0.5d+00 + w=sinp/ra + x=ra*sinp + endif +c----- +c examine S-wave eigenfunctions +c checking whether c > vs, c = vs, c < vs +c----- + if(wvno.lt.xkb)then + sinq=dsin(q) + y=sinq/rb + z=-rb*sinq + cosq=dcos(q) + elseif(wvno.eq.xkb)then + cosq=1.0d+00 + y=dpth + z=0.0d+00 + elseif(wvno.gt.xkb)then + sex = q + fac = 0.0d+00 + if(q.lt.16)fac = dexp(-2.0d+0*q) + cosq = ( 1.0d+00 + fac ) * 0.5d+00 + sinq = ( 1.0d+00 - fac ) * 0.5d+00 + y = sinq/rb + z = rb*sinq + endif +c----- +c form eigenfunction products for use with compound matrices +c----- + exa = pex + sex + a0=0.0d+00 + if(exa.lt.60.0d+00) a0=dexp(-exa) + cpcq=cosp*cosq + cpy=cosp*y + cpz=cosp*z + cqw=cosq*w + cqx=cosq*x + xy=x*y + xz=x*z + wy=w*y + wz=w*z + qmp = sex - pex + fac = 0.0d+00 + if(qmp.gt.-40.0d+00)fac = dexp(qmp) + cosq = cosq*fac + y=fac*y + z=fac*z + return + end +c +c +c + subroutine normc(ee,ex) +c This routine is an important step to control over- or +c underflow. +c The Haskell or Dunkin vectors are normalized before +c the layer matrix stacking. +c Note that some precision will be lost during normalization. +c + implicit double precision (a-h,o-z) + dimension ee(5) + ex = 0.0d+00 + t1 = 0.0d+00 + do 10 i = 1,5 + if(dabs(ee(i)).gt.t1) t1 = dabs(ee(i)) + 10 continue + if(t1.lt.1.d-40) t1=1.d+00 + do 20 i =1,5 + t2=ee(i) + t2=t2/t1 + ee(i)=t2 + 20 continue +c----- +c store the normalization factor in exponential form. +c----- + ex=dlog(t1) + return + end +c +c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +c + subroutine dnka(ca,wvno2,gam,gammk,rho, + & a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz) +c Dunkin's matrix. +c + implicit double precision (a-h,o-z) + dimension ca(5,5) +c common/ ovrflw / a0,cpcq,cpy,cpz,cqw,cqx,xy,xz,wy,wz + data one,two/1.d+00,2.d+00/ + gamm1 = gam-one + twgm1=gam+gamm1 + gmgmk=gam*gammk + gmgm1=gam*gamm1 + gm1sq=gamm1*gamm1 + rho2=rho*rho + a0pq=a0-cpcq + ca(1,1)=cpcq-two*gmgm1*a0pq-gmgmk*xz-wvno2*gm1sq*wy + ca(1,2)=(wvno2*cpy-cqx)/rho + ca(1,3)=-(twgm1*a0pq+gammk*xz+wvno2*gamm1*wy)/rho + ca(1,4)=(cpz-wvno2*cqw)/rho + ca(1,5)=-(two*wvno2*a0pq+xz+wvno2*wvno2*wy)/rho2 + ca(2,1)=(gmgmk*cpz-gm1sq*cqw)*rho + ca(2,2)=cpcq + ca(2,3)=gammk*cpz-gamm1*cqw + ca(2,4)=-wz + ca(2,5)=ca(1,4) + ca(4,1)=(gm1sq*cpy-gmgmk*cqx)*rho + ca(4,2)=-xy + ca(4,3)=gamm1*cpy-gammk*cqx + ca(4,4)=ca(2,2) + ca(4,5)=ca(1,2) + ca(5,1)=-(two*gmgmk*gm1sq*a0pq+gmgmk*gmgmk*xz+ + * gm1sq*gm1sq*wy)*rho2 + ca(5,2)=ca(4,1) + ca(5,3)=-(gammk*gamm1*twgm1*a0pq+gam*gammk*gammk*xz+ + * gamm1*gm1sq*wy)*rho + ca(5,4)=ca(2,1) + ca(5,5)=ca(1,1) + t=-two*wvno2 + ca(3,1)=t*ca(5,3) + ca(3,2)=t*ca(4,3) + ca(3,3)=a0+two*(cpcq-ca(1,1)) + ca(3,4)=t*ca(2,3) + ca(3,5)=t*ca(1,3) + return + end