/[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 40 by guez, Tue Feb 22 13:49:36 2011 UTC trunk/Sources/phylmd/Orography/grid_noro_m.f revision 134 by guez, Wed Apr 29 15:47:56 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ç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 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      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(:) ! coordinates of output field
   
     ! Correlations of USN orography gradients:  
38    
39      REAL zphi(:, :)      ! Correlations of US Navy orography gradients:
40      real, intent(out):: zmea(:, :) ! Mean orography      REAL, intent(out):: zphi(:, :) ! orography not smoothed
41        real, intent(out):: zmea(:, :) ! smoothed 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 64  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)      REAL, dimension(iim + 1, jjm + 1):: ztz, zxtzx, zytzy, zxtzy, weight
62    
63      REAL ztz(iim+1, jjm+1), zxtzx(iim+1, jjm+1)      ! Correlations of US Navy orography gradients:
64      REAL zytzy(iim+1, jjm+1), zxtzy(iim+1, jjm+1)      REAL, dimension(iusn + 2 * iext, jusn + 2):: zxtzxusn, zytzyusn, zxtzyusn
65      REAL weight(iim+1, jjm+1)  
66        real, dimension(iim + 1, jjm + 1):: mask_tmp, num_tot, num_lan, zmea0
67      ! Correlations of USN orography gradients:      REAL a(iim + 1), b(iim + 1), c(jjm + 1), d(jjm + 1)
68        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  
69      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud      real zbordnor, zdeltax, zbordsud, zdeltay, zbordoue, zlenx, zleny, zmeasud
70      real zllmpic, zllmmea, zllmgam, zllmthe, zllmstd, zllmsig, zllmval      real zllmpic, zllmmea, zllmgam, zllmthe, zllmstd, zllmsig, zllmval
71      real zpicnor, zminthe, zsigsud, zstdnor, zstdsud, zvalsud, zvalnor      real zpicnor, zminthe, zsigsud, zstdnor, zstdsud, zvalsud, zvalnor
72      real zweinor, zweisud, zsignor, zpicsud, zmeanor, zbordest      real zweinor, zweisud, zsignor, zpicsud, zmeanor, zbordest
73      integer ii, i, jj, j      integer ii, i, jj, j
74        real, parameter:: rad = 6371229.
75    
76      !-------------------------------      !-------------------------------
77    
# Line 107  contains Line 88  contains
88           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &           size(zsig, 2), size(zgam, 2), size(zthe, 2), size(zpic, 2), &
89           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")           size(zval, 2), size(mask, 2)/) == jjm + 1, "grid_noro jjm")
90    
     IF (iim > 2200 .OR. jjm > 1099) THEN  
        print *, "iim = ", iim, ", jjm = ", jjm  
        stop '"iim" or "jjm" is too big'  
     ENDIF  
   
91      print *, "Paramètres de l'orographie à l'échelle sous-maille"      print *, "Paramètres de l'orographie à l'échelle sous-maille"
     rad = 6371229.  
92      zdeltay = 2. * pi / real(jusn) * rad      zdeltay = 2. * pi / real(jusn) * rad
93    
94      ! Extension of the USN database to POCEED computations at boundaries:      ! Extension of the US Navy database for computations at boundaries:
95    
96      DO j=1, jusn      DO j = 1, jusn
97         yusn(j+1)=ydata(j)         yusn(j + 1) = ydata(j)
98         DO i=1, iusn         DO i = 1, iusn
99            zusn(i+iext, j+1)=zdata(i, j)            zusn(i + iext, j + 1) = zdata(i, j)
100            xusn(i+iext)=xdata(i)            xusn(i + iext) = xdata(i)
101         ENDDO         ENDDO
102         DO i=1, iext         DO i = 1, iext
103            zusn(i, j+1)=zdata(iusn-iext+i, j)            zusn(i, j + 1) = zdata(iusn - iext + i, j)
104            xusn(i)=xdata(iusn-iext+i)-2.*pi            xusn(i) = xdata(iusn - iext + i) - 2. * pi
105            zusn(iusn+iext+i, j+1)=zdata(i, j)            zusn(iusn + iext + i, j + 1) = zdata(i, j)
106            xusn(iusn+iext+i)=xdata(i)+2.*pi            xusn(iusn + iext + i) = xdata(i) + 2. * pi
107         ENDDO         ENDDO
108      ENDDO      ENDDO
109    
110      yusn(1)=ydata(1)+(ydata(1)-ydata(2))      yusn(1) = ydata(1) + (ydata(1) - ydata(2))
111      yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))      yusn(jusn + 2) = ydata(jusn) + (ydata(jusn) - ydata(jusn - 1))
112      DO i=1, iusn/2+iext      DO i = 1, iusn / 2 + iext
113         zusn(i, 1)=zusn(i+iusn/2, 2)         zusn(i, 1) = zusn(i + iusn / 2, 2)
114         zusn(i+iusn/2+iext, 1)=zusn(i, 2)         zusn(i + iusn / 2 + iext, 1) = zusn(i, 2)
115         zusn(i, jusn+2)=zusn(i+iusn/2, jusn+1)         zusn(i, jusn + 2) = zusn(i + iusn / 2, jusn + 1)
116         zusn(i+iusn/2+iext, jusn+2)=zusn(i, jusn+1)         zusn(i + iusn / 2 + iext, jusn + 2) = zusn(i, jusn + 1)
117      ENDDO      ENDDO
118    
119      ! COMPUTE LIMITS OF MODEL GRIDPOINT AREA      ! Compute limits of model gridpoint area (regular grid)
     !     ( REGULAR GRID)  
