source: trunk/LMDZ.COMMON/libf/dynphy_lonlat/phyvenus/grid_noro.F @ 3553

Last change on this file since 3553 was 1638, checked in by slebonnois, 8 years ago

SL: corrections for Venus newstart

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