Ignore:
Timestamp:
Mar 2, 2015, 5:11:07 PM (10 years ago)
Author:
lguez
Message:

Bug fix in fxhyp. There was some bad logic for the shifting of
longitude grids rlonuv, rlonv, rlonm025 and rlonp025 toward [- pi,
pi]. In some cases, one of the four grids was not shifted and the
others were. For example, you could see the bug with: iim = 48, clon =
20, grossismx = 3, dzoomx = 0.15. The bad logic involved the variable
is2 in the loop on ik = 1, 4. The loop included some tests depending
on ik. The whole thing was quite convoluted. Rewrote fxhyp. In
particular, replaced the loop on ik by a call to a new procedure,
invert_zoom_x. fxhyp.F was in dyn3d, it is replaced by fxhyp_m.F90
which is in dyn3d_common. Removed several arguments of fxhyp: zoom
parameters are accessed through serre.h; rlonm025 and rlonp025 were
not used in inigeom; min and max of longitude steps are written inside
fxhyp.

Some simplifications and modernizations in fyhyp. In particular,
several arguments are removed: zoom parameters are accessed through
serre.h; yprimv was not used in inigeom; min and max of latitude steps
are written inside fyhyp.

Removed now useless intermediary procedure fxyhyper.

Changed default value of dzoomx and dzoomy from 0 to 0.2. dzoom[xy] is
only needed when grossism[xy] > 1 and then it should be > 0.

