| 1 | MODULE lmdz_wake_popdyn_1 |
|---|
| 2 | PUBLIC wake_popdyn_1 |
|---|
| 3 | CONTAINS |
|---|
| 4 | |
|---|
| 5 | SUBROUTINE wake_popdyn_1(klon, klev, dtime, cstar, tau_wk_inv, wgen, wdens, awdens, sigmaw, & |
|---|
| 6 | wdensmin, & |
|---|
| 7 | dtimesub, gfl, rad_wk, f_shear, drdt_pos, & |
|---|
| 8 | d_awdens, d_wdens, d_sigmaw, & |
|---|
| 9 | iflag_wk_act, wk_adv, cin, wape, & |
|---|
| 10 | drdt, & |
|---|
| 11 | d_dens_gen, d_dens_death, d_dens_col, d_dens_bnd, & |
|---|
| 12 | d_sig_gen, d_sig_death, d_sig_col, d_sig_spread, d_sig_bnd, & |
|---|
| 13 | d_wdens_targ, d_sigmaw_targ) |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | USE lmdz_wake_ini , ONLY : wake_ini |
|---|
| 17 | USE lmdz_wake_ini , ONLY : prt_level,RG |
|---|
| 18 | USE lmdz_wake_ini , ONLY : stark, wdens_ref |
|---|
| 19 | USE lmdz_wake_ini , ONLY : tau_cv, rzero, aa0 |
|---|
| 20 | !! USE lmdz_wake_ini , ONLY : iflag_wk_pop_dyn, wdensmin |
|---|
| 21 | USE lmdz_wake_ini , ONLY : iflag_wk_pop_dyn |
|---|
| 22 | USE lmdz_wake_ini , ONLY : sigmad, cstart, sigmaw_max |
|---|
| 23 | |
|---|
| 24 | IMPLICIT NONE |
|---|
| 25 | |
|---|
| 26 | INTEGER, INTENT(IN) :: klon,klev |
|---|
| 27 | LOGICAL, DIMENSION (klon), INTENT(IN) :: wk_adv |
|---|
| 28 | REAL, INTENT(IN) :: dtime |
|---|
| 29 | REAL, INTENT(IN) :: dtimesub |
|---|
| 30 | REAL, INTENT(IN) :: wdensmin |
|---|
| 31 | REAL, DIMENSION (klon), INTENT(IN) :: wgen |
|---|
| 32 | REAL, DIMENSION (klon), INTENT(IN) :: wdens |
|---|
| 33 | REAL, DIMENSION (klon), INTENT(IN) :: awdens |
|---|
| 34 | REAL, DIMENSION (klon), INTENT(IN) :: sigmaw |
|---|
| 35 | REAL, DIMENSION (klon), INTENT(IN) :: cstar |
|---|
| 36 | REAL, DIMENSION (klon), INTENT(IN) :: cin, wape |
|---|
| 37 | REAL, DIMENSION (klon), INTENT(IN) :: f_shear |
|---|
| 38 | INTEGER, INTENT(IN) :: iflag_wk_act |
|---|
| 39 | |
|---|
| 40 | |
|---|
| 41 | ! |
|---|
| 42 | |
|---|
| 43 | ! Tendencies of state variables (2 is appended to the names of fields which are the cumul of fields |
|---|
| 44 | ! computed at each sub-timestep; e.g. d_wdens2 is the cumul of d_wdens) |
|---|
| 45 | REAL, DIMENSION (klon), INTENT(OUT) :: rad_wk |
|---|
| 46 | REAL, DIMENSION (klon), INTENT(OUT) :: gfl |
|---|
| 47 | REAL, DIMENSION (klon), INTENT(OUT) :: d_sigmaw, d_awdens, d_wdens |
|---|
| 48 | REAL, DIMENSION (klon), INTENT(OUT) :: drdt |
|---|
| 49 | ! Some components of the tendencies of state variables |
|---|
| 50 | REAL, DIMENSION (klon), INTENT(OUT) :: d_sig_gen, d_sig_death, d_sig_col, d_sig_bnd |
|---|
| 51 | REAL, DIMENSION (klon), INTENT(OUT) :: d_sig_spread |
|---|
| 52 | REAL, DIMENSION (klon), INTENT(OUT) :: d_dens_gen, d_dens_death, d_dens_col, d_dens_bnd |
|---|
| 53 | REAL, INTENT(OUT) :: d_wdens_targ, d_sigmaw_targ |
|---|
| 54 | |
|---|
| 55 | |
|---|
| 56 | REAL :: delta_t_min |
|---|
| 57 | INTEGER :: i, k |
|---|
| 58 | REAL :: wdens0 |
|---|
| 59 | ! IM 080208 |
|---|
| 60 | LOGICAL, DIMENSION (klon) :: gwake |
|---|
| 61 | |
|---|
| 62 | ! Variables liees a la dynamique de population |
|---|
| 63 | REAL, DIMENSION(klon) :: act |
|---|
| 64 | REAL, DIMENSION(klon) :: tau_wk_inv |
|---|
| 65 | REAL, DIMENSION(klon) :: wape1_act, wape2_act |
|---|
| 66 | LOGICAL, DIMENSION (klon) :: kill_wake |
|---|
| 67 | REAL :: drdt_pos |
|---|
| 68 | REAL :: tau_wk_inv_min |
|---|
| 69 | |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | IF (iflag_wk_act == 0) THEN |
|---|
| 73 | act(:) = 0. |
|---|
| 74 | ELSEIF (iflag_wk_act == 1) THEN |
|---|
| 75 | act(:) = 1. |
|---|
| 76 | ELSEIF (iflag_wk_act ==2) THEN |
|---|
| 77 | DO i = 1, klon |
|---|
| 78 | IF (wk_adv(i)) THEN |
|---|
| 79 | wape1_act(i) = abs(cin(i)) |
|---|
| 80 | wape2_act(i) = 2.*wape1_act(i) + 1. |
|---|
| 81 | act(i) = min(1., max(0., (wape(i)-wape1_act(i)) / (wape2_act(i)-wape1_act(i)) )) |
|---|
| 82 | ENDIF ! (wk_adv(i)) |
|---|
| 83 | ENDDO |
|---|
| 84 | ENDIF ! (iflag_wk_act ==2) |
|---|
| 85 | |
|---|
| 86 | DO i = 1, klon |
|---|
| 87 | IF (wk_adv(i)) THEN |
|---|
| 88 | rad_wk(i) = max( sqrt(sigmaw(i)/(3.14*wdens(i))) , rzero) |
|---|
| 89 | gfl(i) = 2.*sqrt(3.14*wdens(i)*sigmaw(i)) |
|---|
| 90 | END IF |
|---|
| 91 | END DO |
|---|
| 92 | |
|---|
| 93 | DO i = 1, klon |
|---|
| 94 | IF (wk_adv(i)) THEN |
|---|
| 95 | !! tau_wk(i) = max(rad_wk(i)/(3.*cstar(i))*((cstar(i)/cstart)**1.5 - 1), 100.) |
|---|
| 96 | tau_wk_inv(i) = max( (3.*cstar(i))/(rad_wk(i)*((cstar(i)/cstart)**1.5 - 1)), 0.) |
|---|
| 97 | tau_wk_inv_min = min(tau_wk_inv(i), 1./dtimesub) |
|---|
| 98 | drdt(i) = (cstar(i) - wgen(i)*(sigmaw(i)/wdens(i)-aa0)/gfl(i)) / & |
|---|
| 99 | (1 + 2*f_shear(i)*(2.*sigmaw(i)-aa0*wdens(i)) - 2.*sigmaw(i)) |
|---|
| 100 | !! (1 - 2*sigmaw(i)*(1.-f_shear(i))) |
|---|
| 101 | drdt_pos=max(drdt(i),0.) |
|---|
| 102 | |
|---|
| 103 | !! d_wdens(i) = ( wgen(i)*(1.+2.*(sigmaw(i)-sigmad)) & |
|---|
| 104 | !! - wdens(i)*tau_wk_inv_min & |
|---|
| 105 | !! - 2.*gfl(i)*wdens(i)*Cstar(i) )*dtimesub |
|---|
| 106 | !jyg+mlt< |
|---|
| 107 | d_awdens(i) = ( wgen(i) - (1./tau_cv)*(awdens(i) - act(i)*wdens(i)) )*dtimesub |
|---|
| 108 | d_dens_gen(i) = wgen(i) |
|---|
| 109 | d_dens_death(i) = - (wdens(i)-awdens(i))*tau_wk_inv_min |
|---|
| 110 | d_dens_col(i) = -2.*wdens(i)*gfl(i)*drdt_pos |
|---|
| 111 | d_dens_gen(i) = d_dens_gen(i)*dtimesub |
|---|
| 112 | d_dens_death(i) = d_dens_death(i)*dtimesub |
|---|
| 113 | d_dens_col(i) = d_dens_col(i)*dtimesub |
|---|
| 114 | |
|---|
| 115 | d_wdens(i) = d_dens_gen(i)+d_dens_death(i)+d_dens_col(i) |
|---|
| 116 | !! d_wdens(i) = ( wgen(i) - (wdens(i)-awdens(i))*tau_wk_inv_min - & |
|---|
| 117 | !! 2.*wdens(i)*gfl(i)*drdt_pos )*dtimesub |
|---|
| 118 | !>jyg+mlt |
|---|
| 119 | ! |
|---|
| 120 | !jyg< |
|---|
| 121 | d_wdens_targ = max(d_wdens(i), wdensmin-wdens(i)) |
|---|
| 122 | !! d_dens_bnd(i) = d_dens_bnd(i) + d_wdens_targ - d_wdens(i) |
|---|
| 123 | d_dens_bnd(i) = d_wdens_targ - d_wdens(i) |
|---|
| 124 | d_wdens(i) = d_wdens_targ |
|---|
| 125 | !! d_wdens(i) = max(d_wdens(i), wdensmin-wdens(i)) |
|---|
| 126 | !>jyg |
|---|
| 127 | |
|---|
| 128 | !jyg+mlt< |
|---|
| 129 | !! d_sigmaw(i) = ( (1.-2*f_shear(i)*sigmaw(i))*(gfl(i)*Cstar(i)+wgen(i)*sigmad/wdens(i)) & |
|---|
| 130 | !! + 2.*f_shear(i)*wgen(i)*sigmaw(i)**2/wdens(i) & |
|---|
| 131 | !! - sigmaw(i)*tau_wk_inv_min )*dtimesub |
|---|
| 132 | d_sig_gen(i) = wgen(i)*aa0 |
|---|
| 133 | d_sig_death(i) = - sigmaw(i)*(1.-awdens(i)/wdens(i))*tau_wk_inv_min |
|---|
| 134 | !! |
|---|
| 135 | |
|---|
| 136 | d_sig_col(i) = - 2*f_shear(i)*sigmaw(i)*gfl(i)*drdt_pos |
|---|
| 137 | d_sig_col(i) = - 2*f_shear(i)*(2.*sigmaw(i)-wdens(i)*aa0)*gfl(i)*drdt_pos |
|---|
| 138 | d_sig_spread(i) = gfl(i)*cstar(i) |
|---|
| 139 | d_sig_gen(i) = d_sig_gen(i)*dtimesub |
|---|
| 140 | d_sig_death(i) = d_sig_death(i)*dtimesub |
|---|
| 141 | d_sig_col(i) = d_sig_col(i)*dtimesub |
|---|
| 142 | d_sig_spread(i) = d_sig_spread(i)*dtimesub |
|---|
| 143 | d_sigmaw(i) = d_sig_gen(i) + d_sig_death(i) + d_sig_col(i) + d_sig_spread(i) |
|---|
| 144 | !>jyg+mlt |
|---|
| 145 | ! |
|---|
| 146 | !jyg< |
|---|
| 147 | d_sigmaw_targ = max(d_sigmaw(i), sigmad-sigmaw(i)) |
|---|
| 148 | !! d_sig_bnd(i) = d_sig_bnd(i) + d_sigmaw_targ - d_sigmaw(i) |
|---|
| 149 | !! d_sig_bnd_provis(i) = d_sigmaw_targ - d_sigmaw(i) |
|---|
| 150 | d_sig_bnd(i) = d_sigmaw_targ - d_sigmaw(i) |
|---|
| 151 | d_sigmaw(i) = d_sigmaw_targ |
|---|
| 152 | !! d_sigmaw(i) = max(d_sigmaw(i), sigmad-sigmaw(i)) |
|---|
| 153 | !>jyg |
|---|
| 154 | ENDIF |
|---|
| 155 | ENDDO |
|---|
| 156 | |
|---|
| 157 | IF (prt_level >= 10) THEN |
|---|
| 158 | print *,'wake, cstar(1), cstar(1)/cstart, rad_wk(1), tau_wk_inv(1), drdt(1) ', & |
|---|
| 159 | cstar(1), cstar(1)/cstart, rad_wk(1), tau_wk_inv(1), drdt(1) |
|---|
| 160 | print *,'wake, wdens(1), awdens(1), act(1), d_awdens(1) ', & |
|---|
| 161 | wdens(1), awdens(1), act(1), d_awdens(1) |
|---|
| 162 | print *,'wake, wgen, -(wdens-awdens)*tau_wk_inv, -2.*wdens*gfl*drdt_pos, d_wdens ', & |
|---|
| 163 | wgen(1), -(wdens(1)-awdens(1))*tau_wk_inv(1), -2.*wdens(1)*gfl(1)*drdt_pos, d_wdens(1) |
|---|
| 164 | print *,'wake, d_sig_gen(1), d_sig_death(1), d_sig_col(1), d_sigmaw(1) ', & |
|---|
| 165 | d_sig_gen(1), d_sig_death(1), d_sig_col(1), d_sigmaw(1) |
|---|
| 166 | ENDIF |
|---|
| 167 | |
|---|
| 168 | RETURN |
|---|
| 169 | END SUBROUTINE wake_popdyn_1 |
|---|
| 170 | END MODULE lmdz_wake_popdyn_1 |
|---|