- Timestamp:
- Mar 19, 2026, 2:35:46 PM (10 days ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phygeneric/condensation_generic_mod.F90
r3280 r4146 6 6 subroutine condensation_generic(ngrid,nlayer,nq,ptimestep, pplev, pplay, & 7 7 pt, pq, pdt, pdq, pdtlsc, pdqvaplsc, pdqliqlsc, rneb) 8 use ioipsl_getin_p_mod, only: getin_p !-> to get the metallicity8 use callkeys_mod, only: thermo_phy,metallicity,qvap_deep,qvap_top,align_strato_cold_trap 9 9 use generic_cloud_common_h 10 10 USE tracer_h 11 11 USE mod_phys_lmdz_para, only: is_master 12 12 use generic_tracer_index_mod, only: generic_tracer_index 13 use thermo_mod 14 use comcstfi_mod 13 15 IMPLICIT none 14 16 … … 45 47 REAL, intent(out) :: rneb(ngrid,nlayer,nq) ! fraction nuageuse 46 48 47 ! Options :48 real, save :: metallicity !metallicity of planet49 REAL, SAVE :: qvap_deep ! deep mixing ratio of vapor when simulating bottom less planets50 REAL, SAVE :: qvap_top ! top mixing ratio of vapor when simulating bottom less planets51 logical, save :: align_strato_cold_trap52 !$OMP THREADPRIVATE(metallicity, qvap_deep, qvap_top, align_strato_cold_trap)53 54 49 ! Local variables 55 50 … … 66 61 DOUBLE PRECISION zq(ngrid) 67 62 DOUBLE PRECISION zcond(ngrid),zcond_iter 68 DOUBLE PRECISION zqs(ngrid) 69 real zt(ngrid),local_p,psat_tmp,dlnpsat_tmp,Lcp,zqs_temp,zdqs 63 DOUBLE PRECISION zqs(ngrid), zqs_tmp(ngrid), zt_temp(ngrid) 64 real Lcp(ngrid,nlayer) 65 real zt(ngrid),local_p,psat_tmp,dlnpsat_tmp,zqs_temp,zdqs 70 66 real zqs_temp_1, zqs_temp_2 71 67 integer igcm_generic_vap, igcm_generic_ice ! index of the vap and ice of generic_tracer … … 77 73 DOUBLE PRECISION zx_q(ngrid) 78 74 DOUBLE PRECISION zy_q(ngrid) 79 LOGICAL,SAVE :: firstcall=.true. 80 !$OMP THREADPRIVATE(firstcall) 81 IF (firstcall) THEN 82 write(*,*) "value for metallicity? " 83 metallicity=0.0 ! default value 84 call getin_p("metallicity",metallicity) 85 write(*,*) " metallicity = ",metallicity 86 87 write(*,*) "Deep generic tracer vapor mixing ratio ? (no effect if negative) " 88 qvap_deep=-1. ! default value 89 call getin_p("qvap_deep",qvap_deep) 90 write(*,*) " qvap_deep = ",qvap_deep 91 92 write(*,*) "top generic tracer vapor mixing ratio ? (no effect if negative) " 93 qvap_top=-1. ! default value 94 call getin_p("qvap_top",qvap_top) 95 write(*,*) " qvap_top = ",qvap_top 96 97 write(*,*) " align_strato_cold_trap ? " 98 align_strato_cold_trap=.false. ! default value 99 call getin_p("align_strato_cold_trap",align_strato_cold_trap) 100 write(*,*) " align_strato_cold_trap = ",align_strato_cold_trap 101 102 firstcall = .false. 103 ENDIF 75 DOUBLE PRECISION zzx_q(ngrid) 76 DOUBLE PRECISION zzy_q(ngrid) 77 DOUBLE PRECISION zzt(ngrid) 78 104 79 ! Initialisation of outputs and local variables 105 80 pdtlsc(1:ngrid,1:nlayer) = 0.0 … … 125 100 metallicity_coeff=constants_metallicity_coeff(iq) 126 101 127 Lcp =RLVTT_generic/cpp! need to be init here102 Lcp(:,:)=RLVTT_generic/cpp(:,:) ! need to be init here 128 103 129 104 ! Vertical loop (from top to bottom) 130 105 DO k = nlayer, 1, -1 131 106 zt(1:ngrid)=pt(1:ngrid,k)+pdt(1:ngrid,k)*ptimestep 107 zzt(1:ngrid)=pt(1:ngrid,k)+pdt(1:ngrid,k)*ptimestep 132 108 133 109 ! Computes Psat and the partial condensation … … 139 115 endif 140 116 zx_q(i) = pq(i,k,igcm_generic_vap)+pdq(i,k,igcm_generic_vap)*ptimestep 117 zzx_q(i) = zx_q(i) 141 118 142 119 call Psat_generic(zt(i),local_p,metallicity,psat_tmp,zqs_temp) 143 120 zy_q(i) = pq(i,k,igcm_generic_ice)+pdq(i,k,igcm_generic_ice)*ptimestep 121 zzy_q(i) = zy_q(i) 144 122 145 123 if ((zx_q(i) .le. zqs_temp) .and. (zy_q(i) .eq. 0.)) then … … 153 131 154 132 ! iterative process to stabilize the scheme when large water amounts JL12 133 134 SELECT CASE (TRIM(thermo_phy)) 135 136 CASE ('thermo_uni_ideal') 137 155 138 zcond(i) = 0.0d0 156 139 Do nn=1,nitermax 157 140 call Psat_generic(zt(i),local_p,metallicity,psat_tmp,zqs_temp) 158 141 zqs(i)=zqs_temp 159 call Lcpdqsat_generic(zt(i),local_p, psat_tmp,zqs_temp,zdqs,dlnpsat_tmp)142 call Lcpdqsat_generic(zt(i),local_p,cpp(i,k),psat_tmp,zqs_temp,zdqs,dlnpsat_tmp) 160 143 zcond_iter = alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs) 161 144 !zcond can be negative here 162 145 zx_q(i) = zx_q(i) - zcond_iter 163 146 zcond(i) = zcond(i) + zcond_iter 164 zt(i) = zt(i) + zcond_iter*Lcp 147 zt(i) = zt(i) + zcond_iter*Lcp(i,k) 165 148 if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit 166 149 if (nn.eq.nitermax) print*,'itermax in largescale' … … 173 156 ! so the line below is to check how much we can evaporate. 174 157 ! If there is no ice available, zcond(i) will be 0. (first condidition of "if") 175 158 176 159 zcond(i)=MAX(zcond(i),-(pq(i,k,igcm_generic_ice)+pdq(i,k,igcm_generic_ice)*ptimestep)) 160 zt(i) = zzt(i)+Lcp(i,k)*zcond(i) 161 END SELECT 177 162 178 163 endif … … 190 175 pdqvaplsc(1:ngrid,k,igcm_generic_vap) = - zcond(1:ngrid) 191 176 pdqliqlsc(1:ngrid,k,igcm_generic_ice) = - pdqvaplsc(1:ngrid,k,igcm_generic_vap) 192 pdtlsc(1:ngrid,k) = pdtlsc(1:ngrid,k) + pdqliqlsc(1:ngrid,k,igcm_generic_ice)*Lcp177 pdtlsc(1:ngrid,k) = pdtlsc(1:ngrid,k) + (zt(1:ngrid)-zzt(1:ngrid))/ptimestep 193 178 194 179 Enddo ! k= nlayer, 1, -1
Note: See TracChangeset
for help on using the changeset viewer.
