6 SUBROUTINE fxhyp ( xzoomdeg,grossism,dzooma,tau ,
35 #include "dimensions.h"
40 REAL xzoomdeg,dzooma,tau,grossism
44 REAL rlonm025(iip1),xprimm025(iip1),rlonv(iip1),xprimv(iip1),
45 ,
rlonu(iip1),
xprimu(iip1),rlonp025(iip1),xprimp025(iip1)
50 REAL(KIND=8) xlon(iip1),xprimm(iip1),xuv
51 REAL(KIND=8) xtild(0:nmax2)
52 REAL(KIND=8) fhyp(0:nmax2),ffdx,beta,Xprimt(0:nmax2)
53 REAL(KIND=8) Xf(0:nmax2),xxpr(0:nmax2)
54 REAL(KIND=8) xvrai(iip1),xxprim(iip1)
55 REAL(KIND=8) pi,depi,epsilon,xzoom,fa,fb
56 REAL(KIND=8) Xf1, Xfi , a0,a1,a2,a3,xi2
57 INTEGER i,it,ik,iter,ii,idif,ii1,ii2
58 REAL(KIND=8) xi,xo1,xmoy,xlon2,fxm,Xprimin
59 REAL(KIND=8) champmin,champmax,decalx
63 REAL(KIND=8) heavyside
68 xzoom = xzoomdeg * pi/180.
76 rlonm025(2)=rlonm025(1)+depi
77 rlonv(2)=rlonv(1)+depi
79 rlonp025(2)=rlonp025(1)+depi
92 IF( grossism.EQ.1..AND.scal180 )
THEN
96 WRITE(6,*)
'FXHYP scal180,decalx', scal180,decalx
98 IF( dzooma.LT.1.)
THEN
100 ELSEIF( dzooma.LT. 25. )
THEN
101 WRITE(6,*)
' Le param. dzoomx pour fxhyp est trop petit ! L aug
102 ,menter et relancer ! '
105 dzoom = dzooma * pi/180.
108 WRITE(6,*)
' xzoom( rad.),grossism,tau,dzoom (radians)'
109 WRITE(6,24) xzoom,grossism,tau,dzoom
112 xtild(i) = - pi +
REAL(i) * depi /nmax2
117 fa = tau* ( dzoom/2. - xtild(i) )
118 fb = xtild(i) * ( pi - xtild(i) )
120 IF( 200.* fb .LT. - fa )
THEN
122 ELSEIF( 200. * fb .LT. fa )
THEN
125 IF( abs(fa).LT.1.e-13.AND.abs(fb).LT.1.e-13)
THEN
126 IF( 200.*fb + fa.LT.1.e-10 )
THEN
128 ELSEIF( 200.*fb - fa.LT.1.e-10 )
THEN
132 fhyp( i ) = tanh( fa/fb )
135 IF ( xtild(i).EQ. 0. ) fhyp(i) = 1.
136 IF ( xtild(i).EQ. pi ) fhyp(i) = -1.
146 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) )
147 fa = tau* ( dzoom/2. - xmoy )
148 fb = xmoy * ( pi - xmoy )
150 IF( 200.* fb .LT. - fa )
THEN
152 ELSEIF( 200. * fb .LT. fa )
THEN
155 IF( abs(fa).LT.1.e-13.AND.abs(fb).LT.1.e-13)
THEN
156 IF( 200.*fb + fa.LT.1.e-10 )
THEN
158 ELSEIF( 200.*fb - fa.LT.1.e-10 )
THEN
166 IF ( xmoy.EQ. 0. ) fxm = 1.
167 IF ( xmoy.EQ. pi ) fxm = -1.
169 ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )
173 beta = ( grossism * ffdx - pi ) / ( ffdx - pi )
175 IF( 2.*beta - grossism.LE. 0.)
THEN
176 WRITE(6,*)
' ** Attention ! La valeur beta calculee dans la rou
177 ,tine fxhyp est mauvaise ! '
178 WRITE(6,*)
'Modifier les valeurs de grossismx ,tau ou dzoomx ',
179 ,
' et relancer ! *** '
187 xprimt(i) = beta + ( grossism - beta ) * fhyp(i)
191 xprimt( nmax2 - i ) = xprimt( i )
199 DO i = nmax +1, nmax2
201 xmoy = 0.5 * ( xtild(i-1) + xtild( i ) )
202 fa = tau* ( dzoom/2. - xmoy )
203 fb = xmoy * ( pi - xmoy )
205 IF( 200.* fb .LT. - fa )
THEN
207 ELSEIF( 200. * fb .LT. fa )
THEN
213 IF ( xmoy.EQ. 0. ) fxm = 1.
214 IF ( xmoy.EQ. pi ) fxm = -1.
215 xxpr(i) = beta + ( grossism - beta ) * fxm
220 xxpr(nmax2-i+1) = xxpr(i)
224 xf(i) = xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) )
240 ELSE IF ( ik.EQ.2 )
THEN
242 ELSE IF ( ik.EQ.3 )
THEN
244 ELSE IF ( ik.EQ.4 )
THEN
252 IF(ik.EQ.1.and.grossism.EQ.1.)
THEN
258 xlon2 = - pi + (
REAL(i) + xuv - decalx) * depi /
REAL(iim)
262 DO 250 it = nmax2,0,-1
263 IF( xfi.GE.xf(it))
GO TO 350
284 CALL coefpoly ( xf(it),xf(it+1),xprimt(it),xprimt(it+1),
285 , xtild(it),xtild(it+1), a0, a1, a2, a3 )
288 xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi
291 xi = xi - ( xf1 - xfi )/ xprimin
293 IF( abs(xi-xo1).LE.epsilon)
GO TO 550
296 xf1 = a0 + a1 * xi + a2 * xi2 + a3 * xi2 * xi
297 xprimin = a1 + 2.* a2 * xi + 3.* a3 * xi2
299 WRITE(6,*)
' Pas de solution ***** ',i,xlon2,iter
303 xxprim(i) = depi/ (
REAL(iim) * Xprimin )
304 xvrai(i) = xi + xzoom
309 IF(ik.EQ.1.and.grossism.EQ.1.)
THEN
310 xvrai(1) = xvrai(iip1)-depi
311 xxprim(1) = xxprim(iip1)
316 xprimm(i) = xxprim(i)
319 IF( xvrai(i+1). lt. xvrai(i) )
THEN
320 WRITE(6,*)
' PBS. avec rlonu(',i+1,
') plus petit que rlonu(',i,
332 champmin = min( champmin,xvrai(i) )
333 champmax = max( champmax,xvrai(i) )
336 IF(champmin .GE.-pi-0.10.and.champmax.LE.pi+0.10 )
THEN
339 WRITE(6,*)
'Reorganisation des longitudes pour avoir entre - pi',
342 IF( xzoom.LE.0.)
THEN
345 IF( xvrai(i).GE. - pi )
GO TO 80
347 WRITE(6,*)
' PBS. 1 ! Xvrai plus petit que - pi ! '
355 xlon(ii-is2+1) = xvrai(ii)
356 xprimm(ii-is2+1) = xxprim(ii)
359 xlon(ii+
iim-is2+1) = xvrai(ii) + depi
360 xprimm(ii+
iim-is2+1) = xxprim(ii)
366 IF( xvrai(i).LE. pi )
GO TO 90
368 WRITE(6,*)
' PBS. 2 ! Xvrai plus grand que pi ! '
375 xlon(ii+idif) = xvrai(ii)
376 xprimm(ii+idif) = xxprim(ii)
379 xlon(ii) = xvrai(ii+is2) - depi
380 xprimm(ii) = xxprim(ii+is2)
390 xlon( iip1) = xlon(1) + depi
391 xprimm( iip1 ) = xprimm(1 )
394 xvrai(i) = xlon(i)*180./pi
405 rlonm025(i) = xlon( i )
406 xprimm025(i) = xprimm(i)
408 ELSE IF( ik.EQ.2 )
THEN
417 xprimv(i) = xprimm(i)
420 ELSE IF( ik.EQ.3)
THEN
432 ELSE IF( ik.EQ.4 )
THEN
440 rlonp025(i) = xlon( i )
441 xprimp025(i) = xprimm(i)
453 xlon(i) = rlonv(i+1) - rlonv(i)
458 champmin = min( champmin, xlon(i) )
459 champmax = max( champmax, xlon(i) )
461 champmin = champmin * 180./pi
462 champmax = champmax * 180./pi
465 24
FORMAT(2
x,
'Parametres xzoom,gross,tau ,dzoom pour fxhyp ',4f8.3)
!$Header!CDK comgeom COMMON comgeom xprimv(iip1)!REAL &&cu
subroutine abort_gcm(modname, message, ierr)
!$Header!CDK comgeom2 COMMON comgeom unsaire xprimu
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$Header!CDK comgeom COMMON comgeom rlonu
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
c c zjulian c cym CALL iim cym klev iim
!$Header!CDK comgeom COMMON comgeom rlonv
subroutine fxhyp(xzoomdeg, grossism, dzooma, tau, rlonm025, xprimm025, rlonv, xprimv, rlonu, xprimu, rlonp025, xprimp025, champmin, champmax)