Changeset 4050 for LMDZ6/trunk/libf/phylmdiso
- Timestamp:
- Dec 23, 2021, 6:54:17 PM (3 years ago)
- Location:
- LMDZ6/trunk/libf/phylmdiso
- Files:
-
- 7 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" -
LMDZ6/trunk/libf/phylmdiso/cv3_routines.F90
r4033 r4050 403 403 enddo !do i=1,len 404 404 #endif 405 ! initialiser quelques variables oubli ées405 ! initialiser quelques variables oubliees 406 406 do i=1,len 407 407 plcllo(i)=0.0 … … 900 900 zfice(i) = MIN(MAX(zfice(i),0.0),1.0) 901 901 enddo 902 ! calcul de la composition du condensat glac éet liquide902 ! calcul de la composition du condensat glace et liquide 903 903 904 904 do i=1,len … … 959 959 960 960 #ifdef ISOVERIF 961 write(*,*) 'cv3_routine undilute 1 598: apr ès condiso'961 write(*,*) 'cv3_routine undilute 1 598: apres condiso' 962 962 963 963 if (iso_eau.gt.0) then … … 1435 1435 1436 1436 !JAM-------------------------------------------------------------------- 1437 ! Calcul de la quantit éd'eau sous forme de glace1437 ! Calcul de la quantite d'eau sous forme de glace 1438 1438 ! -------------------------------------------------------------------- 1439 1439 INTEGER nl, len … … 2856 2856 real xtrti(ntraciso,nloc) 2857 2857 real xtres(ntraciso) 2858 ! on ajoute la dimension nloc à xtrti pour vérifs dans les tags: 5 fev2858 ! on ajoute la dimension nloc a xtrti pour verifs dans les tags: 5 fev 2859 2859 ! 2010 2860 2860 real zfice(nloc),zxtliq(ntraciso,nloc),zxtice(ntraciso,nloc) … … 2873 2873 #ifdef ISO 2874 2874 #ifdef ISOVERIF 2875 ! write(*,*) 'cv3_routines 1820: entr ée dans cv3_mixing'2875 ! write(*,*) 'cv3_routines 1820: entree dans cv3_mixing' 2876 2876 do i=minorig+1,nl 2877 2877 do il=1,ncum … … 3083 3083 ! : 'tcond(il),rs(il,j)=', 3084 3084 ! : il,i,j,xtent(:,il,i,j),tcond(il),rs(il,j) 3085 ! colorier la vapeur r ésiduelle selon température de3086 ! condensation, et le condensat en un tag sp écifique3085 ! colorier la vapeur residuelle selon temperature de 3086 ! condensation, et le condensat en un tag specifique 3087 3087 if ((elij(il,i,j).gt.0.0).and.(qent(il,i,j).gt.0.0)) then 3088 3088 if (option_traceurs.eq.17) then … … 3194 3194 #ifdef ISOTRAC 3195 3195 if (option_tmin.ge.1) then 3196 ! colorier la vapeur r ésiduelle selon température de3197 ! condensation, et le condensat en un tag sp écifique3196 ! colorier la vapeur residuelle selon temperature de 3197 ! condensation, et le condensat en un tag specifique 3198 3198 ! write(*,*) 'cv3 tmp 2095 il,i,j,xtent(:,il,i,j)=', 3199 3199 ! : il,i,j,xtent(:,il,i,j) … … 3431 3431 #ifdef ISOTRAC 3432 3432 if (option_tmin.ge.1) then 3433 ! colorier la vapeur r ésiduelle selon température de3434 ! condensation, et le condensat en un tag sp écifique3433 ! colorier la vapeur residuelle selon temperature de 3434 ! condensation, et le condensat en un tag specifique 3435 3435 ! write(*,*) 'cv3 tmp 2314 il,i,j,xtent(:,il,i,j)=', 3436 3436 ! : il,i,j,xtent(:,il,i,j) … … 3543 3543 #ifdef ISO 3544 3544 #ifdef ISOTRAC 3545 ! seulement àla fin on taggue le condensat3545 ! seulement a la fin on taggue le condensat 3546 3546 if (option_cond.ge.1) then 3547 3547 do im = 1, nd 3548 3548 do jm = 1, nd 3549 3549 do il = 1, ncum 3550 ! colorier le condensat en un tag sp écifique3550 ! colorier le condensat en un tag specifique 3551 3551 do ixt=niso+1,ntraciso 3552 3552 if (index_zone(ixt).eq.izone_cond) then … … 3567 3567 do im = 1, nd 3568 3568 do il = 1, ncum 3569 ! colorier le condensat en un tag sp écifique3569 ! colorier le condensat en un tag specifique 3570 3570 do ixt=niso+1,ntraciso 3571 3571 if (index_zone(ixt).eq.izone_cond) then … … 3991 3991 call iso_verif_traceur(xtwdtrain(1,il),'cv3_routine 2540') 3992 3992 if (option_cond.ge.1) then 3993 ! on v érifie que tout le détrainement est taggécondensat3993 ! on verifie que tout le detrainement est tagge condensat 3994 3994 if (iso_verif_positif_nostop( & 3995 3995 & xtwdtrain(index_trac(izone_cond,iso_eau),il) & … … 4156 4156 !!---end jyg--- 4157 4157 4158 ! --------retour àla formulation originale d'Emanuel.4158 ! --------retour a la formulation originale d'Emanuel. 4159 4159 IF (cvflag_ice) THEN 4160 4160 … … 4170 4170 4171 4171 !JAM Attention: evap=sigt*E 4172 ! Modification: evap devient l' évaporation en milieu de couche4173 ! car n écessaire dans cv3_yield4174 ! Du coup, il faut modifier pas mal d' équations...4172 ! Modification: evap devient l'evaporation en milieu de couche 4173 ! car necessaire dans cv3_yield 4174 ! Du coup, il faut modifier pas mal d'equations... 4175 4175 ! et l'expression de afac qui devient afac1 4176 4176 ! revap=sqrt((prec(i+1)+prec(i))/2) … … 4191 4191 !JYG Dans sa formulation originale, Emanuel calcule l'evaporation par: 4192 4192 ! c evap(il,i)=sigt*afac*revap 4193 ! ce qui n'est pas correct. Dans cv_routines, la formulation a étémodifiee.4193 ! ce qui n'est pas correct. Dans cv_routines, la formulation a ete modifiee. 4194 4194 ! Ici,l'evaporation evap est simplement calculee par l'equation de 4195 4195 ! conservation. … … 4525 4525 #ifdef ISO 4526 4526 #ifdef ISOVERIF 4527 ! verif des inputs àappel stewart4527 ! verif des inputs a appel stewart 4528 4528 do il=1,ncum 4529 4529 if (i.le.inb(il) .and. lwork(il)) then … … 4543 4543 enddo 4544 4544 #endif 4545 ! appel de appel_stewart_vectoris é4545 ! appel de appel_stewart_vectorise 4546 4546 call appel_stewart_vectall_np(lwork,ncum, & 4547 4547 & ph,t,evap,xtwdtrain, & … … 4611 4611 #endif 4612 4612 4613 ! équivalent isotopique de rp(il,i)=amin1(rp(il,i),rs(il,i))4613 ! equivalent isotopique de rp(il,i)=amin1(rp(il,i),rs(il,i)) 4614 4614 do il=1,ncum 4615 4615 if (i.lt.inb(il) .and. lwork(il)) then … … 4651 4651 #endif 4652 4652 rpprec(il,i)=rs(il,i) 4653 ! sous cas rajout éle 11dec 2011. Normalement, pas utile4653 ! sous cas rajoute le 11dec 2011. Normalement, pas utile 4654 4654 else if (rp(il,i).eq.0.0) then 4655 4655 do ixt=1,ntraciso … … 4864 4864 real xtbx(ntraciso), xtawat(ntraciso,nloc) 4865 4865 ! cam debug 4866 ! pour l'homog énéisation sous le nuage:4866 ! pour l'homogeneisation sous le nuage: 4867 4867 real bxtsum(ntraciso,nloc), fxtsum(ntraciso,nloc) 4868 4868 #ifdef DIAGISO 4869 ! diagnostiques juste: tendance des diff érents processus4869 ! diagnostiques juste: tendance des differents processus 4870 4870 real fxt_detrainement(niso,nloc,nd) 4871 4871 real fxt_fluxmasse(niso,nloc,nd) … … 4917 4917 #ifdef ISO 4918 4918 ! cam debug 4919 ! write(*,*) 'cv3_routines 3082: entr ée dans cv3_yield'4919 ! write(*,*) 'cv3_routines 3082: entree dans cv3_yield' 4920 4920 ! en cam debug 4921 4921 do ixt = 1, ntraciso … … 4994 4994 END DO 4995 4995 #ifdef ISO 4996 ! on initialise mieux fr et fxt par securit é4996 ! on initialise mieux fr et fxt par securite 4997 4997 fr(:,:)=0.0 4998 4998 fxt(:,:,:)=0.0 … … 5845 5845 else ! taggage des ddfts: 5846 5846 ! la formule pour fq_ddft suppose que le ddft est en RP. Ce n'est pas le 5847 ! cas pour le water tagging puisqu'il y a conversion des mol écules5848 ! blances entrain ées en molécule rouges.5847 ! cas pour le water tagging puisqu'il y a conversion des molecules 5848 ! blances entrainees en molecule rouges. 5849 5849 ! Il faut donc prendre en compte ce taux de conversion quand 5850 5850 ! entrainement d'env vers ddft … … 5855 5855 ! : -conversion(iiso) 5856 5856 5857 ! Pb: quand on discretise, dqp/dt n'est pas v érifée numériquement.5858 ! on se retrouve donc avec des d Ye/dt diff érents de 0 même si ye=0 ( on5859 ! note X les mol écules poubelles et Y les molécules ddfts).5857 ! Pb: quand on discretise, dqp/dt n'est pas verifee numeriquement. 5858 ! on se retrouve donc avec des d Ye/dt differents de 0 meme si ye=0 ( on 5859 ! note X les molecules poubelles et Y les molecules ddfts). 5860 5860 5861 5861 ! Solution alternative: Dans le cas entrainant, Ye ne varie que par 5862 5862 ! ascendance compensatoire des ddfts et par perte de Ye vers le ddft. On 5863 ! calcule donc ce terme directement avec sch éma amont:5864 5865 ! ajout d éjà de l'évap5863 ! calcule donc ce terme directement avec schema amont: 5864 5865 ! ajout deja de l'evap 5866 5866 do ixt = 1+niso,ntraciso 5867 5867 fxt(ixt,il,i)=fxt(ixt,il,i) & … … 5941 5941 #endif 5942 5942 else !if (abs(dXe).gt.ridicule) then 5943 ! dans ce cas, fxtXe doit être faible5943 ! dans ce cas, fxtXe doit etre faible 5944 5944 5945 5945 #ifdef ISOVERIF … … 5957 5957 fxt(ixt,il,i)=fxt(ixt,il,i)+fxtXe(iiso) 5958 5958 else !if (izone.eq.izone_poubelle) then 5959 ! pas de tendance pour ce tag l à5959 ! pas de tendance pour ce tag la 5960 5960 endif !if (izone.eq.izone_poubelle) then 5961 5961 endif !if ((izone.ne.izone_revap).and. … … 5971 5971 5972 5972 else !if (mp(il,i).gt.mp(il,i+1)) then 5973 ! cas d étrainant: pas de problèmes5973 ! cas detrainant: pas de problemes 5974 5974 do ixt=1+niso,ntraciso 5975 5975 fxt(ixt,il,i)=fxt(ixt,il,i) & … … 6176 6176 ! on change le traitement de cette ligne le 8 mai 2009: 6177 6177 ! avant, on avait: xtawat=xtelij(il,k,i)-(1.-xtep(il,i))*xtclw(il,i) 6178 ! c'est àdire que Rawat=Relij+(1-ep)*clw/awat*(Relij-Rclw)6179 ! si Relij!=Rclw, alors un fractionnement isotopique non physique était6178 ! c'est a dire que Rawat=Relij+(1-ep)*clw/awat*(Relij-Rclw) 6179 ! si Relij!=Rclw, alors un fractionnement isotopique non physique etait 6180 6180 ! introduit. 6181 ! En fait, awat repr ésente le surplus de condensat dans le mélange par6182 ! rapport àcelui restant dans la colonne adiabatique6183 ! ce surplus à la même compo que le elij, sans fractionnement.6184 ! d'o ùle nouveau traitement ci-dessous.6181 ! En fait, awat represente le surplus de condensat dans le melange par 6182 ! rapport a celui restant dans la colonne adiabatique 6183 ! ce surplus a la meme compo que le elij, sans fractionnement. 6184 ! d'ou le nouveau traitement ci-dessous. 6185 6185 if (elij(il,k,i).gt.0.0) then 6186 6186 do ixt = 1, ntraciso 6187 6187 xtawat(ixt,il)=awat(il)*(xtelij(ixt,il,k,i)/elij(il,k,i)) 6188 ! xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas n écessaire6188 ! xtawat(ixt)=amax1(xtawat(ixt),0.0) ! pas necessaire 6189 6189 enddo !do ixt = 1, ntraciso 6190 6190 else !if (elij(il,k,i).gt.0.0) then 6191 6191 ! normalement, si elij(il,k,i)<=0, alors awat=0 6192 ! on le v érifie. Si c'est vrai -> xtawat=0 aussi6192 ! on le verifie. Si c'est vrai -> xtawat=0 aussi 6193 6193 #ifdef ISOVERIF 6194 6194 call iso_verif_egalite(awat(il),0.0,'cv3_yield 3779') … … 6850 6850 fq_detrainement(il, i) = fq_detrainement(il, i)/alpha_qpos(il) 6851 6851 do ixt=1,ntraciso 6852 f q_ddft(ixt,il, i) = fq_ddft(ixt,il, i)/alpha_qpos(il)6853 f q_evapprecip(ixt,il, i) = fq_evapprecip(ixt,il, i)/alpha_qpos(il)6854 f q_fluxmasse(ixt,il, i) = fq_fluxmasse(ixt,il, i)/alpha_qpos(il)6855 f q_detrainement(ixt,il, i) = fq_detrainement(ixt,il, i)/alpha_qpos(il)6852 fxt_ddft(ixt,il, i) = fxt_ddft(ixt,il, i)/alpha_qpos(il) 6853 fxt_evapprecip(ixt,il, i) = fxt_evapprecip(ixt,il, i)/alpha_qpos(il) 6854 fxt_fluxmasse(ixt,il, i) = fxt_fluxmasse(ixt,il, i)/alpha_qpos(il) 6855 fxt_detrainement(ixt,il, i) = fxt_detrainement(ixt,il, i)/alpha_qpos(il) 6856 6856 enddo ! do ixt=1,ntraciso 6857 6857 #endif … … 7179 7179 ENDDO ! k 7180 7180 7181 ! 14/01/15 AJ delta n'a rien à faire là...7181 ! 14/01/15 AJ delta n'a rien a faire la... 7182 7182 DO il = 1, ncum ! cld 7183 7183 !! IF (wa(il,i)>0.0 .AND. iflag(il)<=1) & ! cld … … 7195 7195 7196 7196 ! IM cf. FH 7197 ! 14/01/15 AJ ne correspond pas à ce qui a été codépar JYG et SB7197 ! 14/01/15 AJ ne correspond pas a ce qui a ete code par JYG et SB 7198 7198 7199 7199 IF (iflag_clw==0) THEN ! cld … … 7290 7290 7291 7291 ! fraction deau condensee dans les melanges convertie en precip : epm 7292 ! et eau condens ée précipitée dans masse d'air saturé: l_m*dM_m/dzdz.dzdz7292 ! et eau condensee precipitee dans masse d'air sature : l_m*dM_m/dzdz.dzdz 7293 7293 DO j = 1, nl 7294 7294 DO k = 1, nl … … 7576 7576 7577 7577 ! On fait varier epmax en fn de la cape 7578 ! Il faut donc recalculer ep, et hp qui a d éjà été calculéet7579 ! qui en d épend7580 ! Toutes les autres variables fn de ep sont calcul ées plus bas.7578 ! Il faut donc recalculer ep, et hp qui a deja ete calcule et 7579 ! qui en depend 7580 ! Toutes les autres variables fn de ep sont calculees plus bas. 7581 7581 7582 7582 include "cvthermo.h" … … 7613 7613 7614 7614 ! il faut calculer la cape: on fait un calcule simple car tant qu'on ne 7615 ! connait pas ep, on ne connait pas les m élanges, ddfts etc... qui sont7615 ! connait pas ep, on ne connait pas les melanges, ddfts etc... qui sont 7616 7616 ! necessaires au calcul de la cape dans la nouvelle physique 7617 7617 -
LMDZ6/trunk/libf/phylmdiso/infotrac_phy.F90
r4048 r4050 51 51 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: niadv ! equivalent dyn / physique 52 52 !$OMP THREADPRIVATE(niadv) 53 54 ! CRisi: tableaux de fils55 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: nqfils56 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: nqdesc ! nombres de fils + nombre de tous les petits fils sur toutes les générations57 INTEGER, SAVE :: nqdesc_tot58 INTEGER, ALLOCATABLE, DIMENSION(:,:), SAVE :: iqfils59 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: iqpere60 !$OMP THREADPRIVATE(nqfils,nqdesc,nqdesc_tot,iqfils,iqpere)61 53 62 54 ! conv_flg(it)=0 : convection desactivated for tracer number it … … 84 76 INTEGER, ALLOCATABLE, DIMENSION(:,:), SAVE :: iqiso ! donne indice iq en fn de (ixt,phase) 85 77 !$OMP THREADPRIVATE(iqiso) 86 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: iso_num ! donne numéro iso entre 1 et niso_possibles en fn de nqtot87 !$OMP THREADPRIVATE(iso_num)88 78 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: iso_indnum ! donne numéro iso entre 1 et niso effectif en fn de nqtot 89 79 !$OMP THREADPRIVATE(iso_indnum) 90 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: zone_num ! donne numéro de la zone de tracage en fn de nqtot91 !$OMP THREADPRIVATE(zone_num)92 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: phase_num ! donne numéro de la zone de tracage en fn de nqtot93 !$OMP THREADPRIVATE(phase_num)94 80 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 95 81 !$OMP THREADPRIVATE(indnum_fn_num) … … 106 92 SUBROUTINE init_infotrac_phy(nqtot_,nqo_,nbtr_,nqtottr_,nqCO2_,tracers_,type_trac_,& 107 93 niadv_,conv_flg_,pbl_flg_,solsym_,& 108 nqfils_,nqdesc_,nqdesc_tot_,iqfils_,iqpere_,&109 94 ok_isotopes_,ok_iso_verif_,ok_isotrac_,& 110 95 ok_init_iso_,niso_possibles_,tnat_,& 111 alpha_ideal_,use_iso_,iqiso_,iso_num_,& 112 iso_indnum_,zone_num_,phase_num_,& 96 alpha_ideal_,use_iso_,iqiso_,iso_indnum_,& 113 97 indnum_fn_num_,index_trac_,& 114 98 niso_,ntraceurs_zone_,ntraciso_,itr_indice_& … … 143 127 CHARACTER(len=*),INTENT(IN) :: solsym_(nbtr_) 144 128 ! Isotopes: 145 INTEGER,INTENT(IN) :: nqfils_(nqtot_)146 INTEGER,INTENT(IN) :: nqdesc_(nqtot_)147 INTEGER,INTENT(IN) :: nqdesc_tot_148 INTEGER,INTENT(IN) :: iqfils_(nqtot_,nqtot_)149 INTEGER,INTENT(IN) :: iqpere_(nqtot_)150 129 LOGICAL,INTENT(IN) :: ok_isotopes_ 151 130 LOGICAL,INTENT(IN) :: ok_iso_verif_ … … 157 136 LOGICAL,INTENT(IN) :: use_iso_(niso_possibles_) 158 137 INTEGER,INTENT(IN) :: iqiso_(ntraciso_,nqo_) 159 INTEGER,INTENT(IN) :: iso_num_(nqtot_)160 138 INTEGER,INTENT(IN) :: iso_indnum_(nqtot_) 161 INTEGER,INTENT(IN) :: zone_num_(nqtot_)162 INTEGER,INTENT(IN) :: phase_num_(nqtot_)163 139 INTEGER,INTENT(IN) :: indnum_fn_num_(niso_possibles_) 164 140 INTEGER,INTENT(IN) :: index_trac_(ntraceurs_zone_,niso_) … … 216 192 217 193 IF (ok_isotopes) THEN 218 ALLOCATE(nqfils(nqtot))219 nqfils(:)=nqfils_(:)220 ALLOCATE(nqdesc(nqtot))221 nqdesc(:)=nqdesc_(:)222 nqdesc_tot=nqdesc_tot_223 ALLOCATE(iqfils(nqtot,nqtot))224 iqfils(:,:)=iqfils_(:,:)225 ALLOCATE(iqpere(nqtot))226 iqpere(:)=iqpere_(:)227 228 194 tnat(:)=tnat_(:) 229 195 alpha_ideal(:)=alpha_ideal_(:) … … 232 198 ALLOCATE(iqiso(ntraciso,nqo)) 233 199 iqiso(:,:)=iqiso_(:,:) 234 ALLOCATE(iso_num(nqtot))235 iso_num(:)=iso_num_(:)236 200 ALLOCATE(iso_indnum(nqtot)) 237 201 iso_indnum(:)=iso_indnum_(:) 238 ALLOCATE(zone_num(nqtot))239 zone_num(:)=zone_num_(:)240 ALLOCATE(phase_num(nqtot))241 phase_num(:)=phase_num_(:)242 202 243 203 indnum_fn_num(:)=indnum_fn_num_(:) … … 255 215 write(*,*) 'itr_indice=',itr_indice 256 216 #ifdef ISOVERIF 257 write(*,*) 'iso_ num=',iso_num217 write(*,*) 'iso_iName=',tracers(:)%iso_iName 258 218 #endif 259 219 -
LMDZ6/trunk/libf/phylmdiso/isotopes_verif_mod.F90
r4033 r4050 2123 2123 end function iso_verif_tracdD_choix_nostop 2124 2124 2125 subroutine iso_verif_trac17_q_deltaD(x,err_msg) 2126 use isotrac_mod, only: nzone_temp,option_traceurs 2127 USE infotrac_phy, ONLY: ntraciso 2128 implicit none 2129 2130 ! inputs 2131 real x(ntraciso) 2132 character*(*) err_msg 2133 ! local 2134 integer iso_verif_tag17_q_deltaD_chns 2135 2136 if ((option_traceurs.eq.17).or. & 2137 & (option_traceurs.eq.18)) then 2138 if (nzone_temp.ge.5) then 2139 if (iso_verif_tag17_q_deltaD_chns(x,err_msg).eq.1) then 2140 stop 2141 endif 2142 endif 2143 endif !if (option_traceurs.eq.17) then 2144 2145 end subroutine iso_verif_trac17_q_deltaD 2125 INTEGER FUNCTION iso_verif_tag17_q_deltaD_chns(x,err_msg) RESULT(res) 2126 USE infotrac_phy, ONLY: index_trac, ntraciso 2127 USE isotopes_mod, ONLY: iso_HDO, iso_eau, ridicule 2128 USE isotrac_mod, ONLY: nzone_temp, option_traceurs 2129 IMPLICIT NONE 2130 REAL, INTENT(IN) :: x(ntraciso) 2131 CHARACTER(LEN=*), INTENT(IN) :: err_msg 2132 INTEGER :: ieau, ixt, ieau1 2133 res = 0 2134 IF(ALL([17,18]/=option_traceurs)) RETURN 2135 !--- Check whether * deltaD(highest tagging layer) < 200 permil 2136 ! * q < 2137 ieau=index_trac(nzone_temp,iso_eau) 2138 ixt=index_trac(nzone_temp,iso_HDO) 2139 IF(x(ieau)>ridicule) THEN 2140 IF(iso_verif_positif_nostop(-200.0-deltaD(x(ixt)/x(ieau)), err_msg//': deltaDt05 trop fort')==1) THEN 2141 res=1; write(*,*) 'x=',x 2142 END IF 2143 END IF 2144 IF(iso_verif_positif_nostop(2.0e-3-x(ieau),err_msg//': qt05 trop fort')==1) THEN 2145 res=1; write(*,*) 'x=',x 2146 END IF 2147 !--- Check whether q is small ; then, qt01 < 10% 2148 IF(x(iso_eau)<2.0e-3) THEN 2149 ieau1= index_trac(1,iso_eau) 2150 IF(iso_verif_positif_nostop(0.1-(x(ieau1)/x(iso_eau)),err_msg//': qt01 trop abondant')==1) THEN 2151 res=1; write(*,*) 'x=',x 2152 END IF 2153 END IF 2154 END FUNCTION iso_verif_tag17_q_deltaD_chns 2155 2156 SUBROUTINE iso_verif_trac17_q_deltaD(x,err_msg) 2157 USE isotrac_mod, ONLY: nzone_temp, option_traceurs 2158 USE infotrac_phy, ONLY: ntraciso 2159 IMPLICIT NONE 2160 REAL, INTENT(IN) :: x(ntraciso) 2161 CHARACTER(LEN=*), INTENT(IN) :: err_msg 2162 IF(ALL([17,18]/=option_traceurs)) RETURN 2163 IF(nzone_temp>=5) THEN 2164 IF(iso_verif_tag17_q_deltaD_chns(x,err_msg)==1) STOP 2165 END IF 2166 END SUBROUTINE iso_verif_trac17_q_deltaD 2146 2167 2147 2168 subroutine iso_verif_traceur(x,err_msg) … … 2676 2697 2677 2698 end function iso_verif_traceur_jm_nostop 2678 2679 function iso_verif_tag17_q_deltaD_chns(x,err_msg)2680 USE infotrac_phy, ONLY: index_trac,ntraciso2681 use isotopes_mod, ONLY: iso_HDO,iso_eau,ridicule2682 use isotrac_mod, only: nzone_temp,option_traceurs2683 implicit none2684 2685 ! inputs2686 real x(ntraciso)2687 character*(*) err_msg2688 ! output2689 integer iso_verif_tag17_q_deltaD_chns2690 ! locals2691 !integer iso_verif_positif_nostop2692 !real deltaD2693 integer ieau,ixt,ieau12694 2695 iso_verif_tag17_q_deltaD_chns=02696 2697 if ((option_traceurs.eq.17).or. &2698 & (option_traceurs.eq.18)) then2699 ! verifier que deltaD du tag de la couche la plus haute <2700 ! 200 permil, et vérifier que son q est inférieur à2701 ieau=index_trac(nzone_temp,iso_eau)2702 ixt=index_trac(nzone_temp,iso_HDO)2703 2704 if (x(ieau).gt.ridicule) then2705 if (iso_verif_positif_nostop(-200.0-deltaD(x(ixt)/x(ieau)), &2706 & err_msg//': deltaDt05 trop fort').eq.1) then2707 write(*,*) 'x=',x2708 iso_verif_tag17_q_deltaD_chns=12709 endif !if (iso_verif_positif_nostop(-200.0-deltaD(x(ixt),x(ieau)),2710 endif !if (x(ieau).gt.ridicule) then2711 2712 if (iso_verif_positif_nostop(2.0e-3-x(ieau), &2713 & err_msg//': qt05 trop fort').eq.1) then2714 write(*,*) 'x=',x2715 iso_verif_tag17_q_deltaD_chns=12716 endif !if (iso_verif_positif_nostop(1.0e-3-x(ieau),2717 2718 ! on vérifie que si q est petit, alors qt01 fait moins de 10%2719 if (x(iso_eau).lt.2.0e-3) then2720 ieau1= index_trac(1,iso_eau)2721 if (iso_verif_positif_nostop(0.1-(x(ieau1)/x(iso_eau)), &2722 & err_msg//': qt01 trop abondant').eq.1) then2723 write(*,*) 'x=',x2724 iso_verif_tag17_q_deltaD_chns=12725 endif ! if (iso_verif_positif(0.1-(x(ixt)/x(ieau)),2726 endif !if (x(ieau).lt.2.0e-3) then2727 2728 endif !if (option_traceurs.eq.17) then2729 2730 end function iso_verif_tag17_q_deltaD_chns2731 2699 2732 2700 subroutine iso_verif_tag17_q_deltaD_vect(x,n,m,err_msg) -
LMDZ6/trunk/libf/phylmdiso/phyetat0.F90
r4046 r4050 45 45 use config_ocean_skin_m, only: activate_ocean_skin 46 46 #ifdef ISO 47 USE infotrac_phy, ONLY: n traciso,niso,iso_num47 USE infotrac_phy, ONLY: niso 48 48 USE isotopes_routines_mod, ONLY: phyisoetat0 49 49 USE isotopes_mod, ONLY: iso_eau -
LMDZ6/trunk/libf/phylmdiso/phys_output_mod.F90
r4048 r4050 35 35 USE iophy 36 36 USE dimphy 37 USE infotrac_phy, ONLY: nqtot, nqo, niadv, tracers, type_trac, &37 USE infotrac_phy, ONLY: nqtot, nqo, niadv, tracers, type_trac, maxlen, & 38 38 nqtottr,itr_indice ! C Risi 39 USE strings_mod, ONLY: maxlen40 39 USE ioipsl 41 40 USE phys_cal_mod, only : hour, calend … … 537 536 write(lunout,*) 'itr_indice=',itr_indice 538 537 ! IF (nqtot>=nqo+1) THEN 539 IF (nqtottr>=1) THEN540 538 ! 541 539 !DO iq=nqo+1,nqtot … … 579 577 tnam = 'cum'//TRIM(tracers(iiq)%name); o_trac_cum(itr)= ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)]) 580 578 ENDDO 581 ENDIF582 579 583 580 ENDDO ! iff -
LMDZ6/trunk/libf/phylmdiso/physiq_mod.F90
r4040 r4050 123 123 #ifdef ISO 124 124 USE infotrac_phy, ONLY: & 125 iqiso,iso_ num,iso_indnum,zone_num,ok_isotrac, &125 iqiso,iso_indnum,tracers,ok_isotrac, & 126 126 niso,ntraciso,nqtottr,itr_indice ! ajout C Risi pour isos 127 127 USE isotopes_mod, ONLY: iso_eau,iso_HDO,iso_O18,iso_O17,iso_HTO, & … … 141 141 & iso_verif_aberrant_choix,iso_verif_positif, & 142 142 & iso_verif_positif_choix_vect,iso_verif_o18_aberrant_nostop, & 143 & iso_verif_init, 143 & iso_verif_init,& 144 144 & iso_verif_positif_strict_nostop,iso_verif_O18_aberrant_enc_vect2D 145 145 #endif … … 155 155 & iso_verif_traceur_justmass,iso_verif_traceur_vect, & 156 156 & iso_verif_trac17_q_deltad,iso_verif_trac_masse_vect, & 157 & iso_verif_t racpos_choix_nostop157 & iso_verif_tag17_q_deltaD_vect, iso_verif_tracpos_choix_nostop 158 158 #endif 159 159 #endif … … 2366 2366 #endif 2367 2367 if (ixt.gt.niso) then 2368 write(*,*) 'izone,iiso=', zone_num(iqiso(ixt,ivap)),iso_indnum(iqiso(ixt,ivap))2368 write(*,*) 'izone,iiso=',tracers(iqiso(ixt,ivap))%iso_iZone,iso_indnum(iqiso(ixt,ivap)) 2369 2369 endif 2370 2370 DO k = 1, klev
Note: See TracChangeset
for help on using the changeset viewer.