⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duoceng 2.f90

📁 fortran语言编写的
💻 F90
字号:
program duoceng

integer,parameter::d=24,cyd=126,cyy=188
real vprm(cyd),vsrm(cyd),denrm(cyd),bsbrm(cyd),vprmh(cyd),vprmc(cyd)
real bsbrmh(cyd),bsbrmc(cyd),denrmh(cyd),denrmc(cyd)
real,dimension(cyy)::vp,vs,tt0,h,vsc,vph,vpc,vsh,denh,denc,t

real cf(d,cyy),rad(d,cyy)
real,dimension(cyd)::wav,buff
real,dimension(200,500):: seis,ra
complex res
real:: l,ratio,samp,samptt,sampt,scaler,a1,pi2,w
real::f0,t0,wl,w0,lsyn,sss,c,hs,n,r0,r2,r4,r,vp1,vp2
real:: ccc,s,f,a0,b,m
integer::j,i,lw,lb,a
real ,parameter ::pi=3.1415926,x1=12.5,ox=12.5,crp=2.0
data vp(1:40 )/40*3000/
data vp(41:75)/35*3500/
data vp(76:126)/51*3000/




           bsb1=0.3
	       bsb2=0.3

	      bsb3=0.3
          samp  = 2.0
          samptt=samp/1000
          t(0)=0.
          h(0)=0.
   
   
    do j=1,cyd
	   if(j.ge.1.and.j.le.40)  then
            vs(j)=((0.5-bsb1)/(1-bsb1))*vp(j)
		 else if(j.ge.41.and.j.le.75)     then          !vs(i)
		    vs(j)=((0.5-bsb2)/(1-bsb2))*vp(j)
		 else
             vs(j)=((0.5-bsb3)/(1-bsb3))*vp(j)
		endif
	   h(j)=vp(j)*samptt+h(j-1)           !heigth  all
	   t(j)=samptt+t(j-1)                 !t(i)=h(j)/vp(j) 
	  
    enddo



   do i=1,d
         
     do j=1,cyd
         vpc(0)=0.0
         vsc(0)=0.0

         vpc(j)=samptt*vp(j)**2+vpc(j-1)
	     vprm(j)=sqrt(vpc(j)/t(j))
         vprmh(j)=(vprm(j+1)+vprm(j))/2.0
         vprmc(j)=vprm(j+1)-vprm(j)
      

         vsc(j)=samptt*vs(j)**2+vsc(j-1)
         vsrm(j)=sqrt(vsc(j)/t(j))

         bsbrm(j)=1-vprm(j)/(2.0*(vprm(j)**2-vsrm(j)**2))
         bsbrmh(j)=(bsbrm(j+1)+bsbrm(j))/2.0
         bsbrmc(j)=bsbrm(j+1)-bsbrm(j)
       

         denrm(j)=crp*(vprm(j)**2)**(1.0/4.0)
		 denrmh(j)=(denrm(j+1)+denrm(j))/2.0
         denrmc(j)=denrm(j+1)-denrm(j)

      if(j.eq.cyd) then
	       vprmh(j)=vprmh(j-1)
	       vprmc(j)=vprmc(j-1)
           bsbrmh(j)=bsbrmh(j-1) 
		   bsbrmc(j)=bsbrmc(j-1) 
           denrmh(j)=denrmh(j-1)
           denrmc(j)=denrmc(j-1)
	  endif
    !write(10,*) j*2,vprm(j),vsrm(j),denrm(j)
    enddo
