source: LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F @ 6

Last change on this file since 6 was 2, checked in by lmdz, 25 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 7.7 KB
Line 
1       SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau,deltay , 
2     ,  rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 )
3
4
5       IMPLICIT NONE
6c
7c    ...   Auteur :  P. Le Van  ...
8c
9c    .......    d'apres  formulations  de R. Sadourny  .......
10c
11c     Calcule les latitudes et derivees dans la grille du GCM pour une
12c     fonction f(y) a tangente  hyperbolique  .
13c
14c     grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois , etc)
15c     dzoom  etant  la distance totale de la zone du zoom
16c     tau  la transition ,   normalement  = 1  .
17
18c  N.B :  on doit avoir :  grossism * dzoom  <   1 .
19c         **************
20c
21c    Pour Indoex , on a pris :
22c         *******
23c    grossism = 2.5 , dzoom = 7/24  en x et  y  , pour iim = 128 et jjm=64
24c    yzoomdeg = 0.  , tau = 1.  et delaty = 10.
25c
26c
27#include "dimensions.h"
28#include "paramet.h"
29
30       INTEGER      nmax , nmax2
31       PARAMETER (  nmax = 50000, nmax2 = 2*nmax )
32c
33c
34c     .......  arguments  d'entree    .......
35c
36       REAL yzoomdeg, grossism,dzoom,tau , deltay
37
38c     .......  arguments  de sortie   .......
39c
40       REAL rrlatu(jjp1), yyprimu(jjp1),rrlatv(jjm), yyprimv(jjm),
41     , rlatu1(jjm), yprimu1(jjm), rlatu2(jjm), yprimu2(jjm)
42
43c
44c    ..... Champs  locaux    .....
45c
46     
47       REAl ylat(jjp1), yprim(jjp1)
48       REAL yuv
49       REAL ytild(0:nmax2)
50       REAL fhyp(0:nmax),ffdx(0:nmax),beta,Ytprim(0:nmax2)
51       SAVE Ytprim, ytild,Yf
52       REAL Yf(0:nmax2),yypr(0:nmax2)
53       REAL yvrai(jjp1), yprimm(jjp1),ylatt(jjp1)
54       REAL pi,depi,pis2,epsilon,yzoom
55       REAL yo1,yi,ylon2,fxm,ymoy,yint,Yprimin
56       REAL ypn,deply,y00
57       SAVE y00, deply
58
59       INTEGER i,j,it,ik,iter,jlat
60       INTEGER jpn,jjpn
61       SAVE jpn
62
63
64       pi       = 2. * ASIN(1.)
65       depi     = 2. * pi
66       pis2     = pi/2.
67       epsilon  = 1.e-6
68       yzoom    = yzoomdeg * pi/180.
69
70
71
72       DO i = 0, nmax2
73        ytild(i) = FLOAT(i) /nmax2
74       IF( ytild(i).EQ.0.5 )  ytild(i) = ytild(i) + 1.e-6
75       ENDDO
76
77       DO i = 1, nmax
78        fhyp(i) = TANH ( ( ytild(i) - 0.5*(1.- dzoom) )          /
79     ,                 ( tau * ytild(i) * ( 0.5 -ytild(i))) )
80       ENDDO
81
82       fhyp(   0  ) = - 1.
83       fhyp( nmax ) =   1.
84
85cc  ....  Calcul  de  beta  ....
86c
87       ffdx( 0 ) = 0.
88
89       DO i = 1, nmax
90        ymoy    = 0.5 * ( ytild(i-1) + ytild( i ) )
91        fxm     = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) )    /
92     ,                 ( tau * ymoy * ( 0.5 -ymoy)) )
93        ffdx(i) = ffdx(i-1) + fxm * ( ytild(i) - ytild(i-1) )
94       ENDDO
95
96        beta  = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 )
97c
98c   .....  calcul  de  Ytprim   .....
99c
100       
101       DO i = 0, nmax
102        Ytprim(i) = beta  + ( grossism - beta ) * fhyp(i)
103       ENDDO
104c   
105       DO i = 0, nmax
106        Ytprim( nmax2 - i ) = Ytprim( i )
107       ENDDO
108c
109
110c   .....  Calcul  de  Yf     ........
111
112        Yf(0) = 0.
113       DO i = 1, nmax
114        ymoy    = 0.5 * ( ytild(i-1) + ytild( i ) )
115        fxm     = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) )    /
116     ,                 ( tau * ymoy * ( 0.5 -ymoy)) )
117        yypr(i)    = beta + ( grossism - beta ) * fxm
118       ENDDO
119
120       DO i = 1,nmax
121         yypr(nmax2-i+1) = yypr(i)
122       ENDDO
123
124        DO i=1,nmax2
125         Yf(i)   = Yf(i-1) + yypr(i) * ( ytild(i) - ytild(i-1) )
126        ENDDO
127c
128c
129
130c    ****************************************************************
131c
132c   .....   yuv  = 0.   si calcul des latitudes  aux pts.  U  .....
133c   .....   yuv  = 0.5  si calcul des latitudes  aux pts.  V  .....
134c
135c
136      DO 5000  ik = 1,4
137
138       IF( ik.EQ.1 )  THEN
139         yuv  = 0.
140         jlat = jjm + 1
141       ELSE IF ( ik.EQ.2 )  THEN
142         yuv  = 0.5
143         jlat = jjm
144       ELSE IF ( ik.EQ.3 )  THEN
145         yuv  = 0.25
146         jlat = jjm
147       ELSE IF ( ik.EQ.4 )  THEN
148         yuv  = 0.75
149         jlat = jjm
150       ENDIF
151       
152c
153       DO 1500 j =  1,jlat
154
155        ylon2 =  ( FLOAT(j)  + yuv  -1.) / FLOAT(jjm)
156
157        yo1   = 0.
158        yi    = ylon2
159
160c
161       DO 500 iter = 1,300
162
163       DO 250 it =  nmax2,0,-1
164        IF( yi.GE.ytild(it))  GO TO 350
165250    CONTINUE
166
167       it = 0
168       yi = ytild(it)
169
170350    CONTINUE
171
172       IF(it.EQ.nmax2)  THEN
173        it       = nmax2 -1
174        Yf(it+1) = 1.
175       ENDIF
176c  .................................................................
177c  ....  Interpolation entre  yi(it) et yi(it+1)   pour avoir Y(yi) 
178c      .....           et   Y'(yi)                             .....
179c  .................................................................
180
181       yint   = ( Yf(it+1)-Yf(it) ) / ( ytild(it+1)-ytild(it) )      *
182     +                    ( yi-ytild(it) )  +  Yf(it)
183      Yprimin = ( Ytprim(it+1)-Ytprim(it) )/ ( ytild(it+1)-ytild(it) ) *
184     +                    ( yi-ytild(it) )  +  Ytprim(it)
185       yi = yi - (yint-ylon2)/Yprimin
186
187      IF( ABS(yi-yo1).LE.epsilon) GO TO 550
188      yo1 = yi
189c
190500   CONTINUE
191      PRINT *,' ***   PAS DE SOLUTION  ****  ',j,ylon2,iter
192        STOP 4
193550   CONTINUE
194
195       yprim(j)    = pi /( FLOAT(jjm) *  Yprimin)
196       yvrai(j)    = pi *  (yi - 0.5) + yzoom
197
1981500    CONTINUE
199
200cc          print *,' LAT avant reorgan '
201cc         print 68,(yyvrai(j),j=1,jlat)
202
203       DO j = 1, jlat -1
204        IF( yvrai(j+1). LT. yvrai(j) )  THEN
205         PRINT *,' PBS.  avec  rlat(',j+1,' plus petit que rlat(',j,
206     ,   ')'
207         STOP
208        ENDIF
209       ENDDO
210
211        PRINT 18
212        PRINT *,'Reorganisation des latitudes pour avoir entre - pi/2 ',
213     ,  ' et  pi/2 '
214c
215           
216        IF( ik.EQ.1 )   THEN
217           ypn = pis2 - deltay * pi/180.
218          DO j = jlat,1,-1
219           IF( yvrai(j).LE. ypn ) GO TO 1502
220          ENDDO
2211502     CONTINUE
222
223         jpn   = j
224         y00   = yvrai(jpn)
225         deply = pis2 -  y00
226        ENDIF
227
228         DO  j = 1, jjm +1 - jpn
229           ylatt (j)  = -pis2 - y00  + yvrai(jpn+j-1)
230           yprimm(j)  = yprim(jpn+j-1)
231         ENDDO
232
233         jjpn  = jpn
234         IF( jlat.EQ. jjm ) jjpn = jpn -1
235
236         DO j = 1,jjpn
237          ylatt (j + jjm+1 -jpn) = yvrai(j) + deply
238          yprimm(j + jjm+1 -jpn) = yprim(j)
239         ENDDO
240
241
242
243c      ***********   Fin de la reorganisation     *************
244c
245 1600   CONTINUE
246
247
248
249       DO j = 1, jlat
250          ylat(j) =  ylatt( jlat +1 -j )
251         yprim(j) = yprimm( jlat +1 -j )
252       ENDDO
253 
254        DO j = 1, jlat
255         yvrai(j) = ylat(j)*180./pi
256        ENDDO
257
258
259        IF( ik.EQ.1 )  THEN
260        PRINT 18
261        PRINT *, ' YLAT  en U   apres ( en  deg. ) '
262        PRINT 68,(yvrai(j),j=1,jlat)
263        PRINT *,' YPRIM '
264        PRINT 68,( yprim(j),j=1,jlat)
265          DO j = 1, jlat
266            rrlatu(j) =  ylat( j )
267           yyprimu(j) = yprim( j )
268          ENDDO
269c
270        ELSE IF ( ik.EQ. 2 )  THEN
271        PRINT 18
272        PRINT *, ' YLAT   en V  apres ( en  deg. ) '
273        PRINT 68,(yvrai(j),j=1,jlat)
274        PRINT *,' YPRIM '
275        PRINT 68,( yprim(j),j=1,jlat)
276          DO j = 1, jlat
277            rrlatv(j) =  ylat( j )
278           yyprimv(j) = yprim( j )
279          ENDDO
280c
281        ELSE IF ( ik.EQ. 3 )  THEN
282        PRINT 18
283        PRINT *, ' YLAT  en U + 0.75  apres ( en  deg. ) '
284        PRINT 68,(yvrai(j),j=1,jlat)
285        PRINT *,' YPRIM '
286        PRINT 68,( yprim(j),j=1,jlat)
287          DO j = 1, jlat
288            rlatu2(j) =  ylat( j )
289           yprimu2(j) = yprim( j )
290          ENDDO
291
292        ELSE IF ( ik.EQ. 4 )  THEN
293        PRINT 18
294        PRINT *, ' YLAT en U + 0.25  apres ( en  deg. ) '
295        PRINT 68,(yvrai(j),j=1,jlat)
296        PRINT *,' YPRIM '
297        PRINT 68,( yprim(j),j=1,jlat)
298          DO j = 1, jlat
299            rlatu1(j) =  ylat( j )
300           yprimu1(j) = yprim( j )
301          ENDDO
302        ENDIF
303
3045000   CONTINUE
305c
306c  .....     fin de la boucle  do 5000 .....
307
30818      FORMAT(/)
30968      FORMAT(1x,7f9.2)
310
311        RETURN
312        END
Note: See TracBrowser for help on using the repository browser.