Changeset 2270


Ignore:
Timestamp:
May 7, 2015, 5:45:04 PM (10 years ago)
Author:
crisi
Message:

Adding isotopes in the dynamics and more generally tracers of tracers.
CRisi

Location:
LMDZ5/trunk
Files:
3 added
25 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/arch/arch-X64_ADA.fcm

    r2115 r2270  
    55%FPP_FLAGS           -P -traditional -I/smplocal/pub/FFTW/3.3.3_dyn/include/
    66%FPP_DEF             NC_DOUBLE FFT_FFTW
    7 %BASE_FFLAGS         -auto -mcmodel=large -integer-size 32 -real-size 64 -align all
     7%BASE_FFLAGS         -auto -recursive -mcmodel=large -integer-size 32 -real-size 64 -align all
    88%PROD_FFLAGS         -O2 -ip -fp-model strict -axAVX,SSE4.2
    99%DEV_FFLAGS          -p -g -O1 -fpe0 -traceback
  • LMDZ5/trunk/arch/arch-X64_CURIE.fcm

    r2115 r2270  
    55%FPP_FLAGS           -P -traditional
    66%FPP_DEF             NC_DOUBLE FFT_MKL
    7 #%BASE_FFLAGS        -xHost -i4 -r8 -auto -align all -I$(MKL_INC_DIR) -I$(MKL_INC_DIR)/intel64/lp64
     7#%BASE_FFLAGS        -recursive -xHost -i4 -r8 -auto -align all -I$(MKL_INC_DIR) -I$(MKL_INC_DIR)/intel64/lp64
    88%BASE_FFLAGS         -i4 -r8 -auto -align all -I$(MKL_INC_DIR) -I$(MKL_INC_DIR)/intel64/lp64 -fp-model strict
    99%PROD_FFLAGS         -O2
  • LMDZ5/trunk/arch/arch-gfortran.fcm

    r1907 r2270  
    55%FPP_FLAGS           -P -traditional
    66%FPP_DEF             NC_DOUBLE
    7 %BASE_FFLAGS         -c -fdefault-real-8
     7%BASE_FFLAGS         -c -fdefault-real-8 -frecursive
    88%PROD_FFLAGS         -O3
    99%DEV_FFLAGS          -O
  • LMDZ5/trunk/arch/arch-gfortran_CICLAD.fcm

    r2132 r2270  
    55%FPP_FLAGS           -P -traditional
    66%FPP_DEF             NC_DOUBLE
    7 %BASE_FFLAGS         -c -fdefault-real-8 -fcray-pointer
     7%BASE_FFLAGS         -c -fdefault-real-8 -fcray-pointer -frecursive
    88%PROD_FFLAGS         -O3
    99%DEV_FFLAGS          -O -Wall -fbounds-check
  • LMDZ5/trunk/libf/dyn3d/advtrac.F90

    r2239 r2270  
    99  !            M.A Filiberti (04/2002)
    1010  !
    11   USE infotrac, ONLY: nqtot, iadv
     11  USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif
    1212  USE control_mod, ONLY: iapp_tracvl, day_step
    1313
     
    223223     !     Appel des sous programmes d'advection
    224224     !-----------------------------------------------------------
    225      do iq=1,nqtot
     225
     226     if (ok_iso_verif) then
     227           call check_isotopes_seq(q,1,ip1jmp1,'advtrac 162')
     228     endif !if (ok_iso_verif) then
     229
     230     do iq=1,nqperes
    226231        !        call clock(t_initial)
    227232        if(iadv(iq) == 0) cycle
     
    230235        !   ----------------------------------------------------------------
    231236        if(iadv(iq).eq.10) THEN
    232            call vlsplt(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
    233 
     237           ! CRisi: on fait passer tout q pour avoir acces aux fils
     238           
     239           write(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:)     
     240           call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq)
     241           
    234242           !   ----------------------------------------------------------------
    235243           !   Schema "pseudo amont" + test sur humidite specifique
     
    238246        else if(iadv(iq).eq.14) then
    239247           !
    240            CALL vlspltqs( q(1,1,1), 2., massem, wg , &
    241                 pbarug,pbarvg,dtvr,p,pk,teta )
     248           write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
     249           CALL vlspltqs( q, 2., massem, wg , &
     250                pbarug,pbarvg,dtvr,p,pk,teta,iq)
     251           
    242252           !   ----------------------------------------------------------------
    243253           !   Schema de Frederic Hourdin
     
    388398     end DO
    389399
     400     if (ok_iso_verif) then
     401           call check_isotopes_seq(q,ip1jmp1,'advtrac 397')
     402     endif !if (ok_iso_verif) then
    390403
    391404     !------------------------------------------------------------------
  • LMDZ5/trunk/libf/dyn3d/caladvtrac.F

    r1907 r2270  
    5353      if (planet_type.eq."earth") then
    5454C initialisation
    55         dq(:,:,1:2)=q(:,:,1:2)
     55! CRisi: il faut gérer tous les traceurs si on veut pouvoir faire des
     56! isotopes
     57!        dq(:,:,1:2)=q(:,:,1:2)
     58        dq(:,:,1:nqtot)=q(:,:,1:nqtot)
    5659       
    5760c  test des valeurs minmax
     
    8184           ENDDO
    8285          ENDDO
    83          
    84           CALL qminimum( q, 2, finmasse )
     86
     87          CALL qminimum( q, nqtot, finmasse )
    8588
    8689          CALL SCOPY   ( ip1jmp1*llm, masse, 1, finmasse,       1 )
     
    9295          dtvrtrac = iapp_tracvl * dtvr
    9396c
    94            DO iq = 1 , 2
     97           DO iq = 1 , nqtot
    9598            DO l = 1 , llm
    9699             DO ij = 1,ip1jmp1
     
    105108        if (planet_type.eq."earth") then
    106109! Earth-specific treatment for the first 2 tracers (water)
    107           dq(:,:,1:2)=0.
     110          dq(:,:,1:nqtot)=0.
    108111        endif ! of if (planet_type.eq."earth")
    109112      ENDIF ! of IF( iapptrac.EQ.iapp_tracvl )
  • LMDZ5/trunk/libf/dyn3d/dynetat0.F

    r1930 r2270  
    297297           write(lunout,*)"          Il est donc initialise a zero"
    298298           q(:,:,:,iq)=0.
     299
     300           ! CRisi: pour les isotopes, on peut faire init théorique
     301           ! distill de Rayleigh très simplifiée
     302           if (ok_isotopes) then
     303              if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.0)) then
     304                q(:,:,:,iq)=q(:,:,:,iqpere(iq))                         
     305     &                   *tnat(iso_num(iq))                             
     306     &                   *(q(:,:,:,iqpere(iq))/30.e-3)                 
     307     &                   **(alpha_ideal(iso_num(iq))-1)
     308              endif
     309              if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.1)) then
     310                  q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq),
     311     &                   phase_num(iq)))
     312              endif 
     313           endif !if (ok_isotopes) then
    299314        ELSE
    300315           ierr = NF90_GET_VAR(nid, nvarid, q(:,:,:,iq))
  • LMDZ5/trunk/libf/dyn3d/iniacademic.F90

    r2087 r2270  
    55
    66  USE filtreg_mod, ONLY: inifilr
    7   USE infotrac, ONLY : nqtot
     7  USE infotrac
    88  USE control_mod, ONLY: day_step,planet_type
    99#ifdef CPP_IOIPSL
     
    262262              if (i == 2) q(:,:,i)=1.e-15
    263263              if (i.gt.2) q(:,:,i)=0.
     264
     265              ! CRisi: init des isotopes
     266              ! distill de Rayleigh très simplifiée
     267              if (ok_isotopes) then
     268                if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then         
     269                   q(:,:,i)=q(:,:,iqpere(i))             &
     270      &                  *tnat(iso_num(i))               &
     271      &                  *(q(:,:,iqpere(i))/30.e-3)      &
     272      &                  **(alpha_ideal(iso_num(i))-1)
     273                endif               
     274                if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then
     275                  q(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i)))
     276                endif
     277              endif !if (ok_isotopes) then
     278
    264279           enddo
    265280        else
    266281           q(:,:,:)=0
    267282        endif ! of if (planet_type=="earth")
     283
     284        if (ok_iso_verif) then
     285           call check_isotopes_seq(q,1,ip1jmp1,'iniacademic_loc')
     286        endif !if (ok_iso_verif) then
    268287
    269288        ! add random perturbation to temperature
  • LMDZ5/trunk/libf/dyn3d/leapfrog.F

    r2239 r2270  
    1111      use IOIPSL
    1212#endif
    13       USE infotrac, ONLY: nqtot
     13      USE infotrac, ONLY: nqtot,ok_iso_verif
    1414      USE guide_mod, ONLY : guide_main
    1515      USE write_field, ONLY: writefield
     
    235235      jH_cur = jH_cur - int(jH_cur)
    236236
     237        if (ok_iso_verif) then
     238           call check_isotopes_seq(q,ip1jmp1,'leapfrog 321')
     239        endif !if (ok_iso_verif) then
    237240
    238241#ifdef CPP_IOIPSL
     
    265268!      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
    266269!      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
     270
     271        if (ok_iso_verif) then
     272           call check_isotopes_seq(q,ip1jmp1,'leapfrog 400')
     273        endif !if (ok_iso_verif) then
    267274
    268275   2  CONTINUE ! Matsuno backward or leapfrog step begins here
     
    305312      endif
    306313
     314
     315        if (ok_iso_verif) then
     316           call check_isotopes_seq(q,ip1jmp1,'leapfrog 589')
     317        endif !if (ok_iso_verif) then
     318
    307319c-----------------------------------------------------------------------
    308320c   calcul des tendances dynamiques:
     
    321333c   calcul des tendances advection des traceurs (dont l'humidite)
    322334c   -------------------------------------------------------------
     335
     336        if (ok_iso_verif) then
     337           call check_isotopes_seq(q,ip1jmp1,
     338     &           'leapfrog 686: avant caladvtrac')
     339        endif !if (ok_iso_verif) then
    323340
    324341      IF( forward. OR . leapf )  THEN
     
    327344     *        p, masse, dq,  teta,
    328345     .        flxw, pk)
     346
    329347         
    330348         IF (offline) THEN
     
    346364c   ----------------------------------
    347365
    348 
    349        CALL integrd ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 ,
     366        if (ok_iso_verif) then
     367           write(*,*) 'leapfrog 720'
     368           call check_isotopes_seq(q,ip1jmp1,'leapfrog 756')
     369        endif !if (ok_iso_verif) then
     370       
     371       CALL integrd ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 ,
    350372     $         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis )
    351373!     $              finvmaold                                    )
    352374
     375       if (ok_iso_verif) then
     376          write(*,*) 'leapfrog 724'
     377           call check_isotopes_seq(q,ip1jmp1,'leapfrog 762')
     378        endif !if (ok_iso_verif) then
    353379
    354380c .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
     
    516542        CALL massdair(p,masse)
    517543
     544        if (ok_iso_verif) then
     545           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1196')
     546        endif !if (ok_iso_verif) then
    518547
    519548c-----------------------------------------------------------------------
     
    600629c   preparation du pas d'integration suivant  ......
    601630
     631        if (ok_iso_verif) then
     632           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1509')
     633        endif !if (ok_iso_verif) then
     634
    602635      IF ( .NOT.purmats ) THEN
    603636c       ........................................................
     
    657690            ENDIF ! of IF((MOD(itau,iperiod).EQ.0).OR.(itau.EQ.itaufin))
    658691
     692        if (ok_iso_verif) then
     693           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1584')
     694        endif !if (ok_iso_verif) then
     695
    659696c-----------------------------------------------------------------------
    660697c   ecriture de la bande histoire:
     
    735772      ELSE ! of IF (.not.purmats)
    736773
     774        if (ok_iso_verif) then
     775           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1664')
     776        endif !if (ok_iso_verif) then
     777
    737778c       ........................................................
    738779c       ..............       schema  matsuno        ...............
     
    757798
    758799            ELSE ! of IF(forward) i.e. backward step
     800 
     801        if (ok_iso_verif) then
     802           call check_isotopes_seq(q,ip1jmp1,'leapfrog 1698')
     803        endif !if (ok_iso_verif) then 
    759804
    760805              IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
  • LMDZ5/trunk/libf/dyn3d/qminimum.F

    r1907 r2270  
    22! $Header$
    33!
    4       SUBROUTINE qminimum( q,nq,deltap )
     4      SUBROUTINE qminimum( q,nqtot,deltap )
    55
     6      USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif
    67      IMPLICIT none
    78c
     
    1314#include "comvert.h"
    1415c
    15       INTEGER nq
    16       REAL q(ip1jmp1,llm,nq), deltap(ip1jmp1,llm)
     16      INTEGER nqtot
     17      REAL q(ip1jmp1,llm,nqtot), deltap(ip1jmp1,llm)
    1718c
    1819      INTEGER iq_vap, iq_liq
     
    3031      INTEGER i, k, iq
    3132      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
     33
     34      real zx_defau_diag(ip1jmp1,llm,2)
     35      real q_follow(ip1jmp1,llm,2)
    3236c
    3337      REAL SSUM
     
    3640      SAVE imprim
    3741      DATA imprim /0/
     42      !INTEGER ijb,ije
     43      !INTEGER Index_pump(ij_end-ij_begin+1)
     44      !INTEGER nb_pump
     45      INTEGER ixt
    3846c
    3947c Quand l'eau liquide est trop petite (ou negative), on prend
     
    4149c (sans changer la temperature !)
    4250c
     51
     52        if (ok_iso_verif) then
     53           call check_isotopes_seq(q,ip1jmp1,'qminimum 52')   
     54        endif !if (ok_iso_verif) then     
     55
     56      zx_defau_diag(:,:,:)=0.0
     57      q_follow(:,:,:)=q(:,:,:) 
    4358      DO 1000 k = 1, llm
    4459        DO 1040 i = 1, ip1jmp1
    4560          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
     61
     62              if (ok_isotopes) then
     63                 zx_defau_diag(i,k,iq_liq)=AMAX1
     64     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
     65              endif !if (ok_isotopes) then
     66
    4667             q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
    4768             q(i,k,iq_liq) = seuil_liq
     
    5980        DO i = 1, ip1jmp1
    6081          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
     82
     83            if (ok_isotopes) then
     84              zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
     85            endif !if (ok_isotopes) then
     86
    6187            q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
    6288     &                     deltap(i,k) / deltap(i,k-1)
     
    83109         ENDDO
    84110      ENDIF
     111
     112      write(*,*) 'qminimum 128'
     113      if (ok_isotopes) then
     114      ! CRisi: traiter de même les traceurs d'eau
     115      ! Mais il faut les prendre à l'envers pour essayer de conserver la
     116      ! masse.
     117      ! 1) pompage dans le sol 
     118      ! On suppose que ce pompage se fait sans isotopes -> on ne modifie
     119      ! rien ici et on croise les doigts pour que ça ne soit pas trop
     120      ! génant
     121      DO i = 1,ip1jmp1
     122        if (zx_pump(i).gt.0.0) then
     123          q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
     124        endif !if (zx_pump(i).gt.0.0) then
     125      enddo !DO i = 1,ip1jmp1
     126
     127      ! 2) transfert de vap vers les couches plus hautes
     128      !write(*,*) 'qminimum 139'
     129      do k=2,llm
     130        DO i = 1,ip1jmp1
     131          if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
     132              ! on ajoute la vapeur en k             
     133              do ixt=1,ntraciso
     134               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
     135     :              +zx_defau_diag(i,k,iq_vap)
     136     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     137               
     138              ! et on la retranche en k-1
     139               q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))
     140     :              -zx_defau_diag(i,k,iq_vap)
     141     :              *deltap(i,k)/deltap(i,k-1)
     142     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     143
     144              enddo !do ixt=1,niso
     145              q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
     146     :               +zx_defau_diag(i,k,iq_vap)
     147              q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
     148     :               -zx_defau_diag(i,k,iq_vap)
     149     :              *deltap(i,k)/deltap(i,k-1)
     150          endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     151        enddo !DO i = 1, ip1jmp1       
     152       enddo !do k=2,llm
     153
     154        if (ok_iso_verif) then
     155           call check_isotopes_seq(q,ip1jmp1,'qminimum 168')
     156        endif !if (ok_iso_verif) then
     157       
     158     
     159        ! 3) transfert d'eau de la vapeur au liquide
     160        !write(*,*) 'qminimum 164'
     161        do k=1,llm
     162        DO i = 1,ip1jmp1
     163          if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
     164
     165              ! on ajoute eau liquide en k en k             
     166              do ixt=1,ntraciso
     167               q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))
     168     :              +zx_defau_diag(i,k,iq_liq)
     169     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
     170              ! et on la retranche à la vapeur en k
     171               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
     172     :              -zx_defau_diag(i,k,iq_liq)
     173     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     174              enddo !do ixt=1,niso
     175              q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
     176     :               +zx_defau_diag(i,k,iq_liq)
     177              q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
     178     :               -zx_defau_diag(i,k,iq_liq)
     179          endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     180        enddo !DO i = 1, ip1jmp1
     181       enddo !do k=2,llm 
     182
     183        if (ok_iso_verif) then
     184           call check_isotopes_seq(q,ip1jmp1,'qminimum 197')
     185        endif !if (ok_iso_verif) then
     186
     187      endif !if (ok_isotopes) then
     188      !write(*,*) 'qminimum 188'
     189     
    85190c
    86191      RETURN
  • LMDZ5/trunk/libf/dyn3d/vlsplt.F

    r1907 r2270  
    33c
    44
    5       SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt)
     5      SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq)
     6      USE infotrac, ONLY: nqtot,nqdesc,iqfils
    67c
    78c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    3233c      REAL masse(iip1,jjp1,llm),pente_max
    3334      REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
    34       REAL q(ip1jmp1,llm)
     35      REAL q(ip1jmp1,llm,nqtot)
    3536c      REAL q(iip1,jjp1,llm)
    3637      REAL w(ip1jmp1,llm),pdt
     38      INTEGER iq ! CRisi
    3739c
    3840c      Local
     
    4244      INTEGER ijlqmin,iqmin,jqmin,lqmin
    4345c
    44       REAL zm(ip1jmp1,llm),newmasse
     46      REAL zm(ip1jmp1,llm,nqtot),newmasse
    4547      REAL mu(ip1jmp1,llm)
    4648      REAL mv(ip1jm,llm)
    4749      REAL mw(ip1jmp1,llm+1)
    48       REAL zq(ip1jmp1,llm),zz
     50      REAL zq(ip1jmp1,llm,nqtot),zz
    4951      REAL dqx(ip1jmp1,llm),dqy(ip1jmp1,llm),dqz(ip1jmp1,llm)
    5052      REAL second,temps0,temps1,temps2,temps3
     
    5557      SAVE temps1,temps2,temps3
    5658      INTEGER iminn,imaxx
     59      INTEGER ifils,iq2 ! CRisi
    5760
    5861      REAL qmin,qmax
     
    7982         mw(ij,llm+1)=0.
    8083      ENDDO
    81      
    82       CALL SCOPY(ijp1llm,q,1,zq,1)
    83       CALL SCOPY(ijp1llm,masse,1,zm,1)
     84           
     85      CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
     86      CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1)
     87       
     88      if (nqdesc(iq).gt.0) then 
     89        do ifils=1,nqdesc(iq)
     90          iq2=iqfils(ifils,iq)
     91          CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
     92        enddo 
     93      endif !if (nqfils(iq).gt.0) then
    8494
    8595cprint*,'Entree vlx1'
    8696c       call minmaxq(zq,qmin,qmax,'avant vlx     ')
    87       call vlx(zq,pente_max,zm,mu)
     97      call vlx(zq,pente_max,zm,mu,iq)
    8898cprint*,'Sortie vlx1'
    8999c       call minmaxq(zq,qmin,qmax,'apres vlx1    ')
    90100
    91101c print*,'Entree vly1'
    92       call vly(zq,pente_max,zm,mv)
     102
     103      call vly(zq,pente_max,zm,mv,iq)
    93104c       call minmaxq(zq,qmin,qmax,'apres vly1     ')
    94105cprint*,'Sortie vly1'
    95       call vlz(zq,pente_max,zm,mw)
     106      call vlz(zq,pente_max,zm,mw,iq)
    96107c       call minmaxq(zq,qmin,qmax,'apres vlz     ')
    97108
    98109
    99       call vly(zq,pente_max,zm,mv)
     110      call vly(zq,pente_max,zm,mv,iq)
    100111c       call minmaxq(zq,qmin,qmax,'apres vly     ')
    101112
    102113
    103       call vlx(zq,pente_max,zm,mu)
     114      call vlx(zq,pente_max,zm,mu,iq)
    104115c       call minmaxq(zq,qmin,qmax,'apres vlx2    ')
    105116       
     
    107118      DO l=1,llm
    108119         DO ij=1,ip1jmp1
    109            q(ij,l)=zq(ij,l)
     120           q(ij,l,iq)=zq(ij,l,iq)
    110121         ENDDO
    111122         DO ij=1,ip1jm+1,iip1
    112             q(ij+iim,l)=q(ij,l)
    113          ENDDO
    114       ENDDO
     123            q(ij+iim,l,iq)=q(ij,l,iq)
     124         ENDDO
     125      ENDDO
     126      ! CRisi: aussi pour les fils
     127      if (nqdesc(iq).gt.0) then
     128      do ifils=1,nqdesc(iq)
     129        iq2=iqfils(ifils,iq)
     130        DO l=1,llm
     131         DO ij=1,ip1jmp1
     132           q(ij,l,iq2)=zq(ij,l,iq2)
     133         ENDDO
     134         DO ij=1,ip1jm+1,iip1
     135            q(ij+iim,l,iq2)=q(ij,l,iq2)
     136         ENDDO
     137        ENDDO
     138      enddo !do ifils=1,nqdesc(iq)   
     139      endif ! if (nqdesc(iq).gt.0) then   
    115140
    116141      RETURN
    117142      END
    118       SUBROUTINE vlx(q,pente_max,masse,u_m)
     143      SUBROUTINE vlx(q,pente_max,masse,u_m,iq)
     144      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    119145
    120146c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    139165c   Arguments:
    140166c   ----------
    141       REAL masse(ip1jmp1,llm),pente_max
     167      REAL masse(ip1jmp1,llm,nqtot),pente_max
    142168      REAL u_m( ip1jmp1,llm ),pbarv( iip1,jjm,llm)
    143       REAL q(ip1jmp1,llm)
     169      REAL q(ip1jmp1,llm,nqtot)
    144170      REAL w(ip1jmp1,llm)
     171      INTEGER iq ! CRisi
    145172c
    146173c      Local
     
    155182      REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
    156183      REAL u_mq(ip1jmp1,llm)
     184
     185      ! CRisi
     186      REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot)
     187      INTEGER ifils,iq2 ! CRisi
    157188
    158189      Logical extremum,first,testcpu
     
    188219         DO l = 1, llm
    189220            DO ij=iip2,ip1jm-1
    190                dxqu(ij)=q(ij+1,l)-q(ij,l)
     221               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    191222c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
    192 c              sigu(ij)=u_m(ij,l)/masse(ij,l)
     223c              sigu(ij)=u_m(ij,l)/masse(ij,l,iq)
    193224            ENDDO
    194225            DO ij=iip1+iip1,ip1jm,iip1
     
    243274         DO l = 1, llm
    244275            DO ij=iip2,ip1jm-1
    245                dxqu(ij)=q(ij+1,l)-q(ij,l)
     276               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    246277            ENDDO
    247278            DO ij=iip1+iip1,ip1jm,iip1
     
    285316      DO l=1,llm
    286317       DO ij=iip2,ip1jm-1
    287           zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l),
    288      ,                     1.+u_m(ij,l)/masse(ij+1,l),
     318          zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
     319     ,                     1.+u_m(ij,l)/masse(ij+1,l,iq),
    289320     ,                     u_m(ij,l))
    290321          zdum(ij,l)=0.5*zdum(ij,l)
    291322          u_mq(ij,l)=cvmgp(
    292      ,                q(ij,l)+zdum(ij,l)*dxq(ij,l),
    293      ,                q(ij+1,l)-zdum(ij,l)*dxq(ij+1,l),
     323     ,                q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
     324     ,                q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
    294325     ,                u_m(ij,l))
    295326          u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
     
    303334      DO l=1,llm
    304335       DO ij=iip2,ip1jm-1
    305 c       print*,'masse(',ij,')=',masse(ij,l)
     336c       print*,'masse(',ij,')=',masse(ij,l,iq)
    306337          IF (u_m(ij,l).gt.0.) THEN
    307              zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
    308              u_mq(ij,l)=u_m(ij,l)*(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l))
     338             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
     339             u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l))
    309340          ELSE
    310              zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
    311              u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l))
     341             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
     342             u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq)
     343     &           -0.5*zdum(ij,l)*dxq(ij+1,l))
    312344          ENDIF
    313345       ENDDO
     
    379411                     i=ijq-(j-1)*iip1
    380412c   accumulation pour les mailles completements advectees
    381                      do while(zu_m.gt.masse(ijq,l))
    382                         u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
    383                         zu_m=zu_m-masse(ijq,l)
     413                     do while(zu_m.gt.masse(ijq,l,iq))
     414                        u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)
     415     &                          *masse(ijq,l,iq)
     416                        zu_m=zu_m-masse(ijq,l,iq)
    384417                        i=mod(i-2+iim,iim)+1
    385418                        ijq=(j-1)*iip1+i
     
    387420c   ajout de la maille non completement advectee
    388421                     u_mq(ij,l)=u_mq(ij,l)+zu_m*
    389      &               (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
     422     &                  (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq))
     423     &                  *dxq(ijq,l))
    390424                  ELSE
    391425                     ijq=ij+1
    392426                     i=ijq-(j-1)*iip1
    393427c   accumulation pour les mailles completements advectees
    394                      do while(-zu_m.gt.masse(ijq,l))
    395                         u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
    396                         zu_m=zu_m+masse(ijq,l)
     428                     do while(-zu_m.gt.masse(ijq,l,iq))
     429                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
     430     &                          *masse(ijq,l,iq)
     431                        zu_m=zu_m+masse(ijq,l,iq)
    397432                        i=mod(i,iim)+1
    398433                        ijq=(j-1)*iip1+i
    399434                     ENDDO
    400435c   ajout de la maille non completement advectee
    401                      u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
    402      &               0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
     436                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
     437     &               0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    403438                  ENDIF
    404439               ENDDO
     
    417452      ENDDO
    418453
     454! CRisi: appel récursif de l'advection sur les fils.
     455! Il faut faire ça avant d'avoir mis à jour q et masse
     456      write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq)
     457     
     458      if (nqdesc(iq).gt.0) then 
     459       do ifils=1,nqdesc(iq)
     460         iq2=iqfils(ifils,iq)
     461         DO l=1,llm
     462          DO ij=iip2,ip1jm
     463           ! On a besoin de q et masse seulement entre iip2 et ip1jm
     464           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     465           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     466          enddo   
     467         enddo
     468        enddo !do ifils=1,nqdesc(iq)
     469        do ifils=1,nqfils(iq)
     470         iq2=iqfils(ifils,iq)
     471         call vlx(Ratio,pente_max,masseq,u_mq,iq2)
     472        enddo !do ifils=1,nqfils(iq)
     473      endif !if (nqfils(iq).gt.0) then
     474! end CRisi
     475
    419476
    420477c   calcul des tENDances
     
    422479      DO l=1,llm
    423480         DO ij=iip2+1,ip1jm
    424             new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
    425             q(ij,l)=(q(ij,l)*masse(ij,l)+
     481            new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
     482            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
    426483     &      u_mq(ij-1,l)-u_mq(ij,l))
    427484     &      /new_m
    428             masse(ij,l)=new_m
     485            masse(ij,l,iq)=new_m
    429486         ENDDO
    430487c   ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
    431488         DO ij=iip1+iip1,ip1jm,iip1
    432             q(ij-iim,l)=q(ij,l)
    433             masse(ij-iim,l)=masse(ij,l)
    434          ENDDO
    435       ENDDO
     489            q(ij-iim,l,iq)=q(ij,l,iq)
     490            masse(ij-iim,l,iq)=masse(ij,l,iq)
     491         ENDDO
     492      ENDDO
     493
     494      ! retablir les fils en rapport de melange par rapport a l'air:
     495      ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio
     496      ! puis on boucle en longitude
     497      if (nqdesc(iq).gt.0) then 
     498       do ifils=1,nqdesc(iq)
     499         iq2=iqfils(ifils,iq) 
     500         DO l=1,llm
     501          DO ij=iip2+1,ip1jm
     502            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     503          enddo
     504          DO ij=iip1+iip1,ip1jm,iip1
     505             q(ij-iim,l,iq2)=q(ij,l,iq2)
     506          enddo ! DO ij=ijb+iip1-1,ije,iip1
     507         enddo !DO l=1,llm
     508        enddo !do ifils=1,nqdesc(iq)
     509      endif !if (nqfils(iq).gt.0) then
     510
    436511c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
    437512c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
     
    440515      RETURN
    441516      END
    442       SUBROUTINE vly(q,pente_max,masse,masse_adv_v)
     517      SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq)
     518      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    443519c
    444520c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    464540c   Arguments:
    465541c   ----------
    466       REAL masse(ip1jmp1,llm),pente_max
     542      REAL masse(ip1jmp1,llm,nqtot),pente_max
    467543      REAL masse_adv_v( ip1jm,llm)
    468       REAL q(ip1jmp1,llm), dq( ip1jmp1,llm)
     544      REAL q(ip1jmp1,llm,nqtot), dq( ip1jmp1,llm)
     545      INTEGER iq ! CRisi
    469546c
    470547c      Local
     
    491568      SAVE sinlon,coslon,sinlondlon,coslondlon
    492569      SAVE airej2,airejjm
     570
     571      REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi
     572      INTEGER ifils,iq2 ! CRisi
     573
    493574c
    494575c
     
    497578      DATA first,testcpu/.true.,.false./
    498579      DATA temps0,temps1,temps2,temps3,temps4,temps5/0.,0.,0.,0.,0.,0./
     580
     581      write(*,*) 'vly 578: entree, iq=',iq
    499582
    500583      IF(first) THEN
     
    529612
    530613      DO i = 1, iim
    531       airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
    532       airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
     614      airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)
     615      airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)
    533616      ENDDO
    534617      qpns   = SSUM( iim,  airescb ,1 ) / airej2
     
    538621
    539622      DO ij=1,ip1jm
    540          dyqv(ij)=q(ij,l)-q(ij+iip1,l)
     623         dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
    541624         adyqv(ij)=abs(dyqv(ij))
    542625      ENDDO
     
    553636
    554637      DO ij=1,iip1
    555          dyq(ij,l)=qpns-q(ij+iip1,l)
    556          dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
     638         dyq(ij,l)=qpns-q(ij+iip1,l,iq)
     639         dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn
    557640      ENDDO
    558641
     
    675758      ENDDO
    676759
     760      write(*,*) 'vly 756'
    677761      DO l=1,llm
    678762       DO ij=1,ip1jm
    679763          IF(masse_adv_v(ij,l).gt.0) THEN
    680               qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)*
    681      ,                   0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))
     764              qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)*
     765     ,                   0.5*(1.-masse_adv_v(ij,l)
     766     ,                   /masse(ij+iip1,l,iq))
    682767          ELSE
    683               qbyv(ij,l)=q(ij,l)-dyq(ij,l)*
    684      ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l))
     768              qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)*
     769     ,                   0.5*(1.+masse_adv_v(ij,l)
     770     ,                   /masse(ij,l,iq))
    685771          ENDIF
    686772          qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
     
    688774      ENDDO
    689775
     776! CRisi: appel récursif de l'advection sur les fils.
     777! Il faut faire ça avant d'avoir mis à jour q et masse
     778      write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq)
     779   
     780      if (nqfils(iq).gt.0) then 
     781       do ifils=1,nqdesc(iq)
     782         iq2=iqfils(ifils,iq)
     783         DO l=1,llm
     784         DO ij=1,ip1jmp1
     785           ! attention, chaque fils doit avoir son masseq, sinon, le 1er
     786           ! fils ecrase le masseq de ses freres.
     787           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     788           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     789          enddo   
     790         enddo
     791        enddo !do ifils=1,nqdesc(iq)
     792
     793        do ifils=1,nqfils(iq)
     794         iq2=iqfils(ifils,iq)
     795         call vly(Ratio,pente_max,masseq,qbyv,iq2)
     796        enddo !do ifils=1,nqfils(iq)
     797      endif !if (nqfils(iq).gt.0) then
    690798
    691799      DO l=1,llm
    692800         DO ij=iip2,ip1jm
    693             newmasse=masse(ij,l)
     801            newmasse=masse(ij,l,iq)
    694802     &      +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
    695             q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
    696      &         /newmasse
    697             masse(ij,l)=newmasse
     803            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
     804     &         -qbyv(ij-iip1,l))/newmasse
     805            masse(ij,l,iq)=newmasse
    698806         ENDDO
    699807c.-. ancienne version
     
    703811         convpn=SSUM(iim,qbyv(1,l),1)
    704812         convmpn=ssum(iim,masse_adv_v(1,l),1)
    705          massepn=ssum(iim,masse(1,l),1)
     813         massepn=ssum(iim,masse(1,l,iq),1)
    706814         qpn=0.
    707815         do ij=1,iim
    708             qpn=qpn+masse(ij,l)*q(ij,l)
     816            qpn=qpn+masse(ij,l,iq)*q(ij,l,iq)
    709817         enddo
    710818         qpn=(qpn+convpn)/(massepn+convmpn)
    711819         do ij=1,iip1
    712             q(ij,l)=qpn
     820            q(ij,l,iq)=qpn
    713821         enddo
    714822
     
    718826         convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
    719827         convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
    720          masseps=ssum(iim, masse(ip1jm+1,l),1)
     828         masseps=ssum(iim, masse(ip1jm+1,l,iq),1)
    721829         qps=0.
    722830         do ij = ip1jm+1,ip1jmp1-1
    723             qps=qps+masse(ij,l)*q(ij,l)
     831            qps=qps+masse(ij,l,iq)*q(ij,l,iq)
    724832         enddo
    725833         qps=(qps+convps)/(masseps+convmps)
    726834         do ij=ip1jm+1,ip1jmp1
    727             q(ij,l)=qps
     835            q(ij,l,iq)=qps
    728836         enddo
    729837
     
    739847c        DO ij = 1,iip1
    740848c           q(ij,l)=newq
    741 c           masse(ij,l)=newmasse*aire(ij)
     849c           masse(ij,l,iq)=newmasse*aire(ij)
    742850c        ENDDO
    743851c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
     
    749857c        DO ij = ip1jm+1,ip1jmp1
    750858c           q(ij,l)=newq
    751 c           masse(ij,l)=newmasse*aire(ij)
     859c           masse(ij,l,iq)=newmasse*aire(ij)
    752860c        ENDDO
    753861c._. fin nouvelle version
    754862      ENDDO
     863 
     864! retablir les fils en rapport de melange par rapport a l'air:
     865      if (nqfils(iq).gt.0) then 
     866       do ifils=1,nqdesc(iq)
     867         iq2=iqfils(ifils,iq) 
     868         DO l=1,llm
     869          DO ij=1,ip1jmp1
     870            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     871          enddo
     872         enddo
     873        enddo !do ifils=1,nqdesc(iq)
     874      endif !if (nqfils(iq).gt.0) then
     875
     876      write(*,*) 'vly 853: sortie'
    755877
    756878      RETURN
    757879      END
    758       SUBROUTINE vlz(q,pente_max,masse,w)
     880      SUBROUTINE vlz(q,pente_max,masse,w,iq)
     881      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    759882c
    760883c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    779902c   Arguments:
    780903c   ----------
    781       REAL masse(ip1jmp1,llm),pente_max
    782       REAL q(ip1jmp1,llm)
     904      REAL masse(ip1jmp1,llm,nqtot),pente_max
     905      REAL q(ip1jmp1,llm,nqtot)
    783906      REAL w(ip1jmp1,llm+1)
     907      INTEGER iq
    784908c
    785909c      Local
     
    792916      REAL dzq(ip1jmp1,llm),dzqw(ip1jmp1,llm),adzqw(ip1jmp1,llm),dzqmax
    793917      REAL sigw
     918
     919      REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi
     920      INTEGER ifils,iq2 ! CRisi
    794921
    795922      LOGICAL testcpu
     
    805932c    On oriente tout dans le sens de la pression c'est a dire dans le
    806933c    sens de W
     934
     935      write(*,*) 'vlz 923: entree'
    807936
    808937#ifdef BIDON
     
    813942      DO l=2,llm
    814943         DO ij=1,ip1jmp1
    815             dzqw(ij,l)=q(ij,l-1)-q(ij,l)
     944            dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq)
    816945            adzqw(ij,l)=abs(dzqw(ij,l))
    817946         ENDDO
     
    835964      ENDDO
    836965
     966      write(*,*) 'vlz 954'
    837967      DO ij=1,ip1jmp1
    838968         dzq(ij,1)=0.
     
    851981c calcul de  - d( q   * w )/ d(sigma)    qu'on ajoute a  dq pour calculer dq
    852982
     983       write(*,*) 'vlz 969'
    853984       DO l = 1,llm-1
    854985         do  ij = 1,ip1jmp1
    855986          IF(w(ij,l+1).gt.0.) THEN
    856              sigw=w(ij,l+1)/masse(ij,l+1)
    857              wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1))
     987             sigw=w(ij,l+1)/masse(ij,l+1,iq)
     988             wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1,iq)
     989     &           +0.5*(1.-sigw)*dzq(ij,l+1))
    858990          ELSE
    859              sigw=w(ij,l+1)/masse(ij,l)
    860              wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l))
     991             sigw=w(ij,l+1)/masse(ij,l,iq)
     992             wq(ij,l+1)=w(ij,l+1)*(q(ij,l,iq)-0.5*(1.+sigw)*dzq(ij,l))
    861993          ENDIF
    862994         ENDDO
     
    8681000       ENDDO
    8691001
     1002! CRisi: appel récursif de l'advection sur les fils.
     1003! Il faut faire ça avant d'avoir mis à jour q et masse
     1004      write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq)
     1005      if (nqfils(iq).gt.0) then 
     1006       do ifils=1,nqdesc(iq)
     1007         iq2=iqfils(ifils,iq)
     1008         DO l=1,llm
     1009          DO ij=1,ip1jmp1
     1010           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     1011           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)       
     1012          enddo   
     1013         enddo
     1014        enddo !do ifils=1,nqdesc(iq)
     1015       
     1016        do ifils=1,nqfils(iq)
     1017         iq2=iqfils(ifils,iq)         
     1018         call vlz(Ratio,pente_max,masseq,wq,iq2)
     1019        enddo !do ifils=1,nqfils(iq)
     1020      endif !if (nqfils(iq).gt.0) then
     1021! end CRisi 
     1022
    8701023      DO l=1,llm
    8711024         DO ij=1,ip1jmp1
    872             newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l)
    873             q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))
     1025            newmasse=masse(ij,l,iq)+w(ij,l+1)-w(ij,l)
     1026            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+wq(ij,l+1)-wq(ij,l))
    8741027     &         /newmasse
    875             masse(ij,l)=newmasse
    876          ENDDO
    877       ENDDO
    878 
     1028            masse(ij,l,iq)=newmasse
     1029         ENDDO
     1030      ENDDO
     1031
     1032! retablir les fils en rapport de melange par rapport a l'air:
     1033      if (nqfils(iq).gt.0) then 
     1034       do ifils=1,nqdesc(iq)
     1035         iq2=iqfils(ifils,iq) 
     1036         DO l=1,llm
     1037          DO ij=1,ip1jmp1
     1038            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     1039          enddo
     1040         enddo
     1041        enddo !do ifils=1,nqdesc(iq)
     1042      endif !if (nqfils(iq).gt.0) then
     1043      write(*,*) 'vlsplt 1032'
    8791044
    8801045      RETURN
  • LMDZ5/trunk/libf/dyn3d/vlspltqs.F

    r1907 r2270  
    33c
    44       SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
    5      ,                                  p,pk,teta                 )
     5     ,                                  p,pk,teta,iq             )
     6       USE infotrac, ONLY: nqtot,nqdesc,iqfils
    67c
    78c     Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron
     
    3536      REAL masse(ip1jmp1,llm),pente_max
    3637      REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm)
    37       REAL q(ip1jmp1,llm)
     38      REAL q(ip1jmp1,llm,nqtot)
    3839      REAL w(ip1jmp1,llm),pdt
    3940      REAL p(ip1jmp1,llmp1),teta(ip1jmp1,llm),pk(ip1jmp1,llm)
     41      INTEGER iq ! CRisi
    4042c
    4143c      Local
     
    4345c
    4446      INTEGER i,ij,l,j,ii
     47      INTEGER ifils,iq2 ! CRisi
    4548c
    4649      REAL qsat(ip1jmp1,llm)
    47       REAL zm(ip1jmp1,llm)
     50      REAL zm(ip1jmp1,llm,nqtot)
    4851      REAL mu(ip1jmp1,llm)
    4952      REAL mv(ip1jm,llm)
    5053      REAL mw(ip1jmp1,llm+1)
    51       REAL zq(ip1jmp1,llm)
     54      REAL zq(ip1jmp1,llm,nqtot)
    5255      REAL temps1,temps2,temps3
    5356      REAL zzpbar, zzw
     
    116119      ENDDO
    117120
    118       CALL SCOPY(ijp1llm,q,1,zq,1)
    119       CALL SCOPY(ijp1llm,masse,1,zm,1)
     121      CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
     122      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)
     126        CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
     127       enddo 
     128      endif !if (nqfils(iq).gt.0) then
    120129
    121130c      call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
    122       call vlxqs(zq,pente_max,zm,mu,qsat)
    123 
     131      call vlxqs(zq,pente_max,zm,mu,qsat,iq)
    124132
    125133c     call minmaxq(zq,qmin,qmax,'avant vlyqs     ')
    126134
    127       call vlyqs(zq,pente_max,zm,mv,qsat)
    128 
     135      call vlyqs(zq,pente_max,zm,mv,qsat,iq)
    129136
    130137c      call minmaxq(zq,qmin,qmax,'avant vlz     ')
    131138
    132       call vlz(zq,pente_max,zm,mw)
    133 
     139      call vlz(zq,pente_max,zm,mw,iq)
    134140
    135141c     call minmaxq(zq,qmin,qmax,'avant vlyqs     ')
    136142c     call minmaxq(zm,qmin,qmax,'M avant vlyqs     ')
    137143
    138       call vlyqs(zq,pente_max,zm,mv,qsat)
    139 
     144      call vlyqs(zq,pente_max,zm,mv,qsat,iq)
    140145
    141146c     call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
    142147c     call minmaxq(zm,qmin,qmax,'M avant vlxqs     ')
    143148
    144       call vlxqs(zq,pente_max,zm,mu,qsat)
     149      call vlxqs(zq,pente_max,zm,mu,qsat,iq)
    145150
    146151c     call minmaxq(zq,qmin,qmax,'apres vlxqs     ')
     
    150155      DO l=1,llm
    151156         DO ij=1,ip1jmp1
    152            q(ij,l)=zq(ij,l)
     157           q(ij,l,iq)=zq(ij,l,iq)
    153158         ENDDO
    154159         DO ij=1,ip1jm+1,iip1
    155             q(ij+iim,l)=q(ij,l)
    156          ENDDO
    157       ENDDO
     160            q(ij+iim,l,iq)=q(ij,l,iq)
     161         ENDDO
     162      ENDDO
     163      ! CRisi: aussi pour les fils
     164      if (nqdesc(iq).gt.0) then
     165      do ifils=1,nqdesc(iq)
     166        iq2=iqfils(ifils,iq)
     167        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
     172            q(ij+iim,l,iq2)=q(ij,l,iq2)
     173         ENDDO
     174        ENDDO
     175      enddo !do ifils=1,nqdesc(iq) 
     176      endif ! if (nqfils(iq).gt.0) then
     177      write(*,*) 'vlspltqs 183: fin de la routine'
    158178
    159179      RETURN
    160180      END
    161       SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat)
     181      SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq)
     182      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
     183
    162184c
    163185c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    179201c   Arguments:
    180202c   ----------
    181       REAL masse(ip1jmp1,llm),pente_max
     203      REAL masse(ip1jmp1,llm,nqtot),pente_max
    182204      REAL u_m( ip1jmp1,llm )
    183       REAL q(ip1jmp1,llm)
     205      REAL q(ip1jmp1,llm,nqtot)
    184206      REAL qsat(ip1jmp1,llm)
     207      INTEGER iq ! CRisi
    185208c
    186209c      Local
     
    195218      REAL adxqu(ip1jmp1),dxqmax(ip1jmp1,llm)
    196219      REAL u_mq(ip1jmp1,llm)
     220
     221      ! CRisi
     222      REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot)
     223      INTEGER ifils,iq2 ! CRisi
    197224
    198225      Logical first,testcpu
     
    227254         DO l = 1, llm
    228255            DO ij=iip2,ip1jm-1
    229                dxqu(ij)=q(ij+1,l)-q(ij,l)
     256               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    230257c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
    231 c              sigu(ij)=u_m(ij,l)/masse(ij,l)
     258c              sigu(ij)=u_m(ij,l)/masse(ij,l,iq)
    232259            ENDDO
    233260            DO ij=iip1+iip1,ip1jm,iip1
     
    281308         DO l = 1, llm
    282309            DO ij=iip2,ip1jm-1
    283                dxqu(ij)=q(ij+1,l)-q(ij,l)
     310               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    284311            ENDDO
    285312            DO ij=iip1+iip1,ip1jm,iip1
     
    323350      DO l=1,llm
    324351       DO ij=iip2,ip1jm-1
    325           zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l),
    326      ,                     1.+u_m(ij,l)/masse(ij+1,l),
     352          zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
     353     ,                     1.+u_m(ij,l)/masse(ij+1,l,iq),
    327354     ,                     u_m(ij,l))
    328355          zdum(ij,l)=0.5*zdum(ij,l)
    329356          u_mq(ij,l)=cvmgp(
    330      ,                q(ij,l)+zdum(ij,l)*dxq(ij,l),
    331      ,                q(ij+1,l)-zdum(ij,l)*dxq(ij+1,l),
     357     ,                q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
     358     ,                q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
    332359     ,                u_m(ij,l))
    333360          u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
     
    341368       DO ij=iip2,ip1jm-1
    342369          IF (u_m(ij,l).gt.0.) THEN
    343              zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
     370             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
    344371             u_mq(ij,l)=u_m(ij,l)*
    345      $         min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
     372     $         min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
    346373          ELSE
    347              zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
     374             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
    348375             u_mq(ij,l)=u_m(ij,l)*
    349      $         min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
     376     $         min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
    350377          ENDIF
    351378       ENDDO
     
    416443                     i=ijq-(j-1)*iip1
    417444c   accumulation pour les mailles completements advectees
    418                      do while(zu_m.gt.masse(ijq,l))
    419                         u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
    420                         zu_m=zu_m-masse(ijq,l)
     445                     do while(zu_m.gt.masse(ijq,l,iq))
     446                        u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)
     447     &                          *masse(ijq,l,iq)
     448                        zu_m=zu_m-masse(ijq,l,iq)
    421449                        i=mod(i-2+iim,iim)+1
    422450                        ijq=(j-1)*iip1+i
     
    424452c   ajout de la maille non completement advectee
    425453                     u_mq(ij,l)=u_mq(ij,l)+zu_m*
    426      &               (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
     454     &                  (q(ijq,l,iq)+0.5*(1.-zu_m/masse(ijq,l,iq))
     455     &                  *dxq(ijq,l))
    427456                  ELSE
    428457                     ijq=ij+1
    429458                     i=ijq-(j-1)*iip1
    430459c   accumulation pour les mailles completements advectees
    431                      do while(-zu_m.gt.masse(ijq,l))
    432                         u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
    433                         zu_m=zu_m+masse(ijq,l)
     460                     do while(-zu_m.gt.masse(ijq,l,iq))
     461                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
     462     &                          *masse(ijq,l,iq)
     463                        zu_m=zu_m+masse(ijq,l,iq)
    434464                        i=mod(i,iim)+1
    435465                        ijq=(j-1)*iip1+i
    436466                     ENDDO
    437467c   ajout de la maille non completement advectee
    438                      u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
    439      &               0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
     468                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
     469     &               0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    440470                  ENDIF
    441471               ENDDO
     
    454484      ENDDO
    455485
     486! CRisi: appel récursif de l'advection sur les fils.
     487! Il faut faire ça avant d'avoir mis à jour q et masse
     488      write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq)
     489     
     490      if (nqfils(iq).gt.0) then 
     491       do ifils=1,nqdesc(iq)
     492         iq2=iqfils(ifils,iq)
     493         DO l=1,llm
     494          DO ij=iip2,ip1jm
     495           ! On a besoin de q et masse seulement entre iip2 et ip1jm
     496           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     497           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     498          enddo   
     499         enddo
     500        enddo !do ifils=1,nqdesc(iq)
     501        do ifils=1,nqfils(iq)
     502         iq2=iqfils(ifils,iq)
     503         call vlx(Ratio,pente_max,masseq,u_mq,iq2)
     504        enddo !do ifils=1,nqfils(iq)
     505      endif !if (nqfils(iq).gt.0) then
     506! end CRisi
    456507
    457508c   calcul des tendances
     
    459510      DO l=1,llm
    460511         DO ij=iip2+1,ip1jm
    461             new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
    462             q(ij,l)=(q(ij,l)*masse(ij,l)+
     512            new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
     513            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
    463514     &      u_mq(ij-1,l)-u_mq(ij,l))
    464515     &      /new_m
    465             masse(ij,l)=new_m
     516            masse(ij,l,iq)=new_m
    466517         ENDDO
    467518c   Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
    468519         DO ij=iip1+iip1,ip1jm,iip1
    469             q(ij-iim,l)=q(ij,l)
    470             masse(ij-iim,l)=masse(ij,l)
    471          ENDDO
    472       ENDDO
     520            q(ij-iim,l,iq)=q(ij,l,iq)
     521            masse(ij-iim,l,iq)=masse(ij,l,iq)
     522         ENDDO
     523      ENDDO
     524
     525      ! retablir les fils en rapport de melange par rapport a l'air:
     526      ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio
     527      ! puis on boucle en longitude
     528      if (nqdesc(iq).gt.0) then 
     529       do ifils=1,nqdesc(iq)
     530         iq2=iqfils(ifils,iq) 
     531         DO l=1,llm
     532          DO ij=iip2+1,ip1jm
     533            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     534          enddo
     535          DO ij=iip1+iip1,ip1jm,iip1
     536             q(ij-iim,l,iq2)=q(ij,l,iq2)
     537          enddo ! DO ij=ijb+iip1-1,ije,iip1
     538         enddo !DO l=1,llm
     539        enddo !do ifils=1,nqdesc(iq)
     540      endif !if (nqfils(iq).gt.0) then
    473541
    474542c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
     
    478546      RETURN
    479547      END
    480       SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat)
     548      SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq)
     549      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    481550c
    482551c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    502571c   Arguments:
    503572c   ----------
    504       REAL masse(ip1jmp1,llm),pente_max
     573      REAL masse(ip1jmp1,llm,nqtot),pente_max
    505574      REAL masse_adv_v( ip1jm,llm)
    506       REAL q(ip1jmp1,llm)
     575      REAL q(ip1jmp1,llm,nqtot)
    507576      REAL qsat(ip1jmp1,llm)
     577      INTEGER iq ! CRisi
    508578c
    509579c      Local
     
    529599      SAVE sinlon,coslon,sinlondlon,coslondlon
    530600      SAVE airej2,airejjm
     601
     602      REAL masseq(ip1jmp1,llm,nqtot),Ratio(ip1jmp1,llm,nqtot) ! CRisi
     603      INTEGER ifils,iq2 ! CRisi
    531604c
    532605c
     
    567640
    568641      DO i = 1, iim
    569       airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
    570       airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
     642      airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)
     643      airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)
    571644      ENDDO
    572645      qpns   = SSUM( iim,  airescb ,1 ) / airej2
     
    576649
    577650      DO ij=1,ip1jm
    578          dyqv(ij)=q(ij,l)-q(ij+iip1,l)
     651         dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
    579652         adyqv(ij)=abs(dyqv(ij))
    580653      ENDDO
     
    591664
    592665      DO ij=1,iip1
    593          dyq(ij,l)=qpns-q(ij+iip1,l)
    594          dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
     666         dyq(ij,l)=qpns-q(ij+iip1,l,iq)
     667         dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn
    595668      ENDDO
    596669
     
    710783       DO ij=1,ip1jm
    711784         IF( masse_adv_v(ij,l).GT.0. ) THEN
    712            qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l )  +
    713      ,      dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
     785           qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l,iq )  +
     786     ,      dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)
     787     ,      /masse(ij+iip1,l,iq)))
    714788         ELSE
    715               qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
    716      ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
     789              qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) *
     790     ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) )
    717791         ENDIF
    718792          qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
     
    721795
    722796
     797! CRisi: appel récursif de l'advection sur les fils.
     798! Il faut faire ça avant d'avoir mis à jour q et masse
     799      write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq)
     800   
     801      if (nqfils(iq).gt.0) then 
     802       do ifils=1,nqdesc(iq)
     803         iq2=iqfils(ifils,iq)
     804         DO l=1,llm
     805         DO ij=1,ip1jmp1
     806           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     807           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     808          enddo   
     809         enddo
     810        enddo !do ifils=1,nqdesc(iq)
     811
     812        do ifils=1,nqfils(iq)
     813         iq2=iqfils(ifils,iq)
     814         write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2
     815         call vly(Ratio,pente_max,masseq,qbyv,iq2)
     816        enddo !do ifils=1,nqfils(iq)
     817      endif !if (nqfils(iq).gt.0) then
     818
    723819      DO l=1,llm
    724820         DO ij=iip2,ip1jm
    725             newmasse=masse(ij,l)
     821            newmasse=masse(ij,l,iq)
    726822     &      +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
    727             q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
    728      &         /newmasse
    729             masse(ij,l)=newmasse
     823            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
     824     &         -qbyv(ij-iip1,l))/newmasse
     825            masse(ij,l,iq)=newmasse
    730826         ENDDO
    731827c.-. ancienne version
     
    733829         convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
    734830         DO ij = 1,iip1
    735             newmasse=masse(ij,l)+convmpn*aire(ij)
    736             q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
     831            newmasse=masse(ij,l,iq)+convmpn*aire(ij)
     832            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*aire(ij))/
    737833     &               newmasse
    738             masse(ij,l)=newmasse
     834            masse(ij,l,iq)=newmasse
    739835         ENDDO
    740836         convps  = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
    741837         convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
    742838         DO ij = ip1jm+1,ip1jmp1
    743             newmasse=masse(ij,l)+convmps*aire(ij)
    744             q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
     839            newmasse=masse(ij,l,iq)+convmps*aire(ij)
     840            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*aire(ij))/
    745841     &               newmasse
    746             masse(ij,l)=newmasse
     842            masse(ij,l,iq)=newmasse
    747843         ENDDO
    748844c.-. fin ancienne version
     
    757853c        DO ij = 1,iip1
    758854c           q(ij,l)=newq
    759 c           masse(ij,l)=newmasse*aire(ij)
     855c           masse(ij,l,iq)=newmasse*aire(ij)
    760856c        ENDDO
    761857c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
     
    767863c        DO ij = ip1jm+1,ip1jmp1
    768864c           q(ij,l)=newq
    769 c           masse(ij,l)=newmasse*aire(ij)
     865c           masse(ij,l,iq)=newmasse*aire(ij)
    770866c        ENDDO
    771867c._. fin nouvelle version
    772868      ENDDO
    773869
     870      write(*,*) 'vly 866'
     871
     872! retablir les fils en rapport de melange par rapport a l'air:
     873      if (nqdesc(iq).gt.0) then 
     874       do ifils=1,nqdesc(iq)
     875         iq2=iqfils(ifils,iq) 
     876         DO l=1,llm
     877          DO ij=1,ip1jmp1
     878            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     879          enddo
     880         enddo
     881        enddo !do ifils=1,nqdesc(iq)
     882      endif !if (nqfils(iq).gt.0) then
     883      write(*,*) 'vly 879'
     884
    774885      RETURN
    775886      END
  • LMDZ5/trunk/libf/dyn3d_common/infotrac.F90

    r2262 r2270  
    1212  INTEGER, SAVE :: nbtr
    1313
     14! CRisi: nb traceurs pères= directement advectés par l'air
     15  INTEGER, SAVE :: nqperes
     16
    1417! Name variables
    1518  CHARACTER(len=20), ALLOCATABLE, DIMENSION(:), SAVE :: tname ! tracer short name for restart and diagnostics
     
    2225!         dynamic part of the code and the tracers (nbtr+2) used in the physics part of the code.
    2326  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE    :: niadv ! equivalent dyn / physique
     27
     28! CRisi: tableaux de fils
     29  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE    :: nqfils
     30  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE    :: nqdesc ! nombres de fils + nombre de tous les petits fils sur toutes les générations
     31  INTEGER, SAVE :: nqdesc_tot
     32  INTEGER, ALLOCATABLE, DIMENSION(:,:), SAVE    :: iqfils
     33  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE    :: iqpere
    2434
    2535! conv_flg(it)=0 : convection desactivated for tracer number it
     
    3040  CHARACTER(len=4),SAVE :: type_trac
    3141  CHARACTER(len=8),DIMENSION(:),ALLOCATABLE, SAVE :: solsym
     42   
     43    ! CRisi: cas particulier des isotopes
     44    LOGICAL,SAVE :: ok_isotopes,ok_iso_verif,ok_isotrac,ok_init_iso
     45    INTEGER :: niso_possibles   
     46    PARAMETER ( niso_possibles=5)
     47    real, DIMENSION (niso_possibles),SAVE :: tnat,alpha_ideal
     48    LOGICAL, DIMENSION(niso_possibles),SAVE ::  use_iso
     49    INTEGER, ALLOCATABLE, DIMENSION(:,:), SAVE ::  iqiso ! donne indice iq en fn de (ixt,phase)
     50    INTEGER, ALLOCATABLE, DIMENSION(:), SAVE ::  iso_num ! donne numéro iso entre 1 et niso_possibles en fn de nqtot
     51    INTEGER, ALLOCATABLE, DIMENSION(:), SAVE ::  iso_indnum ! donne numéro iso entre 1 et niso effectif en fn de nqtot
     52    INTEGER, ALLOCATABLE, DIMENSION(:), SAVE ::  zone_num ! donne numéro de la zone de tracage en fn de nqtot
     53    INTEGER, ALLOCATABLE, DIMENSION(:), SAVE ::  phase_num ! donne numéro de la zone de tracage en fn de nqtot
     54    INTEGER, DIMENSION(niso_possibles), SAVE :: indnum_fn_num ! donne indice entre entre 1 et niso en fonction du numéro d isotope entre 1 et niso_possibles
     55    INTEGER, ALLOCATABLE, DIMENSION(:,:), SAVE ::  index_trac ! numéro ixt en fn izone, indnum entre 1 et niso
     56    INTEGER,SAVE :: niso,ntraceurs_zone,ntraciso
    3257 
    3358CONTAINS
     
    6388
    6489    CHARACTER(len=15), ALLOCATABLE, DIMENSION(:) :: tnom_0  ! tracer short name
     90    CHARACTER(len=15), ALLOCATABLE, DIMENSION(:) :: tnom_transp ! transporting fluid short name: CRisi
    6591    CHARACTER(len=3), DIMENSION(30) :: descrq
    6692    CHARACTER(len=1), DIMENSION(3)  :: txts
     
    7096    INTEGER :: nqtrue  ! number of tracers read from tracer.def, without higer order of moment
    7197    INTEGER :: iq, new_iq, iiq, jq, ierr
     98    INTEGER :: ifils,ipere,generation ! CRisi
     99    LOGICAL :: continu,nouveau_traceurdef
     100    INTEGER :: IOstatus ! gestion de la retrocompatibilite de traceur.def
     101    CHARACTER(len=15) :: tchaine   
    72102
    73103    character(len=*),parameter :: modname="infotrac_init"
     
    134164          WRITE(lunout,*) trim(modname),': Open traceur.def : ok'
    135165          READ(90,*) nqtrue
     166          write(lunout,*) 'nqtrue=',nqtrue
    136167       ELSE
    137168          WRITE(lunout,*) trim(modname),': Problem in opening traceur.def'
     
    192223! Allocate variables depending on nqtrue
    193224!
    194     ALLOCATE(tnom_0(nqtrue), hadv(nqtrue), vadv(nqtrue))
     225    ALLOCATE(tnom_0(nqtrue), hadv(nqtrue), vadv(nqtrue),tnom_transp(nqtrue))
    195226!
    196227!jyg<
     
    230261          ! Continue to read tracer.def
    231262          DO iq=1,nqtrue
    232              READ(90,*) hadv(iq),vadv(iq),tnom_0(iq)
    233           END DO
     263
     264             write(*,*) 'infotrac 237: iq=',iq
     265             ! CRisi: ajout du nom du fluide transporteur
     266             ! mais rester retro compatible
     267             READ(90,'(I2,X,I2,X,A)',IOSTAT=IOstatus) hadv(iq),vadv(iq),tchaine
     268             write(lunout,*) 'iq,hadv(iq),vadv(iq)=',iq,hadv(iq),vadv(iq)
     269             write(lunout,*) 'tchaine=',trim(tchaine)
     270             write(*,*) 'infotrac 238: IOstatus=',IOstatus
     271             if (IOstatus.ne.0) then
     272                CALL abort_gcm('infotrac_init','Pb dans la lecture de traceur.def',1)
     273             endif
     274             ! Y-a-t-il 1 ou 2 noms de traceurs? -> On regarde s'il y a un
     275             ! espace ou pas au milieu de la chaine.
     276             continu=1
     277             nouveau_traceurdef=0
     278             iiq=1
     279             do while (continu)
     280                if (tchaine(iiq:iiq).eq.' ') then
     281                  nouveau_traceurdef=1
     282                  continu=0
     283                else if (iiq.lt.LEN_TRIM(tchaine)) then
     284                  iiq=iiq+1
     285                else
     286                  continu=0     
     287                endif
     288             enddo
     289             write(*,*) 'iiq,nouveau_traceurdef=',iiq,nouveau_traceurdef
     290             if (nouveau_traceurdef) then
     291                write(lunout,*) 'C''est la nouvelle version de traceur.def'
     292                tnom_0(iq)=tchaine(1:iiq-1)
     293                tnom_transp(iq)=tchaine(iiq+1:15)
     294             else
     295                write(lunout,*) 'C''est l''ancienne version de traceur.def'
     296                write(lunout,*) 'On suppose que les traceurs sont tous d''air'
     297                tnom_0(iq)=tchaine
     298                tnom_transp(iq) = 'air'
     299             endif
     300             write(lunout,*) 'tnom_0(iq)=<',trim(tnom_0(iq)),'>'
     301             write(lunout,*) 'tnom_transp(iq)=<',trim(tnom_transp(iq)),'>'
     302
     303          END DO !DO iq=1,nqtrue
    234304          CLOSE(90) 
     305
    235306       ELSE ! Without tracer.def, set default values
    236307         if (planet_type=="earth") then
     
    239310          vadv(1) = 14
    240311          tnom_0(1) = 'H2Ov'
     312          tnom_transp(1) = 'air'
    241313          hadv(2) = 10
    242314          vadv(2) = 10
    243315          tnom_0(2) = 'H2Ol'
     316          tnom_transp(2) = 'air'
    244317          hadv(3) = 10
    245318          vadv(3) = 10
    246319          tnom_0(3) = 'RN'
     320          tnom_transp(3) = 'air'
    247321          hadv(4) = 10
    248322          vadv(4) = 10
    249323          tnom_0(4) = 'PB'
     324          tnom_transp(4) = 'air'
    250325         else ! default for other planets
    251326          hadv(1) = 10
    252327          vadv(1) = 10
    253328          tnom_0(1) = 'dummy'
     329          tnom_transp(1) = 'dummy'
    254330         endif ! of if (planet_type=="earth")
    255331       END IF
     
    258334       WRITE(lunout,*) trim(modname),': nombre de traceurs ',nqtrue
    259335       DO iq=1,nqtrue
    260           WRITE(lunout,*) hadv(iq),vadv(iq),tnom_0(iq)
     336          WRITE(lunout,*) hadv(iq),vadv(iq),tnom_0(iq),tnom_transp(iq)
    261337       END DO
    262338
     
    447523    END DO
    448524
     525
     526! CRisi: quels sont les traceurs fils et les traceurs pères.
     527! initialiser tous les tableaux d'indices liés aux traceurs familiaux
     528! + vérifier que tous les pères sont écrits en premières positions
     529    ALLOCATE(nqfils(nqtot),nqdesc(nqtot))   
     530    ALLOCATE(iqfils(nqtot,nqtot))   
     531    ALLOCATE(iqpere(nqtot))
     532    nqperes=0
     533    nqfils(:)=0
     534    nqdesc(:)=0
     535    iqfils(:,:)=0
     536    iqpere(:)=0
     537    nqdesc_tot=0   
     538    DO iq=1,nqtot
     539      if (tnom_transp(iq) == 'air') then
     540        ! ceci est un traceur père
     541        WRITE(lunout,*) 'Le traceur',iq,', appele ',trim(tnom_0(iq)),', est un pere'
     542        nqperes=nqperes+1
     543        iqpere(iq)=0
     544      else !if (tnom_transp(iq) == 'air') then
     545        ! ceci est un fils. Qui est son père?
     546        WRITE(lunout,*) 'Le traceur',iq,', appele ',trim(tnom_0(iq)),', est un fils'
     547        continu=.true.
     548        ipere=1
     549        do while (continu)           
     550          if (tnom_transp(iq) == tnom_0(ipere)) then
     551            ! Son père est ipere
     552            WRITE(lunout,*) 'Le traceur',iq,'appele ', &
     553      &          trim(tnom_0(iq)),' est le fils de ',ipere,'appele ',trim(tnom_0(ipere))
     554            nqfils(ipere)=nqfils(ipere)+1 
     555            iqfils(nqfils(ipere),ipere)=iq
     556            iqpere(iq)=ipere         
     557            continu=.false.
     558          else !if (tnom_transp(iq) == tnom_0(ipere)) then
     559            ipere=ipere+1
     560            if (ipere.gt.nqtot) then
     561                WRITE(lunout,*) 'Le traceur',iq,'appele ', &
     562      &          trim(tnom_0(iq)),', est orpelin.'
     563                CALL abort_gcm('infotrac_init','Un traceur est orphelin',1)
     564            endif !if (ipere.gt.nqtot) then
     565          endif !if (tnom_transp(iq) == tnom_0(ipere)) then
     566        enddo !do while (continu)
     567      endif !if (tnom_transp(iq) == 'air') then
     568    enddo !DO iq=1,nqtot
     569    WRITE(lunout,*) 'infotrac: nqperes=',nqperes   
     570    WRITE(lunout,*) 'nqfils=',nqfils
     571    WRITE(lunout,*) 'iqpere=',iqpere
     572    WRITE(lunout,*) 'iqfils=',iqfils
     573
     574! Calculer le nombre de descendants à partir de iqfils et de nbfils
     575    DO iq=1,nqtot   
     576      generation=0
     577      continu=.true.
     578      ifils=iq
     579      do while (continu)
     580        ipere=iqpere(ifils)
     581        if (ipere.gt.0) then
     582         nqdesc(ipere)=nqdesc(ipere)+1   
     583         nqdesc_tot=nqdesc_tot+1     
     584         iqfils(nqdesc(ipere),ipere)=iq
     585         ifils=ipere
     586         generation=generation+1
     587        else !if (ipere.gt.0) then
     588         continu=.false.
     589        endif !if (ipere.gt.0) then
     590      enddo !do while (continu)   
     591      WRITE(lunout,*) 'Le traceur ',iq,', appele ',trim(tnom_0(iq)),' est un traceur de generation: ',generation
     592    enddo !DO iq=1,nqtot
     593    WRITE(lunout,*) 'infotrac: nqdesc=',nqdesc
     594    WRITE(lunout,*) 'iqfils=',iqfils
     595    WRITE(lunout,*) 'nqdesc_tot=',nqdesc_tot
     596
     597! Interdire autres schémas que 10 pour les traceurs fils, et autres schémas
     598! que 10 et 14 si des pères ont des fils
     599    do iq=1,nqtot
     600      if (iqpere(iq).gt.0) then
     601        ! ce traceur a un père qui n'est pas l'air
     602        ! Seul le schéma 10 est autorisé
     603        if (iadv(iq)/=10) then
     604           WRITE(lunout,*)trim(modname),' STOP : The option iadv=',iadv(iq),' is not implemented for sons'
     605          CALL abort_gcm('infotrac_init','Sons should be advected by scheme 10',1)
     606        endif
     607        ! Le traceur père ne peut être advecté que par schéma 10 ou 14:
     608        IF (iadv(iqpere(iq))/=10 .AND. iadv(iqpere(iq))/=14) THEN
     609          WRITE(lunout,*)trim(modname),' STOP : The option iadv=',iadv(iq),' is not implemented for fathers'
     610          CALL abort_gcm('infotrac_init','Fathers should be advected by scheme 10 ou 14',1)
     611        endif !IF (iadv(iqpere(iq))/=10 .AND. iadv(iqpere(iq))/=14) THEN
     612     endif !if (iqpere(iq).gt.0) the
     613    enddo !do iq=1,nqtot
     614
     615
     616! detecter quels sont les traceurs isotopiques parmi des traceurs
     617    call infotrac_isoinit(tnom_0,nqtrue)
     618       
    449619!-----------------------------------------------------------------------
    450620! Finalize :
    451621!
    452     DEALLOCATE(tnom_0, hadv, vadv)
     622    DEALLOCATE(tnom_0, hadv, vadv,tnom_transp)
    453623
    454624
    455625  END SUBROUTINE infotrac_init
    456626
     627  SUBROUTINE infotrac_isoinit(tnom_0,nqtrue)
     628
     629#ifdef CPP_IOIPSL
     630  use IOIPSL
     631#else
     632  ! if not using IOIPSL, we still need to use (a local version of) getin
     633  use ioipsl_getincom
     634#endif
     635  implicit none
     636 
     637    ! inputs
     638    INTEGER nqtrue
     639    CHARACTER(len=15) tnom_0(nqtrue)
     640   
     641    ! locals   
     642    CHARACTER(len=3), DIMENSION(niso_possibles) :: tnom_iso
     643    INTEGER, ALLOCATABLE,DIMENSION(:,:) :: nb_iso,nb_traciso
     644    INTEGER, ALLOCATABLE,DIMENSION(:) :: nb_isoind
     645    INTEGER :: ntraceurs_zone_prec,iq,phase,ixt,iiso,izone
     646    CHARACTER(len=19) :: tnom_trac
     647    INCLUDE "iniprint.h"
     648
     649    tnom_iso=(/'eau','HDO','O18','O17','HTO'/)
     650
     651    ALLOCATE(nb_iso(niso_possibles,nqo))
     652    ALLOCATE(nb_isoind(nqo))
     653    ALLOCATE(nb_traciso(niso_possibles,nqo))
     654    ALLOCATE(iso_num(nqtot))
     655    ALLOCATE(iso_indnum(nqtot))
     656    ALLOCATE(zone_num(nqtot))
     657    ALLOCATE(phase_num(nqtot))
     658     
     659    iso_num(:)=0
     660    iso_indnum(:)=0
     661    zone_num(:)=0
     662    phase_num(:)=0
     663    indnum_fn_num(:)=0
     664    use_iso(:)=.false. 
     665    nb_iso(:,:)=0 
     666    nb_isoind(:)=0     
     667    nb_traciso(:,:)=0
     668    niso=0
     669    ntraceurs_zone=0 
     670    ntraceurs_zone_prec=0
     671    ntraciso=0
     672
     673    do iq=nqo+1,nqtot
     674       write(lunout,*) 'infotrac 569: iq,tnom_0(iq)=',iq,tnom_0(iq)
     675       do phase=1,nqo   
     676        do ixt= 1,niso_possibles   
     677         tnom_trac=trim(tnom_0(phase))//'_'
     678         tnom_trac=trim(tnom_trac)//trim(tnom_iso(ixt))
     679         write(*,*) 'phase,ixt,tnom_trac=',phase,ixt,tnom_trac     
     680         IF (tnom_0(iq) == tnom_trac) then
     681          write(lunout,*) 'Ce traceur est un isotope'
     682          nb_iso(ixt,phase)=nb_iso(ixt,phase)+1   
     683          nb_isoind(phase)=nb_isoind(phase)+1   
     684          iso_num(iq)=ixt
     685          iso_indnum(iq)=nb_isoind(phase)
     686          indnum_fn_num(ixt)=iso_indnum(iq)
     687          phase_num(iq)=phase
     688          write(lunout,*) 'iso_num(iq)=',iso_num(iq)
     689          write(lunout,*) 'iso_indnum(iq)=',iso_indnum(iq)
     690          write(lunout,*) 'indnum_fn_num(ixt)=',indnum_fn_num(ixt)
     691          write(lunout,*) 'phase_num(iq)=',phase_num(iq)
     692          goto 20
     693         else if (iqpere(iq).gt.0) then         
     694          if (tnom_0(iqpere(iq)) == tnom_trac) then
     695           write(lunout,*) 'Ce traceur est le fils d''un isotope'
     696           ! c'est un traceur d'isotope
     697           nb_traciso(ixt,phase)=nb_traciso(ixt,phase)+1
     698           iso_num(iq)=ixt
     699           iso_indnum(iq)=indnum_fn_num(ixt)
     700           zone_num(iq)=nb_traciso(ixt,phase)
     701           phase_num(iq)=phase
     702           write(lunout,*) 'iso_num(iq)=',iso_num(iq)
     703           write(lunout,*) 'phase_num(iq)=',phase_num(iq)
     704           write(lunout,*) 'zone_num(iq)=',zone_num(iq)
     705           goto 20
     706          endif !if (tnom_0(iqpere(iq)) == trim(tnom_0(phase))//trim(tnom_iso(ixt))) then
     707         endif !IF (tnom_0(iq) == trim(tnom_0(phase))//trim(tnom_iso(ixt))) then
     708        enddo !do ixt= niso_possibles
     709       enddo !do phase=1,nqo
     710  20   continue
     711      enddo !do iq=1,nqtot
     712
     713      write(lunout,*) 'iso_num=',iso_num
     714      write(lunout,*) 'iso_indnum=',iso_indnum
     715      write(lunout,*) 'zone_num=',zone_num 
     716      write(lunout,*) 'phase_num=',phase_num
     717      write(lunout,*) 'indnum_fn_num=',indnum_fn_num
     718
     719      do ixt= 1,niso_possibles 
     720
     721        if (nb_iso(ixt,1).eq.1) then
     722          ! on vérifie que toutes les phases ont le même nombre de
     723          ! traceurs
     724          do phase=2,nqo
     725            if (nb_iso(ixt,phase).ne.nb_iso(ixt,1)) then
     726              write(lunout,*) 'ixt,phase,nb_iso=',ixt,phase,nb_iso(ixt,phase)
     727              CALL abort_gcm('infotrac_init','Phases must have same number of isotopes',1)
     728            endif
     729          enddo !do phase=2,nqo
     730
     731          niso=niso+1
     732          use_iso(ixt)=.true.
     733          ntraceurs_zone=nb_traciso(ixt,1)
     734
     735          ! on vérifie que toutes les phases ont le même nombre de
     736          ! traceurs
     737          do phase=2,nqo
     738            if (nb_traciso(ixt,phase).ne.ntraceurs_zone) then
     739              write(lunout,*) 'ixt,phase,nb_traciso=',ixt,phase,nb_traciso(ixt,phase)
     740              write(lunout,*) 'ntraceurs_zone=',ntraceurs_zone
     741              CALL abort_gcm('infotrac_init','Phases must have same number of tracers',1)
     742            endif 
     743          enddo  !do phase=2,nqo
     744          ! on vérifie que tous les isotopes ont le même nombre de
     745          ! traceurs
     746          if (ntraceurs_zone_prec.gt.0) then               
     747            if (ntraceurs_zone.eq.ntraceurs_zone_prec) then
     748              ntraceurs_zone_prec=ntraceurs_zone
     749            else !if (ntraceurs_zone.eq.ntraceurs_zone_prec) then
     750              write(*,*) 'ntraceurs_zone_prec,ntraceurs_zone=',ntraceurs_zone_prec,ntraceurs_zone   
     751              CALL abort_gcm('infotrac_init', &
     752               &'Isotope tracers are not well defined in traceur.def',1)           
     753            endif !if (ntraceurs_zone.eq.ntraceurs_zone_prec) then
     754           endif !if (ntraceurs_zone_prec.gt.0) then
     755
     756        else if (nb_iso(ixt,1).ne.0) then
     757           WRITE(lunout,*) 'nqo,ixt=',nqo,ixt
     758           WRITE(lunout,*) 'nb_iso(ixt,1)=',nb_iso(ixt,1)   
     759           CALL abort_gcm('infotrac_init','Isotopes are not well defined in traceur.def',1)     
     760        endif   !if (nb_iso(ixt,1).eq.1) then       
     761    enddo ! do ixt= niso_possibles
     762
     763    ! dimensions isotopique:
     764    ntraciso=niso*(ntraceurs_zone+1)
     765    WRITE(lunout,*) 'niso=',niso
     766    WRITE(lunout,*) 'ntraceurs_zone,ntraciso=',ntraceurs_zone,ntraciso   
     767 
     768    ! flags isotopiques:
     769    if (niso.gt.0) then
     770        ok_isotopes=.true.
     771    else
     772        ok_isotopes=.false.
     773    endif
     774    WRITE(lunout,*) 'ok_isotopes=',ok_isotopes
     775 
     776    if (ok_isotopes) then
     777        ok_iso_verif=.false.
     778        call getin('ok_iso_verif',ok_iso_verif)
     779        ok_init_iso=.false.
     780        call getin('ok_init_iso',ok_init_iso)
     781        tnat=(/1.0,155.76e-6,2005.2e-6,0.004/100.,0.0/)
     782        alpha_ideal=(/1.0,1.01,1.006,1.003,1.0/)
     783    endif !if (ok_isotopes) then 
     784    WRITE(lunout,*) 'ok_iso_verif=',ok_iso_verif
     785    WRITE(lunout,*) 'ok_init_iso=',ok_init_iso
     786
     787    if (ntraceurs_zone.gt.0) then
     788        ok_isotrac=.true.
     789    else
     790        ok_isotrac=.false.
     791    endif   
     792    WRITE(lunout,*) 'ok_isotrac=',ok_isotrac
     793
     794    ! remplissage du tableau iqiso(ntraciso,phase)
     795    ALLOCATE(iqiso(ntraciso,nqo))   
     796    iqiso(:,:)=0     
     797    do iq=1,nqtot
     798        if (iso_num(iq).gt.0) then
     799          ixt=iso_indnum(iq)+zone_num(iq)*niso
     800          iqiso(ixt,phase_num(iq))=iq
     801        endif
     802    enddo
     803    WRITE(lunout,*) 'iqiso=',iqiso
     804
     805    ! replissage du tableau index_trac(ntraceurs_zone,niso)
     806    ALLOCATE(index_trac(ntraceurs_zone,niso)) 
     807    if (ok_isotrac) then
     808        do iiso=1,niso
     809          do izone=1,ntraceurs_zone
     810             index_trac(izone,iiso)=iiso+izone*niso
     811          enddo
     812        enddo
     813    else !if (ok_isotrac) then     
     814        index_trac(:,:)=0.0
     815    endif !if (ok_isotrac) then
     816    write(lunout,*) 'index_trac=',index_trac   
     817
     818! Finalize :
     819    DEALLOCATE(nb_iso)
     820
     821  END SUBROUTINE infotrac_isoinit
     822
    457823END MODULE infotrac
  • LMDZ5/trunk/libf/dyn3dmem/advtrac_loc.F

    r1987 r2270  
    2424      USE Vampir
    2525      USE times
    26       USE infotrac, ONLY: nqtot, iadv
     26      USE infotrac, ONLY: nqtot, iadv, ok_iso_verif
    2727      USE control_mod, ONLY: iapp_tracvl, day_step, planet_type
    2828      USE advtrac_mod, ONLY: finmasse
     
    8282!$OMP THREADPRIVATE(testRequest)
    8383
    84 c  test sur l'eventuelle creation de valeurs negatives de la masse
     84c  test sur l''eventuelle creation de valeurs negatives de la masse
    8585         ijb=ij_begin
    8686         ije=ij_end
     
    155155c$OMP BARRIER
    156156                 
     157          write(*,*) 'advtrac 157: appel de vlspltgen_loc'
    157158          call vlspltgen_loc( q,iadv, 2., massem, wg ,
    158159     *                        pbarug,pbarvg,dtvr,p,
    159160     *                        pk,teta )
     161
     162          write(*,*) 'advtrac 162: apres appel vlspltgen_loc'
     163      if (ok_iso_verif) then
     164           call check_isotopes(q,ijb_u,ije_u,'advtrac 162')
     165      endif !if (ok_iso_verif) then
    160166
    161167#ifdef DEBUG_IO     
     
    356362c$OMP END DO
    357363
    358        CALL qminimum_loc( q, 2, finmasse )
     364        ! CRisi: on passe nqtot et non nq
     365       CALL qminimum_loc( q, nqtot, finmasse )
    359366
    360367      endif ! of if (planet_type=="earth")
  • LMDZ5/trunk/libf/dyn3dmem/caladvtrac_loc.F

    r1907 r2270  
    5656!$OMP THREADPRIVATE(Request_vanleer)
    5757
    58            
     58      write(*,*) 'caladvtrac 58: entree'     
    5959      ijbu=ij_begin
    6060      ijeu=ij_end
     
    109109
    110110      IF ( iadvtr.EQ.iapp_tracvl ) THEN
     111      write(*,*) 'caladvtrac 133'
    111112c$OMP MASTER
    112113        call suspend_timer(timer_caldyn)
     
    183184         CALL WriteField_u('wg1',wg_adv)
    184185#endif       
     186      write(*,*) 'caladvtrac 185' 
    185187      CALL advtrac_loc( pbarug_adv,pbarvg_adv,wg_adv,
    186188     *             p_adv,  massem_adv,q_adv, teta_adv,
    187      .             pk_adv)
     189     .             pk_adv)     
     190      write(*,*) 'caladvtrac 189'
    188191
    189192
  • LMDZ5/trunk/libf/dyn3dmem/dynetat0_loc.F

    r1939 r2270  
    366366           write(lunout,*)"Il est donc initialise a zero"
    367367           q(:,:,iq)=0.
     368
     369           ! CRisi: pour les isotopes, on peut faire init théorique
     370           ! distill de Rayleigh très simplifiée
     371           if (ok_isotopes) then
     372              if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.0)) then
     373                q(:,:,iq)=q(:,:,iqpere(iq))                             &
     374     &                   *tnat(iso_num(iq))                             &
     375     &                   *(q(:,:,iqpere(iq))/30.e-3)                    &
     376     &                   **(alpha_ideal(iso_num(iq))-1)
     377              endif
     378              if ((iso_num(iq).gt.0).and.(zone_num(iq).eq.1)) then
     379                  q(:,:,iq)=q(:,:,iqiso(iso_indnum(iq),phase_num(iq)))
     380              endif 
     381           endif !if (ok_isotopes) then       
     382
    368383        ELSE
    369384#ifdef NC_DOUBLE
     
    380395
    381396        ENDIF
    382       ENDDO
     397      ENDDO !DO iq=1,nqtot
     398
     399      if (ok_iso_verif) then
     400         call check_isotopes(q,ijb_u,ije_u,'dynetat0_loc')
     401      endif !if (ok_iso_verif) then
    383402
    384403      DEALLOCATE(q_glo)
  • LMDZ5/trunk/libf/dyn3dmem/iniacademic_loc.F90

    r2087 r2270  
    77  use exner_hyb_m, only: exner_hyb
    88  use exner_milieu_m, only: exner_milieu
    9   USE infotrac, ONLY : nqtot
     9  USE infotrac, ONLY: nqtot,niso_possibles,ok_isotopes,iqpere,ok_iso_verif,tnat,alpha_ideal, &
     10        & iqiso,phase_num,iso_indnum,iso_num,zone_num
    1011  USE control_mod, ONLY: day_step,planet_type
    1112  USE parallel_lmdz, ONLY: ijb_u, ije_u, ijb_v, ije_v
     
    110111  ztot0      = 0.
    111112  stot0      = 0.
    112   ang0       = 0.
     113  ang0       = 0.     
    113114
    114115  if (llm == 1) then
     
    269270        if (planet_type=="earth") then
    270271           ! Earth: first two tracers will be water
     272
    271273           do i=1,nqtot
    272274              if (i == 1) q(ijb_u:ije_u,:,i)=1.e-10
    273275              if (i == 2) q(ijb_u:ije_u,:,i)=1.e-15
    274276              if (i.gt.2) q(ijb_u:ije_u,:,i)=0.
     277
     278              ! CRisi: init des isotopes
     279              ! distill de Rayleigh très simplifiée
     280              if (ok_isotopes) then
     281                if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then         
     282                   q(ijb_u:ije_u,:,i)=q(ijb_u:ije_u,:,iqpere(i))       &
     283      &                  *tnat(iso_num(i))                             &
     284      &                  *(q(ijb_u:ije_u,:,iqpere(i))/30.e-3)                              &
     285     &                   **(alpha_ideal(iso_num(i))-1)
     286                endif               
     287                if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then
     288                  q(ijb_u:ije_u,:,i)=q(ijb_u:ije_u,:,iqiso(iso_indnum(i),phase_num(i)))
     289                endif
     290              endif !if (ok_isotopes) then
     291
    275292           enddo
    276293        else
    277294           q(ijb_u:ije_u,:,:)=0
    278295        endif ! of if (planet_type=="earth")
     296
     297        if (ok_iso_verif) then
     298           call check_isotopes(q,ijb_u,ije_u,'iniacademic_loc')
     299        endif !if (ok_iso_verif) then
    279300
    280301        ! add random perturbation to temperature
  • LMDZ5/trunk/libf/dyn3dmem/integrd_loc.F

    r2110 r2270  
    1111      USE write_field
    1212      USE integrd_mod
     13      USE infotrac, ONLY: ok_iso_verif ! ajout CRisi
    1314      IMPLICIT NONE
    1415
     
    8687      INTEGER :: ierr
    8788
     89      !write(*,*) 'integrd 88: entree, nq=',nq
    8890c-----------------------------------------------------------------------
     91
     92        if (ok_iso_verif) then
     93           call check_isotopes(q,ijb,ije,'integrd 92')
     94        endif !if (ok_iso_verif) then
     95
    8996c$OMP BARRIER     
    9097      if (pole_nord) THEN
     
    125132      DO 2 ij = ijb,ije
    126133       pscr (ij)    = ps0(ij)
    127        ps (ij)      = psm1(ij) + dt * dp(ij)
     134       ps (ij)      = psm1(ij) + dt * dp(ij)     
     135
    128136   2  CONTINUE
     137
    129138c$OMP END DO 
    130139c$OMP BARRIER
     
    214223c$OMP END MASTER
    215224c$OMP BARRIER
     225      !write(*,*) 'integrd 217' 
    216226c
    217227c  ... Calcul  de la nouvelle masse d'air au dernier temps integre t+1 ...
     
    219229
    220230      CALL pression_loc ( ip1jmp1, ap, bp, ps, p )
     231
    221232c$OMP BARRIER
    222233      CALL massdair_loc (     p  , masse         )
     
    334345           ENDDO
    335346          ENDDO
     347         
    336348c$OMP END DO NOWAIT
    337349c$OMP BARRIER
    338350
     351        if (ok_iso_verif) then
     352           call check_isotopes(q,ijb,ije,'integrd 342')
     353        endif !if (ok_iso_verif) then
     354
     355          !write(*,*) 'integrd 341'
    339356          CALL qminimum_loc( q, nq, deltap )
     357          !write(*,*) 'integrd 343'
     358
     359        if (ok_iso_verif) then
     360           call check_isotopes(q,ijb,ije,'integrd 346')
     361        endif !if (ok_iso_verif) then
    340362c
    341363c    .....  Calcul de la valeur moyenne, unique  aux poles pour  q .....
     
    387409     
    388410      ENDIF
     411
     412        if (ok_iso_verif) then
     413           call check_isotopes(q,ijb,ije,'integrd 409')
     414        endif !if (ok_iso_verif) then
    389415     
    390416! Ehouarn: forget about finvmaold
     
    404430
    40543115    continue
     432          !write(*,*) 'integrd 410'
    406433
    407434c$OMP DO SCHEDULE(STATIC)
  • LMDZ5/trunk/libf/dyn3dmem/leapfrog_loc.F

    r2221 r2270  
    200200      LOGICAL, SAVE :: firstcall=.TRUE.
    201201      TYPE(distrib),SAVE :: new_dist
     202
     203      if (ok_iso_verif) then
     204         call check_isotopes(q0,ijb_u,ije_u,'leapfrog204: debut')
     205      endif !if (ok_iso_verif) then
    202206     
    203207c$OMP MASTER
     
    219223      itaufinp1 = itaufin +1
    220224
     225      if (ok_iso_verif) then
     226        call check_isotopes(q0,ijb_u,ije_u,'leapfrog 226')
     227      endif !if (ok_iso_verif) then
     228
    221229      itau = 0
    222230      physic=.true.
     
    231239      phis=phis0
    232240      q=q0
     241
     242      if (ok_iso_verif) then
     243        call check_isotopes(q,ijb_u,ije_u,'leapfrog 239')
     244      endif !if (ok_iso_verif) then
    233245     
    234246!      iday = day_ini+itau/day_step
     
    296308
    297309   1  CONTINUE ! Matsuno Forward step begins here
    298 
     310      write(*,*) 'leapfrog 298: itau=',itau
    299311      jD_cur = jD_ref + day_ini - day_ref +                             &
    300312     &          itau/day_step
     
    306318      endif
    307319
     320        if (ok_iso_verif) then
     321           call check_isotopes(q,ijb_u,ije_u,'leapfrog 321')
     322        endif !if (ok_iso_verif) then
    308323
    309324#ifdef CPP_IOIPSL
     
    384399cym      call minmax(ijp1llm,q(:,:,3),zqmin,zqmax)
    385400
     401
     402        if (ok_iso_verif) then
     403           call check_isotopes(q,ijb_u,ije_u,'leapfrog 400')
     404        endif !if (ok_iso_verif) then
     405
    386406   2  CONTINUE ! Matsuno backward or leapfrog step begins here
     407
     408
     409        if (ok_iso_verif) then
     410           call check_isotopes(q,ijb_u,ije_u,'leapfrog 402')
     411        endif !if (ok_iso_verif) then
    387412
    388413c$OMP MASTER
     
    455480c$OMP END MASTER     
    456481
     482
     483        if (ok_iso_verif) then
     484           call check_isotopes(q,ijb_u,ije_u,'leapfrog 471')
     485        endif !if (ok_iso_verif) then
    457486
    458487!ym  PAS D'AJUSTEMENT POUR LE MOMENT     
     
    574603     
    575604     
     605        if (ok_iso_verif) then
     606           call check_isotopes(q,ijb_u,ije_u,'leapfrog 589')
     607        endif !if (ok_iso_verif) then
    576608     
    577609c-----------------------------------------------------------------------
     
    635667      ! compute geopotential phi()
    636668      CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
    637 
     669       
     670        if (ok_iso_verif) then
     671           call check_isotopes(q,ijb_u,ije_u,'leapfrog 651')
     672        endif !if (ok_iso_verif) then
    638673     
    639674      call VTb(VTcaldyn)
     
    644679!      CALL FTRACE_REGION_BEGIN("caldyn")
    645680      time = jD_cur + jH_cur
     681
    646682      CALL caldyn_loc
    647683     $  ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis ,
     
    670706c   -------------------------------------------------------------
    671707
     708        if (ok_iso_verif) then
     709           call check_isotopes(q,ijb_u,ije_u,
     710     &           'leapfrog 686: avant caladvtrac')
     711        endif !if (ok_iso_verif) then
    672712     
    673713      IF( forward. OR . leapf )  THEN
    674714! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step
     715        write(*,*) 'leapfrog 679: avant CALL caladvtrac_loc'
    675716         CALL caladvtrac_loc(q,pbaru,pbarv,
    676717     *        p, masse, dq,  teta,
    677718     .        flxw,pk, iapptrac)
     719
     720         write(*,*) 'leapfrog 719'
     721         if (ok_iso_verif) then
     722           call check_isotopes(q,ijb_u,ije_u,
     723     &           'leapfrog 698: apres caladvtrac')
     724         endif !if (ok_iso_verif) then
    678725
    679726!      do j=1,nqtot
     
    708755!       CALL FTRACE_REGION_BEGIN("integrd")
    709756
    710        CALL integrd_loc ( 2,vcovm1,ucovm1,tetam1,psm1,massem1 ,
     757       write(*,*) 'leapfrog 720'
     758        if (ok_iso_verif) then
     759           call check_isotopes(q,ijb_u,ije_u,'leapfrog 756')
     760        endif !if (ok_iso_verif) then
     761
     762       ! CRisi: pourquoi aller jusqu'à 2 et non pas jusqu'à nqtot??
     763       CALL integrd_loc ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 ,
    711764     $         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis)
    712765!     $              finvmaold                                    )
    713766
     767       write(*,*) 'leapfrog 724'       
     768        if (ok_iso_verif) then
     769           call check_isotopes(q,ijb_u,ije_u,'leapfrog 762')
     770        endif !if (ok_iso_verif) then
     771 
    714772!       CALL FTRACE_REGION_END("integrd")
    715773c$OMP BARRIER
     
    724782      call WriteField_u('ps_int',ps)
    725783#endif   
     784
     785        if (ok_iso_verif) then
     786           call check_isotopes(q,ijb_u,ije_u,'leapfrog 775')
     787        endif !if (ok_iso_verif) then
     788
    726789c      do j=1,nqtot
    727790c        call WriteField_p('q'//trim(int2str(j)),
     
    10821145       ENDIF ! of IF( apphys )
    10831146
     1147        if (ok_iso_verif) then
     1148           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1132')
     1149        endif !if (ok_iso_verif) then
     1150        write(*,*) 'leapfrog 1134: iflag_phys=',iflag_phys
     1151
    10841152      IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
    10851153c$OMP MASTER
     
    11461214
    11471215cc$OMP END PARALLEL
     1216        if (ok_iso_verif) then
     1217           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1196')
     1218        endif !if (ok_iso_verif) then
    11481219
    11491220c-----------------------------------------------------------------------
    11501221c   dissipation horizontale et verticale  des petites echelles:
    11511222c   ----------------------------------------------------------
    1152 
     1223      write(*,*) 'leapfrog 1163: apdiss=',apdiss
    11531224      IF(apdiss) THEN
    11541225     
     
    13791450c                call abort_gcm(modname,abort_message,0)
    13801451c              ENDIF
    1381        
     1452
     1453        if (ok_iso_verif) then
     1454           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1430')
     1455        endif !if (ok_iso_verif) then     
     1456 
    13821457c   ********************************************************************
    13831458c   ********************************************************************
     
    14551530      ENDIF
    14561531     
     1532        if (ok_iso_verif) then
     1533           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1509')
     1534        endif !if (ok_iso_verif) then
     1535
    14571536      IF ( .NOT.purmats ) THEN
    14581537c       ........................................................
     
    15261605            ENDIF
    15271606
     1607        if (ok_iso_verif) then
     1608           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1584')
     1609        endif !if (ok_iso_verif) then
     1610
    15281611c-----------------------------------------------------------------------
    15291612c   ecriture de la bande histoire:
     
    15621645            ENDIF ! of IF (itau.EQ.itaufin)
    15631646
     1647        if (ok_iso_verif) then
     1648           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1624')
     1649        endif !if (ok_iso_verif) then
     1650
    15641651c-----------------------------------------------------------------------
    15651652c   gestion de l'integration temporelle:
     
    15961683
    15971684      ELSE ! of IF (.not.purmats)
     1685
     1686
     1687        if (ok_iso_verif) then
     1688           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1664')
     1689        endif !if (ok_iso_verif) then
    15981690
    15991691c       ........................................................
     
    16311723
    16321724            ELSE ! of IF(forward) i.e. backward step
     1725
     1726             
     1727        if (ok_iso_verif) then
     1728           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1698')
     1729        endif !if (ok_iso_verif) then 
    16331730
    16341731              IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
     
    16831780            ENDIF ! of IF (forward)
    16841781
     1782
     1783        if (ok_iso_verif) then
     1784           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1750')
     1785        endif !if (ok_iso_verif) then
     1786
    16851787      END IF ! of IF(.not.purmats)
    16861788c$OMP MASTER
  • LMDZ5/trunk/libf/dyn3dmem/qminimum_loc.F

    r1907 r2270  
    1       SUBROUTINE qminimum_loc( q,nq,deltap )
     1      SUBROUTINE qminimum_loc( q,nqtot,deltap )
    22      USE parallel_lmdz
     3      USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif
    34      IMPLICIT none
    45c
     
    1011#include "comvert.h"
    1112c
    12       INTEGER nq
    13       REAL q(ijb_u:ije_u,llm,nq), deltap(ijb_u:ije_u,llm)
     13      INTEGER nqtot ! CRisi: on remplace nq par nqtot
     14      REAL q(ijb_u:ije_u,llm,nqtot), deltap(ijb_u:ije_u,llm)
    1415c
    1516      INTEGER iq_vap, iq_liq
     
    2728      INTEGER i, k, iq
    2829      REAL zx_defau, zx_abc, zx_pump(ijb_u:ije_u), pompe
     30
     31      real zx_defau_diag(ijb_u:ije_u,llm,2)
     32      real q_follow(ijb_u:ije_u,llm,2)
    2933c
    3034      REAL SSUM
     
    3842      INTEGER Index_pump(ij_end-ij_begin+1)
    3943      INTEGER nb_pump
     44      INTEGER ixt
     45      INTEGER iso_verif_noNaN_nostop
    4046c
    4147c Quand l'eau liquide est trop petite (ou negative), on prend
     
    4450c
    4551
     52        write(*,*) 'qminimum 52: entree'
     53        if (ok_iso_verif) then
     54           call check_isotopes(q,ij_begin,ij_end,'qminimum 52')   
     55        endif !if (ok_iso_verif) then     
     56
    4657      ijb=ij_begin
    4758      ije=ij_end
    4859
     60      zx_defau_diag(ijb:ije,:,:)=0.0
     61      q_follow(ijb:ije,:,:)=q(ijb:ije,:,:) 
     62
     63      !write(*,*) 'qminimum 57'
    4964c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
    5065      DO 1000 k = 1, llm
    5166      DO 1040 i = ijb, ije
    5267            if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
     68
     69              if (ok_isotopes) then
     70                 zx_defau_diag(i,k,iq_liq)=AMAX1
     71     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
     72              endif !if (ok_isotopes) then
     73
    5374               q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
    5475               q(i,k,iq_liq) = seuil_liq
     
    6081c --->  SYNCHRO OPENMP ICI
    6182
     83
    6284c
    6385c Quand l'eau vapeur est trop faible (ou negative), on complete
    6486c le defaut en prennant de l'eau vapeur de la couche au-dessous.
    6587c
     88      !write(*,*) 'qminimum 81'
    6689      iq = iq_vap
    6790c
     
    7093c$OMP DO SCHEDULE(STATIC)
    7194      DO i = ijb, ije
     95
    7296         if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
     97
     98            if (ok_isotopes) then
     99              zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
     100            endif !if (ok_isotopes) then
     101
    73102            q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
    74103     &           deltap(i,k) / deltap(i,k-1)
    75104            q(i,k,iq)   =  seuil_vap 
     105
    76106         endif
    77107      ENDDO
     
    79109      ENDDO
    80110c$OMP BARRIER
     111
    81112c
    82113c Quand il s'agit de la premiere couche au-dessus du sol, on
    83114c doit imprimer un message d'avertissement (saturation possible).
    84115c
     116      !write(*,*) 'qminimum 106'
    85117      nb_pump=0
    86118c$OMP DO SCHEDULE(STATIC)
     
    103135         ENDDO
    104136      ENDIF
     137
     138      !write(*,*) 'qminimum 128'
     139      if (ok_isotopes) then
     140      ! CRisi: traiter de même les traceurs d'eau
     141      ! Mais il faut les prendre à l'envers pour essayer de conserver la
     142      ! masse.
     143      ! 1) pompage dans le sol 
     144      ! On suppose que ce pompage se fait sans isotopes -> on ne modifie
     145      ! rien ici et on croise les doigts pour que ça ne soit pas trop
     146      ! génant
     147      DO i = ijb, ije
     148        if (zx_pump(i).gt.0.0) then
     149          q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
     150        endif !if (zx_pump(i).gt.0.0) then
     151      enddo !DO i = ijb, ije 
     152
     153      ! 2) transfert de vap vers les couches plus hautes
     154      !write(*,*) 'qminimum 139'
     155      do k=2,llm
     156        DO i = ijb, ije
     157          if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
     158              ! on ajoute la vapeur en k             
     159              do ixt=1,ntraciso
     160               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
     161     :              +zx_defau_diag(i,k,iq_vap)
     162     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     163               
     164              if (ok_iso_verif) then
     165                if (iso_verif_noNaN_nostop(q(i,k,iqiso(ixt,iq_vap)),
     166     :                   'qminimum 155').eq.1) then
     167                   write(*,*) 'i,k,ixt=',i,k,ixt
     168                   write(*,*) 'q_follow(i,k-1,iq_vap)=',
     169     :                   q_follow(i,k-1,iq_vap)
     170                   write(*,*) 'q(i,k,iqiso(ixt,iq_vap))=',
     171     :                   q(i,k,iqiso(ixt,iq_vap))
     172                   write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
     173     :                   zx_defau_diag(i,k,iq_vap)
     174                   write(*,*) 'q(i,k-1,iqiso(ixt,iq_vap))=',
     175     :                   q(i,k-1,iqiso(ixt,iq_vap))
     176                   stop
     177                endif
     178              endif
     179
     180              ! et on la retranche en k-1
     181               q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))
     182     :              -zx_defau_diag(i,k,iq_vap)
     183     :              *deltap(i,k)/deltap(i,k-1)
     184     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     185
     186               if (ok_iso_verif) then
     187                if (iso_verif_noNaN_nostop(q(i,k-1,iqiso(ixt,iq_vap)),
     188     :                   'qminimum 175').eq.1) then
     189                   write(*,*) 'k,i,ixt=',k,i,ixt
     190                   write(*,*) 'q_follow(i,k-1,iq_vap)=',
     191     :                   q_follow(i,k-1,iq_vap)
     192                   write(*,*) 'q(i,k,iqiso(ixt,iq_vap))=',
     193     :                   q(i,k,iqiso(ixt,iq_vap))
     194                   write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
     195     :                   zx_defau_diag(i,k,iq_vap)
     196                   write(*,*) 'q(i,k-1,iqiso(ixt,iq_vap))=',
     197     :                   q(i,k-1,iqiso(ixt,iq_vap))
     198                   stop
     199                endif
     200              endif
     201
     202              enddo !do ixt=1,niso
     203              q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
     204     :               +zx_defau_diag(i,k,iq_vap)
     205              q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
     206     :               -zx_defau_diag(i,k,iq_vap)
     207     :              *deltap(i,k)/deltap(i,k-1)
     208          endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     209        enddo !DO i = 1, ip1jmp1       
     210       enddo !do k=2,llm
     211
     212        if (ok_iso_verif) then
     213           call check_isotopes(q,ijb,ije,'qminimum 168')
     214        endif !if (ok_iso_verif) then
     215       
     216     
     217        ! 3) transfert d'eau de la vapeur au liquide
     218        !write(*,*) 'qminimum 164'
     219        do k=1,llm
     220        DO i = ijb, ije
     221          if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
     222
     223              ! on ajoute eau liquide en k en k             
     224              do ixt=1,ntraciso
     225               q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))
     226     :              +zx_defau_diag(i,k,iq_liq)
     227     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
     228              ! et on la retranche à la vapeur en k
     229               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
     230     :              -zx_defau_diag(i,k,iq_liq)
     231     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     232              enddo !do ixt=1,niso
     233              q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
     234     :               +zx_defau_diag(i,k,iq_liq)
     235              q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
     236     :               -zx_defau_diag(i,k,iq_liq)
     237          endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     238        enddo !DO i = 1, ip1jmp1
     239       enddo !do k=2,llm 
     240
     241        if (ok_iso_verif) then
     242           call check_isotopes(q,ijb,ije,'qminimum 197')
     243        endif !if (ok_iso_verif) then
     244
     245      endif !if (ok_isotopes) then
     246      !write(*,*) 'qminimum 188'
    105247c
    106248      RETURN
  • LMDZ5/trunk/libf/dyn3dmem/vlsplt_loc.F

    r1907 r2270  
    22! $Id$
    33!
    4       SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x)
     4      SUBROUTINE vlx_loc(q,pente_max,masse,u_m,ijb_x,ije_x,iq)
    55
    66c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    1414c   --------------------------------------------------------------------
    1515      USE parallel_lmdz
     16      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    1617      IMPLICIT NONE
    1718c
     
    2526c   Arguments:
    2627c   ----------
    27       REAL masse(ijb_u:ije_u,llm),pente_max
    28       REAL u_m( ijb_u:ije_u,llm ),pbarv( iip1,jjb_v:jje_v,llm)
    29       REAL q(ijb_u:ije_u,llm)
    30       REAL w(ijb_u:ije_u,llm)
     28      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
     29      REAL u_m( ijb_u:ije_u,llm),pbarv( iip1,jjb_v:jje_v,llm)
     30      REAL q(ijb_u:ije_u,llm,nqtot) ! CRisi: ajout dimension nqtot
     31      REAL w(ijb_u:ije_u,llm)
     32      INTEGER iq ! CRisi
    3133c
    3234c      Local
     
    4244      REAL u_mq(ijb_u:ije_u,llm)
    4345
     46      REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
     47      INTEGER ifils,iq2 ! CRisi
     48
    4449      Logical extremum
    4550
     
    5156      INTEGER ijb,ije,ijb_x,ije_x
    5257     
     58      write(*,*) 'vlsplt 58: entree dans vlx_loc, iq,ijb_x=',
     59     &   iq,ijb_x
    5360c   calcul de la pente a droite et a gauche de la maille
    5461
     
    6471c   calcul des pentes avec limitation, Van Leer scheme I:
    6572c   -----------------------------------------------------
    66 
     73      ! on a besoin de q entre ijb et ije
    6774c   calcul de la pente aux points u
    6875c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)         
     
    7077           
    7178            DO ij=ijb,ije-1
    72                dxqu(ij)=q(ij+1,l)-q(ij,l)
     79               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    7380c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
    74 c              sigu(ij)=u_m(ij,l)/masse(ij,l)
     81c              sigu(ij)=u_m(ij,l)/masse(ij,l,iq)
    7582            ENDDO
    7683            DO ij=ijb+iip1-1,ije,iip1
     
    126133         DO l = 1, llm
    127134            DO ij=ijb,ije-1
    128                dxqu(ij)=q(ij+1,l)-q(ij,l)
     135               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    129136            ENDDO
    130137            DO ij=ijb+iip1-1,ije,iip1
     
    147154      ENDIF ! (pente_max.lt.-1.e-5)
    148155
     156      write(*,*) 'vlx 156: iq,ijb_x=',iq,ijb_x
     157
    149158c   bouclage de la pente en iip1:
    150159c   -----------------------------
     
    168177      DO l=1,llm
    169178       DO ij=ijb,ije-1
    170           zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l),
    171      ,                     1.+u_m(ij,l)/masse(ij+1,l),
    172      ,                     u_m(ij,l))
     179          zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
     180     ,                     1.+u_m(ij,l)/masse(ij+1,l,iq),
     181     ,                     u_m(ij,l,iq))
    173182          zdum(ij,l)=0.5*zdum(ij,l)
    174183          u_mq(ij,l)=cvmgp(
    175      ,                q(ij,l)+zdum(ij,l)*dxq(ij,l),
    176      ,                q(ij+1,l)-zdum(ij,l)*dxq(ij+1,l),
     184     ,                q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
     185     ,                q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
    177186     ,                u_m(ij,l))
    178187          u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
     
    185194c       print*,'Cumule ....'
    186195c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     196        ! on a besoin de masse entre ijb et ije
    187197      DO l=1,llm
    188198       DO ij=ijb,ije-1
    189 c       print*,'masse(',ij,')=',masse(ij,l)
     199c       print*,'masse(',ij,')=',masse(ij,l,iq)
    190200          IF (u_m(ij,l).gt.0.) THEN
    191              zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
    192              u_mq(ij,l)=u_m(ij,l)*(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l))
     201             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
     202             u_mq(ij,l)=u_m(ij,l)*(q(ij,l,iq)
     203     :           +0.5*zdum(ij,l)*dxq(ij,l))
    193204          ELSE
    194              zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
    195              u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l))
     205             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
     206             u_mq(ij,l)=u_m(ij,l)*(q(ij+1,l,iq)
     207     :           -0.5*zdum(ij,l)*dxq(ij+1,l))
    196208          ENDIF
    197209       ENDDO
     
    215227c$OMP END DO NOWAIT
    216228c       print*,'Ok test 1'
     229
    217230c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    218231      DO l=1,llm
     
    223236c$OMP END DO NOWAIT
    224237c        print*,'Ok test 2'
    225 
     238       
    226239
    227240c   traitement special pour le cas ou on advecte en longitude plus que le
     
    247260c     &       ,'contenu de la maille : ',n0
    248261c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     262
     263
    249264         DO l=1,llm
    250265            IF(nl(l).gt.0) THEN
     
    258273               ENDDO
    259274               niju=iju
    260 c              PRINT*,'niju,nl',niju,nl(l)
     275               PRINT*,'vlx 278, niju,nl',niju,nl(l)
    261276
    262277c  traitement des mailles
     
    270285                     i=ijq-(j-1)*iip1
    271286c   accumulation pour les mailles completements advectees
    272                      do while(zu_m.gt.masse(ijq,l))
    273                         u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
    274                         zu_m=zu_m-masse(ijq,l)
     287                     do while(zu_m.gt.masse(ijq,l,iq))
     288                        u_mq(ij,l)=u_mq(ij,l)
     289     &                          +q(ijq,l,iq)*masse(ijq,l,iq)
     290                        zu_m=zu_m-masse(ijq,l,iq)
    275291                        i=mod(i-2+iim,iim)+1
    276292                        ijq=(j-1)*iip1+i
     
    278294c   ajout de la maille non completement advectee
    279295                     u_mq(ij,l)=u_mq(ij,l)+zu_m*
    280      &               (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
     296     &               (q(ijq,l,iq)+0.5*
     297     &               (1.-zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    281298                  ELSE
    282299                     ijq=ij+1
    283300                     i=ijq-(j-1)*iip1
    284301c   accumulation pour les mailles completements advectees
    285                      do while(-zu_m.gt.masse(ijq,l))
    286                         u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
    287                         zu_m=zu_m+masse(ijq,l)
     302                     do while(-zu_m.gt.masse(ijq,l,iq))
     303                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
     304     &                           *masse(ijq,l,iq)
     305                        zu_m=zu_m+masse(ijq,l,iq)
    288306                        i=mod(i,iim)+1
    289307                        ijq=(j-1)*iip1+i
    290308                     ENDDO
    291309c   ajout de la maille non completement advectee
    292                      u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
    293      &               0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
     310                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
     311     &               0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    294312                  ENDIF
    295313               ENDDO
     
    299317cym      ENDIF  ! n0.gt.0
    3003189999    continue
    301 
    302319
    303320c   bouclage en latitude
     
    311328c$OMP END DO NOWAIT
    312329
     330! CRisi: appel récursif de l'advection sur les fils.
     331! Il faut faire ça avant d'avoir mis à jour q et masse
     332
     333      write(*,*) 'vlsplt 326: iq,ijb_x,nqfils(iq)=',iq,ijb_x,nqfils(iq)
     334
     335      if (nqfils(iq).gt.0) then 
     336       do ifils=1,nqdesc(iq)
     337         iq2=iqfils(ifils,iq)
     338c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     339         DO l=1,llm
     340          DO ij=ijb,ije
     341           ! On a besoin de q et masse seulement entre ijb et ije. On ne
     342           ! les calcule donc que de ijb à ije
     343           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     344           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     345          enddo   
     346         enddo
     347c$OMP END DO NOWAIT
     348        enddo !do ifils=1,nqdesc(iq)
     349        do ifils=1,nqfils(iq)
     350         iq2=iqfils(ifils,iq)
     351         call vlx_loc(Ratio,pente_max,masseq,u_mq,ijb_x,ije_x,iq2)
     352        enddo !do ifils=1,nqfils(iq)
     353      endif !if (nqfils(iq).gt.0) then
     354! end CRisi
     355
     356      write(*,*) 'vlsplt 360: iq,ijb_x=',iq,ijb_x
     357
    313358c   calcul des tENDances
    314359c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    315360      DO l=1,llm
    316361         DO ij=ijb+1,ije
    317             new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
    318             q(ij,l)=(q(ij,l)*masse(ij,l)+
    319      &      u_mq(ij-1,l)-u_mq(ij,l))
    320      &      /new_m
    321             masse(ij,l)=new_m
     362            new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
     363            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
     364     &        u_mq(ij-1,l)-u_mq(ij,l))
     365     &        /new_m
     366            masse(ij,l,iq)=new_m
    322367         ENDDO
    323368c   ModIF Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
    324369         DO ij=ijb+iip1-1,ije,iip1
    325             q(ij-iim,l)=q(ij,l)
    326             masse(ij-iim,l)=masse(ij,l)
    327          ENDDO
    328       ENDDO
    329 c$OMP END DO NOWAIT
     370            q(ij-iim,l,iq)=q(ij,l,iq)
     371            masse(ij-iim,l,iq)=masse(ij,l,iq)
     372         ENDDO
     373      ENDDO
     374c$OMP END DO NOWAIT
     375      write(*,*) 'vlsplt 380: iq,ijb_x=',iq,ijb_x
     376
     377! retablir les fils en rapport de melange par rapport a l'air:
     378      ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio
     379      ! puis on boucle en longitude
     380      if (nqfils(iq).gt.0) then 
     381       do ifils=1,nqdesc(iq)
     382         iq2=iqfils(ifils,iq) 
     383c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     384         DO l=1,llm
     385          DO ij=ijb+1,ije
     386            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     387          enddo
     388          DO ij=ijb+iip1-1,ije,iip1
     389             q(ij-iim,l,iq2)=q(ij,l,iq2)
     390          enddo ! DO ij=ijb+iip1-1,ije,iip1
     391         enddo !DO l=1,llm
     392c$OMP END DO NOWAIT
     393        enddo !do ifils=1,nqdesc(iq)
     394      endif !if (nqfils(iq).gt.0) then
     395
     396      write(*,*) 'vlsplt 399: iq,ijb_x=',iq,ijb_x
    330397c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
    331398c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
     
    336403
    337404
    338       SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v)
     405      SUBROUTINE vly_loc(q,pente_max,masse,masse_adv_v,iq)
    339406c
    340407c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    349416c   --------------------------------------------------------------------
    350417      USE parallel_lmdz
     418      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
    351419      IMPLICIT NONE
    352420c
     
    361429c   Arguments:
    362430c   ----------
    363       REAL masse(ijb_u:ije_u,llm),pente_max
     431      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
    364432      REAL masse_adv_v( ijb_v:ije_v,llm)
    365       REAL q(ijb_u:ije_u,llm), dq( ijb_u:ije_u,llm)
     433      REAL q(ijb_u:ije_u,llm,nqtot), dq( ijb_u:ije_u,llm)
     434      INTEGER iq ! CRisi
    366435c
    367436c      Local
     
    392461      SAVE airej2,airejjm
    393462c$OMP THREADPRIVATE(airej2,airejjm)
     463
     464      REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
     465      INTEGER ifils,iq2 ! CRisi
    394466c
    395467c
     
    401473      INTEGER ijb,ije
    402474
     475      ijb=ij_begin-2*iip1
     476      ije=ij_end+2*iip1 
     477      if (pole_nord) ijb=ij_begin
     478      if (pole_sud)  ije=ij_end
     479
    403480      IF(first) THEN
    404 c         PRINT*,'Shema  Amont nouveau  appele dans  Vanleer   '
     481         PRINT*,'Shema  Amont nouveau  appele dans  Vanleer   '
    405482         first=.false.
    406483         do i=2,iip1
     
    434511      if (pole_nord) then
    435512        DO i = 1, iim
    436           airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
     513          airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)
    437514        ENDDO
    438515        qpns   = SSUM( iim,  airescb ,1 ) / airej2
     
    441518      if (pole_sud) then
    442519        DO i = 1, iim
    443           airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
     520          airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)
    444521        ENDDO
    445522        qpsn   = SSUM( iim,  airesch ,1 ) / airejjm
    446523      endif
    447524     
    448      
    449 
    450525c   calcul des pentes aux points v
    451526
     
    455530      if (pole_sud)  ije=ij_end-iip1
    456531     
     532      ! on a besoin de q entre ij_begin-2*iip1 et ij_end+2*iip1
     533      ! Si pole sud, entre ij_begin-2*iip1 et ij_end
     534      ! Si pole Nord, entre ij_begin et ij_end+2*iip1
    457535      DO ij=ijb,ije
    458          dyqv(ij)=q(ij,l)-q(ij+iip1,l)
     536         dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
    459537         adyqv(ij)=abs(dyqv(ij))
    460538      ENDDO
     539 
    461540
    462541c   calcul des pentes aux points scalaires
     
    475554      IF (pole_nord) THEN
    476555        DO ij=1,iip1
    477            dyq(ij,l)=qpns-q(ij+iip1,l)
     556           dyq(ij,l)=qpns-q(ij+iip1,l,iq)
    478557        ENDDO
    479558       
     
    497576
    498577        DO ij=1,iip1
    499            dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
     578           dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn
    500579        ENDDO
    501580
     
    633712       DO ij=ijb,ije
    634713          IF(masse_adv_v(ij,l).gt.0) THEN
    635               qbyv(ij,l)=q(ij+iip1,l)+dyq(ij+iip1,l)*
    636      ,                   0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l))
     714              qbyv(ij,l)=q(ij+iip1,l,iq)+dyq(ij+iip1,l)*
     715     ,                   0.5*(1.-masse_adv_v(ij,l)
     716     ,                   /masse(ij+iip1,l,iq))
    637717          ELSE
    638               qbyv(ij,l)=q(ij,l)-dyq(ij,l)*
    639      ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l))
     718              qbyv(ij,l)=q(ij,l,iq)-dyq(ij,l)*
     719     ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq))
    640720          ENDIF
    641721          qbyv(ij,l)=masse_adv_v(ij,l)*qbyv(ij,l)
     
    643723      ENDDO
    644724c$OMP END DO NOWAIT
     725
     726! CRisi: appel récursif de l'advection sur les fils.
     727! Il faut faire ça avant d'avoir mis à jour q et masse
     728      write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq)
     729
     730      ijb=ij_begin-2*iip1
     731      ije=ij_end+2*iip1
     732      if (pole_nord) ijb=ij_begin
     733      if (pole_sud)  ije=ij_end
     734   
     735      if (nqfils(iq).gt.0) then 
     736       do ifils=1,nqdesc(iq)
     737         iq2=iqfils(ifils,iq)
     738c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     739         DO l=1,llm
     740         DO ij=ijb,ije
     741           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     742           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     743          enddo   
     744         enddo
     745c$OMP END DO NOWAIT
     746        enddo !do ifils=1,nqdesc(iq)
     747
     748        do ifils=1,nqfils(iq)
     749         iq2=iqfils(ifils,iq)
     750         call vly_loc(Ratio,pente_max,masseq,qbyv,iq2)
     751        enddo !do ifils=1,nqfils(iq)
     752      endif !if (nqfils(iq).gt.0) then
     753! end CRisi
    645754     
    646755      ijb=ij_begin
     
    652761      DO l=1,llm
    653762         DO ij=ijb,ije
    654             newmasse=masse(ij,l)
    655      &      +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
    656      
    657             q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
    658      &         /newmasse
    659             masse(ij,l)=newmasse
    660          ENDDO
     763            newmasse=masse(ij,l,iq)
     764     &         +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
     765
     766            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l)
     767     &         -qbyv(ij-iip1,l))/newmasse
     768
     769            masse(ij,l,iq)=newmasse
     770
     771         ENDDO
     772
     773
    661774c.-. ancienne version
    662775c        convpn=SSUM(iim,qbyv(1,l),1)/apoln
     
    665778           convpn=SSUM(iim,qbyv(1,l),1)
    666779           convmpn=ssum(iim,masse_adv_v(1,l),1)
    667            massepn=ssum(iim,masse(1,l),1)
     780           massepn=ssum(iim,masse(1,l,iq),1)
    668781           qpn=0.
    669782           do ij=1,iim
    670               qpn=qpn+masse(ij,l)*q(ij,l)
     783              qpn=qpn+masse(ij,l,iq)*q(ij,l,iq)
    671784           enddo
    672785           qpn=(qpn+convpn)/(massepn+convmpn)
    673786           do ij=1,iip1
    674               q(ij,l)=qpn
     787              q(ij,l,iq)=qpn
    675788           enddo
    676789         endif
     
    683796           convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
    684797           convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
    685            masseps=ssum(iim, masse(ip1jm+1,l),1)
     798           masseps=ssum(iim, masse(ip1jm+1,l,iq),1)
    686799           qps=0.
    687800           do ij = ip1jm+1,ip1jmp1-1
    688               qps=qps+masse(ij,l)*q(ij,l)
     801              qps=qps+masse(ij,l,iq)*q(ij,l,iq)
    689802           enddo
    690803           qps=(qps+convps)/(masseps+convmps)
    691804           do ij=ip1jm+1,ip1jmp1
    692               q(ij,l)=qps
     805              q(ij,l,iq)=qps
    693806           enddo
    694807         endif
     
    704817c        DO ij = 1,iip1
    705818c           q(ij,l)=newq
    706 c           masse(ij,l)=newmasse*aire(ij)
     819c           masse(ij,l,iq)=newmasse*aire(ij)
    707820c        ENDDO
    708821c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
     
    714827c        DO ij = ip1jm+1,ip1jmp1
    715828c           q(ij,l)=newq
    716 c           masse(ij,l)=newmasse*aire(ij)
     829c           masse(ij,l,iq)=newmasse*aire(ij)
    717830c        ENDDO
    718831c._. fin nouvelle version
    719832      ENDDO
    720833c$OMP END DO NOWAIT
     834
     835! retablir les fils en rapport de melange par rapport a l'air:
     836      ijb=ij_begin
     837      ije=ij_end
     838!      if (pole_nord) ijb=ij_begin
     839!      if (pole_sud)  ije=ij_end
     840
     841      if (nqfils(iq).gt.0) then 
     842       do ifils=1,nqdesc(iq)
     843         iq2=iqfils(ifils,iq) 
     844c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     845         DO l=1,llm
     846          DO ij=ijb,ije
     847            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     848          enddo
     849         enddo
     850c$OMP END DO NOWAIT
     851        enddo !do ifils=1,nqdesc(iq)
     852      endif !if (nqfils(iq).gt.0) then
     853
    721854
    722855      RETURN
     
    725858     
    726859     
    727       SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x)
     860      SUBROUTINE vlz_loc(q,pente_max,masse,w,ijb_x,ije_x,iq)
    728861c
    729862c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    739872      USE parallel_lmdz
    740873      USE vlz_mod
     874      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 
    741875      IMPLICIT NONE
    742876c
     
    750884c   Arguments:
    751885c   ----------
    752       REAL masse(ijb_u:ije_u,llm),pente_max
    753       REAL q(ijb_u:ije_u,llm)
    754       REAL w(ijb_u:ije_u,llm+1)
     886      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
     887      REAL q(ijb_u:ije_u,llm,nqtot)
     888      REAL w(ijb_u:ije_u,llm+1,nqtot)
     889      INTEGER iq
    755890c
    756891c      Local
     
    779914      LOGICAL,SAVE :: first=.TRUE.
    780915!$OMP THREADPRIVATE(first)
    781      
     916
     917      !REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
     918      ! Ces varibles doivent être déclarées en pointer et en save dans
     919      ! vlz_loc si on veut qu'elles soient vues par tous les threads. 
     920      INTEGER ifils,iq2 ! CRisi
    782921
    783922      IF (first) THEN
     
    787926c    sens de W
    788927
     928      write(*,*) 'vlsplt 926: entree dans vlz_loc, iq=',iq
    789929#ifdef BIDON
    790930      IF(testcpu) THEN
     
    799939      DO l=2,llm
    800940         DO ij=ijb,ije
    801             dzqw(ij,l)=q(ij,l-1)-q(ij,l)
     941            dzqw(ij,l)=q(ij,l-1,iq)-q(ij,l,iq)
    802942            adzqw(ij,l)=abs(dzqw(ij,l))
    803943         ENDDO
     
    842982c calcul de  - d( q   * w )/ d(sigma)    qu'on ajoute a  dq pour calculer dq
    843983
     984       write(*,*) 'vlz 982,ijb,ije=',ijb,ije
    844985c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    845986       DO l = 1,llm-1
    846987         do  ij = ijb,ije
    847           IF(w(ij,l+1).gt.0.) THEN
    848              sigw=w(ij,l+1)/masse(ij,l+1)
    849              wq(ij,l+1)=w(ij,l+1)*(q(ij,l+1)+0.5*(1.-sigw)*dzq(ij,l+1))
     988          IF(w(ij,l+1,iq).gt.0.) THEN
     989             sigw=w(ij,l+1,iq)/masse(ij,l+1,iq)
     990             wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l+1,iq)
     991     :           +0.5*(1.-sigw)*dzq(ij,l+1))
    850992          ELSE
    851              sigw=w(ij,l+1)/masse(ij,l)
    852              wq(ij,l+1)=w(ij,l+1)*(q(ij,l)-0.5*(1.+sigw)*dzq(ij,l))
     993             sigw=w(ij,l+1,iq)/masse(ij,l,iq)
     994             wq(ij,l+1,iq)=w(ij,l+1,iq)*(q(ij,l,iq)
     995     :           -0.5*(1.+sigw)*dzq(ij,l))
    853996          ENDIF
    854997         ENDDO
    855998       ENDDO
    856 c$OMP END DO NOWAIT
     999c$OMP END DO NOWAIT   
     1000       write(*,*) 'vlz 1001'   
    8571001
    8581002c$OMP MASTER
    8591003       DO ij=ijb,ije
    860           wq(ij,llm+1)=0.
    861           wq(ij,1)=0.
     1004          wq(ij,llm+1,iq)=0.
     1005          wq(ij,1,iq)=0.
    8621006       ENDDO
    8631007c$OMP END MASTER
    8641008c$OMP BARRIER
    8651009
     1010! CRisi: appel récursif de l'advection sur les fils.
     1011! Il faut faire ça avant d'avoir mis à jour q et masse
     1012      write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq)
     1013      if (nqfils(iq).gt.0) then 
     1014       do ifils=1,nqdesc(iq)
     1015         iq2=iqfils(ifils,iq)
     1016c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     1017         DO l=1,llm
     1018          DO ij=ijb,ije
     1019           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     1020           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
     1021           wq(ij,l,iq2)=wq(ij,l,iq)
     1022          enddo   
     1023         enddo
     1024c$OMP END DO NOWAIT
     1025        enddo !do ifils=1,nqdesc(iq)
     1026c$OMP BARRIER
     1027       
     1028        do ifils=1,nqfils(iq)
     1029         iq2=iqfils(ifils,iq)
     1030         call vlz_loc(Ratio,pente_max,masseq,wq,ijb_x,ije_x,iq2)
     1031        enddo !do ifils=1,nqfils(iq)
     1032      endif !if (nqfils(iq).gt.0) then
     1033! end CRisi 
     1034
     1035! CRisi: On rajoute ici une barrière car on veut être sur que tous les
     1036! wq soient synchronisés
     1037      write(*,*) 'vlz 1032' 
     1038c$OMP BARRIER
    8661039c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    8671040      DO l=1,llm
    8681041         DO ij=ijb,ije
    869             newmasse=masse(ij,l)+w(ij,l+1)-w(ij,l)
    870             q(ij,l)=(q(ij,l)*masse(ij,l)+wq(ij,l+1)-wq(ij,l))
     1042            newmasse=masse(ij,l,iq)+w(ij,l+1,iq)-w(ij,l,iq)
     1043            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)
     1044     &         +wq(ij,l+1,iq)-wq(ij,l,iq))
    8711045     &         /newmasse
    872             masse(ij,l)=newmasse
    873          ENDDO
    874       ENDDO
    875 c$OMP END DO NOWAIT
     1046            masse(ij,l,iq)=newmasse
     1047         ENDDO
     1048      ENDDO
     1049c$OMP END DO NOWAIT
     1050
     1051! retablir les fils en rapport de melange par rapport a l'air:
     1052      if (nqfils(iq).gt.0) then 
     1053       do ifils=1,nqdesc(iq)
     1054         iq2=iqfils(ifils,iq) 
     1055c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     1056         DO l=1,llm
     1057          DO ij=ijb,ije
     1058            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     1059          enddo
     1060         enddo
     1061c$OMP END DO NOWAIT
     1062        enddo !do ifils=1,nqdesc(iq)
     1063      endif !if (nqfils(iq).gt.0) then
    8761064
    8771065
  • LMDZ5/trunk/libf/dyn3dmem/vlspltgen_loc.F

    r1907 r2270  
    2727      USE Write_Field_loc
    2828      USE VAMPIR
    29       USE infotrac, ONLY : nqtot
     29      ! CRisi: on rajoute variables utiles d'infotrac 
     30      USE infotrac, ONLY : nqtot,nqperes,nqdesc,nqfils,iqfils,
     31     &    ok_iso_verif
    3032      USE vlspltgen_mod
    3133      IMPLICIT NONE
     
    6466      REAL ptarg,pdelarg,foeew,zdelta
    6567      REAL tempe(ijb_u:ije_u)
    66       INTEGER ijb,ije,iq
     68      INTEGER ijb,ije,iq,iq2,ifils
    6769      LOGICAL, SAVE :: firstcall=.TRUE.
    6870!$OMP THREADPRIVATE(firstcall)
     
    150152      ije=ij_end
    151153
     154      DO iq=1,nqtot
    152155c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
    153156      DO l=1,llm
    154157         DO ij=ijb,ije
    155             mw(ij,l)=w(ij,l) * zzw
     158            mw(ij,l,iq)=w(ij,l) * zzw
    156159         ENDDO
    157160      ENDDO
    158161c$OMP END DO NOWAIT
    159 
     162      ENDDO
     163
     164      DO iq=1,nqtot 
    160165c$OMP MASTER
    161166      DO ij=ijb,ije
    162          mw(ij,llm+1)=0.
     167         mw(ij,llm+1,iq)=0.
    163168      ENDDO
    164169c$OMP END MASTER
     170      ENDDO
    165171
    166172c      CALL SCOPY(ijp1llm,q,1,zq,1)
     
    170176       ije=ij_end
    171177
    172       DO iq=1,nqtot
     178      DO iq=1,nqtot       
    173179c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    174180        DO l=1,llm
     
    179185      ENDDO
    180186
    181 #ifdef DEBUG_IO   
     187#ifdef DEBUG_IO     
    182188       CALL WriteField_u('mu',mu)
    183189       CALL WriteField_v('mv',mv)
     
    186192#endif
    187193
     194      ! verif temporaire
     195      ijb=ij_begin-2*iip1
     196      ije=ij_end+2*iip1 
     197      if (pole_nord) ijb=ij_begin
     198      if (pole_sud)  ije=ij_end 
     199      if (ok_iso_verif) then
     200           call check_isotopes(zq,ijb,ije,'vlspltgen_loc 191')
     201      endif !if (ok_iso_verif) then   
     202
    188203c$OMP BARRIER           
    189       DO iq=1,nqtot
    190 
     204!      DO iq=1,nqtot
     205      DO iq=1,nqperes ! CRisi: on ne boucle que sur les pères= ceux qui sont transportés directement par l'air
     206       write(*,*) 'vlspltgen 192: iq,iadv=',iq,iadv(iq)
     207#ifdef DEBUG_IO   
     208       CALL WriteField_u('zq',zq(:,:,iq))
     209       CALL WriteField_u('zm',zm(:,:,iq))
     210#endif
     211        if(iadv(iq) == 0) then
     212       
     213          cycle
     214       
     215        else if (iadv(iq)==10) then
     216
     217#ifdef _ADV_HALO       
     218! CRisi: on ajoute les nombres de fils et tableaux des fils
     219! On suppose qu'on ne peut advecter les fils que par le schéma 10. 
     220          call vlx_loc(zq,pente_max,zm,mu,
     221     &               ij_begin,ij_begin+2*iip1-1,iq)
     222          call vlx_loc(zq,pente_max,zm,mu,
     223     &               ij_end-2*iip1+1,ij_end,iq)
     224#else
     225          call vlx_loc(zq,pente_max,zm,mu,
     226     &               ij_begin,ij_end,iq)
     227#endif
     228
     229c$OMP MASTER
     230          call VTb(VTHallo)
     231c$OMP END MASTER
     232          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
     233          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
     234! CRisi
     235          do ifils=1,nqdesc(iq)
     236            iq2=iqfils(ifils,iq)
     237            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
     238            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
     239          enddo
     240
     241c$OMP MASTER
     242          call VTe(VTHallo)
     243c$OMP END MASTER
     244        else if (iadv(iq)==14) then
     245
     246#ifdef _ADV_HALO           
     247          call vlxqs_loc(zq,pente_max,zm,mu,
     248     &                   qsat,ij_begin,ij_begin+2*iip1-1,iq)
     249          call vlxqs_loc(zq,pente_max,zm,mu,
     250     &                   qsat,ij_end-2*iip1+1,ij_end,iq)
     251#else
     252          call vlxqs_loc(zq,pente_max,zm,mu,
     253     &                   qsat,ij_begin,ij_end,iq)
     254#endif
     255
     256c$OMP MASTER
     257          call VTb(VTHallo)
     258c$OMP END MASTER
     259
     260          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
     261          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
     262          do ifils=1,nqdesc(iq)
     263            iq2=iqfils(ifils,iq)
     264            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
     265            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
     266          enddo
     267
     268c$OMP MASTER
     269          call VTe(VTHallo)
     270c$OMP END MASTER
     271        else
     272       
     273          stop 'vlspltgen_p : schema non parallelise'
     274     
     275        endif
     276     
     277      enddo !DO iq=1,nqperes
     278     
     279     
     280c$OMP BARRIER     
     281c$OMP MASTER     
     282      call VTb(VTHallo)
     283c$OMP END MASTER
     284
     285      call SendRequest(MyRequest1)
     286
     287c$OMP MASTER
     288      call VTe(VTHallo)
     289c$OMP END MASTER       
     290c$OMP BARRIER
     291
     292      ! verif temporaire
     293      ijb=ij_begin-2*iip1
     294      ije=ij_end+2*iip1 
     295      if (pole_nord) ijb=ij_begin
     296      if (pole_sud)  ije=ij_end 
     297      if (ok_iso_verif) then
     298           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 280')
     299      endif !if (ok_iso_verif) then
     300
     301      do iq=1,nqperes
     302        write(*,*) 'vlspltgen 279: iq=',iq
     303
     304        if(iadv(iq) == 0) then
     305       
     306          cycle
     307       
     308        else if (iadv(iq)==10) then
     309
     310#ifdef _ADV_HALLO
     311          call vlx_loc(zq,pente_max,zm,mu,
     312     &                 ij_begin+2*iip1,ij_end-2*iip1,iq)
     313#endif       
     314        else if (iadv(iq)==14) then
     315#ifdef _ADV_HALLO
     316          call vlxqs_loc(zq,pente_max,zm,mu,
     317     &                    qsat,ij_begin+2*iip1,ij_end-2*iip1,iq)
     318#endif   
     319        else
     320       
     321          stop 'vlspltgen_p : schema non parallelise'
     322     
     323        endif
     324     
     325      enddo
     326c$OMP BARRIER     
     327c$OMP MASTER
     328      call VTb(VTHallo)
     329c$OMP END MASTER
     330
     331!      call WaitRecvRequest(MyRequest1)
     332!      call WaitSendRequest(MyRequest1)
     333c$OMP BARRIER
     334       call WaitRequest(MyRequest1)
     335
     336
     337c$OMP MASTER
     338      call VTe(VTHallo)
     339c$OMP END MASTER
     340c$OMP BARRIER
     341
     342     
     343      if (ok_iso_verif) then
     344           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326')
     345      endif !if (ok_iso_verif) then       
     346      if (ok_iso_verif) then
     347           ijb=ij_begin-2*iip1
     348           ije=ij_end+2*iip1
     349           if (pole_nord) ijb=ij_begin
     350           if (pole_sud)  ije=ij_end
     351           call check_isotopes(zq,ijb,ije,'vlspltgen_loc 336')
     352      endif !if (ok_iso_verif) then 
     353
     354      do iq=1,nqperes
     355       write(*,*) 'vlspltgen 321: iq=',iq
    191356#ifdef DEBUG_IO   
    192357       CALL WriteField_u('zq',zq(:,:,iq))
    193358       CALL WriteField_u('zm',zm(:,:,iq))
    194359#endif
     360
    195361        if(iadv(iq) == 0) then
    196362       
     
    198364       
    199365        else if (iadv(iq)==10) then
    200 
    201 #ifdef _ADV_HALO       
    202           call vlx_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    203      &               ij_begin,ij_begin+2*iip1-1)
    204           call vlx_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    205      &               ij_end-2*iip1+1,ij_end)
    206 #else
    207           call vlx_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    208      &               ij_begin,ij_end)
    209 #endif
    210 
    211 c$OMP MASTER
    212           call VTb(VTHallo)
    213 c$OMP END MASTER
    214           call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
    215           call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
    216 
    217 c$OMP MASTER
    218           call VTe(VTHallo)
    219 c$OMP END MASTER
     366       
     367          call vly_loc(zq,pente_max,zm,mv,iq)
     368 
    220369        else if (iadv(iq)==14) then
    221 
    222 #ifdef _ADV_HALO           
    223           call vlxqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    224      &                   qsat,ij_begin,ij_begin+2*iip1-1)
    225           call vlxqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    226      &                   qsat,ij_end-2*iip1+1,ij_end)
    227 #else
    228 
    229           call vlxqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    230      &                   qsat,ij_begin,ij_end)
    231 #endif
    232 
    233 c$OMP MASTER
    234           call VTb(VTHallo)
    235 c$OMP END MASTER
    236 
    237           call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
    238           call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
    239 
    240 c$OMP MASTER
    241           call VTe(VTHallo)
    242 c$OMP END MASTER
     370     
     371          call vlyqs_loc(zq,pente_max,zm,mv,
     372     &                   qsat,iq)
     373 
    243374        else
    244375       
     
    246377     
    247378        endif
    248      
    249       enddo
    250      
    251      
    252 c$OMP BARRIER     
    253 c$OMP MASTER     
    254       call VTb(VTHallo)
    255 c$OMP END MASTER
    256 
    257       call SendRequest(MyRequest1)
    258 
    259 c$OMP MASTER
    260       call VTe(VTHallo)
    261 c$OMP END MASTER       
    262 c$OMP BARRIER
    263       do iq=1,nqtot
    264 
    265         if(iadv(iq) == 0) then
    266        
    267           cycle
    268        
    269         else if (iadv(iq)==10) then
    270 
    271 #ifdef _ADV_HALLO
    272           call vlx_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    273      &                 ij_begin+2*iip1,ij_end-2*iip1)
    274 #endif       
    275         else if (iadv(iq)==14) then
    276 #ifdef _ADV_HALLO
    277           call vlxqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    278      &                    qsat,ij_begin+2*iip1,ij_end-2*iip1)
    279 #endif   
    280         else
    281        
    282           stop 'vlspltgen_p : schema non parallelise'
    283      
    284         endif
    285      
    286       enddo
    287 c$OMP BARRIER     
    288 c$OMP MASTER
    289       call VTb(VTHallo)
    290 c$OMP END MASTER
    291 
    292 !      call WaitRecvRequest(MyRequest1)
    293 !      call WaitSendRequest(MyRequest1)
    294 c$OMP BARRIER
    295        call WaitRequest(MyRequest1)
    296 
    297 
    298 c$OMP MASTER
    299       call VTe(VTHallo)
    300 c$OMP END MASTER
    301 c$OMP BARRIER
    302 
    303 
    304       do iq=1,nqtot
     379       
     380       enddo
     381
     382      if (ok_iso_verif) then
     383           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357')
     384      endif !if (ok_iso_verif) then
     385
     386      do iq=1,nqperes
     387      write(*,*) 'vlspltgen 349: iq=',iq
    305388#ifdef DEBUG_IO   
    306389       CALL WriteField_u('zq',zq(:,:,iq))
    307390       CALL WriteField_u('zm',zm(:,:,iq))
    308391#endif
     392        if(iadv(iq) == 0) then
     393         
     394          cycle
     395       
     396        else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
     397
     398c$OMP BARRIER       
     399#ifdef _ADV_HALLO
     400          call vlz_loc(zq,pente_max,zm,mw,
     401     &               ij_begin,ij_begin+2*iip1-1,iq)
     402          call vlz_loc(zq,pente_max,zm,mw,
     403     &               ij_end-2*iip1+1,ij_end,iq)
     404#else
     405          call vlz_loc(zq,pente_max,zm,mw,
     406     &               ij_begin,ij_end,iq)
     407#endif
     408c$OMP BARRIER
     409
     410c$OMP MASTER
     411          call VTb(VTHallo)
     412c$OMP END MASTER
     413
     414          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
     415          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
     416          ! CRisi
     417          do ifils=1,nqdesc(iq)
     418            iq2=iqfils(ifils,iq)
     419            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest2)
     420            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest2)
     421          enddo     
     422c$OMP MASTER
     423          call VTe(VTHallo)
     424c$OMP END MASTER       
     425c$OMP BARRIER
     426        else
     427       
     428          stop 'vlspltgen_p : schema non parallelise'
     429     
     430        endif
     431     
     432      enddo
     433c$OMP BARRIER     
     434
     435c$OMP MASTER       
     436      call VTb(VTHallo)
     437c$OMP END MASTER
     438
     439      call SendRequest(MyRequest2)
     440
     441c$OMP MASTER
     442      call VTe(VTHallo)
     443c$OMP END MASTER       
     444
     445
     446      if (ok_iso_verif) then
     447           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
     448      endif !if (ok_iso_verif) then
     449
     450c$OMP BARRIER
     451      do iq=1,nqperes
     452      write(*,*) 'vlspltgen 409: iq=',iq
     453
    309454        if(iadv(iq) == 0) then
    310        
     455         
    311456          cycle
    312457       
    313         else if (iadv(iq)==10) then
    314        
    315           call vly_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mv)
    316  
    317         else if (iadv(iq)==14) then
    318      
    319           call vlyqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mv,
    320      &                   qsat)
    321  
     458        else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
     459c$OMP BARRIER       
     460
     461          write(*,*) 'vlspltgen_loc 461'
     462#ifdef _ADV_HALLO
     463          write(*,*) 'vlspltgen_loc 462'
     464          call vlz_loc(zq,pente_max,zm,mw,
     465     &               ij_begin+2*iip1,ij_end-2*iip1,iq)
     466#endif
     467
     468c$OMP BARRIER       
    322469        else
    323470       
     
    325472     
    326473        endif
    327        
    328        enddo
    329 
    330 
    331       do iq=1,nqtot
     474     
     475      enddo
     476      write(*,*) 'vlspltgen_loc 476'
     477
     478c$OMP BARRIER
     479c$OMP MASTER
     480      call VTb(VTHallo)
     481c$OMP END MASTER
     482
     483!      call WaitRecvRequest(MyRequest2)
     484!      call WaitSendRequest(MyRequest2)
     485c$OMP BARRIER
     486       CALL WaitRequest(MyRequest2)
     487
     488c$OMP MASTER
     489      call VTe(VTHallo)
     490c$OMP END MASTER
     491c$OMP BARRIER
     492
     493
     494      write(*,*) 'vlspltgen_loc 494'
     495      if (ok_iso_verif) then
     496           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461')
     497      endif !if (ok_iso_verif) then
     498
     499      do iq=1,nqperes
     500      write(*,*) 'vlspltgen 449: iq=',iq
    332501#ifdef DEBUG_IO   
    333502       CALL WriteField_u('zq',zq(:,:,iq))
    334503       CALL WriteField_u('zm',zm(:,:,iq))
    335504#endif
     505        if(iadv(iq) == 0) then
     506       
     507          cycle
     508       
     509        else if (iadv(iq)==10) then
     510       
     511          call vly_loc(zq,pente_max,zm,mv,iq)
     512 
     513        else if (iadv(iq)==14) then
     514     
     515          call vlyqs_loc(zq,pente_max,zm,mv,
     516     &                   qsat,iq)
     517 
     518        else
     519       
     520          stop 'vlspltgen_p : schema non parallelise'
     521     
     522        endif
     523       
     524       enddo !do iq=1,nqperes
     525
     526      if (ok_iso_verif) then
     527           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493')
     528      endif !if (ok_iso_verif) then
     529
     530      do iq=1,nqperes
     531      write(*,*) 'vlspltgen 477: iq=',iq
     532#ifdef DEBUG_IO   
     533       CALL WriteField_u('zq',zq(:,:,iq))
     534       CALL WriteField_u('zm',zm(:,:,iq))
     535#endif
    336536        if(iadv(iq) == 0) then
    337537         
    338538          cycle
    339539       
    340         else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
    341 
    342 c$OMP BARRIER       
    343 #ifdef _ADV_HALLO
    344           call vlz_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mw,
    345      &               ij_begin,ij_begin+2*iip1-1)
    346           call vlz_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mw,
    347      &               ij_end-2*iip1+1,ij_end)
    348 #else
    349           call vlz_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mw,
    350      &               ij_begin,ij_end)
    351 #endif
    352 c$OMP BARRIER
    353 
    354 c$OMP MASTER
    355           call VTb(VTHallo)
    356 c$OMP END MASTER
    357 
    358           call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
    359           call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
    360 
    361 c$OMP MASTER
    362           call VTe(VTHallo)
    363 c$OMP END MASTER       
    364 c$OMP BARRIER
    365         else
    366        
    367           stop 'vlspltgen_p : schema non parallelise'
    368      
    369         endif
    370      
    371       enddo
    372 c$OMP BARRIER     
    373 
    374 c$OMP MASTER       
    375       call VTb(VTHallo)
    376 c$OMP END MASTER
    377 
    378       call SendRequest(MyRequest2)
    379 
    380 c$OMP MASTER
    381       call VTe(VTHallo)
    382 c$OMP END MASTER       
    383 
    384 c$OMP BARRIER
    385       do iq=1,nqtot
    386 
    387         if(iadv(iq) == 0) then
    388          
    389           cycle
    390        
    391         else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
    392 c$OMP BARRIER       
    393 
    394 #ifdef _ADV_HALLO
    395           call vlz_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mw,
    396      &               ij_begin+2*iip1,ij_end-2*iip1)
    397 #endif
    398 
    399 c$OMP BARRIER       
    400         else
    401        
    402           stop 'vlspltgen_p : schema non parallelise'
    403      
    404         endif
    405      
    406       enddo
    407 
    408 c$OMP BARRIER
    409 c$OMP MASTER
    410       call VTb(VTHallo)
    411 c$OMP END MASTER
    412 
    413 !      call WaitRecvRequest(MyRequest2)
    414 !      call WaitSendRequest(MyRequest2)
    415 c$OMP BARRIER
    416        CALL WaitRequest(MyRequest2)
    417 
    418 c$OMP MASTER
    419       call VTe(VTHallo)
    420 c$OMP END MASTER
    421 c$OMP BARRIER
    422 
    423 
    424       do iq=1,nqtot
    425 #ifdef DEBUG_IO   
    426        CALL WriteField_u('zq',zq(:,:,iq))
    427        CALL WriteField_u('zm',zm(:,:,iq))
    428 #endif
    429         if(iadv(iq) == 0) then
    430        
    431           cycle
    432        
    433540        else if (iadv(iq)==10) then
    434541       
    435           call vly_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mv)
     542          call vlx_loc(zq,pente_max,zm,mu,
     543     &               ij_begin,ij_end,iq)
    436544 
    437545        else if (iadv(iq)==14) then
    438546     
    439           call vlyqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mv,
    440      &                   qsat)
     547          call vlxqs_loc(zq,pente_max,zm,mu,
     548     &                 qsat, ij_begin,ij_end,iq)
    441549 
    442550        else
    443551       
    444           stop 'vlspltgen_p : schema non parallelise'
     552          stop 'vlspltgen_p : schema non parallelise'
    445553     
    446554        endif
    447555       
    448        enddo
    449 
    450 
    451       do iq=1,nqtot
    452 #ifdef DEBUG_IO   
    453        CALL WriteField_u('zq',zq(:,:,iq))
    454        CALL WriteField_u('zm',zm(:,:,iq))
    455 #endif
    456         if(iadv(iq) == 0) then
    457          
    458           cycle
    459        
    460         else if (iadv(iq)==10) then
    461        
    462           call vlx_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    463      &               ij_begin,ij_end)
    464  
    465         else if (iadv(iq)==14) then
    466      
    467           call vlxqs_loc(zq(ijb_u,1,iq),pente_max,zm(ijb_u,1,iq),mu,
    468      &                 qsat, ij_begin,ij_end)
    469  
    470         else
    471        
    472           stop 'vlspltgen_p : schema non parallelise'
    473      
    474         endif
    475        
    476        enddo
    477 
     556       enddo !do iq=1,nqperes
     557
     558      write(*,*) 'vlspltgen 550: apres derniere serie de call vlx'
     559      if (ok_iso_verif) then
     560           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521')
     561      endif !if (ok_iso_verif) then
    478562     
    479563      ijb=ij_begin
    480564      ije=ij_end
     565      write(*,*) 'vlspltgen_loc 557'
    481566c$OMP BARRIER     
    482567
    483 
     568      write(*,*) 'vlspltgen_loc 559' 
    484569      DO iq=1,nqtot
     570       write(*,*) 'vlspltgen_loc 561, iq=',iq 
    485571#ifdef DEBUG_IO   
    486572       CALL WriteField_u('zq',zq(:,:,iq))
     
    495581           ENDDO
    496582        ENDDO
    497 c$OMP END DO NOWAIT         
     583c$OMP END DO NOWAIT   
     584      write(*,*) 'vlspltgen_loc 575'     
    498585
    499586c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     
    504591        ENDDO
    505592c$OMP END DO NOWAIT 
    506 
    507       ENDDO
     593      write(*,*) 'vlspltgen_loc 583' 
     594      ENDDO !DO iq=1,nqtot
    508595       
    509      
     596      if (ok_iso_verif) then
     597           call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
     598      endif !if (ok_iso_verif) then
     599
    510600c$OMP BARRIER
    511601
     
    516606cc$OMP BARRIER
    517607
     608      write(*,*) 'vlspltgen 597: sortie' 
    518609      RETURN
    519610      END
  • LMDZ5/trunk/libf/dyn3dmem/vlspltgen_mod.F90

    r1907 r2270  
    22
    33  REAL,POINTER,SAVE :: qsat(:,:)
    4   REAL,POINTER,SAVE :: mu(:,:)
     4  REAL,POINTER,SAVE :: mu(:,:) ! CRisi: on ajoute une dimension
    55  REAL,POINTER,SAVE :: mv(:,:)
    6   REAL,POINTER,SAVE :: mw(:,:)
     6  REAL,POINTER,SAVE :: mw(:,:,:)
    77  REAL,POINTER,SAVE :: zm(:,:,:)
    88  REAL,POINTER,SAVE :: zq(:,:,:)
     
    2525    CALL allocate_u(mu,llm,d)
    2626    CALL allocate_v(mv,llm,d)
    27     CALL allocate_u(mw,llm+1,d)
     27    CALL allocate_u(mw,llm+1,nqtot,d)
    2828    CALL allocate_u(zm,llm,nqtot,d)
    2929    CALL allocate_u(zq,llm,nqtot,d)
  • LMDZ5/trunk/libf/dyn3dmem/vlspltqs_loc.F

    r1907 r2270  
    1       SUBROUTINE vlxqs_loc(q,pente_max,masse,u_m,qsat,ijb_x,ije_x)
     1      SUBROUTINE vlxqs_loc(q,pente_max,masse,u_m,qsat,ijb_x,ije_x,iq)
    22c
    33c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
    44c
    55c    ********************************************************************
    6 c     Shema  d'advection " pseudo amont " .
     6c     Shema  d''advection " pseudo amont " .
    77c    ********************************************************************
    88c
    99c   --------------------------------------------------------------------
    1010      USE parallel_lmdz
     11      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 
    1112      IMPLICIT NONE
    1213c
     
    2021c   Arguments:
    2122c   ----------
    22       REAL masse(ijb_u:ije_u,llm),pente_max
     23      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
    2324      REAL u_m( ijb_u:ije_u,llm )
    24       REAL q(ijb_u:ije_u,llm)
     25      REAL q(ijb_u:ije_u,llm,nqtot)
    2526      REAL qsat(ijb_u:ije_u,llm)
     27      INTEGER iq ! CRisi
    2628c
    2729c      Local
     
    3638      REAL adxqu(ijb_u:ije_u),dxqmax(ijb_u:ije_u,llm)
    3739      REAL u_mq(ijb_u:ije_u,llm)
     40      REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
     41      INTEGER ifils,iq2 ! CRisi
     42
    3843
    3944      REAL      SSUM
     
    4247      INTEGER ijb,ije,ijb_x,ije_x
    4348     
     49      write(*,*) 'vlspltqs 58: entree vlxqs_loc, iq,ijb_x=',
     50     &   iq,ijb_x
    4451
    4552c   calcul de la pente a droite et a gauche de la maille
     
    6572         DO l = 1, llm
    6673            DO ij=ijb,ije-1
    67                dxqu(ij)=q(ij+1,l)-q(ij,l)
     74               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    6875c              IF(u_m(ij,l).lt.0.) stop'limx n admet pas les U<0'
    69 c              sigu(ij)=u_m(ij,l)/masse(ij,l)
     76c              sigu(ij)=u_m(ij,l)/masse(ij,l,iq)
    7077            ENDDO
    7178            DO ij=ijb+iip1-1,ije,iip1
     
    120127         DO l = 1, llm
    121128            DO ij=ijb,ije-1
    122                dxqu(ij)=q(ij+1,l)-q(ij,l)
     129               dxqu(ij)=q(ij+1,l,iq)-q(ij,l,iq)
    123130            ENDDO
    124131            DO ij=ijb+iip1-1,ije,iip1
     
    179186      DO l=1,llm
    180187       DO ij=ijb,ije-1
    181           zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l),
    182      ,                     1.+u_m(ij,l)/masse(ij+1,l),
     188          zdum(ij,l)=cvmgp(1.-u_m(ij,l)/masse(ij,l,iq),
     189     ,                     1.+u_m(ij,l)/masse(ij+1,l,iq),
    183190     ,                     u_m(ij,l))
    184191          zdum(ij,l)=0.5*zdum(ij,l)
    185192          u_mq(ij,l)=cvmgp(
    186      ,                q(ij,l)+zdum(ij,l)*dxq(ij,l),
    187      ,                q(ij+1,l)-zdum(ij,l)*dxq(ij+1,l),
     193     ,                q(ij,l,iq)+zdum(ij,l)*dxq(ij,l),
     194     ,                q(ij+1,l,iq)-zdum(ij,l)*dxq(ij+1,l),
    188195     ,                u_m(ij,l))
    189196          u_mq(ij,l)=u_m(ij,l)*u_mq(ij,l)
     
    195202c   on cumule le flux correspondant a toutes les mailles dont la masse
    196203c   au travers de la paroi pENDant le pas de temps.
    197 c   le rapport de melange de l'air advecte est min(q_vanleer, Qsat_downwind)
     204c   le rapport de melange de l''air advecte est min(q_vanleer, Qsat_downwind)
    198205c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    199206      DO l=1,llm
    200207       DO ij=ijb,ije-1
    201208          IF (u_m(ij,l).gt.0.) THEN
    202              zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l)
     209             zdum(ij,l)=1.-u_m(ij,l)/masse(ij,l,iq)
    203210             u_mq(ij,l)=u_m(ij,l)*
    204      $         min(q(ij,l)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
     211     $         min(q(ij,l,iq)+0.5*zdum(ij,l)*dxq(ij,l),qsat(ij+1,l))
    205212          ELSE
    206              zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l)
     213             zdum(ij,l)=1.+u_m(ij,l)/masse(ij+1,l,iq)
    207214             u_mq(ij,l)=u_m(ij,l)*
    208      $         min(q(ij+1,l)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
     215     $         min(q(ij+1,l,iq)-0.5*zdum(ij,l)*dxq(ij+1,l),qsat(ij,l))
    209216          ENDIF
    210217       ENDDO
     
    273280               ENDDO
    274281               niju=iju
    275 c              PRINT*,'niju,nl',niju,nl(l)
     282               PRINT*,'vlxqs 280: niju,nl',niju,nl(l)
    276283
    277284c  traitement des mailles
     
    285292                     i=ijq-(j-1)*iip1
    286293c   accumulation pour les mailles completements advectees
    287                      do while(zu_m.gt.masse(ijq,l))
    288                         u_mq(ij,l)=u_mq(ij,l)+q(ijq,l)*masse(ijq,l)
    289                         zu_m=zu_m-masse(ijq,l)
     294                     do while(zu_m.gt.masse(ijq,l,iq))
     295                        u_mq(ij,l)=u_mq(ij,l)+q(ijq,l,iq)
     296     &                     *masse(ijq,l,iq)
     297                        zu_m=zu_m-masse(ijq,l,iq)
    290298                        i=mod(i-2+iim,iim)+1
    291299                        ijq=(j-1)*iip1+i
    292300                     ENDDO
    293301c   ajout de la maille non completement advectee
    294                      u_mq(ij,l)=u_mq(ij,l)+zu_m*
    295      &               (q(ijq,l)+0.5*(1.-zu_m/masse(ijq,l))*dxq(ijq,l))
     302                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)
     303     &                 +0.5*(1.-zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    296304                  ELSE
    297305                     ijq=ij+1
    298306                     i=ijq-(j-1)*iip1
    299307c   accumulation pour les mailles completements advectees
    300                      do while(-zu_m.gt.masse(ijq,l))
    301                         u_mq(ij,l)=u_mq(ij,l)-q(ijq,l)*masse(ijq,l)
    302                         zu_m=zu_m+masse(ijq,l)
     308                     do while(-zu_m.gt.masse(ijq,l,iq))
     309                        u_mq(ij,l)=u_mq(ij,l)-q(ijq,l,iq)
     310     &                   *masse(ijq,l,iq)
     311                        zu_m=zu_m+masse(ijq,l,iq)
    303312                        i=mod(i,iim)+1
    304313                        ijq=(j-1)*iip1+i
    305314                     ENDDO
    306315c   ajout de la maille non completement advectee
    307                      u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l)-
    308      &               0.5*(1.+zu_m/masse(ijq,l))*dxq(ijq,l))
     316                     u_mq(ij,l)=u_mq(ij,l)+zu_m*(q(ijq,l,iq)-
     317     &               0.5*(1.+zu_m/masse(ijq,l,iq))*dxq(ijq,l))
    309318                  ENDIF
    310319               ENDDO
     
    325334c$OMP END DO NOWAIT
    326335
     336! CRisi: appel récursif de l'advection sur les fils.
     337! Il faut faire ça avant d'avoir mis à jour q et masse
     338      write(*,*) 'vlspltqs 336: iq,ijb_x,nqfils(iq)=',
     339     &     iq,ijb_x,nqfils(iq) 
     340
     341      if (nqfils(iq).gt.0) then 
     342       do ifils=1,nqdesc(iq)
     343         iq2=iqfils(ifils,iq)
     344c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     345         DO l=1,llm
     346          DO ij=ijb,ije
     347           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     348           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
     349          enddo   
     350         enddo
     351c$OMP END DO NOWAIT
     352        enddo !do ifils=1,nqfils(iq)
     353        do ifils=1,nqfils(iq)
     354         iq2=iqfils(ifils,iq)
     355         write(*,*) 'vlxqs 349: on appelle vlx pour iq2=',iq2
     356         call vlx_loc(Ratio,pente_max,masseq,u_mq,ijb_x,ije_x,iq2)
     357        enddo !do ifils=1,nqfils(iq)
     358      endif !if (nqfils(iq).gt.0) then
     359! end CRisi
     360
     361      write(*,*) 'vlspltqs 360: iq,ijb_x=',iq,ijb_x   
     362
    327363c   calcul des tendances
    328364c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    329365      DO l=1,llm
    330366         DO ij=ijb+1,ije
    331             new_m=masse(ij,l)+u_m(ij-1,l)-u_m(ij,l)
    332             q(ij,l)=(q(ij,l)*masse(ij,l)+
     367            new_m=masse(ij,l,iq)+u_m(ij-1,l)-u_m(ij,l)
     368            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+
    333369     &      u_mq(ij-1,l)-u_mq(ij,l))
    334370     &      /new_m
    335             masse(ij,l)=new_m
    336          ENDDO
    337 c   Modif Fred 22 03 96 correction d'un bug (les scopy ci-dessous)
     371            masse(ij,l,iq)=new_m
     372         ENDDO
     373c   Modif Fred 22 03 96 correction d''un bug (les scopy ci-dessous)
    338374         DO ij=ijb+iip1-1,ije,iip1
    339             q(ij-iim,l)=q(ij,l)
    340             masse(ij-iim,l)=masse(ij,l)
    341          ENDDO
    342       ENDDO
    343 c$OMP END DO NOWAIT
     375            q(ij-iim,l,iq)=q(ij,l,iq)
     376            masse(ij-iim,l,iq)=masse(ij,l,iq)
     377         ENDDO
     378      ENDDO
     379c$OMP END DO NOWAIT
     380
     381      write(*,*) 'vlspltqs 380: iq,ijb_x=',iq,ijb_x
     382
     383! retablir les fils en rapport de melange par rapport a l'air:
     384      if (nqfils(iq).gt.0) then 
     385       do ifils=1,nqdesc(iq)
     386         iq2=iqfils(ifils,iq) 
     387c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     388         DO l=1,llm
     389          DO ij=ijb+1,ije
     390            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     391          enddo
     392          DO ij=ijb+iip1-1,ije,iip1
     393             q(ij-iim,l,iq2)=q(ij,l,iq2)
     394          enddo ! DO ij=ijb+iip1-1,ije,iip1
     395         enddo
     396c$OMP END DO NOWAIT
     397        enddo !do ifils=1,nqdesc(iq)
     398      endif !if (nqfils(iq).gt.0) then
     399
     400      write(*,*) 'vlspltqs 399: iq,ijb_x=',iq,ijb_x
     401
    344402c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
    345 c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1),iip1,masse(iip2,1),iip1)
     403c     CALL SCOPY((jjm-1)*llm,masse(iip1+iip1,1,iq),iip1,masse(iip2,1,iq),iip1)
    346404
    347405
    348406      RETURN
    349407      END
    350       SUBROUTINE vlyqs_loc(q,pente_max,masse,masse_adv_v,qsat)
     408      SUBROUTINE vlyqs_loc(q,pente_max,masse,masse_adv_v,qsat,iq)
    351409c
    352410c     Auteurs:   P.Le Van, F.Hourdin, F.Forget
     
    361419c   --------------------------------------------------------------------
    362420      USE parallel_lmdz
     421      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi 
    363422      IMPLICIT NONE
    364423c
     
    373432c   Arguments:
    374433c   ----------
    375       REAL masse(ijb_u:ije_u,llm),pente_max
     434      REAL masse(ijb_u:ije_u,llm,nqtot),pente_max
    376435      REAL masse_adv_v( ijb_v:ije_v,llm)
    377       REAL q(ijb_u:ije_u,llm)
     436      REAL q(ijb_u:ije_u,llm,nqtot)
    378437      REAL qsat(ijb_u:ije_u,llm)
     438      INTEGER iq ! CRisi
    379439c
    380440c      Local
     
    386446      REAL dyq(ijb_u:ije_u,llm),dyqv(ijb_v:ije_v)
    387447      REAL adyqv(ijb_v:ije_v),dyqmax(ijb_u:ije_u)
    388       REAL qbyv(ijb_v:ije_v,llm)
     448      REAL qbyv(ijb_v:ije_v,llm,nqtot)
    389449
    390450      REAL qpns,qpsn,dyn1,dys1,dyn2,dys2,newmasse,fn,fs
     
    402462c
    403463c
     464      REAL masseq(ijb_u:ije_u,llm,nqtot),Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
     465      INTEGER ifils,iq2 ! CRisi
     466
    404467      REAL      SSUM
    405468
     
    407470      INTEGER ijb,ije
    408471
     472      ijb=ij_begin-2*iip1
     473      ije=ij_end+2*iip1 
     474      if (pole_nord) ijb=ij_begin
     475      if (pole_sud)  ije=ij_end
     476      ij=3525
     477      l=3
     478      if ((ij.ge.ijb).and.(ij.le.ije)) then
     479        write(*,*) 'vlyqs 480: ij,l,iq,ijb,q(ij,l,:)=',
     480     &             ij,l,iq,ijb,q(ij,l,:)
     481      endif 
     482
    409483      IF(first) THEN
    410484         PRINT*,'Shema  Amont nouveau  appele dans  Vanleer   '
     485         PRINT*,'vlyqs_loc, iq=',iq
    411486         first=.false.
    412487         do i=2,iip1
     
    439514      if (pole_nord) then
    440515        DO i = 1, iim
    441           airescb(i) = aire(i+ iip1) * q(i+ iip1,l)
     516          airescb(i) = aire(i+ iip1) * q(i+ iip1,l,iq)
    442517        ENDDO
    443518        qpns   = SSUM( iim,  airescb ,1 ) / airej2
     
    446521      if (pole_sud) then
    447522        DO i = 1, iim
    448           airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)
     523          airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l,iq)
    449524        ENDDO
    450525        qpsn   = SSUM( iim,  airesch ,1 ) / airejjm
     
    460535     
    461536      DO ij=ijb,ije
    462          dyqv(ij)=q(ij,l)-q(ij+iip1,l)
     537         dyqv(ij)=q(ij,l,iq)-q(ij+iip1,l,iq)
    463538         adyqv(ij)=abs(dyqv(ij))
    464539      ENDDO
     
    482557c   calcul des pentes aux poles
    483558        DO ij=1,iip1
    484            dyq(ij,l)=qpns-q(ij+iip1,l)
     559           dyq(ij,l)=qpns-q(ij+iip1,l,iq)
    485560        ENDDO
    486561
     
    513588
    514589        DO ij=1,iip1
    515            dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l)-qpsn
     590           dyq(ip1jm+ij,l)=q(ip1jm+ij-iip1,l,iq)-qpsn
    516591        ENDDO
    517592
     
    636711       DO ij=ijb,ije
    637712         IF( masse_adv_v(ij,l).GT.0. ) THEN
    638            qbyv(ij,l)= MIN( qsat(ij+iip1,l), q(ij+iip1,l )  +
    639      ,      dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)/masse(ij+iip1,l)))
     713           qbyv(ij,l,iq)= MIN( qsat(ij+iip1,l), q(ij+iip1,l,iq )  +
     714     ,      dyq(ij+iip1,l)*0.5*(1.-masse_adv_v(ij,l)
     715     ,      /masse(ij+iip1,l,iq)))
    640716         ELSE
    641               qbyv(ij,l)= MIN( qsat(ij,l), q(ij,l) - dyq(ij,l) *
    642      ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l)) )
     717              qbyv(ij,l,iq)= MIN( qsat(ij,l), q(ij,l,iq) - dyq(ij,l) *
     718     ,                   0.5*(1.+masse_adv_v(ij,l)/masse(ij,l,iq)) )
    643719         ENDIF
    644           qbyv(ij,l) = masse_adv_v(ij,l)*qbyv(ij,l)
     720          qbyv(ij,l,iq) = masse_adv_v(ij,l)*qbyv(ij,l,iq)
    645721       ENDDO
    646722      ENDDO
    647723c$OMP END DO NOWAIT
     724
     725! CRisi: appel récursif de l'advection sur les fils.
     726! Il faut faire ça avant d'avoir mis à jour q et masse
     727      write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq)
     728     
     729      ijb=ij_begin-2*iip1
     730      ije=ij_end+2*iip1
     731      if (pole_nord) ijb=ij_begin
     732      if (pole_sud)  ije=ij_end 
     733
     734      if (nqfils(iq).gt.0) then 
     735       do ifils=1,nqdesc(iq)
     736         iq2=iqfils(ifils,iq)
     737c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     738         DO l=1,llm
     739          DO ij=ijb,ije
     740           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
     741           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)   
     742          enddo   
     743         enddo
     744c$OMP END DO NOWAIT
     745        enddo !do ifils=1,nqdesc(iq)
     746        do ifils=1,nqfils(iq)
     747         iq2=iqfils(ifils,iq)
     748         call vly_loc(Ratio,pente_max,masseq,qbyv,iq2)
     749        enddo !do ifils=1,nqfils(iq)
     750      endif !if (nqfils(iq).gt.0) then
     751
     752       
     753! end CRisi
    648754
    649755      ijb=ij_begin
     
    655761      DO l=1,llm
    656762         DO ij=ijb,ije
    657             newmasse=masse(ij,l)
     763            newmasse=masse(ij,l,iq)
    658764     &      +masse_adv_v(ij,l)-masse_adv_v(ij-iip1,l)
    659             q(ij,l)=(q(ij,l)*masse(ij,l)+qbyv(ij,l)-qbyv(ij-iip1,l))
    660      &         /newmasse
    661             masse(ij,l)=newmasse
     765            q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+qbyv(ij,l,iq)
     766     &         -qbyv(ij-iip1,l,iq))/newmasse
     767            masse(ij,l,iq)=newmasse
    662768         ENDDO
    663769c.-. ancienne version
     
    665771         IF (pole_nord) THEN
    666772
    667            convpn=SSUM(iim,qbyv(1,l),1)/apoln
     773           convpn=SSUM(iim,qbyv(1,l,iq),1)/apoln
    668774           convmpn=ssum(iim,masse_adv_v(1,l),1)/apoln
    669775           DO ij = 1,iip1
    670               newmasse=masse(ij,l)+convmpn*aire(ij)
    671               q(ij,l)=(q(ij,l)*masse(ij,l)+convpn*aire(ij))/
     776              newmasse=masse(ij,l,iq)+convmpn*aire(ij)
     777              q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convpn*aire(ij))/
    672778     &                 newmasse
    673               masse(ij,l)=newmasse
     779              masse(ij,l,iq)=newmasse
    674780           ENDDO
    675781         
     
    678784         IF (pole_sud) THEN
    679785         
    680            convps  = -SSUM(iim,qbyv(ip1jm-iim,l),1)/apols
     786           convps  = -SSUM(iim,qbyv(ip1jm-iim,l,iq),iq,1)/apols
    681787           convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
    682788           DO ij = ip1jm+1,ip1jmp1
    683               newmasse=masse(ij,l)+convmps*aire(ij)
    684               q(ij,l)=(q(ij,l)*masse(ij,l)+convps*aire(ij))/
     789              newmasse=masse(ij,l,iq)+convmps*aire(ij)
     790              q(ij,l,iq)=(q(ij,l,iq)*masse(ij,l,iq)+convps*aire(ij))/
    685791     &                 newmasse
    686               masse(ij,l)=newmasse
     792              masse(ij,l,iq)=newmasse
    687793           ENDDO
    688794         
     
    691797
    692798c._. nouvelle version
    693 c        convpn=SSUM(iim,qbyv(1,l),1)
     799c        convpn=SSUM(iim,qbyv(1,l,iq),1)
    694800c        convmpn=ssum(iim,masse_adv_v(1,l),1)
    695 c        oldmasse=ssum(iim,masse(1,l),1)
     801c        oldmasse=ssum(iim,masse(1,l,iq),1)
    696802c        newmasse=oldmasse+convmpn
    697 c        newq=(q(1,l)*oldmasse+convpn)/newmasse
     803c        newq=(q(1,l,iq)*oldmasse+convpn)/newmasse
    698804c        newmasse=newmasse/apoln
    699805c        DO ij = 1,iip1
    700 c           q(ij,l)=newq
    701 c           masse(ij,l)=newmasse*aire(ij)
     806c           q(ij,l,iq)=newq
     807c           masse(ij,l,iq)=newmasse*aire(ij)
    702808c        ENDDO
    703 c        convps=-SSUM(iim,qbyv(ip1jm-iim,l),1)
     809c        convps=-SSUM(iim,qbyv(ip1jm-iim,l,iq),1)
    704810c        convmps=-ssum(iim,masse_adv_v(ip1jm-iim,l),1)
    705 c        oldmasse=ssum(iim,masse(ip1jm-iim,l),1)
     811c        oldmasse=ssum(iim,masse(ip1jm-iim,l,iq),1)
    706812c        newmasse=oldmasse+convmps
    707 c        newq=(q(ip1jmp1,l)*oldmasse+convps)/newmasse
     813c        newq=(q(ip1jmp1,l,iq)*oldmasse+convps)/newmasse
    708814c        newmasse=newmasse/apols
    709815c        DO ij = ip1jm+1,ip1jmp1
    710 c           q(ij,l)=newq
    711 c           masse(ij,l)=newmasse*aire(ij)
     816c           q(ij,l,iq)=newq
     817c           masse(ij,l,iq)=newmasse*aire(ij)
    712818c        ENDDO
    713819c._. fin nouvelle version
    714820      ENDDO
    715821c$OMP END DO NOWAIT
     822
     823! retablir les fils en rapport de melange par rapport a l'air:
     824      ijb=ij_begin
     825      ije=ij_end
     826!      if (pole_nord) ijb=ij_begin+iip1
     827!      if (pole_sud)  ije=ij_end-iip1
     828 
     829      if (nqfils(iq).gt.0) then 
     830       do ifils=1,nqdesc(iq)
     831         iq2=iqfils(ifils,iq) 
     832c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     833         DO l=1,llm
     834          DO ij=ijb,ije
     835            q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)           
     836          enddo
     837         enddo
     838c$OMP END DO NOWAIT
     839        enddo !do ifils=1,nqdesc(iq)
     840      endif !if (nqfils(iq).gt.0) then
     841
     842
    716843      RETURN
    717844      END
  • LMDZ5/trunk/libf/dyn3dmem/vlz_mod.F90

    r1907 r2270  
    11MODULE vlz_mod
    22
    3   REAL,POINTER,SAVE :: wq(:,:)
     3  REAL,POINTER,SAVE :: wq(:,:,:)
    44  REAL,POINTER,SAVE :: dzq(:,:)
    55  REAL,POINTER,SAVE :: dzqw(:,:)
    66  REAL,POINTER,SAVE :: adzqw(:,:)
     7  ! CRisi: pour les traceurs: 
     8  REAL,POINTER,SAVE :: masseq(:,:,:)
     9  REAL,POINTER,SAVE :: Ratio(:,:,:)
    710 
    811CONTAINS
     
    1821   
    1922    d=>distrib_vanleer
    20     CALL allocate_u(wq,llm+1,d)
     23    CALL allocate_u(wq,llm+1,nqtot,d)
    2124    CALL allocate_u(dzq,llm,d)
    2225    CALL allocate_u(dzqw,llm,d)
    2326    CALL allocate_u(adzqw,llm,d)
     27    if (nqdesc_tot.gt.0) then
     28    CALL allocate_u(masseq,llm,nqtot,d)
     29    CALL allocate_u(Ratio,llm,nqtot,d)
     30    endif !if (nqdesc_tot.gt.0) then
    2431
    2532  END SUBROUTINE vlz_allocate
     
    2936  USE bands
    3037  USE parallel_lmdz
     38  USE infotrac
    3139  IMPLICIT NONE
    3240    TYPE(distrib),INTENT(IN) :: dist
     
    3644    CALL switch_u(dzqw,distrib_vanleer,dist)
    3745    CALL switch_u(adzqw,distrib_vanleer,dist)
     46    ! CRisi:
     47    if (nqdesc_tot.gt.0) then   
     48    CALL switch_u(masseq,distrib_vanleer,dist)
     49    CALL switch_u(Ratio,distrib_vanleer,dist)
     50    endif !if (nqdesc_tot.gt.0) then     
    3851
    3952  END SUBROUTINE vlz_switch_vanleer 
Note: See TracChangeset for help on using the changeset viewer.