/[lmdze]/trunk/phylmd/Orography/grid_noro.f
ViewVC logotype

Diff of /trunk/phylmd/Orography/grid_noro.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/Orography/grid_noro_m.f90 revision 39 by guez, Tue Jan 25 15:11:05 2011 UTC trunk/phylmd/Orography/grid_noro_m.f revision 265 by guez, Tue Mar 20 09:35:59 2018 UTC
# Line 1  Line 1 
1  module grid_noro_m  module grid_noro_m
2    
   ! Clean: no C preprocessor directive, no include line  
   
3    implicit none    implicit none
4    
   private mva9  
   
5  contains  contains
6    
7    SUBROUTINE grid_noro(xdata, ydata, zdata, x, y, zphi, zmea, zstd, zsig, &    SUBROUTINE grid_noro(xdata, ydata, zdata, x, y, zphi, zmea, zstd, zsig, &
# Line 13  contains Line 9  contains
9    
10      ! From dyn3d/grid_noro.F, version 1.1.1.1 2004/05/19 12:53:06      ! From dyn3d/grid_noro.F, version 1.1.1.1 2004/05/19 12:53:06
11    
12      ! Authors: F. Lott, Z. X. Li, A. Harzallah and L. Fairhead      ! Authors: Fran\c{}cois Lott, Laurent Li, A. Harzallah and Laurent
13        ! Fairhead
14    
15        ! Compute the parameters of the sub-grid scale orography scheme as
16        ! described in Lott and Miller (1997) and Lott (1999).
17    
     ! Compute the parameters of the SSO scheme as described in  
     ! Lott and Miller (1997) and Lott (1999).  
18      ! Target points are on a rectangular grid:      ! Target points are on a rectangular grid:
19      ! jjm+1 latitudes including North and South Poles;      ! jjm + 1 latitudes including North and South Poles;
20      ! iim+1 longitudes, with periodicity: longitude(iim+1)=longitude(1)      ! iim + 1 longitudes, with periodicity: longitude(iim + 1) = longitude(1)
21      ! At the poles the field value is repeated iim+1 times.      ! At the poles the field value is repeated iim + 1 times.
22    
23      ! The parameters a, b, c, d represent the limite of the target      ! The parameters a, b, c, d represent the limite of the target
24      ! gridpoint region. The means over this region are calculated      ! gridpoint region. The means over this region are calculated from
25      ! from USN data, ponderated by a weight proportional to the      ! US Navy data, ponderated by a weight proportional to the surface
26      ! surface occupied by the data inside the model gridpoint area.      ! occupied by the data inside the model gridpoint area. In most
27      ! In most circumstances, this weight is the ratio between the      ! circumstances, this weight is the ratio between the surface of
28      ! surface of the USN gridpoint area and the surface of the      ! the US Navy gridpoint area and the surface of the model gridpoint
29      ! model gridpoint area.      ! area. See "grid_noto.txt".
   
     !           (c)  
     !        ----d-----  
     !        | . . . .|  
     !        |        |  
     !     (b)a . * . .b(a)  
     !        |        |  
     !        | . . . .|  
     !        ----c-----  
     !           (d)  
30    
31      use dimens_m, only: iim, jjm      use dimensions, only: iim, jjm
32        use mva9_m, only: mva9
33      use nr_util, only: assert, pi      use nr_util, only: assert, pi
34    
35      REAL, intent(in):: xdata(:), ydata(:) ! coordinates of input field      ! Coordinates of input field:
36      REAL, intent(in):: zdata(:, :) ! input field      REAL, intent(in):: xdata(:) ! (iusn)
37      REAL, intent(in):: x(:), y(:) ! ccordinates output field      REAL, intent(in):: ydata(:) ! (jusn)
   
     ! Correlations of USN orography gradients:  
   
     REAL zphi(:, :)  
     real, intent(out):: zmea(:, :) ! Mean orography  
     real, intent(out):: zstd(:, :) ! Standard deviation  
     REAL zsig(:, :) ! Slope  
     real zgam(:, :) ! Anisotropy  
     real zthe(:, :) ! Orientation of the small axis  
     REAL, intent(out):: zpic(:, :) ! Maximum altitude  
     real, intent(out):: zval(:, :) ! Minimum altitude  
   
     real, intent(out):: mask(:, :) ! fraction of land  
38    
39      ! Variables local to the procedure:      REAL, intent(in):: zdata(:, :) ! (iusn, jusn) input field, in m
40        REAL, intent(in):: x(:), y(:) ! coordinates of output field
     ! In this version it is assumed that the input data come from  
     ! the US Navy dataset:  
     integer, parameter:: iusn=2160, jusn=1080  
41    
42      integer, parameter:: iext=216      ! Correlations of US Navy orography gradients:
     REAL xusn(iusn+2*iext), yusn(jusn+2)  
     REAL zusn(iusn+2*iext, jusn+2)  
43    
44      ! Intermediate fields  (correlations of orography gradient)      REAL, intent(out):: zphi(:, :) ! (iim + 1, jjm + 1)
45        ! geoptential height of orography, not smoothed, in m
46        
47        real, intent(out):: zmea(:, :) ! (iim + 1, jjm + 1) smoothed orography
48        real, intent(out):: zstd(:, :) ! (iim + 1, jjm + 1) Standard deviation
49        REAL, intent(out):: zsig(:, :) ! (iim + 1, jjm + 1) Slope
50        real, intent(out):: zgam(:, :) ! (iim + 1, jjm + 1) Anisotropy
51    
52      REAL ztz(iim+1, jjm+1), zxtzx(iim+1, jjm+1)      real, intent(out):: zthe(:, :) ! (iim + 1, jjm + 1)
53      REAL zytzy(iim+1, jjm+1), zxtzy(iim+1, jjm+1)      ! Orientation of the small axis
     REAL weight(iim+1, jjm+1)  
54    
55      ! Correlations of USN orography gradients:      REAL, intent(out):: zpic(:, :) ! (iim + 1, jjm + 1) Maximum altitude
56        real, intent(out):: zval(:, :) ! (iim + 1, jjm + 1) Minimum altitude
57    
58      REAL zxtzxusn(iusn+2*iext, jusn+2), zytzyusn(iusn+2*iext, jusn+2)      real, intent(out):: mask(:, :) ! (iim + 1, jjm + 1) fraction of land
     REAL zxtzyusn(iusn+2*iext, jusn+2)  
59    
60      real mask_tmp(size(x), size(y))      ! Local:
     real num_tot(2200, 1100), num_lan(2200, 1100)  
61    
62      REAL a(2200), b(2200), c(1100), d(1100)      ! In this version it is assumed that the input data come from
63      real rad, weighx, weighy, xincr, xk, xp, xm, xw, xq, xl      ! the US Navy dataset:
64        integer, parameter:: iusn = 2160, jusn = 1080
65        integer, parameter:: iext = 216
66        REAL xusn(iusn + 2 * iext), yusn(jusn + 2)
67        REAL zusn(iusn + 2 * iext, jusn + 2) ! in m
68    
69        ! Intermediate fields (correlations of orography gradient)
70        REAL, dimension(iim + 1, jjm + 1):: ztz, zxtzx, zytzy, zxtzy, weight
71    
72        ! Correlations of US Navy orography gradients:
73        REAL, dimension(iusn + 2 * iext, jusn + 2):: zxtzxusn, zytzyusn, zxtzyusn
74    
75        real, dimension(iim + 1, jjm + 1):: mask_tmp, num_tot, num_lan
76        REAL a(iim + 1), b(iim + 1), c(jjm + 1), d(jjm + 1)
77        real weighx, weighy, xincr, xk, xp, xm, xw, xq, xl
78      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud
79      real zllmpic, zllmmea, zllmgam, zllmthe, zllmstd, zllmsig, zllmval      real zweinor, zweisud, zmeanor, zbordest
     real zpicnor, zminthe, zsigsud, zstdnor, zstdsud, zvalsud, zvalnor  
     real zweinor, zweisud, zsignor, zpicsud, zmeanor, zbordest  
80      integer ii, i, jj, j      integer ii, i, jj, j
81        real, parameter:: rad = 6371229.
82    
83      !-------------------------------      !-------------------------------
84    
# Line 107  contains Line 95  contains
95           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &
96           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")
97    
98      IF (iim > 2200 .OR. jjm > 1099) THEN      print *, "Parameters of subgrid-scale orography"
        print *, "iim = ", iim, ", jjm = ", jjm  
        stop '"iim" or "jjm" is too big'  
     ENDIF  
   
     print *, "Paramètres de l'orographie à l'échelle sous-maille"  
     rad = 6371229.  
99      zdeltay = 2. * pi / real(jusn) * rad      zdeltay = 2. * pi / real(jusn) * rad
100    
101      ! Extension of the USN database to POCEED computations at boundaries:      ! Extension of the US Navy database for computations at boundaries:
102    
103      DO j=1, jusn      DO j = 1, jusn
104         yusn(j+1)=ydata(j)         yusn(j + 1) = ydata(j)
105         DO i=1, iusn         DO i = 1, iusn
106            zusn(i+iext, j+1)=zdata(i, j)            zusn(i + iext, j + 1) = zdata(i, j)
107            xusn(i+iext)=xdata(i)            xusn(i + iext) = xdata(i)
108         ENDDO         ENDDO
109         DO i=1, iext         DO i = 1, iext
110            zusn(i, j+1)=zdata(iusn-iext+i, j)            zusn(i, j + 1) = zdata(iusn - iext + i, j)
111            xusn(i)=xdata(iusn-iext+i)-2.*pi            xusn(i) = xdata(iusn - iext + i) - 2. * pi
112            zusn(iusn+iext+i, j+1)=zdata(i, j)            zusn(iusn + iext + i, j + 1) = zdata(i, j)
113            xusn(iusn+iext+i)=xdata(i)+2.*pi            xusn(iusn + iext + i) = xdata(i) + 2. * pi
114         ENDDO         ENDDO
115      ENDDO      ENDDO
116    
117      yusn(1)=ydata(1)+(ydata(1)-ydata(2))      yusn(1) = ydata(1) + (ydata(1) - ydata(2))
118      yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))      yusn(jusn + 2) = ydata(jusn) + (ydata(jusn) - ydata(jusn - 1))
119      DO i=1, iusn/2+iext      DO i = 1, iusn / 2 + iext
120         zusn(i, 1)=zusn(i+iusn/2, 2)         zusn(i, 1) = zusn(i + iusn / 2, 2)
121         zusn(i+iusn/2+iext, 1)=zusn(i, 2)         zusn(i + iusn / 2 + iext, 1) = zusn(i, 2)
122         zusn(i, jusn+2)=zusn(i+iusn/2, jusn+1)         zusn(i, jusn + 2) = zusn(i + iusn / 2, jusn + 1)
123         zusn(i+iusn/2+iext, jusn+2)=zusn(i, jusn+1)         zusn(i + iusn / 2 + iext, jusn + 2) = zusn(i, jusn + 1)
124      ENDDO      ENDDO
125    
126      ! COMPUTE LIMITS OF MODEL GRIDPOINT AREA      ! Compute limits of model gridpoint area (regular grid)
     !     ( REGULAR GRID)  
