[3559] | 1 | MODULE mp2m_diagnostics |
---|
| 2 | |
---|
| 3 | !======================================================================= |
---|
| 4 | ! Purpose |
---|
| 5 | ! ------- |
---|
| 6 | ! Microphysics diagnostics variables module. |
---|
| 7 | ! |
---|
| 8 | ! The module contains all the variables related to output diagnostics of the microphysics two moments. |
---|
| 9 | ! Such variables are not (and should not be) used as input in the GCM except for output data writing. |
---|
| 10 | ! |
---|
| 11 | ! The module also contains three methods: |
---|
| 12 | ! - inimuphy_diag(ngrid,nlayer,nq,pq,int2ext) |
---|
| 13 | ! - alpha_s(k) |
---|
| 14 | ! - alpha_f(k) |
---|
| 15 | ! |
---|
| 16 | ! Authors |
---|
| 17 | ! ------- |
---|
| 18 | ! Bruno de Batz de Trenquelléon (11/2024) |
---|
| 19 | !======================================================================= |
---|
| 20 | |
---|
| 21 | USE tracer_h |
---|
| 22 | |
---|
| 23 | IMPLICIT NONE |
---|
| 24 | |
---|
| 25 | REAL(kind=8), ALLOCATABLE, DIMENSION(:) :: mp2m_aer_s_prec ! Spherical aerosols precipitations (kg.m-2.s-1). |
---|
| 26 | REAL(kind=8), ALLOCATABLE, DIMENSION(:) :: mp2m_aer_f_prec ! Fractal aerosols precipitations (kg.m-2.s-1). |
---|
| 27 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_aer_s_w ! Spherical aerosol settling velocity (m.s-1). |
---|
| 28 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_aer_f_w ! Fractal aerosol settling velocity (m.s-1). |
---|
| 29 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_aer_s_flux ! Spherical aerosol mass flux (kg.m-2.s-1). |
---|
| 30 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_aer_f_flux ! Fractal aerosol mass flux (kg.m-2.s-1). |
---|
| 31 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_rc_sph ! Spherical mode characteristic radius, i.e. bulk radius (m). |
---|
| 32 | REAL(kind=8), ALLOCATABLE, DIMENSION(:,:) :: mp2m_rc_fra ! Fractal mode characteristic radius, i.e. bulk radius (m). |
---|
| 33 | |
---|
| 34 | !$OMP THREADPRIVATE(mp2m_aer_s_prec,mp2m_aer_f_prec,mp2m_aer_s_w,mp2m_aer_f_w,mp2m_aer_s_flux,mp2m_aer_f_flux) |
---|
| 35 | !$OMP THREADPRIVATE(mp2m_rc_sph,mp2m_rc_fra) |
---|
| 36 | |
---|
| 37 | CONTAINS |
---|
| 38 | |
---|
| 39 | SUBROUTINE inimufi_diag(ngrid,nlayer,nq,pq,int2ext) |
---|
| 40 | !! Initialize the variables associated to microphysics diagnostics. |
---|
| 41 | !! |
---|
| 42 | use callkeys_mod, only : haze_rc_prod, haze_rm |
---|
| 43 | |
---|
| 44 | INTEGER, INTENT(in) :: ngrid ! Number of points of the horizontal grid. |
---|
| 45 | INTEGER, INTENT(in) :: nlayer ! Number of points of the vertical grid (layers). |
---|
| 46 | INTEGER, INTENT(in) :: nq ! Number of advected fields. |
---|
| 47 | |
---|
| 48 | REAL,INTENT(in) :: pq(ngrid,nlayer,nq) ! Tracers (X/kg_of_air). |
---|
| 49 | REAL,INTENT(in) :: int2ext(ngrid,nlayer) ! Intensive to extensive factor (kg_air/m3). |
---|
| 50 | |
---|
| 51 | ! Local variables: |
---|
| 52 | !~~~~~~~~~~~~~~~~~ |
---|
| 53 | REAL, DIMENSION(:,:), ALLOCATABLE :: m0as ! 0th order moment of the spherical mode (m-3). |
---|
| 54 | REAL, DIMENSION(:,:), ALLOCATABLE :: m3as ! 3rd order moment of the spherical mode (m3.m-3). |
---|
| 55 | REAL, DIMENSION(:,:), ALLOCATABLE :: m0af ! 0th order moment of the fractal mode (m-3). |
---|
| 56 | REAL, DIMENSION(:,:), ALLOCATABLE :: m3af ! 3rd order moment of the fractal mode (m3.m-3). |
---|
| 57 | |
---|
| 58 | IF (.NOT.ALLOCATED(mp2m_aer_s_prec)) ALLOCATE(mp2m_aer_s_prec(ngrid)) |
---|
| 59 | IF (.NOT.ALLOCATED(mp2m_aer_f_prec)) ALLOCATE(mp2m_aer_f_prec(ngrid)) |
---|
| 60 | IF (.NOT.ALLOCATED(mp2m_aer_s_w)) ALLOCATE(mp2m_aer_s_w(ngrid,nlayer)) |
---|
| 61 | IF (.NOT.ALLOCATED(mp2m_aer_f_w)) ALLOCATE(mp2m_aer_f_w(ngrid,nlayer)) |
---|
| 62 | IF (.NOT.ALLOCATED(mp2m_aer_s_flux)) ALLOCATE(mp2m_aer_s_flux(ngrid,nlayer)) |
---|
| 63 | IF (.NOT.ALLOCATED(mp2m_aer_f_flux)) ALLOCATE(mp2m_aer_f_flux(ngrid,nlayer)) |
---|
| 64 | IF (.NOT.ALLOCATED(mp2m_rc_sph)) ALLOCATE(mp2m_rc_sph(ngrid,nlayer)) |
---|
| 65 | IF (.NOT.ALLOCATED(mp2m_rc_fra)) ALLOCATE(mp2m_rc_fra(ngrid,nlayer)) |
---|
| 66 | |
---|
| 67 | mp2m_aer_s_prec(:) = 0d0 |
---|
| 68 | mp2m_aer_f_prec(:) = 0d0 |
---|
| 69 | mp2m_aer_s_w(:,:) = 0d0 |
---|
| 70 | mp2m_aer_f_w(:,:) = 0d0 |
---|
| 71 | mp2m_aer_s_flux(:,:) = 0d0 |
---|
| 72 | mp2m_aer_f_flux(:,:) = 0d0 |
---|
| 73 | |
---|
| 74 | ! Initializes the radius to their first value (useful for radiative transfer). |
---|
| 75 | m0as = pq(:,:,micro_indx(1)) * int2ext |
---|
| 76 | m3as = pq(:,:,micro_indx(2)) * int2ext |
---|
| 77 | m0af = pq(:,:,micro_indx(3)) * int2ext |
---|
| 78 | m3af = pq(:,:,micro_indx(4)) * int2ext |
---|
| 79 | |
---|
| 80 | WHERE(m0as > 1e-10 .AND. m3as > (1e-10*alpha_s(3.)*haze_rc_prod**3)) |
---|
| 81 | mp2m_rc_sph = (m3as / (m0as*alpha_s(3.)))**(1./3.) |
---|
| 82 | ELSEWHERE |
---|
| 83 | mp2m_rc_sph = 0d0 |
---|
| 84 | ENDWHERE |
---|
| 85 | |
---|
| 86 | WHERE(m0af > 1e-10 .AND. m3af > (1e-10*alpha_f(3.)*haze_rm**3)) |
---|
| 87 | mp2m_rc_fra = (m3af / (m0af*alpha_f(3.)))**(1./3.) |
---|
| 88 | ELSEWHERE |
---|
| 89 | mp2m_rc_fra = 0d0 |
---|
| 90 | ENDWHERE |
---|
| 91 | |
---|
| 92 | CONTAINS |
---|
| 93 | |
---|
| 94 | FUNCTION alpha_s(k) RESULT (res) |
---|
| 95 | !! Inter-moment relation for spherical aerosols size distribution law. |
---|
| 96 | !! Mk / M0 = rc^k . alpha(k) |
---|
| 97 | !! |
---|
| 98 | use mp2m_intgcm |
---|
| 99 | REAL, INTENT(in) :: k ! k order of the moment. |
---|
| 100 | REAL :: sigma ! Standard deviation. |
---|
| 101 | REAL :: res ! Alpha value. |
---|
| 102 | |
---|
| 103 | ! Titan's case |
---|
| 104 | !~~~~~~~~~~~~~ |
---|
| 105 | ! res = SUM(dexp(mm_asp%a*k**2 + mm_asp%b*k + mm_asp%c)) |
---|
| 106 | |
---|
| 107 | ! Pluto's case |
---|
| 108 | !~~~~~~~~~~~~~ |
---|
| 109 | sigma = 0.2 |
---|
| 110 | res = exp(k**2 * sigma**2 / 2.) |
---|
| 111 | END FUNCTION alpha_s |
---|
| 112 | |
---|
| 113 | FUNCTION alpha_f(k) RESULT (res) |
---|
| 114 | !! Inter-moment relation for fractal aerosols size distribution law. |
---|
| 115 | !! Mk / M0 = rc^k . alpha(k) |
---|
| 116 | !! |
---|
| 117 | use mp2m_intgcm |
---|
| 118 | REAL, INTENT(in) :: k ! k order of the moment. |
---|
| 119 | REAL :: sigma ! Standard deviation. |
---|
| 120 | REAL :: res ! Alpha value. |
---|
| 121 | |
---|
| 122 | ! Titan's case |
---|
| 123 | !~~~~~~~~~~~~~ |
---|
| 124 | ! res = SUM(dexp(mm_asp%a*k**2 + mm_asp%b*k + mm_asp%c)) |
---|
| 125 | |
---|
| 126 | ! Pluto's case |
---|
| 127 | !~~~~~~~~~~~~~ |
---|
| 128 | sigma = 0.35 |
---|
| 129 | res = exp(k**2 * sigma**2 / 2.) |
---|
| 130 | END FUNCTION alpha_f |
---|
| 131 | END SUBROUTINE inimufi_diag |
---|
| 132 | |
---|
| 133 | END MODULE mp2m_diagnostics |
---|