/[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/dyn3d/grid_noro_m.f90 revision 3 by guez, Wed Feb 27 13:16:39 2008 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".
30    
31      !           (c)      use dimensions, only: iim, jjm
32      !        ----d-----      use mva9_m, only: mva9
33      !        | . . . .|      use nr_util, only: assert, pi
34      !        |        |  
35      !     (b)a . * . .b(a)      ! Coordinates of input field:
36      !        |        |      REAL, intent(in):: xdata(:) ! (iusn)
37      !        | . . . .|      REAL, intent(in):: ydata(:) ! (jusn)
38      !        ----c-----  
39      !           (d)      REAL, intent(in):: zdata(:, :) ! (iusn, jusn) input field, in m
40        REAL, intent(in):: x(:), y(:) ! coordinates of output field
41      use dimens_m, only: iim, jjm  
42      use comconst, only: pi      ! Correlations of US Navy orography gradients:
43      use nrutil, only: assert  
44        REAL, intent(out):: zphi(:, :) ! (iim + 1, jjm + 1)
45      REAL, intent(in):: xdata(:), ydata(:) ! coordinates of input field      ! geoptential height of orography, not smoothed, in m
46      REAL, intent(in):: zdata(:, :) ! input field      
47      REAL, intent(in):: x(:), y(:) ! ccordinates output field      real, intent(out):: zmea(:, :) ! (iim + 1, jjm + 1) smoothed orography
48        real, intent(out):: zstd(:, :) ! (iim + 1, jjm + 1) Standard deviation
49      ! Correlations of USN orography gradients:      REAL, intent(out):: zsig(:, :) ! (iim + 1, jjm + 1) Slope
50        real, intent(out):: zgam(:, :) ! (iim + 1, jjm + 1) Anisotropy
51      REAL zphi(:, :)  
52      real, intent(out):: zmea(:, :) ! Mean orography      real, intent(out):: zthe(:, :) ! (iim + 1, jjm + 1)
53      real, intent(out):: zstd(:, :) ! Standard deviation      ! Orientation of the small axis
54      REAL zsig(:, :) ! Slope  
55      real zgam(:, :) ! Anisotropy      REAL, intent(out):: zpic(:, :) ! (iim + 1, jjm + 1) Maximum altitude
56      real zthe(:, :) ! Orientation of the small axis      real, intent(out):: zval(:, :) ! (iim + 1, jjm + 1) Minimum altitude
     REAL, intent(out):: zpic(:, :) ! Maximum altitude  
     real, intent(out):: zval(:, :) ! Minimum altitude  
57    
58      real, intent(out):: mask(:, :)      real, intent(out):: mask(:, :) ! (iim + 1, jjm + 1) fraction of land
59    
60      ! Variables local to the procedure:      ! Local:
61    
62      ! In this version it is assumed that the input data come from      ! In this version it is assumed that the input data come from
63      ! the US Navy dataset:      ! the US Navy dataset:
64      integer, parameter:: iusn=2160, jusn=1080      integer, parameter:: iusn = 2160, jusn = 1080
65        integer, parameter:: iext = 216
66      integer, parameter:: iext=216      REAL xusn(iusn + 2 * iext), yusn(jusn + 2)
67      REAL xusn(iusn+2*iext), yusn(jusn+2)      REAL zusn(iusn + 2 * iext, jusn + 2) ! in m
68      REAL zusn(iusn+2*iext, jusn+2)  
69        ! Intermediate fields (correlations of orography gradient)
70      ! Intermediate fields  (correlations of orography gradient)      REAL, dimension(iim + 1, jjm + 1):: ztz, zxtzx, zytzy, zxtzy, weight
71    
72      REAL ztz(iim+1, jjm+1), zxtzx(iim+1, jjm+1)      ! Correlations of US Navy orography gradients:
73      REAL zytzy(iim+1, jjm+1), zxtzy(iim+1, jjm+1)      REAL, dimension(iusn + 2 * iext, jusn + 2):: zxtzxusn, zytzyusn, zxtzyusn
74      REAL weight(iim+1, jjm+1)  
75        real, dimension(iim + 1, jjm + 1):: mask_tmp, num_tot, num_lan
76      ! Correlations of USN orography gradients:      REAL a(iim + 1), b(iim + 1), c(jjm + 1), d(jjm + 1)
77        real weighx, weighy, xincr, xk, xp, xm, xw, xq, xl
     REAL zxtzxusn(iusn+2*iext, jusn+2), zytzyusn(iusn+2*iext, jusn+2)  
     REAL zxtzyusn(iusn+2*iext, jusn+2)  
   
     real mask_tmp(size(x), size(y))  
     real num_tot(2200, 1100), num_lan(2200, 1100)  
   
     REAL a(2200), b(2200), c(1100), d(1100)  
     real rad, 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 108  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
     !    
     ! COMPUTE LIMITS OF MODEL GRIDPOINT AREA  
     !     ( REGULAR GRID)  
125    
126      a(1) = x(1) - (x(2)-x(1))/2.0      ! Compute limits of model gridpoint area (regular grid)
127      b(1) = (x(1)+x(2))/2.0  
128        a(1) = x(1) - (x(2) - x(1)) / 2.0
129        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 232  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  
341    
342      zmea(:,   1)=zmeanor/zweinor      zgam(:, 1) = 1.
343      zmea(:, jjm + 1)=zmeasud/zweisud      zgam(:, jjm + 1) = 1.
344    
345      zphi(:,   1)=zmeanor/zweinor      zthe(:, 1) = 0.
346      zphi(:, jjm + 1)=zmeasud/zweisud      zthe(:, jjm + 1) = 0.
   
     zpic(:,   1)=zpicnor/zweinor  
     zpic(:, jjm + 1)=zpicsud/zweisud  
   
     zval(:,   1)=zvalnor/zweinor  
     zval(:, jjm + 1)=zvalsud/zweisud  
   
     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 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)'  
   
     SUM=0.  
     DO IS=-1, 1  
        DO JS=-1, 1  
           WEIGHTpb(IS, JS)=1./FLOAT((1+IS**2)*(1+JS**2))  
           SUM=SUM+WEIGHTpb(IS, JS)  
        ENDDO  
     ENDDO  
   
     DO IS=-1, 1  
        DO JS=-1, 1  
           WEIGHTpb(IS, JS)=WEIGHTpb(IS, JS)/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.3  
changed lines
  Added in v.265

  ViewVC Help
Powered by ViewVC 1.1.21