dzoom[xy] can no longer be the extent of the zoom in degrees: it must
be expressed as the fraction of the total domain.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/dyn3d_common/fyhyp_m.F90

    r2217 r2218  
    1 !
    2 ! $Id$
    3 !
    4 c
    5 c
    6        SUBROUTINE fyhyp ( yzoomdeg, grossism, dzooma,tau  , 
    7      ,  rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 ,
    8      ,  champmin,champmax                                            )
    9 
    10 cc    ...  Version du 01/04/2001 ....
    11 
    12        IMPLICIT NONE
    13 c
    14 c    ...   Auteur :  P. Le Van  ...
    15 c
    16 c    .......    d'apres  formulations  de R. Sadourny  .......
    17 c
    18 c     Calcule les latitudes et derivees dans la grille du GCM pour une
    19 c     fonction f(y) a tangente  hyperbolique  .
    20 c
    21 c     grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois , etc)
    22 c     dzoom  etant  la distance totale de la zone du zoom ( en radians )
    23 c     tau  la raideur de la transition de l'interieur a l'exterieur du zoom   
    24 c
    25 c
    26 c N.B : Il vaut mieux avoir : grossism * dzoom  <  pi/2  (radians) ,en lati.
    27 c      ********************************************************************
    28 c
    29 c
    30 #include "dimensions.h"
    31 #include "paramet.h"
    32 
    33        INTEGER      nmax , nmax2
    34        PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
    35 c
    36 c
    37 c     .......  arguments  d'entree    .......
    38 c
    39        REAL yzoomdeg, grossism,dzooma,tau
    40 c         ( rentres  par  run.def )
    41 
    42 c     .......  arguments  de sortie   .......
    43 c
    44        REAL rrlatu(jjp1), yyprimu(jjp1),rrlatv(jjm), yyprimv(jjm),
    45      , rlatu1(jjm), yprimu1(jjm), rlatu2(jjm), yprimu2(jjm)
    46 
    47 c
    48 c     .....     champs  locaux    .....
    49 c
    50      
    51        REAL   dzoom
    52        REAL(KIND=8) ylat(jjp1), yprim(jjp1)
    53        REAL(KIND=8) yuv
    54        REAL(KIND=8) yt(0:nmax2)
    55        REAL(KIND=8) fhyp(0:nmax2),beta,Ytprim(0:nmax2),fxm(0:nmax2)
    56        SAVE Ytprim, yt,Yf
    57        REAL(KIND=8) Yf(0:nmax2),yypr(0:nmax2)
    58        REAL(KIND=8) yvrai(jjp1), yprimm(jjp1),ylatt(jjp1)
    59        REAL(KIND=8) pi,depi,pis2,epsilon,y0,pisjm
    60        REAL(KIND=8) yo1,yi,ylon2,ymoy,Yprimin,champmin,champmax
    61        REAL(KIND=8) yfi,Yf1,ffdy
    62        REAL(KIND=8) ypn,deply,y00
    63        SAVE y00, deply
    64 
    65        INTEGER i,j,it,ik,iter,jlat
    66        INTEGER jpn,jjpn
    67        SAVE jpn
    68        REAL(KIND=8) a0,a1,a2,a3,yi2,heavyy0,heavyy0m
    69        REAL(KIND=8) fa(0:nmax2),fb(0:nmax2)
    70        REAL y0min,y0max
    71 
    72        REAL(KIND=8)     heavyside
    73 
    74        pi       = 2. * ASIN(1.)
    75        depi     = 2. * pi
    76        pis2     = pi/2.
    77        pisjm    = pi/ REAL(jjm)
    78        epsilon  = 1.e-3
    79        y0       =  yzoomdeg * pi/180.
    80 
    81        IF( dzooma.LT.1.)  THEN
    82          dzoom = dzooma * pi
    83        ELSEIF( dzooma.LT. 12. ) THEN
    84          WRITE(6,*) ' Le param. dzoomy pour fyhyp est trop petit ! L aug
    85      ,menter et relancer ! '
    86          STOP 1
     1module fyhyp_m
     2
     3  IMPLICIT NONE
     4
     5contains
     6
     7  SUBROUTINE fyhyp(rlatu, yyprimu, rlatv, rlatu2, yprimu2, rlatu1, yprimu1)
     8
     9    ! From LMDZ4/libf/dyn3d/fyhyp.F, version 1.2, 2005/06/03 09:11:32
     10
     11    ! Author: P. Le Van, from analysis by R. Sadourny
     12
     13    ! Calcule les latitudes et dérivées dans la grille du GCM pour une
     14    ! fonction f(y) à dérivée tangente hyperbolique.
     15
     16    ! Il vaut mieux avoir : grossismy * dzoom < pi / 2
     17
     18    use coefpoly_m, only: coefpoly
     19
     20    include "dimensions.h"
     21    ! for jjm
     22
     23    include "serre.h"
     24    ! for clat, grossismy, dzoomy, tauy
     25
     26    REAL, intent(out):: rlatu(jjm + 1), yyprimu(jjm + 1)
     27    REAL, intent(out):: rlatv(jjm)
     28    real, intent(out):: rlatu2(jjm), yprimu2(jjm), rlatu1(jjm), yprimu1(jjm)
     29
     30    ! Local:
     31
     32    DOUBLE PRECISION champmin, champmax
     33    INTEGER, PARAMETER:: nmax=30000, nmax2=2*nmax
     34    REAL dzoom ! distance totale de la zone du zoom (en radians)
     35    DOUBLE PRECISION ylat(jjm + 1), yprim(jjm + 1)
     36    DOUBLE PRECISION yuv
     37    DOUBLE PRECISION, save:: yt(0:nmax2)
     38    DOUBLE PRECISION fhyp(0:nmax2), beta
     39    DOUBLE PRECISION, save:: ytprim(0:nmax2)
     40    DOUBLE PRECISION fxm(0:nmax2)
     41    DOUBLE PRECISION, save:: yf(0:nmax2)
     42    DOUBLE PRECISION yypr(0:nmax2)
     43    DOUBLE PRECISION yvrai(jjm + 1), yprimm(jjm + 1), ylatt(jjm + 1)
     44    DOUBLE PRECISION pi, pis2, epsilon, y0, pisjm
     45    DOUBLE PRECISION yo1, yi, ylon2, ymoy, yprimin
     46    DOUBLE PRECISION yfi, yf1, ffdy
     47    DOUBLE PRECISION ypn, deply, y00
     48    SAVE y00, deply
     49
     50    INTEGER i, j, it, ik, iter, jlat
     51    INTEGER jpn, jjpn
     52    SAVE jpn
     53    DOUBLE PRECISION a0, a1, a2, a3, yi2, heavyy0, heavyy0m
     54    DOUBLE PRECISION fa(0:nmax2), fb(0:nmax2)
     55    REAL y0min, y0max
     56
     57    DOUBLE PRECISION heavyside
     58
     59    !-------------------------------------------------------------------
     60
     61    print *, "Call sequence information: fyhyp"
     62
     63    pi = 2.*asin(1.)
     64    pis2 = pi/2.
     65    pisjm = pi/real(jjm)
     66    epsilon = 1e-3
     67    y0 = clat*pi/180.
     68    dzoom = dzoomy*pi
     69    print *, 'yzoom(rad), grossismy, tauy, dzoom (rad):'
     70    print *, y0, grossismy, tauy, dzoom
     71
     72    DO i = 0, nmax2
     73       yt(i) = -pis2 + real(i)*pi/nmax2
     74    END DO
     75
     76    heavyy0m = heavyside(-y0)
     77    heavyy0 = heavyside(y0)
     78    y0min = 2.*y0*heavyy0m - pis2
     79    y0max = 2.*y0*heavyy0 + pis2
     80
     81    fa = 999.999
     82    fb = 999.999
     83
     84    DO i = 0, nmax2
     85       IF (yt(i)<y0) THEN
     86          fa(i) = tauy*(yt(i)-y0 + dzoom/2.)
     87          fb(i) = (yt(i)-2.*y0*heavyy0m + pis2)*(y0-yt(i))
     88       ELSE IF (yt(i)>y0) THEN
     89          fa(i) = tauy*(y0-yt(i) + dzoom/2.)
     90          fb(i) = (2.*y0*heavyy0-yt(i) + pis2)*(yt(i)-y0)
     91       END IF
     92
     93       IF (200.*fb(i)<-fa(i)) THEN
     94          fhyp(i) = -1.
     95       ELSE IF (200.*fb(i)<fa(i)) THEN
     96          fhyp(i) = 1.
    8797       ELSE
    88          dzoom = dzooma * pi/180.
    89        ENDIF
    90 
    91        WRITE(6,18)
    92        WRITE(6,*) ' yzoom( rad.),grossism,tau,dzoom (radians)'
    93        WRITE(6,24) y0,grossism,tau,dzoom
    94 
    95        DO i = 0, nmax2
    96         yt(i) = - pis2  + REAL(i)* pi /nmax2
    97        ENDDO
    98 
    99        heavyy0m = heavyside( -y0 )
    100        heavyy0  = heavyside(  y0 )
    101        y0min    = 2.*y0*heavyy0m - pis2
    102        y0max    = 2.*y0*heavyy0  + pis2
    103 
    104        fa = 999.999
    105        fb = 999.999
    106        
    107        DO i = 0, nmax2
    108         IF( yt(i).LT.y0 )  THEN
    109          fa (i) = tau*  (yt(i)-y0+dzoom/2. )
    110          fb(i) =   (yt(i)-2.*y0*heavyy0m +pis2) * ( y0 - yt(i) )
    111         ELSEIF ( yt(i).GT.y0 )  THEN
    112          fa(i) =   tau *(y0-yt(i)+dzoom/2. )
    113          fb(i) = (2.*y0*heavyy0 -yt(i)+pis2) * ( yt(i) - y0 )
    114        ENDIF
    115        
    116        IF( 200.* fb(i) .LT. - fa(i) )   THEN
    117          fhyp ( i) = - 1.
    118        ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
    119          fhyp ( i) =   1.
    120        ELSE 
    121          fhyp(i) =  TANH ( fa(i)/fb(i) )
    122        ENDIF
    123 
    124        IF( yt(i).EQ.y0 )  fhyp(i) = 1.
    125        IF(yt(i).EQ. y0min. OR.yt(i).EQ. y0max ) fhyp(i) = -1.
    126 
    127        ENDDO
    128 
    129 cc  ....  Calcul  de  beta  ....
    130 c
    131        ffdy   = 0.
    132 
    133        DO i = 1, nmax2
    134         ymoy    = 0.5 * ( yt(i-1) + yt( i ) )
    135         IF( ymoy.LT.y0 )  THEN
    136          fa(i)= tau * ( ymoy-y0+dzoom/2.)
    137          fb(i) = (ymoy-2.*y0*heavyy0m +pis2) * ( y0 - ymoy )
    138         ELSEIF ( ymoy.GT.y0 )  THEN
    139          fa(i)= tau * ( y0-ymoy+dzoom/2. )
    140          fb(i) = (2.*y0*heavyy0 -ymoy+pis2) * ( ymoy - y0 )
    141         ENDIF
    142 
    143         IF( 200.* fb(i) .LT. - fa(i) )    THEN
    144          fxm ( i) = - 1.
    145         ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
    146          fxm ( i) =   1.
    147         ELSE
    148          fxm(i) =  TANH ( fa(i)/fb(i) )
    149         ENDIF
    150          IF( ymoy.EQ.y0 )  fxm(i) = 1.
    151          IF (ymoy.EQ. y0min. OR.yt(i).EQ. y0max ) fxm(i) = -1.
    152          ffdy = ffdy + fxm(i) * ( yt(i) - yt(i-1) )
    153 
    154         ENDDO
    155 
    156         beta  = ( grossism * ffdy - pi ) / ( ffdy - pi )
    157 
    158        IF( 2.*beta - grossism.LE. 0.)  THEN
    159 
    160         WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
    161      ,tine fyhyp est mauvaise ! '
    162         WRITE(6,*)'Modifier les valeurs de  grossismy ,tauy ou dzoomy',
    163      , ' et relancer ! ***  '
    164         CALL ABORT_GCM("FYHYP", "", 1)
    165 
    166        ENDIF
    167 c
    168 c   .....  calcul  de  Ytprim   .....
    169 c
    170        
    171        DO i = 0, nmax2
    172         Ytprim(i) = beta  + ( grossism - beta ) * fhyp(i)
    173        ENDDO
    174 
    175 c   .....  Calcul  de  Yf     ........
    176 
    177        Yf(0) = - pis2
    178        DO i = 1, nmax2
    179         yypr(i)    = beta + ( grossism - beta ) * fxm(i)
    180        ENDDO
    181 
    182        DO i=1,nmax2
    183         Yf(i)   = Yf(i-1) + yypr(i) * ( yt(i) - yt(i-1) )
    184        ENDDO
    185 
    186 c    ****************************************************************
    187 c
    188 c   .....   yuv  = 0.   si calcul des latitudes  aux pts.  U  .....
    189 c   .....   yuv  = 0.5  si calcul des latitudes  aux pts.  V  .....
    190 c
    191       WRITE(6,18)
    192 c
    193       DO 5000  ik = 1,4
    194 
    195        IF( ik.EQ.1 )  THEN
    196          yuv  = 0.
    197          jlat = jjm + 1
    198        ELSE IF ( ik.EQ.2 )  THEN
    199          yuv  = 0.5
    200          jlat = jjm
    201        ELSE IF ( ik.EQ.3 )  THEN
    202          yuv  = 0.25
    203          jlat = jjm
    204        ELSE IF ( ik.EQ.4 )  THEN
    205          yuv  = 0.75
    206          jlat = jjm
    207        ENDIF
    208 c
    209        yo1   = 0.
    210        DO 1500 j =  1,jlat
    211         yo1   = 0.
    212         ylon2 =  - pis2 + pisjm * ( REAL(j)  + yuv  -1.) 
    213         yfi    = ylon2
    214 c
    215        DO 250 it =  nmax2,0,-1
    216         IF( yfi.GE.Yf(it))  GO TO 350
    217 250    CONTINUE
    218        it = 0
    219 350    CONTINUE
    220 
    221        yi = yt(it)
    222        IF(it.EQ.nmax2)  THEN
    223         it       = nmax2 -1
    224         Yf(it+1) = pis2
    225        ENDIF
    226 c  .................................................................
    227 c  ....  Interpolation entre  yi(it) et yi(it+1)   pour avoir Y(yi) 
    228 c      .....           et   Y'(yi)                             .....
    229 c  .................................................................
    230 
    231        CALL coefpoly ( Yf(it),Yf(it+1),Ytprim(it), Ytprim(it+1),   
    232      ,                  yt(it),yt(it+1) ,   a0,a1,a2,a3   )     
    233 
    234        Yf1     = Yf(it)
    235        Yprimin = a1 + 2.* a2 * yi + 3.*a3 * yi *yi
    236 
    237        DO 500 iter = 1,300
    238          yi = yi - ( Yf1 - yfi )/ Yprimin
    239 
    240         IF( ABS(yi-yo1).LE.epsilon)  GO TO 550
    241          yo1      = yi
    242          yi2      = yi * yi
    243          Yf1      = a0 +  a1 * yi +     a2 * yi2  +     a3 * yi2 * yi
    244          Yprimin  =       a1      + 2.* a2 *  yi  + 3.* a3 * yi2
    245 500   CONTINUE
    246         WRITE(6,*) ' Pas de solution ***** ',j,ylon2,iter
    247          STOP 2
    248 550   CONTINUE
    249 c
    250        Yprimin   = a1  + 2.* a2 *  yi   + 3.* a3 * yi* yi
    251        yprim(j)  = pi / ( jjm * Yprimin )
    252        yvrai(j)  = yi
    253 
    254 1500    CONTINUE
    255 
    256        DO j = 1, jlat -1
    257         IF( yvrai(j+1). LT. yvrai(j) )  THEN
    258          WRITE(6,*) ' PBS. avec  rlat(',j+1,') plus petit que rlat(',j,
    259      ,  ')'
    260          STOP 3
    261         ENDIF
    262        ENDDO
    263 
    264        WRITE(6,*) 'Reorganisation des latitudes pour avoir entre - pi/2'
    265      , ,' et  pi/2 '
    266 c
    267         IF( ik.EQ.1 )   THEN
    268            ypn = pis2
    269           DO j = jlat,1,-1
    270            IF( yvrai(j).LE. ypn ) GO TO 1502
    271           ENDDO
    272 1502     CONTINUE
    273 
    274          jpn   = j
    275          y00   = yvrai(jpn)
    276          deply = pis2 -  y00
    277         ENDIF
    278 
    279          DO  j = 1, jjm +1 - jpn
    280            ylatt (j)  = -pis2 - y00  + yvrai(jpn+j-1)
    281            yprimm(j)  = yprim(jpn+j-1)
    282          ENDDO
    283 
    284          jjpn  = jpn
    285          IF( jlat.EQ. jjm ) jjpn = jpn -1
    286 
    287          DO j = 1,jjpn
    288           ylatt (j + jjm+1 -jpn) = yvrai(j) + deply
    289           yprimm(j + jjm+1 -jpn) = yprim(j)
    290          ENDDO
    291 
    292 c      ***********   Fin de la reorganisation     *************
    293 c
    294  1600   CONTINUE
    295 
     98          fhyp(i) = tanh(fa(i)/fb(i))
     99       END IF
     100
     101       IF (yt(i)==y0) fhyp(i) = 1.
     102       IF (yt(i)==y0min .OR. yt(i)==y0max) fhyp(i) = -1.
     103    END DO
     104
     105    ! Calcul de beta
     106
     107    ffdy = 0.
     108
     109    DO i = 1, nmax2
     110       ymoy = 0.5*(yt(i-1) + yt(i))
     111       IF (ymoy<y0) THEN
     112          fa(i) = tauy*(ymoy-y0 + dzoom/2.)
     113          fb(i) = (ymoy-2.*y0*heavyy0m + pis2)*(y0-ymoy)
     114       ELSE IF (ymoy>y0) THEN
     115          fa(i) = tauy*(y0-ymoy + dzoom/2.)
     116          fb(i) = (2.*y0*heavyy0-ymoy + pis2)*(ymoy-y0)
     117       END IF
     118
     119       IF (200.*fb(i)<-fa(i)) THEN
     120          fxm(i) = -1.
     121       ELSE IF (200.*fb(i)<fa(i)) THEN
     122          fxm(i) = 1.
     123       ELSE
     124          fxm(i) = tanh(fa(i)/fb(i))
     125       END IF
     126       IF (ymoy==y0) fxm(i) = 1.
     127       IF (ymoy==y0min .OR. yt(i)==y0max) fxm(i) = -1.
     128       ffdy = ffdy + fxm(i)*(yt(i)-yt(i-1))
     129    END DO
     130
     131    beta = (grossismy*ffdy-pi)/(ffdy-pi)
     132
     133    IF (2. * beta - grossismy <= 0.) THEN
     134       print *, 'Attention ! La valeur beta calculee dans la routine fyhyp ' &
     135            // 'est mauvaise. Modifier les valeurs de grossismy, tauy ou ' &
     136            // 'dzoomy et relancer.'
     137       STOP 1
     138    END IF
     139
     140    ! calcul de Ytprim
     141
     142    DO i = 0, nmax2
     143       ytprim(i) = beta + (grossismy-beta)*fhyp(i)
     144    END DO
     145
     146    ! Calcul de Yf
     147
     148    yf(0) = -pis2
     149    DO i = 1, nmax2
     150       yypr(i) = beta + (grossismy-beta)*fxm(i)
     151    END DO
     152
     153    DO i = 1, nmax2
     154       yf(i) = yf(i-1) + yypr(i)*(yt(i)-yt(i-1))
     155    END DO
     156
     157    ! yuv = 0. si calcul des latitudes aux pts. U
     158    ! yuv = 0.5 si calcul des latitudes aux pts. V
     159
     160    loop_ik: DO ik = 1, 4
     161       IF (ik==1) THEN
     162          yuv = 0.
     163          jlat = jjm + 1
     164       ELSE IF (ik==2) THEN
     165          yuv = 0.5
     166          jlat = jjm
     167       ELSE IF (ik==3) THEN
     168          yuv = 0.25
     169          jlat = jjm
     170       ELSE IF (ik==4) THEN
     171          yuv = 0.75
     172          jlat = jjm
     173       END IF
     174
     175       yo1 = 0.
    296176       DO j = 1, jlat
    297           ylat(j) =  ylatt( jlat +1 -j )
    298          yprim(j) = yprimm( jlat +1 -j )
    299        ENDDO
    300  
    301         DO j = 1, jlat
    302          yvrai(j) = ylat(j)*180./pi
    303         ENDDO
    304 
    305         IF( ik.EQ.1 )  THEN
    306 c         WRITE(6,18)
    307 c         WRITE(6,*)  ' YLAT  en U   apres ( en  deg. ) '
    308 c         WRITE(6,68) (yvrai(j),j=1,jlat)
    309 cc         WRITE(6,*) ' YPRIM '
    310 cc         WRITE(6,445) ( yprim(j),j=1,jlat)
    311 
    312           DO j = 1, jlat
    313             rrlatu(j) =  ylat( j )
    314            yyprimu(j) = yprim( j )
    315           ENDDO
    316 
    317         ELSE IF ( ik.EQ. 2 )  THEN
    318 c         WRITE(6,18)
    319 c         WRITE(6,*) ' YLAT   en V  apres ( en  deg. ) '
    320 c         WRITE(6,68) (yvrai(j),j=1,jlat)
    321 cc         WRITE(6,*)' YPRIM '
    322 cc         WRITE(6,445) ( yprim(j),j=1,jlat)
    323 
    324           DO j = 1, jlat
    325             rrlatv(j) =  ylat( j )
    326            yyprimv(j) = yprim( j )
    327           ENDDO
    328 
    329         ELSE IF ( ik.EQ. 3 )  THEN
    330 c         WRITE(6,18)
    331 c         WRITE(6,*)  ' YLAT  en U + 0.75  apres ( en  deg. ) '
    332 c         WRITE(6,68) (yvrai(j),j=1,jlat)
    333 cc         WRITE(6,*) ' YPRIM '
    334 cc         WRITE(6,445) ( yprim(j),j=1,jlat)
    335 
    336           DO j = 1, jlat
    337             rlatu2(j) =  ylat( j )
    338            yprimu2(j) = yprim( j )
    339           ENDDO
    340 
    341         ELSE IF ( ik.EQ. 4 )  THEN
    342 c         WRITE(6,18)
    343 c         WRITE(6,*)  ' YLAT en U + 0.25  apres ( en  deg. ) '
    344 c         WRITE(6,68)(yvrai(j),j=1,jlat)
    345 cc         WRITE(6,*) ' YPRIM '
    346 cc         WRITE(6,68) ( yprim(j),j=1,jlat)
    347 
    348           DO j = 1, jlat
    349             rlatu1(j) =  ylat( j )
    350            yprimu1(j) = yprim( j )
    351           ENDDO
    352 
    353         ENDIF
    354 
    355 5000   CONTINUE
    356 c
    357         WRITE(6,18)
    358 c
    359 c  .....     fin de la boucle  do 5000 .....
    360 
    361         DO j = 1, jjm
    362          ylat(j) = rrlatu(j) - rrlatu(j+1)
    363         ENDDO
    364         champmin =  1.e12
    365         champmax = -1.e12
    366         DO j = 1, jjm
    367          champmin = MIN( champmin, ylat(j) )
    368          champmax = MAX( champmax, ylat(j) )
    369         ENDDO
    370          champmin = champmin * 180./pi
    371          champmax = champmax * 180./pi
    372 
    373 24     FORMAT(2x,'Parametres yzoom,gross,tau ,dzoom pour fyhyp ',4f8.3)
    374 18      FORMAT(/)
    375 68      FORMAT(1x,7f9.2)
    376 
    377         RETURN
    378         END
     177          yo1 = 0.
     178          ylon2 = -pis2 + pisjm*(real(j) + yuv-1.)
     179          yfi = ylon2
     180
     181          it = nmax2
     182          DO while (it >= 1 .and. yfi < yf(it))
     183             it = it - 1
     184          END DO
     185
     186          yi = yt(it)
     187          IF (it==nmax2) THEN
     188             it = nmax2 - 1
     189             yf(it + 1) = pis2
     190          END IF
     191
     192          ! Interpolation entre yi(it) et yi(it + 1) pour avoir Y(yi)
     193          ! et Y'(yi)
     194
     195          CALL coefpoly(yf(it), yf(it + 1), ytprim(it), ytprim(it + 1), &
     196               yt(it), yt(it + 1), a0, a1, a2, a3)
     197
     198          yf1 = yf(it)
     199          yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
     200
     201          iter = 1
     202          DO
     203             yi = yi - (yf1-yfi)/yprimin
     204             IF (abs(yi-yo1)<=epsilon .or. iter == 300) exit
     205             yo1 = yi
     206             yi2 = yi*yi
     207             yf1 = a0 + a1*yi + a2*yi2 + a3*yi2*yi
     208             yprimin = a1 + 2.*a2*yi + 3.*a3*yi2
     209          END DO
     210          if (abs(yi-yo1) > epsilon) then
     211             print *, 'Pas de solution.', j, ylon2
     212             STOP 1
     213          end if
     214
     215          yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
     216          yprim(j) = pi/(jjm*yprimin)
     217          yvrai(j) = yi
     218       END DO
     219
     220       DO j = 1, jlat - 1
     221          IF (yvrai(j + 1)<yvrai(j)) THEN
     222             print *, 'Problème avec rlat(', j + 1, ') plus petit que rlat(', &
     223                  j, ')'
     224             STOP 1
     225          END IF
     226       END DO
     227
     228       print *, 'Reorganisation des latitudes pour avoir entre - pi/2 et pi/2'
     229
     230       IF (ik==1) THEN
     231          ypn = pis2
     232          DO j = jjm + 1, 1, -1
     233             IF (yvrai(j)<=ypn) exit
     234          END DO
     235
     236          jpn = j
     237          y00 = yvrai(jpn)
     238          deply = pis2 - y00
     239       END IF
     240
     241       DO j = 1, jjm + 1 - jpn
     242          ylatt(j) = -pis2 - y00 + yvrai(jpn + j-1)
     243          yprimm(j) = yprim(jpn + j-1)
     244       END DO
     245
     246       jjpn = jpn
     247       IF (jlat==jjm) jjpn = jpn - 1
     248
     249       DO j = 1, jjpn
     250          ylatt(j + jjm + 1-jpn) = yvrai(j) + deply
     251          yprimm(j + jjm + 1-jpn) = yprim(j)
     252       END DO
     253
     254       ! Fin de la reorganisation
     255
     256       DO j = 1, jlat
     257          ylat(j) = ylatt(jlat + 1-j)
     258          yprim(j) = yprimm(jlat + 1-j)
     259       END DO
     260
     261       DO j = 1, jlat
     262          yvrai(j) = ylat(j)*180./pi
     263       END DO
     264
     265       IF (ik==1) THEN
     266          DO j = 1, jjm + 1
     267             rlatu(j) = ylat(j)
     268             yyprimu(j) = yprim(j)
     269          END DO
     270       ELSE IF (ik==2) THEN
     271          DO j = 1, jjm
     272             rlatv(j) = ylat(j)
     273          END DO
     274       ELSE IF (ik==3) THEN
     275          DO j = 1, jjm
     276             rlatu2(j) = ylat(j)
     277             yprimu2(j) = yprim(j)
     278          END DO
     279       ELSE IF (ik==4) THEN
     280          DO j = 1, jjm
     281             rlatu1(j) = ylat(j)
     282             yprimu1(j) = yprim(j)
     283          END DO
     284       END IF
     285    END DO loop_ik
     286
     287    DO j = 1, jjm
     288       ylat(j) = rlatu(j) - rlatu(j + 1)
     289    END DO
     290    champmin = 1e12
     291    champmax = -1e12
     292    DO j = 1, jjm
     293       champmin = min(champmin, ylat(j))
     294       champmax = max(champmax, ylat(j))
     295    END DO
     296    champmin = champmin*180./pi
     297    champmax = champmax*180./pi
     298
     299    DO j = 1, jjm
     300       IF (rlatu1(j) <= rlatu2(j)) THEN
     301          print *, 'Attention ! rlatu1 < rlatu2 ', rlatu1(j), rlatu2(j), j
     302          STOP 13
     303       ENDIF
     304
     305       IF (rlatu2(j) <= rlatu(j+1)) THEN
     306          print *, 'Attention ! rlatu2 < rlatup1 ', rlatu2(j), rlatu(j+1), j
     307          STOP 14
     308       ENDIF
     309
     310       IF (rlatu(j) <= rlatu1(j)) THEN
     311          print *, ' Attention ! rlatu < rlatu1 ', rlatu(j), rlatu1(j), j
     312          STOP 15
     313       ENDIF
     314
     315       IF (rlatv(j) <= rlatu2(j)) THEN
     316          print *, ' Attention ! rlatv < rlatu2 ', rlatv(j), rlatu2(j), j
     317          STOP 16
     318       ENDIF
     319
     320       IF (rlatv(j) >= rlatu1(j)) THEN
     321          print *, ' Attention ! rlatv > rlatu1 ', rlatv(j), rlatu1(j), j
     322          STOP 17
     323       ENDIF
     324
     325       IF (rlatv(j) >= rlatu(j)) THEN
     326          print *, ' Attention ! rlatv > rlatu ', rlatv(j), rlatu(j), j
     327          STOP 18
     328       ENDIF
     329    ENDDO
     330
     331    print *, 'Latitudes'
     332    print 3, champmin, champmax
     333
     3343   Format(1x, ' Au centre du zoom, la longueur de la maille est', &
     335         ' d environ ', f0.2, ' degres ', /, &
     336         ' alors que la maille en dehors de la zone du zoom est ', &
     337         "d'environ ", f0.2, ' degres ')
     338
     339  END SUBROUTINE fyhyp
     340
     341end module fyhyp_m
Note: See TracChangeset for help on using the changeset viewer.