source: LMDZ6/trunk/libf/phylmd/lmdz_wake_popdyn_1.f90 @ 5821

Last change on this file since 5821 was 5804, checked in by fhourdin, 3 months ago

Séparation de lmdz_wake en petits fichiers (JYG&FH)

File size: 7.7 KB
Line 
1MODULE lmdz_wake_popdyn_1
2PUBLIC wake_popdyn_1
3CONTAINS
4
5SUBROUTINE 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 
24IMPLICIT 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
170END MODULE lmdz_wake_popdyn_1
Note: See TracBrowser for help on using the repository browser.