/[lmdze]/trunk/Sources/phylmd/Orography/grid_noro_m.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/Orography/grid_noro_m.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/Sources/phylmd/Orography/grid_noro_m.f revision 147 by guez, Wed Jun 17 14:20:14 2015 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 dimens_m, only: iim, jjm
32      use comconst, only: pi      use mva9_m, only: mva9
33      use nrutil, only: assert      use nr_util, only: assert, pi
34    
35        ! Coordinates of input field:
36        REAL, intent(in):: xdata(:) ! (iusn)
37        REAL, intent(in):: ydata(:) ! (jusn)
38    
39        REAL, intent(in):: zdata(:, :) ! (iusn, jusn) input field
40        REAL, intent(in):: x(:), y(:) ! coordinates of output field
41    
42        ! Correlations of US Navy orography gradients:
43        REAL, intent(out):: zphi(:, :) ! (iim + 1, jjm + 1) orography not smoothed
44        real, intent(out):: zmea(:, :) ! (iim + 1, jjm + 1) smoothed orography
45        real, intent(out):: zstd(:, :) ! (iim + 1, jjm + 1) Standard deviation
46        REAL, intent(out):: zsig(:, :) ! (iim + 1, jjm + 1) Slope
47        real, intent(out):: zgam(:, :) ! (iim + 1, jjm + 1) Anisotropy
48    
49      REAL, intent(in):: xdata(:), ydata(:) ! coordinates of input field      real, intent(out):: zthe(:, :) ! (iim + 1, jjm + 1)
50      REAL, intent(in):: zdata(:, :) ! input field      ! Orientation of the small axis
     REAL, intent(in):: x(:), y(:) ! ccordinates output field  
   
     ! 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  
51    
52      real, intent(out):: mask(:, :)      REAL, intent(out):: zpic(:, :) ! (iim + 1, jjm + 1) Maximum altitude
53        real, intent(out):: zval(:, :) ! (iim + 1, jjm + 1) Minimum altitude
54    
55        real, intent(out):: mask(:, :) ! (iim + 1, jjm + 1) fraction of land
56    
57      ! Variables local to the procedure:      ! Variables local to the procedure:
58    
59      ! In this version it is assumed that the input data come from      ! In this version it is assumed that the input data come from
60      ! the US Navy dataset:      ! the US Navy dataset:
61      integer, parameter:: iusn=2160, jusn=1080      integer, parameter:: iusn = 2160, jusn = 1080
62        integer, parameter:: iext = 216
63      integer, parameter:: iext=216      REAL xusn(iusn + 2 * iext), yusn(jusn + 2)
64      REAL xusn(iusn+2*iext), yusn(jusn+2)      REAL zusn(iusn + 2 * iext, jusn + 2)
65      REAL zusn(iusn+2*iext, jusn+2)  
66        ! Intermediate fields (correlations of orography gradient)
67      ! Intermediate fields  (correlations of orography gradient)      REAL, dimension(iim + 1, jjm + 1):: ztz, zxtzx, zytzy, zxtzy, weight
68    
69      REAL ztz(iim+1, jjm+1), zxtzx(iim+1, jjm+1)      ! Correlations of US Navy orography gradients:
70      REAL zytzy(iim+1, jjm+1), zxtzy(iim+1, jjm+1)      REAL, dimension(iusn + 2 * iext, jusn + 2):: zxtzxusn, zytzyusn, zxtzyusn
71      REAL weight(iim+1, jjm+1)  
72        real, dimension(iim + 1, jjm + 1):: mask_tmp, num_tot, num_lan
73      ! Correlations of USN orography gradients:      REAL a(iim + 1), b(iim + 1), c(jjm + 1), d(jjm + 1)
74        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  
75      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud
76      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  
77      integer ii, i, jj, j      integer ii, i, jj, j
78        real, parameter:: rad = 6371229.
79    
80      !-------------------------------      !-------------------------------
81    
# Line 108  contains Line 92  contains
92           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &
93           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")
94    
95      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.  
96      zdeltay = 2. * pi / real(jusn) * rad      zdeltay = 2. * pi / real(jusn) * rad
97    
98      ! Extension of the USN database to POCEED computations at boundaries:      ! Extension of the US Navy database for computations at boundaries:
99    
100      DO j=1, jusn      DO j = 1, jusn
101         yusn(j+1)=ydata(j)         yusn(j + 1) = ydata(j)
102         DO i=1, iusn         DO i = 1, iusn
103            zusn(i+iext, j+1)=zdata(i, j)            zusn(i + iext, j + 1) = zdata(i, j)
104            xusn(i+iext)=xdata(i)            xusn(i + iext) = xdata(i)
105         ENDDO         ENDDO
106         DO i=1, iext         DO i = 1, iext
107            zusn(i, j+1)=zdata(iusn-iext+i, j)            zusn(i, j + 1) = zdata(iusn - iext + i, j)
108            xusn(i)=xdata(iusn-iext+i)-2.*pi            xusn(i) = xdata(iusn - iext + i) - 2. * pi
109            zusn(iusn+iext+i, j+1)=zdata(i, j)            zusn(iusn + iext + i, j + 1) = zdata(i, j)
110            xusn(iusn+iext+i)=xdata(i)+2.*pi            xusn(iusn + iext + i) = xdata(i) + 2. * pi
111         ENDDO         ENDDO
112      ENDDO      ENDDO
113    
114      yusn(1)=ydata(1)+(ydata(1)-ydata(2))      yusn(1) = ydata(1) + (ydata(1) - ydata(2))
115      yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))      yusn(jusn + 2) = ydata(jusn) + (ydata(jusn) - ydata(jusn - 1))
116      DO i=1, iusn/2+iext      DO i = 1, iusn / 2 + iext
117         zusn(i, 1)=zusn(i+iusn/2, 2)         zusn(i, 1) = zusn(i + iusn / 2, 2)
118         zusn(i+iusn/2+iext, 1)=zusn(i, 2)         zusn(i + iusn / 2 + iext, 1) = zusn(i, 2)
119         zusn(i, jusn+2)=zusn(i+iusn/2, jusn+1)         zusn(i, jusn + 2) = zusn(i + iusn / 2, jusn + 1)
120         zusn(i+iusn/2+iext, jusn+2)=zusn(i, jusn+1)         zusn(i + iusn / 2 + iext, jusn + 2) = zusn(i, jusn + 1)
121      ENDDO      ENDDO
     !    
     ! COMPUTE LIMITS OF MODEL GRIDPOINT AREA  
     !     ( REGULAR GRID)  
