Ignore:
Timestamp:
Dec 23, 2021, 6:54:17 PM (2 years ago)
Author:
dcugnet
Message:

Second commit for new tracers.

  • include most of the keys in the tracers descriptor vector "tracers(:)".
  • fix in phylmdiso/cv3_routines: fq_* variables were used where their fxt_* counterparts were expected.
  • multiple IF(nqdesc(iq)>0) and IF(nqfils(iq)>0) tests suppressed, because they are not needed: "do ... enddo" loops with 0 upper bound are not executed.
  • remove French accents from comments (encoding problem) in phylmdiso/cv3_routines and phylmdiso/cv30_routines.
  • modifications in "isotopes_verif_mod", where the call to function "iso_verif_tag17_q_deltad_chn" in "iso_verif_tag17_q_deltad_chn" was not detected at linking stage, although defined in the same module (?).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmdiso/cv30_routines.F90

    r4004 r4050  
    449449
    450450#ifdef ISOVERIF
    451         write(*,*) 'cv30_routine undilute 1 413: entrée'
     451        write(*,*) 'cv30_routine undilute 1 413: entree'
    452452#endif
    453453
     
    602602          zfice(i) = MIN(MAX(zfice(i),0.0),1.0)         
    603603       enddo
    604        ! calcul de la composition du condensat glacé et liquide
     604       ! calcul de la composition du condensat glace et liquide
    605605
    606606       do i=1,len
     
    647647
    648648#ifdef ISOVERIF
    649             write(*,*) 'cv30_routine undilute 1 598: après condiso'
     649            write(*,*) 'cv30_routine undilute 1 598: apres condiso'
    650650         
    651651          if (iso_eau.gt.0) then
     
    10121012            else
    10131013              q(i,k)=0.0
    1014               clw(i,k)=0.0 ! mise en commentaire le 5 avril pour vérif
     1014              clw(i,k)=0.0 ! mise en commentaire le 5 avril pour verif
    10151015!            convergence
    10161016            endif  !f (negation(essai_convergence)) then
     
    19081908      real xtrti(ntraciso,nloc)
    19091909      real xtres(ntraciso)
    1910       ! on ajoute la dimension nloc à xtrti pour vérifs dans les tags: 5 fev
     1910      ! on ajoute la dimension nloc a xtrti pour verifs dans les tags: 5 fev
    19111911      ! 2010
    19121912      real zfice(nloc),zxtliq(ntraciso,nloc),zxtice(ntraciso,nloc)
     
    19231923#ifdef ISO
    19241924#ifdef ISOVERIF
    1925       write(*,*) 'cv30_routines 1820: entrée dans cv3_mixing'
     1925      write(*,*) 'cv30_routines 1820: entree dans cv3_mixing'
    19261926      if (iso_eau.gt.0) then
    19271927      call iso_verif_egalite_vect2D( &
     
    19651965             xtelij(ixt,i,k,j)=0.0
    19661966            enddo !do ixt =1,niso
    1967             ! on initialise mieux que ça qent et elij, même si au final les
    1968             ! valeurs en nd=nl+1 ne sont pas utilisées
     1967            ! on initialise mieux que ca qent et elij, meme si au final les
     1968            ! valeurs en nd=nl+1 ne sont pas utilisees
    19691969            qent(i,k,j)=rr(i,j)
    19701970            elij(i,k,j)=0.0   
     
    21212121!     :           'tcond(il),rs(il,j)=',
    21222122!     :            il,i,j,xtent(:,il,i,j),tcond(il),rs(il,j)
    2123         ! colorier la vapeur résiduelle selon température de
    2124         ! condensation, et le condensat en un tag spécifique
     2123        ! colorier la vapeur residuelle selon temperature de
     2124        ! condensation, et le condensat en un tag spEcifique
    21252125          if ((elij(il,i,j).gt.0.0).and.(qent(il,i,j).gt.0.0)) then 
    21262126            if (option_traceurs.eq.17) then       
     
    22412241#ifdef ISOTRAC         
    22422242        if (option_tmin.ge.1) then
    2243         ! colorier la vapeur résiduelle selon température de
    2244         ! condensation, et le condensat en un tag spécifique
     2243        ! colorier la vapeur residuelle selon temperature de
     2244        ! condensation, et le condensat en un tag specifique
    22452245!        write(*,*) 'cv3 tmp 2095 il,i,j,xtent(:,il,i,j)=',
    22462246!     :            il,i,j,xtent(:,il,i,j)
     
    24752475#ifdef ISOTRAC         
    24762476        if (option_tmin.ge.1) then
    2477         ! colorier la vapeur résiduelle selon température de
    2478         ! condensation, et le condensat en un tag spécifique
     2477        ! colorier la vapeur residuelle selon temperature de
     2478        ! condensation, et le condensat en un tag specifique
    24792479!        write(*,*) 'cv3 tmp 2314 il,i,j,xtent(:,il,i,j)=',
    24802480!     :            il,i,j,xtent(:,il,i,j)
     
    25792579#ifdef ISO
    25802580#ifdef ISOTRAC
    2581         ! seulement à la fin on taggue le condensat
     2581        ! seulement a la fin on taggue le condensat
    25822582        if (option_cond.ge.1) then
    25832583         do im = 1, nd
    25842584         do jm = 1, nd
    25852585         do il = 1, ncum   
    2586            ! colorier le condensat en un tag spécifique
     2586           ! colorier le condensat en un tag specifique
    25872587           do ixt=niso+1,ntraciso
    25882588             if (index_zone(ixt).eq.izone_cond) then
     
    26032603         do im = 1, nd
    26042604         do il = 1, ncum   
    2605            ! colorier le condensat en un tag spécifique
     2605           ! colorier le condensat en un tag specifique
    26062606           do ixt=niso+1,ntraciso
    26072607             if (index_zone(ixt).eq.izone_cond) then
     
    27392739  ! ------------------------------------------------------
    27402740!#ifdef ISOVERIF
    2741 !        write(*,*) 'cv30_routines 2382: entrée dans cv3_unsat'
     2741!        write(*,*) 'cv30_routines 2382: entree dans cv3_unsat'
    27422742!#endif
    27432743
     
    27472747  mp(:, :) = 0.
    27482748#ifdef ISO
    2749   ! initialisation plus complète de water et rp
     2749  ! initialisation plus complete de water et rp
    27502750  water(:,:)=0.0
    27512751  xtwater(:,:,:)=0.0
     
    29362936        call iso_verif_traceur(xtwdtrain(1,il),'cv30_routine 2540')
    29372937        if (option_cond.ge.1) then
    2938            ! on vérifie que tout le détrainement est taggé condensat
     2938           ! on verifie que tout le detrainement est tagge condensat
    29392939           if (iso_verif_positif_nostop( &
    29402940     &          xtwdtrain(index_trac(izone_cond,iso_eau),il) &
     
    30323032
    30333033#ifdef ISO
    3034       ! ajout cam: éviter les evaporations ou eaux négatives
    3035 !      water(il,i)=max(0.0,water(il,i)) ! ceci est toujours vérifié
     3034      ! ajout cam: eviter les evaporations ou eaux negatives
     3035!      water(il,i)=max(0.0,water(il,i)) ! ceci est toujours verifie
    30363036#ifdef ISOVERIF
    30373037          call iso_verif_positif(water(il,i),'cv30_unsat 2376')
     
    31893189#ifdef ISO
    31903190#ifdef ISOVERIF
    3191 ! verif des inputs à appel stewart
     3191! verif des inputs a appel stewart
    31923192!        write(*,*) 'cv30_routines 2842 tmp: appel de appel_stewart'
    31933193      do il=1,ncum
     
    32083208       enddo
    32093209#endif
    3210         ! appel de appel_stewart_vectorisé
     3210        ! appel de appel_stewart_vectorise
    32113211        call appel_stewart_vectall(lwork,ncum, &
    32123212     &                   ph,t,evap,xtwdtrain, &
     
    32683268#endif
    32693269       
    3270 ! équivalent isotopique de rp(il,i)=amin1(rp(il,i),rs(il,i))
     3270! equivalent isotopique de rp(il,i)=amin1(rp(il,i),rs(il,i))
    32713271       do il=1,ncum
    32723272        if (i.lt.inb(il) .and. lwork(il)) then
     
    34633463      real xtbx(ntraciso), xtawat(ntraciso)
    34643464      ! cam debug
    3465       ! pour l'homogénéisation sous le nuage:
     3465      ! pour l'homogeneisation sous le nuage:
    34663466      real frsum(nloc), bxtsum(ntraciso,nloc), fxtsum(ntraciso,nloc)
    3467       ! correction dans calcul tendance liée à Am:
     3467      ! correction dans calcul tendance liee a Am:
    34683468      real dq_tmp,k_tmp,dx_tmp,R_tmp,dqreste_tmp,dxreste_tmp,kad_tmp
    34693469      logical correction_excess_aberrant
    34703470      parameter (correction_excess_aberrant=.false.)
    3471         ! correction qui permettait d'éviter deltas et dexcess aberrants. Mais
     3471        ! correction qui permettait d'eviter deltas et dexcess aberrants. Mais
    34723472        ! pb: ne conserve pas la masse d'isotopes!
    34733473#ifdef DIAGISO
    3474         ! diagnostiques juste: tendance des différents processus
     3474        ! diagnostiques juste: tendance des differents processus
    34753475      real fxt_detrainement(ntraciso,nloc,nd)
    34763476      real fxt_fluxmasse(ntraciso,nloc,nd)
     
    35173517#ifdef ISO
    35183518       ! cam debug
    3519 !       write(*,*) 'cv30_routines 3082: entrée dans cv3_yield'
     3519!       write(*,*) 'cv30_routines 3082: entree dans cv3_yield'
    35203520       ! en cam debug
    35213521       do ixt = 1, ntraciso
     
    37493749        do ixt = 1, ntraciso
    37503750!        fxt_fluxmasse(ixt,il,1)=fxt_fluxmasse(ixt,il,1) &
    3751 !     &      +0.01*grav*am(il)*(xt(ixt,il,2)-xt(ixt,il,1))*work(il) ! déplacé
    3752 !     plus haut car il existe différents cas
     3751!     &      +0.01*grav*am(il)*(xt(ixt,il,2)-xt(ixt,il,1))*work(il) ! deplace
     3752!     plus haut car il existe differents cas
    37533753        fxt_ddft(ixt,il,1)=fxt_ddft(ixt,il,1) &
    37543754     &      +0.01*grav*mp(il,2)*(xtp(ixt,il,2)-xt(ixt,il,1))*work(il)
     
    37593759
    37603760
    3761         ! pour l'ajout de la tendance liée au flux de masse Am, il faut être
     3761        ! pour l'ajout de la tendance liee au flux de masse Am, il faut etre
    37623762        ! prudent.
    37633763        ! On a dq1=k*(q2-q1) avec k=dt*0.01*grav*am(il)*work(il)
    3764         ! Pour les isotopes, la formule utilisée depuis 2006 et qui avait toujours marché est:
     3764        ! Pour les isotopes, la formule utilisee depuis 2006 et qui avait toujours marche est:
    37653765        ! dx1=k*(x2-x1)
    3766         ! Mais on plante dans un cas pathologique en décembre 2017 lors du test
    3767         ! d'un cas d'Anne Cozic: les isotopes deviennent négatifs.
     3766        ! Mais on plante dans un cas pathologique en decembre 2017 lors du test
     3767        ! d'un cas d'Anne Cozic: les isotopes deviennent negatifs.
    37683768        ! C'est un cas pas physique: on perd 99% de la masse de vapeur d'eau!
    37693769        ! q2=1.01e-3 et q1=1.25e-3 kg/kg
    3770         ! et dq=-1.24e-3: comment est-ce possible qu'un flux venant d'un air à
    3771         ! q2= 1.01e-3 assèche q1 jusqu'à 0.01e-3kg/kg!
    3772         ! Pour les isotopes, ça donne des x1+dx négatifs.
    3773         ! Ce n'est pas physique mais il faut quand même s'adapter.
    3774         ! Pour cela, on considère que d'abord on fait rentrer le flux de masse
     3770        ! et dq=-1.24e-3: comment est-ce possible qu'un flux venant d'un air a
     3771        ! q2= 1.01e-3 asseche q1 jusqu'a 0.01e-3kg/kg!
     3772        ! Pour les isotopes, ca donne des x1+dx negatifs.
     3773        ! Ce n'est pas physique mais il faut quand meme s'adapter.
     3774        ! Pour cela, on considere que d'abord on fait rentrer le flux de masse
    37753775        ! descendant, et ensuite seulement on fait sortir le flux de masse
    37763776        ! sortant.
     
    37783778        ! isotopique de la vapeur d'eau q1.
    37793779        ! A la fin, on a R=(x1+dx)/(q1+dq)=(x1+k*x2)/(q1+k*q2)
    3780         ! On vérifie que quand k est petit, on tend vers la formulation
     3780        ! On verifie que quand k est petit, on tend vers la formulation
    37813781        ! habituelle.
    3782         ! Comme on est habitués à la formulation habituelle, qu'elle a fait ses
    3783         ! preuves, on la garde sauf dans le cas où dq/q<-0.9 où on utilise la
     3782        ! Comme on est habitues a la formulation habituelle, qu'elle a fait ses
     3783        ! preuves, on la garde sauf dans le cas ou dq/q<-0.9 ou on utilise la
    37843784        ! nouvelle formulation.
    37853785        ! rappel: dq_tmp=0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)*delt
    3786         ! Même avec cette nouvelle foirmulation, on a encore des isotopes
    3787         ! négatifs, cette fois à cause des ddfts
    3788         ! On considère donc les tendances et série et non en parallèle quand on
     3786        ! Meme avec cette nouvelle foirmulation, on a encore des isotopes
     3787        ! negatifs, cette fois a cause des ddfts
     3788        ! On considere donc les tendances et serie et non en parallele quand on
    37893789        ! calcule R_tmp.
    37903790        dq_tmp=0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)*delt ! utile ci-dessous
    37913791        if ((dq_tmp/rr(il,1).lt.-0.9).and.correction_excess_aberrant) then
    3792                 ! nouvelle formulation où on fait d'abord entrer k*q2 et ensuite
     3792                ! nouvelle formulation ou on fait d'abord entrer k*q2 et ensuite
    37933793                ! seulement on fait sortir k*q1 sans changement de composition
    37943794                ! isotopique
     
    38283828           enddo ! do ixt = 1, ntraciso
    38293829        else !if (dq_tmp/rr(il,1).lt.-0.9) then
    3830                 ! formulation habituelle qui avait toujours marché de 2006 à
    3831                 ! décembre 2017.
     3830                ! formulation habituelle qui avait toujours marche de 2006 a
     3831                ! decembre 2017.
    38323832           do ixt = 1, ntraciso     
    38333833                fxt(ixt,il,1)=fxt(ixt,il,1) &
     
    42324232        ! ad.
    42334233#endif
    4234        ! ici, on sépare 2 cas, pour éviter le cas pathologique décrit plus haut
    4235        ! pour la tendance liée à Am en i=1, qui peut conduire à des isotopes
    4236        ! négatifs dans les cas où les flux de masse soustrait plus de 90% de la
    4237        ! vapeur de la couche. Voir plus haut le détail des équations.
    4238        ! La différence ici est qu'on considère les flux de masse amp1 et ad en
    4239        ! même temps.
     4234       ! ici, on separe 2 cas, pour eviter le cas pathologique decrit plus haut
     4235       ! pour la tendance liee a Am en i=1, qui peut conduire a des isotopes
     4236       ! negatifs dans les cas ou les flux de masse soustrait plus de 90% de la
     4237       ! vapeur de la couche. Voir plus haut le detail des equations.
     4238       ! La difference ici est qu'on considere les flux de masse amp1 et ad en
     4239       ! meme temps.
    42404240       dq_tmp= 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) &
    42414241    &            -ad(il)*(rr(il,i)-rr(il,i-1)))*delt
    4242        ! c'est équivalent à dqi= kamp1*qip1+kad*qim1-(kamp1+kad)*qi
     4242       ! c'est equivalent a dqi= kamp1*qip1+kad*qim1-(kamp1+kad)*qi
    42434243       if ((dq_tmp/rr(il,i).lt.-0.9).and.correction_excess_aberrant) then
    42444244        ! nouvelle formulation
     
    44304430        ! on change le traitement de cette ligne le 8 mai 2009:
    44314431        ! avant, on avait: xtawat=xtelij(il,k,i)-(1.-xtep(il,i))*xtclw(il,i)
    4432         ! c'est à dire que Rawat=Relij+(1-ep)*clw/awat*(Relij-Rclw)
    4433         ! si Relij!=Rclw, alors un fractionnement isotopique non physique était
     4432        ! c'est a dire que Rawat=Relij+(1-ep)*clw/awat*(Relij-Rclw)
     4433        ! si Relij!=Rclw, alors un fractionnement isotopique non physique etait
    44344434        ! introduit.
    4435         ! En fait, awat représente le surplus de condensat dans le mélange par
    4436         ! rapport à celui restant dans la colonne adiabatique
    4437         ! ce surplus à la même compo que le elij, sans fractionnement.
    4438         ! d'où le nouveau traitement ci-dessous.
     4435        ! En fait, awat represente le surplus de condensat dans le melange par
     4436        ! rapport a celui restant dans la colonne adiabatique
     4437        ! ce surplus a la meme compo que le elij, sans fractionnement.
     4438        ! d'ou le nouveau traitement ci-dessous.
    44394439      if (elij(il,k,i).gt.0.0) then
    44404440        do ixt = 1, ntraciso
    44414441          xtawat(ixt)=awat*(xtelij(ixt,il,k,i)/elij(il,k,i))
    4442 !          xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas nécessaire
     4442!          xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas necessaire
    44434443        enddo
    44444444      else !if (elij(il,k,i).gt.0.0) then
    44454445          ! normalement, si elij(il,k,i)<=0, alors awat=0
    4446           ! on le vérifie. Si c'est vrai -> xtawat=0 aussi
     4446          ! on le verifie. Si c'est vrai -> xtawat=0 aussi
    44474447#ifdef ISOVERIF
    44484448        call iso_verif_egalite(awat,0.0,'cv30_yield 3779')
     
    49424942     &       'cv30_yield 5029,O18, evap')
    49434943          if ((il.eq.1636).and.(i.eq.9)) then
    4944             write(*,*) 'cv30_yield 5057: ici, on vérifie deltaD_nobx'
     4944            write(*,*) 'cv30_yield 5057: ici, on verifie deltaD_nobx'
    49454945            write(*,*) 'il,i=',il,i
    49464946            write(*,*) 'fr(il,i),bx,fr(il,i)-bx=',fr(il,i),bx,fr(il,i)-bx
     
    49734973        else ! taggage des ddfts:
    49744974        ! la formule pour fq_ddft suppose que le ddft est en RP. Ce n'est pas le
    4975         ! cas pour le water tagging puisqu'il y a conversion des molécules
    4976         ! blances entrainées en molécule rouges.
     4975        ! cas pour le water tagging puisqu'il y a conversion des molecules
     4976        ! blances entrainees en molecule rouges.
    49774977        ! Il faut donc prendre en compte ce taux de conversion quand
    49784978        ! entrainement d'env vers ddft
     
    49834983!     :           -conversion(iiso)   
    49844984
    4985         ! Pb: quand on discretise, dqp/dt n'est pas vérifée numériquement.
    4986         ! on se retrouve donc avec des d Ye/dt différents de 0 même si ye=0 ( on
    4987         ! note X les molécules poubelles et Y les molécules ddfts).
     4985        ! Pb: quand on discretise, dqp/dt n'est pas verifee numeriquement.
     4986        ! on se retrouve donc avec des d Ye/dt differents de 0 meme si ye=0 ( on
     4987        ! note X les molecules poubelles et Y les molecules ddfts).
    49884988
    49894989        ! Solution alternative: Dans le cas entrainant, Ye ne varie que par
    49904990        ! ascendance compensatoire des ddfts et par perte de Ye vers le ddft. On
    4991         ! calcule donc ce terme directement avec schéma amont:
    4992 
    4993         ! ajout déjà de l'évap
     4991        ! calcule donc ce terme directement avec schema amont:
     4992
     4993        ! ajout deja de l'evap
    49944994        do ixt = 1+niso,ntraciso
    49954995             fxt(ixt,il,i)=fxt(ixt,il,i) &
     
    50695069#endif
    50705070                else !if (abs(dXe).gt.ridicule) then
    5071                     ! dans ce cas, fxtXe doit être faible
     5071                    ! dans ce cas, fxtXe doit etre faible
    50725072                   
    50735073#ifdef ISOVERIF
     
    50855085                      fxt(ixt,il,i)=fxt(ixt,il,i)+fxtXe(iiso)
    50865086                    else !if (izone.eq.izone_poubelle) then
    5087                         ! pas de tendance pour ce tag là
     5087                        ! pas de tendance pour ce tag la
    50885088                    endif !if (izone.eq.izone_poubelle) then
    50895089                   endif !if ((izone.ne.izone_revap).and.
     
    50995099               
    51005100            else !if (mp(il,i).gt.mp(il,i+1)) then
    5101                 ! cas détrainant: pas de problèmes
     5101                ! cas detrainant: pas de problemes
    51025102                do ixt=1+niso,ntraciso
    51035103                fxt(ixt,il,i)=fxt(ixt,il,i) &
     
    53895389  DO il = 1, ncum
    53905390
    5391 ! attention, on corrige un problème C Risi
     5391! attention, on corrige un probleme C Risi
    53925392      IF (cvflag_grav) then
    53935393
     
    57225722!             write(*,*) 'cv30_routine 3990: fin des il pour i=',i
    57235723          enddo !do i=1,nl
    5724 !          write(*,*) 'cv30_routine 3990: fin des vérifs sur homogen'
     5724!          write(*,*) 'cv30_routine 3990: fin des verifs sur homogen'
    57255725#endif
    57265726
     
    60276027
    60286028  ! fraction deau condensee dans les melanges convertie en precip : epm
    6029   ! et eau condensée précipitée dans masse d'air saturé : l_m*dM_m/dzdz.dzdz
     6029  ! et eau condensee precipitee dans masse d'air sature : l_m*dM_m/dzdz.dzdz
    60306030  DO j = 1, nam1
    60316031    DO k = 1, j - 1
     
    62266226
    62276227#ifdef ISOVERIF
    6228         write(*,*) 'cv30_routines 4293: entrée dans cv3_uncompress'
     6228        write(*,*) 'cv30_routines 4293: entree dans cv3_uncompress'
    62296229#endif
    62306230  DO i = 1, ncum
     
    63466346
    63476347        ! On fait varier epmax en fn de la cape
    6348         ! Il faut donc recalculer ep, et hp qui a déjà été calculé et
    6349         ! qui en dépend
    6350         ! Toutes les autres variables fn de ep sont calculées plus bas.
     6348        ! Il faut donc recalculer ep, et hp qui a deja ete calcule et
     6349        ! qui en depend
     6350        ! Toutes les autres variables fn de ep sont calculees plus bas.
    63516351
    63526352#include "cvthermo.h"
Note: See TracChangeset for help on using the changeset viewer.