| [5804] | 1 | MODULE lmdz_wake_popdyn_3 |
|---|
| 2 | PUBLIC wake_popdyn_3 |
|---|
| 3 | CONTAINS |
|---|
| 4 | |
|---|
| 5 | SUBROUTINE wake_popdyn_3 ( klon, klev, phys_sub, wk_adv, dtimesub, wgen, & |
|---|
| 6 | wdensmin, & |
|---|
| 7 | sigmaw, asigmaw, wdens, awdens, & !! state variables |
|---|
| 8 | gfl, agfl, cstar, cin, wape, & |
|---|
| 9 | rad_wk, arad_wk, irad_wk, & |
|---|
| 10 | d_sigmaw, d_asigmaw, d_wdens, d_awdens, & !! tendencies |
|---|
| 11 | d_sig_gen, d_sig_death, d_sig_col, d_sig_spread, d_sig_bnd, & |
|---|
| 12 | d_asig_death, d_asig_aicol, d_asig_iicol, d_asig_spread, d_asig_bnd, & |
|---|
| 13 | d_dens_gen, d_dens_death, d_dens_col, d_dens_bnd, & |
|---|
| 14 | d_adens_death, d_adens_icol, d_adens_acol, d_adens_bnd ) |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | USE lmdz_wake_ini, ONLY: CPPKEY_IOPHYS_WK |
|---|
| 19 | USE lmdz_wake_ini , ONLY : wake_ini |
|---|
| 20 | USE lmdz_wake_ini , ONLY : prt_level,RG |
|---|
| 21 | USE lmdz_wake_ini , ONLY : stark, wdens_ref |
|---|
| 22 | USE lmdz_wake_ini , ONLY : tau_cv, rzero, aa0 |
|---|
| 23 | !! USE lmdz_wake_ini , ONLY : iflag_wk_pop_dyn, wdensmin |
|---|
| 24 | USE lmdz_wake_ini , ONLY : iflag_wk_pop_dyn |
|---|
| 25 | USE lmdz_wake_ini , ONLY : sigmad, cstart, sigmaw_max |
|---|
| 26 | USE lmdz_wake_ini , ONLY : smallestreal |
|---|
| 27 | |
|---|
| 28 | IMPLICIT NONE |
|---|
| 29 | |
|---|
| 30 | INTEGER, INTENT(IN) :: klon,klev |
|---|
| 31 | LOGICAL, INTENT(IN) :: phys_sub |
|---|
| 32 | LOGICAL, DIMENSION (klon), INTENT(IN) :: wk_adv |
|---|
| 33 | REAL, INTENT(IN) :: dtimesub |
|---|
| 34 | REAL, INTENT(IN) :: wdensmin |
|---|
| 35 | REAL, DIMENSION (klon), INTENT(IN) :: wgen !! B = birth rate of wakes |
|---|
| 36 | REAL, DIMENSION (klon), INTENT(INOUT) :: sigmaw !! sigma = fractional area of wakes |
|---|
| 37 | REAL, DIMENSION (klon), INTENT(INOUT) :: asigmaw !! sigma = fractional area of active wakes |
|---|
| 38 | REAL, DIMENSION (klon), INTENT(INOUT) :: wdens !! D = number of wakes per unit area |
|---|
| 39 | REAL, DIMENSION (klon), INTENT(INOUT) :: awdens !! A = number of active wakes per unit area |
|---|
| 40 | REAL, DIMENSION (klon), INTENT(IN) :: cstar !! C* = spreading velocity of wakes |
|---|
| 41 | REAL, DIMENSION (klon), INTENT(IN) :: cin, wape ! RM : A Faire disparaitre |
|---|
| 42 | |
|---|
| 43 | ! |
|---|
| 44 | REAL, DIMENSION (klon), INTENT(OUT) :: rad_wk !! r = mean wake radius |
|---|
| 45 | REAL, DIMENSION (klon), INTENT(OUT) :: arad_wk !! r_A = wake radius of active wakes |
|---|
| 46 | REAL, DIMENSION (klon), INTENT(OUT) :: irad_wk !! r_I = wake radius of inactive wakes |
|---|
| 47 | REAL, DIMENSION (klon), INTENT(OUT) :: gfl !! Lg = gust front length per unit area |
|---|
| 48 | REAL, DIMENSION (klon), INTENT(OUT) :: agfl !! LgA = gust front length of active wakes |
|---|
| 49 | !! per unit area |
|---|
| 50 | REAL, DIMENSION (klon), INTENT(OUT) :: d_sigmaw, d_asigmaw, d_wdens, d_awdens |
|---|
| 51 | ! Some components of the tendencies of state variables |
|---|
| 52 | REAL, DIMENSION (klon), INTENT(OUT) :: d_sig_gen, d_sig_death, d_sig_col, d_sig_spread, d_sig_bnd |
|---|
| 53 | REAL, DIMENSION (klon), INTENT(OUT) :: d_asig_death, d_asig_aicol, d_asig_iicol, d_asig_spread, d_asig_bnd |
|---|
| 54 | REAL, DIMENSION (klon), INTENT(OUT) :: d_dens_gen, d_dens_death, d_dens_col, d_dens_bnd |
|---|
| 55 | REAL, DIMENSION (klon), INTENT(OUT) :: d_adens_death, d_adens_acol, d_adens_icol, d_adens_bnd |
|---|
| 56 | |
|---|
| 57 | |
|---|
| 58 | !! internal variables |
|---|
| 59 | |
|---|
| 60 | INTEGER :: i, k |
|---|
| 61 | REAL, DIMENSION (klon) :: iwdens, isigmaw !! inactive wake density and fractional area |
|---|
| 62 | !! REAL, DIMENSION (klon) :: d_arad, d_irad |
|---|
| 63 | REAL, DIMENSION (klon) :: igfl !! LgI = gust front length of inactive wakes |
|---|
| 64 | !! per unit area |
|---|
| 65 | REAL, DIMENSION (klon) :: s_wk !! mean area of individual wakes |
|---|
| 66 | REAL, DIMENSION (klon) :: as_wk !! mean area of individual active wakes |
|---|
| 67 | REAL, DIMENSION (klon) :: is_wk !! mean area of individual inactive wakes |
|---|
| 68 | REAL, DIMENSION (klon) :: tau_wk_inv !! tau = life time of wakes |
|---|
| 69 | REAL, DIMENSION (klon) :: tau_prime !! tau_prime = life time of actives wakes |
|---|
| 70 | REAL :: d_wdens_targ, d_sigmaw_targ |
|---|
| 71 | |
|---|
| 72 | |
|---|
| 73 | !! Equations |
|---|
| 74 | !! --------- |
|---|
| 75 | !! Gust fronts: |
|---|
| 76 | !! Lg_A = 2 pi r_A A |
|---|
| 77 | !! Lg_I = 2 pi r_I I |
|---|
| 78 | !! Lg = 2 pi r D |
|---|
| 79 | !! |
|---|
| 80 | !! Areas: |
|---|
| 81 | !! s = pi r^2 |
|---|
| 82 | !! s_A = pi r_A^2 |
|---|
| 83 | !! s_I = pi r_I^2 |
|---|
| 84 | !! |
|---|
| 85 | !! Life expectancy: |
|---|
| 86 | !! tau_I = 3 C* ((C*/C*t)^3/2 - 1) / r_I |
|---|
| 87 | !! |
|---|
| 88 | !! Time deratives: |
|---|
| 89 | !! dD/dt = B - (D-A)/tau_I - 2 Lg C* D |
|---|
| 90 | !! dA/dt = B - A/tau_A + 2 Lg_I C* (D-A) - 2 Lg_A C* A |
|---|
| 91 | !! dsigma/dt = B a0 - sigma_I/tau_I + Lg C* - 2 Lg_I C* (D-A) (2 s_I - a0) |
|---|
| 92 | !! dsigma_A/dt = B a0 - sigma_A/tau_A + Lg_A C* + (Lg_A I + Lg_I A) C* s_I + 2 Lg_I C* I a0 |
|---|
| 93 | !! |
|---|
| 94 | |
|---|
| 95 | ! Initialization |
|---|
| 96 | tau_wk_inv(:) = 0. |
|---|
| 97 | ! Initialization of output variables |
|---|
| 98 | rad_wk(:) = 0. |
|---|
| 99 | arad_wk(:) = 0. |
|---|
| 100 | irad_wk(:) = 0. |
|---|
| 101 | gfl(:) = 0. |
|---|
| 102 | agfl(:) = 0. |
|---|
| 103 | ! |
|---|
| 104 | d_wdens(:) = 0. |
|---|
| 105 | d_awdens(:) = 0. |
|---|
| 106 | d_sigmaw(:) = 0. |
|---|
| 107 | d_asigmaw (:) = 0. |
|---|
| 108 | ! |
|---|
| 109 | d_sig_gen(:) = 0. |
|---|
| 110 | d_sig_death(:) = 0. |
|---|
| 111 | d_sig_col(:) = 0. |
|---|
| 112 | d_sig_spread(:) = 0. |
|---|
| 113 | d_sig_bnd(:) = 0. |
|---|
| 114 | d_asig_death(:) = 0. |
|---|
| 115 | d_asig_aicol(:) = 0. |
|---|
| 116 | d_asig_iicol(:) = 0. |
|---|
| 117 | d_asig_spread(:) = 0. |
|---|
| 118 | d_asig_bnd(:) = 0. |
|---|
| 119 | d_dens_gen(:) = 0. |
|---|
| 120 | d_dens_death(:) = 0. |
|---|
| 121 | d_dens_col(:) = 0. |
|---|
| 122 | d_dens_bnd(:) = 0. |
|---|
| 123 | d_adens_death(:) = 0. |
|---|
| 124 | d_adens_icol(:) = 0. |
|---|
| 125 | d_adens_acol(:) = 0. |
|---|
| 126 | d_adens_bnd(:) = 0. |
|---|
| 127 | |
|---|
| 128 | |
|---|
| 129 | DO i = 1, klon |
|---|
| 130 | IF (wk_adv(i)) THEN |
|---|
| 131 | iwdens(i) = wdens(i) - awdens(i) |
|---|
| 132 | isigmaw(i) = sigmaw(i) - asigmaw(i) |
|---|
| 133 | ! |
|---|
| 134 | arad_wk(i) = max( sqrt(asigmaw(i)/(3.14*awdens(i))) , rzero) |
|---|
| 135 | irad_wk(i) = max( sqrt((sigmaw(i)-asigmaw(i))/ & |
|---|
| 136 | (3.14*max(smallestreal,(wdens(i)-awdens(i))))), rzero) |
|---|
| 137 | rad_wk(i) = (awdens(i)*arad_wk(i)+(wdens(i)-awdens(i))*irad_wk(i))/wdens(i) |
|---|
| 138 | ! |
|---|
| 139 | s_wk(i) = 3.14*rad_wk(i)**2 |
|---|
| 140 | as_wk(i) = 3.14*arad_wk(i)**2 |
|---|
| 141 | is_wk(i) = 3.14*irad_wk(i)**2 |
|---|
| 142 | ! |
|---|
| 143 | gfl(i) = 2.*sqrt(3.14*wdens(i)*sigmaw(i)) |
|---|
| 144 | agfl(i) = 2.*sqrt(3.14*awdens(i)*asigmaw(i)) |
|---|
| 145 | igfl(i) = gfl(i) - agfl(i) |
|---|
| 146 | ENDIF |
|---|
| 147 | ENDDO |
|---|
| 148 | |
|---|
| 149 | |
|---|
| 150 | DO i = 1, klon |
|---|
| 151 | IF (wk_adv(i)) THEN |
|---|
| 152 | ! print *,'ZZZZpopdyn3 wgen(1) ',wgen(1) |
|---|
| 153 | ! print *,'ZZZZpopdyn3 cstar(1) ',cstar(1) |
|---|
| 154 | ! print *,'ZZZZpopdyn3 isigmaw(1) ',isigmaw(1) |
|---|
| 155 | ! print *,'ZZZZpopdyn3 gfl(1) ',gfl(1) |
|---|
| 156 | !! tau_wk_inv(i) = max( (3.*cstar(i))/(irad_wk(i)*((cstar(i)/cstart)**1.5 - 1)), 0.) |
|---|
| 157 | tau_wk_inv(i) = min(max( (3.*cstar(i))/(irad_wk(i)*((cstar(i)/cstart)**1.5 - 1)), 0.), 1./dtimesub) |
|---|
| 158 | tau_prime(i) = tau_cv |
|---|
| 159 | |
|---|
| 160 | d_sig_gen(i) = wgen(i)*aa0 |
|---|
| 161 | d_sig_death(i) = - isigmaw(i)*tau_wk_inv(i) |
|---|
| 162 | d_sig_col(i) = - 2.*igfl(i)*cstar(i)*iwdens(i)*(2.*is_wk(i)-aa0) |
|---|
| 163 | d_sig_spread(i) = gfl(i)*cstar(i) |
|---|
| 164 | ! |
|---|
| 165 | d_sig_gen(i) = d_sig_gen(i)*dtimesub |
|---|
| 166 | d_sig_death(i) = d_sig_death(i)*dtimesub |
|---|
| 167 | d_sig_col(i) = d_sig_col(i)*dtimesub |
|---|
| 168 | d_sig_spread(i) = d_sig_spread(i)*dtimesub |
|---|
| 169 | d_sigmaw(i) = d_sig_gen(i) + d_sig_death(i) + d_sig_col(i) + d_sig_spread(i) |
|---|
| 170 | |
|---|
| 171 | d_sigmaw_targ = max(d_sigmaw(i), sigmad-sigmaw(i)) |
|---|
| 172 | !! d_sig_bnd(i) = d_sig_bnd(i) + d_sigmaw_targ - d_sigmaw(i) |
|---|
| 173 | !! d_sig_bnd_provis(i) = d_sigmaw_targ - d_sigmaw(i) |
|---|
| 174 | d_sig_bnd(i) = d_sigmaw_targ - d_sigmaw(i) |
|---|
| 175 | d_sigmaw(i) = d_sigmaw_targ |
|---|
| 176 | !! d_sigmaw(i) = max(d_sigmaw(i), sigmad-sigmaw(i)) |
|---|
| 177 | d_asig_death(i) = - asigmaw(i)/tau_prime(i) |
|---|
| 178 | !! Bug : factor 2 omitted by mistake (bug found by Lamine Thiam) |
|---|
| 179 | !! d_asig_aicol(i) = (agfl(i)*iwdens(i) + igfl(i)*awdens(i))*cstar(i)*is_wk(i) |
|---|
| 180 | d_asig_aicol(i) = 2.*(agfl(i)*iwdens(i) + igfl(i)*awdens(i))*cstar(i)*is_wk(i) |
|---|
| 181 | d_asig_iicol(i) = 2.*igfl(i)*cstar(i)*iwdens(i)*aa0 |
|---|
| 182 | d_asig_spread(i) = agfl(i)*cstar(i) |
|---|
| 183 | ! |
|---|
| 184 | d_asig_death(i) = d_asig_death(i)*dtimesub |
|---|
| 185 | d_asig_aicol(i) = d_asig_aicol(i)*dtimesub |
|---|
| 186 | d_asig_iicol(i) = d_asig_iicol(i)*dtimesub |
|---|
| 187 | d_asig_spread(i) = d_asig_spread(i)*dtimesub |
|---|
| 188 | d_asigmaw(i) = d_sig_gen(i) + d_asig_death(i) + d_asig_aicol(i) + d_asig_iicol(i) + d_asig_spread(i) |
|---|
| 189 | ! |
|---|
| 190 | d_sigmaw_targ = min(max(d_asigmaw(i),-asigmaw(i)), sigmaw(i)-asigmaw(i)) |
|---|
| 191 | !! d_dens_bnd(i) = d_dens_bnd(i) + d_sigmaw_targ - d_sigmaw(i) |
|---|
| 192 | d_asig_bnd(i) = d_sigmaw_targ - d_asigmaw(i) |
|---|
| 193 | d_asigmaw(i) = d_sigmaw_targ |
|---|
| 194 | d_dens_gen(i) = wgen(i) |
|---|
| 195 | d_dens_death(i) = - iwdens(i)*tau_wk_inv(i) |
|---|
| 196 | d_dens_col(i) = - 2.*gfl(i)*cstar(i)*wdens(i) |
|---|
| 197 | ! |
|---|
| 198 | d_dens_gen(i) = d_dens_gen(i)*dtimesub |
|---|
| 199 | d_dens_death(i) = d_dens_death(i)*dtimesub |
|---|
| 200 | d_dens_col(i) = d_dens_col(i)*dtimesub |
|---|
| 201 | d_wdens(i) = d_dens_gen(i) + d_dens_death(i) + d_dens_col(i) |
|---|
| 202 | !! |
|---|
| 203 | d_wdens_targ = max(d_wdens(i), wdensmin-wdens(i)) |
|---|
| 204 | !! d_dens_bnd(i) = d_dens_bnd(i) + d_wdens_targ - d_wdens(i) |
|---|
| 205 | d_dens_bnd(i) = d_wdens_targ - d_wdens(i) |
|---|
| 206 | d_wdens(i) = d_wdens_targ |
|---|
| 207 | d_adens_death(i) = -awdens(i)/tau_prime(i) |
|---|
| 208 | d_adens_icol(i) = 2.*igfl(i)*cstar(i)*iwdens(i) |
|---|
| 209 | d_adens_acol(i) = - 2.*agfl(i)*cstar(i)*awdens(i) |
|---|
| 210 | ! |
|---|
| 211 | d_adens_death(i) = d_adens_death(i)*dtimesub |
|---|
| 212 | d_adens_icol(i) = d_adens_icol(i)*dtimesub |
|---|
| 213 | d_adens_acol(i) = d_adens_acol(i)*dtimesub |
|---|
| 214 | d_awdens(i) = d_dens_gen(i) + d_adens_death(i) + d_adens_icol(i) + d_adens_acol(i) |
|---|
| 215 | d_wdens_targ = min(max(d_awdens(i),-awdens(i)), wdens(i)-awdens(i)) |
|---|
| 216 | !! d_dens_bnd(i) = d_dens_bnd(i) + d_wdens_targ - d_wdens(i) |
|---|
| 217 | d_adens_bnd(i) = d_wdens_targ - d_awdens(i) |
|---|
| 218 | d_awdens(i) = d_wdens_targ |
|---|
| 219 | |
|---|
| 220 | !! d_irad(i) = (d_sigmaw(i)-d_asigmaw(i)-isigmaw(i)*(d_wdens(i)-awdens(i))/iwdens(i)) / & |
|---|
| 221 | !! max(smallestreal,(2.*3.14*iwdens(i)*irad_wk(i))) |
|---|
| 222 | !! d_arad(i) = (d_asigmaw(i)-asigmaw(i)*d_awdens(i)/awdens(i)) / & |
|---|
| 223 | !! max(smallestreal,(2.*3.14*awdens(i)*arad_wk(i))) |
|---|
| 224 | !! d_irad(i) = d_irad(i)*dtimesub |
|---|
| 225 | !! d_arad(i) = d_arad(i)*dtimesub |
|---|
| 226 | !! call iophys_ecrit('d_irad',1,'d_irad','m',d_irad) |
|---|
| 227 | !! call iophys_ecrit('d_airad',1,'d_arad','m',d_arad) |
|---|
| 228 | !! |
|---|
| 229 | ENDIF |
|---|
| 230 | ENDDO |
|---|
| 231 | IF (CPPKEY_IOPHYS_WK) THEN |
|---|
| 232 | IF (phys_sub) THEN |
|---|
| 233 | call iophys_ecrit('d_sigmaw0',1,'d_sigmaw0','',d_sigmaw) |
|---|
| 234 | ! |
|---|
| 235 | call iophys_ecrit('cstar',1,'cstar','',cstar) |
|---|
| 236 | call iophys_ecrit('wgen_pd3',1,'wgen_popdyn3','',wgen) |
|---|
| 237 | call iophys_ecrit('tauwk_inv',1,'tau_wk_inv','',tau_wk_inv) |
|---|
| 238 | call iophys_ecrit('d_sigmaw',1,'d_sigmaw','',d_sigmaw) |
|---|
| 239 | call iophys_ecrit('d_sig_gen',1,'d_sig_gen','',d_sig_gen) |
|---|
| 240 | call iophys_ecrit('d_sig_death',1,'d_sig_death','',d_sig_death) |
|---|
| 241 | call iophys_ecrit('d_sig_col',1,'d_sig_col','',d_sig_col) |
|---|
| 242 | call iophys_ecrit('d_sig_spread',1,'d_sig_spread','',d_sig_spread) |
|---|
| 243 | call iophys_ecrit('d_sig_bnd',1,'d_sig_bnd','',d_sig_bnd) |
|---|
| 244 | ! |
|---|
| 245 | call iophys_ecrit('d_asigmaw0',1,'d_asigmaw0','',d_asigmaw) |
|---|
| 246 | ! |
|---|
| 247 | call iophys_ecrit('d_asigmaw',1,'d_asigmaw','',d_asigmaw) |
|---|
| 248 | call iophys_ecrit('d_asig_death',1,'d_asig_death','',d_asig_death) |
|---|
| 249 | call iophys_ecrit('d_asig_aicol',1,'d_asig_aicol','',d_asig_aicol) |
|---|
| 250 | call iophys_ecrit('d_asig_iicol',1,'d_asig_iicol','',d_asig_iicol) |
|---|
| 251 | call iophys_ecrit('d_asig_spread',1,'d_asig_spread','',d_asig_spread) |
|---|
| 252 | call iophys_ecrit('d_asig_bnd',1,'d_asig_bnd','',d_asig_bnd) |
|---|
| 253 | ! |
|---|
| 254 | call iophys_ecrit('d_wdens',1,'d_wdens','',d_wdens) |
|---|
| 255 | call iophys_ecrit('d_dens_gen',1,'d_dens_gen','',d_dens_gen) |
|---|
| 256 | call iophys_ecrit('d_dens_death',1,'d_dens_death','',d_dens_death) |
|---|
| 257 | call iophys_ecrit('d_dens_col',1,'d_dens_col','',d_dens_col) |
|---|
| 258 | ! |
|---|
| 259 | call iophys_ecrit('d_awdens',1,'d_awdens','',d_awdens) |
|---|
| 260 | call iophys_ecrit('d_adens_death',1,'d_adens_death','',d_adens_death) |
|---|
| 261 | call iophys_ecrit('d_adens_icol',1,'d_adens_icol','',d_adens_icol) |
|---|
| 262 | call iophys_ecrit('d_adens_acol',1,'d_adens_acol','',d_adens_acol) |
|---|
| 263 | ENDIF |
|---|
| 264 | END IF |
|---|
| 265 | |
|---|
| 266 | |
|---|
| 267 | IF (prt_level >= 10) THEN |
|---|
| 268 | print *,'wake, cstar(1), cstar(1)/cstart, rad_wk(1), tau_wk_inv(1), gfl(1) ', & |
|---|
| 269 | cstar(1), cstar(1)/cstart, rad_wk(1), tau_wk_inv(1), gfl(1) |
|---|
| 270 | print *,'wake, wdens(1), awdens(1), d_awdens(1) ', & |
|---|
| 271 | wdens(1), awdens(1), d_awdens(1) |
|---|
| 272 | print *,'wake, d_sig_gen(1), d_sig_death(1), d_sig_col(1), d_sigmaw(1) ', & |
|---|
| 273 | d_sig_gen(1), d_sig_death(1), d_sig_col(1), d_sigmaw(1) |
|---|
| 274 | ENDIF |
|---|
| 275 | sigmaw=sigmaw+d_sigmaw |
|---|
| 276 | asigmaw=asigmaw+d_asigmaw |
|---|
| 277 | wdens=wdens+d_wdens |
|---|
| 278 | awdens=awdens+d_awdens |
|---|
| 279 | |
|---|
| 280 | RETURN |
|---|
| 281 | END SUBROUTINE wake_popdyn_3 |
|---|
| 282 | END MODULE lmdz_wake_popdyn_3 |
|---|