Ignore:
Timestamp:
Dec 6, 2022, 12:01:16 AM (19 months ago)
Author:
lguez
Message:

Sync latest trunk changes to Ocean_skin

Location:
LMDZ6/branches/Ocean_skin
Files:
2 deleted
11 edited
3 copied

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Ocean_skin

  • LMDZ6/branches/Ocean_skin/libf/dyn3d/advtrac.F90

    r2622 r4368  
    11! $Id$
    22
    3 SUBROUTINE advtrac(pbaru,pbarv , p,  masse,q,iapptrac,teta, flxw, pk)
    4   !     Auteur :  F. Hourdin
    5   !
    6   !     Modif. P. Le Van     (20/12/97)
    7   !            F. Codron     (10/99)
    8   !            D. Le Croller (07/2001)
    9   !            M.A Filiberti (04/2002)
    10   !
    11   USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif
    12   USE control_mod, ONLY: iapp_tracvl, day_step
    13   USE comconst_mod, ONLY: dtvr
    14 
    15   IMPLICIT NONE
    16   !
    17   include "dimensions.h"
    18   include "paramet.h"
    19   include "comdissip.h"
    20   include "comgeom2.h"
    21   include "description.h"
    22   include "iniprint.h"
    23 
    24   !-------------------------------------------------------------------
    25   !     Arguments
    26   !-------------------------------------------------------------------
    27   INTEGER,INTENT(OUT) :: iapptrac
    28   REAL,INTENT(IN) :: pbaru(ip1jmp1,llm)
    29   REAL,INTENT(IN) :: pbarv(ip1jm,llm)
    30   REAL,INTENT(INOUT) :: q(ip1jmp1,llm,nqtot)
    31   REAL,INTENT(IN) :: masse(ip1jmp1,llm)
    32   REAL,INTENT(IN) :: p( ip1jmp1,llmp1 )
    33   REAL,INTENT(IN) :: teta(ip1jmp1,llm)
    34   REAL,INTENT(IN) :: pk(ip1jmp1,llm)
    35   REAL,INTENT(OUT) :: flxw(ip1jmp1,llm)
    36   !-------------------------------------------------------------------
    37   !     Ajout PPM
    38   !--------------------------------------------------------
    39   REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm)
    40   !-------------------------------------------------------------
    41   !     Variables locales
    42   !-------------------------------------------------------------
    43 
    44   REAL pbaruc(ip1jmp1,llm),pbarvc(ip1jm,llm)
    45   REAL massem(ip1jmp1,llm),zdp(ip1jmp1)
    46   REAL pbarug(ip1jmp1,llm),pbarvg(ip1jm,llm),wg(ip1jmp1,llm)
    47   REAL (kind=kind(1.d0)) :: t_initial, t_final, tps_cpu
    48   INTEGER iadvtr
    49   INTEGER ij,l,iq,iiq
    50   REAL zdpmin, zdpmax
    51   EXTERNAL  minmax
    52   SAVE iadvtr, massem, pbaruc, pbarvc
    53   DATA iadvtr/0/
    54   !----------------------------------------------------------
    55   !     Rajouts pour PPM
    56   !----------------------------------------------------------
    57   INTEGER indice,n
    58   REAL dtbon ! Pas de temps adaptatif pour que CFL<1
    59   REAL CFLmaxz,aaa,bbb ! CFL maximum
    60   REAL psppm(iim,jjp1) ! pression  au sol
    61   REAL unatppm(iim,jjp1,llm),vnatppm(iim,jjp1,llm)
    62   REAL qppm(iim*jjp1,llm,nqtot)
    63   REAL fluxwppm(iim,jjp1,llm)
    64   REAL apppm(llmp1), bpppm(llmp1)
    65   LOGICAL dum,fill
    66   DATA fill/.true./
    67   DATA dum/.true./
    68 
    69   integer,save :: countcfl=0
    70   real cflx(ip1jmp1,llm)
    71   real cfly(ip1jm,llm)
    72   real cflz(ip1jmp1,llm)
    73   real, save :: cflxmax(llm),cflymax(llm),cflzmax(llm)
    74 
    75   IF(iadvtr.EQ.0) THEN
    76      pbaruc(:,:)=0
    77      pbarvc(:,:)=0
    78   ENDIF
    79 
    80   !   accumulation des flux de masse horizontaux
    81   DO l=1,llm
    82      DO ij = 1,ip1jmp1
    83         pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
    84      ENDDO
    85      DO ij = 1,ip1jm
    86         pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
    87      ENDDO
    88   ENDDO
    89 
    90   !   selection de la masse instantannee des mailles avant le transport.
    91   IF(iadvtr.EQ.0) THEN
    92 
     3#define DEBUG_IO
     4#undef DEBUG_IO
     5SUBROUTINE advtrac(pbaru, pbarv, p, masse,q,iapptrac,teta, flxw, pk)
     6   !     Auteur :  F. Hourdin
     7   !
     8   !     Modif. P. Le Van     (20/12/97)
     9   !            F. Codron     (10/99)
     10   !            D. Le Croller (07/2001)
     11   !            M.A Filiberti (04/2002)
     12   !
     13   USE infotrac,     ONLY: nqtot, tracers, isoCheck
     14   USE control_mod,  ONLY: iapp_tracvl, day_step
     15   USE comconst_mod, ONLY: dtvr
     16
     17   IMPLICIT NONE
     18   !
     19   include "dimensions.h"
     20   include "paramet.h"
     21   include "comdissip.h"
     22   include "comgeom2.h"
     23   include "description.h"
     24   include "iniprint.h"
     25
     26   !---------------------------------------------------------------------------
     27   !     Arguments
     28   !---------------------------------------------------------------------------
     29   INTEGER, INTENT(OUT) :: iapptrac
     30   REAL, INTENT(IN) :: pbaru(ip1jmp1,llm)
     31   REAL, INTENT(IN) :: pbarv(ip1jm,  llm)
     32   REAL, INTENT(INOUT) ::  q(ip1jmp1,llm,nqtot)
     33   REAL, INTENT(IN) :: masse(ip1jmp1,llm)
     34   REAL, INTENT(IN) ::     p(ip1jmp1,llmp1 )
     35   REAL, INTENT(IN) ::  teta(ip1jmp1,llm)
     36   REAL, INTENT(IN) ::    pk(ip1jmp1,llm)
     37   REAL, INTENT(OUT) :: flxw(ip1jmp1,llm)
     38   !---------------------------------------------------------------------------
     39   !     Ajout PPM
     40   !---------------------------------------------------------------------------
     41   REAL :: massebx(ip1jmp1,llm), masseby(ip1jm,llm)
     42   !---------------------------------------------------------------------------
     43   !     Variables locales
     44   !---------------------------------------------------------------------------
     45   INTEGER :: ij, l, iq, iadv
     46!   REAL(KIND=KIND(1.d0)) :: t_initial, t_final, tps_cpu
     47   REAL :: zdp(ip1jmp1), zdpmin, zdpmax
     48   INTEGER, SAVE :: iadvtr=0
     49   REAL, DIMENSION(ip1jmp1,llm) :: pbaruc, pbarug, massem, wg
     50   REAL, DIMENSION(ip1jm,  llm) :: pbarvc, pbarvg
     51   EXTERNAL  minmax
     52   SAVE massem, pbaruc, pbarvc
     53   !---------------------------------------------------------------------------
     54   !     Rajouts pour PPM
     55   !---------------------------------------------------------------------------
     56   INTEGER indice, n
     57   REAL :: dtbon                       ! Pas de temps adaptatif pour que CFL<1
     58   REAL :: CFLmaxz, aaa, bbb           ! CFL maximum
     59   REAL, DIMENSION(iim,jjp1,llm) :: unatppm, vnatppm, fluxwppm
     60   REAL ::    qppm(iim*jjp1,llm,nqtot)
     61   REAL ::   psppm(iim,jjp1)           ! pression  au sol
     62   REAL, DIMENSION(llmp1) :: apppm, bpppm
     63   LOGICAL, SAVE :: dum=.TRUE., fill=.TRUE.
     64
     65   INTEGER, SAVE :: countcfl=0
     66   REAL, DIMENSION(ip1jmp1,llm) :: cflx, cflz
     67   REAL, DIMENSION(ip1jm  ,llm) :: cfly
     68   REAL, DIMENSION(llm), SAVE :: cflxmax, cflymax, cflzmax
     69
     70   IF(iadvtr == 0) THEN
     71      pbaruc(:,:)=0
     72      pbarvc(:,:)=0
     73   END IF
     74
     75   !--- Accumulation des flux de masse horizontaux
     76   DO l=1,llm
     77      DO ij = 1,ip1jmp1
     78         pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
     79      END DO
     80      DO ij = 1,ip1jm
     81         pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
     82      END DO
     83   END DO
     84
     85   !--- Selection de la masse instantannee des mailles avant le transport.
     86   IF(iadvtr == 0) THEN
    9387     CALL SCOPY(ip1jmp1*llm,masse,1,massem,1)
    94      !cc         CALL filtreg ( massem ,jjp1, llm,-2, 2, .TRUE., 1 )
    95      !
    96   ENDIF
    97 
    98   iadvtr   = iadvtr+1
    99   iapptrac = iadvtr
    100 
    101 
    102   !   Test pour savoir si on advecte a ce pas de temps
    103   IF ( iadvtr.EQ.iapp_tracvl ) THEN
    104 
    105      !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
    106      !c
    107 
    108      !   traitement des flux de masse avant advection.
    109      !     1. calcul de w
    110      !     2. groupement des mailles pres du pole.
    111 
    112      CALL groupe( massem, pbaruc,pbarvc, pbarug,pbarvg,wg )
    113 
    114      ! ... Flux de masse diaganostiques traceurs
    115      flxw = wg / REAL(iapp_tracvl)
    116 
    117      !  test sur l'eventuelle creation de valeurs negatives de la masse
    118      DO l=1,llm-1
    119         DO ij = iip2+1,ip1jm
    120            zdp(ij) =    pbarug(ij-1,l)   - pbarug(ij,l) &
    121                 - pbarvg(ij-iip1,l) + pbarvg(ij,l) &
    122                 +       wg(ij,l+1)  - wg(ij,l)
    123         ENDDO
    124         CALL SCOPY( jjm -1 ,zdp(iip1+iip1),iip1,zdp(iip2),iip1 )
    125         DO ij = iip2,ip1jm
    126            zdp(ij)= zdp(ij)*dtvr/ massem(ij,l)
    127         ENDDO
    128 
    129 
    130         CALL minmax ( ip1jm-iip1, zdp(iip2), zdpmin,zdpmax )
    131 
    132         IF(MAX(ABS(zdpmin),ABS(zdpmax)).GT.0.5) THEN
    133            PRINT*,'WARNING DP/P l=',l,'  MIN:',zdpmin, &
    134                 '   MAX:', zdpmax
    135         ENDIF
    136 
    137      ENDDO
    138 
    139 
    140      !-------------------------------------------------------------------
    141      ! Calcul des criteres CFL en X, Y et Z
    142      !-------------------------------------------------------------------
    143 
    144      if (countcfl == 0. ) then
    145         cflxmax(:)=0.
    146         cflymax(:)=0.
    147         cflzmax(:)=0.
    148      endif
    149 
    150      countcfl=countcfl+iapp_tracvl
    151      cflx(:,:)=0.
    152      cfly(:,:)=0.
    153      cflz(:,:)=0.
    154      do l=1,llm
    155         do ij=iip2,ip1jm-1
    156            if (pbarug(ij,l)>=0.) then
    157               cflx(ij,l)=pbarug(ij,l)*dtvr/masse(ij,l)
    158            else
    159               cflx(ij,l)=-pbarug(ij,l)*dtvr/masse(ij+1,l)
    160            endif
    161         enddo
    162      enddo
    163      do l=1,llm
    164         do ij=iip2,ip1jm-1,iip1
    165            cflx(ij+iip1,l)=cflx(ij,l)
    166         enddo
    167      enddo
    168 
    169      do l=1,llm
    170         do ij=1,ip1jm
    171            if (pbarvg(ij,l)>=0.) then
    172               cfly(ij,l)=pbarvg(ij,l)*dtvr/masse(ij,l)
    173            else
    174               cfly(ij,l)=-pbarvg(ij,l)*dtvr/masse(ij+iip1,l)
    175            endif
    176         enddo
    177      enddo
    178 
    179      do l=2,llm
    180         do ij=1,ip1jm
    181            if (wg(ij,l)>=0.) then
    182               cflz(ij,l)=wg(ij,l)*dtvr/masse(ij,l)
    183            else
    184               cflz(ij,l)=-wg(ij,l)*dtvr/masse(ij,l-1)
    185            endif
    186         enddo
    187      enddo
    188 
    189      do l=1,llm
    190         cflxmax(l)=max(cflxmax(l),maxval(cflx(:,l)))
    191         cflymax(l)=max(cflymax(l),maxval(cfly(:,l)))
    192         cflzmax(l)=max(cflzmax(l),maxval(cflz(:,l)))
    193      enddo
    194 
    195 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    196      ! Par defaut, on sort le diagnostic des CFL tous les jours.
    197      ! Si on veut le sortir a chaque pas d'advection en cas de plantage
    198      !     if (countcfl==iapp_tracvl) then
    199 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    200      if (countcfl==day_step) then
    201         do l=1,llm
    202            write(lunout,*) 'L, CFL[xyz]max:', l, cflxmax(l), cflymax(l), &
    203                 cflzmax(l)
    204         enddo
    205         countcfl=0
    206      endif
    207 
    208      !-------------------------------------------------------------------
    209      !   Advection proprement dite (Modification Le Croller (07/2001)
    210      !-------------------------------------------------------------------
    211 
    212      !----------------------------------------------------
    213      !        Calcul des moyennes basées sur la masse
    214      !----------------------------------------------------
    215      call massbar(massem,massebx,masseby)         
    216 
    217      !-----------------------------------------------------------
    218      !     Appel des sous programmes d'advection
    219      !-----------------------------------------------------------
    220 
    221      if (ok_iso_verif) then
    222            write(*,*) 'advtrac 227'
    223            call check_isotopes_seq(q,ip1jmp1,'advtrac 162')
    224      endif !if (ok_iso_verif) then
    225 
    226      do iq=1,nqperes
    227         !        call clock(t_initial)
    228         if(iadv(iq) == 0) cycle
    229         !   ----------------------------------------------------------------
    230         !   Schema de Van Leer I MUSCL
    231         !   ----------------------------------------------------------------
    232         if(iadv(iq).eq.10) THEN
    233            ! CRisi: on fait passer tout q pour avoir acces aux fils
    234            
    235            !write(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:)     
    236            call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq)
    237            
    238            !   ----------------------------------------------------------------
    239            !   Schema "pseudo amont" + test sur humidite specifique
    240            !    pour la vapeur d'eau. F. Codron
    241            !   ----------------------------------------------------------------
    242         else if(iadv(iq).eq.14) then
    243            !
    244            !write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
    245            CALL vlspltqs( q, 2., massem, wg , &
    246                 pbarug,pbarvg,dtvr,p,pk,teta,iq)
    247            
    248            !   ----------------------------------------------------------------
    249            !   Schema de Frederic Hourdin
    250            !   ----------------------------------------------------------------
    251         else if(iadv(iq).eq.12) then
    252            !            Pas de temps adaptatif
    253            call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
    254            if (n.GT.1) then
    255               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
    256                    dtvr,'n=',n
    257            endif
    258            do indice=1,n
    259               call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
    260            end do
    261         else if(iadv(iq).eq.13) then
    262            !            Pas de temps adaptatif
    263            call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
    264            if (n.GT.1) then
    265               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
    266                    dtvr,'n=',n
    267            endif
    268            do indice=1,n
    269               call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
    270            end do
    271            !   ----------------------------------------------------------------
    272            !   Schema de pente SLOPES
    273            !   ----------------------------------------------------------------
    274         else if (iadv(iq).eq.20) then
    275            call pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
    276 
    277            !   ----------------------------------------------------------------
    278            !   Schema de Prather
    279            !   ----------------------------------------------------------------
    280         else if (iadv(iq).eq.30) then
    281            !            Pas de temps adaptatif
    282            call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
    283            if (n.GT.1) then
    284               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
    285                    dtvr,'n=',n
    286            endif
    287            call  prather(q(1,1,iq),wg,massem,pbarug,pbarvg, &
    288                 n,dtbon)
    289 
    290            !   ----------------------------------------------------------------
    291            !   Schemas PPM Lin et Rood
    292            !   ----------------------------------------------------------------
    293         else if (iadv(iq).eq.11.OR.(iadv(iq).GE.16.AND. &
    294              iadv(iq).LE.18)) then
    295 
    296            !        Test sur le flux horizontal
    297            !        Pas de temps adaptatif
    298            call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
    299            if (n.GT.1) then
    300               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
    301                    dtvr,'n=',n
    302            endif
    303            !        Test sur le flux vertical
    304            CFLmaxz=0.
    305            do l=2,llm
    306               do ij=iip2,ip1jm
    307                  aaa=wg(ij,l)*dtvr/massem(ij,l)
    308                  CFLmaxz=max(CFLmaxz,aaa)
    309                  bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
    310                  CFLmaxz=max(CFLmaxz,bbb)
    311               enddo
    312            enddo
    313            if (CFLmaxz.GE.1) then
    314               write(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
    315            endif
    316 
    317            !-----------------------------------------------------------
    318            !        Ss-prg interface LMDZ.4->PPM3d
    319            !-----------------------------------------------------------
    320 
    321            call interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem, &
    322                 apppm,bpppm,massebx,masseby,pbarug,pbarvg, &
    323                 unatppm,vnatppm,psppm)
    324 
    325            do indice=1,n
    326               !----------------------------------------------------------------
    327               !                         VL (version PPM) horiz. et PPM vert.
    328               !----------------------------------------------------------------
    329               if (iadv(iq).eq.11) then
    330                  !                  Ss-prg PPM3d de Lin
    331                  call ppm3d(1,qppm(1,1,iq), &
    332                       psppm,psppm, &
    333                       unatppm,vnatppm,fluxwppm,dtbon,2,2,2,1, &
    334                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, &
    335                       fill,dum,220.)
    336 
    337                  !-------------------------------------------------------------
    338                  !                           Monotonic PPM
    339                  !-------------------------------------------------------------
    340               else if (iadv(iq).eq.16) then
    341                  !                  Ss-prg PPM3d de Lin
    342                  call ppm3d(1,qppm(1,1,iq), &
    343                       psppm,psppm, &
    344                       unatppm,vnatppm,fluxwppm,dtbon,3,3,3,1, &
    345                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, &
    346                       fill,dum,220.)
    347                  !-------------------------------------------------------------
    348 
    349                  !-------------------------------------------------------------
    350                  !                           Semi Monotonic PPM
    351                  !-------------------------------------------------------------
    352               else if (iadv(iq).eq.17) then
    353                  !                  Ss-prg PPM3d de Lin
    354                  call ppm3d(1,qppm(1,1,iq), &
    355                       psppm,psppm, &
    356                       unatppm,vnatppm,fluxwppm,dtbon,4,4,4,1, &
    357                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, &
    358                       fill,dum,220.)
    359                  !-------------------------------------------------------------
    360 
    361                  !-------------------------------------------------------------
    362                  !                         Positive Definite PPM
    363                  !-------------------------------------------------------------
    364               else if (iadv(iq).eq.18) then
    365                  !                  Ss-prg PPM3d de Lin
    366                  call ppm3d(1,qppm(1,1,iq), &
    367                       psppm,psppm, &
    368                       unatppm,vnatppm,fluxwppm,dtbon,5,5,5,1, &
    369                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, &
    370                       fill,dum,220.)
    371                  !-------------------------------------------------------------
    372               endif
    373            enddo
    374            !-----------------------------------------------------------------
    375            !               Ss-prg interface PPM3d-LMDZ.4
    376            !-----------------------------------------------------------------
    377            call interpost(q(1,1,iq),qppm(1,1,iq))
    378         endif
    379         !----------------------------------------------------------------------
    380 
    381         !-----------------------------------------------------------------
    382         ! On impose une seule valeur du traceur au pôle Sud j=jjm+1=jjp1
    383         ! et Nord j=1
    384         !-----------------------------------------------------------------
    385 
    386         !                  call traceurpole(q(1,1,iq),massem)
    387 
    388         ! calcul du temps cpu pour un schema donne
    389 
    390         !                  call clock(t_final)
    391         !ym                  tps_cpu=t_final-t_initial
    392         !ym                  cpuadv(iq)=cpuadv(iq)+tps_cpu
    393 
    394      end DO
    395 
    396      if (ok_iso_verif) then
    397            write(*,*) 'advtrac 402'
    398            call check_isotopes_seq(q,ip1jmp1,'advtrac 397')
    399      endif !if (ok_iso_verif) then
    400 
    401      !------------------------------------------------------------------
    402      !   on reinitialise a zero les flux de masse cumules
    403      !---------------------------------------------------
    404      iadvtr=0
    405 
    406   ENDIF ! if iadvtr.EQ.iapp_tracvl
     88   ! CALL filtreg ( massem ,jjp1, llm,-2, 2, .TRUE., 1 )
     89   END IF
     90
     91   iadvtr   = iadvtr+1
     92   iapptrac = iadvtr
     93
     94   !--- Test pour savoir si on advecte a ce pas de temps
     95   IF(iadvtr /= iapp_tracvl) RETURN
     96
     97   !   ..  Modif P.Le Van  ( 20/12/97 )  ....
     98   !
     99   !   traitement des flux de masse avant advection.
     100   !       1. calcul de w
     101   !       2. groupement des mailles pres du pole.
     102
     103   CALL groupe(massem, pbaruc, pbarvc, pbarug, pbarvg, wg)
     104
     105   !--- Flux de masse diaganostiques traceurs
     106   flxw = wg / REAL(iapp_tracvl)
     107
     108   !--- Test sur l'eventuelle creation de valeurs negatives de la masse
     109   DO l=1,llm-1
     110      DO ij = iip2+1,ip1jm
     111         zdp(ij) = pbarug(ij-1,l)    - pbarug(ij,l) &
     112                 - pbarvg(ij-iip1,l) + pbarvg(ij,l) &
     113                 +     wg(ij,l+1)    -     wg(ij,l)
     114      END DO
     115! ym  ---> pourquoi jjm-1 et non jjm ? a cause du pole ?
     116      CALL SCOPY( jjm -1 ,zdp(iip1+iip1),iip1,zdp(iip2),iip1 )
     117      DO ij = iip2,ip1jm
     118         zdp(ij)= zdp(ij)*dtvr/ massem(ij,l)
     119      END DO
     120
     121      CALL minmax ( ip1jm-iip1, zdp(iip2), zdpmin,zdpmax )
     122
     123      IF(MAX(ABS(zdpmin),ABS(zdpmax)) > 0.5) &
     124         WRITE(*,*)'WARNING DP/P l=',l,'  MIN:',zdpmin,' MAX:', zdpmax
     125
     126   END DO
     127
     128   !-------------------------------------------------------------------------
     129   ! Calcul des criteres CFL en X, Y et Z
     130   !-------------------------------------------------------------------------
     131   IF(countcfl == 0. ) then
     132      cflxmax(:)=0.
     133      cflymax(:)=0.
     134      cflzmax(:)=0.
     135   END IF
     136
     137   countcfl=countcfl+iapp_tracvl
     138   cflx(:,:)=0.
     139   cfly(:,:)=0.
     140   cflz(:,:)=0.
     141   DO l=1,llm
     142      DO ij=iip2,ip1jm-1
     143         IF(pbarug(ij,l)>=0.) then
     144            cflx(ij,l)=pbarug(ij,l)*dtvr/masse(ij,l)
     145         ELSE
     146            cflx(ij,l)=-pbarug(ij,l)*dtvr/masse(ij+1,l)
     147         END IF
     148      END DO
     149   END DO
     150
     151   DO l=1,llm
     152      DO ij=iip2,ip1jm-1,iip1
     153         cflx(ij+iip1,l)=cflx(ij,l)
     154      END DO
     155   END DO
     156
     157   DO l=1,llm
     158      DO ij=1,ip1jm
     159         IF(pbarvg(ij,l)>=0.) then
     160            cfly(ij,l)=pbarvg(ij,l)*dtvr/masse(ij,l)
     161         ELSE
     162            cfly(ij,l)=-pbarvg(ij,l)*dtvr/masse(ij+iip1,l)
     163         END IF
     164      END DO
     165   END DO
     166
     167   DO l=2,llm
     168      DO ij=1,ip1jm
     169         IF(wg(ij,l) >= 0.) THEN
     170            cflz(ij,l)=wg(ij,l)*dtvr/masse(ij,l)
     171         ELSE
     172            cflz(ij,l)=-wg(ij,l)*dtvr/masse(ij,l-1)
     173         END IF
     174      END DO
     175   END DO
     176
     177   DO l=1,llm
     178      cflxmax(l)=max(cflxmax(l),maxval(cflx(:,l)))
     179      cflymax(l)=max(cflymax(l),maxval(cfly(:,l)))
     180      cflzmax(l)=max(cflzmax(l),maxval(cflz(:,l)))
     181   END DO
     182
     183   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     184   ! Par defaut, on sort le diagnostic des CFL tous les jours.
     185   ! Si on veut le sortir a chaque pas d'advection en cas de plantage
     186   !       IF(countcfl==iapp_tracvl) then
     187   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     188   IF(countcfl==day_step) then
     189      DO l=1,llm
     190         WRITE(lunout,*) 'L, CFL[xyz]max:', l, cflxmax(l), cflymax(l), cflzmax(l)
     191      END DO
     192      countcfl=0
     193   END IF
     194
     195   !---------------------------------------------------------------------------
     196   !   Advection proprement dite (Modification Le Croller (07/2001)
     197   !---------------------------------------------------------------------------
     198
     199   !---------------------------------------------------------------------------
     200   !   Calcul des moyennes basees sur la masse
     201   !---------------------------------------------------------------------------
     202   CALL massbar(massem,massebx,masseby)
     203
     204#ifdef DEBUG_IO   
     205   CALL WriteField_u('massem',massem)
     206   CALL WriteField_u('wg',wg)
     207   CALL WriteField_u('pbarug',pbarug)
     208   CALL WriteField_v('pbarvg',pbarvg)
     209   CALL WriteField_u('p_tmp',p)
     210   CALL WriteField_u('pk_tmp',pk)
     211   CALL WriteField_u('teta_tmp',teta)
     212   DO iq=1,nqtot
     213      CALL WriteField_u('q_adv'//trim(int2str(iq)),q(:,:,iq))
     214   END DO
     215#endif
     216
     217   IF(isoCheck) WRITE(*,*) 'advtrac 227'
     218   CALL check_isotopes_seq(q,ip1jmp1,'advtrac 162')
     219
     220   !-------------------------------------------------------------------------
     221   !       Appel des sous programmes d'advection
     222   !-------------------------------------------------------------------------
     223   DO iq = 1, nqtot
     224!     CALL clock(t_initial)
     225      IF(tracers(iq)%parent /= 'air') CYCLE
     226      iadv = tracers(iq)%iadv
     227      !-----------------------------------------------------------------------
     228      SELECT CASE(iadv)
     229      !-----------------------------------------------------------------------
     230         CASE(0); CYCLE
     231         !--------------------------------------------------------------------
     232         CASE(10)  !--- Schema de Van Leer I MUSCL
     233         !--------------------------------------------------------------------
     234!           WRITE(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:)     
     235            CALL vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq)
     236
     237         !--------------------------------------------------------------------
     238         CASE(14)  !--- Schema "pseuDO amont" + test sur humidite specifique
     239                   !--- pour la vapeur d'eau. F. Codron
     240         !--------------------------------------------------------------------
     241!           WRITE(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
     242            CALL vlspltqs(q,2.,massem,wg,pbarug,pbarvg,dtvr,p,pk,teta,iq)
     243
     244         !--------------------------------------------------------------------
     245         CASE(12)  !--- Schema de Frederic Hourdin
     246         !--------------------------------------------------------------------
     247            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
     248            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
     249            DO indice=1,n
     250              CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
     251            END DO
     252
     253         !--------------------------------------------------------------------
     254         CASE(13)  !--- Pas de temps adaptatif
     255         !--------------------------------------------------------------------
     256            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
     257            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
     258            DO indice=1,n
     259               CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
     260            END DO
     261
     262         !--------------------------------------------------------------------
     263         CASE(20)  !--- Schema de pente SLOPES
     264         !--------------------------------------------------------------------
     265            CALL pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
     266
     267         !--------------------------------------------------------------------
     268         CASE(30)  !--- Schema de Prather
     269         !--------------------------------------------------------------------
     270            ! Pas de temps adaptatif
     271            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
     272            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
     273            CALL prather(q(1,1,iq),wg,massem,pbarug,pbarvg,n,dtbon)
     274
     275         !--------------------------------------------------------------------
     276         CASE(11,16,17,18)   !--- Schemas PPM Lin et Rood
     277         !--------------------------------------------------------------------
     278            ! Test sur le flux horizontal
     279            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
     280            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
     281            ! Test sur le flux vertical
     282            CFLmaxz=0.
     283            DO l=2,llm
     284               DO ij=iip2,ip1jm
     285                  aaa=wg(ij,l)*dtvr/massem(ij,l)
     286                  CFLmaxz=max(CFLmaxz,aaa)
     287                  bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
     288                  CFLmaxz=max(CFLmaxz,bbb)
     289               END DO
     290            END DO
     291            IF(CFLmaxz.GE.1) WRITE(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
     292            !----------------------------------------------------------------
     293            !     Ss-prg interface LMDZ.4->PPM3d (ss-prg de Lin)
     294            !----------------------------------------------------------------
     295            CALL interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem, &
     296                 apppm,bpppm,massebx,masseby,pbarug,pbarvg, &
     297                 unatppm,vnatppm,psppm)
     298
     299            !----------------------------------------------------------------
     300            DO indice=1,n     !--- VL (version PPM) horiz. et PPM vert.
     301            !----------------------------------------------------------------
     302               SELECT CASE(iadv)
     303                  !----------------------------------------------------------
     304                  CASE(11)
     305                  !----------------------------------------------------------
     306                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
     307                                2,2,2,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
     308                  !----------------------------------------------------------
     309                  CASE(16) !--- Monotonic PPM
     310                  !----------------------------------------------------------
     311                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
     312                                3,3,3,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
     313                  !----------------------------------------------------------
     314                  CASE(17) !--- Semi monotonic PPM
     315                  !----------------------------------------------------------
     316                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
     317                                4,4,4,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, fill,dum,220.)
     318                  !----------------------------------------------------------
     319                  CASE(18) !--- Positive Definite PPM
     320                  !----------------------------------------------------------
     321                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
     322                                5,5,5,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
     323               END SELECT
     324            !----------------------------------------------------------------
     325            END DO
     326            !----------------------------------------------------------------
     327            !     Ss-prg interface PPM3d-LMDZ.4
     328            !----------------------------------------------------------------
     329            CALL interpost(q(1,1,iq),qppm(1,1,iq))
     330      !----------------------------------------------------------------------
     331      END SELECT
     332      !----------------------------------------------------------------------
     333
     334      !----------------------------------------------------------------------
     335      ! On impose une seule valeur du traceur au pole Sud j=jjm+1=jjp1 et Nord j=1
     336      !----------------------------------------------------------------------
     337      !  CALL traceurpole(q(1,1,iq),massem)
     338
     339      !--- Calcul du temps cpu pour un schema donne
     340      !  CALL clock(t_final)
     341      !ym  tps_cpu=t_final-t_initial
     342      !ym  cpuadv(iq)=cpuadv(iq)+tps_cpu
     343
     344   END DO
     345
     346   IF(isoCheck) WRITE(*,*) 'advtrac 402'
     347   CALL check_isotopes_seq(q,ip1jmp1,'advtrac 397')
     348
     349   !-------------------------------------------------------------------------
     350   !   on reinitialise a zero les flux de masse cumules
     351   !-------------------------------------------------------------------------
     352   iadvtr=0
    407353
    408354END SUBROUTINE advtrac
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/conf_gcm.F90

    r4013 r4368  
    116116  CALL getin('calend', calend)
    117117! initialize year_len for aquaplanets and 1D
    118       if (calend == 'earth_360d') then
    119         year_len=360
    120       else if (calend == 'earth_365d') then
    121         year_len=365
    122       else if (calend == 'earth_366d') then
    123         year_len=366
    124       else
    125         year_len=1
    126       endif
     118  IF (calend == 'earth_360d') THEN
     119     year_len=360
     120  ELSE IF (calend == 'earth_365d') THEN
     121     year_len=365
     122  ELSE IF (calend == 'earth_366d') THEN
     123     year_len=366
     124  ELSE
     125     year_len=1
     126  ENDIF
    127127
    128128  !Config  Key  = dayref
     
    315315  CALL getin('ngroup',ngroup)
    316316
    317 
    318317  ! top_bound sponge: only active if ok_strato=.true. and iflag_top_bound!=0
    319318  !                   iflag_top_bound=0 for no sponge
     
    322321  iflag_top_bound=1
    323322  CALL getin('iflag_top_bound',iflag_top_bound)
     323  IF (iflag_top_bound < 0 .or. iflag_top_bound > 2) &
     324       call abort_gcm("conf_gcm", 'iflag_top_bound must be 0, 1 or 2', 1)
    324325
    325326  ! mode_top_bound : fields towards which sponge relaxation will be done:
     
    394395  !     .........   (  modif  le 17/04/96 )   .........
    395396
    396   test_etatinit: IF (.not. etatinit) then
     397  test_etatinit: IF (.not. etatinit) THEN
    397398     !Config  Key  = clon
    398399     !Config  Desc = centre du zoom, longitude
     
    598599     type_trac = 'lmdz'
    599600     CALL getin('type_trac',type_trac)
    600 
    601      !Config  Key  = config_inca
    602      !Config  Desc = Choix de configuration de INCA
    603      !Config  Def  = none
    604      !Config  Help = Choix de configuration de INCA :
    605      !Config         'none' = sans INCA
    606      !Config         'chem' = INCA avec calcul de chemie
    607      !Config         'aero' = INCA avec calcul des aerosols
    608      config_inca = 'none'
    609      CALL getin('config_inca',config_inca)
    610601
    611602     !Config  Key  = ok_dynzon
     
    671662     write(lunout,*)' offline = ', offline
    672663     write(lunout,*)' type_trac = ', type_trac
    673      write(lunout,*)' config_inca = ', config_inca
    674664     write(lunout,*)' ok_dynzon = ', ok_dynzon
    675665     write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins
    676666     write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave
    677   else
     667  ELSE
    678668     !Config  Key  = clon
    679669     !Config  Desc = centre du zoom, longitude
     
    795785     CALL getin('type_trac',type_trac)
    796786
    797      !Config  Key  = config_inca
    798      !Config  Desc = Choix de configuration de INCA
    799      !Config  Def  = none
    800      !Config  Help = Choix de configuration de INCA :
    801      !Config         'none' = sans INCA
    802      !Config         'chem' = INCA avec calcul de chemie
    803      !Config         'aero' = INCA avec calcul des aerosols
    804      config_inca = 'none'
    805      CALL getin('config_inca',config_inca)
    806 
    807787     !Config  Key  = ok_dynzon
    808788     !Config  Desc = sortie des transports zonaux dans la dynamique
     
    875855
    876856     write(lunout,*)' #########################################'
    877      write(lunout,*)' Configuration des parametres de cel0' &
    878           //'_limit: '
     857     write(lunout,*)' Configuration des parametres de cel0_limit: '
    879858     write(lunout,*)' planet_type = ', planet_type
    880859     write(lunout,*)' calend = ', calend
     
    912891     write(lunout,*)' offline = ', offline
    913892     write(lunout,*)' type_trac = ', type_trac
    914      write(lunout,*)' config_inca = ', config_inca
    915893     write(lunout,*)' ok_dynzon = ', ok_dynzon
    916894     write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins
     
    920898     write(lunout,*)' ok_limit = ', ok_limit
    921899     write(lunout,*)' ok_etat0 = ', ok_etat0
     900     write(lunout,*)' ok_guide = ', ok_guide
    922901     write(lunout,*)' read_orop = ', read_orop
    923   end IF test_etatinit
     902  ENDIF test_etatinit
    924903
    925904END SUBROUTINE conf_gcm
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/dynredem.F90

    r4013 r4368  
    77  USE IOIPSL
    88#endif
    9   USE infotrac
     9  USE strings_mod, ONLY: maxlen
     10  USE infotrac, ONLY: nqtot, tracers
    1011  USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL,    &
    1112                    NF90_CLOSE,  NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER,   &
    1213                    NF90_64BIT_OFFSET
    1314  USE dynredem_mod, ONLY: cre_var, put_var1, put_var2, err, modname, fil
    14   USE comvert_mod, ONLY: ap,bp,aps,bps,presnivs,pseudoalt,pa,preff, &
    15                               nivsig,nivsigs
     15  USE comvert_mod,  ONLY: ap, bp, presnivs, pa, preff, nivsig, nivsigs
    1616  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
    1717  USE logic_mod, ONLY: fxyhypb, ysinus
     
    3434!===============================================================================
    3535! Local variables:
    36   INTEGER :: iq, l
     36  INTEGER :: iq
    3737  INTEGER, PARAMETER :: length=100
    3838  REAL    :: tab_cntrl(length)                     !--- RUN PARAMETERS TABLE
    3939!   For NetCDF:
    40   CHARACTER(LEN=30) :: unites
     40  CHARACTER(LEN=maxlen) :: unites
    4141  INTEGER :: indexID
    4242  INTEGER :: rlonuID, rlonvID, rlatuID, rlatvID
    43   INTEGER :: sID, sigID, nID, vID, timID
     43  INTEGER :: sID, sigID, nID, timID
    4444  INTEGER :: yyears0, jjour0, mmois0
    45   REAL    :: zan0, zjulian, hours
     45  REAL    :: zjulian, hours
    4646!===============================================================================
    4747  modname='dynredem0'; fil=fichnom
     
    138138
    139139!--- Define fields saved later
    140   WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')"),&
     140  WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')") &
    141141               yyears0,mmois0,jjour0
    142142  CALL cre_var(nid,"temps","Temps de simulation",[timID],unites)
     
    145145  CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])
    146146  DO iq=1,nqtot
    147     CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])
     147    CALL cre_var(nid,tracers(iq)%name,tracers(iq)%longName,[rlonvID,rlatuID,sID,timID])
    148148  END DO
    149149  CALL cre_var(nid,"masse","Masse d air"    ,[rlonvID,rlatuID,sID,timID])
     
    166166! Purpose: Write the NetCDF restart file (append).
    167167!-------------------------------------------------------------------------------
    168   USE infotrac
     168  USE strings_mod, ONLY: maxlen
     169  USE infotrac, ONLY: nqtot, tracers, types_trac
    169170  USE control_mod
    170171  USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
     
    192193!===============================================================================
    193194! Local variables:
    194   INTEGER :: l, iq, nid, vID, ierr, nid_trac, vID_trac
     195  INTEGER :: iq, nid, vID, ierr, nid_trac, vID_trac
    195196  INTEGER, SAVE :: nb=0
    196197  INTEGER, PARAMETER :: length=100
    197198  REAL               :: tab_cntrl(length) ! tableau des parametres du run
    198   CHARACTER(LEN=256) :: var, dum
     199  CHARACTER(LEN=maxlen) :: var, dum
    199200  LOGICAL            :: lread_inca
    200201!===============================================================================
     
    227228!--- Tracers in file "start_trac.nc" (added by Anne)
    228229  lread_inca=.FALSE.; fil="start_trac.nc"
    229   IF(type_trac=='inca' .OR. type_trac=='inco') INQUIRE(FILE=fil,EXIST=lread_inca)
     230  IF(ANY(types_trac=='inca') .OR. ANY(types_trac=='inco')) INQUIRE(FILE=fil,EXIST=lread_inca)
    230231  IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open")
    231232
    232233!--- Save tracers
    233   DO iq=1,nqtot; var=tname(iq); ierr=-1
     234  DO iq=1,nqtot; var=TRIM(tracers(iq)%name); ierr=-1
    234235    IF(lread_inca) THEN                  !--- Possibly read from "start_trac.nc"
    235236      fil="start_trac.nc"
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/gcm.F90

    r3605 r4368  
    2020
    2121  USE filtreg_mod
    22   USE infotrac
     22  USE infotrac, ONLY: nqtot, init_infotrac
    2323  USE control_mod
    2424  USE mod_const_mpi, ONLY: COMM_LMDZ
     
    178178#ifdef CPP_IOIPSL
    179179  if (calend == 'earth_360d') then
    180      call ioconf_calendar('360d')
     180     call ioconf_calendar('360_day')
    181181     write(lunout,*)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
    182182  else if (calend == 'earth_365d') then
     
    205205  !  Choix du nombre de traceurs et du schema pour l'advection
    206206  !  dans fichier traceur.def, par default ou via INCA
    207   call infotrac_init
     207  call init_infotrac
    208208
    209209  ! Allocation de la tableau q : champs advectes   
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/guide_mod.F90

    r4013 r4368  
    3939  REAL, PRIVATE, SAVE     :: lon_min_g,lon_max_g
    4040  REAL, PRIVATE, SAVE     :: tau_lon,tau_lat
     41
     42  REAL, PRIVATE, SAVE     :: plim_guide_BL
    4143
    4244  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_u,alpha_v
     
    6769  SUBROUTINE guide_init
    6870
     71    use netcdf, only: nf90_noerr
    6972    USE control_mod, ONLY: day_step
    7073    USE serre_mod, ONLY: grossismx
     
    113116    CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie')
    114117    CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim')
     118    CALL getpar('plim_guide_BL',85000.,plim_guide_BL,'BL top presnivs value')
     119
    115120
    116121! Sauvegarde du for�age
     
    169174       if (ncidpl.eq.-99) then
    170175          rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl)
    171           if (rcod.NE.NF_NOERR) THEN
     176          if (rcod.NE.NF90_NOERR) THEN
    172177             abort_message=' Nudging error -> no file apbp.nc'
    173178             CALL abort_gcm(modname,abort_message,1)
     
    177182       if (ncidpl.EQ.-99) then
    178183          rcod=nf90_open('P.nc',Nf90_NOWRITe,ncidpl)
    179           if (rcod.NE.NF_NOERR) THEN
     184          if (rcod.NE.NF90_NOERR) THEN
    180185             abort_message=' Nudging error -> no file P.nc'
    181186             CALL abort_gcm(modname,abort_message,1)
     
    186191           if (ncidpl.eq.-99) then
    187192               rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
    188                if (rcod.NE.NF_NOERR) THEN
     193               if (rcod.NE.NF90_NOERR) THEN
    189194                  CALL abort_gcm(modname, &
    190195                       ' Nudging error -> no file u.nc',1)
     
    195200           if (ncidpl.eq.-99) then
    196201               rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
    197                if (rcod.NE.NF_NOERR) THEN
     202               if (rcod.NE.NF90_NOERR) THEN
    198203                  CALL abort_gcm(modname, &
    199204                       ' Nudging error -> no file v.nc',1)
     
    203208           if (ncidpl.eq.-99) then
    204209               rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
    205                if (rcod.NE.NF_NOERR) THEN
     210               if (rcod.NE.NF90_NOERR) THEN
    206211                  CALL abort_gcm(modname, &
    207212                       ' Nudging error -> no file T.nc',1)
     
    211216           if (ncidpl.eq.-99) then
    212217               rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
    213                if (rcod.NE.NF_NOERR) THEN
     218               if (rcod.NE.NF90_NOERR) THEN
    214219                  CALL abort_gcm(modname, &
    215220                       ' Nudging error -> no file hur.nc',1)
     
    220225    endif
    221226    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
    222     IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
    223     IF (error.NE.NF_NOERR) THEN
     227    IF (error.NE.NF90_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
     228    IF (error.NE.NF90_NOERR) THEN
    224229        CALL abort_gcm(modname,'Nudging: error reading pressure levels',1)
    225230    ENDIF
     
    399404        else
    400405            do l=1,llm
    401                 alpha_pcor(l)=(1.+tanh((0.85-presnivs(l)/preff)/0.05))/2.
     406               alpha_pcor(l)=(1.+tanh(((plim_guide_BL-presnivs(l))/preff)/0.05))/2.
    402407            enddo
    403408        endif
     
    10781083  SUBROUTINE guide_read(timestep)
    10791084
     1085    use netcdf, only: NF90_GET_VAR, nf90_noerr
     1086
    10801087    IMPLICIT NONE
    10811088
    1082     include "netcdf.inc"
    10831089    include "dimensions.h"
    10841090    include "paramet.h"
     
    11031109    if (first) then
    11041110         ncidpl=-99
    1105          write(*,*),trim(modname)//': opening nudging files '
     1111         write(*,*) trim(modname)//': opening nudging files '
    11061112! Niveaux de pression si non constants
    11071113         if (guide_plevs.EQ.1) then
    1108              write(*,*),trim(modname)//' Reading nudging on model levels'
     1114             write(*,*) trim(modname)//' Reading nudging on model levels'
    11091115             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
    1110              IF (rcode.NE.NF_NOERR) THEN
     1116             IF (rcode.NE.NF90_NOERR) THEN
    11111117              abort_message='Nudging: error -> no file apbp.nc'
    11121118              CALL abort_gcm(modname,abort_message,1)
    11131119             ENDIF
    11141120             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
    1115              IF (rcode.NE.NF_NOERR) THEN
     1121             IF (rcode.NE.NF90_NOERR) THEN
    11161122              abort_message='Nudging: error -> no AP variable in file apbp.nc'
    11171123              CALL abort_gcm(modname,abort_message,1)
    11181124             ENDIF
    11191125             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
    1120              IF (rcode.NE.NF_NOERR) THEN
     1126             IF (rcode.NE.NF90_NOERR) THEN
    11211127              abort_message='Nudging: error -> no BP variable in file apbp.nc'
    11221128              CALL abort_gcm(modname,abort_message,1)
    11231129             ENDIF
    1124              write(*,*),trim(modname)//' ncidpl,varidap',ncidpl,varidap
     1130             write(*,*) trim(modname)//' ncidpl,varidap',ncidpl,varidap
    11251131         endif
    11261132
     
    11281134         if (guide_plevs.EQ.2) then
    11291135             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
    1130              IF (rcode.NE.NF_NOERR) THEN
     1136             IF (rcode.NE.NF90_NOERR) THEN
    11311137              abort_message='Nudging: error -> no file P.nc'
    11321138              CALL abort_gcm(modname,abort_message,1)
    11331139             ENDIF
    11341140             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
    1135              IF (rcode.NE.NF_NOERR) THEN
     1141             IF (rcode.NE.NF90_NOERR) THEN
    11361142              abort_message='Nudging: error -> no PRES variable in file P.nc'
    11371143              CALL abort_gcm(modname,abort_message,1)
    11381144             ENDIF
    1139              write(*,*),trim(modname)//' ncidp,varidp',ncidp,varidp
     1145             write(*,*) trim(modname)//' ncidp,varidp',ncidp,varidp
    11401146             if (ncidpl.eq.-99) ncidpl=ncidp
    11411147         endif
     
    11441150         if (guide_u) then
    11451151             rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
    1146              IF (rcode.NE.NF_NOERR) THEN
     1152             IF (rcode.NE.NF90_NOERR) THEN
    11471153              abort_message='Nudging: error -> no file u.nc'
    11481154              CALL abort_gcm(modname,abort_message,1)
    11491155             ENDIF
    11501156             rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
    1151              IF (rcode.NE.NF_NOERR) THEN
     1157             IF (rcode.NE.NF90_NOERR) THEN
    11521158              abort_message='Nudging: error -> no UWND variable in file u.nc'
    11531159              CALL abort_gcm(modname,abort_message,1)
    11541160             ENDIF
    1155              write(*,*),trim(modname)//' ncidu,varidu',ncidu,varidu
     1161             write(*,*) trim(modname)//' ncidu,varidu',ncidu,varidu
    11561162             if (ncidpl.eq.-99) ncidpl=ncidu
    11571163
     
    11751181         if (guide_v) then
    11761182             rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
    1177              IF (rcode.NE.NF_NOERR) THEN
     1183             IF (rcode.NE.NF90_NOERR) THEN
    11781184              abort_message='Nudging: error -> no file v.nc'
    11791185              CALL abort_gcm(modname,abort_message,1)
    11801186             ENDIF
    11811187             rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
    1182              IF (rcode.NE.NF_NOERR) THEN
     1188             IF (rcode.NE.NF90_NOERR) THEN
    11831189              abort_message='Nudging: error -> no VWND variable in file v.nc'
    11841190              CALL abort_gcm(modname,abort_message,1)
    11851191             ENDIF
    1186              write(*,*),trim(modname)//' ncidv,varidv',ncidv,varidv
     1192             write(*,*) trim(modname)//' ncidv,varidv',ncidv,varidv
    11871193             if (ncidpl.eq.-99) ncidpl=ncidv
    11881194             
     
    12081214         if (guide_T) then
    12091215             rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
    1210              IF (rcode.NE.NF_NOERR) THEN
     1216             IF (rcode.NE.NF90_NOERR) THEN
    12111217              abort_message='Nudging: error -> no file T.nc'
    12121218              CALL abort_gcm(modname,abort_message,1)
    12131219             ENDIF
    12141220             rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
    1215              IF (rcode.NE.NF_NOERR) THEN
     1221             IF (rcode.NE.NF90_NOERR) THEN
    12161222              abort_message='Nudging: error -> no AIR variable in file T.nc'
    12171223              CALL abort_gcm(modname,abort_message,1)
    12181224             ENDIF
    1219              write(*,*),trim(modname)//' ncidT,varidT',ncidt,varidt
     1225             write(*,*) trim(modname)//' ncidT,varidT',ncidt,varidt
    12201226             if (ncidpl.eq.-99) ncidpl=ncidt
    12211227
     
    12391245         if (guide_Q) then
    12401246             rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
    1241              IF (rcode.NE.NF_NOERR) THEN
     1247             IF (rcode.NE.NF90_NOERR) THEN
    12421248              abort_message='Nudging: error -> no file hur.nc'
    12431249              CALL abort_gcm(modname,abort_message,1)
    12441250             ENDIF
    12451251             rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
    1246              IF (rcode.NE.NF_NOERR) THEN
     1252             IF (rcode.NE.NF90_NOERR) THEN
    12471253              abort_message='Nudging: error -> no RH variable in file hur.nc'
    12481254              CALL abort_gcm(modname,abort_message,1)
    12491255             ENDIF
    1250              write(*,*),trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
     1256             write(*,*) trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
    12511257             if (ncidpl.eq.-99) ncidpl=ncidQ
    12521258
     
    12701276         if ((guide_P).OR.(guide_modele)) then
    12711277             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
    1272              IF (rcode.NE.NF_NOERR) THEN
     1278             IF (rcode.NE.NF90_NOERR) THEN
    12731279              abort_message='Nudging: error -> no file ps.nc'
    12741280              CALL abort_gcm(modname,abort_message,1)
    12751281             ENDIF
    12761282             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
    1277              IF (rcode.NE.NF_NOERR) THEN
     1283             IF (rcode.NE.NF90_NOERR) THEN
    12781284              abort_message='Nudging: error -> no SP variable in file ps.nc'
    12791285              CALL abort_gcm(modname,abort_message,1)
    12801286             ENDIF
    1281              write(*,*),trim(modname)//' ncidps,varidps',ncidps,varidps
     1287             write(*,*) trim(modname)//' ncidps,varidps',ncidps,varidps
    12821288         endif
    12831289! Coordonnee verticale
     
    12851291              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
    12861292              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
    1287               write(*,*),trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
     1293              write(*,*) trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
    12881294         endif
    12891295! Coefs ap, bp pour calcul de la pression aux differents niveaux
    12901296         if (guide_plevs.EQ.1) then
    1291 #ifdef NC_DOUBLE
    1292              status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
    1293              status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
    1294 #else
    1295              status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
    1296              status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
    1297 #endif
     1297             status=NF90_GET_VAR(ncidpl,varidap,apnc,[1],[nlevnc])
     1298             status=NF90_GET_VAR(ncidpl,varidbp,bpnc,[1],[nlevnc])
    12981299         ELSEIF (guide_plevs.EQ.0) THEN
    1299 #ifdef NC_DOUBLE
    1300              status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
    1301 #else
    1302              status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
    1303 #endif
     1300             status=NF90_GET_VAR(ncidpl,varidpl,apnc,[1],[nlevnc])
    13041301!FC Pour les corrections la pression est deja en Pascals on commente la ligne ci-dessous
    13051302             IF(convert_Pa) apnc=apnc*100.! conversion en Pascals
     
    13261323! Pression
    13271324     if (guide_plevs.EQ.2) then
    1328 #ifdef NC_DOUBLE
    1329          status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,pnat2)
    1330 #else
    1331          status=NF_GET_VARA_REAL(ncidp,varidp,start,count,pnat2)
    1332 #endif
     1325         status=NF90_GET_VAR(ncidp,varidp,pnat2,start,count)
    13331326         IF (invert_y) THEN
    13341327!           PRINT*,"Invertion impossible actuellement"
     
    13401333!  Vent zonal
    13411334     if (guide_u) then
    1342 #ifdef NC_DOUBLE
    1343          status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,unat2)
    1344 #else
    1345          status=NF_GET_VARA_REAL(ncidu,varidu,start,count,unat2)
    1346 #endif
     1335         status=NF90_GET_VAR(ncidu,varidu,unat2,start,count)
    13471336         IF (invert_y) THEN
    13481337           CALL invert_lat(iip1,jjp1,nlevnc,unat2)
     
    13521341!  Temperature
    13531342     if (guide_T) then
    1354 #ifdef NC_DOUBLE
    1355          status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,tnat2)
    1356 #else
    1357          status=NF_GET_VARA_REAL(ncidt,varidt,start,count,tnat2)
    1358 #endif
     1343         status=NF90_GET_VAR(ncidt,varidt,tnat2,start,count)
    13591344         IF (invert_y) THEN
    13601345           CALL invert_lat(iip1,jjp1,nlevnc,tnat2)
     
    13641349!  Humidite
    13651350     if (guide_Q) then
    1366 #ifdef NC_DOUBLE
    1367          status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,qnat2)
    1368 #else
    1369          status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,qnat2)
    1370 #endif
     1351         status=NF90_GET_VAR(ncidQ,varidQ,qnat2,start,count)
    13711352         IF (invert_y) THEN
    13721353           CALL invert_lat(iip1,jjp1,nlevnc,qnat2)
     
    13781359     if (guide_v) then
    13791360         count(2)=jjm
    1380 #ifdef NC_DOUBLE
    1381          status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,vnat2)
    1382 #else
    1383          status=NF_GET_VARA_REAL(ncidv,varidv,start,count,vnat2)
    1384 #endif
     1361         status=NF90_GET_VAR(ncidv,varidv,vnat2,start,count)
    13851362         IF (invert_y) THEN
    13861363           CALL invert_lat(iip1,jjm,nlevnc,vnat2)
     
    13951372         count(3)=1
    13961373         count(4)=0
    1397 #ifdef NC_DOUBLE
    1398          status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,psnat2)
    1399 #else
    1400          status=NF_GET_VARA_REAL(ncidps,varidps,start,count,psnat2)
    1401 #endif
     1374         status=NF90_GET_VAR(ncidps,varidps,psnat2,start,count)
    14021375         IF (invert_y) THEN
    14031376           CALL invert_lat(iip1,jjp1,1,psnat2)
     
    14101383  SUBROUTINE guide_read2D(timestep)
    14111384
     1385    use netcdf, only: nf90_get_var, nf90_noerr
     1386
    14121387    IMPLICIT NONE
    14131388
    1414     include "netcdf.inc"
    14151389    include "dimensions.h"
    14161390    include "paramet.h"
     
    14431417           write(*,*)trim(modname)//' Reading nudging on model levels'
    14441418           rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
    1445            IF (rcode.NE.NF_NOERR) THEN
     1419           IF (rcode.NE.NF90_NOERR) THEN
    14461420             abort_message='Nudging: error -> no file apbp.nc'
    14471421           CALL abort_gcm(modname,abort_message,1)
    14481422           ENDIF
    14491423           rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
    1450            IF (rcode.NE.NF_NOERR) THEN
     1424           IF (rcode.NE.NF90_NOERR) THEN
    14511425             abort_message='Nudging: error -> no AP variable in file apbp.nc'
    14521426           CALL abort_gcm(modname,abort_message,1)
    14531427           ENDIF
    14541428           rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
    1455            IF (rcode.NE.NF_NOERR) THEN
     1429           IF (rcode.NE.NF90_NOERR) THEN
    14561430             abort_message='Nudging: error -> no BP variable in file apbp.nc'
    14571431             CALL abort_gcm(modname,abort_message,1)
     
    14621436         if (guide_plevs.EQ.2) then
    14631437           rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
    1464            IF (rcode.NE.NF_NOERR) THEN
     1438           IF (rcode.NE.NF90_NOERR) THEN
    14651439             abort_message='Nudging: error -> no file P.nc'
    14661440             CALL abort_gcm(modname,abort_message,1)
    14671441           ENDIF
    14681442           rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
    1469            IF (rcode.NE.NF_NOERR) THEN
     1443           IF (rcode.NE.NF90_NOERR) THEN
    14701444             abort_message='Nudging: error -> no PRES variable in file P.nc'
    14711445             CALL abort_gcm(modname,abort_message,1)
     
    14771451         if (guide_u) then
    14781452           rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
    1479            IF (rcode.NE.NF_NOERR) THEN
     1453           IF (rcode.NE.NF90_NOERR) THEN
    14801454             abort_message='Nudging: error -> no file u.nc'
    14811455             CALL abort_gcm(modname,abort_message,1)
    14821456           ENDIF
    14831457           rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
    1484            IF (rcode.NE.NF_NOERR) THEN
     1458           IF (rcode.NE.NF90_NOERR) THEN
    14851459             abort_message='Nudging: error -> no UWND variable in file u.nc'
    14861460             CALL abort_gcm(modname,abort_message,1)
     
    14921466         if (guide_v) then
    14931467           rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
    1494            IF (rcode.NE.NF_NOERR) THEN
     1468           IF (rcode.NE.NF90_NOERR) THEN
    14951469             abort_message='Nudging: error -> no file v.nc'
    14961470             CALL abort_gcm(modname,abort_message,1)
    14971471           ENDIF
    14981472           rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
    1499            IF (rcode.NE.NF_NOERR) THEN
     1473           IF (rcode.NE.NF90_NOERR) THEN
    15001474             abort_message='Nudging: error -> no VWND variable in file v.nc'
    15011475             CALL abort_gcm(modname,abort_message,1)
     
    15071481         if (guide_T) then
    15081482           rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
    1509            IF (rcode.NE.NF_NOERR) THEN
     1483           IF (rcode.NE.NF90_NOERR) THEN
    15101484             abort_message='Nudging: error -> no file T.nc'
    15111485             CALL abort_gcm(modname,abort_message,1)
    15121486           ENDIF
    15131487           rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
    1514            IF (rcode.NE.NF_NOERR) THEN
     1488           IF (rcode.NE.NF90_NOERR) THEN
    15151489             abort_message='Nudging: error -> no AIR variable in file T.nc'
    15161490             CALL abort_gcm(modname,abort_message,1)
     
    15221496         if (guide_Q) then
    15231497           rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
    1524            IF (rcode.NE.NF_NOERR) THEN
     1498           IF (rcode.NE.NF90_NOERR) THEN
    15251499             abort_message='Nudging: error -> no file hur.nc'
    15261500             CALL abort_gcm(modname,abort_message,1)
    15271501           ENDIF
    15281502           rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
    1529            IF (rcode.NE.NF_NOERR) THEN
     1503           IF (rcode.NE.NF90_NOERR) THEN
    15301504             abort_message='Nudging: error -> no RH,variable in file hur.nc'
    15311505             CALL abort_gcm(modname,abort_message,1)
     
    15371511         if ((guide_P).OR.(guide_modele)) then
    15381512           rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
    1539            IF (rcode.NE.NF_NOERR) THEN
     1513           IF (rcode.NE.NF90_NOERR) THEN
    15401514             abort_message='Nudging: error -> no file ps.nc'
    15411515             CALL abort_gcm(modname,abort_message,1)
    15421516           ENDIF
    15431517           rcode = nf90_inq_varid(ncidps, 'SP', varidps)
    1544            IF (rcode.NE.NF_NOERR) THEN
     1518           IF (rcode.NE.NF90_NOERR) THEN
    15451519             abort_message='Nudging: error -> no SP variable in file ps.nc'
    15461520             CALL abort_gcm(modname,abort_message,1)
     
    15561530! Coefs ap, bp pour calcul de la pression aux differents niveaux
    15571531         if (guide_plevs.EQ.1) then
    1558 #ifdef NC_DOUBLE
    1559              status=NF_GET_VARA_DOUBLE(ncidpl,varidap,1,nlevnc,apnc)
    1560              status=NF_GET_VARA_DOUBLE(ncidpl,varidbp,1,nlevnc,bpnc)
    1561 #else
    1562              status=NF_GET_VARA_REAL(ncidpl,varidap,1,nlevnc,apnc)
    1563              status=NF_GET_VARA_REAL(ncidpl,varidbp,1,nlevnc,bpnc)
    1564 #endif
     1532             status=NF90_GET_VAR(ncidpl,varidap,apnc,[1],[nlevnc])
     1533             status=NF90_GET_VAR(ncidpl,varidbp,bpnc,[1],[nlevnc])
    15651534         elseif (guide_plevs.EQ.0) THEN
    1566 #ifdef NC_DOUBLE
    1567              status=NF_GET_VARA_DOUBLE(ncidpl,varidpl,1,nlevnc,apnc)
    1568 #else
    1569              status=NF_GET_VARA_REAL(ncidpl,varidpl,1,nlevnc,apnc)
    1570 #endif
     1535             status=NF90_GET_VAR(ncidpl,varidpl,apnc,[1],[nlevnc])
    15711536             apnc=apnc*100.! conversion en Pascals
    15721537             bpnc(:)=0.
     
    15921557!  Pression
    15931558     if (guide_plevs.EQ.2) then
    1594 #ifdef NC_DOUBLE
    1595          status=NF_GET_VARA_DOUBLE(ncidp,varidp,start,count,zu)
    1596 #else
    1597          status=NF_GET_VARA_REAL(ncidp,varidp,start,count,zu)
    1598 #endif
     1559         status=NF90_GET_VAR(ncidp,varidp,zu,start,count)
    15991560         DO i=1,iip1
    16001561             pnat2(i,:,:)=zu(:,:)
     
    16091570!  Vent zonal
    16101571     if (guide_u) then
    1611 #ifdef NC_DOUBLE
    1612          status=NF_GET_VARA_DOUBLE(ncidu,varidu,start,count,zu)
    1613 #else
    1614          status=NF_GET_VARA_REAL(ncidu,varidu,start,count,zu)
    1615 #endif
     1572         status=NF90_GET_VAR(ncidu,varidu,zu,start,count)
    16161573         DO i=1,iip1
    16171574             unat2(i,:,:)=zu(:,:)
     
    16261583!  Temperature
    16271584     if (guide_T) then
    1628 #ifdef NC_DOUBLE
    1629          status=NF_GET_VARA_DOUBLE(ncidt,varidt,start,count,zu)
    1630 #else
    1631          status=NF_GET_VARA_REAL(ncidt,varidt,start,count,zu)
    1632 #endif
     1585         status=NF90_GET_VAR(ncidt,varidt,zu,start,count)
    16331586         DO i=1,iip1
    16341587             tnat2(i,:,:)=zu(:,:)
     
    16431596!  Humidite
    16441597     if (guide_Q) then
    1645 #ifdef NC_DOUBLE
    1646          status=NF_GET_VARA_DOUBLE(ncidQ,varidQ,start,count,zu)
    1647 #else
    1648          status=NF_GET_VARA_REAL(ncidQ,varidQ,start,count,zu)
    1649 #endif
     1598         status=NF90_GET_VAR(ncidQ,varidQ,zu,start,count)
    16501599         DO i=1,iip1
    16511600             qnat2(i,:,:)=zu(:,:)
     
    16611610     if (guide_v) then
    16621611         count(2)=jjm
    1663 #ifdef NC_DOUBLE
    1664          status=NF_GET_VARA_DOUBLE(ncidv,varidv,start,count,zv)
    1665 #else
    1666          status=NF_GET_VARA_REAL(ncidv,varidv,start,count,zv)
    1667 #endif
     1612         status=NF90_GET_VAR(ncidv,varidv,zv,start,count)
    16681613         DO i=1,iip1
    16691614             vnat2(i,:,:)=zv(:,:)
     
    16831628         count(3)=1
    16841629         count(4)=0
    1685 #ifdef NC_DOUBLE
    1686          status=NF_GET_VARA_DOUBLE(ncidps,varidps,start,count,zu(:,1))
    1687 #else
    1688          status=NF_GET_VARA_REAL(ncidps,varidps,start,count,zu(:,1))
    1689 #endif
     1630         status=NF90_GET_VAR(ncidps,varidps,zu(:,1),start,count)
    16901631         DO i=1,iip1
    16911632             psnat2(i,:)=zu(:,1)
     
    17061647    USE comvert_mod, ONLY: presnivs
    17071648    use netcdf95, only: nf95_def_var, nf95_put_var
    1708     use netcdf, only: nf90_float
     1649    use netcdf, only: nf90_float, nf90_def_var
    17091650   
    17101651    IMPLICIT NONE
     
    17481689
    17491690! Creation des variables dimensions
    1750         ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu)
    1751         ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv)
    1752         ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu)
    1753         ierr=NF_DEF_VAR(nid,"LATV",NF_FLOAT,1,id_latv,vid_latv)
    1754         ierr=NF_DEF_VAR(nid,"LEVEL",NF_FLOAT,1,id_lev,vid_lev)
    1755         ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu)
    1756         ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv)
    1757         ierr=NF_DEF_VAR(nid,"au",NF_FLOAT,2,(/id_lonu,id_latu/),vid_au)
    1758         ierr=NF_DEF_VAR(nid,"av",NF_FLOAT,2,(/id_lonv,id_latv/),vid_av)
     1691        ierr=NF90_DEF_VAR(nid,"LONU",NF90_FLOAT,id_lonu,vid_lonu)
     1692        ierr=NF90_DEF_VAR(nid,"LONV",NF90_FLOAT,id_lonv,vid_lonv)
     1693        ierr=NF90_DEF_VAR(nid,"LATU",NF90_FLOAT,id_latu,vid_latu)
     1694        ierr=NF90_DEF_VAR(nid,"LATV",NF90_FLOAT,id_latv,vid_latv)
     1695        ierr=NF90_DEF_VAR(nid,"LEVEL",NF90_FLOAT,id_lev,vid_lev)
     1696        ierr=NF90_DEF_VAR(nid,"cu",NF90_FLOAT,(/id_lonu,id_latu/),vid_cu)
     1697        ierr=NF90_DEF_VAR(nid,"cv",NF90_FLOAT,(/id_lonv,id_latv/),vid_cv)
     1698        ierr=NF90_DEF_VAR(nid,"au",NF90_FLOAT,(/id_lonu,id_latu/),vid_au)
     1699        ierr=NF90_DEF_VAR(nid,"av",NF90_FLOAT,(/id_lonv,id_latv/),vid_av)
    17591700        call nf95_def_var(nid, "alpha_T", nf90_float, (/id_lonv, id_latu/), &
    17601701             varid_alpha_t)
     
    17941735! Pressure (GCM)
    17951736        dim4=(/id_lonv,id_latu,id_lev,id_tim/)
    1796         ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid)
     1737        ierr = NF90_DEF_VAR(nid,"SP",NF90_FLOAT,dim4,varid)
    17971738! Surface pressure (guidage)
    17981739        IF (guide_P) THEN
    17991740            dim3=(/id_lonv,id_latu,id_tim/)
    1800             ierr = NF_DEF_VAR(nid,"ps",NF_FLOAT,3,dim3,varid)
     1741            ierr = NF90_DEF_VAR(nid,"ps",NF90_FLOAT,dim3,varid)
    18011742        ENDIF
    18021743! Zonal wind
    18031744        IF (guide_u) THEN
    18041745            dim4=(/id_lonu,id_latu,id_lev,id_tim/)
    1805             ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid)
    1806             ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid)
    1807             ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid)
     1746            ierr = NF90_DEF_VAR(nid,"u",NF90_FLOAT,dim4,varid)
     1747            ierr = NF90_DEF_VAR(nid,"ua",NF90_FLOAT,dim4,varid)
     1748            ierr = NF90_DEF_VAR(nid,"ucov",NF90_FLOAT,dim4,varid)
    18081749        ENDIF
    18091750! Merid. wind
    18101751        IF (guide_v) THEN
    18111752            dim4=(/id_lonv,id_latv,id_lev,id_tim/)
    1812             ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid)
    1813             ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid)
    1814             ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid)
     1753            ierr = NF90_DEF_VAR(nid,"v",NF90_FLOAT,dim4,varid)
     1754            ierr = NF90_DEF_VAR(nid,"va",NF90_FLOAT,dim4,varid)
     1755            ierr = NF90_DEF_VAR(nid,"vcov",NF90_FLOAT,dim4,varid)
    18151756        ENDIF
    18161757! Pot. Temperature
    18171758        IF (guide_T) THEN
    18181759            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
    1819             ierr = NF_DEF_VAR(nid,"teta",NF_FLOAT,4,dim4,varid)
     1760            ierr = NF90_DEF_VAR(nid,"teta",NF90_FLOAT,dim4,varid)
    18201761        ENDIF
    18211762! Specific Humidity
    18221763        IF (guide_Q) THEN
    18231764            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
    1824             ierr = NF_DEF_VAR(nid,"q",NF_FLOAT,4,dim4,varid)
     1765            ierr = NF90_DEF_VAR(nid,"q",NF90_FLOAT,dim4,varid)
    18251766        ENDIF
    18261767       
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/iniacademic.F90

    r4013 r4368  
    55
    66  USE filtreg_mod, ONLY: inifilr
    7   USE infotrac
     7  USE infotrac,    ONLY: nqtot, niso, iqIsoPha, tracers, getKey, isoName
    88  USE control_mod, ONLY: day_step,planet_type
     9  use exner_hyb_m, only: exner_hyb
     10  use exner_milieu_m, only: exner_milieu
    911#ifdef CPP_IOIPSL
    1012  USE IOIPSL, ONLY: getin
     
    1416#endif
    1517  USE Write_Field
    16   use exner_hyb_m, only: exner_hyb
    17   use exner_milieu_m, only: exner_milieu
    1818  USE comconst_mod, ONLY: cpp, kappa, g, daysec, dtvr, pi, im, jm
    1919  USE logic_mod, ONLY: iflag_phys, read_start
     
    2121  USE temps_mod, ONLY: annee_ref, day_ini, day_ref
    2222  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
     23  USE readTracFiles_mod, ONLY: addPhase
    2324
    2425  !   Author:    Frederic Hourdin      original: 15/01/93
     
    6162  real tetastrat ! potential temperature in the stratosphere, in K
    6263  real tetajl(jjp1,llm)
    63   INTEGER i,j,l,lsup,ij
     64  INTEGER i,j,l,lsup,ij, iq, iName, iPhase, iqParent
    6465
    6566  REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T
     
    7273  integer idum
    7374
    74   REAL zdtvr
     75  REAL zdtvr, tnat, alpha_ideal
    7576 
    7677  character(len=*),parameter :: modname="iniacademic"
    7778  character(len=80) :: abort_message
    78 
    7979
    8080  ! Sanity check: verify that options selected by user are not incompatible
     
    130130        ps(:)=preff
    131131     endif
     132
    132133     ! ground geopotential
    133134     phis(:)=0.
    134135     CALL pression ( ip1jmp1, ap, bp, ps, p       )
     136
    135137     if (pressure_exner) then
    136138       CALL exner_hyb( ip1jmp1, ps, p, pks, pk)
     
    193195     CALL getin('tetanoise',tetanoise)
    194196
    195 
    196197     ! 2. Initialize fields towards which to relax
    197198     ! Friction
     
    246247     IF (.NOT. read_start) THEN
    247248        ! bulk initialization of temperature
    248 
    249249        IF (iflag_phys>10000) THEN
    250250        ! Particular case to impose a constant temperature T0=0.01*iflag_physx
     
    253253           teta(:,:)=tetarappel(:,:)
    254254        ENDIF
    255 
    256255        ! geopotential
    257256        CALL geopot(ip1jmp1,teta,pk,pks,phis,phi)
     
    275274        if (planet_type=="earth") then
    276275           ! Earth: first two tracers will be water
    277            do i=1,nqtot
    278               if (i == 1) q(:,:,i)=1.e-10
    279               if (i == 2) q(:,:,i)=1.e-15
    280               if (i.gt.2) q(:,:,i)=0.
     276           do iq=1,nqtot
     277              q(:,:,iq)=0.
     278              IF(tracers(iq)%name == addPhase('H2O', 'g')) q(:,:,iq)=1.e-10
     279              IF(tracers(iq)%name == addPhase('H2O', 'l')) q(:,:,iq)=1.e-15
    281280
    282281              ! CRisi: init des isotopes
    283282              ! distill de Rayleigh très simplifiée
    284               if (ok_isotopes) then
    285                 if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then         
    286                    q(:,:,i)=q(:,:,iqpere(i))             &
    287       &                  *tnat(iso_num(i))               &
    288       &                  *(q(:,:,iqpere(i))/30.e-3)      &
    289       &                  **(alpha_ideal(iso_num(i))-1)
    290                 endif               
    291                 if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then
    292                   q(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i)))
    293                 endif
    294               endif !if (ok_isotopes) then
    295 
     283              iName    = tracers(iq)%iso_iName
     284              if (niso <= 0 .OR. iName <= 0) CYCLE
     285              iPhase   = tracers(iq)%iso_iPhase
     286              iqParent = tracers(iq)%iqParent
     287              IF(tracers(iq)%iso_iZone == 0) THEN
     288                 IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
     289                    CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)
     290                 q(:,:,iq) = q(:,:,iqParent)*tnat*(q(:,:,iqParent)/30.e-3)**(alpha_ideal-1.)
     291              ELSE
     292                 q(:,:,iq) = q(:,:,iqIsoPha(iName,iPhase))
     293              END IF
    296294           enddo
    297295        else
     
    299297        endif ! of if (planet_type=="earth")
    300298
    301         if (ok_iso_verif) then
    302            call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc')
    303         endif !if (ok_iso_verif) then
     299        call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc')
    304300
    305301        ! add random perturbation to temperature
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/leapfrog.F

    r4013 r4368  
    1111      use IOIPSL
    1212#endif
    13       USE infotrac, ONLY: nqtot,ok_iso_verif
     13      USE infotrac, ONLY: nqtot, isoCheck
    1414      USE guide_mod, ONLY : guide_main
    1515      USE write_field, ONLY: writefield
     
    2626      USE temps_mod, ONLY: jD_ref,jH_ref,itaufin,day_ini,day_ref,
    2727     &                        start_time,dt
     28      USE strings_mod, ONLY: msg
    2829
    2930      IMPLICIT NONE
     
    237238      jH_cur = jH_cur - int(jH_cur)
    238239
    239         if (ok_iso_verif) then
    240            call check_isotopes_seq(q,ip1jmp1,'leapfrog 321')
    241         endif !if (ok_iso_verif) then
     240      call check_isotopes_seq(q,ip1jmp1,'leapfrog 321')
    242241
    243242#ifdef CPP_IOIPSL
     
    271270!      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
    272271
    273         if (ok_iso_verif) then
    274            call check_isotopes_seq(q,ip1jmp1,'leapfrog 400')
    275         endif !if (ok_iso_verif) then
     272      call check_isotopes_seq(q,ip1jmp1,'leapfrog 400')
    276273
    277274   2  CONTINUE ! Matsuno backward or leapfrog step begins here
     
    324321
    325322
    326         if (ok_iso_verif) then
    327            call check_isotopes_seq(q,ip1jmp1,'leapfrog 589')
    328         endif !if (ok_iso_verif) then
     323      call check_isotopes_seq(q,ip1jmp1,'leapfrog 589')
    329324
    330325c-----------------------------------------------------------------------
     
    345340c   -------------------------------------------------------------
    346341
    347         if (ok_iso_verif) then
    348            call check_isotopes_seq(q,ip1jmp1,
     342      call check_isotopes_seq(q,ip1jmp1,
    349343     &           'leapfrog 686: avant caladvtrac')
    350         endif !if (ok_iso_verif) then
    351344
    352345      IF( forward. OR . leapf )  THEN
     
    376369c   ----------------------------------
    377370
    378         if (ok_iso_verif) then
    379            write(*,*) 'leapfrog 720'
    380            call check_isotopes_seq(q,ip1jmp1,'leapfrog 756')
    381         endif !if (ok_iso_verif) then
     371       CALL msg('720', modname, isoCheck)
     372       call check_isotopes_seq(q,ip1jmp1,'leapfrog 756')
    382373       
    383374       CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 ,
     
    385376!     $              finvmaold                                    )
    386377
    387        if (ok_iso_verif) then
    388           write(*,*) 'leapfrog 724'
    389            call check_isotopes_seq(q,ip1jmp1,'leapfrog 762')
    390         endif !if (ok_iso_verif) then
     378       CALL msg('724', modname, isoCheck)
     379       call check_isotopes_seq(q,ip1jmp1,'leapfrog 762')
    391380
    392381c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
     
    451440c+jld
    452441
    453 c  Diagnostique de conservation de l'énergie : initialisation
     442c  Diagnostique de conservation de l'energie : initialisation
    454443         IF (ip_ebil_dyn.ge.1 ) THEN
    455444          ztit='bil dyn'
     
    498487       
    499488c
    500 c  Diagnostique de conservation de l'énergie : difference
     489c  Diagnostique de conservation de l'energie : difference
    501490         IF (ip_ebil_dyn.ge.1 ) THEN
    502491          ztit='bil phys'
     
    552541        CALL massdair(p,masse)
    553542
    554         if (ok_iso_verif) then
    555            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196')
    556         endif !if (ok_iso_verif) then
     543        call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196')
    557544
    558545c-----------------------------------------------------------------------
     
    639626c   preparation du pas d'integration suivant  ......
    640627
    641         if (ok_iso_verif) then
    642            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509')
    643         endif !if (ok_iso_verif) then
     628      call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509')
    644629
    645630      IF ( .NOT.purmats ) THEN
     
    703688            ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin))
    704689
    705         if (ok_iso_verif) then
    706            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584')
    707         endif !if (ok_iso_verif) then
     690            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584')
    708691
    709692c-----------------------------------------------------------------------
     
    790773      ELSE ! of IF (.not.purmats)
    791774
    792         if (ok_iso_verif) then
    793            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664')
    794         endif !if (ok_iso_verif) then
     775            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664')
    795776
    796777c       ........................................................
     
    817798            ELSE ! of IF(forward) i.e. backward step
    818799 
    819         if (ok_iso_verif) then
    820            call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698')
    821         endif !if (ok_iso_verif) then 
     800              call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698')
    822801
    823802              IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/qminimum.F

    r2600 r4368  
    44      SUBROUTINE qminimum( q,nqtot,deltap )
    55
    6       USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif
     6      USE infotrac, ONLY: niso, ntiso,iqIsoPha, tracers
     7      USE strings_mod, ONLY: strIdx
     8      USE readTracFiles_mod, ONLY: addPhase
    79      IMPLICIT none
    810c
     
    1618      REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
    1719c
    18       INTEGER iq_vap, iq_liq
    19       PARAMETER ( iq_vap = 1 ) ! indice pour l'eau vapeur
    20       PARAMETER ( iq_liq = 2 ) ! indice pour l'eau liquide
    21       REAL seuil_vap, seuil_liq
    22       PARAMETER ( seuil_vap = 1.0e-10 ) ! seuil pour l'eau vapeur
    23       PARAMETER ( seuil_liq = 1.0e-11 ) ! seuil pour l'eau liquide
     20      LOGICAL, SAVE :: first=.TRUE.
     21      INTEGER, SAVE :: iq_vap, iq_liq        ! indices pour l'eau vapeur/liquide
     22      REAL, PARAMETER :: seuil_vap = 1.0e-10 ! seuil pour l'eau vapeur
     23      REAL, PARAMETER :: seuil_liq = 1.0e-11 ! seuil pour l'eau liquide
    2424c
    2525c  NB. ....( Il est souhaitable mais non obligatoire que les valeurs des
     
    4343      !INTEGER nb_pump
    4444      INTEGER ixt
     45
     46      IF(first) THEN
     47         iq_vap = strIdx(tracers(:)%name, addPhase('H2O', 'g'))
     48         iq_liq = strIdx(tracers(:)%name, addPhase('H2O', 'l'))
     49         first = .FALSE.
     50      END IF
    4551c
    4652c Quand l'eau liquide est trop petite (ou negative), on prend
     
    4955c
    5056
    51         if (ok_iso_verif) then
    52            call check_isotopes_seq(q,ip1jmp1,'qminimum 52')   
    53         endif !if (ok_iso_verif) then     
     57      call check_isotopes_seq(q,ip1jmp1,'qminimum 52')   
    5458
    5559      zx_defau_diag(:,:,:)=0.0
     
    5963          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
    6064
    61               if (ok_isotopes) then
    62                  zx_defau_diag(i,k,iq_liq)=AMAX1
     65              if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
    6366     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
    64               endif !if (ok_isotopes) then
    6567
    6668             q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
     
    8082          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
    8183
    82             if (ok_isotopes) then
    83               zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
    84             endif !if (ok_isotopes) then
     84            if (niso > 0)
     85     &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
    8586
    8687            q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
     
    110111
    111112      !write(*,*) 'qminimum 128'
    112       if (ok_isotopes) then
     113      if (niso > 0) then
    113114      ! CRisi: traiter de même les traceurs d'eau
    114115      ! Mais il faut les prendre à l'envers pour essayer de conserver la
     
    130131          if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
    131132              ! on ajoute la vapeur en k             
    132               do ixt=1,ntraciso
    133                q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
    134      :              +zx_defau_diag(i,k,iq_vap)
    135      :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     133              do ixt=1,ntiso
     134               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
     135     :           +zx_defau_diag(i,k,iq_vap)
     136     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
    136137               
    137138              ! et on la retranche en k-1
    138                q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))
     139               q(i,k-1,iqIsoPha(ixt,iq_vap))=
     140     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
    139141     :              -zx_defau_diag(i,k,iq_vap)
    140142     :              *deltap(i,k)/deltap(i,k-1)
    141      :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     143     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
     144     :              /q_follow(i,k-1,iq_vap)
    142145
    143146              enddo !do ixt=1,niso
     
    151154       enddo !do k=2,llm
    152155
    153         if (ok_iso_verif) then     
    154            call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
    155         endif !if (ok_iso_verif) then
     156       call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
    156157       
    157158     
     
    163164
    164165              ! on ajoute eau liquide en k en k             
    165               do ixt=1,ntraciso
    166                q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))
     166              do ixt=1,ntiso
     167               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
    167168     :              +zx_defau_diag(i,k,iq_liq)
    168      :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
     169     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
    169170              ! et on la retranche à la vapeur en k
    170                q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
     171               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    171172     :              -zx_defau_diag(i,k,iq_liq)
    172      :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     173     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
    173174              enddo !do ixt=1,niso
    174175              q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
     
    180181       enddo !do k=2,llm 
    181182
    182         if (ok_iso_verif) then
    183            call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
    184         endif !if (ok_iso_verif) then
     183       call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
    185184
    186       endif !if (ok_isotopes) then
     185      endif !if (niso > 0) then
    187186      !write(*,*) 'qminimum 188'
    188187     
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/vlsplt.F

    r4013 r4368  
    44
    55      SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq)
    6       USE infotrac, ONLY: nqtot,nqdesc,iqfils
     6      USE infotrac, ONLY: nqtot,tracers
    77c
    88c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    3838c   ---------
    3939c
    40       INTEGER i,ij,l,j,ii
    41       INTEGER ijlqmin,iqmin,jqmin,lqmin
    42 c
    43       REAL zm(ip1jmp1,llm,nqtot),newmasse
     40      INTEGER ij,l
     41c
     42      REAL zm(ip1jmp1,llm,nqtot)
    4443      REAL mu(ip1jmp1,llm)
    4544      REAL mv(ip1jm,llm)
    4645      REAL mw(ip1jmp1,llm+1)
    47       REAL zq(ip1jmp1,llm,nqtot),zz
    48       REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm)
    49       REAL second,temps0,temps1,temps2,temps3
    50       REAL ztemps1,ztemps2,ztemps3
     46      REAL zq(ip1jmp1,llm,nqtot)
    5147      REAL zzpbar, zzw
    52       LOGICAL testcpu
    53       SAVE testcpu
    54       SAVE temps1,temps2,temps3
    55       INTEGER iminn,imaxx
    5648      INTEGER ifils,iq2 ! CRisi
    5749
    5850      REAL qmin,qmax
    5951      DATA qmin,qmax/0.,1.e33/
    60       DATA testcpu/.false./
    61       DATA temps1,temps2,temps3/0.,0.,0./
    62 
    6352
    6453        zzpbar = 0.5 * pdt
     
    8372      CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1)
    8473       
    85       if (nqdesc(iq).gt.0) then 
    86         do ifils=1,nqdesc(iq)
    87           iq2=iqfils(ifils,iq)
    88           CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
    89         enddo 
    90       endif !if (nqfils(iq).gt.0) then
     74      do ifils=1,tracers(iq)%nqDescen
     75        iq2=tracers(iq)%iqDescen(ifils)
     76        CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
     77      enddo 
    9178
    9279cprint*,'Entree vlx1'
     
    122109      ENDDO
    123110      ! CRisi: aussi pour les fils
    124       if (nqdesc(iq).gt.0) then
    125       do ifils=1,nqdesc(iq)
    126         iq2=iqfils(ifils,iq)
     111      do ifils=1,tracers(iq)%nqDescen
     112        iq2=tracers(iq)%iqDescen(ifils)
    127113        DO l=1,llm
    128          DO ij=1,ip1jmp1
    129            q(ij,l,iq2)=zq(ij,l,iq2)
    130          ENDDO
    131          DO ij=1,ip1jm+1,iip1
     114          DO ij=1,ip1jmp1
     115            q(ij,l,iq2)=zq(ij,l,iq2)
     116          ENDDO
     117          DO ij=1,ip1jm+1,iip1
    132118            q(ij+iim,l,iq2)=q(ij,l,iq2)
    133          ENDDO
     119          ENDDO
    134120        ENDDO
    135       enddo !do ifils=1,nqdesc(iq)   
    136       endif ! if (nqdesc(iq).gt.0) then   
     121      enddo
    137122
    138123      RETURN
    139124      END
    140125      RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq)
    141       USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi
    142      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
     126      USE infotrac, ONLY : nqtot,tracers, ! CRisi
     127     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
    143128
    144129c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    161146c   ----------
    162147      REAL masse(ip1jmp1,llm,nqtot),pente_max
    163       REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm)
     148      REAL u_m( ip1jmp1,llm )
    164149      REAL q(ip1jmp1,llm,nqtot)
    165       REAL w(ip1jmp1,llm)
    166150      INTEGER iq ! CRisi
    167151c
     
    173157c
    174158      REAL new_m,zu_m,zdum(ip1jmp1,llm)
    175       REAL sigu(ip1jmp1),dxq(ip1jmp1,llm),dxqu(ip1jmp1)
     159c      REAL sigu(ip1jmp1)
     160      REAL dxq(ip1jmp1,llm),dxqu(ip1jmp1)
    176161      REAL zz(ip1jmp1)
    177162      REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
     
    182167      INTEGER ifils,iq2 ! CRisi
    183168
    184       Logical extremum,first,testcpu
    185       SAVE first,testcpu
    186 
    187       REAL      SSUM
    188       REAL temps0,temps1,temps2,temps3,temps4,temps5,second
    189       SAVE temps0,temps1,temps2,temps3,temps4,temps5
    190 
    191       REAL z1,z2,z3
    192 
    193       DATA first,testcpu/.true.,.false./
    194 
    195       IF(first) THEN
    196          temps1=0.
    197          temps2=0.
    198          temps3=0.
    199          temps4=0.
    200          temps5=0.
    201          first=.false.
    202       ENDIF
     169      Logical first
     170      SAVE first
     171      DATA first/.true./
    203172
    204173c   calcul de la pente a droite et a gauche de la maille
     
    436405         ENDDO
    437406      ENDIF  ! n0.gt.0
    438 9999    continue
     407c9999    continue
    439408
    440409
     
    449418! CRisi: appel récursif de l'advection sur les fils.
    450419! Il faut faire ça avant d'avoir mis à jour q et masse
    451       !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq)
     420      !write(*,*) 'vlsplt 326: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen
    452421     
    453       if (nqdesc(iq).gt.0) then 
    454        do ifils=1,nqdesc(iq)
    455          iq2=iqfils(ifils,iq)
    456          DO l=1,llm
     422      do ifils=1,tracers(iq)%nqDescen
     423        iq2=tracers(iq)%iqDescen(ifils)
     424        DO l=1,llm
    457425          DO ij=iip2,ip1jm
    458            ! On a besoin de q et masse seulement entre iip2 et ip1jm
    459            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
    460            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
    461            !Mvals: veiller a ce qu'on n'ait pas de denominateur nul
    462            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
    463            if (q(ij,l,iq).gt.qperemin) then
    464              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
    465            else
    466              Ratio(ij,l,iq2)=ratiomin
    467            endif
     426            ! On a besoin de q et masse seulement entre iip2 et ip1jm
     427            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     428            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     429            !Mvals: veiller a ce qu'on n'ait pas de denominateur nul
     430            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
     431            if (q(ij,l,iq).gt.min_qParent) then
     432              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     433            else
     434              Ratio(ij,l,iq2)=min_ratio
     435            endif
    468436          enddo   
    469          enddo
    470         enddo !do ifils=1,nqdesc(iq)
    471         do ifils=1,nqfils(iq)
    472          iq2=iqfils(ifils,iq)
    473          call vlx(Ratio,pente_max,masseq,u_mq,iq2)
    474         enddo !do ifils=1,nqfils(iq)
    475       endif !if (nqfils(iq).gt.0) then
     437        enddo
     438      enddo
     439      do ifils=1,tracers(iq)%nqChildren
     440        iq2=tracers(iq)%iqDescen(ifils)
     441        call vlx(Ratio,pente_max,masseq,u_mq,iq2)
     442      enddo
    476443! end CRisi
    477444
     
    482449         DO ij=iip2+1,ip1jm
    483450            !MVals: veiller a ce qu'on ait pas de denominateur nul
    484             new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),masseqmin)
     451            new_m=max(masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l),min_qMass)
    485452            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
    486453     &      u_mq(ij-1,l)-u_mq(ij,l))
     
    498465      ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio
    499466      ! puis on boucle en longitude
    500       if (nqfils(iq).gt.0) then 
    501        do ifils=1,nqdesc(iq)
    502          iq2=iqfils(ifils,iq) 
    503          DO l=1,llm
     467      do ifils=1,tracers(iq)%nqDescen
     468        iq2=tracers(iq)%iqDescen(ifils)
     469        DO l=1,llm
    504470          DO ij=iip2+1,ip1jm
    505471            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     
    508474             q(ij-iim,l,iq2)=q(ij,l,iq2)
    509475          enddo ! DO ij=ijb+iip1-1,ije,iip1
    510          enddo !DO l=1,llm
    511         enddo !do ifils=1,nqdesc(iq)
    512       endif !if (nqfils(iq).gt.0) then
     476        enddo !DO l=1,llm
     477      enddo
    513478
    514479c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
     
    519484      END
    520485      RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq)
    521       USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi
    522      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
     486      USE infotrac, ONLY : nqtot,tracers, ! CRisi
     487     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
    523488c
    524489c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    544509      REAL masse(ip1jmp1,llm,nqtot),pente_max
    545510      REAL masse_adv_v( ip1jm,llm)
    546       REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm)
     511      REAL q(ip1jmp1,llm,nqtot)
    547512      INTEGER iq ! CRisi
    548513c
     
    553518c
    554519      REAL airej2,airejjm,airescb(iim),airesch(iim)
    555       REAL dyq(ip1jmp1,llm),dyqv(ip1jm),zdvm(ip1jmp1,llm)
     520      REAL dyq(ip1jmp1,llm),dyqv(ip1jm)
    556521      REAL adyqv(ip1jm),dyqmax(ip1jmp1)
    557522      REAL qbyv(ip1jm,llm)
    558523
    559       REAL qpns,qpsn,appn,apps,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
     524      REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
     525c     REAL appn apps
    560526c     REAL newq,oldmasse
    561       Logical extremum,first,testcpu
    562       REAL temps0,temps1,temps2,temps3,temps4,temps5,second
    563       SAVE temps0,temps1,temps2,temps3,temps4,temps5
    564       SAVE first,testcpu
     527      LOGICAL first
     528      SAVE first
    565529
    566530      REAL convpn,convps,convmpn,convmps
     
    578542      REAL      SSUM
    579543
    580       DATA first,testcpu/.true.,.false./
    581       DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
     544      DATA first/.true./
    582545
    583546      !write(*,*) 'vly 578: entree, iq=',iq
     
    778741! CRisi: appel récursif de l'advection sur les fils.
    779742! Il faut faire ça avant d'avoir mis à jour q et masse
    780       !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq)
     743      !write(*,*) 'vly 689: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen
    781744   
    782       if (nqfils(iq).gt.0) then 
    783        do ifils=1,nqdesc(iq)
    784          iq2=iqfils(ifils,iq)
    785          DO l=1,llm
    786          DO ij=1,ip1jmp1
    787            ! attention, chaque fils doit avoir son masseq, sinon, le 1er
    788            ! fils ecrase le masseq de ses freres.
    789            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
    790            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
    791            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
    792            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
    793            if (q(ij,l,iq).gt.qperemin) then
    794              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
    795            else
    796              Ratio(ij,l,iq2)=ratiomin
    797            endif
     745      do ifils=1,tracers(iq)%nqDescen
     746        iq2=tracers(iq)%iqDescen(ifils)
     747        DO l=1,llm
     748          DO ij=1,ip1jmp1
     749            ! attention, chaque fils doit avoir son masseq, sinon, le 1er
     750            ! fils ecrase le masseq de ses freres.
     751            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     752            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     753            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
     754            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
     755            if (q(ij,l,iq).gt.min_qParent) then
     756              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     757            else
     758              Ratio(ij,l,iq2)=min_ratio
     759            endif
    798760          enddo   
    799          enddo
    800         enddo !do ifils=1,nqdesc(iq)
    801 
    802         do ifils=1,nqfils(iq)
    803          iq2=iqfils(ifils,iq)
    804          call vly(Ratio,pente_max,masseq,qbyv,iq2)
    805         enddo !do ifils=1,nqfils(iq)
    806       endif !if (nqfils(iq).gt.0) then
     761        enddo
     762      enddo
     763
     764      do ifils=1,tracers(iq)%nqDescen
     765        iq2=tracers(iq)%iqDescen(ifils)
     766        call vly(Ratio,pente_max,masseq,qbyv,iq2)
     767      enddo
    807768
    808769      DO l=1,llm
     
    872833 
    873834! retablir les fils en rapport de melange par rapport a l'air:
    874       if (nqfils(iq).gt.0) then 
    875        do ifils=1,nqdesc(iq)
    876          iq2=iqfils(ifils,iq) 
    877          DO l=1,llm
     835      do ifils=1,tracers(iq)%nqDescen
     836        iq2=tracers(iq)%iqDescen(ifils)
     837        DO l=1,llm
    878838          DO ij=1,ip1jmp1
    879839            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
    880840          enddo
    881          enddo
    882         enddo !do ifils=1,nqdesc(iq)
    883       endif !if (nqfils(iq).gt.0) then
     841        enddo
     842      enddo
    884843
    885844      !write(*,*) 'vly 853: sortie'
     
    888847      END
    889848      RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq)
    890       USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi
    891      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
     849      USE infotrac, ONLY : nqtot,tracers, ! CRisi
     850     &                     min_qParent,min_qMass,min_ratio ! MVals et CRisi
    892851c
    893852c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    917876c   ---------
    918877c
    919       INTEGER i,ij,l,j,ii
     878      INTEGER ij,l
    920879c
    921880      REAL wq(ip1jmp1,llm+1),newmasse
     
    930889      SAVE testcpu
    931890
    932       REAL temps0,temps1,temps2,temps3,temps4,temps5,second
    933       SAVE temps0,temps1,temps2,temps3,temps4,temps5
    934       REAL      SSUM
     891#ifdef BIDON
     892      REAL temps0,temps1,second
     893      SAVE temps0,temps1
    935894
    936895      DATA testcpu/.false./
    937       DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
     896      DATA temps0,temps1/0.,0./
     897#endif
    938898
    939899c    On oriente tout dans le sens de la pression c'est a dire dans le
     
    1009969! CRisi: appel récursif de l'advection sur les fils.
    1010970! Il faut faire ça avant d'avoir mis à jour q et masse
    1011       !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq)
    1012       if (nqfils(iq).gt.0) then 
    1013        do ifils=1,nqdesc(iq)
    1014          iq2=iqfils(ifils,iq)
    1015          DO l=1,llm
     971      !write(*,*) 'vlsplt 942: iq,nqChildren(iq)=',iq,nqChildren(iq)
     972      do ifils=1,tracers(iq)%nqDescen
     973        iq2=tracers(iq)%iqDescen(ifils)
     974        DO l=1,llm
    1016975          DO ij=1,ip1jmp1
    1017            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
    1018            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)       
    1019            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
    1020            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
    1021            if (q(ij,l,iq).gt.qperemin) then
    1022              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
    1023            else
    1024              Ratio(ij,l,iq2)=ratiomin
    1025            endif     
     976            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     977            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)       
     978            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
     979            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),min_qMass)
     980            if (q(ij,l,iq).gt.min_qParent) then
     981              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     982            else
     983              Ratio(ij,l,iq2)=min_ratio
     984            endif     
    1026985          enddo   
    1027          enddo
    1028         enddo !do ifils=1,nqdesc(iq)
     986        enddo
     987      enddo
    1029988       
    1030         do ifils=1,nqfils(iq)
    1031          iq2=iqfils(ifils,iq)         
    1032          call vlz(Ratio,pente_max,masseq,wq,iq2)
    1033         enddo !do ifils=1,nqfils(iq)
    1034       endif !if (nqfils(iq).gt.0) then
     989      do ifils=1,tracers(iq)%nqChildren
     990        iq2=tracers(iq)%iqDescen(ifils)
     991        call vlz(Ratio,pente_max,masseq,wq,iq2)
     992      enddo
    1035993! end CRisi 
    1036994
     
    10451003
    10461004! retablir les fils en rapport de melange par rapport a l'air:
    1047       if (nqfils(iq).gt.0) then 
    1048        do ifils=1,nqdesc(iq)
    1049          iq2=iqfils(ifils,iq) 
    1050          DO l=1,llm
     1005      do ifils=1,tracers(iq)%nqDescen
     1006        iq2=tracers(iq)%iqDescen(ifils)
     1007        DO l=1,llm
    10511008          DO ij=1,ip1jmp1
    10521009            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
    10531010          enddo
    1054          enddo
    1055         enddo !do ifils=1,nqdesc(iq)
    1056       endif !if (nqfils(iq).gt.0) then
     1011        enddo
     1012      enddo
    10571013      !write(*,*) 'vlsplt 1032'
    10581014
     
    10991055      real zzq(iip1,jjp1,llm)
    11001056
     1057#ifdef isminmax
    11011058      integer imin,jmin,lmin,ijlmin
    11021059      integer imax,jmax,lmax,ijlmax
     
    11041061      integer ismin,ismax
    11051062
    1106 #ifdef isminismax
    11071063      call scopy (ip1jmp1*llm,zq,1,zzq,1)
    11081064
     
    11321088#endif
    11331089      return
    1134 9999  format(a20,'  q(',i3,',',i2,',',i2,')=',e12.5,e12.5)
     1090c9999  format(a20,'  q(',i3,',',i2,',',i2,')=',e12.5,e12.5)
    11351091      end
    11361092
  • LMDZ6/branches/Ocean_skin/libf/dyn3d/vlspltqs.F

    r2603 r4368  
    44       SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
    55     ,                                  p,pk,teta,iq             )
    6        USE infotrac, ONLY: nqtot,nqdesc,iqfils
     6       USE infotrac, ONLY: nqtot,tracers
    77c
    88c     Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron
     
    121121      CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
    122122      CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1)
    123       if (nqdesc(iq).gt.0) then 
    124        do ifils=1,nqdesc(iq)
    125         iq2=iqfils(ifils,iq)
     123      do ifils=1,tracers(iq)%nqDescen
     124        iq2=tracers(iq)%iqDescen(ifils)
    126125        CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
    127        enddo 
    128       endif !if (nqfils(iq).gt.0) then
     126      enddo 
    129127
    130128c      call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
     
    162160      ENDDO
    163161      ! CRisi: aussi pour les fils
    164       if (nqdesc(iq).gt.0) then
    165       do ifils=1,nqdesc(iq)
    166         iq2=iqfils(ifils,iq)
     162      do ifils=1,tracers(iq)%nqDescen
     163        iq2=tracers(iq)%iqDescen(ifils)
    167164        DO l=1,llm
    168          DO ij=1,ip1jmp1
    169            q(ij,l,iq2)=zq(ij,l,iq2)
    170          ENDDO
    171          DO ij=1,ip1jm+1,iip1
     165          DO ij=1,ip1jmp1
     166            q(ij,l,iq2)=zq(ij,l,iq2)
     167          ENDDO
     168          DO ij=1,ip1jm+1,iip1
    172169            q(ij+iim,l,iq2)=q(ij,l,iq2)
    173          ENDDO
     170          ENDDO
    174171        ENDDO
    175       enddo !do ifils=1,nqdesc(iq) 
    176       endif ! if (nqfils(iq).gt.0) then
     172      enddo
    177173      !write(*,*) 'vlspltqs 183: fin de la routine'
    178174
     
    180176      END
    181177      SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq)
    182       USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
     178      USE infotrac, ONLY : nqtot,tracers ! CRisi
    183179
    184180c
     
    483479! CRisi: appel récursif de l'advection sur les fils.
    484480! Il faut faire ça avant d'avoir mis à jour q et masse
    485       !write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq)
     481      !write(*,*) 'vlspltqs 326: iq,nqChildren(iq)=',iq,
     482!     &                 tracers(iq)%nqChildren
    486483     
    487       if (nqfils(iq).gt.0) then 
    488        do ifils=1,nqdesc(iq)
    489          iq2=iqfils(ifils,iq)
    490          DO l=1,llm
     484      do ifils=1,tracers(iq)%nqDescen
     485        iq2=tracers(iq)%iqDescen(ifils)
     486        DO l=1,llm
    491487          DO ij=iip2,ip1jm
    492            ! On a besoin de q et masse seulement entre iip2 et ip1jm
    493            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
    494            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     488          ! On a besoin de q et masse seulement entre iip2 et ip1jm
     489            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     490            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
    495491          enddo   
    496          enddo
    497         enddo !do ifils=1,nqdesc(iq)
    498         do ifils=1,nqfils(iq)
    499          iq2=iqfils(ifils,iq)
    500          call vlx(Ratio,pente_max,masseq,u_mq,iq2)
    501         enddo !do ifils=1,nqfils(iq)
    502       endif !if (nqfils(iq).gt.0) then
     492        enddo
     493      enddo
     494      do ifils=1,tracers(iq)%nqChildren
     495        iq2=tracers(iq)%iqDescen(ifils)
     496        call vlx(Ratio,pente_max,masseq,u_mq,iq2)
     497      enddo
    503498! end CRisi
    504499
     
    523518      ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio
    524519      ! puis on boucle en longitude
    525       if (nqdesc(iq).gt.0) then 
    526        do ifils=1,nqdesc(iq)
    527          iq2=iqfils(ifils,iq) 
    528          DO l=1,llm
     520      do ifils=1,tracers(iq)%nqDescen
     521        iq2=tracers(iq)%iqDescen(ifils)
     522        DO l=1,llm
    529523          DO ij=iip2+1,ip1jm
    530524            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
    531525          enddo
    532526          DO ij=iip1+iip1,ip1jm,iip1
    533              q(ij-iim,l,iq2)=q(ij,l,iq2)
    534           enddo ! DO ij=ijb+iip1-1,ije,iip1
    535          enddo !DO l=1,llm
    536         enddo !do ifils=1,nqdesc(iq)
    537       endif !if (nqfils(iq).gt.0) then
     527            q(ij-iim,l,iq2)=q(ij,l,iq2)
     528          enddo
     529        enddo
     530      enddo
    538531
    539532c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
     
    544537      END
    545538      SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq)
    546       USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
     539      USE infotrac, ONLY : nqtot,tracers ! CRisi
    547540c
    548541c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    794787! CRisi: appel récursif de l'advection sur les fils.
    795788! Il faut faire ça avant d'avoir mis à jour q et masse
    796       !write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq)
     789      !write(*,*) 'vlyqs 689: iq,nqChildren(iq)=',iq,
     790!     &              tracers(iq)%nqChildren
    797791   
    798       if (nqfils(iq).gt.0) then 
    799        do ifils=1,nqdesc(iq)
    800          iq2=iqfils(ifils,iq)
    801          DO l=1,llm
    802          DO ij=1,ip1jmp1
    803            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
    804            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     792      do ifils=1,tracers(iq)%nqDescen
     793        iq2=tracers(iq)%iqDescen(ifils)
     794        DO l=1,llm
     795          DO ij=1,ip1jmp1
     796            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     797            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
    805798          enddo   
    806          enddo
    807         enddo !do ifils=1,nqdesc(iq)
    808 
    809         do ifils=1,nqfils(iq)
    810          iq2=iqfils(ifils,iq)
    811          !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2
    812          call vly(Ratio,pente_max,masseq,qbyv,iq2)
    813         enddo !do ifils=1,nqfils(iq)
    814       endif !if (nqfils(iq).gt.0) then
     799        enddo
     800      enddo
     801      do ifils=1,tracers(iq)%nqChildren
     802        iq2=tracers(iq)%iqDescen(ifils)
     803        !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2
     804        call vly(Ratio,pente_max,masseq,qbyv,iq2)
     805      enddo
    815806
    816807      DO l=1,llm
     
    868859
    869860! retablir les fils en rapport de melange par rapport a l'air:
    870       if (nqdesc(iq).gt.0) then 
    871        do ifils=1,nqdesc(iq)
    872          iq2=iqfils(ifils,iq) 
    873          DO l=1,llm
     861      do ifils=1,tracers(iq)%nqDescen
     862        iq2=tracers(iq)%iqDescen(ifils)
     863        DO l=1,llm
    874864          DO ij=1,ip1jmp1
    875865            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
    876866          enddo
    877          enddo
    878         enddo !do ifils=1,nqdesc(iq)
    879       endif !if (nqfils(iq).gt.0) then
     867        enddo
     868      enddo
    880869      !write(*,*) 'vly 879'
    881870
Note: See TracChangeset for help on using the changeset viewer.