120    
121      a(1) = x(1) - (x(2)-x(1))/2.0      a(1) = x(1) - (x(2) - x(1)) / 2.0
122      b(1) = (x(1)+x(2))/2.0      b(1) = (x(1) + x(2)) / 2.0
123      DO i = 2, iim      DO i = 2, iim
124         a(i) = b(i-1)         a(i) = b(i - 1)
125         b(i) = (x(i)+x(i+1))/2.0         b(i) = (x(i) + x(i + 1)) / 2.0
126      ENDDO      ENDDO
127      a(iim+1) = b(iim)      a(iim + 1) = b(iim)
128      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
129    
130      c(1) = y(1) - (y(2)-y(1))/2.0      c(1) = y(1) - (y(2) - y(1)) / 2.0
131      d(1) = (y(1)+y(2))/2.0      d(1) = (y(1) + y(2)) / 2.0
132      DO j = 2, jjm      DO j = 2, jjm
133         c(j) = d(j-1)         c(j) = d(j - 1)
134         d(j) = (y(j)+y(j+1))/2.0         d(j) = (y(j) + y(j + 1)) / 2.0
135      ENDDO      ENDDO
136      c(jjm + 1) = d(jjm)      c(jjm + 1) = d(jjm)
137      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
138    
139      ! Initialisations :      ! Initialisations :
140      weight(:, :) = 0.      weight = 0.
141      zxtzx(:, :)  = 0.      zxtzx = 0.
142      zytzy(:, :)  = 0.      zytzy = 0.
143      zxtzy(:, :)  = 0.      zxtzy = 0.
144      ztz(:, :)    = 0.      ztz = 0.
145      zmea(:, :)   = 0.      zmea = 0.
146      zpic(:, :)  =-1.E+10      zpic = - 1E10
147      zval(:, :)  = 1.E+10      zval = 1E10
148    
149      !  COMPUTE SLOPES CORRELATIONS ON USN GRID      ! Compute slopes correlations on US Navy grid
150    
151      zytzyusn(:, :)=0.      zytzyusn = 0.
152      zxtzxusn(:, :)=0.      zxtzxusn = 0.
153      zxtzyusn(:, :)=0.      zxtzyusn = 0.
154    
155      DO j = 2, jusn+1      DO j = 2, jusn + 1
156         zdeltax=zdeltay*cos(yusn(j))         zdeltax = zdeltay * cos(yusn(j))
157         DO i = 2, iusn+2*iext-1         DO i = 2, iusn + 2 * iext - 1
158            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
159            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
160            zxtzyusn(i, j)=(zusn(i, j+1)-zusn(i, j-1))/zdeltay &            zxtzyusn(i, j) = (zusn(i, j + 1) - zusn(i, j - 1)) / zdeltay &
161                 *(zusn(i+1, j)-zusn(i-1, j))/zdeltax                 * (zusn(i + 1, j) - zusn(i - 1, j)) / zdeltax
162         ENDDO         ENDDO
163      ENDDO      ENDDO
164    
165      !  SUMMATION OVER GRIDPOINT AREA      ! Summation over gridpoint area
166    
167      zleny=pi/real(jusn)*rad      zleny = pi / real(jusn) * rad
168      xincr=pi/2./real(jusn)      xincr = pi / 2. / real(jusn)
169      DO ii = 1, iim+1      DO ii = 1, iim + 1
170         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
171            num_tot(ii, jj)=0.            num_tot(ii, jj) = 0.
172            num_lan(ii, jj)=0.            num_lan(ii, jj) = 0.
173            DO j = 2, jusn+1            DO j = 2, jusn + 1
174               zlenx=zleny*cos(yusn(j))               zlenx = zleny * cos(yusn(j))
175               zdeltax=zdeltay*cos(yusn(j))               zdeltax = zdeltay * cos(yusn(j))
176               zbordnor=(c(jj)-yusn(j)+xincr)*rad               zbordnor = (c(jj) - yusn(j) + xincr) * rad
177               zbordsud=(yusn(j)-d(jj)+xincr)*rad               zbordsud = (yusn(j) - d(jj) + xincr) * rad
178               weighy=AMAX1(0., amin1(zbordnor, zbordsud, zleny))               weighy = MAX(0., min(zbordnor, zbordsud, zleny))
179               IF (weighy /= 0) THEN               IF (weighy /= 0) THEN
180                  DO i = 2, iusn+2*iext-1                  DO i = 2, iusn + 2 * iext - 1
181                     zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))                     zbordest = (xusn(i) - a(ii) + xincr) * rad * cos(yusn(j))
182                     zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))                     zbordoue = (b(ii) + xincr - xusn(i)) * rad * cos(yusn(j))
183                     weighx=AMAX1(0., amin1(zbordest, zbordoue, zlenx))                     weighx = MAX(0., min(zbordest, zbordoue, zlenx))
184                     IF (weighx /= 0) THEN                     IF (weighx /= 0) THEN
185                        num_tot(ii, jj) = num_tot(ii, jj) + 1.                        num_tot(ii, jj) = num_tot(ii, jj) + 1.
186                        if (zusn(i, j) >= 1.) then                        if (zusn(i, j) >= 1.) then
187                           num_lan(ii, jj) = num_lan(ii, jj) + 1.                           num_lan(ii, jj) = num_lan(ii, jj) + 1.
188                        end if                        end if
189                        weight(ii, jj) = weight(ii, jj) + weighx * weighy                        weight(ii, jj) = weight(ii, jj) + weighx * weighy
190                        zxtzx(ii, jj)=zxtzx(ii, jj)+zxtzxusn(i, j)*weighx*weighy                        zxtzx(ii, jj) = zxtzx(ii, jj) &
191                        zytzy(ii, jj)=zytzy(ii, jj)+zytzyusn(i, j)*weighx*weighy                             + zxtzxusn(i, j) * weighx * weighy
192                        zxtzy(ii, jj)=zxtzy(ii, jj)+zxtzyusn(i, j)*weighx*weighy                        zytzy(ii, jj) = zytzy(ii, jj) &
193                               + zytzyusn(i, j) * weighx * weighy
194                          zxtzy(ii, jj) = zxtzy(ii, jj) &
195                               + zxtzyusn(i, j) * weighx * weighy
196                        ztz(ii, jj) = ztz(ii, jj) &                        ztz(ii, jj) = ztz(ii, jj) &
197                             + zusn(i, j) * zusn(i, j) * weighx * weighy                             + zusn(i, j) * zusn(i, j) * weighx * weighy
198                        ! mean                        ! mean
199                        zmea(ii, jj) =zmea(ii, jj)+zusn(i, j)*weighx*weighy                        zmea(ii, jj) = zmea(ii, jj) + zusn(i, j) * weighx * weighy
200                        ! peacks                        ! peacks
201                        zpic(ii, jj)=amax1(zpic(ii, jj), zusn(i, j))                        zpic(ii, jj) = max(zpic(ii, jj), zusn(i, j))
202                        ! valleys                        ! valleys
203                        zval(ii, jj)=amin1(zval(ii, jj), zusn(i, j))                        zval(ii, jj) = min(zval(ii, jj), zusn(i, j))
204                     ENDIF                     ENDIF
205                  ENDDO                  ENDDO
206               ENDIF               ENDIF
# Line 231  contains Line 208  contains
208         ENDDO         ENDDO
209      ENDDO      ENDDO
210    
211      if (any(weight == 0.)) stop "zero weight in grid_noro"      if (any(weight == 0.)) then
212           print *, "zero weight in grid_noro"
213      !  COMPUTE PARAMETERS NEEDED BY THE LOTT & MILLER (1997) AND         stop 1
214      !  LOTT (1999) SSO SCHEME.      end if
215    
216      zllmmea=0.      ! Compute parameters needed by the Lott & Miller (1997) and Lott
217      zllmstd=0.      ! (1999) subgrid-scale orographic scheme.
218      zllmsig=0.  
219      zllmgam=0.      zllmmea = 0.
220      zllmpic=0.      zllmstd = 0.
221      zllmval=0.      zllmsig = 0.
222      zllmthe=0.      zllmgam = 0.
223      zminthe=0.      zllmpic = 0.
224      DO ii = 1, iim+1      zllmval = 0.
225        zllmthe = 0.
226        zminthe = 0.
227        DO ii = 1, iim + 1
228         DO jj = 1, jjm + 1         DO jj = 1, jjm + 1
229            mask(ii, jj) = num_lan(ii, jj)/num_tot(ii, jj)            mask(ii, jj) = num_lan(ii, jj) / num_tot(ii, jj)
230            !  Mean Orography:            ! Mean orography:
231            zmea (ii, jj)=zmea (ii, jj)/weight(ii, jj)            zmea (ii, jj) = zmea (ii, jj) / weight(ii, jj)
232            zxtzx(ii, jj)=zxtzx(ii, jj)/weight(ii, jj)            zxtzx(ii, jj) = zxtzx(ii, jj) / weight(ii, jj)
233            zytzy(ii, jj)=zytzy(ii, jj)/weight(ii, jj)            zytzy(ii, jj) = zytzy(ii, jj) / weight(ii, jj)
234            zxtzy(ii, jj)=zxtzy(ii, jj)/weight(ii, jj)            zxtzy(ii, jj) = zxtzy(ii, jj) / weight(ii, jj)
235            ztz(ii, jj)  =ztz(ii, jj)/weight(ii, jj)            ztz(ii, jj) = ztz(ii, jj) / weight(ii, jj)
236            !  Standard deviation:            ! Standard deviation:
237            zstd(ii, jj)=sqrt(MAX(0., ztz(ii, jj) - zmea(ii, jj)**2))            zstd(ii, jj) = sqrt(MAX(0., ztz(ii, jj) - zmea(ii, jj)**2))
238         ENDDO         ENDDO
239      ENDDO      ENDDO
240    
241      ! CORRECT VALUES OF HORIZONTAL SLOPE NEAR THE POLES:      ! Correct values of horizontal slope near the poles:
242        DO ii = 1, iim + 1
243      DO ii = 1, iim+1         zxtzx(ii, 1) = zxtzx(ii, 2)
244         zxtzx(ii, 1)=zxtzx(ii, 2)         zxtzx(ii, jjm + 1) = zxtzx(ii, jjm)
245         zxtzx(ii, jjm + 1)=zxtzx(ii, jjm)         zxtzy(ii, 1) = zxtzy(ii, 2)
246         zxtzy(ii, 1)=zxtzy(ii, 2)         zxtzy(ii, jjm + 1) = zxtzy(ii, jjm)
247         zxtzy(ii, jjm + 1)=zxtzy(ii, jjm)         zytzy(ii, 1) = zytzy(ii, 2)
248         zytzy(ii, 1)=zytzy(ii, 2)         zytzy(ii, jjm + 1) = zytzy(ii, jjm)
249         zytzy(ii, jjm + 1)=zytzy(ii, jjm)      ENDDO
250      ENDDO  
251        zmea0 = zmea ! not smoothed
252      !  FILTERS TO SMOOTH OUT FIELDS FOR INPUT INTO SSO SCHEME.  
253        ! Filters to smooth out fields for input into subgrid-scale
254      !  FIRST FILTER, MOVING AVERAGE OVER 9 POINTS.      ! orographic scheme.
255    
256      CALL MVA9(zmea, iim+1, jjm+1)      ! First filter, moving average over 9 points.
257      CALL MVA9(zstd, iim+1, jjm+1)      CALL MVA9(zmea)
258      CALL MVA9(zpic, iim+1, jjm+1)      CALL MVA9(zstd)
259      CALL MVA9(zval, iim+1, jjm+1)      CALL MVA9(zpic)
260      CALL MVA9(zxtzx, iim+1, jjm+1)      CALL MVA9(zval)
261      CALL MVA9(zxtzy, iim+1, jjm+1)      CALL MVA9(zxtzx)
262      CALL MVA9(zytzy, iim+1, jjm+1)      CALL MVA9(zxtzy)
263        CALL MVA9(zytzy)
264      ! Masque prenant en compte maximum de terre  
265      ! On seuil a 10% de terre de terre car en dessous les parametres      ! Masque prenant en compte maximum de terre. On met un seuil à 10
266      ! de surface n'ont pas de sens (PB)      ! % de terre car en dessous les paramètres de surface n'ont pas de
267      mask_tmp= 0.      ! sens.
268      WHERE (mask >= 0.1) mask_tmp = 1.      mask_tmp = merge(1., 0., mask >= 0.1)
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.le.xw) xp = 0.
280               if(xp.le.xw) xp=0.            if(xq.le.xw) xq = xw
281               if(xq.le.xw) xq=xw            if(abs(xm).le.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)            zphi(ii, jj) = zmea0(ii, jj) * mask_tmp(ii, jj)
290               zphi(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)            zmea(ii, jj) = zmea(ii, jj) * mask_tmp(ii, jj)
291               zmea(ii, jj)=zmea(ii, jj)*mask_tmp(ii, jj)            zpic(ii, jj) = zpic(ii, jj) * mask_tmp(ii, jj)
292               zpic(ii, jj)=zpic(ii, jj)*mask_tmp(ii, jj)            zval(ii, jj) = zval(ii, jj) * mask_tmp(ii, jj)
293               zval(ii, jj)=zval(ii, jj)*mask_tmp(ii, jj)            zstd(ii, jj) = zstd(ii, jj) * mask_tmp(ii, jj)
294               zstd(ii, jj)=zstd(ii, jj)*mask_tmp(ii, jj)            zllmmea = MAX(zmea(ii, jj), zllmmea)
295            ENDIF            zllmstd = MAX(zstd(ii, jj), zllmstd)
296            zllmmea=AMAX1(zmea(ii, jj), zllmmea)            zllmsig = MAX(zsig(ii, jj), zllmsig)
297            zllmstd=AMAX1(zstd(ii, jj), zllmstd)            zllmgam = MAX(zgam(ii, jj), zllmgam)
298            zllmsig=AMAX1(zsig(ii, jj), zllmsig)            zllmthe = MAX(zthe(ii, jj), zllmthe)
299            zllmgam=AMAX1(zgam(ii, jj), zllmgam)            zminthe = min(zthe(ii, jj), zminthe)
300            zllmthe=AMAX1(zthe(ii, jj), zllmthe)            zllmpic = MAX(zpic(ii, jj), zllmpic)
301            zminthe=amin1(zthe(ii, jj), zminthe)            zllmval = MAX(zval(ii, jj), zllmval)
           zllmpic=AMAX1(zpic(ii, jj), zllmpic)  
           zllmval=AMAX1(zval(ii, jj), zllmval)  
