source: trunk/LMDZ.VENUS/libf/phyvenus/grid_noro.F @ 937

Last change on this file since 937 was 808, checked in by slebonnois, 12 years ago

SL: Many changes for VENUS (related to newstart) and TITAN (related to clouds). Please read DOC/chantiers/commit_importants.log (cf v808).

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