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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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)
Note: See TracChangeset for help on using the changeset viewer.