302         ENDDO         ENDDO
303      ENDDO      ENDDO
304    
305      print *, 'MEAN ORO: ', zllmmea      print *, 'MEAN ORO: ', zllmmea
306      print *, 'ST. DEV.: ', zllmstd      print *, 'ST. DEV.: ', zllmstd
307      print *, 'PENTE: ', zllmsig      print *, 'PENTE: ', zllmsig
# Line 331  contains Line 310  contains
310      print *, 'pic: ', zllmpic      print *, 'pic: ', zllmpic
311      print *, 'val: ', zllmval      print *, 'val: ', zllmval
312    
313      ! gamma and theta a 1. and 0. at poles      ! gamma and theta at 1. and 0. at poles
314      zmea(iim+1, :)=zmea(1, :)      zmea(iim + 1, :) = zmea(1, :)
315      zphi(iim+1, :)=zphi(1, :)      zphi(iim + 1, :) = zphi(1, :)
316      zpic(iim+1, :)=zpic(1, :)      zpic(iim + 1, :) = zpic(1, :)
317      zval(iim+1, :)=zval(1, :)      zval(iim + 1, :) = zval(1, :)
318      zstd(iim+1, :)=zstd(1, :)      zstd(iim + 1, :) = zstd(1, :)
319      zsig(iim+1, :)=zsig(1, :)      zsig(iim + 1, :) = zsig(1, :)
320      zgam(iim+1, :)=zgam(1, :)      zgam(iim + 1, :) = zgam(1, :)
321      zthe(iim+1, :)=zthe(1, :)      zthe(iim + 1, :) = zthe(1, :)
322    
323      zmeanor=0.      zmeanor = 0.
324      zmeasud=0.      zmeasud = 0.
325      zstdnor=0.      zstdnor = 0.
326      zstdsud=0.      zstdsud = 0.
327      zsignor=0.      zsignor = 0.
328      zsigsud=0.      zsigsud = 0.
329      zweinor=0.      zweinor = 0.
330      zweisud=0.      zweisud = 0.
331      zpicnor=0.      zpicnor = 0.
332      zpicsud=0.                                        zpicsud = 0.
333      zvalnor=0.      zvalnor = 0.
334      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  
   
     zphi(:,   1)=zmeanor/zweinor  
     zphi(:, jjm + 1)=zmeasud/zweisud  
   
     zpic(:,   1)=zpicnor/zweinor  
     zpic(:, jjm + 1)=zpicsud/zweisud  