127    
128      a(1) = x(1) - (x(2)-x(1))/2.0      a(1) = x(1) - (x(2) - x(1)) / 2.0
129      b(1) = (x(1)+x(2))/2.0      b(1) = (x(1) + x(2)) / 2.0
130      DO i = 2, iim      DO i = 2, iim
131         a(i) = b(i-1)         a(i) = b(i - 1)
132         b(i) = (x(i)+x(i+1))/2.0         b(i) = (x(i) + x(i + 1)) / 2.0
133      ENDDO      ENDDO
134      a(iim+1) = b(iim)      a(iim + 1) = b(iim)
135      b(iim+1) = x(iim+1) + (x(iim+1)-x(iim))/2.0      b(iim + 1) = x(iim + 1) + (x(iim + 1) - x(iim)) / 2.0
136    
137      c(1) = y(1) - (y(2)-y(1))/2.0      c(1) = y(1) - (y(2) - y(1)) / 2.0
138      d(1) = (y(1)+y(2))/2.0      d(1) = (y(1) + y(2)) / 2.0
139      DO j = 2, jjm      DO j = 2, jjm
140         c(j) = d(j-1)         c(j) = d(j - 1)
141         d(j) = (y(j)+y(j+1))/2.0         d(j) = (y(j) + y(j + 1)) / 2.0
142      ENDDO      ENDDO
143      c(jjm + 1) = d(jjm)      c(jjm + 1) = d(jjm)
144      d(jjm + 1) = y(jjm + 1) + (y(jjm + 1)-y(jjm))/2.0      d(jjm + 1) = y(jjm + 1) + (y(jjm + 1) - y(jjm)) / 2.0
145    
146      ! Initialisations :      ! Initialisations :
147      weight(:, :) = 0.      weight = 0.
148      zxtzx(:, :)  = 0.      zxtzx = 0.
149      zytzy(:, :)  = 0.      zytzy = 0.
150      zxtzy(:, :)  = 0.      zxtzy = 0.
151      ztz(:, :)    = 0.      ztz = 0.
152      zmea(:, :)   = 0.      zmea = 0.
153      zpic(:, :)  =-1.E+10      zpic = - 1E10
154      zval(:, :)  = 1.E+10      zval = 1E10
155    
156      !  COMPUTE SLOPES CORRELATIONS ON USN GRID      ! Compute slopes correlations on US Navy grid
157    
158      zytzyusn(:, :)=0.      zytzyusn = 0.
159      zxtzxusn(:, :)=0.      zxtzxusn = 0.
160      zxtzyusn(:, :)=0.      zxtzyusn = 0.
161    
162      DO j = 2, jusn+1      DO j = 2, jusn + 1
163         zdeltax=zdeltay*cos(yusn(j))         zdeltax = zdeltay * cos(yusn(j))
164         DO i = 2, iusn+2*iext-1         DO i = 2, iusn + 2 * iext - 1
165            zytzyusn(i, j)=(zusn(i, j+1)-zusn(i, j-1))**2/zdeltay**2            zytzyusn(i, j) = (zusn(i, j + 1) - zusn(i, j - 1))**2 / zdeltay**2
166            zxtzxusn(i, j)=(zusn(i+1, j)-zusn(i-1, j))**2/zdeltax**2            zxtzxusn(i, j) = (zusn(i + 1, j) - zusn(i - 1, j))**2 / zdeltax**2
167            zxtzyusn(i, j)=(zusn(i, j+1)-zusn(i, j-1))/zdeltay &            zxtzyusn(i, j) = (zusn(i, j + 1) - zusn(i, j - 1)) / zdeltay &
168                 *(zusn(i+1, j)-zusn(i-1, j))/zdeltax                 * (zusn(i + 1, j) - zusn(i - 1, j)) / zdeltax
169         ENDDO         ENDDO
170      ENDDO      ENDDO
171    
172      !  SUMMATION OVER GRIDPOINT AREA      ! Summation over gridpoint area
173    
174      zleny=pi/real(jusn)*rad      zleny = pi / real(jusn) * rad
175      xincr=pi/2./real(jusn)      xincr = pi / 2. / real(jusn)
176      DO ii = 1, iim+1      DO ii = 1, iim + 1
177         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
178            num_tot(ii, jj)=0.            num_tot(ii, jj) = 0.
179            num_lan(ii, jj)=0.            num_lan(ii, jj) = 0.
180            DO j = 2, jusn+1            DO j = 2, jusn + 1
181               zlenx=zleny*cos(yusn(j))               zlenx = zleny * cos(yusn(j))
182               zdeltax=zdeltay*cos(yusn(j))               zdeltax = zdeltay * cos(yusn(j))
183               zbordnor=(c(jj)-yusn(j)+xincr)*rad               zbordnor = (c(jj) - yusn(j) + xincr) * rad
184               zbordsud=(yusn(j)-d(jj)+xincr)*rad               zbordsud = (yusn(j) - d(jj) + xincr) * rad
185               weighy=AMAX1(0., amin1(zbordnor, zbordsud, zleny))               weighy = MAX(0., min(zbordnor, zbordsud, zleny))
186               IF (weighy /= 0) THEN               IF (weighy /= 0) THEN
187                  DO i = 2, iusn+2*iext-1                  DO i = 2, iusn + 2 * iext - 1
188                     zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))                     zbordest = (xusn(i) - a(ii) + xincr) * rad * cos(yusn(j))
189                     zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))                     zbordoue = (b(ii) + xincr - xusn(i)) * rad * cos(yusn(j))
190                     weighx=AMAX1(0., amin1(zbordest, zbordoue, zlenx))                     weighx = MAX(0., min(zbordest, zbordoue, zlenx))
191                     IF (weighx /= 0) THEN                     IF (weighx /= 0) THEN
192                        num_tot(ii, jj) = num_tot(ii, jj) + 1.                        num_tot(ii, jj) = num_tot(ii, jj) + 1.
193                        if (zusn(i, j) >= 1.) then                        if (zusn(i, j) >= 1.) then
194                           num_lan(ii, jj) = num_lan(ii, jj) + 1.                           num_lan(ii, jj) = num_lan(ii, jj) + 1.
195                        end if                        end if
196                        weight(ii, jj) = weight(ii, jj) + weighx * weighy                        weight(ii, jj) = weight(ii, jj) + weighx * weighy
197                        zxtzx(ii, jj)=zxtzx(ii, jj)+zxtzxusn(i, j)*weighx*weighy                        zxtzx(ii, jj) = zxtzx(ii, jj) &
198                        zytzy(ii, jj)=zytzy(ii, jj)+zytzyusn(i, j)*weighx*weighy                             + zxtzxusn(i, j) * weighx * weighy
199                        zxtzy(ii, jj)=zxtzy(ii, jj)+zxtzyusn(i, j)*weighx*weighy                        zytzy(ii, jj) = zytzy(ii, jj) &
200                               + zytzyusn(i, j) * weighx * weighy
201                          zxtzy(ii, jj) = zxtzy(ii, jj) &
202                               + zxtzyusn(i, j) * weighx * weighy
203                        ztz(ii, jj) = ztz(ii, jj) &                        ztz(ii, jj) = ztz(ii, jj) &
204                             + zusn(i, j) * zusn(i, j) * weighx * weighy                             + zusn(i, j) * zusn(i, j) * weighx * weighy
205                        ! mean                        ! mean
206                        zmea(ii, jj) =zmea(ii, jj)+zusn(i, j)*weighx*weighy                        zmea(ii, jj) = zmea(ii, jj) + zusn(i, j) * weighx * weighy
207                        ! peacks                        ! peacks
208                        zpic(ii, jj)=amax1(zpic(ii, jj), zusn(i, j))                        zpic(ii, jj) = max(zpic(ii, jj), zusn(i, j))
209                        ! valleys                        ! valleys
210                        zval(ii, jj)=amin1(zval(ii, jj), zusn(i, j))                        zval(ii, jj) = min(zval(ii, jj), zusn(i, j))
211                     ENDIF                     ENDIF
212                  ENDDO                  ENDDO
213               ENDIF               ENDIF
# Line 231  contains Line 215  contains
215         ENDDO         ENDDO
216      ENDDO      ENDDO
217    
218      if (any(weight == 0.)) stop "zero weight in grid_noro"      if (any(weight == 0.)) then
219           print *, "zero weight in grid_noro"
220           stop 1
221        end if
222    
223      !  COMPUTE PARAMETERS NEEDED BY THE LOTT & MILLER (1997) AND      ! Compute parameters needed by the Lott & Miller (1997) and Lott
224      !  LOTT (1999) SSO SCHEME.      ! (1999) subgrid-scale orographic scheme.
225    
226      zllmmea=0.      DO ii = 1, iim + 1
     zllmstd=0.  
     zllmsig=0.  
     zllmgam=0.  
     zllmpic=0.  
     zllmval=0.  
     zllmthe=0.  
     zminthe=0.  
     DO ii = 1, iim+1  
227         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
228            mask(ii, jj) = num_lan(ii, jj)/num_tot(ii, jj)            mask(ii, jj) = num_lan(ii, jj) / num_tot(ii, jj)
229            !  Mean Orography:            ! Mean orography:
230            zmea (ii, jj)=zmea (ii, jj)/weight(ii, jj)            zmea (ii, jj) = zmea (ii, jj) / weight(ii, jj)
231            zxtzx(ii, jj)=zxtzx(ii, jj)/weight(ii, jj)            zxtzx(ii, jj) = zxtzx(ii, jj) / weight(ii, jj)
232            zytzy(ii, jj)=zytzy(ii, jj)/weight(ii, jj)            zytzy(ii, jj) = zytzy(ii, jj) / weight(ii, jj)
233            zxtzy(ii, jj)=zxtzy(ii, jj)/weight(ii, jj)            zxtzy(ii, jj) = zxtzy(ii, jj) / weight(ii, jj)
234            ztz(ii, jj)  =ztz(ii, jj)/weight(ii, jj)            ztz(ii, jj) = ztz(ii, jj) / weight(ii, jj)
235            !  Standard deviation:            ! Standard deviation:
236            zstd(ii, jj)=sqrt(AMAX1(0., ztz(ii, jj)-zmea(ii, jj)**2))            zstd(ii, jj) = sqrt(MAX(0., ztz(ii, jj) - zmea(ii, jj)**2))
237         ENDDO         ENDDO
238      ENDDO      ENDDO
239    
240      ! CORRECT VALUES OF HORIZONTAL SLOPE NEAR THE POLES:      ! Correct values of horizontal slope near the poles:
241        DO ii = 1, iim + 1
242      DO ii = 1, iim+1         zxtzx(ii, 1) = zxtzx(ii, 2)
243         zxtzx(ii, 1)=zxtzx(ii, 2)         zxtzx(ii, jjm + 1) = zxtzx(ii, jjm)
244         zxtzx(ii, jjm + 1)=zxtzx(ii, jjm)         zxtzy(ii, 1) = zxtzy(ii, 2)
245         zxtzy(ii, 1)=zxtzy(ii, 2)         zxtzy(ii, jjm + 1) = zxtzy(ii, jjm)
246         zxtzy(ii, jjm + 1)=zxtzy(ii, jjm)         zytzy(ii, 1) = zytzy(ii, 2)
247         zytzy(ii, 1)=zytzy(ii, 2)         zytzy(ii, jjm + 1) = zytzy(ii, jjm)
248         zytzy(ii, jjm + 1)=zytzy(ii, jjm)      ENDDO
249      ENDDO  
250        ! Masque prenant en compte maximum de terre. On met un seuil \`a 10
251      !  FILTERS TO SMOOTH OUT FIELDS FOR INPUT INTO SSO SCHEME.      ! % de terre car en dessous les param\`etres de surface n'ont pas de
252        ! sens.
253      !  FIRST FILTER, MOVING AVERAGE OVER 9 POINTS.      mask_tmp = merge(1., 0., mask >= 0.1)
254    
255      CALL MVA9(zmea, iim+1, jjm+1)      zphi(:iim, :) = zmea(:iim, :) * mask_tmp(:iim, :)
256      CALL MVA9(zstd, iim+1, jjm+1)      ! (zmea is not yet smoothed)
257      CALL MVA9(zpic, iim+1, jjm+1)  
258      CALL MVA9(zval, iim+1, jjm+1)      ! Filters to smooth out fields for input into subgrid-scale
259      CALL MVA9(zxtzx, iim+1, jjm+1)      ! orographic scheme.
260      CALL MVA9(zxtzy, iim+1, jjm+1)  
261      CALL MVA9(zytzy, iim+1, jjm+1)      ! First filter, moving average over 9 points.
262        CALL MVA9(zmea)
263      ! Masque prenant en compte maximum de terre      CALL MVA9(zstd)
264      ! On seuil a 10% de terre de terre car en dessous les parametres      CALL MVA9(zpic)
265      ! de surface n'ont pas de sens (PB)      CALL MVA9(zval)
266      mask_tmp= 0.      CALL MVA9(zxtzx)
267      WHERE (mask >= 0.1) mask_tmp = 1.      CALL MVA9(zxtzy)
268        CALL MVA9(zytzy)
269    
270      DO ii = 1, iim      DO ii = 1, iim
271         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
272            IF (weight(ii, jj) /= 0.) THEN            ! Coefficients K, L et M:
273               !  Coefficients K, L et M:            xk = (zxtzx(ii, jj) + zytzy(ii, jj)) / 2.
274               xk=(zxtzx(ii, jj)+zytzy(ii, jj))/2.            xl = (zxtzx(ii, jj) - zytzy(ii, jj)) / 2.
275               xl=(zxtzx(ii, jj)-zytzy(ii, jj))/2.            xm = zxtzy(ii, jj)
276               xm=zxtzy(ii, jj)            xp = xk - sqrt(xl**2 + xm**2)
277               xp=xk-sqrt(xl**2+xm**2)            xq = xk + sqrt(xl**2 + xm**2)
278               xq=xk+sqrt(xl**2+xm**2)            xw = 1e-8
279               xw=1.e-8            if (xp <= xw) xp = 0.
280               if(xp.le.xw) xp=0.            if (xq <= xw) xq = xw
281               if(xq.le.xw) xq=xw            if (abs(xm) <= xw) xm = xw * sign(1., xm)
282               if(abs(xm).le.xw) xm=xw*sign(1., xm)            ! modification pour masque de terre fractionnaire
283               !$$* PB modif pour maque de terre fractionnaire            ! slope:
284               ! slope:            zsig(ii, jj) = sqrt(xq) * mask_tmp(ii, jj)
285               zsig(ii, jj)=sqrt(xq)*mask_tmp(ii, jj)            ! isotropy:
286               ! isotropy:            zgam(ii, jj) = xp / xq * mask_tmp(ii, jj)
287               zgam(ii, jj)=xp/xq*mask_tmp(ii, jj)            ! angle theta:
288               ! angle theta:            zthe(ii, jj) = 57.29577951 * atan2(xm, xl) / 2. * mask_tmp(ii, jj)
289               zthe(ii, jj)=57.29577951*atan2(xm, xl)/2.*mask_tmp(ii, jj)         ENDDO
290               zphi(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)      ENDDO
291               zmea(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)  
292               zpic(ii, jj)=zpic(ii, jj)*mask_tmp(ii, jj)      zmea(:iim, :) = zmea(:iim, :) * mask_tmp(:iim, :)
293               zval(ii, jj)=zval(ii, jj)*mask_tmp(ii, jj)      zpic(:iim, :) = zpic(:iim, :) * mask_tmp(:iim, :)
294               zstd(ii, jj)=zstd(ii, jj)*mask_tmp(ii, jj)      zval(:iim, :) = zval(:iim, :) * mask_tmp(:iim, :)
295            ENDIF      zstd(:iim, :) = zstd(:iim, :) * mask_tmp(:iim, :)
296            zllmmea=AMAX1(zmea(ii, jj), zllmmea)  
297            zllmstd=AMAX1(zstd(ii, jj), zllmstd)      print *, 'MEAN ORO: ', MAXVAL(zmea(:iim, :))
298            zllmsig=AMAX1(zsig(ii, jj), zllmsig)      print *, 'ST. DEV.: ', MAXVAL(zstd(:iim, :))
299            zllmgam=AMAX1(zgam(ii, jj), zllmgam)      print *, 'PENTE: ', MAXVAL(zsig(:iim, :))
300            zllmthe=AMAX1(zthe(ii, jj), zllmthe)      print *, 'ANISOTROP: ', MAXVAL(zgam(:iim, :))
301            zminthe=amin1(zthe(ii, jj), zminthe)      print *, 'ANGLE: ', minval(zthe(:iim, :)), MAXVAL(zthe(:iim, :))
302            zllmpic=AMAX1(zpic(ii, jj), zllmpic)      print *, 'pic: ', MAXVAL(zpic(:iim, :))
303            zllmval=AMAX1(zval(ii, jj), zllmval)      print *, 'val: ', MAXVAL(zval(:iim, :))
304         ENDDO  
305      ENDDO      ! gamma and theta at 1. and 0. at poles
306      print *, 'MEAN ORO: ', zllmmea      zmea(iim + 1, :) = zmea(1, :)
307      print *, 'ST. DEV.: ', zllmstd      zphi(iim + 1, :) = zphi(1, :)
308      print *, 'PENTE: ', zllmsig      zpic(iim + 1, :) = zpic(1, :)
309      print *, 'ANISOTROP: ', zllmgam      zval(iim + 1, :) = zval(1, :)
310      print *, 'ANGLE: ', zminthe, zllmthe      zstd(iim + 1, :) = zstd(1, :)
311      print *, 'pic: ', zllmpic      zsig(iim + 1, :) = zsig(1, :)
312      print *, 'val: ', zllmval      zgam(iim + 1, :) = zgam(1, :)
313        zthe(iim + 1, :) = zthe(1, :)
314      ! gamma and theta a 1. and 0. at poles  
315      zmea(iim+1, :)=zmea(1, :)      zweinor = sum(weight(:iim, 1))
316      zphi(iim+1, :)=zphi(1, :)      zweisud = sum(weight(:iim, jjm + 1))
317      zpic(iim+1, :)=zpic(1, :)      zmeanor = sum(zmea(:iim, 1) * weight(:iim, 1))
318      zval(iim+1, :)=zval(1, :)      zmeasud = sum(zmea(:iim, jjm + 1) * weight(:iim, jjm + 1))
319      zstd(iim+1, :)=zstd(1, :)  
320      zsig(iim+1, :)=zsig(1, :)      zmea(:, 1) = zmeanor / zweinor
321      zgam(iim+1, :)=zgam(1, :)      zmea(:, jjm + 1) = zmeasud / zweisud
322      zthe(iim+1, :)=zthe(1, :)  
323        zphi(:, 1) = zmeanor / zweinor
324      zmeanor=0.      zphi(:, jjm + 1) = zmeasud / zweisud
325      zmeasud=0.  
326      zstdnor=0.      zpic(:, 1) = sum(zpic(:iim, 1) * weight(:iim, 1)) / zweinor
327      zstdsud=0.      zpic(:, jjm + 1) = sum(zpic(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
328      zsignor=0.           / zweisud
329      zsigsud=0.  
330      zweinor=0.      zval(:, 1) = sum(zval(:iim, 1) * weight(:iim, 1)) / zweinor
331      zweisud=0.      zval(:, jjm + 1) = sum(zval(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
332      zpicnor=0.           / zweisud
333      zpicsud=0.                                    
334      zvalnor=0.      zstd(:, 1) = sum(zstd(:iim, 1) * weight(:iim, 1)) / zweinor
335      zvalsud=0.      zstd(:, jjm + 1) = sum(zstd(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
336             / zweisud
337      DO ii=1, iim  
338         zweinor=zweinor+              weight(ii,   1)      zsig(:, 1) = sum(zsig(:iim, 1) * weight(:iim, 1)) / zweinor
339         zweisud=zweisud+              weight(ii, jjm + 1)      zsig(:, jjm + 1) = sum(zsig(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
340         zmeanor=zmeanor+zmea(ii,   1)*weight(ii,   1)           / zweisud
        zmeasud=zmeasud+zmea(ii, jjm + 1)*weight(ii, jjm + 1)  
        zstdnor=zstdnor+zstd(ii,   1)*weight(ii,   1)  
        zstdsud=zstdsud+zstd(ii, jjm + 1)*weight(ii, jjm + 1)  
        zsignor=zsignor+zsig(ii,   1)*weight(ii,   1)  
        zsigsud=zsigsud+zsig(ii, jjm + 1)*weight(ii, jjm + 1)  
        zpicnor=zpicnor+zpic(ii,   1)*weight(ii,   1)  
        zpicsud=zpicsud+zpic(ii, jjm + 1)*weight(ii, jjm + 1)  
        zvalnor=zvalnor+zval(ii,   1)*weight(ii,   1)  
        zvalsud=zvalsud+zval(ii, jjm + 1)*weight(ii, jjm + 1)  
     ENDDO  
   
     zmea(:,   1)=zmeanor/zweinor  
     zmea(:, jjm + 1)=zmeasud/zweisud  
   
     zphi(:,   1)=zmeanor/zweinor  
     zphi(:, jjm + 1)=zmeasud/zweisud  
341    
342      zpic(:,   1)=zpicnor/zweinor      zgam(:, 1) = 1.
343      zpic(:, jjm + 1)=zpicsud/zweisud      zgam(:, jjm + 1) = 1.
344    
345      zval(:,   1)=zvalnor/zweinor      zthe(:, 1) = 0.
346      zval(:, jjm + 1)=zvalsud/zweisud      zthe(:, jjm + 1) = 0.
   
     zstd(:,   1)=zstdnor/zweinor  
     zstd(:, jjm + 1)=zstdsud/zweisud  
   
     zsig(:,   1)=zsignor/zweinor  
     zsig(:, jjm + 1)=zsigsud/zweisud  
   
     zgam(:,   1)=1.  
     zgam(:, jjm + 1)=1.  
   
     zthe(:,   1)=0.  
     zthe(:, jjm + 1)=0.  
347    
348    END SUBROUTINE grid_noro    END SUBROUTINE grid_noro
349    
   !******************************************  
   
   SUBROUTINE MVA9(X, IMAR, JMAR)  
   
     ! From dyn3d/grid_noro.F, v 1.1.1.1 2004/05/19 12:53:06  
   
     ! MAKE A MOVING AVERAGE OVER 9 GRIDPOINTS OF THE X FIELDS  
   
     integer, intent(in):: imar, jmar  
     REAL, intent(inout):: X(IMAR, JMAR)  
   
     integer, PARAMETER:: ISMo=300, JSMo=200  
     real XF(ISMo, JSMo)  
     real WEIGHTpb(-1:1, -1:1)  
     real my_sum  
     integer i, is, js, j  
   
     if(imar>ismo) stop 'surdimensionner ismo dans mva9 (grid_noro)'  
     if(jmar>jsmo) stop 'surdimensionner jsmo dans mva9 (grid_noro)'  
   
     MY_SUM=0.  
     DO IS=-1, 1  
        DO JS=-1, 1  
           WEIGHTpb(IS, JS)=1./FLOAT((1+IS**2)*(1+JS**2))  
           MY_SUM=MY_SUM+WEIGHTpb(IS, JS)  
        ENDDO  
     ENDDO  
   
     DO IS=-1, 1  
        DO JS=-1, 1  
           WEIGHTpb(IS, JS)=WEIGHTpb(IS, JS)/MY_SUM  
        ENDDO  
     ENDDO  
   
     DO J=2, JMAR-1  
        DO I=2, IMAR-1  
           XF(I, J)=0.  
           DO IS=-1, 1  
              DO JS=-1, 1  
                 XF(I, J)=XF(I, J)+X(I+IS, J+JS)*WEIGHTpb(IS, JS)  
              ENDDO  
           ENDDO  
        ENDDO  
     ENDDO  
   
     DO J=2, JMAR-1  
        XF(1, J)=0.  
        IS=IMAR-1  
        DO JS=-1, 1  
           XF(1, J)=XF(1, J)+X(IS, J+JS)*WEIGHTpb(-1, JS)  
        ENDDO  
        DO IS=0, 1  
           DO JS=-1, 1  
              XF(1, J)=XF(1, J)+X(1+IS, J+JS)*WEIGHTpb(IS, JS)  
           ENDDO  
        ENDDO  
        XF(IMAR, J)=XF(1, J)  
     ENDDO  
   
     DO I=1, IMAR  
        XF(I, 1)=XF(I, 2)  
        XF(I, JMAR)=XF(I, JMAR-1)  
     ENDDO  
   
     DO I=1, IMAR  
        DO J=1, JMAR  
           X(I, J)=XF(I, J)  
        ENDDO  
     ENDDO  
   
   END SUBROUTINE MVA9  
   
350  end module grid_noro_m  end module grid_noro_m

Legend:
Removed from v.39  
changed lines
  Added in v.265

  ViewVC Help
Powered by ViewVC 1.1.21