source: trunk/LMDZ.PLUTO/libf/dynphy_lonlat/phypluto/grid_noro1.F @ 3970

Last change on this file since 3970 was 3878, checked in by tbertrand, 5 months ago

LMDZ.PLUTO:
For newstart : reading in the intial albedo map and the new topography map
TB

File size: 13.0 KB
Line 
1      SUBROUTINE grid_noro1(imdep, jmdep, xdata, ydata, entree,
2     .                 imar, jmar, x, y, zmea,zstd,zsig,zgam,zthe)
3c=======================================================================
4c (F. Lott) (voir aussi z.x. Li, A. Harzallah et L. Fairhead)
5c
6c      Calcul des parametres de l'orographie sous-maille necessaires
7c      au nouveau shema de representation des montagnes meso-echelles
8c      dans le modele.  Les points sont mis sur une grille rectangulaire
9c      pseudo-physique.  Typiquement, il y a iim+1 latitudes incluant
10c      le pole nord et le pole sud.  Il y a jjm+1 longitudes, y compris
11c      aux poles.  Aux poles les champs peuvent ont une valeurs repetee
12c      jjm+1 fois.....  La valeur du champs en jjm+1 (jmar) est celle
13c      en j=1. 
14c      Les parametres a,b,c,d representent les limites de la region
15c      de point de grille correspondant a un point decrit precedemment.
16c      Les moyennes sur ces regions des valeurs calculees a partir de
17c      l'USN, sont ponderees par un poids, fonction de la surface
18c      occuppe par ces donnees a l'interieure de la grille du modele.
19c      Dans la plupart des cas ce poid est le rapport entre la surface
20c      de la region de point de grille USN et la surface de la region
21c      de point de grille du modele.
22c       
23c
24c           (c)
25c        ----d-----
26c        | . . . .|
27c        |        |
28c     (b)a . * . .b(a)
29c        |        |
30c        | . . . .|
31c        ----c-----
32c           (d)
33C=======================================================================
34c INPUT:
35c        imdep, jmdep: dimensions X et Y pour depart
36c        xdata, ydata: coordonnees X et Y pour depart
37c        entree: champ d'entree a transformer
38c        dans ce programme, on assume que les donnees sont les altitudes
39c        de l'USNavy: imdep=iusn=2160, jmdep=jusn=1080.
40c OUTPUT:
41c        imar, jmar: dimensions X et Y d'arrivee
42c        x, y: coordonnees X et Y d'arrivee
43c        les champs de sorties sont sur une grille physique:
44c             zmea:  orographie moyenne
45c             zstd:  deviation standard de l'orographie sous-maille
46c             zsig:  pente de l'orographie sous-maille
47c             zgam:  anisotropy de l'orographie sous maille
48c             zthe:  orientation de l'axe oriente dans la direction
49c                    de plus grande pente de l'orographie sous maille
50C=======================================================================
51c     IMPLICIT INTEGER (I,J)
52c     IMPLICIT REAL(X,Z)
53
54       USE comconst_mod, ONLY: rad
55
56       implicit none
57       integer iusn,jusn,iext
58       !parameter(iusn=1440,jusn=720,iext=40)
59       parameter(iusn=360,jusn=180,iext=40)
60c!-*-      include 'param1'
61c!-*-      include 'comcstfi.h'
62#include "dimensions.h"
63c!-*-
64c!-*-      parameter(iim=cols,jjm=rows)
65      REAL xusn(iusn+2*iext),yusn(jusn+2)       
66      REAL zusn(iusn+2*iext,jusn+2),zusnfi(iusn+2*iext,jusn+2)
67
68c   modif declarations pour implicit none
69      real zmeanor,zmeasud,zstdnor,zstdsud,zsignor
70      real zsigsud,zweinor,zweisud
71      real xk,xl,xm,xw,xp,xq
72      real zmaxmea,zmaxstd,zmaxsig,zmaxgam,zmaxthe,zminthe
73      real zbordnor,zbordsud,zbordest,zbordoue,xpi
74      real zdeltax,zdeltay,zlenx,zleny,weighx,weighy,xincr
75      integer i,j,ii,jj,ideltax,ihalph
76
77      INTEGER imdep, jmdep
78      REAL xdata(imdep),ydata(jmdep)
79      REAL entree(imdep,jmdep)
80c
81      INTEGER imar, jmar
82 
83      REAL ztz(iim+1,jjm+1),zxtzx(iim+1,jjm+1)
84      REAL zytzy(iim+1,jjm+1),zxtzy(iim+1,jjm+1)
85      REAL zxtzxusn(iusn+2*iext,jusn+2),zytzyusn(iusn+2*iext,jusn+2)
86      REAL zxtzyusn(iusn+2*iext,jusn+2)
87      REAL weight(iim+1,jjm+1)
88      REAL x(imar+1),y(jmar)
89      REAL zmea(imar+1,jmar),zstd(imar+1,jmar)
90      REAL zsig(imar+1,jmar),zgam(imar+1,jmar),zthe(imar+1,jmar)
91c
92      REAL a(2200),b(2200),c(1100),d(1100)
93c
94c  quelques constantes:
95c
96      print *,' parametres de l orographie a l echelle sous maille'
97      print*,'rad =',rad
98      print*,'Long et lat entree'
99      print*,(x(i),i=1,imar+1)
100      print*,(y(j),j=1,jmar)
101       print*,'Long et lat donnees'
102      print*,(xdata(i),i=1,imdep)
103      print*,(ydata(j),j=1,jmdep)
104
105      xpi=acos(-1.)
106      zdeltay=2.*xpi/float(jusn)*rad
107c
108c  quelques tests de dimensions:
109c   
110      IF (imar.GT.2200 .OR. jmar.GT.1100) THEN
111         PRINT*, 'imar ou jmar trop grand', imar, jmar
112         CALL ABORT
113      ENDIF
114
115      IF(imdep.ne.iusn.or.jmdep.ne.jusn)then
116         print *,' imdep ou jmdep mal dimensionnes:',imdep,jmdep,
117     &                    iusn,jusn
118         call abort
119      ENDIF
120
121      IF(imar+1.gt.iim+1.or.jmar.gt.jjm+1)THEN
122        print *,' imar ou jmar mal dimensionnes:',imar,jmar
123        call abort
124      ENDIF
125c
126C  Extension de la base de donnee de l'USN pour faciliter
127C  les calculs ulterieurs:
128c
129      DO j=1,jusn
130        yusn(j+1)=ydata(j)
131      DO i=1,iusn
132        zusn(i+iext,j+1)=entree(i,j)
133        xusn(i+iext)=xdata(i)
134      ENDDO
135      DO i=1,iext
136        zusn(i,j+1)=entree(iusn-iext+i,j)
137        xusn(i)=xdata(iusn-iext+i)-2.*xpi
138        zusn(iusn+iext+i,j+1)=entree(i,j)
139        xusn(iusn+iext+i)=xdata(i)+2.*xpi
140      ENDDO
141      ENDDO
142
143        yusn(1)=ydata(1)+(ydata(1)-ydata(2))
144        yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))
145       DO i=1,iusn/2+iext
146        zusn(i,1)=zusn(i+iusn/2,2)
147        zusn(i+iusn/2+iext,1)=zusn(i,2)
148        zusn(i,jusn+2)=zusn(i+iusn/2,jusn+1)
149        zusn(i+iusn/2+iext,jusn+2)=zusn(i,jusn+1)
150       ENDDO
151c
152c  Calcul d'une orographie filtree aux hautes latitudes
153c  pour permettre des calculs plus isotropiques sur la pente
154c  des montagnes
155c
156       DO i=1,IUSN+2*iext
157       DO J=1,JUSN+2
158          zusnfi(i,j)=0.0
159       ENDDO
160       ENDDO
161
162      DO j=1,jusn
163            ideltax=1./cos(yusn(j+1))
164            ideltax=min(iusn/2-1,ideltax)
165            IF(MOD(IDELTAX,2).EQ.0)THEN
166              IDELTAX=IDELTAX+1
167            ENDIF
168            IHALPH=(IDELTAX-1)/2
169c           print *,' ideltax=',ideltax
170         IF(ideltax.eq.1)THEN
171            DO i=1,iusn
172               zusnfi(i+iext,j+1)=entree(i,j)
173            ENDDO   
174         ELSE
175            DO i=1,ihalph
176               DO ii=1,i+ihalph
177               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
178               ENDDO
179               DO ii=ihalph-i,0,-1
180               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(iusn-ii,j)
181               ENDDO 
182               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
183            ENDDO   
184            DO i=iusn-ihalph+1,iusn
185               DO ii = i-ihalph,iusn
186               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
187               ENDDO
188               DO ii = 1,ihalph+i-iusn
189               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
190               ENDDO
191               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
192            ENDDO
193            DO i=ihalph+1,iusn-ihalph
194               DO ii=-ihalph,ihalph
195               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(i+ii,j)
196               ENDDO
197               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
198            ENDDO
199         ENDIF
200            DO i=1,iext
201               zusnfi(i,j+1)=zusnfi(iusn-iext+i,j+1)
202               zusnfi(i+iusn+iext,j+1)=zusnfi(i,j+1)
203            ENDDO
204      ENDDO
205
206c Calculer les limites des zones des nouveaux points
207c
208      a(1) = x(1) - (x(2)-x(1))/2.0
209      b(1) = (x(1)+x(2))/2.0
210      DO i = 2, imar-1
211         a(i) = b(i-1)
212         b(i) = (x(i)+x(i+1))/2.0
213      ENDDO
214      a(imar) = b(imar-1)
215      b(imar) = x(imar) + (x(imar)-x(imar-1))/2.0
216
217      c(1) = y(1) - (y(2)-y(1))/2.0
218      d(1) = (y(1)+y(2))/2.0
219      DO j = 2, jmar-1
220         c(j) = d(j-1)
221         d(j) = (y(j)+y(j+1))/2.0
222      ENDDO
223      c(jmar) = d(jmar-1)
224      d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
225c
226c      quelques initialisations:
227      print*,'OKM1'
228c
229      DO i = 1, imar
230      DO j = 1, jmar
231         weight(i,j) = 0.0
232         zxtzx(i,j) = 0.0
233         zytzy(i,j) = 0.0
234         zxtzy(i,j) = 0.0
235         ztz(i,j) = 0.0
236         zmea(i,j) = 0.0
237         zstd(i,j)=0.0
238      ENDDO
239      ENDDO
240c
241c  calculs des correlations de pentes sur la grille de l'USN.
242c
243         DO j = 2,jusn+1
244         DO i = 1, iusn+2*iext
245            zytzyusn(i,j)=0.0
246            zxtzxusn(i,j)=0.0
247            zxtzyusn(i,j)=0.0
248         ENDDO
249         ENDDO
250
251
252         DO j = 2,jusn+1
253            zdeltax=zdeltay*cos(yusn(j))
254         DO i = 2, iusn+2*iext-1
255            zytzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))**2/zdeltay**2
256            zxtzxusn(i,j)=(zusnfi(i+1,j)-zusnfi(i-1,j))**2/zdeltax**2
257            zxtzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))/zdeltay
258     *                   *(zusnfi(i+1,j)-zusnfi(i-1,j))/zdeltax
259         ENDDO
260
261         ENDDO
262
263 
264
265      print*,'OK0'
266c
267c  sommations des differentes quantites definies precedemment
268c  sur une grille du modele.
269c
270      zleny=xpi/float(jusn)*rad
271      xincr=xpi/2./float(jusn)
272       DO ii = 1, imar
273       DO jj = 1, jmar
274c        PRINT *,' iteration ii jj:',ii,jj
275         DO j = 2,jusn+1
276c         DO j = 3,jusn
277            zlenx=zleny*cos(yusn(j))
278            zdeltax=zdeltay*cos(yusn(j))
279            zbordnor=(c(jj)-yusn(j)+xincr)*rad
280            zbordsud=(yusn(j)-d(jj)+xincr)*rad
281            weighy=amax1(0.,
282     *             amin1(zbordnor,zbordsud,zleny))
283         IF(weighy.ne.0)THEN
284         DO i = 2, iusn+2*iext-1
285            zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))
286            zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))
287            weighx=amax1(0.,
288     *             amin1(zbordest,zbordoue,zlenx))
289            IF(weighx.ne.0)THEN
290            weight(ii,jj)=weight(ii,jj)+weighx*weighy
291            zxtzx(ii,jj)=zxtzx(ii,jj)+zxtzxusn(i,j)*weighx*weighy
292            zytzy(ii,jj)=zytzy(ii,jj)+zytzyusn(i,j)*weighx*weighy
293            zxtzy(ii,jj)=zxtzy(ii,jj)+zxtzyusn(i,j)*weighx*weighy
294            ztz(ii,jj)  =ztz(ii,jj)  +zusn(i,j)*zusn(i,j)*weighx*weighy
295            zmea(ii,jj) =zmea(ii,jj)+zusn(i,j)*weighx*weighy
296            ENDIF
297         ENDDO
298         ENDIF
299         ENDDO
300       ENDDO
301       ENDDO
302c
303c  calculs des differents parametres necessaires au programme
304c  de parametrisation de l'orographie a l'echelle moyenne:
305c
306      zmaxmea=0.
307      zmaxstd=0.
308      zmaxsig=0.
309      zmaxgam=0.
310      zmaxthe=0.
311      zminthe=0.
312      DO ii = 1, imar
313      DO jj = 1, jmar
314        IF (weight(ii,jj) .NE. 0.0) THEN
315          zmea (ii,jj)=zmea (ii,jj)/weight(ii,jj)
316          zxtzx(ii,jj)=zxtzx(ii,jj)/weight(ii,jj)
317          zytzy(ii,jj)=zytzy(ii,jj)/weight(ii,jj)
318          zxtzy(ii,jj)=zxtzy(ii,jj)/weight(ii,jj)
319          ztz(ii,jj)  =ztz(ii,jj)/weight(ii,jj)
320          zstd(ii,jj)=sqrt(amax1(0.,ztz(ii,jj)-zmea(ii,jj)**2))
321        ENDIF
322      ENDDO
323      ENDDO
324      !--- CORRECT VALUES OF HORIZONTAL SLOPE NEAR THE POLES:
325      zxtzx(:,   1)=zxtzx(:,     2)
326      zxtzx(:,jmar)=zxtzx(:,jmar-1)
327      zxtzy(:,   1)=zxtzy(:,     2)
328      zxtzy(:,jmar)=zxtzy(:,jmar-1)
329      zytzy(:,   1)=zytzy(:,     2)
330      zytzy(:,jmar)=zytzy(:,jmar-1)
331
332      DO ii = 1, imar
333      DO jj = 1, jmar
334c  Coefficients K, L et M:
335           xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
336           xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
337           xm=zxtzy(ii,jj)
338           xp=xk-sqrt(xl**2+xm**2)
339           xq=xk+sqrt(xl**2+xm**2)
340           xw=1.e-8
341           if(xp.le.xw) xp=0.
342           if(xq.le.xw) xq=xw
343           if(abs(xm).le.xw) xm=xw*sign(1.,xm)
344c pente:
345           zsig(ii,jj)=sqrt(xq)
346c           zsig(ii,jj)=sqrt(2.*xk)
347c isotropy:
348           zgam(ii,jj)=xp/xq
349c angle theta:
350           zthe(ii,jj)=57.29577951*atan2(xm,xl)/2.
351
352      zmaxmea=amax1(zmea(ii,jj),zmaxmea)
353      zmaxstd=amax1(zstd(ii,jj),zmaxstd)
354      zmaxsig=amax1(zsig(ii,jj),zmaxsig)
355      zmaxgam=amax1(zgam(ii,jj),zmaxgam)
356      zmaxthe=amax1(zthe(ii,jj),zmaxthe)
357      zminthe=amin1(zthe(ii,jj),zminthe)
358       ENDDO
359       ENDDO
360
361      print *,'  MEAN ORO:',zmaxmea
362          print *,'  ST. DEV.:',zmaxstd
363      print *,'  PENTE:',zmaxsig
364      print *,' ANISOTROP:',zmaxgam
365      print *,'  ANGLE:',zminthe,zmaxthe       
366     
367C
368c  On passe ce donnees sur la grille dite physique....(?)
369c  On met gamma et theta a 1. et 0. aux poles ou ces quantites
370c  n'ont pas vraiment de sens
371c
372      DO jj=1,jmar
373      zmea(imar+1,jj)=zmea(1,jj)
374      zstd(imar+1,jj)=zstd(1,jj)
375      zsig(imar+1,jj)=zsig(1,jj)
376      zgam(imar+1,jj)=zgam(1,jj)
377      zthe(imar+1,jj)=zthe(1,jj)
378      ENDDO
379
380
381      zmeanor=0.0
382      zmeasud=0.0
383      zstdnor=0.0
384      zstdsud=0.0
385      zsignor=0.0
386      zsigsud=0.0
387      zweinor=0.0
388      zweisud=0.0
389
390      DO ii=1,imar
391      zweinor=zweinor+              weight(ii,   1)
392      zweisud=zweisud+              weight(ii,jmar)
393      zmeanor=zmeanor+zmea(ii,   1)*weight(ii,   1)
394      zmeasud=zmeasud+zmea(ii,jmar)*weight(ii,jmar)
395      zstdnor=zstdnor+zstd(ii,   1)*weight(ii,   1)
396      zstdsud=zstdsud+zstd(ii,jmar)*weight(ii,jmar)
397      zsignor=zsignor+zsig(ii,   1)*weight(ii,   1)
398      zsigsud=zsigsud+zsig(ii,jmar)*weight(ii,jmar)
399      ENDDO
400
401      DO ii=1,imar+1
402      zmea(ii,   1)=zmeanor/zweinor
403      zmea(ii,jmar)=zmeasud/zweisud
404      zstd(ii,   1)=zstdnor/zweinor
405      zstd(ii,jmar)=zstdsud/zweisud
406      zsig(ii,   1)=zsignor/zweinor
407      zsig(ii,jmar)=zsigsud/zweisud
408      zgam(ii,   1)=1.
409      zgam(ii,jmar)=1.
410      zthe(ii,   1)=0.
411      zthe(ii,jmar)=0.
412      ENDDO
413
414
415      RETURN
416      END
Note: See TracBrowser for help on using the repository browser.