Ignore:
Timestamp:
Mar 19, 2026, 2:35:46 PM (10 days ago)
Author:
gmilcareck
Message:

Thermodynamics update on LMDZ.GENERIC

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phygeneric/condensation_generic_mod.F90

    r3280 r4146  
    66    subroutine condensation_generic(ngrid,nlayer,nq,ptimestep, pplev, pplay,    &
    77                pt, pq, pdt, pdq, pdtlsc, pdqvaplsc, pdqliqlsc, rneb)
    8         use ioipsl_getin_p_mod, only: getin_p !-> to get the metallicity
     8        use callkeys_mod, only: thermo_phy,metallicity,qvap_deep,qvap_top,align_strato_cold_trap
    99        use generic_cloud_common_h
    1010        USE tracer_h
    1111        USE mod_phys_lmdz_para, only: is_master
    1212        use generic_tracer_index_mod, only: generic_tracer_index
     13        use thermo_mod
     14        use comcstfi_mod
    1315        IMPLICIT none
    1416
     
    4547        REAL, intent(out) :: rneb(ngrid,nlayer,nq)    ! fraction nuageuse
    4648
    47 !       Options :
    48         real, save :: metallicity !metallicity of planet
    49         REAL, SAVE :: qvap_deep   ! deep mixing ratio of vapor when simulating bottom less planets
    50         REAL, SAVE :: qvap_top   ! top mixing ratio of vapor when simulating bottom less planets
    51         logical, save :: align_strato_cold_trap
    52 !$OMP THREADPRIVATE(metallicity, qvap_deep, qvap_top, align_strato_cold_trap)
    53 
    5449!       Local variables
    5550
     
    6661        DOUBLE PRECISION zq(ngrid)
    6762        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
    7066        real zqs_temp_1, zqs_temp_2
    7167        integer igcm_generic_vap, igcm_generic_ice ! index of the vap and ice of generic_tracer
     
    7773        DOUBLE PRECISION zx_q(ngrid)
    7874        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
    10479!       Initialisation of outputs and local variables
    10580        pdtlsc(1:ngrid,1:nlayer)  = 0.0
     
    125100                        metallicity_coeff=constants_metallicity_coeff(iq)
    126101
    127                         Lcp=RLVTT_generic/cpp ! need to be init here
     102                        Lcp(:,:)=RLVTT_generic/cpp(:,:) ! need to be init here
    128103
    129104                        !  Vertical loop (from top to bottom)
    130105                        DO k = nlayer, 1, -1
    131106                                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
    132108
    133109                                ! Computes Psat and the partial condensation
     
    139115                                        endif
    140116                                        zx_q(i) = pq(i,k,igcm_generic_vap)+pdq(i,k,igcm_generic_vap)*ptimestep
     117                                        zzx_q(i) = zx_q(i)
    141118
    142119                                        call Psat_generic(zt(i),local_p,metallicity,psat_tmp,zqs_temp)
    143120                                        zy_q(i) = pq(i,k,igcm_generic_ice)+pdq(i,k,igcm_generic_ice)*ptimestep
     121                                        zzy_q(i) = zy_q(i)
    144122                                       
    145123                                        if ((zx_q(i) .le. zqs_temp) .and. (zy_q(i) .eq. 0.)) then
     
    153131
    154132                                                ! 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                                               
    155138                                                zcond(i) = 0.0d0
    156139                                                Do nn=1,nitermax 
    157140                                                        call Psat_generic(zt(i),local_p,metallicity,psat_tmp,zqs_temp)
    158141                                                        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)
    160143                                                        zcond_iter = alpha*(zx_q(i)-zqs(i))/(1.d0+zdqs)
    161144                                                        !zcond can be negative here
    162145                                                        zx_q(i) = zx_q(i) - zcond_iter
    163146                                                        zcond(i) = zcond(i) + zcond_iter
    164                                                         zt(i) = zt(i) + zcond_iter*Lcp
     147                                                        zt(i) = zt(i) + zcond_iter*Lcp(i,k)
    165148                                                        if (ABS(zcond_iter/alpha/zqs(i)).lt.qthreshold) exit
    166149                                                        if (nn.eq.nitermax) print*,'itermax in largescale'
     
    173156                                                !                       so the line below is to check how much we can evaporate.
    174157                                                !                       If there is no ice available, zcond(i) will be 0. (first condidition of "if")
    175 
     158                                               
    176159                                                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
    177162                                       
    178163                                        endif
     
    190175                                pdqvaplsc(1:ngrid,k,igcm_generic_vap)  = - zcond(1:ngrid)
    191176                                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)*Lcp
     177                                pdtlsc(1:ngrid,k)  = pdtlsc(1:ngrid,k) + (zt(1:ngrid)-zzt(1:ngrid))/ptimestep
    193178
    194179                        Enddo ! k= nlayer, 1, -1
Note: See TracChangeset for help on using the changeset viewer.