335    
336      zval(:,   1)=zvalnor/zweinor      DO ii = 1, iim
337      zval(:, jjm + 1)=zvalsud/zweisud         zweinor = zweinor + weight(ii, 1)
338           zweisud = zweisud + weight(ii, jjm + 1)
339      zstd(:,   1)=zstdnor/zweinor         zmeanor = zmeanor + zmea(ii, 1) * weight(ii, 1)
340      zstd(:, jjm + 1)=zstdsud/zweisud         zmeasud = zmeasud + zmea(ii, jjm + 1) * weight(ii, jjm + 1)
341           zstdnor = zstdnor + zstd(ii, 1) * weight(ii, 1)
342           zstdsud = zstdsud + zstd(ii, jjm + 1) * weight(ii, jjm + 1)
343           zsignor = zsignor + zsig(ii, 1) * weight(ii, 1)
344           zsigsud = zsigsud + zsig(ii, jjm + 1) * weight(ii, jjm + 1)
345           zpicnor = zpicnor + zpic(ii, 1) * weight(ii, 1)
346           zpicsud = zpicsud + zpic(ii, jjm + 1) * weight(ii, jjm + 1)
347           zvalnor = zvalnor + zval(ii, 1) * weight(ii, 1)
348           zvalsud = zvalsud + zval(ii, jjm + 1) * weight(ii, jjm + 1)
349        ENDDO
350    
351        zmea(:, 1) = zmeanor / zweinor
352        zmea(:, jjm + 1) = zmeasud / zweisud
353    
354        zphi(:, 1) = zmeanor / zweinor
355        zphi(:, jjm + 1) = zmeasud / zweisud
356    
357        zpic(:, 1) = zpicnor / zweinor
358        zpic(:, jjm + 1) = zpicsud / zweisud
359    
360        zval(:, 1) = zvalnor / zweinor
361        zval(:, jjm + 1) = zvalsud / zweisud
362    
363        zstd(:, 1) = zstdnor / zweinor
364        zstd(:, jjm + 1) = zstdsud / zweisud
365    
366      zsig(:,   1)=zsignor/zweinor      zsig(:, 1) = zsignor / zweinor
367      zsig(:, jjm + 1)=zsigsud/zweisud      zsig(:, jjm + 1) = zsigsud / zweisud
368    
369      zgam(:,   1)=1.      zgam(:, 1) = 1.
370      zgam(:, jjm + 1)=1.      zgam(:, jjm + 1) = 1.
371    
372      zthe(:,   1)=0.      zthe(:, 1) = 0.
373      zthe(:, jjm + 1)=0.      zthe(:, jjm + 1) = 0.
374    
375    END SUBROUTINE grid_noro    END SUBROUTINE grid_noro
376    
   !******************************************  
   
   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  
   
377  end module grid_noro_m  end module grid_noro_m

Legend:
Removed from v.40  
changed lines
  Added in v.134

  ViewVC Help
Powered by ViewVC 1.1.21