Changeset 4050 for LMDZ6/trunk/libf/phylmdiso/cv30_routines.F90
- Timestamp:
- Dec 23, 2021, 6:54:17 PM (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmdiso/cv30_routines.F90
r4004 r4050 449 449 450 450 #ifdef ISOVERIF 451 write(*,*) 'cv30_routine undilute 1 413: entr ée'451 write(*,*) 'cv30_routine undilute 1 413: entree' 452 452 #endif 453 453 … … 602 602 zfice(i) = MIN(MAX(zfice(i),0.0),1.0) 603 603 enddo 604 ! calcul de la composition du condensat glac éet liquide604 ! calcul de la composition du condensat glace et liquide 605 605 606 606 do i=1,len … … 647 647 648 648 #ifdef ISOVERIF 649 write(*,*) 'cv30_routine undilute 1 598: apr ès condiso'649 write(*,*) 'cv30_routine undilute 1 598: apres condiso' 650 650 651 651 if (iso_eau.gt.0) then … … 1012 1012 else 1013 1013 q(i,k)=0.0 1014 clw(i,k)=0.0 ! mise en commentaire le 5 avril pour v érif1014 clw(i,k)=0.0 ! mise en commentaire le 5 avril pour verif 1015 1015 ! convergence 1016 1016 endif !f (negation(essai_convergence)) then … … 1908 1908 real xtrti(ntraciso,nloc) 1909 1909 real xtres(ntraciso) 1910 ! on ajoute la dimension nloc à xtrti pour vérifs dans les tags: 5 fev1910 ! on ajoute la dimension nloc a xtrti pour verifs dans les tags: 5 fev 1911 1911 ! 2010 1912 1912 real zfice(nloc),zxtliq(ntraciso,nloc),zxtice(ntraciso,nloc) … … 1923 1923 #ifdef ISO 1924 1924 #ifdef ISOVERIF 1925 write(*,*) 'cv30_routines 1820: entr ée dans cv3_mixing'1925 write(*,*) 'cv30_routines 1820: entree dans cv3_mixing' 1926 1926 if (iso_eau.gt.0) then 1927 1927 call iso_verif_egalite_vect2D( & … … 1965 1965 xtelij(ixt,i,k,j)=0.0 1966 1966 enddo !do ixt =1,niso 1967 ! on initialise mieux que ça qent et elij, même si au final les1968 ! valeurs en nd=nl+1 ne sont pas utilis ées1967 ! on initialise mieux que ca qent et elij, meme si au final les 1968 ! valeurs en nd=nl+1 ne sont pas utilisees 1969 1969 qent(i,k,j)=rr(i,j) 1970 1970 elij(i,k,j)=0.0 … … 2121 2121 ! : 'tcond(il),rs(il,j)=', 2122 2122 ! : il,i,j,xtent(:,il,i,j),tcond(il),rs(il,j) 2123 ! colorier la vapeur r ésiduelle selon température de2124 ! condensation, et le condensat en un tag sp écifique2123 ! colorier la vapeur residuelle selon temperature de 2124 ! condensation, et le condensat en un tag spEcifique 2125 2125 if ((elij(il,i,j).gt.0.0).and.(qent(il,i,j).gt.0.0)) then 2126 2126 if (option_traceurs.eq.17) then … … 2241 2241 #ifdef ISOTRAC 2242 2242 if (option_tmin.ge.1) then 2243 ! colorier la vapeur r ésiduelle selon température de2244 ! condensation, et le condensat en un tag sp écifique2243 ! colorier la vapeur residuelle selon temperature de 2244 ! condensation, et le condensat en un tag specifique 2245 2245 ! write(*,*) 'cv3 tmp 2095 il,i,j,xtent(:,il,i,j)=', 2246 2246 ! : il,i,j,xtent(:,il,i,j) … … 2475 2475 #ifdef ISOTRAC 2476 2476 if (option_tmin.ge.1) then 2477 ! colorier la vapeur r ésiduelle selon température de2478 ! condensation, et le condensat en un tag sp écifique2477 ! colorier la vapeur residuelle selon temperature de 2478 ! condensation, et le condensat en un tag specifique 2479 2479 ! write(*,*) 'cv3 tmp 2314 il,i,j,xtent(:,il,i,j)=', 2480 2480 ! : il,i,j,xtent(:,il,i,j) … … 2579 2579 #ifdef ISO 2580 2580 #ifdef ISOTRAC 2581 ! seulement àla fin on taggue le condensat2581 ! seulement a la fin on taggue le condensat 2582 2582 if (option_cond.ge.1) then 2583 2583 do im = 1, nd 2584 2584 do jm = 1, nd 2585 2585 do il = 1, ncum 2586 ! colorier le condensat en un tag sp écifique2586 ! colorier le condensat en un tag specifique 2587 2587 do ixt=niso+1,ntraciso 2588 2588 if (index_zone(ixt).eq.izone_cond) then … … 2603 2603 do im = 1, nd 2604 2604 do il = 1, ncum 2605 ! colorier le condensat en un tag sp écifique2605 ! colorier le condensat en un tag specifique 2606 2606 do ixt=niso+1,ntraciso 2607 2607 if (index_zone(ixt).eq.izone_cond) then … … 2739 2739 ! ------------------------------------------------------ 2740 2740 !#ifdef ISOVERIF 2741 ! write(*,*) 'cv30_routines 2382: entr ée dans cv3_unsat'2741 ! write(*,*) 'cv30_routines 2382: entree dans cv3_unsat' 2742 2742 !#endif 2743 2743 … … 2747 2747 mp(:, :) = 0. 2748 2748 #ifdef ISO 2749 ! initialisation plus compl ète de water et rp2749 ! initialisation plus complete de water et rp 2750 2750 water(:,:)=0.0 2751 2751 xtwater(:,:,:)=0.0 … … 2936 2936 call iso_verif_traceur(xtwdtrain(1,il),'cv30_routine 2540') 2937 2937 if (option_cond.ge.1) then 2938 ! on v érifie que tout le détrainement est taggécondensat2938 ! on verifie que tout le detrainement est tagge condensat 2939 2939 if (iso_verif_positif_nostop( & 2940 2940 & xtwdtrain(index_trac(izone_cond,iso_eau),il) & … … 3032 3032 3033 3033 #ifdef ISO 3034 ! ajout cam: éviter les evaporations ou eaux négatives3035 ! 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 3036 3036 #ifdef ISOVERIF 3037 3037 call iso_verif_positif(water(il,i),'cv30_unsat 2376') … … 3189 3189 #ifdef ISO 3190 3190 #ifdef ISOVERIF 3191 ! verif des inputs àappel stewart3191 ! verif des inputs a appel stewart 3192 3192 ! write(*,*) 'cv30_routines 2842 tmp: appel de appel_stewart' 3193 3193 do il=1,ncum … … 3208 3208 enddo 3209 3209 #endif 3210 ! appel de appel_stewart_vectoris é3210 ! appel de appel_stewart_vectorise 3211 3211 call appel_stewart_vectall(lwork,ncum, & 3212 3212 & ph,t,evap,xtwdtrain, & … … 3268 3268 #endif 3269 3269 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)) 3271 3271 do il=1,ncum 3272 3272 if (i.lt.inb(il) .and. lwork(il)) then … … 3463 3463 real xtbx(ntraciso), xtawat(ntraciso) 3464 3464 ! cam debug 3465 ! pour l'homog énéisation sous le nuage:3465 ! pour l'homogeneisation sous le nuage: 3466 3466 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: 3468 3468 real dq_tmp,k_tmp,dx_tmp,R_tmp,dqreste_tmp,dxreste_tmp,kad_tmp 3469 3469 logical correction_excess_aberrant 3470 3470 parameter (correction_excess_aberrant=.false.) 3471 ! correction qui permettait d' éviter deltas et dexcess aberrants. Mais3471 ! correction qui permettait d'eviter deltas et dexcess aberrants. Mais 3472 3472 ! pb: ne conserve pas la masse d'isotopes! 3473 3473 #ifdef DIAGISO 3474 ! diagnostiques juste: tendance des diff érents processus3474 ! diagnostiques juste: tendance des differents processus 3475 3475 real fxt_detrainement(ntraciso,nloc,nd) 3476 3476 real fxt_fluxmasse(ntraciso,nloc,nd) … … 3517 3517 #ifdef ISO 3518 3518 ! cam debug 3519 ! write(*,*) 'cv30_routines 3082: entr ée dans cv3_yield'3519 ! write(*,*) 'cv30_routines 3082: entree dans cv3_yield' 3520 3520 ! en cam debug 3521 3521 do ixt = 1, ntraciso … … 3749 3749 do ixt = 1, ntraciso 3750 3750 ! 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 cas3751 ! & +0.01*grav*am(il)*(xt(ixt,il,2)-xt(ixt,il,1))*work(il) ! deplace 3752 ! plus haut car il existe differents cas 3753 3753 fxt_ddft(ixt,il,1)=fxt_ddft(ixt,il,1) & 3754 3754 & +0.01*grav*mp(il,2)*(xtp(ixt,il,2)-xt(ixt,il,1))*work(il) … … 3759 3759 3760 3760 3761 ! pour l'ajout de la tendance li ée au flux de masse Am, il faut être3761 ! pour l'ajout de la tendance liee au flux de masse Am, il faut etre 3762 3762 ! prudent. 3763 3763 ! 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: 3765 3765 ! dx1=k*(x2-x1) 3766 ! Mais on plante dans un cas pathologique en d écembre 2017 lors du test3767 ! 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. 3768 3768 ! C'est un cas pas physique: on perd 99% de la masse de vapeur d'eau! 3769 3769 ! 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 masse3770 ! 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 3775 3775 ! descendant, et ensuite seulement on fait sortir le flux de masse 3776 3776 ! sortant. … … 3778 3778 ! isotopique de la vapeur d'eau q1. 3779 3779 ! 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 formulation3780 ! On verifie que quand k est petit, on tend vers la formulation 3781 3781 ! habituelle. 3782 ! Comme on est habitu és àla formulation habituelle, qu'elle a fait ses3783 ! preuves, on la garde sauf dans le cas o ù dq/q<-0.9 oùon utilise la3782 ! 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 3784 3784 ! nouvelle formulation. 3785 3785 ! 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 isotopes3787 ! n égatifs, cette fois àcause des ddfts3788 ! On consid ère donc les tendances et série et non en parallèle quand on3786 ! 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 3789 3789 ! calcule R_tmp. 3790 3790 dq_tmp=0.01*grav*am(il)*(rr(il,2)-rr(il,1))*work(il)*delt ! utile ci-dessous 3791 3791 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 ensuite3792 ! nouvelle formulation ou on fait d'abord entrer k*q2 et ensuite 3793 3793 ! seulement on fait sortir k*q1 sans changement de composition 3794 3794 ! isotopique … … 3828 3828 enddo ! do ixt = 1, ntraciso 3829 3829 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. 3832 3832 do ixt = 1, ntraciso 3833 3833 fxt(ixt,il,1)=fxt(ixt,il,1) & … … 4232 4232 ! ad. 4233 4233 #endif 4234 ! ici, on s épare 2 cas, pour éviter le cas pathologique décrit plus haut4235 ! pour la tendance li ée à Am en i=1, qui peut conduire àdes isotopes4236 ! n égatifs dans les cas oùles flux de masse soustrait plus de 90% de la4237 ! 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 en4239 ! 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. 4240 4240 dq_tmp= 0.01*grav*dpinv*(amp1(il)*(rr(il,i+1)-rr(il,i)) & 4241 4241 & -ad(il)*(rr(il,i)-rr(il,i-1)))*delt 4242 ! c'est équivalent àdqi= kamp1*qip1+kad*qim1-(kamp1+kad)*qi4242 ! c'est equivalent a dqi= kamp1*qip1+kad*qim1-(kamp1+kad)*qi 4243 4243 if ((dq_tmp/rr(il,i).lt.-0.9).and.correction_excess_aberrant) then 4244 4244 ! nouvelle formulation … … 4430 4430 ! on change le traitement de cette ligne le 8 mai 2009: 4431 4431 ! 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 était4432 ! c'est a dire que Rawat=Relij+(1-ep)*clw/awat*(Relij-Rclw) 4433 ! si Relij!=Rclw, alors un fractionnement isotopique non physique etait 4434 4434 ! introduit. 4435 ! En fait, awat repr ésente le surplus de condensat dans le mélange par4436 ! rapport àcelui restant dans la colonne adiabatique4437 ! 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. 4439 4439 if (elij(il,k,i).gt.0.0) then 4440 4440 do ixt = 1, ntraciso 4441 4441 xtawat(ixt)=awat*(xtelij(ixt,il,k,i)/elij(il,k,i)) 4442 ! xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas n écessaire4442 ! xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas necessaire 4443 4443 enddo 4444 4444 else !if (elij(il,k,i).gt.0.0) then 4445 4445 ! normalement, si elij(il,k,i)<=0, alors awat=0 4446 ! on le v érifie. Si c'est vrai -> xtawat=0 aussi4446 ! on le verifie. Si c'est vrai -> xtawat=0 aussi 4447 4447 #ifdef ISOVERIF 4448 4448 call iso_verif_egalite(awat,0.0,'cv30_yield 3779') … … 4942 4942 & 'cv30_yield 5029,O18, evap') 4943 4943 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' 4945 4945 write(*,*) 'il,i=',il,i 4946 4946 write(*,*) 'fr(il,i),bx,fr(il,i)-bx=',fr(il,i),bx,fr(il,i)-bx … … 4973 4973 else ! taggage des ddfts: 4974 4974 ! 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 écules4976 ! 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. 4977 4977 ! Il faut donc prendre en compte ce taux de conversion quand 4978 4978 ! entrainement d'env vers ddft … … 4983 4983 ! : -conversion(iiso) 4984 4984 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 ( on4987 ! 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). 4988 4988 4989 4989 ! Solution alternative: Dans le cas entrainant, Ye ne varie que par 4990 4990 ! 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'évap4991 ! calcule donc ce terme directement avec schema amont: 4992 4993 ! ajout deja de l'evap 4994 4994 do ixt = 1+niso,ntraciso 4995 4995 fxt(ixt,il,i)=fxt(ixt,il,i) & … … 5069 5069 #endif 5070 5070 else !if (abs(dXe).gt.ridicule) then 5071 ! dans ce cas, fxtXe doit être faible5071 ! dans ce cas, fxtXe doit etre faible 5072 5072 5073 5073 #ifdef ISOVERIF … … 5085 5085 fxt(ixt,il,i)=fxt(ixt,il,i)+fxtXe(iiso) 5086 5086 else !if (izone.eq.izone_poubelle) then 5087 ! pas de tendance pour ce tag l à5087 ! pas de tendance pour ce tag la 5088 5088 endif !if (izone.eq.izone_poubelle) then 5089 5089 endif !if ((izone.ne.izone_revap).and. … … 5099 5099 5100 5100 else !if (mp(il,i).gt.mp(il,i+1)) then 5101 ! cas d étrainant: pas de problèmes5101 ! cas detrainant: pas de problemes 5102 5102 do ixt=1+niso,ntraciso 5103 5103 fxt(ixt,il,i)=fxt(ixt,il,i) & … … 5389 5389 DO il = 1, ncum 5390 5390 5391 ! attention, on corrige un probl ème C Risi5391 ! attention, on corrige un probleme C Risi 5392 5392 IF (cvflag_grav) then 5393 5393 … … 5722 5722 ! write(*,*) 'cv30_routine 3990: fin des il pour i=',i 5723 5723 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' 5725 5725 #endif 5726 5726 … … 6027 6027 6028 6028 ! 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.dzdz6029 ! et eau condensee precipitee dans masse d'air sature : l_m*dM_m/dzdz.dzdz 6030 6030 DO j = 1, nam1 6031 6031 DO k = 1, j - 1 … … 6226 6226 6227 6227 #ifdef ISOVERIF 6228 write(*,*) 'cv30_routines 4293: entr ée dans cv3_uncompress'6228 write(*,*) 'cv30_routines 4293: entree dans cv3_uncompress' 6229 6229 #endif 6230 6230 DO i = 1, ncum … … 6346 6346 6347 6347 ! On fait varier epmax en fn de la cape 6348 ! Il faut donc recalculer ep, et hp qui a d éjà été calculéet6349 ! qui en d épend6350 ! 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. 6351 6351 6352 6352 #include "cvthermo.h"
Note: See TracChangeset
for help on using the changeset viewer.