Changeset 5618 for LMDZ6/branches/contrails/libf/phylmd/cv3_routines.f90
- Timestamp:
- Apr 15, 2025, 11:56:45 AM (2 months ago)
- Location:
- LMDZ6/branches/contrails
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/contrails
- Property svn:mergeinfo changed
/LMDZ6/trunk merged: 5451,5458,5460,5463,5468-5487,5490-5496,5499-5520,5524-5526,5528,5531,5544,5554-5557,5559-5562,5569-5572,5578,5582-5585,5597
- Property svn:mergeinfo changed
-
LMDZ6/branches/contrails/libf/phylmd/cv3_routines.f90
r5536 r5618 12 12 USE conema3_mod_h 13 13 USE lmdz_cv_ini, ONLY : alpha,alpha1,beta,betad,coef_peel,cv_flag_feed,delta,dpbase,dtcrit,dtovsh,dttrig,ejectice,ejectliq,elcrit,flag_epkeorig,flag_wb,minorig,nl,nlm,nlp,noconv_stop,noff,omtrain,pbcrit,ptcrit,sigdz,spfac,t_top_max,tau,tau_stop,tlcrit,wbmax 14 USE lmdz_cv_ini, ONLY : keep_bug_indices_cv3_tracer, keep_bug_q_nocons_cv 14 15 15 16 … … 139 140 keepbug_ice_frac = .TRUE. 140 141 CALL getin_p('keepbug_ice_frac', keepbug_ice_frac) 142 keep_bug_indices_cv3_tracer = .FALSE. 143 CALL getin_p('keep_bug_indices_cv3_tracer', keep_bug_indices_cv3_tracer) 144 keep_bug_q_nocons_cv = .TRUE. 145 CALL getin_p('keep_bug_q_nocons_cv', keep_bug_q_nocons_cv) 146 141 147 142 148 WRITE (*, *) 't_top_max=', t_top_max … … 164 170 WRITE (*, *) 'adiab_ascent_mass_flux_depends_on_ejectliq =', adiab_ascent_mass_flux_depends_on_ejectliq 165 171 WRITE (*, *) 'keepbug_ice_frac =', keepbug_ice_frac 172 WRITE (*, *) 'keep_bug_indices_cv3_tracer =', keep_bug_indices_cv3_tracer 173 WRITE (*, *) 'keep_bug_q_nocons_cv =', keep_bug_q_nocons_cv 166 174 167 175 first = .FALSE. … … 2699 2707 wdtrainA, wdtrainS, wdtrainM) ! RomP 2700 2708 USE lmdz_cv_ini, ONLY : cpd,ginv,grav,nl,nlp,sigdz 2709 USE lmdz_cv_ini, ONLY : keep_bug_q_nocons_cv 2701 2710 USE cvflag_mod_h 2702 2711 USE print_control_mod, ONLY: prt_level, lunout … … 2901 2910 2902 2911 2903 DO il = 1, ncum 2904 IF (i<=inb(il) .AND. lwork(il)) THEN 2905 wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i) 2906 wdtrainS(il, i) = wdtrain(il)/grav ! Ps jyg 2907 !! wdtrainA(il, i) = wdtrain(il)/grav ! Ps RomP 2908 END IF 2909 END DO 2910 2911 IF (i>1) THEN 2912 DO j = 1, i - 1 2912 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2913 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2914 IF (keep_bug_q_nocons_cv) THEN 2915 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2913 2916 DO il = 1, ncum 2914 2917 IF (i<=inb(il) .AND. lwork(il)) THEN 2915 awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i) 2916 awat = max(awat, 0.0) 2917 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i) 2918 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainS(il, i) ! Pm jyg 2919 !! wdtrainM(il, i) = wdtrain(il)/grav - wdtrainA(il, i) ! Pm RomP 2918 wdtrain(il) = grav*ep(il, i)*m(il, i)*clw(il, i) 2919 wdtrainS(il, i) = wdtrain(il)/grav ! Ps jyg 2920 2920 END IF 2921 2921 END DO 2922 END DO 2923 END IF 2924 2925 IF (cvflag_prec_eject) THEN 2926 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2927 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN 2928 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2929 !!! Warning : this option leads to water conservation violation 2930 !!! Expert only 2931 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2932 IF ( i > 1) THEN 2922 2923 IF (i>1) THEN 2924 DO j = 1, i - 1 2933 2925 DO il = 1, ncum 2934 2926 IF (i<=inb(il) .AND. lwork(il)) THEN 2935 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))/(1. - qta(il, i-1)) ! Pa jygprl 2936 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i) 2927 awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i) 2928 awat = max(awat, 0.0) 2929 wdtrain(il) = wdtrain(il) + grav*awat*ment(il, j, i) 2930 wdtrainM(il, i) = wdtrain(il)/grav - wdtrainS(il, i) ! Pm jyg 2937 2931 END IF 2938 2932 END DO 2939 ENDIF ! ( i > 1) 2940 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2941 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq) 2942 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2943 IF ( i > 1) THEN 2933 END DO 2934 END IF 2935 2936 IF (cvflag_prec_eject) THEN 2937 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2938 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN 2939 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2940 !!! Warning : this option leads to water conservation violation 2941 !!! Expert only 2942 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2943 IF ( i > 1) THEN 2944 DO il = 1, ncum 2945 IF (i<=inb(il) .AND. lwork(il)) THEN 2946 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))/(1. - qta(il, i-1)) ! Pa jygprl 2947 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i) 2948 END IF 2949 END DO 2950 ENDIF ! ( i > 1) 2951 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2952 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq) 2953 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2954 IF ( i > 1) THEN 2955 DO il = 1, ncum 2956 IF (i<=inb(il) .AND. lwork(il)) THEN 2957 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i)) ! Pa jygprl 2958 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i) 2959 END IF 2960 END DO 2961 ENDIF ! ( i > 1) 2962 2963 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE 2964 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2965 ENDIF ! (cvflag_prec_eject) 2966 2967 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2968 ELSE ! (keep_bug_q_nocons_cv) 2969 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2970 DO il = 1, ncum 2971 IF (i<=inb(il) .AND. lwork(il)) THEN 2972 wdtrainS(il, i) = ep(il, i)*m(il, i)*clw(il, i) ! jyg 2973 END IF 2974 END DO 2975 2976 IF (i>1) THEN 2977 DO j = 1, i - 1 2944 2978 DO il = 1, ncum 2945 2979 IF (i<=inb(il) .AND. lwork(il)) THEN 2946 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i)) ! Pa jygprl 2947 wdtrain(il) = wdtrain(il) + grav*wdtrainA(il,i) 2980 awat = elij(il, j, i) - (1.-ep(il,i))*clw(il, i) 2981 awat = max(awat, 0.0) 2982 wdtrainM(il, i) = wdtrainM(il, i) + awat*ment(il, j, i) ! jyg 2948 2983 END IF 2949 2984 END DO 2950 ENDIF ! ( i > 1) 2951 2952 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE 2953 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2954 ENDIF ! (cvflag_prec_eject) 2955 2985 END DO 2986 END IF 2987 2988 IF (cvflag_prec_eject) THEN 2989 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2990 IF (adiab_ascent_mass_flux_depends_on_ejectliq) THEN 2991 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2992 !!! Warning : this option leads to water conservation violation 2993 !!! Expert only 2994 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2995 IF ( i > 1) THEN 2996 DO il = 1, ncum 2997 IF (i<=inb(il) .AND. lwork(il)) THEN 2998 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i))/(1. - qta(il, i-1)) ! Pa jygprl 2999 END IF 3000 END DO 3001 ENDIF ! ( i > 1) 3002 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3003 ELSE ! (adiab_ascent_mass_flux_depends_on_ejectliq) 3004 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3005 IF ( i > 1) THEN 3006 DO il = 1, ncum 3007 IF (i<=inb(il) .AND. lwork(il)) THEN 3008 wdtrainA(il,i) = ma(il, i+1)*(qta(il, i-1)-qta(il,i)) ! Pa jygprl 3009 END IF 3010 END DO 3011 ENDIF ! ( i > 1) 3012 3013 ENDIF ! (adiab_ascent_mass_flux_depends_on_ejectliq) ELSE 3014 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3015 ENDIF ! (cvflag_prec_eject) 3016 3017 IF ( i > 1) THEN 3018 DO il = 1, ncum 3019 IF (i<=inb(il) .AND. lwork(il)) THEN 3020 wdtrain(il) = grav*(wdtrainS(il,i) + wdtrainM(il,i) + wdtrainA(il,i)) 3021 END IF 3022 END DO 3023 ENDIF ! ( i > 1) 3024 3025 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3026 ENDIF ! (keep_bug_q_nocons_cv) 3027 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 3028 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2956 3029 2957 3030 ! *** find rain water and evaporation using provisional *** … … 3135 3208 ice(il, i) = ice(il, i) - fondue(il, i) 3136 3209 3137 IF (water(il,i)+ice(il,i)<1.E-30) THEN 3138 faci(il, i) = 0. 3139 ELSE 3140 faci(il, i) = ice(il, i)/(water(il,i)+ice(il,i)) 3141 END IF 3210 !! IF (water(il,i)+ice(il,i)<1.E-30) THEN 3211 !! faci(il, i) = 0. 3212 !! ELSE 3213 !! faci(il, i) = ice(il, i)/(water(il,i)+ice(il,i)) 3214 !! END IF 3215 3216 faci(il,i) = ice(il, i)/max((water(il,i)+ice(il,i)), smallestreal) 3142 3217 3143 3218 ! water(il,i)=water(il,i+1)+(1.-fraci(il,i))*e6+(1.-faci(il,i))*f6 … … 3419 3494 ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3420 3495 3421 3422 3496 RETURN 3423 3497 … … 3445 3519 USE cvflag_mod_h 3446 3520 USE lmdz_cv_ini, ONLY : grav,minorig,nl,nlp,rowl,rrd,nl,ci,cl,cpd,cpv 3521 USE lmdz_cv_ini, ONLY : keep_bug_q_nocons_cv 3447 3522 IMPLICIT NONE 3448 3523 … … 3527 3602 REAL, DIMENSION (nloc, nd) :: sigment, qtment ! cld 3528 3603 REAL, DIMENSION (nloc, nd, nd) :: qdet 3529 REAL sumdq !jyg3604 !! REAL sumdq !jyg 3530 3605 ! 3531 3606 ! ------------------------------------------------------------- 3607 3532 3608 3533 3609 ! initialization: … … 4003 4079 ! *** through each level *** 4004 4080 4005 4006 4081 !jyg< 4007 4082 !! DO i = 2, nl + 1 ! newvecto: mettre nl au lieu nl+1? … … 4020 4095 IF (ok_optim_yield) THEN !| 4021 4096 !----------------------------------------------------------- 4022 DO il = 1, ncum 4023 amp1(il) = upwd(il,i+1) 4024 ad(il) = dnwd(il,i) 4025 ENDDO 4097 IF (keep_bug_q_nocons_cv) THEN !!jyg20250215 4098 DO il = 1, ncum 4099 amp1(il) = upwd(il,i+1) 4100 ad(il) = dnwd(il,i) 4101 ENDDO 4102 ELSE ! (keep_bug_q_nocons_cv) 4103 DO il = 1, ncum 4104 amp1(il) = upwd(il,i+1) 4105 ad(il) = - dnwd(il,i) 4106 ENDDO 4107 ENDIF ! (keep_bug_q_nocons_cv) 4026 4108 !----------------------------------------------------------- 4027 4109 ELSE !(ok_optim_yield) !| … … 4356 4438 500 END DO 4357 4439 4358 ! JYG<4359 ! Conservation de l'eau4360 ! sumdq = 0.4361 ! DO k = 1, nl4362 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav4363 ! END DO4364 ! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)4365 ! JYG>4440 !!!JYG< 4441 !!!Conservation de l'eau 4442 !! sumdq = 0. 4443 !! DO k = 1, nl 4444 !! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 4445 !! END DO 4446 !! PRINT *, 'cv3_yield, apres 500, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 4447 !!!JYG> 4366 4448 ! *** move the detrainment at level inb down to level inb-1 *** 4367 4449 ! *** in such a way as to preserve the vertically *** … … 4398 4480 END DO 4399 4481 4400 ! JYG<4401 ! Conservation de l'eau4402 ! sumdq = 0.4403 ! DO k = 1, nl4404 ! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav4405 ! END DO4406 ! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1)4407 ! JYG>4482 !!!JYG< 4483 !!!Conservation de l'eau 4484 !! sumdq = 0. 4485 !! DO k = 1, nl 4486 !! sumdq = sumdq + fr(1, k)*100.*(ph(1,k)-ph(1,k+1))/grav 4487 !! END DO 4488 !! PRINT *, 'cv3_yield, apres 503, sum(dq), precip, somme ', sumdq, Vprecip(1, 1), sumdq + vprecip(1, 1) 4489 !!!JYG> 4408 4490 4409 4491 !AC! do j=1,ntra … … 4936 5018 ep, Vprecip, elij, clw, epmlmMm, eplaMm, & 4937 5019 icb, inb) 4938 USE lmdz_cv_ini, ONLY : nl5020 USE lmdz_cv_ini, ONLY : nl,keep_bug_indices_cv3_tracer 4939 5021 USE cvflag_mod_h 5022 USE ioipsl_getin_p_mod, ONLY : getin_p 4940 5023 IMPLICIT NONE 4941 5024 4942 5025 4943 5026 !inputs: 5027 !------ 4944 5028 INTEGER, INTENT (IN) :: ncum, nd, na, nloc, len 4945 5029 INTEGER, DIMENSION (len), INTENT (IN) :: icb, inb … … 4949 5033 REAL, DIMENSION (len, nd+1), INTENT (IN) :: Vprecip 4950 5034 !ouputs: 5035 !------ 4951 5036 REAL, DIMENSION (len, na, na), INTENT (OUT) :: phi, phi2, epmlmMm 4952 5037 REAL, DIMENSION (len, na), INTENT (OUT) :: da, d1a, dam, eplaMm 4953 5038 ! 5039 !local variables: 5040 !--------------- 4954 5041 ! variables pour tracer dans precip de l'AA et des mel 4955 !local variables:4956 5042 INTEGER i, j, k 4957 5043 REAL epm(nloc, na, na) 4958 5044 ! 4959 5045 ! variables d'Emanuel : du second indice au troisieme 4960 5046 ! ---> tab(i,k,j) -> de l origine k a l arrivee j … … 4962 5048 ! variables personnelles : du troisieme au second indice 4963 5049 ! ---> tab(i,j,k) -> de k a j 4964 ! phi, phi2 4965 4966 ! initialisations 5050 ! phi, phi2, epm, epmlmMm 5051 4967 5052 4968 5053 da(:, :) = 0. … … 5022 5107 d1a(i, j) = d1a(i, j) + ment(i, k, j)*ep(i, k)*(1.-sigij(i,k,j)) 5023 5108 IF (k<=j) THEN 5024 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j))5025 5109 phi2(i, j, k) = phi(i, j, k)*epm(i, j, k) 5026 5110 END IF … … 5028 5112 END DO 5029 5113 END DO 5114 5115 IF (keep_bug_indices_cv3_tracer) THEN 5116 DO j = 1, nl 5117 DO k = 1, nl 5118 DO i = 1, ncum 5119 IF (k<=j) THEN 5120 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, k, j)*(1.-ep(i,k))*(1.-sigij(i,k,j)) 5121 END IF ! (k<=j) 5122 END DO 5123 END DO 5124 END DO 5125 ELSE ! (keep_bug_indices_cv3_tracer) 5126 DO j = 1, nl 5127 DO k = 1, nl 5128 DO i = 1, ncum 5129 IF (k<=j) THEN 5130 dam(i, j) = dam(i, j) + ment(i, k, j)*epm(i, j, k)*(1.-ep(i,k))*(1.-sigij(i,k,j)) 5131 END IF ! (k<=j) 5132 END DO 5133 END DO 5134 END DO 5135 ENDIF ! (keep_bug_indices_cv3_tracer) 5030 5136 5031 5137 RETURN
Note: See TracChangeset
for help on using the changeset viewer.