enddo




                f0 = 35.0
	            t0 = 0.0
	            samp  = 2.0
	            wl = 126
				w0 = 0.0
	            samptt= samp/1000.0    
		        lw=wl/samp +0.5
			    c=1.0
			    sss=5.5                 	         
			 if( mod(lw*1.,2.).eq.0 ) then
                  lw = lw+1 
		   		  t0 = t0+samp*2.0   
             endif

			 print*,'lw====',lw

             call wavelet(f0,t0,w0,c,sss,samptt,wav,lw)	
	                lsyn = lb1+lw-1


         scaler=100.0
      do i=1,d
	            l=x1+ox*(i-1)
		  do j=1,cyd    
	            ra(i,j)=atan(l/(2.0*h(j)))
			    rad(i,j)=ra(i,j)*180/pi
			    hs=sin(rad(i,j))/vprm(j)
	         if (j.lt.40) then	         
                b=0.0
			 else			  
                b=(vprmc(j)/vprmh(j))/(vprmc(j)/vprmh(j)+denrmc(j)/denrmh(j))
		     endif
                a0=b-2.0*(1.0+b)*(1.0-2.0*bsbrmh(j))/(1.0-bsbrmh(j))
                m=a0*r0+bsbrmc(j)/((1.0-bsbrmh(j))**2)
                n=vprmc(j)/(vprmh(j)*2.0)
                r0=(vprmc(j)/vprmh(j)+denrmc(j)/denrmh(j))/2.0
                   
             call Rtcoef(vprmh(j),vprm(j),vprm(j+1),vprmc(j),hs,r0,m,n,res)
			     if(vprm(j+1).gt.vprm(j))  then
		            cf(i,j)=sqrt(real(res)**2+imag(res)**2)
				   else
				     cf(i,j)=-sqrt(real(res)**2+imag(res)**2)
				   endif
                   if(j.eq.cyd)          cf(i,j)=cf(i,j-1)
				   if(j.eq.1)            cf(i,j)=cf(i,j+1)
				   if(j.lt.1.or.j.gt.cyd)   cf(i,j)=0
               if(i.eq.1.) print*,'i===',i,j, ra(i,j),cf(i,j)
                
          enddo
              
             ! call fold(lb1,cf,lw,wav,lsyn,buff,scaler)
		         do j=1,lsyn
		             if(i.eq.5) print*,'i===',i,j,buff(j),cf(i,j)
		                 seis(i,j)=buff(j)
			!			 print*,seis(i,j)
	             enddo 
         
	  enddo	     
             

          open(unit=300,file='ra.dat',status='old')

          open(unit=100,file='reflection.dat',status='old')
!......................................................
        
           do j=1,cyy
                write(100,301)  j*2.0,(cf(i,j)+(i-1)*10,i=1,18)
                write(300,301)  j*2.0,(ra(i,j),i=1,18)
		   enddo
301            format(1x,f6.1,18f10.3)

        open(unit=300,file='seismrecord.dat',status='old')
         
		   do j=1,lsyn
                write(300,401) j*samp,(seis(i,j)+(i-1)*25.0,i=1,d)
		   enddo
401        format(1x,f6.1,18f10.3)
      









	end

!..........................................................

	subroutine  Rtcoef(vp,vp1,vp2,vp0,hs,r0,m,n,res) 
      implicit complex (a-h,o-z)
      complex res,r00,mm,nn
      real     vp,vp1,vp2,vp0,hs,r0,m,n 
           
           alpha3=cmplx(vp,0.) 
           alpha0=cmplx(vp0,0.)
           alpha1=cmplx(vp1,0.)
		   alpha2=cmplx(vp2,0.)      
           p=cmplx(hs,0.)
           r00=cmplx(r0,0.)
		   mm=cmplx(m,0.)
		   nn=cmplx(n,0.)

		   s11=alpha1*p
           s12=alpha2*p          
          
          c11=csqrt(1.0-s11**2)  !rushejiao  yuxuan
          c12=csqrt(1.0-s12**2)  !zheshejiao yuxuan
         
		  c13=csqrt((1.0-c11)/2.0) !入射角一半的yu玄
		  c14=csqrt((1.0+c12)/2.0) !折射角一半的yu玄
          c23=csqrt((1.0+c11)/2.0)
		  c24=csqrt((1.0-c12)/2.0)
		  ttas=c13*c14+c23*c24
         res=r0+mm*ttas**2+nn*(ttas/(csqrt(1-ttas**2))**2-ttas**2)
		return
        end


	 Subroutine wavelet(f,t0,w0,c,s,sampt,b,lb)
	 dimension  b(lb)
	  w   = w0/180.*3.1415927
      pi2 = 2.*3.1415927*f
	  a   = -f*f*alog(s)
      t   = -t0
      print*,'lb===',lb
      do  10  i = 1, lb
             b(i)= c * exp( a*t*t ) * cos( pi2*t+w )
             ccc=b(i)
10       t= t + sampt
       return
       end


	  Subroutine   fold(la,a,lb,b,lc,c,scaler)    
      dimension    a(la),b(lb),c(lc)                                
      call   zero(lc,c)
	  do   10   i=1,la
	  do   10   j=1,lb
	  k    = i+j-1
10	  c(k) = a(i)*b(j)+c(k)
      do   20   i=1,la+lb-1
20    c(i) = scaler*c(i)                                                                                              
      return                                                          
      end

	Subroutine   zero( l0, o )                                      
      dimension    o(l0)                                              
      do   10   i = 1, l0                                             
10    o(i)  = 0.                                                      
      return                                                          
      end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -