dzm2d_12.f
上传用户:ls4004p
上传日期:2007-08-05
资源大小:2314k
文件大小:3k
源码类别:

并行计算

开发平台:

Matlab

  1. C**********************************************************************
  2. C     D Z M 2 D
  3. C
  4. C     Joachim Falk , Uni Hamburg , (0049)/(0) - 40 / 4123 5050
  5. C     Institute for Geophysics
  6. C     email falk@dkrz.de
  7. C
  8. C       fs = jumper for free surface (1=on, 2=off)
  9. C       ZA, ZE: first and last grid-row of differentiation
  10. C       SA, SE: first and last grid-column of differentiation
  11. C**********************************************************************
  12.       SUBROUTINE DZM2D(IN, OUT, nx, nz, dz, ZA, ZE, SA, SE, fs)  
  13.       IMPLICIT NONE
  14.       INCLUDE 'param.f'
  15.       REAL IN(MAXCOLS,MAXROWS), OUT(MAXCOLS,MAXROWS), 
  16.      &     dz, G1, G2, G3, G4, G5, G6, F1
  17.       INTEGER nx, nz, r, c, INIT, ZA, ZE, SA, SE, fs
  18.       SAVE F1, G1, G2, G3, G4, G5, G6, INIT
  19.       DATA INIT /0/  
  20.   
  21.       IF (INIT .eq. 0) THEN  
  22.          INIT =   1  
  23.          F1   =   1. / dz           
  24.          G1   =   1.22133636474609  / dz
  25.          G2   =  -0.09693145751953116 / dz
  26.          G3   =   0.01744766235351561 / dz
  27.          G4   =  -2.967289515904012E-3 /dz
  28.          G5   =   3.590053982204854E-4 /dz
  29.          G6   =  -2.184781161221585E-5 /dz
  30.       ENDIF  
  31.       DO c = 1 , SA-1
  32.          DO r = 1 , nz
  33.             OUT(c,r) = 0.
  34.          ENDDO
  35.       ENDDO 
  36.       DO c = SE+1 , nx
  37.          DO r = 1 , nz
  38.             OUT(c,r) = 0.
  39.          ENDDO
  40.       ENDDO
  41.       IF (fs.eq.1) THEN
  42.          DO c = SA , SE
  43.             OUT(c,1) = 2.0 / dz * IN(c,1) ! ZA=1
  44.             OUT(c,2) = F1 * ( IN(c,2) - IN(c,1) )
  45.             OUT(c,3) = F1 * ( IN(c,3) - IN(c,2) )
  46.             OUT(c,4) = F1 * ( IN(c,4) - IN(c,3) )
  47.             OUT(c,5) = F1 * ( IN(c,5) - IN(c,4) )
  48.             OUT(c,6) = F1 * ( IN(c,6) - IN(c,5) )
  49.          ENDDO
  50.       ELSE                                 
  51.          DO c = SA , SE
  52.             OUT(c,1) = 0.
  53.             OUT(c,2) = F1 * ( IN(c,2) - IN(c,1) )
  54.             OUT(c,3) = F1 * ( IN(c,3) - IN(c,2) )
  55.             OUT(c,4) = F1 * ( IN(c,4) - IN(c,3) )
  56.             OUT(c,5) = F1 * ( IN(c,5) - IN(c,4) )
  57.             OUT(c,6) = F1 * ( IN(c,6) - IN(c,5) )
  58.          ENDDO
  59.       ENDIF
  60.      
  61.       DO r = 7 , ZE-5
  62.          DO c = SA , SE
  63.             OUT(c,r) =        
  64.      &          G1 * (IN(c,r  ) - IN(c,r-1)) + 
  65.      &          G2 * (IN(c,r+1) - IN(c,r-2)) +  
  66.      &          G3 * (IN(c,r+2) - IN(c,r-3)) +
  67.      &          G4 * (IN(c,r+3) - IN(c,r-4)) +
  68.      &          G5 * (IN(c,r+4) - IN(c,r-5)) +
  69.      &          G6 * (IN(c,r+5) - IN(c,r-6))
  70.          ENDDO
  71.       ENDDO  
  72.       DO r = ZE-4 , ZE
  73.          DO c = SA , SE
  74.             OUT(c,r) =  F1 * ( IN(c,r) - IN(c,r-1) ) 
  75.          ENDDO
  76.       ENDDO  
  77.          
  78.       DO r = ZE+1 , nz
  79.          DO c = SA , SE
  80.             OUT(c,r) = 0.
  81.          ENDDO
  82.       ENDDO
  83.       RETURN
  84.       END