source: LMDZ.3.3/tags/IPSL-CM4_v1/libf/dyn3d/grid_noro.F @ 402

Last change on this file since 402 was 402, checked in by (none), 22 years ago

This commit was manufactured by cvs2svn to create tag 'IPSL-CM4_v1'.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.1 KB
Line 
1c
2c $Header$
3c
4      SUBROUTINE grid_noro(imdep, jmdep, xdata, ydata, zdata,
5     .             imar, jmar, x, y,
6     .             zphi,zmea,zstd,zsig,zgam,zthe,
7     .             zpic,zval,mask)
8c=======================================================================
9c (F. Lott) (voir aussi z.x. Li, A. Harzallah et L. Fairhead)
10c
11c      Compute the Parameters of the SSO scheme as described in
12c      LOTT & MILLER (1997) and LOTT(1999).
13c      Target points are on a rectangular grid:
14c      iim+1 latitudes including North and South Poles;
15c      jjm+1 longitudes, with periodicity jjm+1=1.
16c      aux poles.  At the poles the fields value is repeated
17c      jjm+1 time.
18c      The parameters a,b,c,d represent the limite of the target
19c      gridpoint region. The means over this region are calculated
20c      from USN data, ponderated by a weight proportional to the
21c      surface occupated by the data inside the model gridpoint area.
22c      In most circumstances, this weight is the ratio between the
23c      surface of the USN gridpoint area and the surface of the
24c      model gridpoint area.
25c
26c           (c)
27c        ----d-----
28c        | . . . .|
29c        |        |
30c     (b)a . * . .b(a)
31c        |        |
32c        | . . . .|
33c        ----c-----
34c           (d)
35C=======================================================================
36c INPUT:
37c        imdep, jmdep: dimensions X and Y input field
38c        xdata, ydata: coordinates X and Y input field
39c        zdata: Input field
40c        In this version it is assumed that the entry data come from
41c        the USNavy dataset: imdep=iusn=2160, jmdep=jusn=1080.
42c OUTPUT:
43c        imar, jmar: dimensions X and Y Output field
44c        x, y: ccordinates  X and Y Output field.
45c             zmea:  Mean orographie   
46c             zstd:  Standard deviation
47c             zsig:  Slope
48c             zgam:  Anisotropy
49c             zthe:  Orientation of the small axis
50c             zpic:  Maximum altitude
51c             zval:  Minimum altitude
52C=======================================================================
53      IMPLICIT INTEGER (I,J)
54      IMPLICIT REAL(X,Z)
55     
56          parameter(iusn=2160,jusn=1080,iext=216, epsfra = 1.e-5)
57#include "dimensions.h"
58          REAL xusn(iusn+2*iext),yusn(jusn+2)   
59      REAL zusn(iusn+2*iext,jusn+2)
60
61      INTEGER imdep, jmdep
62      REAL xdata(imdep),ydata(jmdep)
63      REAL zdata(imdep,jmdep)
64c
65      INTEGER imar, jmar
66 
67C INTERMEDIATE FIELDS  (CORRELATIONS OF OROGRAPHY GRADIENT)
68
69      REAL ztz(iim+1,jjm+1),zxtzx(iim+1,jjm+1)
70      REAL zytzy(iim+1,jjm+1),zxtzy(iim+1,jjm+1)
71      REAL weight(iim+1,jjm+1)
72
73C CORRELATIONS OF USN OROGRAPHY GRADIENTS
74
75      REAL zxtzxusn(iusn+2*iext,jusn+2),zytzyusn(iusn+2*iext,jusn+2)
76      REAL zxtzyusn(iusn+2*iext,jusn+2)
77      REAL x(imar+1),y(jmar),zphi(imar+1,jmar)
78      REAL zmea(imar+1,jmar),zstd(imar+1,jmar)
79      REAL zsig(imar+1,jmar),zgam(imar+1,jmar),zthe(imar+1,jmar)
80      REAL zpic(imar+1,jmar),zval(imar+1,jmar)
81c$$$ PB     integer mask(imar+1,jmar)
82      real mask(imar+1,jmar), mask_tmp(imar+1,jmar)
83      real num_tot(2200,1100),num_lan(2200,1100)
84c
85      REAL a(2200),b(2200),c(1100),d(1100)
86      logical masque_lu
87c
88      print *,' parametres de l orographie a l echelle sous maille'
89      xpi=acos(-1.)
90      rad    = 6 371 229.
91      zdeltay=2.*xpi/float(jusn)*rad
92c
93c utilise-t'on un masque lu?
94c
95      masque_lu = .true.
96      if (maxval(mask) == -99999 .and. minval(mask) == -99999) then
97        masque_lu= .false.
98        masque = 0.0
99      endif
100      write(*,*)'Masque lu', masque_lu
101c
102c  quelques tests de dimensions:
103c   
104c
105      if(iim.ne.imar) STOP 'Problem dim. x'
106      if(jjm.ne.jmar-1) STOP 'Problem dim. y'
107      IF (imar.GT.2200 .OR. jmar.GT.1100) THEN
108         PRINT*, 'imar or jmar too big', imar, jmar
109         CALL ABORT
110      ENDIF
111
112      IF(imdep.ne.iusn.or.jmdep.ne.jusn)then
113         print *,' imdep or jmdep bad dimensions:',imdep,jmdep
114         call abort
115      ENDIF
116
117      IF(imar+1.ne.iim+1.or.jmar.ne.jjm+1)THEN
118        print *,' imar or jmar bad dimensions:',imar,jmar
119        call abort
120      ENDIF
121
122
123c      print *,'xdata:',xdata
124c      print *,'ydata:',ydata
125c      print *,'x:',x
126c      print *,'y:',y
127c
128C  EXTENSION OF THE USN DATABASE TO POCEED COMPUTATIONS AT
129C  BOUNDARIES:
130c
131      DO j=1,jusn
132        yusn(j+1)=ydata(j)
133      DO i=1,iusn
134        zusn(i+iext,j+1)=zdata(i,j)
135        xusn(i+iext)=xdata(i)
136      ENDDO
137      DO i=1,iext
138        zusn(i,j+1)=zdata(iusn-iext+i,j)
139        xusn(i)=xdata(iusn-iext+i)-2.*xpi
140        zusn(iusn+iext+i,j+1)=zdata(i,j)
141        xusn(iusn+iext+i)=xdata(i)+2.*xpi
142      ENDDO
143      ENDDO
144
145        yusn(1)=ydata(1)+(ydata(1)-ydata(2))
146        yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))
147       DO i=1,iusn/2+iext
148        zusn(i,1)=zusn(i+iusn/2,2)
149        zusn(i+iusn/2+iext,1)=zusn(i,2)
150        zusn(i,jusn+2)=zusn(i+iusn/2,jusn+1)
151        zusn(i+iusn/2+iext,jusn+2)=zusn(i,jusn+1)
152       ENDDO
153
154c COMPUTE LIMITS OF MODEL GRIDPOINT AREA
155C     ( REGULAR GRID)
156c
157      a(1) = x(1) - (x(2)-x(1))/2.0
158      b(1) = (x(1)+x(2))/2.0
159      DO i = 2, imar
160         a(i) = b(i-1)
161         b(i) = (x(i)+x(i+1))/2.0
162      ENDDO
163      a(imar+1) = b(imar)
164      b(imar+1) = x(imar+1) + (x(imar+1)-x(imar))/2.0
165
166      c(1) = y(1) - (y(2)-y(1))/2.0
167      d(1) = (y(1)+y(2))/2.0
168      DO j = 2, jmar-1
169         c(j) = d(j-1)
170         d(j) = (y(j)+y(j+1))/2.0
171      ENDDO
172      c(jmar) = d(jmar-1)
173      d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
174c
175c  initialisations:
176c
177      DO i = 1, imar+1
178      DO j = 1, jmar
179         weight(i,j) = 0.0
180         zxtzx(i,j)  = 0.0
181         zytzy(i,j)  = 0.0
182         zxtzy(i,j)  = 0.0
183         ztz(i,j)    = 0.0
184         zmea(i,j)   = 0.0
185         zpic(i,j)  =-1.E+10
186         zval(i,j)  = 1.E+10
187      ENDDO
188      ENDDO
189c
190c  COMPUTE SLOPES CORRELATIONS ON USN GRID
191c
192         DO j = 1,jusn+2
193         DO i = 1, iusn+2*iext
194            zytzyusn(i,j)=0.0
195            zxtzxusn(i,j)=0.0
196            zxtzyusn(i,j)=0.0
197         ENDDO
198         ENDDO
199
200
201         DO j = 2,jusn+1
202            zdeltax=zdeltay*cos(yusn(j))
203         DO i = 2, iusn+2*iext-1
204            zytzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))**2/zdeltay**2
205            zxtzxusn(i,j)=(zusn(i+1,j)-zusn(i-1,j))**2/zdeltax**2
206            zxtzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))/zdeltay
207     *                   *(zusn(i+1,j)-zusn(i-1,j))/zdeltax
208         ENDDO
209         ENDDO
210c
211c  SUMMATION OVER GRIDPOINT AREA
212c
213      zleny=xpi/float(jusn)*rad
214      xincr=xpi/2./float(jusn)
215       DO ii = 1, imar+1
216       DO jj = 1, jmar
217       num_tot(ii,jj)=0.
218       num_lan(ii,jj)=0.
219c        PRINT *,' iteration ii jj:',ii,jj
220         DO j = 2,jusn+1
221c         DO j = 3,jusn
222            zlenx=zleny*cos(yusn(j))
223            zdeltax=zdeltay*cos(yusn(j))
224            zbordnor=(c(jj)-yusn(j)+xincr)*rad
225            zbordsud=(yusn(j)-d(jj)+xincr)*rad
226            weighy=AMAX1(0.,
227     *             amin1(zbordnor,zbordsud,zleny))
228         IF(weighy.ne.0)THEN
229         DO i = 2, iusn+2*iext-1
230            zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))
231            zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))
232            weighx=AMAX1(0.,
233     *             amin1(zbordest,zbordoue,zlenx))
234            IF(weighx.ne.0)THEN
235            num_tot(ii,jj)=num_tot(ii,jj)+1.0
236            if(zusn(i,j).ge.1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
237            weight(ii,jj)=weight(ii,jj)+weighx*weighy
238            zxtzx(ii,jj)=zxtzx(ii,jj)+zxtzxusn(i,j)*weighx*weighy
239            zytzy(ii,jj)=zytzy(ii,jj)+zytzyusn(i,j)*weighx*weighy
240            zxtzy(ii,jj)=zxtzy(ii,jj)+zxtzyusn(i,j)*weighx*weighy
241            ztz(ii,jj)  =ztz(ii,jj)  +zusn(i,j)*zusn(i,j)*weighx*weighy
242c mean
243            zmea(ii,jj) =zmea(ii,jj)+zusn(i,j)*weighx*weighy
244c peacks
245            zpic(ii,jj)=amax1(zpic(ii,jj),zusn(i,j))
246c valleys
247            zval(ii,jj)=amin1(zval(ii,jj),zusn(i,j))
248            ENDIF
249         ENDDO
250         ENDIF
251         ENDDO
252       ENDDO
253       ENDDO
254c
255c  COMPUTE PARAMETERS NEEDED BY THE LOTT & MILLER (1997) AND
256C  LOTT (1999) SSO SCHEME.
257c
258      zllmmea=0.
259      zllmstd=0.
260      zllmsig=0.
261      zllmgam=0.
262      zllmpic=0.
263      zllmval=0.
264      zllmthe=0.
265      zminthe=0.
266c     print 100,' '
267c100  format(1X,A1,'II JJ',4X,'H',8X,'SD',8X,'SI',3X,'GA',3X,'TH')
268       DO ii = 1, imar+1
269       DO jj = 1, jmar
270         IF (weight(ii,jj) .NE. 0.0) THEN
271c  Mask
272c$$$           if(num_lan(ii,jj)/num_tot(ii,jj).ge.0.5)then
273c$$$             mask(ii,jj)=1
274c$$$           else
275c$$$             mask(ii,jj)=0
276c$$$           ENDIF
277             if (.not. masque_lu) then
278               mask(ii,jj) = num_lan(ii,jj)/num_tot(ii,jj)
279             endif
280c  Mean Orography:
281           zmea (ii,jj)=zmea (ii,jj)/weight(ii,jj)
282           zxtzx(ii,jj)=zxtzx(ii,jj)/weight(ii,jj)
283           zytzy(ii,jj)=zytzy(ii,jj)/weight(ii,jj)
284           zxtzy(ii,jj)=zxtzy(ii,jj)/weight(ii,jj)
285           ztz(ii,jj)  =ztz(ii,jj)/weight(ii,jj)
286c  Standard deviation:
287           zstd(ii,jj)=sqrt(AMAX1(0.,ztz(ii,jj)-zmea(ii,jj)**2))
288         ELSE
289            PRINT*, 'probleme,ii,jj=', ii,jj
290         ENDIF
291       ENDDO
292       ENDDO
293
294C CORRECT VALUES OF HORIZONTAL SLOPE NEAR THE POLES:
295
296       DO ii = 1, imar+1
297         zxtzx(ii,1)=zxtzx(ii,2)
298         zxtzx(ii,jmar)=zxtzx(ii,jmar-1)
299         zxtzy(ii,1)=zxtzy(ii,2)
300         zxtzy(ii,jmar)=zxtzy(ii,jmar-1)
301         zytzy(ii,1)=zytzy(ii,2)
302         zytzy(ii,jmar)=zytzy(ii,jmar-1)
303       ENDDO
304
305C  FILTERS TO SMOOTH OUT FIELDS FOR INPUT INTO SSO SCHEME.
306
307C  FIRST FILTER, MOVING AVERAGE OVER 9 POINTS.
308
309       CALL MVA9(zmea,iim+1,jjm+1)
310       CALL MVA9(zstd,iim+1,jjm+1)
311       CALL MVA9(zpic,iim+1,jjm+1)
312       CALL MVA9(zval,iim+1,jjm+1)
313       CALL MVA9(zxtzx,iim+1,jjm+1)
314       CALL MVA9(zxtzy,iim+1,jjm+1)
315       CALL MVA9(zytzy,iim+1,jjm+1)
316C$$$   Masque prenant en compte maximum de terre
317       mask_tmp= 0.0
318       WHERE(mask .GE. epsfra) mask_tmp = 1.
319
320       DO ii = 1, imar
321       DO jj = 1, jmar
322         IF (weight(ii,jj) .NE. 0.0) THEN
323c  Coefficients K, L et M:
324           xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
325           xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
326           xm=zxtzy(ii,jj)
327           xp=xk-sqrt(xl**2+xm**2)
328           xq=xk+sqrt(xl**2+xm**2)
329           xw=1.e-8
330           if(xp.le.xw) xp=0.
331           if(xq.le.xw) xq=xw
332           if(abs(xm).le.xw) xm=xw*sign(1.,xm)
333c slope:
334c$$$           zsig(ii,jj)=sqrt(xq)*mask(ii,jj)
335c$$$c isotropy:
336c$$$           zgam(ii,jj)=xp/xq*mask(ii,jj)
337c$$$c angle theta:
338c$$$           zthe(ii,jj)=57.29577951*atan2(xm,xl)/2.*mask(ii,jj)
339c$$$           zphi(ii,jj)=zmea(ii,jj)*mask(ii,jj)
340c$$$           zmea(ii,jj)=zmea(ii,jj)*mask(ii,jj)
341c$$$           zpic(ii,jj)=zpic(ii,jj)*mask(ii,jj)
342c$$$           zval(ii,jj)=zval(ii,jj)*mask(ii,jj)
343c$$$           zstd(ii,jj)=zstd(ii,jj)*mask(ii,jj)
344C$$* PB modif pour maque de terre fractionnaire
345c slope:
346           zsig(ii,jj)=sqrt(xq)*mask_tmp(ii,jj)
347c isotropy:
348           zgam(ii,jj)=xp/xq*mask_tmp(ii,jj)
349c angle theta:
350           zthe(ii,jj)=57.29577951*atan2(xm,xl)/2.*mask_tmp(ii,jj)
351           zphi(ii,jj)=zmea(ii,jj)*mask_tmp(ii,jj)
352           zmea(ii,jj)=zmea(ii,jj)*mask_tmp(ii,jj)
353           zpic(ii,jj)=zpic(ii,jj)*mask_tmp(ii,jj)
354           zval(ii,jj)=zval(ii,jj)*mask_tmp(ii,jj)
355           zstd(ii,jj)=zstd(ii,jj)*mask_tmp(ii,jj)
356c          print 101,ii,jj,
357c    *           zmea(ii,jj),zstd(ii,jj),zsig(ii,jj),zgam(ii,jj),
358c    *           zthe(ii,jj)
359c101  format(1x,2(1x,i2),2(1x,f7.1),1x,f7.4,2x,f4.2,1x,f5.1)     
360         ELSE
361c           PRINT*, 'probleme,ii,jj=', ii,jj
362         ENDIF
363      zllmmea=AMAX1(zmea(ii,jj),zllmmea)
364      zllmstd=AMAX1(zstd(ii,jj),zllmstd)
365      zllmsig=AMAX1(zsig(ii,jj),zllmsig)
366      zllmgam=AMAX1(zgam(ii,jj),zllmgam)
367      zllmthe=AMAX1(zthe(ii,jj),zllmthe)
368      zminthe=amin1(zthe(ii,jj),zminthe)
369      zllmpic=AMAX1(zpic(ii,jj),zllmpic)
370      zllmval=AMAX1(zval(ii,jj),zllmval)
371       ENDDO
372       ENDDO
373      print *,'  MEAN ORO:',zllmmea
374      print *,'  ST. DEV.:',zllmstd
375      print *,'  PENTE:',zllmsig
376      print *,' ANISOTROP:',zllmgam
377      print *,'  ANGLE:',zminthe,zllmthe       
378      print *,'  pic:',zllmpic
379      print *,'  val:',zllmval
380     
381C
382c gamma and theta a 1. and 0. at poles
383c
384      DO jj=1,jmar
385      zmea(imar+1,jj)=zmea(1,jj)
386      zphi(imar+1,jj)=zphi(1,jj)
387      zpic(imar+1,jj)=zpic(1,jj)
388      zval(imar+1,jj)=zval(1,jj)
389      zstd(imar+1,jj)=zstd(1,jj)
390      zsig(imar+1,jj)=zsig(1,jj)
391      zgam(imar+1,jj)=zgam(1,jj)
392      zthe(imar+1,jj)=zthe(1,jj)
393      ENDDO
394
395
396      zmeanor=0.0
397      zmeasud=0.0
398      zstdnor=0.0
399      zstdsud=0.0
400      zsignor=0.0
401      zsigsud=0.0
402      zweinor=0.0
403      zweisud=0.0
404      zpicnor=0.0
405      zpicsud=0.0                                   
406      zvalnor=0.0
407      zvalsud=0.0
408
409      DO ii=1,imar
410      zweinor=zweinor+              weight(ii,   1)
411      zweisud=zweisud+              weight(ii,jmar)
412      zmeanor=zmeanor+zmea(ii,   1)*weight(ii,   1)
413      zmeasud=zmeasud+zmea(ii,jmar)*weight(ii,jmar)
414      zstdnor=zstdnor+zstd(ii,   1)*weight(ii,   1)
415      zstdsud=zstdsud+zstd(ii,jmar)*weight(ii,jmar)
416      zsignor=zsignor+zsig(ii,   1)*weight(ii,   1)
417      zsigsud=zsigsud+zsig(ii,jmar)*weight(ii,jmar)
418      zpicnor=zpicnor+zpic(ii,   1)*weight(ii,   1)
419      zpicsud=zpicsud+zpic(ii,jmar)*weight(ii,jmar)
420      zvalnor=zvalnor+zval(ii,   1)*weight(ii,   1)
421      zvalsud=zvalsud+zval(ii,jmar)*weight(ii,jmar)
422      ENDDO
423
424      DO ii=1,imar+1
425      zmea(ii,   1)=zmeanor/zweinor
426      zmea(ii,jmar)=zmeasud/zweisud
427      zphi(ii,   1)=zmeanor/zweinor
428      zphi(ii,jmar)=zmeasud/zweisud
429      zpic(ii,   1)=zpicnor/zweinor
430      zpic(ii,jmar)=zpicsud/zweisud
431      zval(ii,   1)=zvalnor/zweinor
432      zval(ii,jmar)=zvalsud/zweisud
433      zstd(ii,   1)=zstdnor/zweinor
434      zstd(ii,jmar)=zstdsud/zweisud
435      zsig(ii,   1)=zsignor/zweinor
436      zsig(ii,jmar)=zsigsud/zweisud
437      zgam(ii,   1)=1.
438      zgam(ii,jmar)=1.
439      zthe(ii,   1)=0.
440      zthe(ii,jmar)=0.
441      ENDDO
442
443      RETURN
444      END
445
446      SUBROUTINE MVA9(X,IMAR,JMAR)
447
448C MAKE A MOVING AVERAGE OVER 9 GRIDPOINTS OF THE X FIELDS
449
450      PARAMETER (ISMo=300,JSMo=200)
451      REAL X(IMAR,JMAR),XF(ISMo,JSMo)
452      real WEIGHTpb(-1:1,-1:1)
453
454      if(imar.gt.ismo) stop'surdimensionner ismo dans mva9 (grid_noro)'
455      if(jmar.gt.jsmo) stop'surdimensionner jsmo dans mva9 (grid_noro)'
456     
457      SUM=0.
458      DO IS=-1,1
459        DO JS=-1,1
460          WEIGHTpb(IS,JS)=1./FLOAT((1+IS**2)*(1+JS**2))
461          SUM=SUM+WEIGHTpb(IS,JS)
462        ENDDO
463      ENDDO
464     
465c     WRITE(*,*) 'MVA9 ', IMAR, JMAR
466c     WRITE(*,*) 'MVA9 ', WEIGHTpb
467c     WRITE(*,*) 'MVA9 SUM ', SUM
468      DO IS=-1,1
469        DO JS=-1,1
470          WEIGHTpb(IS,JS)=WEIGHTpb(IS,JS)/SUM
471        ENDDO
472      ENDDO
473
474      DO J=2,JMAR-1
475        DO I=2,IMAR-1
476          XF(I,J)=0.
477          DO IS=-1,1
478            DO JS=-1,1
479              XF(I,J)=XF(I,J)+X(I+IS,J+JS)*WEIGHTpb(IS,JS)
480            ENDDO
481          ENDDO
482        ENDDO
483      ENDDO
484
485      DO J=2,JMAR-1
486        XF(1,J)=0.
487        IS=IMAR-1
488        DO JS=-1,1
489          XF(1,J)=XF(1,J)+X(IS,J+JS)*WEIGHTpb(-1,JS)
490        ENDDO
491        DO IS=0,1
492          DO JS=-1,1
493            XF(1,J)=XF(1,J)+X(1+IS,J+JS)*WEIGHTpb(IS,JS)
494          ENDDO
495        ENDDO
496        XF(IMAR,J)=XF(1,J)
497      ENDDO
498
499      DO I=1,IMAR
500        XF(I,1)=XF(I,2)
501        XF(I,JMAR)=XF(I,JMAR-1)
502      ENDDO
503
504      DO I=1,IMAR
505        DO J=1,JMAR
506          X(I,J)=XF(I,J)
507        ENDDO
508      ENDDO
509
510      RETURN
511      END
512
513
514
Note: See TracBrowser for help on using the repository browser.