122    
123      a(1) = x(1) - (x(2)-x(1))/2.0      ! Compute limits of model gridpoint area (regular grid)
124      b(1) = (x(1)+x(2))/2.0  
125        a(1) = x(1) - (x(2) - x(1)) / 2.0
126        b(1) = (x(1) + x(2)) / 2.0
127      DO i = 2, iim      DO i = 2, iim
128         a(i) = b(i-1)         a(i) = b(i - 1)
129         b(i) = (x(i)+x(i+1))/2.0         b(i) = (x(i) + x(i + 1)) / 2.0
130      ENDDO      ENDDO
131      a(iim+1) = b(iim)      a(iim + 1) = b(iim)
132      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
133    
134      c(1) = y(1) - (y(2)-y(1))/2.0      c(1) = y(1) - (y(2) - y(1)) / 2.0
135      d(1) = (y(1)+y(2))/2.0      d(1) = (y(1) + y(2)) / 2.0
136      DO j = 2, jjm      DO j = 2, jjm
137         c(j) = d(j-1)         c(j) = d(j - 1)
138         d(j) = (y(j)+y(j+1))/2.0         d(j) = (y(j) + y(j + 1)) / 2.0
139      ENDDO      ENDDO
140      c(jjm + 1) = d(jjm)      c(jjm + 1) = d(jjm)
141      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
142    
143      ! Initialisations :      ! Initialisations :
144      weight(:, :) = 0.      weight = 0.
145      zxtzx(:, :)  = 0.      zxtzx = 0.
146      zytzy(:, :)  = 0.      zytzy = 0.
147      zxtzy(:, :)  = 0.      zxtzy = 0.
148      ztz(:, :)    = 0.      ztz = 0.
149      zmea(:, :)   = 0.      zmea = 0.
150      zpic(:, :)  =-1.E+10      zpic = - 1E10
151      zval(:, :)  = 1.E+10      zval = 1E10
152    
153      !  COMPUTE SLOPES CORRELATIONS ON USN GRID      ! Compute slopes correlations on US Navy grid
154    
155      zytzyusn(:, :)=0.      zytzyusn = 0.
156      zxtzxusn(:, :)=0.      zxtzxusn = 0.
157      zxtzyusn(:, :)=0.      zxtzyusn = 0.
158    
159      DO j = 2, jusn+1      DO j = 2, jusn + 1
160         zdeltax=zdeltay*cos(yusn(j))         zdeltax = zdeltay * cos(yusn(j))
161         DO i = 2, iusn+2*iext-1         DO i = 2, iusn + 2 * iext - 1
162            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
163            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
164            zxtzyusn(i, j)=(zusn(i, j+1)-zusn(i, j-1))/zdeltay &            zxtzyusn(i, j) = (zusn(i, j + 1) - zusn(i, j - 1)) / zdeltay &
165                 *(zusn(i+1, j)-zusn(i-1, j))/zdeltax                 * (zusn(i + 1, j) - zusn(i - 1, j)) / zdeltax
166         ENDDO         ENDDO
167      ENDDO      ENDDO
168    
169      !  SUMMATION OVER GRIDPOINT AREA      ! Summation over gridpoint area
170      !  
171      zleny=pi/real(jusn)*rad      zleny = pi / real(jusn) * rad
172      xincr=pi/2./real(jusn)      xincr = pi / 2. / real(jusn)
173      DO ii = 1, iim+1      DO ii = 1, iim + 1
174         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
175            num_tot(ii, jj)=0.            num_tot(ii, jj) = 0.
176            num_lan(ii, jj)=0.            num_lan(ii, jj) = 0.
177            DO j = 2, jusn+1            DO j = 2, jusn + 1
178               zlenx=zleny*cos(yusn(j))               zlenx = zleny * cos(yusn(j))
179               zdeltax=zdeltay*cos(yusn(j))               zdeltax = zdeltay * cos(yusn(j))
180               zbordnor=(c(jj)-yusn(j)+xincr)*rad               zbordnor = (c(jj) - yusn(j) + xincr) * rad
181               zbordsud=(yusn(j)-d(jj)+xincr)*rad               zbordsud = (yusn(j) - d(jj) + xincr) * rad
182               weighy=AMAX1(0., amin1(zbordnor, zbordsud, zleny))               weighy = MAX(0., min(zbordnor, zbordsud, zleny))
183               IF (weighy /= 0) THEN               IF (weighy /= 0) THEN
184                  DO i = 2, iusn+2*iext-1                  DO i = 2, iusn + 2 * iext - 1
185                     zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))                     zbordest = (xusn(i) - a(ii) + xincr) * rad * cos(yusn(j))
186                     zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))                     zbordoue = (b(ii) + xincr - xusn(i)) * rad * cos(yusn(j))
187                     weighx=AMAX1(0., amin1(zbordest, zbordoue, zlenx))                     weighx = MAX(0., min(zbordest, zbordoue, zlenx))
188                     IF (weighx /= 0) THEN                     IF (weighx /= 0) THEN
189                        num_tot(ii, jj) = num_tot(ii, jj) + 1.                        num_tot(ii, jj) = num_tot(ii, jj) + 1.
190                        if (zusn(i, j) >= 1.) then                        if (zusn(i, j) >= 1.) then
191                           num_lan(ii, jj) = num_lan(ii, jj) + 1.                           num_lan(ii, jj) = num_lan(ii, jj) + 1.
192                        end if                        end if
193                        weight(ii, jj) = weight(ii, jj) + weighx * weighy                        weight(ii, jj) = weight(ii, jj) + weighx * weighy
194                        zxtzx(ii, jj)=zxtzx(ii, jj)+zxtzxusn(i, j)*weighx*weighy                        zxtzx(ii, jj) = zxtzx(ii, jj) &
195                        zytzy(ii, jj)=zytzy(ii, jj)+zytzyusn(i, j)*weighx*weighy                             + zxtzxusn(i, j) * weighx * weighy
196                        zxtzy(ii, jj)=zxtzy(ii, jj)+zxtzyusn(i, j)*weighx*weighy                        zytzy(ii, jj) = zytzy(ii, jj) &
197                               + zytzyusn(i, j) * weighx * weighy
198                          zxtzy(ii, jj) = zxtzy(ii, jj) &
199                               + zxtzyusn(i, j) * weighx * weighy
200                        ztz(ii, jj) = ztz(ii, jj) &                        ztz(ii, jj) = ztz(ii, jj) &
201                             + zusn(i, j) * zusn(i, j) * weighx * weighy                             + zusn(i, j) * zusn(i, j) * weighx * weighy
202                        ! mean                        ! mean
203                        zmea(ii, jj) =zmea(ii, jj)+zusn(i, j)*weighx*weighy                        zmea(ii, jj) = zmea(ii, jj) + zusn(i, j) * weighx * weighy
204                        ! peacks                        ! peacks
205                        zpic(ii, jj)=amax1(zpic(ii, jj), zusn(i, j))                        zpic(ii, jj) = max(zpic(ii, jj), zusn(i, j))
206                        ! valleys                        ! valleys
207                        zval(ii, jj)=amin1(zval(ii, jj), zusn(i, j))                        zval(ii, jj) = min(zval(ii, jj), zusn(i, j))
208                     ENDIF                     ENDIF
209                  ENDDO                  ENDDO
210               ENDIF               ENDIF
# Line 232  contains Line 212  contains
212         ENDDO         ENDDO
213      ENDDO      ENDDO
214    
215      if (any(weight == 0.)) stop "zero weight in grid_noro"      if (any(weight == 0.)) then
216           print *, "zero weight in grid_noro"
217           stop 1
218        end if
219    
220      !  COMPUTE PARAMETERS NEEDED BY THE LOTT & MILLER (1997) AND      ! Compute parameters needed by the Lott & Miller (1997) and Lott
221      !  LOTT (1999) SSO SCHEME.      ! (1999) subgrid-scale orographic scheme.
222    
223      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  
224         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
225            mask(ii, jj) = num_lan(ii, jj)/num_tot(ii, jj)            mask(ii, jj) = num_lan(ii, jj) / num_tot(ii, jj)
226            !  Mean Orography:            ! Mean orography:
227            zmea (ii, jj)=zmea (ii, jj)/weight(ii, jj)            zmea (ii, jj) = zmea (ii, jj) / weight(ii, jj)
228            zxtzx(ii, jj)=zxtzx(ii, jj)/weight(ii, jj)            zxtzx(ii, jj) = zxtzx(ii, jj) / weight(ii, jj)
229            zytzy(ii, jj)=zytzy(ii, jj)/weight(ii, jj)            zytzy(ii, jj) = zytzy(ii, jj) / weight(ii, jj)
230            zxtzy(ii, jj)=zxtzy(ii, jj)/weight(ii, jj)            zxtzy(ii, jj) = zxtzy(ii, jj) / weight(ii, jj)
231            ztz(ii, jj)  =ztz(ii, jj)/weight(ii, jj)            ztz(ii, jj) = ztz(ii, jj) / weight(ii, jj)
232            !  Standard deviation:            ! Standard deviation:
233            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))
234         ENDDO         ENDDO
235      ENDDO      ENDDO
236    
237      ! CORRECT VALUES OF HORIZONTAL SLOPE NEAR THE POLES:      ! Correct values of horizontal slope near the poles:
238        DO ii = 1, iim + 1
239      DO ii = 1, iim+1         zxtzx(ii, 1) = zxtzx(ii, 2)
240         zxtzx(ii, 1)=zxtzx(ii, 2)         zxtzx(ii, jjm + 1) = zxtzx(ii, jjm)
241         zxtzx(ii, jjm + 1)=zxtzx(ii, jjm)         zxtzy(ii, 1) = zxtzy(ii, 2)
242         zxtzy(ii, 1)=zxtzy(ii, 2)         zxtzy(ii, jjm + 1) = zxtzy(ii, jjm)
243         zxtzy(ii, jjm + 1)=zxtzy(ii, jjm)         zytzy(ii, 1) = zytzy(ii, 2)
244         zytzy(ii, 1)=zytzy(ii, 2)         zytzy(ii, jjm + 1) = zytzy(ii, jjm)
245         zytzy(ii, jjm + 1)=zytzy(ii, jjm)      ENDDO
246      ENDDO  
247        ! Masque prenant en compte maximum de terre. On met un seuil \`a 10
248      !  FILTERS TO SMOOTH OUT FIELDS FOR INPUT INTO SSO SCHEME.      ! % de terre car en dessous les param\`etres de surface n'ont pas de
249        ! sens.
250      !  FIRST FILTER, MOVING AVERAGE OVER 9 POINTS.      mask_tmp = merge(1., 0., mask >= 0.1)
251    
252      CALL MVA9(zmea, iim+1, jjm+1)      zphi(:iim, :) = zmea(:iim, :) * mask_tmp(:iim, :)
253      CALL MVA9(zstd, iim+1, jjm+1)      ! (zmea is not yet smoothed)
254      CALL MVA9(zpic, iim+1, jjm+1)  
255      CALL MVA9(zval, iim+1, jjm+1)      ! Filters to smooth out fields for input into subgrid-scale
256      CALL MVA9(zxtzx, iim+1, jjm+1)      ! orographic scheme.
257      CALL MVA9(zxtzy, iim+1, jjm+1)  
258      CALL MVA9(zytzy, iim+1, jjm+1)      ! First filter, moving average over 9 points.
259        CALL MVA9(zmea)
260      ! Masque prenant en compte maximum de terre      CALL MVA9(zstd)
261      ! On seuil a 10% de terre de terre car en dessous les parametres      CALL MVA9(zpic)
262      ! de surface n'ont pas de sens (PB)      CALL MVA9(zval)
263      mask_tmp= 0.      CALL MVA9(zxtzx)
264      WHERE (mask >= 0.1) mask_tmp = 1.      CALL MVA9(zxtzy)
265        CALL MVA9(zytzy)
266    
267      DO ii = 1, iim      DO ii = 1, iim
268         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
269            IF (weight(ii, jj) /= 0.) THEN            ! Coefficients K, L et M:
270               !  Coefficients K, L et M:            xk = (zxtzx(ii, jj) + zytzy(ii, jj)) / 2.
271               xk=(zxtzx(ii, jj)+zytzy(ii, jj))/2.            xl = (zxtzx(ii, jj) - zytzy(ii, jj)) / 2.
272               xl=(zxtzx(ii, jj)-zytzy(ii, jj))/2.            xm = zxtzy(ii, jj)
273               xm=zxtzy(ii, jj)            xp = xk - sqrt(xl**2 + xm**2)
274               xp=xk-sqrt(xl**2+xm**2)            xq = xk + sqrt(xl**2 + xm**2)
275               xq=xk+sqrt(xl**2+xm**2)            xw = 1e-8
276               xw=1.e-8            if (xp <= xw) xp = 0.
277               if(xp.le.xw) xp=0.            if (xq <= xw) xq = xw
278               if(xq.le.xw) xq=xw            if (abs(xm) <= xw) xm = xw * sign(1., xm)
279               if(abs(xm).le.xw) xm=xw*sign(1., xm)            ! modification pour masque de terre fractionnaire
280               !$$* PB modif pour maque de terre fractionnaire            ! slope:
281               ! slope:            zsig(ii, jj) = sqrt(xq) * mask_tmp(ii, jj)
282               zsig(ii, jj)=sqrt(xq)*mask_tmp(ii, jj)            ! isotropy:
283               ! isotropy:            zgam(ii, jj) = xp / xq * mask_tmp(ii, jj)
284               zgam(ii, jj)=xp/xq*mask_tmp(ii, jj)            ! angle theta:
285               ! angle theta:            zthe(ii, jj) = 57.29577951 * atan2(xm, xl) / 2. * mask_tmp(ii, jj)
286               zthe(ii, jj)=57.29577951*atan2(xm, xl)/2.*mask_tmp(ii, jj)         ENDDO
287               zphi(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)      ENDDO
288               zmea(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)  
289               zpic(ii, jj)=zpic(ii, jj)*mask_tmp(ii, jj)      zmea(:iim, :) = zmea(:iim, :) * mask_tmp(:iim, :)
290               zval(ii, jj)=zval(ii, jj)*mask_tmp(ii, jj)      zpic(:iim, :) = zpic(:iim, :) * mask_tmp(:iim, :)
291               zstd(ii, jj)=zstd(ii, jj)*mask_tmp(ii, jj)      zval(:iim, :) = zval(:iim, :) * mask_tmp(:iim, :)
292            ENDIF      zstd(:iim, :) = zstd(:iim, :) * mask_tmp(:iim, :)
293            zllmmea=AMAX1(zmea(ii, jj), zllmmea)  
294            zllmstd=AMAX1(zstd(ii, jj), zllmstd)      print *, 'MEAN ORO: ', MAXVAL(zmea(:iim, :))
295            zllmsig=AMAX1(zsig(ii, jj), zllmsig)      print *, 'ST. DEV.: ', MAXVAL(zstd(:iim, :))
296            zllmgam=AMAX1(zgam(ii, jj), zllmgam)      print *, 'PENTE: ', MAXVAL(zsig(:iim, :))
297            zllmthe=AMAX1(zthe(ii, jj), zllmthe)      print *, 'ANISOTROP: ', MAXVAL(zgam(:iim, :))
298            zminthe=amin1(zthe(ii, jj), zminthe)      print *, 'ANGLE: ', minval(zthe(:iim, :)), MAXVAL(zthe(:iim, :))
299            zllmpic=AMAX1(zpic(ii, jj), zllmpic)      print *, 'pic: ', MAXVAL(zpic(:iim, :))
300            zllmval=AMAX1(zval(ii, jj), zllmval)      print *, 'val: ', MAXVAL(zval(:iim, :))
301         ENDDO  
302      ENDDO      ! gamma and theta at 1. and 0. at poles
303      print *, '  MEAN ORO:', zllmmea      zmea(iim + 1, :) = zmea(1, :)
304      print *, '  ST. DEV.:', zllmstd      zphi(iim + 1, :) = zphi(1, :)
305      print *, '  PENTE:', zllmsig      zpic(iim + 1, :) = zpic(1, :)
306      print *, ' ANISOTROP:', zllmgam      zval(iim + 1, :) = zval(1, :)
307      print *, '  ANGLE:', zminthe, zllmthe      zstd(iim + 1, :) = zstd(1, :)
308      print *, '  pic:', zllmpic      zsig(iim + 1, :) = zsig(1, :)
309      print *, '  val:', zllmval      zgam(iim + 1, :) = zgam(1, :)
310        zthe(iim + 1, :) = zthe(1, :)
311      ! gamma and theta a 1. and 0. at poles  
312      zmea(iim+1, :)=zmea(1, :)      zweinor = sum(weight(:iim, 1))
313      zphi(iim+1, :)=zphi(1, :)      zweisud = sum(weight(:iim, jjm + 1))
314      zpic(iim+1, :)=zpic(1, :)      zmeanor = sum(zmea(:iim, 1) * weight(:iim, 1))
315      zval(iim+1, :)=zval(1, :)      zmeasud = sum(zmea(:iim, jjm + 1) * weight(:iim, jjm + 1))
316      zstd(iim+1, :)=zstd(1, :)  
317      zsig(iim+1, :)=zsig(1, :)      zmea(:, 1) = zmeanor / zweinor
318      zgam(iim+1, :)=zgam(1, :)      zmea(:, jjm + 1) = zmeasud / zweisud
319      zthe(iim+1, :)=zthe(1, :)  
320        zphi(:, 1) = zmeanor / zweinor
321      zmeanor=0.      zphi(:, jjm + 1) = zmeasud / zweisud
322      zmeasud=0.  
323      zstdnor=0.      zpic(:, 1) = sum(zpic(:iim, 1) * weight(:iim, 1)) / zweinor
324      zstdsud=0.      zpic(:, jjm + 1) = sum(zpic(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
325      zsignor=0.           / zweisud
326      zsigsud=0.  
327      zweinor=0.      zval(:, 1) = sum(zval(:iim, 1) * weight(:iim, 1)) / zweinor
328      zweisud=0.      zval(:, jjm + 1) = sum(zval(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
329      zpicnor=0.           / zweisud
330      zpicsud=0.                                    
331      zvalnor=0.      zstd(:, 1) = sum(zstd(:iim, 1) * weight(:iim, 1)) / zweinor
332      zvalsud=0.      zstd(:, jjm + 1) = sum(zstd(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
333             / zweisud
334      DO ii=1, iim  
335         zweinor=zweinor+              weight(ii,   1)      zsig(:, 1) = sum(zsig(:iim, 1) * weight(:iim, 1)) / zweinor
336         zweisud=zweisud+              weight(ii, jjm + 1)      zsig(:, jjm + 1) = sum(zsig(:iim, jjm + 1) * weight(:iim, jjm + 1)) &
337         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  
   
     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  
338    
339      zgam(:,   1)=1.      zgam(:, 1) = 1.
340      zgam(:, jjm + 1)=1.      zgam(:, jjm + 1) = 1.
341    
342      zthe(:,   1)=0.      zthe(:, 1) = 0.
343      zthe(:, jjm + 1)=0.      zthe(:, jjm + 1) = 0.
344    
345    END SUBROUTINE grid_noro    END SUBROUTINE grid_noro
346    
   !******************************************  
   
   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  
   
347  end module grid_noro_m  end module grid_noro_m

Legend:
Removed from v.3  
changed lines
  Added in v.147

  ViewVC Help
Powered by ViewVC 1.1.21