/[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

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

Legend:
Removed from v.36  
changed lines
  Added in v.70

  ViewVC Help
Powered by ViewVC 1.1.21