📄 rt3dp.f
字号:
cccc fortran subroutine to do 3d ray tracing in parallel subroutine rt3dp(np,nzyx,nzyxo,nz,ny,nx,nzo,nyo,nxo,ek,nt, 1 na,fa,da,amin,amax,azhmin,azhmax,dt,tmax,fxo,fyo,fzo, 2 dxo,dyo,dzo,fac,fx,fy,fz,dx,dy,dz,aperx,apery,v,vxx,vxy,vxz, 3 vyy,vyz,vzz,ov2,vt,vxxt,vxyt,vxzt,vyyt,vyzt,vzzt,tt1,tt2,t,s, 4 xsp,ysp,azhnp,azhxp,fxtp,fytp,nxtp,nytp,nzyxt, 5 xp,yp,zp,pxp,pyp,pzp,e1xp,e1yp,e1zp,e2xp,e2yp,e2zp, 6 q111p,q112p,q121p,q122p,p211p,p212p,p221p,p222p, 7 q211p,q212p,q221p,q222p,vp,dvdxp,dvdyp,dvdzp,nrsp, 8 a0p,azh0p,n1,n2,p2p,q2p,hp,gradvp,d2tp,i2,i3,i6, 9 map,vs,dvdxs,dvdys,dvdzs,uxx,uxy,uxz,uyy,uyz,uzz,tzt, a xx,yy,zz,pxs,pys,pzs,e1xs,e1ys,e1zs,e2xs,e2ys,e2zs, b p111s,p112s,p121s,p122s,q111s,q112s,q121s,q122s, c p211s,p212s,p221s,p222s,q211s,q212s,q221s,q222s, d dxs,dys,dzs,dpxs,dpys,dpzs,de1x,de1y,de1z,de2x, e de2y,de2z,dp111,dp112,dp121,dp122,dq111,dq112,dq121,dq122, f dp211,dp212,dp221,dp222,dq211,dq212,dq221,dq222, g xt,yt,zt,pxt,pyt,pzt,e1xt,e1yt,e1zt,e2xt,e2yt,e2zt, h p111t,p112t,p121t,p122t,q111t,q112t,q121t,q122t,p211t, i p212t,p221t,p222t,q211t,q212t,q221t,q222t,dxt,dyt, j dzt,dpxt,dpyt,dpzt,de1xt,de1yt,de1zt,de2xt,de2yt,de2zt, k dp111t,dp112t,dp121t,dp122t,dq111t,dq112t,dq121t,dq122t, l dp211t,dp212t,dp221t,dp222t,dq211t,dq212t,dq221t,dq222t, m vv,idisk,filevxx,filevxy,filevxz,filevyy,filevyz,filevzz, o lenvxx,lenvxy,lenvxz,lenvyy,lenvyz,lenvzz) integer np,nzyx,nzyxo,nz,ny,nx,nzo,nyo,nxo,ek,na,nt,nzyxt real fa,da,amin,amax,azhmin,azhmax,dt,tmax real fxo,fyo,fzo,dxo,dyo,dzo,fac,fx,fy,fz real dx,dy,dz,aperx,apery real v(nzyx) real vxx(nzyx),vxy(nzyx),vxz(nzyx) real vyy(nzyx),vyz(nzyx),vzz(nzyx) real vv(nzyx) real ov2(nzyxo) real vt(nzyxt,np) real vxxt(nzyxt,np),vxyt(nzyxt,np),vxzt(nzyxt,np) real vyyt(nzyxt,np),vyzt(nzyxt,np),vzzt(nzyxt,np) real tt1(nyo,nxo,np),tt2(nyo,nxo,np) real t(nzyxo,np),s(nzyxo,np) real ysp(np),xsp(np) real azhnp(np),azhxp(np),fxtp(np),fytp(np) integer nxtp(np),nytp(np) integer n1, n2, i2, i3, i6 real xp(n2,np),yp(n2,np),zp(n2,np), a pxp(n2,np),pyp(n2,np),pzp(n2,np), 1 e1xp(n2,np),e1yp(n2,np),e1zp(n2,np), b e2xp(n2,np),e2yp(n2,np),e2zp(n2,np), 2 q111p(n2,np),q112p(n2,np),q121p(n2,np), c q122p(n2,np),p211p(n2,np),p212p(n2,np), 3 p221p(n2,np),p222p(n2,np),q211p(n2,np), d q212p(n2,np),q221p(n2,np),q222p(n2,np), 4 vp(n2,np),dvdxp(n2,np),dvdyp(n2,np),dvdzp(n2,np) integer nrsp(n1,np) real a0p(n1,np),azh0p(n1,np) real p2p(i2*i2,np),q2p(i2*i2,np),hp(i3*i3,np) real gradvp(i3,np),d2tp(i6,np) character*(*) filevxx,filevxy,filevxz,filevyy,filevyz,filevzz integer idisk,lenvxx,lenvxy,lenvxz,lenvyy,lenvyz,lenvzz integer irecl,idvxx,idvxy,idvxz,idvyy,idvyz,idvzzccc temporary variables real xs,ys,temp,tmp,fxt,fyt,eyt,ext,PI real azhx,azhn integer nx0,ny0,ip integer map(n1,np) real vs(n1,np),dvdxs(n1,np),dvdys(n1,np),dvdzs(n1,np) real uxx(n1,np),uxy(n1,np),uxz(n1,np), 1 uyy(n1,np),uyz(n1,np),uzz(n1,np),tzt(n1,np) real xx(n1,np),yy(n1,np),zz(n1,np) real pxs(n1,np),pys(n1,np),pzs(n1,np), 1 e1xs(n1,np),e1ys(n1,np),e1zs(n1,np),e2xs(n1,np), 2 e2ys(n1,np),e2zs(n1,np),p111s(n1,np),p112s(n1,np), 3 p121s(n1,np),p122s(n1,np),q111s(n1,np),q112s(n1,np), 4 q121s(n1,np),q122s(n1,np),p211s(n1,np),p212s(n1,np), 5 p221s(n1,np),p222s(n1,np),q211s(n1,np),q212s(n1,np), 6 q221s(n1,np),q222s(n1,np),dxs(n1,np),dys(n1,np),dzs(n1,np), 7 dpxs(n1,np),dpys(n1,np),dpzs(n1,np),de1x(n1,np),de1y(n1,np), 8 de1z(n1,np),de2x(n1,np),de2y(n1,np),de2z(n1,np), 9 dp111(n1,np),dp112(n1,np),dp121(n1,np),dp122(n1,np) real dq111(n1,np),dq112(n1,np),dq121(n1,np),dq122(n1,np), 1 dp211(n1,np),dp212(n1,np),dp221(n1,np),dp222(n1,np), 2 dq211(n1,np),dq212(n1,np),dq221(n1,np),dq222(n1,np) real xt(n1,np),yt(n1,np),zt(n1,np),pxt(n1,np),pyt(n1,np), 1 pzt(n1,np),e1xt(n1,np),e1yt(n1,np),e1zt(n1,np),e2xt(n1,np), 2 e2yt(n1,np),e2zt(n1,np),p111t(n1,np),p112t(n1,np), 3 p121t(n1,np),p122t(n1,np),q111t(n1,np),q112t(n1,np), 4 q121t(n1,np),q122t(n1,np),p211t(n1,np),p212t(n1,np), 5 p221t(n1,np),p222t(n1,np),q211t(n1,np),q212t(n1,np), 6 q221t(n1,np),q222t(n1,np),dxt(n1,np),dyt(n1,np), 7 dzt(n1,np),dpxt(n1,np),dpyt(n1,np),dpzt(n1,np), 8 de1xt(n1,np),de1yt(n1,np),de1zt(n1,np),de2xt(n1,np), 9 de2yt(n1,np),de2zt(n1,np),dp111t(n1,np),dp112t(n1,np) real dp121t(n1,np),dp122t(n1,np),dq111t(n1,np),dq112t(n1,np), 1 dq121t(n1,np),dq122t(n1,np),dp211t(n1,np),dp212t(n1,np), 2 dp221t(n1,np),dp222t(n1,np),dq211t(n1,np),dq212t(n1,np), 3 dq221t(n1,np),dq222t(n1,np) PI = 3.14159265 if (idisk.eq.1) then irecl = nz*4 idvxx = 10 open(idvxx,file=filevxx(1:lenvxx), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) idvxy = 15 open(idvxy,file=filevxy(1:lenvxy), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) idvxz = 20 open(idvxz,file=filevxz(1:lenvxz), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) idvyy = 25 open(idvyy,file=filevyy(1:lenvyy), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) idvyz = 30 open(idvyz,file=filevyz(1:lenvyz), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) idvzz = 35 open(idvzz,file=filevzz(1:lenvzz), 1 form="unformatted",iostat=ios, 2 status="unknown",access="direct",recl=irecl) end ifc call msgscf("fxo=",fxo)c call msgscf("fyo=",fyo)c call msgscf("fzo=",fzo)c call msgscf("dxo=",dxo)c call msgscf("dyo=",dyo)c call msgscf("dzo=",dzo)c call msgsci("nxo=",nxo)c call msgsci("nyo=",nyo)c call msgsci("nzo=",nzo)c call msgscf("fx=",fx)c call msgscf("fy=",fy)c call msgscf("fz=",fz)c call msgscf("dx=",dx)c call msgscf("dy=",dy)c call msgscf("dz=",dz)c call msgsci("nx=",nx)c call msgsci("ny=",ny)c call msgsci("nz=",nz) do ip=1,np xs = xsp(ip) ys = ysp(ip)c reduce the velocity model according to source and output temp = fxo if(xs.lt.temp) temp = xs if(xs-aperx.gt.temp) temp = xs-aperx nx0 = (temp-fx)/dx fxt = fx+nx0*dx temp = fxo+(nxo-1)*dxo if(xs.gt.temp) temp = xs if(xs+aperx.lt.temp) temp = xs+aperx tmp = 1+((temp-fx)/dx+0.99)-nx0 nxt = tmp ext = fxt+(nxt-1)*dx temp = fyo if(ys.lt.temp) temp = ys if(ys-apery.gt.temp) temp = ys-apery ny0 = (temp-fy)/dy fyt = fy+ny0*dy temp = fyo+(nyo-1)*dyo if(ys.gt.temp) temp = ys if(ys+apery.lt.temp) temp = ys+apery tmp = 1+((temp-fy)/dy+0.99)-ny0 nyt = tmp eyt = fyt+(nyt-1)*dyc determine range of azimuth angle azhn = azhmin azhx = azhmax ccc if(xs.eq.fxt) thenccc if(azhx.gt.PI) azhx = PIccc if(ys.eq.fyt .and. azhx.gt.0.5*PI) azhx = 0.5*PIccc if(ys.eq.eyt .and. azhn.lt.0.5*PI) azhn = 0.5*PIccc else if(xs.eq.ext) thenccc if(azhn.lt.PI) azhn = PIccc if(ys.eq.fyt .and. azhn.lt.1.5*PI) azhn=1.5*PIccc if(ys.eq.eyt .and. azhx.lt.1.5*PI) azhx = 1.5*PIccc else if(ys.eq.eyt) thenccc if(azhn.lt.0.5*PI) azhn = 0.5*PIccc if(azhx.gt.1.5*PI) azhx = 1.5*PIccc end ifc reassign source locations if needed to reduce round-off errors if(abs(ys-fyt).lt.0.1) ysp(ip) = ysp(ip) + 0.1 if(abs(ys-eyt).lt.0.1) ysp(ip) = ysp(ip) - 0.1 if(abs(xs-fxt).lt.0.1) xsp(ip) = xsp(ip) + 0.1 if(abs(xs-ext).lt.0.1) xsp(ip) = xsp(ip) - 0.1cc avoid grid pointccc tmp = (ys - fyt)/dyccc itmp = tmpccc if(abs(tmp-itmp).lt.0.1) ysp(ip) = ysp(ip) - 1 tmp = (xs - fxt)/dx itmp = tmp if(abs(tmp-itmp).lt.0.1) xsp(ip) = xsp(ip) - 1 azhnp(ip) = azhn azhxp(ip) = azhx nxtp(ip) = nxt nytp(ip) = nyt fxtp(ip) = fxt fytp(ip) = fyt call trans(ny,nx,nz,nyt,nxt,ny0,nx0,v,vt(1,ip)) if(idisk.eq.0) then call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vxx,vxxt(1,ip)) call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vxy,vxyt(1,ip)) call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vxz,vxzt(1,ip)) call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vyy,vyyt(1,ip)) call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vyz,vyzt(1,ip)) call trans(ny,nx,nz,nyt,nxt,ny0,nx0,vzz,vzzt(1,ip)) else call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vxxt(1,ip),idvxx) call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vxyt(1,ip),idvxy) call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vxzt(1,ip),idvxz) call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vyyt(1,ip),idvyy) call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vyzt(1,ip),idvyz) call transdk(ny,nx,nz,nyt,nxt,ny0,nx0,vv,vzzt(1,ip),idvzz) end if end do if(idisk.eq.1) then close(idvxx) close(idvxy) close(idvxz) close(idvyy) close(idvyz) close(idvzz) end ifcccc compute travel time by paraxial ray tracing cccc parallel loopccc--convex---$dir force_parallelccc--sgi--ccc$ call mp_set_numthreads(np)ccc--sgi--ccc$doacross ccc$par doall private(ip)ccc$par doall shared(xsp,ysp,azhnp,azhxp,t)ccc$par doall shared(nxtp,nytp,fxtp,fytp,vt,vxxt)ccc$par doall shared(vxyt,vxzt,vyyt,vyzt,vzzt,s)ccc$par doall shared(na,nt,nxo,nyo,nzo,fa,da,amin,amax,dt,fxo,fyo,fzo)ccc$par doall shared(dxo,dyo,dzo,fac,nz,fz,dx,dy,dz)ccc$par doall readonly(na,nt,nxo,nyo,nzo,fa,da,amin,amax,dt,fxo,fyo,fzo)ccc$par doall readonly(dxo,dyo,dzo,fac,nz,fz,dx,dy,dz)c$par doall do ip=1,np call raytime(na,nt,nxo,nyo,nzo,xsp(ip),ysp(ip),fa,da,amin,amax, 1 azhnp(ip),azhxp(ip),dt,fxo,fyo,fzo,dxo,dyo,dzo,fac,t(1,ip), 2 nxtp(ip),nytp(ip),nz,fxtp(ip),fytp(ip),fz,dx,dy,dz,vt(1,ip), 3 vxxt(1,ip),vxyt(1,ip),vxzt(1,ip),vyyt(1,ip),vyzt(1,ip), 4 vzzt(1,ip),s(1,ip),xp(1,ip),yp(1,ip),zp(1,ip),pxp(1,ip), 5 pyp(1,ip),pzp(1,ip),e1xp(1,ip),e1yp(1,ip),e1zp(1,ip), 6 e2xp(1,ip),e2yp(1,ip),e2zp(1,ip),q111p(1,ip),q112p(1,ip), 7 q121p(1,ip),q122p(1,ip),p211p(1,ip),p212p(1,ip),p221p(1,ip), 8 p222p(1,ip),q211p(1,ip),q212p(1,ip),q221p(1,ip),q222p(1,ip), 9 vp(1,ip),dvdxp(1,ip),dvdyp(1,ip),dvdzp(1,ip),nrsp(1,ip), a a0p(1,ip),azh0p(1,ip),n1,n2,p2p(1,ip),q2p(1,ip),hp(1,ip), b gradvp(1,ip),d2tp(1,ip),i2,i3,i6, c map(1,ip),vs(1,ip),dvdxs(1,ip),dvdys(1,ip),dvdzs(1,ip), d uxx(1,ip),uxy(1,ip),uxz(1,ip),uyy(1,ip),uyz(1,ip),uzz(1,ip), e tzt(1,ip),xx(1,ip),yy(1,ip),zz(1,ip),pxs(1,ip),pys(1,ip), f pzs(1,ip),e1xs(1,ip),e1ys(1,ip),e1zs(1,ip),e2xs(1,ip), g e2ys(1,ip),e2zs(1,ip),p111s(1,ip),p112s(1,ip),p121s(1,ip), h p122s(1,ip),q111s(1,ip),q112s(1,ip),q121s(1,ip),q122s(1,ip), i p211s(1,ip),p212s(1,ip),p221s(1,ip),p222s(1,ip),q211s(1,ip), j q212s(1,ip),q221s(1,ip),q222s(1,ip),dxs(1,ip),dys(1,ip), k dzs(1,ip),dpxs(1,ip),dpys(1,ip),dpzs(1,ip),de1x(1,ip), l de1y(1,ip),de1z(1,ip),de2x(1,ip),de2y(1,ip),de2z(1,ip), m dp111(1,ip),dp112(1,ip),dp121(1,ip),dp122(1,ip),dq111(1,ip), n dq112(1,ip),dq121(1,ip),dq122(1,ip),dp211(1,ip),dp212(1,ip), o dp221(1,ip),dp222(1,ip),dq211(1,ip),dq212(1,ip),dq221(1,ip), p dq222(1,ip),xt(1,ip),yt(1,ip),zt(1,ip),pxt(1,ip),pyt(1,ip), q pzt(1,ip),e1xt(1,ip),e1yt(1,ip),e1zt(1,ip),e2xt(1,ip), r e2yt(1,ip),e2zt(1,ip),p111t(1,ip),p112t(1,ip),p121t(1,ip), s p122t(1,ip),q111t(1,ip),q112t(1,ip),q121t(1,ip),q122t(1,ip), t p211t(1,ip),p212t(1,ip),p221t(1,ip),p222t(1,ip),q211t(1,ip), u q212t(1,ip),q221t(1,ip),q222t(1,ip),dxt(1,ip),dyt(1,ip), v dzt(1,ip),dpxt(1,ip),dpyt(1,ip),dpzt(1,ip),de1xt(1,ip), w de1yt(1,ip),de1zt(1,ip),de2xt(1,ip),de2yt(1,ip),de2zt(1,ip), x dp111t(1,ip),dp112t(1,ip),dp121t(1,ip),dp122t(1,ip), y dq111t(1,ip),dq112t(1,ip),dq121t(1,ip),dq122t(1,ip), z dp211t(1,ip),dp212t(1,ip),dp221t(1,ip),dp222t(1,ip), & dq211t(1,ip),dq212t(1,ip),dq221t(1,ip),dq222t(1,ip)) end docccc make up in shadow zone by eikonal equation if (ek.eq.1) then cccc$dir force_parallelcccc$ call mp_set_numthreads(np)cccc$doacross c$par doall do ip=1,np call eiknl(t(1,ip),ov2,tt1(1,1,ip), 1 tt2(1,1,ip),nxo,nyo,nzo, 2 dxo,dyo,dzo,tmax) end do end if return end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -