Changeset 203 for LMDZ.3.3/trunk/libf


Ignore:
Timestamp:
Apr 12, 2001, 11:30:31 AM (24 years ago)
Author:
lmdz
Message:

Mise en oeuvre du nouveau zoom. Modifs P. Levan
LF

Location:
LMDZ.3.3/trunk/libf/dyn3d
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • LMDZ.3.3/trunk/libf/dyn3d/defrun_new.F

    r2 r203  
     1c
     2c $Header
     3c
    14      SUBROUTINE defrun_new( tapedef, etatinit, clesphy0 )
    25c
     
    3639      INTEGER   tapeout
    3740      REAL clonn,clatt,grossismxx,grossismyy
    38       REAL dzoomxx,dzoomyy
     41      REAL dzoomxx,dzoomyy,tauxx,tauyy
    3942      LOGICAL  fxyhypbb, ysinuss
    4043      INTEGER i
     
    258261      WRITE(tapeout,*)    clonn
    259262      IF( ABS(clon - clonn).GE. 0.001 )  THEN
    260         PRINT *,' La valeur de clon passee par run.def est differente de
    261      *  celle lue sur le fichier  start '
     263       WRITE(tapeout,*) ' La valeur de clon passee par run.def est diffe
     264     *rente de  celle lue sur le fichier  start '
    262265        STOP
    263266      ENDIF
    264 c
    265267c
    266268      READ (tapedef,9001) ch1,ch4
     
    270272
    271273      IF( ABS(clat - clatt).GE. 0.001 )  THEN
    272         PRINT *,' La valeur de clat passee par run.def est differente de
    273      *  celle lue sur le fichier  start '
     274       WRITE(tapeout,*) ' La valeur de clat passee par run.def est diffe
     275     *rente de  celle lue sur le fichier  start '
    274276        STOP
    275277      ENDIF
     
    281283
    282284      IF( ABS(grossismx - grossismxx).GE. 0.001 )  THEN
    283         PRINT *,' La valeur de grossismx passee par run.def est differente 
    284      * de celle lue sur le fichier  start '
     285       WRITE(tapeout,*) ' La valeur de grossismx passee par run.def est
     286     , differente de celle lue sur le fichier  start '
    285287        STOP
    286288      ENDIF
     
    292294
    293295      IF( ABS(grossismy - grossismyy).GE. 0.001 )  THEN
    294         PRINT *,' La valeur de grossismy passee par run.def est differen
    295      * te de celle lue sur le fichier  start '
     296       WRITE(tapeout,*) ' La valeur de grossismy passee par run.def est
     297     , differente de celle lue sur le fichier  start '
    296298        STOP
    297299      ENDIF
    298300     
    299301      IF( grossismx.LT.1. )  THEN
    300         PRINT *,' ***  ATTENTION !! grossismx < 1 .   *** '
     302        WRITE(tapeout,*) ' ***  ATTENTION !! grossismx < 1 .   *** '
    301303         STOP
    302304      ELSE
     
    306308
    307309      IF( grossismy.LT.1. )  THEN
    308         PRINT *,' ***  ATTENTION !! grossismy < 1 .   *** '
     310        WRITE(tapeout,*) ' ***  ATTENTION !! grossismy < 1 .   *** '
    309311         STOP
    310312      ELSE
     
    312314      ENDIF
    313315
    314       PRINT *,' alphax alphay defrun ',alphax,alphay
    315316c
    316317c    alphax et alphay sont les anciennes formulat. des grossissements
     
    324325      IF( .NOT.fxyhypb )  THEN
    325326           IF( fxyhypbb )     THEN
    326               PRINT *,' ********  PBS DANS  DEFRUN  ******** '
    327               PRINT *,' *** fxyhypb lu sur le fichier start est F ',
    328      *       'alors  qu il est  T  sur  run.def  ***'
     327            WRITE(tapeout,*) ' ********  PBS DANS  DEFRUN  ******** '
     328            WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est F'
     329     *,      '                   alors  qu il est  T  sur  run.def  ***'
    329330              STOP
    330331           ENDIF
    331332      ELSE
    332333           IF( .NOT.fxyhypbb )   THEN
    333               PRINT *,' ********  PBS DANS  DEFRUN  ******** '
    334               PRINT *,' ***  fxyhypb lu sur le fichier start est T ',
    335      *        'alors  qu il est  F  sur  run.def  ****  '
     334            WRITE(tapeout,*) ' ********  PBS DANS  DEFRUN  ******** '
     335            WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est t'
     336     *,      '                   alors  qu il est  F  sur  run.def  ***'
    336337              STOP
    337338           ENDIF
     
    343344      WRITE(tapeout,*)    dzoomxx
    344345
    345       IF( fxyhypb )  THEN
    346        IF( ABS(dzoomx - dzoomxx).GE. 0.001 )  THEN
    347         PRINT *,' La valeur de dzoomx passee par run.def est differente
    348      *  de celle lue sur le fichier  start '
    349         STOP
    350        ENDIF
    351       ENDIF
    352 
    353346      READ (tapedef,9001) ch1,ch4
    354347      READ (tapedef,*)    dzoomyy
     
    356349      WRITE(tapeout,*)    dzoomyy
    357350
     351      READ (tapedef,9001) ch1,ch4
     352      READ (tapedef,*)    tauxx
     353      WRITE(tapeout,9001) ch1,'taux'
     354      WRITE(tapeout,*)    tauxx
     355
     356      READ (tapedef,9001) ch1,ch4
     357      READ (tapedef,*)    tauyy
     358      WRITE(tapeout,9001) ch1,'tauy'
     359      WRITE(tapeout,*)    tauyy
     360
    358361      IF( fxyhypb )  THEN
     362
     363       IF( ABS(dzoomx - dzoomxx).GE. 0.001 )  THEN
     364        WRITE(tapeout,*)' La valeur de dzoomx passee par run.def est dif
     365     *ferente de celle lue sur le fichier  start '
     366        CALL ABORT
     367       ENDIF
     368
    359369       IF( ABS(dzoomy - dzoomyy).GE. 0.001 )  THEN
    360         PRINT *,' La valeur de dzoomy passee par run.def est differente
    361      * de celle lue sur le fichier  start '
    362         STOP
     370        WRITE(tapeout,*)' La valeur de dzoomy passee par run.def est dif
     371     *ferente de celle lue sur le fichier  start '
     372        CALL ABORT
    363373       ENDIF
     374
     375       IF( ABS(taux - tauxx).GE. 0.001 )  THEN
     376        WRITE(6,*)' La valeur de taux passee par run.def est differente
     377     *  de celle lue sur le fichier  start '
     378        CALL ABORT
     379       ENDIF
     380
     381       IF( ABS(tauy - tauyy).GE. 0.001 )  THEN
     382        WRITE(6,*)' La valeur de tauy passee par run.def est differente
     383     *  de celle lue sur le fichier  start '
     384        CALL ABORT
     385       ENDIF
     386
    364387      ENDIF
    365388     
     
    374397        IF( .NOT.ysinus )  THEN
    375398           IF( ysinuss )     THEN
    376               PRINT *,' ********  PBS DANS  DEFRUN  ******** '
    377               PRINT *,' *** ysinus lu sur le fichier start est F ',
    378      *       'alors  qu il est  T  sur  run.def  ***'
     399              WRITE(6,*) ' ********  PBS DANS  DEFRUN  ******** '
     400              WRITE(tapeout,*)'** ysinus lu sur le fichier start est F',
     401     *       ' alors  qu il est  T  sur  run.def  ***'
    379402              STOP
    380403           ENDIF
    381404        ELSE
    382405           IF( .NOT.ysinuss )   THEN
    383               PRINT *,' ********  PBS DANS  DEFRUN  ******** '
    384               PRINT *,' ***  ysinus lu sur le fichier start est T ',
    385      *        'alors  qu il est  F  sur  run.def  ****  '
     406              WRITE(6,*) ' ********  PBS DANS  DEFRUN  ******** '
     407              WRITE(tapeout,*)'** ysinus lu sur le fichier start est T',
     408     *       ' alors  qu il est  F  sur  run.def  ***'
    386409              STOP
    387410           ENDIF
     
    389412      ENDIF
    390413c
    391       close(tapedef)
     414      WRITE(6,*) ' alphax alphay defrun ',alphax,alphay
     415
     416      CLOSE(tapedef)
     417
    392418      RETURN
    393419c   ...............................................
     
    416442
    417443      IF( grossismx.LT.1. )  THEN
    418         PRINT *,' ***  ATTENTION !! grossismx < 1 .   *** '
     444        WRITE(tapeout,*) '***  ATTENTION !! grossismx < 1 .   *** '
    419445         STOP
    420446      ELSE
     
    423449
    424450      IF( grossismy.LT.1. )  THEN
    425         PRINT *,' ***  ATTENTION !! grossismy < 1 .   *** '
     451        WRITE(tapeout,*) ' ***  ATTENTION !! grossismy < 1 .   *** '
    426452         STOP
    427453      ELSE
     
    429455      ENDIF
    430456
    431       PRINT *,' alphax alphay defrun ',alphax,alphay
    432 
    433457c
    434458      READ (tapedef,9001) ch1,ch4
     
    446470      WRITE(tapeout,9001) ch1,'dzoomy'
    447471      WRITE(tapeout,*)    dzoomy
    448 c
     472
     473      READ (tapedef,9001) ch1,ch4
     474      READ (tapedef,*)    taux
     475      WRITE(tapeout,9001) ch1,'taux'
     476      WRITE(tapeout,*)    taux
     477c
     478      READ (tapedef,9001) ch1,ch4
     479      READ (tapedef,*)    tauy
     480      WRITE(tapeout,9001) ch1,'tauy'
     481      WRITE(tapeout,*)    tauy
     482
    449483      READ (tapedef,9001) ch1,ch4
    450484      READ (tapedef,*)    ysinus
     
    452486      WRITE(tapeout,*)    ysinus
    453487       
     488      WRITE(tapeout,*) ' alphax alphay defrun ',alphax,alphay
    454489c
    4554909000  FORMAT(3(/,a72))
    4564919001  FORMAT(/,a72,/,a12)
    457492cc
    458       close(tapedef)
     493      CLOSE(tapedef)
     494
    459495      RETURN
    460496      END
  • LMDZ.3.3/trunk/libf/dyn3d/dynetat0.F

    r2 r203  
     1c
     2c $Header
     3c
    14      SUBROUTINE dynetat0(fichnom,nq,vcov,ucov,
    25     .                    teta,q,masse,ps,phis,time)
     
    105108        dzoomx   = tab_cntrl(25)
    106109        dzoomy   = tab_cntrl(26)
     110        taux     = tab_cntrl(28)
     111        tauy     = tab_cntrl(29)
    107112      ELSE
    108113        fxyhypb = . FALSE .
  • LMDZ.3.3/trunk/libf/dyn3d/dynredem.F

    r56 r203  
     1c
     2c $Header
     3c
    14      SUBROUTINE dynredem0(fichnom,idayref,anneeref,phis,nq)
    25      USE IOIPSL
     
    9295       tab_cntrl(25) = dzoomx
    9396       tab_cntrl(26) = dzoomy
     97       tab_cntrl(27) = 0.
     98       tab_cntrl(28) = taux
     99       tab_cntrl(29) = tauy
    94100      ELSE
    95101       tab_cntrl(24) = 0.
     
    97103       tab_cntrl(26) = dzoomy
    98104       tab_cntrl(27) = 0.
    99        IF( ysinus )  tab_cntrl(27) = 1.
     105       tab_cntrl(28) = 0.
     106       tab_cntrl(29) = 0.
     107       IF( ysinus )  tab_cntrl(27) = 1.
    100108      ENDIF
    101109c
  • LMDZ.3.3/trunk/libf/dyn3d/fxhyp.F

    r2 r203  
     1c
     2c $Header
     3c
    14       SUBROUTINE fxhyp ( xzoomdeg,grossism,dzoom,tau ,
    25     , rlonm025,xprimm025,rlonv,xprimv,rlonu,xprimu,rlonp025,xprimp025)
     
    1114c     grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois,etc.)
    1215c     dzoom  etant  la distance totale de la zone du zoom
    13 c     tau  la transition ,   normalement  = 1  .
    14 c
     16c     tau  la raideur de la transition de l'interieur a l'exterieur du zoom
     17c
     18c    On doit avoir grossism x dzoom <  pi ( radians )   , en longitude.
     19c   ********************************************************************
     20
    1521
    1622       INTEGER nmax, nmax2
    17        PARAMETER (  nmax = 50000, nmax2 = 2*nmax )
     23       PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
    1824
    1925#include "dimensions.h"
     
    2329c
    2430       REAL xzoomdeg,dzoom,tau,grossism
     31
     32c    ......   arguments  de  sortie  ......
     33
    2534       REAL rlonm025(iip1),xprimm025(iip1),rlonv(iip1),xprimv(iip1),
    2635     ,  rlonu(iip1),xprimu(iip1),rlonp025(iip1),xprimp025(iip1)
    2736
    28 c    ......   arguments  de  sortie  ......
    29 c
    30        REAL xlon(iip1),xprimm(iip1),xuv
    31        REAL xtild(0:nmax2)
    32        REAL fhyp(0:nmax),ffdx(0:nmax),beta,Xprimt(0:nmax2)
    33        REAL Xf(0:nmax2),xxpr(0:nmax2)
    34        REAL xvrai(iip1),xxprim(iip1)
    35        REAL pi,depi,epsilon,xzoom
     37c     .... variables locales  ....
     38c
     39       REAL*8 xlon(iip1),xprimm(iip1),xuv
     40       REAL*8 xtild(0:nmax2)
     41       REAL*8 fhyp(0:nmax),ffdx,beta,Xprimt(0:nmax2)
     42       REAL*8 Xf(0:nmax2),xxpr(0:nmax2)
     43       REAL*8 xvrai(iip1),xxprim(iip1)
     44       REAL*8 pi,depi,epsilon,xzoom,fa,fb
     45       REAL*8 Xf1, Xfi , a0,a1,a2,a3,xi2
    3646       INTEGER i,it,ik,iter,ii,idif
    37        REAL xi,xo1,xint,xmoy,xlon2,fxm,Xprimin
    38        REAL champmin,champmax
     47       REAL*8 xi,xo1,xmoy,xlon2,fxm,Xprimin
     48       REAL*8 champmin,champmax
    3949       INTEGER is2
    4050       SAVE is2
    41        REAL dlon1(iip1),dlon2(iip1),dlon3(iip1)
     51       REAL*8 heavyside
     52       EXTERNAL coefpoly,heavyside
    4253
    4354       pi       = 2. * ASIN(1.)
    4455       depi     = 2. * pi
    45        epsilon  = 1.e-6
     56       epsilon  = 1.e-3
    4657       xzoom    = xzoomdeg * pi/180.
    4758
    48 
     59       WRITE(6,24) xzoomdeg,grossism,tau,dzoom
     60       IF( dzoom.LT.1.)  THEN
     61         dzoom = dzoom * depi
     62       ELSEIF( dzoom.LT. 25. ) THEN
     63         WRITE(6,*) ' Le param. dzoomy pour fxhyp est trop petit ! L aug
     64     ,menter et relancer ! '
     65         STOP 1
     66       ELSE
     67         dzoom = dzoom * pi/180.
     68       ENDIF
    4969
    5070       DO i = 0, nmax2
    51          xtild(i) = FLOAT(i) /nmax2
    52         IF( xtild(i).EQ. 0.5 )  xtild(i) = xtild(i) + 1.e-6
    53        ENDDO
    54 
    55        DO i = 1, nmax
    56         fhyp(i) = TANH ( ( xtild(i) - 0.5*(1.- dzoom) )          /
    57      ,                 ( tau * xtild(i) * ( 0.5 -xtild(i))) )
    58        ENDDO
    59 
    60         fhyp(   0  ) = - 1.
    61         fhyp( nmax ) =   1.
     71        xtild(i) = - pi + FLOAT(i) * depi /nmax2
     72       ENDDO
     73
     74       DO i = 0, nmax2
     75
     76       fa  = tau*  ( dzoom/2.  - xtild(i) )
     77       fb  = xtild(i) *  ( pi - xtild(i) )
     78
     79
     80       IF( 200.* fb .LT. - fa )   THEN
     81         fhyp ( i) = - 1.
     82       ELSEIF( 200. * fb .LT. fa ) THEN
     83         fhyp ( i) =   1.
     84       ELSE
     85         fhyp(i) =  TANH ( fa/fb )
     86       ENDIF
     87
     88       IF ( xtild(i).EQ. 0. )  fhyp(i) =  1.
     89       IF ( xtild(i).EQ. pi )  fhyp(i) = -1.
     90
     91       ENDDO
    6292
    6393cc  ....  Calcul  de  beta  ....
    64 c
    65        ffdx( 0 ) = 0.
    66 
    67        DO i = 1, nmax
    68         xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
    69         fxm     = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) )    /
    70      ,                 ( tau * xmoy * ( 0.5 -xmoy)) )
    71         ffdx(i) = ffdx(i-1) + fxm * ( xtild(i) - xtild(i-1) )
    72        ENDDO
    73 
    74         beta  = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 )
     94c   ............................
     95
     96       ffdx = 0.
     97
     98       DO i = nmax +1,nmax2
     99
     100       xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
     101       fa  = tau*  ( dzoom/2.  - xmoy )
     102       fb  = xmoy *  ( pi - xmoy )
     103
     104       IF( 200.* fb .LT. - fa )   THEN
     105         fxm = - 1.
     106       ELSEIF( 200. * fb .LT. fa ) THEN
     107         fxm =   1.
     108       ELSE
     109         fxm =  TANH ( fa/fb )
     110       ENDIF
     111
     112       IF ( xmoy.EQ. 0. )  fhyp(i) =  1.
     113       IF ( xmoy.EQ. pi )  fhyp(i) = -1.
     114       ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )
     115
     116       ENDDO
     117
     118        beta  = ( grossism * ffdx - pi ) / ( ffdx - pi )
     119ccc        WRITE(6,*) ' ** X  beta **',beta,grossism
     120
     121       IF( 2.*beta - grossism.LE. 0.)  THEN
     122        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
     123     ,tine fxhyp est mauvaise ! '
     124        WRITE(6,*)'Modifier les valeurs de  grossismx ,tau ou dzoomx ',
     125     , ' et relancer ! ***  '
     126        CALL ABORT
     127       ENDIF
    75128c
    76129c   .....  calcul  de  Xprimt   .....
    77130c
    78131       
    79        DO i = 0, nmax
     132       DO i = nmax, nmax2
    80133        Xprimt(i) = beta  + ( grossism - beta ) * fhyp(i)
    81134       ENDDO
    82135c   
    83        DO i = 0, nmax
     136       DO i =  nmax+1, nmax2
    84137        Xprimt( nmax2 - i ) = Xprimt( i )
    85138       ENDDO
     
    88141c   .....  Calcul  de  Xf     ........
    89142
    90         Xf(0) = 0.
    91        DO i = 1, nmax
    92         xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
    93         fxm     = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) )    /
    94      ,                 ( tau * xmoy * ( 0.5 -xmoy)) )
    95         xxpr(i)    = beta + ( grossism - beta ) * fxm
    96        ENDDO
    97 
    98        DO i = 1,nmax
    99          xxpr(nmax2-i+1) = xxpr(i)
     143       Xf(0) = - pi
     144
     145       DO i =  nmax +1, nmax2
     146
     147       xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
     148       fa  = tau*  ( dzoom/2.  - xmoy )
     149       fb  = xmoy *  ( pi - xmoy )
     150
     151       IF( 200.* fb .LT. - fa )   THEN
     152         fxm = - 1.
     153       ELSEIF( 200. * fb .LT. fa ) THEN
     154         fxm =   1.
     155       ELSE
     156         fxm =  TANH ( fa/fb )
     157       ENDIF
     158
     159       IF ( xmoy.EQ. 0. )  fxm =  1.
     160       IF ( xmoy.EQ. pi )  fxm = -1.
     161       xxpr(i)    = beta + ( grossism - beta ) * fxm
     162
     163       ENDDO
     164
     165       DO i = nmax+1, nmax2
     166        xxpr(nmax2-i+1) = xxpr(i)
    100167       ENDDO
    101168
     
    103170         Xf(i)   = Xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) )
    104171        ENDDO
    105         do i=1,nmax2
    106         xf(i)=xf(i)/xf(nmax2)
    107         enddo
    108 
    109 
    110        PRINT *,' XF ',xf(0),xf(nmax),xf(nmax2)
    111172
    112173
     
    130191       ENDIF
    131192
     193      xo1   = 0.
    132194
    133195      DO 1500 i = 1, iim
    134196
    135       xlon2 = (  FLOAT(i) + xuv - 0.75) / FLOAT(iim)
    136 
    137       xo1   = 0.
    138       xi    = xlon2
    139 c
    140       DO 500 iter = 1,300
    141 
     197      xlon2 = - pi + (FLOAT(i) + xuv - 0.75) * depi / FLOAT(iim)
     198
     199      Xfi    = xlon2
     200c
    142201      DO 250 it =  nmax2,0,-1
    143       IF( xi.GE.xtild(it))  GO TO 350
     202      IF( Xfi.GE.Xf(it))  GO TO 350
    144203250   CONTINUE
    145204
    146205      it = 0
    147       xi = xtild(it)
    148206
    149207350   CONTINUE
    150        IF(it.EQ.nmax2)  THEN
    151         it       = nmax2 -1
    152         xf(it+1) = 1.
    153        ENDIF
    154 c  .................................................................
    155 c  ....  Interpolation entre  xi(it) et xi(it+1)   pour avoir X(xi) 
    156 c      .....           et   X'(xi)                             .....
    157 c  .................................................................
    158 
    159        xint   = ( Xf(it+1)-Xf(it) ) / ( xtild(it+1)-xtild(it) )      *
    160      +                    ( xi-xtild(it) )  +  Xf(it)
    161       Xprimin = ( Xprimt(it+1)-Xprimt(it) )/ ( xtild(it+1)-xtild(it) ) *
    162      +                    ( xi-xtild(it) )  +  Xprimt(it)
    163 
    164        xi = xi - (xint-xlon2)/Xprimin
    165 
    166       IF( ABS(xi-xo1).LE.epsilon) GO TO 550
    167       xo1 = xi
    168 c
     208
     209c    ......  Calcul de   Xf(xi)    ......
     210c
     211      xi  = xtild(it)
     212
     213      IF(it.EQ.nmax2)  THEN
     214       it       = nmax2 -1
     215       Xf(it+1) = pi
     216      ENDIF
     217c  .....................................................................
     218c
     219c   Appel de la routine qui calcule les coefficients a0,a1,a2,a3 d'un
     220c   polynome de degre 3  qui passe  par les points (Xf(it),xtild(it) )
     221c          et (Xf(it+1),xtild(it+1) )
     222
     223       CALL coefpoly ( Xf(it),Xf(it+1),Xprimt(it),Xprimt(it+1),
     224     ,                xtild(it),xtild(it+1),  a0, a1, a2, a3  )
     225
     226       Xf1     = Xf(it)
     227       Xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi
     228
     229       DO 500 iter = 1,300
     230        xi = xi - ( Xf1 - Xfi )/ Xprimin
     231
     232        IF( ABS(xi-xo1).LE.epsilon)  GO TO 550
     233         xo1      = xi
     234         xi2      = xi * xi
     235         Xf1      = a0 +  a1 * xi +     a2 * xi2  +     a3 * xi2 * xi
     236         Xprimin  =       a1      + 2.* a2 *  xi  + 3.* a3 * xi2
    169237500   CONTINUE
    170       PRINT *,' ***   PAS DE SOLUTION  ****  ',i,xlon2
    171         STOP 4
     238        WRITE(6,*) ' Pas de solution ***** ',i,xlon2,iter
     239          STOP 6
    172240550   CONTINUE
    173241
    174        xxprim(i)   = depi/( FLOAT(iim) * Xprimin)
    175        xvrai(i)    = depi *  (xi - 0.5) + xzoom
    176 
     242       xxprim(i) = depi/ ( FLOAT(iim) * Xprimin )
     243       xvrai(i)  =  xi + xzoom
    177244
    1782451500   CONTINUE
    179246
    180247       DO i = 1 , iim
    181         xlon  (i)   = xvrai(i)
     248        xlon(i)     = xvrai(i)
    182249        xprimm(i)   = xxprim(i)
    183 cc        xxlon(i) = xlon(i)*180./pi
    184250       ENDDO
    185251       
    186 cc      PRINT *,' XLON avant '
    187 cc      PRINT 68,(xxlon(i),i=1,iim)
    188        
    189252       DO i = 1, iim -1
    190253        IF( xvrai(i+1). LT. xvrai(i) )  THEN
    191          PRINT *,' PBS.  avec  rlonu(',i+1,' plus petit que rlonu(',i,
    192      ,   ')'
    193          STOP
     254         WRITE(6,*) ' PBS. avec rlonu(',i+1,') plus petit que rlonu(',i,
     255     ,  ')'
     256        STOP 7
    194257        ENDIF
    195258       ENDDO
     
    205268       ENDDO
    206269
    207        PRINT *,' LONGITUDES  min max ',champmin,champmax
    208 
    209270      IF(champmin .GE. - pi .AND. champmax.LE. pi )  THEN
    210271                GO TO 1600
    211272      ELSE
    212         PRINT 18
    213         PRINT *,'Reorganisation des longitudes pour avoir entre - pi ',
    214      ,  ' et  pi '
     273       WRITE(6,18)
     274       WRITE(6,*) 'Reorganisation des longitudes pour avoir entre - pi',
     275     ,  ' et pi '
    215276c
    216277        IF( xzoom.LE.0.)  THEN
     
    219280           IF( xvrai(i).GE. - pi )  GO TO 80
    220281          ENDDO
    221             PRINT *, ' PBS. 1 '
    222             STOP
     282            WRITE(6,*)  ' PBS. 1 !  Xvrai plus petit que  - pi ! '
     283            STOP 8
    223284 80       CONTINUE
    224285          is2 = i
     
    240301            IF( xvrai(i).LE. pi )  GO TO 90
    241302           ENDDO
    242              PRINT *,' PBS.  2 '
    243               STOP
     303             WRITE(6,*) ' PBS.  2 ! Xvrai plus grand  que   pi ! '
     304              STOP 9
    244305 90        CONTINUE
    245306            is2 = i
    246307          ENDIF
    247 cc           PRINT *,' IS2 ',is2
    248308           idif = iim -is2
    249309           DO ii = 1, is2
     
    270330         ENDDO
    271331
    272 
    273332         IF( ik.EQ.1 )  THEN
    274          PRINT *, ' XLON aux pts. V-0.25   apres ( en  deg. ) '
    275          PRINT 18
    276          PRINT 68,xvrai
    277          PRINT *,' XPRIM '
    278          PRINT 68, xprimm
     333          WRITE(6,*)  ' XLON aux pts. V-0.25   apres ( en  deg. ) '
     334          WRITE(6,18)
     335          WRITE(6,68) xvrai
     336ccc          WRITE(6,*) ' XPRIM k ',ik
     337ccc          WRITE(6,566)  xprimm
     338
    279339           DO i = 1,iim + 1
    280340             rlonm025(i) = xlon( i )
    281341            xprimm025(i) = xprimm(i)
    282342           ENDDO
     343
    283344         ELSE IF( ik.EQ.2 )  THEN
    284          PRINT 18
    285          PRINT *, ' XLON aux pts. V   apres ( en  deg. ) '
    286          PRINT 68,xvrai
    287          PRINT *,' XPRIM '
    288          PRINT 68, xprimm
     345          WRITE(6,18)
     346          WRITE(6,*)  ' XLON aux pts. V   apres ( en  deg. ) '
     347          WRITE(6,68) xvrai
     348ccc          WRITE(6,*) ' XPRIM k ',ik
     349ccc          WRITE(6,566)  xprimm
     350
    289351           DO i = 1,iim + 1
    290352             rlonv(i) = xlon( i )
    291353            xprimv(i) = xprimm(i)
    292354           ENDDO
    293          ELSE IF( ik.EQ.3 )  THEN
    294          PRINT 18
    295          PRINT *, ' XLON aux pts. U   apres ( en  deg. ) '
    296          PRINT 68,xvrai
    297          PRINT *,' XPRIM '
    298          PRINT 68, xprimm
     355
     356         ELSE IF( ik.EQ.3)   THEN
     357          WRITE(6,18)
     358          WRITE(6,*)  ' XLON aux pts. U   apres ( en  deg. ) '
     359          WRITE(6,68) xvrai
     360ccc          WRITE(6,*) ' XPRIM ik ',ik
     361ccc          WRITE(6,566)  xprimm
     362
    299363           DO i = 1,iim + 1
    300364             rlonu(i) = xlon( i )
    301365            xprimu(i) = xprimm(i)
    302366           ENDDO
     367
    303368         ELSE IF( ik.EQ.4 )  THEN
    304          PRINT 18
    305          PRINT *, ' XLON aux pts. V+0.25   apres ( en  deg. ) '
    306          PRINT 68,xvrai
    307          PRINT *,' XPRIM '
    308          PRINT 68, xprimm
     369          WRITE(6,18)
     370          WRITE(6,*)  ' XLON aux pts. V+0.25   apres ( en  deg. ) '
     371          WRITE(6,68) xvrai
     372ccc          WRITE(6,*) ' XPRIM ik ',ik
     373ccc          WRITE(6,566)  xprimm
     374
    309375           DO i = 1,iim + 1
    310376             rlonp025(i) = xlon( i )
    311377            xprimp025(i) = xprimm(i)
    312378           ENDDO
     379
    313380         ENDIF
    314381
    3153825000    CONTINUE
    316383c
    317 c       ...........  fin  de la boucle  do 5000      ............
    318 
    319 c
    320         DO i = 1, iim + 1
    321          dlon1(i) = rlonm025(i) - rlonv(i)
    322          dlon2(i) = rlonm025(i) - rlonp025(i)
    323          dlon3(i) = rlonm025(i) - rlonu(i)
     384c    ...........  fin  de la boucle  do 5000      ............
     385
     386        DO i = 1, iim
     387         xlon(i) = rlonv(i+1) - rlonv(i)
    324388        ENDDO
    325 
    326         DO i = 1, iim + 1
    327          rlonm025(i) = rlonm025(i) + dlon1(i)
     389        champmin =  1.e12
     390        champmax = -1.e12
     391        DO i = 1, iim
     392         champmin = MIN( champmin, xlon(i) )
     393         champmax = MAX( champmax, xlon(i) )
    328394        ENDDO
    329 
    330         DO i = 1, iim + 1
    331          rlonv(i)    = rlonm025(i) - dlon1(i)
    332          rlonp025(i) = rlonm025(i) - dlon2(i)
    333          rlonu(i)    = rlonm025(i) - dlon3(i)
    334         ENDDO
    335 
    336         DO i = 1, iim
    337          xprimu   (i) = rlonu(i+1) - rlonu(i)
    338          xprimv   (i) = rlonv(i+1) - rlonv(i)
    339          xprimm025(i) = rlonm025(i+1) - rlonm025(i)
    340          xprimp025(i) = rlonp025(i+1) - rlonp025(i)
    341         ENDDO
    342          xprimu   (iip1) = xprimu   (1)
    343          xprimv   (iip1) = xprimv   (1)
    344          xprimm025(iip1) = xprimm025(1)
    345          xprimp025(iip1) = xprimp025(1)
    346 
    347 
    348 18       FORMAT(/)
    349 68       FORMAT(1x,7f9.2)
    350 
    351 
    352          RETURN
    353          END
     395         champmin = champmin * 180./pi
     396         champmax = champmax * 180./pi
     397
     398        WRITE(6,18)
     399        WRITE(6,*) '  Longitudes '
     400        WRITE(6,18)
     401        WRITE(6,3)  champmin, champmax
     402        WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par
     403     ,ametres  grossism , tau , dzoom pour X et repasser ! '
     404        WRITE(6,18)
     405
     4063      Format(1x, ' Au centre du zoom , la longueur de la maille est',
     407     ,  ' d environ ',f8.2 ,' degres  ',
     408     , ' alors que la maille en dehors de la zone du zoom est d environ
     409     , ', f8.2,' degres ' )
     41018     FORMAT(/)
     41124     FORMAT(2x,' Parametres yzoom,gross,tau ,dzoom pour fyhyp ',4f8.3)
     41268     FORMAT(1x,7f9.2)
     413
     414       RETURN
     415       END
  • LMDZ.3.3/trunk/libf/dyn3d/fxyhyper.F

    r2 r203  
    1        SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy,deltay  ,
    2      ,                      xzoom, grossx, dzoomx,taux,
     1c
     2c $Header
     3c
     4       SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy  ,   
     5     ,                       xzoom, grossx, dzoomx,taux  ,
    36     , rlatu,yprimu,rlatv,yprimv,rlatu1,  yprimu1,  rlatu2,  yprimu2  ,
    47     , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025)
     
    1922c     a) le grossissement du zoom  :  grossy  ( en y ) et grossx ( en x )
    2023c     b) l' extension     du zoom  :  dzoomy  ( en y ) et dzoomx ( en x )
    21 c     c) la raideur       du zoom  :   tau   , ici  =  1.
     24c     c) la raideur de la transition du zoom  :   taux et tauy   
    2225c
    23 c     N.B :   le produit ( grossissement * extension )  doit etre <  1.
    24 c    *******
    25 c     En plus , il y a un autre parametre , moins important mais quand
    26 c     meme utile , c'est  deltay , deplacement de la zone du zoom en
    27 c     latitude   :  Si  on deplace  de 10. degres vers le nord  ( deltay
    28 c      = 10.  dans inigeom ) .
    29 c
     26c  N.B : Il vaut mieux avoir   :   grossx * dzoomx <  pi    ( radians )
     27c ******
     28c                  et              grossy * dzoomy <  pi/2  ( radians )
    3029c
    3130#include "dimensions.h"
     
    4039       REAL rlonu(iip1),xprimu(iip1),rlonv(iip1),xprimv(iip1),
    4140     , rlonm025(iip1),xprimm025(iip1), rlonp025(iip1),xprimp025(iip1)
    42        REAL deltay
    4341
    4442c   ....   var. locales   .....
     
    4745c
    4846
    49        CALL fyhyp ( yzoom, grossy, dzoomy,tauy, deltay ,
     47       CALL fyhyp ( yzoom, grossy, dzoomy,tauy  ,
    5048     ,  rlatu, yprimu,rlatv,yprimv,rlatu2,yprimu2,rlatu1,yprimu1 )
    51 
    5249
    5350       CALL fxhyp(xzoom,grossx,dzoomx,taux,rlonm025,xprimm025,rlonv,
     
    5552
    5653
    57         DO i = 1, iim
     54        DO i = 1, iip1
    5855          IF(rlonp025(i).LT.rlonv(i))  THEN
    59            PRINT *,' Attention !  rlonp025 < rlonv',i
     56           WRITE(6,*) ' Attention !  rlonp025 < rlonv',i
    6057            STOP
    6158          ENDIF
    6259
    6360          IF(rlonv(i).LT.rlonm025(i))  THEN
    64            PRINT *,' Attention !  rlonm025 > rlonv',i
     61           WRITE(6,*) ' Attention !  rlonm025 > rlonv',i
    6562            STOP
    6663          ENDIF
    6764
    6865          IF(rlonp025(i).GT.rlonu(i))  THEN
    69            PRINT *,' Attention !  rlonp025 > rlonu',i
     66           WRITE(6,*) ' Attention !  rlonp025 > rlonu',i
    7067            STOP
    7168          ENDIF
    7269        ENDDO
    7370
    74         PRINT *,'  *** TEST DE COHERENCE  OK    POUR   FX **** '
     71        WRITE(6,*) '  *** TEST DE COHERENCE  OK    POUR   FX **** '
    7572
    7673c
     
    7875c
    7976       IF(rlatu1(j).LE.rlatu2(j))   THEN
    80          PRINT *,' Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j
     77         WRITE(6,*)'Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j
    8178         STOP 13
    8279       ENDIF
    8380c
    8481       IF(rlatu2(j).LE.rlatu(j+1))  THEN
    85         PRINT *,' Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j
     82        WRITE(6,*)'Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j
    8683        STOP 14
    8784       ENDIF
    8885c
    8986       IF(rlatu(j).LE.rlatu1(j))    THEN
    90         PRINT *,' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j
     87        WRITE(6,*)' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j
    9188        STOP 15
    9289       ENDIF
    9390c
    9491       IF(rlatv(j).LE.rlatu2(j))    THEN
    95         PRINT *,' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j
     92        WRITE(6,*)' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j
    9693        STOP 16
    9794       ENDIF
    9895c
    9996       IF(rlatv(j).ge.rlatu1(j))    THEN
    100         PRINT *,' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j
     97        WRITE(6,*)' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j
    10198        STOP 17
    10299       ENDIF
    103100c
    104101       IF(rlatv(j).ge.rlatu(j))     THEN
    105         PRINT *,'Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j
     102        WRITE(6,*) ' Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j
    106103        STOP 18
    107104       ENDIF
     
    109106       ENDDO
    110107c
    111        PRINT *,'  *** TEST DE COHERENCE  OK    POUR   FY **** '
    112 
     108       WRITE(6,*) '  *** TEST DE COHERENCE  OK    POUR   FY **** '
     109       WRITE(6,25)
     11025     FORMAT(//)
    113111c
    114112
  • LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F

    r2 r203  
    1        SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau,deltay , 
     1c
     2c $Header
     3c
     4       SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau  , 
    25     ,  rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 )
    36
     7cc    ...  Version du 01/04/2001 ....
    48
    59       IMPLICIT NONE
     
    1317c
    1418c     grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois , etc)
    15 c     dzoom  etant  la distance totale de la zone du zoom
    16 c     tau  la transition ,   normalement  = 1  .
    17 
    18 c  N.B :  on doit avoir :  grossism * dzoom  <   1 .
    19 c         **************
    20 c
    21 c    Pour Indoex , on a pris :
    22 c         *******
    23 c    grossism = 2.5 , dzoom = 7/24  en x et  y  , pour iim = 128 et jjm=64
    24 c    yzoomdeg = 0.  , tau = 1.  et delaty = 10.
     19c     dzoom  etant  la distance totale de la zone du zoom ( en radians )
     20c     tau  la raideur de la transition de l'interieur a l'exterieur du zoom   
     21c
     22c
     23c N.B : Il vaut mieux avoir : grossism * dzoom  <  pi/2  (radians) ,en lati.
     24c      ********************************************************************
    2525c
    2626c
     
    2929
    3030       INTEGER      nmax , nmax2
    31        PARAMETER (  nmax = 50000, nmax2 = 2*nmax )
     31       PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
    3232c
    3333c
    3434c     .......  arguments  d'entree    .......
    3535c
    36        REAL yzoomdeg, grossism,dzoom,tau , deltay
     36       REAL yzoomdeg, grossism,dzoom,tau
     37c         ( rentres  par  run.def )
    3738
    3839c     .......  arguments  de sortie   .......
     
    4243
    4344c
    44 c    ..... Champs  locaux    .....
     45c     .....     champs  locaux    .....
    4546c
    4647     
    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
     48       REAL*8 ylat(jjp1), yprim(jjp1)
     49       REAL*8 yuv
     50       REAL*8 yt(0:nmax2)
     51       REAL*8 fhyp(0:nmax2),beta,Ytprim(0:nmax2),fxm(0:nmax2)
     52       SAVE Ytprim, yt,Yf
     53       REAL*8 Yf(0:nmax2),yypr(0:nmax2)
     54       REAL*8 yvrai(jjp1), yprimm(jjp1),ylatt(jjp1)
     55       REAL*8 pi,depi,pis2,epsilon,y0,pisjm
     56       REAL*8 yo1,yi,ylon2,ymoy,Yprimin,champmin,champmax
     57       REAL*8 yfi,Yf1,ffdy
     58       REAL*8 ypn,deply,y00
    5759       SAVE y00, deply
    5860
     
    6062       INTEGER jpn,jjpn
    6163       SAVE jpn
    62 
     64       REAL*8 a0,a1,a2,a3,yi2,heavyy0,heavyy0m
     65       REAL*8 fa(0:nmax2),fb(0:nmax2)
     66       REAL y0min,y0max
     67
     68       REAL*8     heavyside
     69       EXTERNAL   heavyside
    6370
    6471       pi       = 2. * ASIN(1.)
    6572       depi     = 2. * pi
    6673       pis2     = pi/2.
    67        epsilon  = 1.e-6
    68        yzoom    = yzoomdeg * pi/180.
    69 
    70 
     74       pisjm    = pi/ FLOAT(jjm)
     75       epsilon  = 1.e-3
     76       y0       =  yzoomdeg * pi/180.
     77
     78       IF( dzoom.LT.1.)  THEN
     79         dzoom = dzoom * pi
     80       ELSEIF( dzoom.LT. 12. ) THEN
     81         WRITE(6,*) ' Le param. dzoomy pour fyhyp est trop petit ! L aug
     82     ,menter et relancer ! '
     83         STOP 1
     84       ELSE
     85         dzoom = dzoom * pi/180.
     86       ENDIF
     87
     88       WRITE(6,*) '  yzoom ,dzoomy (radians),tau',y0,dzoom,tau
    7189
    7290       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.
     91        yt(i) = - pis2  + FLOAT(i)* pi /nmax2
     92       ENDDO
     93
     94       heavyy0m = heavyside( -y0 )
     95       heavyy0  = heavyside(  y0 )
     96       y0min    = 2.*y0*heavyy0m - pis2
     97       y0max    = 2.*y0*heavyy0  + pis2
     98
     99       DO i = 0, nmax2
     100        IF( yt(i).LT.y0 )  THEN
     101         fa (i) = tau*  (yt(i)-y0+dzoom/2. )
     102         fb(i) =   (yt(i)-2.*y0*heavyy0m +pis2) * ( y0 - yt(i) )
     103        ELSEIF ( yt(i).GT.y0 )  THEN
     104         fa(i) =   tau *(y0-yt(i)+dzoom/2. )
     105         fb(i) = (2.*y0*heavyy0 -yt(i)+pis2) * ( yt(i) - y0 )
     106       ENDIF
     107       
     108       IF( 200.* fb(i) .LT. - fa(i) )   THEN
     109         fhyp ( i) = - 1.
     110       ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
     111         fhyp ( i) =   1.
     112       ELSE 
     113         fhyp(i) =  TANH ( fa(i)/fb(i) )
     114       ENDIF
     115
     116       IF( yt(i).EQ.y0 )  fhyp(i) = 1.
     117       IF(yt(i).EQ. y0min. OR.yt(i).EQ. y0max ) fhyp(i) = -1.
     118
     119       ENDDO
    84120
    85121cc  ....  Calcul  de  beta  ....
    86122c
    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 )
     123       ffdy   = 0.
     124
     125       DO i = 1, nmax2
     126        ymoy    = 0.5 * ( yt(i-1) + yt( i ) )
     127        IF( ymoy.LT.y0 )  THEN
     128         fa(i)= tau * ( ymoy-y0+dzoom/2.)
     129         fb(i) = (ymoy-2.*y0*heavyy0m +pis2) * ( y0 - ymoy )
     130        ELSEIF ( ymoy.GT.y0 )  THEN
     131         fa(i)= tau * ( y0-ymoy+dzoom/2. )
     132         fb(i) = (2.*y0*heavyy0 -ymoy+pis2) * ( ymoy - y0 )
     133        ENDIF
     134
     135        IF( 200.* fb(i) .LT. - fa(i) )    THEN
     136         fxm ( i) = - 1.
     137        ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
     138         fxm ( i) =   1.
     139        ELSE
     140         fxm(i) =  TANH ( fa(i)/fb(i) )
     141        ENDIF
     142         IF( ymoy.EQ.y0 )  fxm(i) = 1.
     143         IF (ymoy.EQ. y0min. OR.yt(i).EQ. y0max ) fxm(i) = -1.
     144         ffdy = ffdy + fxm(i) * ( yt(i) - yt(i-1) )
     145
     146        ENDDO
     147
     148        beta  = ( grossism * ffdy - pi ) / ( ffdy - pi )
     149
     150       IF( 2.*beta - grossism.LE. 0.)  THEN
     151
     152        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
     153     ,tine fyhyp est mauvaise ! '
     154        WRITE(6,*)'Modifier les valeurs de  grossismy ,tauy ou dzoomy',
     155     , ' et relancer ! ***  '
     156        CALL ABORT
     157
     158       ENDIF
    97159c
    98160c   .....  calcul  de  Ytprim   .....
    99161c
    100162       
    101        DO i = 0, nmax
     163       DO i = 0, nmax2
    102164        Ytprim(i) = beta  + ( grossism - beta ) * fhyp(i)
    103165       ENDDO
    104 c   
    105        DO i = 0, nmax
    106         Ytprim( nmax2 - i ) = Ytprim( i )
    107        ENDDO
    108 c
    109166
    110167c   .....  Calcul  de  Yf     ........
    111168
    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
    127 c
    128 c
     169       Yf(0) = - pis2
     170       DO i = 1, nmax2
     171        yypr(i)    = beta + ( grossism - beta ) * fxm(i)
     172       ENDDO
     173
     174       DO i=1,nmax2
     175        Yf(i)   = Yf(i-1) + yypr(i) * ( yt(i) - yt(i-1) )
     176       ENDDO
    129177
    130178c    ****************************************************************
     
    149197         jlat = jjm
    150198       ENDIF
    151        
    152 c
     199c
     200       yo1   = 0.
    153201       DO 1500 j =  1,jlat
    154 
    155         ylon2 =  ( FLOAT(j)  + yuv  -1.) / FLOAT(jjm)
    156 
    157202        yo1   = 0.
    158         yi    = ylon2
    159 
    160 c
    161        DO 500 iter = 1,300
    162 
     203        ylon2 =  - pis2 + pisjm * ( FLOAT(j)  + yuv  -1.) 
     204        yfi    = ylon2
     205c
    163206       DO 250 it =  nmax2,0,-1
    164         IF( yi.GE.ytild(it))  GO TO 350
     207        IF( yfi.GE.Yf(it))  GO TO 350
    165208250    CONTINUE
    166 
    167209       it = 0
    168        yi = ytild(it)
    169 
    170210350    CONTINUE
    171211
     212       yi = yt(it)
    172213       IF(it.EQ.nmax2)  THEN
    173214        it       = nmax2 -1
    174         Yf(it+1) = 1.
     215        Yf(it+1) = pis2
    175216       ENDIF
    176217c  .................................................................
     
    179220c  .................................................................
    180221
    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
    189 c
     222       CALL coefpoly ( Yf(it),Yf(it+1),Ytprim(it), Ytprim(it+1),   
     223     ,                  yt(it),yt(it+1) ,   a0,a1,a2,a3   )     
     224
     225       Yf1     = Yf(it)
     226       Yprimin = a1 + 2.* a2 * yi + 3.*a3 * yi *yi
     227
     228       DO 500 iter = 1,300
     229         yi = yi - ( Yf1 - yfi )/ Yprimin
     230
     231        IF( ABS(yi-yo1).LE.epsilon)  GO TO 550
     232         yo1      = yi
     233         yi2      = yi * yi
     234         Yf1      = a0 +  a1 * yi +     a2 * yi2  +     a3 * yi2 * yi
     235         Yprimin  =       a1      + 2.* a2 *  yi  + 3.* a3 * yi2
    190236500   CONTINUE
    191       PRINT *,' ***   PAS DE SOLUTION  **** ',j,ylon2,iter
    192         STOP 4
     237        WRITE(6,*) ' Pas de solution ***** ',j,ylon2,iter
     238         STOP 2
    193239550   CONTINUE
    194 
    195        yprim(j)    = pi /( FLOAT(jjm) *  Yprimin)
    196        yvrai(j)    = pi *  (yi - 0.5) + yzoom
     240c
     241       Yprimin   = a1  + 2.* a2 *  yi   + 3.* a3 * yi* yi
     242       yprim(j)  = pi / ( jjm * Yprimin )
     243       yvrai(j)  = yi
    197244
    1982451500    CONTINUE
    199 
    200 cc          print *,' LAT avant reorgan '
    201 cc         print 68,(yyvrai(j),j=1,jlat)
    202246
    203247       DO j = 1, jlat -1
    204248        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 '
    214 c
    215            
     249         WRITE(6,*) ' PBS. avec  rlat(',j+1,') plus petit que rlat(',j,
     250     ,  ')'
     251         STOP 3
     252        ENDIF
     253       ENDDO
     254
     255       WRITE(6,18)
     256       WRITE(6,*) 'Reorganisation des latitudes pour avoir entre - pi/2'
     257     , ,' et  pi/2 '
     258c
    216259        IF( ik.EQ.1 )   THEN
    217            ypn = pis2 - deltay * pi/180.
     260           ypn = pis2
    218261          DO j = jlat,1,-1
    219262           IF( yvrai(j).LE. ypn ) GO TO 1502
     
    239282         ENDDO
    240283
    241 
    242 
    243284c      ***********   Fin de la reorganisation     *************
    244285c
    245286 1600   CONTINUE
    246 
    247 
    248287
    249288       DO j = 1, jlat
     
    256295        ENDDO
    257296
    258 
    259297        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)
     298         WRITE(6,18)
     299         WRITE(6,*)  ' YLAT  en U   apres ( en  deg. ) '
     300         WRITE(6,68) (yvrai(j),j=1,jlat)
     301cc         WRITE(6,*) ' YPRIM '
     302cc         WRITE(6,445) ( yprim(j),j=1,jlat)
     303
    265304          DO j = 1, jlat
    266305            rrlatu(j) =  ylat( j )
    267306           yyprimu(j) = yprim( j )
    268307          ENDDO
    269 c
     308
    270309        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)
     310         WRITE(6,18)
     311         WRITE(6,*) ' YLAT   en V  apres ( en  deg. ) '
     312         WRITE(6,68) (yvrai(j),j=1,jlat)
     313cc         WRITE(6,*)' YPRIM '
     314cc         WRITE(6,445) ( yprim(j),j=1,jlat)
     315
    276316          DO j = 1, jlat
    277317            rrlatv(j) =  ylat( j )
    278318           yyprimv(j) = yprim( j )
    279319          ENDDO
    280 c
     320
    281321        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)
     322         WRITE(6,18)
     323         WRITE(6,*)  ' YLAT  en U + 0.75  apres ( en  deg. ) '
     324         WRITE(6,68) (yvrai(j),j=1,jlat)
     325cc         WRITE(6,*) ' YPRIM '
     326cc         WRITE(6,445) ( yprim(j),j=1,jlat)
     327
    287328          DO j = 1, jlat
    288329            rlatu2(j) =  ylat( j )
     
    291332
    292333        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)
     334         WRITE(6,18)
     335         WRITE(6,*)  ' YLAT en U + 0.25  apres ( en  deg. ) '
     336         WRITE(6,68)(yvrai(j),j=1,jlat)
     337cc         WRITE(6,*) ' YPRIM '
     338cc         WRITE(6,68) ( yprim(j),j=1,jlat)
     339
    298340          DO j = 1, jlat
    299341            rlatu1(j) =  ylat( j )
    300342           yprimu1(j) = yprim( j )
    301343          ENDDO
     344
    302345        ENDIF
    303346
     
    306349c  .....     fin de la boucle  do 5000 .....
    307350
     351        DO j = 1, jjm
     352         ylat(j) = rrlatu(j) - rrlatu(j+1)
     353        ENDDO
     354        champmin =  1.e12
     355        champmax = -1.e12
     356        DO j = 1, jjm
     357         champmin = MIN( champmin, ylat(j) )
     358         champmax = MAX( champmax, ylat(j) )
     359        ENDDO
     360         champmin = champmin * 180./pi
     361         champmax = champmax * 180./pi
     362
     363        WRITE(6,18)
     364        WRITE(6,*) '  Latitudes  '
     365        WRITE(6,18)
     366        WRITE(6,3)  champmin, champmax
     367        WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par
     368     ,ametres  grossism , tau , dzoom pour Y et repasser ! '
     369        WRITE(6,18)
     370c
     3713      Format(1x, ' Au centre du zoom , la longueur de la maille est',
     372     ,  ' d environ ',f8.2 ,' degres  ',
     373     , ' alors que la maille en dehors de la zone du zoom est d environ
     374     , ', f8.2,' degres ' )
    30837518      FORMAT(/)
    30937668      FORMAT(1x,7f9.2)
  • LMDZ.3.3/trunk/libf/dyn3d/inigeom.F

    r2 r203  
     1c
     2c $Header
     3c
    14      SUBROUTINE inigeom
    25c
    36c     Auteur :  P. Le Van
    4 c    .....................
    5 c
    6 c   ............      Version  du 20/12/98     ........................
     7c
     8c   ............      Version  du 01/04/2001     ........................
    79c
    810c  Calcul des elongations cuij1,.cuij4 , cvij1,..cvij4  aux memes en-
    911c     endroits que les aires aireij1,..aireij4 .
     12
    1013c  Choix entre f(y) a derivee sinusoid. ou a derivee tangente hyperbol.
    1114c
    1215c
    1316      IMPLICIT NONE
    14 c
    15       REAL        deltay, tauy, taux
    16       PARAMETER ( deltay =  0. , tauy = 1. , taux = 1. )
    17 c
    18 c     deltay  est ( en degres ) le deplacement eventuel en Y du zoom
    19 cc    taux  et  tauy  sont  les raideurs   du  zoom
    20 c
    2117c
    2218#include "dimensions.h"
     
    5046      SAVE rlonm025,xprimm025,rlonp025,xprimp025
    5147
    52 
    53 
    54 c----------------------------------------------------------------------
    5548      REAL      SSUM
    5649      EXTERNAL  SSUM
    57 c
    5850c
    5951c
     
    6254c   -    calcul des coeff. ( cu, cv , 1./cu**2,  1./cv**2  )         -
    6355c   -                                                                -
    64 c   ------------------------------------------------------------------
    6556c   ------------------------------------------------------------------
    6657c
     
    168159c
    169160c
    170       PRINT 3
     161      WRITE(6,3)
    171162 3    FORMAT( // 10x,' ....  INIGEOM  date du 01/06/98   ..... ',
    172163     * //5x,'   Calcul des elongations cu et cv  comme sommes des 4 ' /
     
    191182      ENDIF
    192183
    193       PRINT *,' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,
     184      WRITE(6,*) ' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,
    194185     *  nitergdiv,nitergrot,niterh
    195186c
    196187      pi    = 2.* ASIN(1.)
    197188c
    198       PRINT 990
     189      WRITE(6,990)
    199190
    200191c     ----------------------------------------------------------------
     
    205196       IF( ysinus )  THEN
    206197c
    207         PRINT *,' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '
     198        WRITE(6,*) ' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '
    208199c
    209200c   .... utilisation de f(x,y )  avec  y  =  sinus de la latitude  .....
     
    215206       ELSE
    216207c
    217         PRINT *,' *** Inigeom ,  Y = Latitude  , der. sinusoid . ***'
     208        WRITE(6,*) '*** Inigeom ,  Y = Latitude  , der. sinusoid . ***'
    218209
    219210c  .... utilisation  de f(x,y) a tangente sinusoidale , y etant la latit. ...
     
    267258      ELSE
    268259c
    269 c   ....  utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.
     260c   ....  Utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.
    270261c   .....................................................................
    271262
    272        PRINT *,'*** Inigeom , Y = Latitude  , der.tg. hyperbolique ***'
    273 
    274        CALL fxyhyper( clat, grossismy, dzoomy, tauy, deltay  ,
    275      ,               clon, grossismx, dzoomx, taux          ,
     263      WRITE(6,*)'*** Inigeom , Y = Latitude  , der.tg. hyperbolique ***'
     264 
     265       CALL fxyhyper( clat, grossismy, dzoomy, tauy    ,
     266     ,                clon, grossismx, dzoomx, taux    ,
    276267     , rlatu,yprimu,rlatv, yprimv,rlatu1, yprimu1,rlatu2,yprimu2  ,
    277268     , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025 )
     
    387378c
    388379      IF ( j. eq. jjp1 )  THEN
    389 
    390380       yprp               = yprimu2(j-1)
    391381       rlatp              = rlatu2 (j-1)
    392 cc       yprp             = fyprim( FLOAT(j) - 0.25 )
    393 cc       rlatp            = fy    ( FLOAT(j) - 0.25 )
     382ccc       yprp             = fyprim( FLOAT(j) - 0.25 )
     383ccc       rlatp            = fy    ( FLOAT(j) - 0.25 )
    394384c
    395385      coslatp             = COS( rlatp )
     
    425415        rlatm    = rlatu1 (  j  )
    426416        yprm     = yprimu1(  j  )
    427 c         rlatp    = fy    ( FLOAT(j) - 0.25 )
    428 c         yprp     = fyprim( FLOAT(j) - 0.25 )
    429 c         rlatm    = fy    ( FLOAT(j) + 0.25 )
    430 c         yprm     = fyprim( FLOAT(j) + 0.25 )
     417cc         rlatp    = fy    ( FLOAT(j) - 0.25 )
     418cc         yprp     = fyprim( FLOAT(j) - 0.25 )
     419cc         rlatm    = fy    ( FLOAT(j) + 0.25 )
     420cc         yprm     = fyprim( FLOAT(j) + 0.25 )
    431421
    432422         coslatm  = COS( rlatm )
     
    490480  36  CONTINUE
    491481c
    492 c   ....  Modif  P. Le Van  ( 4/07/96 )  .....
    493482c
    494483      aire    (iip1,j) = aire    (1,j)
     
    620609         aiuscv2gam(iip1,j)  = aiuscv2gam(1,j)
    621610      ENDDO
    622 c
     611
    623612c
    624613c   calcul des aires aux  poles :
     
    666655c-----------------------------------------------------------------------
    667656c
    668        PRINT *,' INIGEOM  RLONV '
     657       WRITE(6,*) '   ***  Coordonnees de la grille  *** '
     658       WRITE(6,995)
     659c
     660       WRITE(6,*) '   LONGITUDES  aux pts.   V  ( degres )  '
     661       WRITE(6,995)
    669662        DO i=1,iip1
    670663         rlonvv(i) = rlonv(i)*180./pi
    671664        ENDDO
    672        PRINT 400,rlonvv
    673 c
    674        PRINT *,' RLATV '
     665       WRITE(6,400) rlonvv
     666c
     667       WRITE(6,995)
     668       WRITE(6,*) '   LATITUDES   aux pts.   V  ( degres )  '
     669       WRITE(6,995)
    675670        DO i=1,jjm
    676671         rlatuu(i)=rlatv(i)*180./pi
    677672        ENDDO
    678        PRINT 400,(rlatuu(i),i=1,jjm)
     673       WRITE(6,400) (rlatuu(i),i=1,jjm)
    679674c
    680675        DO i=1,iip1
    681676          rlonvv(i)=rlonu(i)*180./pi
    682677        ENDDO
    683        PRINT *,' RLONU '
    684        PRINT 400,rlonvv
    685 c
    686        PRINT *,' RLATU '
     678       WRITE(6,995)
     679       WRITE(6,*) '   LONGITUDES  aux pts.   U  ( degres )  '
     680       WRITE(6,995)
     681       WRITE(6,400) rlonvv
     682       WRITE(6,995)
     683
     684       WRITE(6,*) '   LATITUDES   aux pts.   U  ( degres )  '
     685       WRITE(6,995)
    687686        DO i=1,jjp1
    688687         rlatuu(i)=rlatu(i)*180./pi
    689688        ENDDO
    690        PRINT 400,(rlatuu(i),i=1,jjp1)
    691 c
     689       WRITE(6,400) (rlatuu(i),i=1,jjp1)
     690       WRITE(6,995)
     691c
     692444    format(f10.3,f6.0)
    692693400    FORMAT(1x,8f8.2)
    693694990    FORMAT(//)
     695995    FORMAT(/)
    694696c
    695697      RETURN
  • LMDZ.3.3/trunk/libf/dyn3d/serre.h

    r2 r203  
     1c
     2c $Header
     3c
    14c..include serre.h
    25c
    36       REAL clon,clat,transx,transy,alphax,alphay,pxo,pyo,
    4      ,  grossismx, grossismy, dzoomx, dzoomy
     7     ,  grossismx, grossismy, dzoomx, dzoomy,taux,tauy
    58       COMMON/serre/clon,clat,transx,transy,alphax,alphay,pxo,pyo ,
    6      ,  grossismx, grossismy, dzoomx, dzoomy
     9     ,  grossismx, grossismy, dzoomx, dzoomy,taux,tauy
Note: See TracChangeset for help on using the changeset viewer.