source: dynamico_lmdz/simple_physics/phyparam/physics/mellor_yamada.F90

Last change on this file was 4229, checked in by dubos, 5 years ago

simple_physics : beautify code

File size: 7.6 KB
Line 
1MODULE mellor_yamada
2
3  IMPLICIT NONE
4
5CONTAINS
6
7  PURE SUBROUTINE my_25(imax,kmax,dt,gp,zi,z,u,v,teta,cd,q2,long,km,kh)
8
9    !**********************************************************************
10    !****** FERMETURE MELLOR-YAMADA DE NIVEAU 2.5 (QUASI-EQUILIBRE) *******
11    !* q2 au interfaces entre mailles.
12    !**********************************************************************
13
14    INTEGER, INTENT(IN) :: imax,kmax
15    REAL, INTENT(IN) :: dt, gp
16    REAL, INTENT(IN) :: z(imax,kmax), &
17         u(imax,kmax), v(imax,kmax), teta(imax,kmax), cd(imax)
18    REAL, INTENT(INOUT) :: zi(imax,kmax+1), q2(imax,kmax+1)
19    REAL, INTENT(OUT) :: long(imax,kmax+1), km(imax,kmax+1), kh(imax,kmax+1)
20
21    !************* DECLARATIONS *******************************************
22
23    INTEGER, PARAMETER :: impmax=5
24    REAL, PARAMETER :: kappa=0.4, &
25         a1=0.92, a2=0.74, b1=16.6, b2=10.1, c1=0.08,           &
26         e1=1.8, e2=1.33, &
27         khmin=1.0e-5, kmmin=1.0e-5, kqmin=1.0e-5,              &
28         q2min=0.001, q2lmin=0.001, &
29         ghmax=0.023, ghmin=-0.28
30
31    REAL longc, au, ateta, az, adz, akq, acd, &
32         adzi, aq2, al, akm, akh, am2, al0, &
33         am, azi, bet, beta, dest, du, dv, gh, &
34         prod, q2c, sh, sm, sq, us, vt, vt1, vt2
35
36    REAL unsdz(imax,kmax),unsdzi(imax,kmax+1)
37    REAL kq(imax,kmax),                                               &
38         &     m2(imax,kmax+1),n2(imax,kmax+1),ri(imax,kmax+1)
39    REAL a(imax,kmax),b(imax,kmax),c(imax,kmax),f(imax,kmax),         &
40         &     alph(imax,kmax)
41    REAL ksdz2inf,ksdz2sup
42
43    INTEGER :: i,k
44
45    !************* INCREMENTS VERTICAUX ***********************************
46
47    DO i=1,imax
48       zi(i,kmax+1)=zi(i,kmax)+2.0*(z(i,kmax)-zi(i,kmax))
49    END DO
50    DO k=1,kmax
51       DO  i=1,imax
52          unsdz(i,k)=1.0/(zi(i,k+1)-zi(i,k))
53       END DO
54    END DO
55
56    DO k=2,kmax
57       DO i=1,imax
58          unsdzi(i,k)=1.0/(z(i,k)-z(i,k-1))
59       END do
60    END DO
61
62    DO i=1,imax
63       unsdzi(i,1)=0.5/(z(i,1)-zi(i,1))
64       unsdzi(i,kmax+1)=0.5/(zi(i,kmax+1)-z(i,kmax))
65    END do
66
67    !**********************************************************************
68
69
70    !************* DIFFUSIVITES KH, KM et KQ ******************************
71    ! Ci-dessous, une premiere estimation des diffusivites turbulentes km *
72    ! et kh est effectuee pour utilisation dans les taux de production    *
73    ! et de destruction de q2 et q2l. On calcule aussi kq.                *
74
75    DO k=2,kmax
76       DO i=1,imax
77          beta=2.0/(teta(i,k)+teta(i,k-1))
78          n2(i,k)=beta*gp*unsdzi(i,k)*(teta(i,k)-teta(i,k-1))
79          n2(i,k)=amax1(0.0,n2(i,k))
80          du=unsdzi(i,k)*(u(i,k)-u(i,k-1))
81          dv=unsdzi(i,k)*(v(i,k)-v(i,k-1))
82          m2(i,k)=du*du+dv*dv
83          ri(i,k)=n2(i,k)/(m2(i,k)+1.0e-10)
84          ri(i,k)=amax1(-0.1,min(4.0,ri(i,k)))
85       END DO
86    END DO
87
88    DO k=2,kmax
89       DO i=1,imax
90          vt=kappa*(zi(i,k)-zi(i,1))
91          long(i,k)=vt/(1.0+vt/160.0)
92          IF(n2(i,k).gt.0.0) THEN
93             long(i,k)=min(0.53*sqrt(q2(i,k))/sqrt(n2(i,k)),long(i,k))
94          END IF
95          gh=amax1(ghmin,                                                 &
96               &     min(ghmax,-long(i,k)*long(i,k)*n2(i,k)/q2(i,k)))
97          sm=a1*(1.0-3.0*c1-6.0*a1/b1-3.0*a2*gh*                          &
98               &           ((b2-3.0*a2)*(1.0-6.0*a1/b1)-3.0*c1*(b2+6.0*a1)))/     &
99               &        ((1.0-3.0*a2*gh*(6.0*a1+b2))*(1.0-9.0*a1*a2*gh))
100          km(i,k)=amax1(kmmin,long(i,k)*sqrt(q2(i,k))*sm)
101          sh=a2*(1.0-6.0*a1/b1)/(1.0-3.0*a2*gh*(6.0*a1+b2))
102          kh(i,k)=amax1(khmin,long(i,k)*sqrt(q2(i,k))*sh)
103       END DO
104    END DO
105
106    DO i=1,imax
107       us=sqrt(cd(i)*(u(i,1)*u(i,1)+v(i,1)*v(i,1)))
108       vt1=(b1**0.666667)*us*us
109       vt2=(b1**0.6666667)*kappa*kappa*                                 &
110            &     m2(i,2)*(zi(i,2)-zi(i,1))*(zi(i,2)-zi(i,1))
111       !       q2(i,1)=amax1(q2min,vt1,vt2)
112       q2(i,1)=amax1(q2min,vt1)
113       long(i,1)=0.0
114       long(i,kmax+1)=long(i,kmax)
115       sq=0.2
116       kq(i,1)=amax1(kqmin,kappa*(z(i,1)-zi(i,1))*us*sq)
117    END DO
118
119    DO k=2,kmax
120       DO i=1,imax
121          longc=0.5*(long(i,k)+long(i,k+1))
122          q2c=0.5*(q2(i,k)+q2(i,k+1))
123          sq=0.2
124          kq(i,k)=amax1(kqmin,longc*sqrt(q2c)*sq)
125       END DO
126    END DO
127
128    !**********************************************************************
129
130
131    !************* CALCUL DE Q2 *******************************************
132
133    DO k=2,kmax
134       DO i=1,imax
135          prod=2.0*(km(i,k)*m2(i,k)+amax1(0.0,-kh(i,k)*n2(i,k)))
136          dest=2.0*(amax1(0.0,kh(i,k)*n2(i,k))                            &
137               &           +q2(i,k)*sqrt(q2(i,k))/(b1*long(i,k)))
138          IF(k.lt.kmax) THEN
139             ksdz2sup=unsdzi(i,k)*unsdz(i,k)*kq(i,k)
140          ELSE
141             ksdz2sup=0.0
142          END IF
143          ksdz2inf=unsdzi(i,k)*unsdz(i,k-1)*kq(i,k-1)
144          b(i,k)=-ksdz2inf*dt
145          a(i,k)=1.0+dt*(dest/q2(i,k)+ksdz2inf+ksdz2sup)
146          c(i,k)=-ksdz2sup*dt
147          f(i,k)=q2(i,k)+dt*prod
148       END DO
149    END DO
150    DO i=1,imax
151       f(i,2)=f(i,2)                                                    &
152            &       +dt*unsdzi(i,2)*unsdz(i,1)*kq(i,1)*q2(i,1)
153    END DO
154
155    DO i=1,imax
156       alph(i,2)=a(i,2)
157    END DO
158
159    DO k=3,kmax
160       DO i=1,imax
161          bet=b(i,k)/alph(i,k-1)
162          alph(i,k)=a(i,k)-bet*c(i,k-1)
163          f(i,k)=f(i,k)-bet*f(i,k-1)
164       END DO
165    END DO
166
167    DO i=1,imax
168       q2(i,kmax)=amax1(q2min,f(i,kmax)/alph(i,kmax))
169       q2(i,kmax+1)=q2(i,kmax)
170    END DO
171
172    DO k=kmax-1,2,-1
173       DO i=1,imax
174          q2(i,k)=amax1(q2min,(f(i,k)-c(i,k)*q2(i,k+1))/alph(i,k))
175       END DO
176    END DO
177
178    DO i=1,imax
179       q2(i,2)=amax1(q2(i,2),q2(i,1))
180    END DO
181
182    !**********************************************************************
183
184
185    !************* EVALUATION FINALE DE KH ET KM **************************
186
187    DO k=2,kmax
188       DO i=1,imax
189          IF(n2(i,k).gt.0.0) THEN
190             long(i,k)=min(0.53*sqrt(q2(i,k))/sqrt(n2(i,k)),long(i,k))
191          END IF
192          gh=amax1(ghmin,                                                 &
193               &         min(ghmax,-long(i,k)*long(i,k)*n2(i,k)/q2(i,k)))
194          sm=a1*(1.0-3.0*c1-6.0*a1/b1-3.0*a2*gh*                          &
195               &           ((b2-3.0*a2)*(1.0-6.0*a1/b1)-3.0*c1*(b2+6.0*a1)))/     &
196               &        ((1.0-3.0*a2*gh*(6.0*a1+b2))*(1.0-9.0*a1*a2*gh))
197          km(i,k)=amax1(kmmin,long(i,k)*sqrt(q2(i,k))*sm)
198          sh=a2*(1.0-6.0*a1/b1)/(1.0-3.0*a2*gh*(6.0*a1+b2))
199          kh(i,k)=amax1(khmin,long(i,k)*sqrt(q2(i,k))*sh)
200       END DO
201    END DO
202
203    DO i=1,imax
204       km(i,1)=kmmin
205       km(i,kmax+1)=km(i,kmax)
206       kh(i,1)=khmin
207       kh(i,kmax+1)=kh(i,kmax)
208    END DO
209
210    !**********************************************************************
211
212    am=1.0/float(imax)
213    DO k=kmax,1,-1
214       au=0.0
215       ateta=0.0
216       az=0.0
217       adz=0.0
218       akq=0.0
219       acd=0.0
220       DO i=1,imax
221          au=au+am*sqrt(u(i,k)*u(i,k)+v(i,k)*v(i,k))
222          ateta=ateta+am*teta(i,k)
223          az=az+am*z(i,k)
224          adz=adz+am*(1.0/unsdz(i,k))
225          akq=akq+am*kq(i,k)
226          acd=acd+am*cd(i)
227       END DO
228    END DO
229
230    DO k=kmax+1,1,-1
231       azi=0.0
232       adzi=0.0
233       aq2=0.0
234       al=0.0
235       akm=0.0
236       akh=0.0
237       am2=0.0
238       al0=0.0
239       DO i=1,imax
240          azi=azi+am*zi(i,k)
241          adzi=adzi+am*(1.0/unsdzi(i,k))
242          aq2=aq2+am*q2(i,k)
243          al=al+am*long(i,k)
244          akm=akm+am*km(i,k)
245          akh=akh+am*kh(i,k)
246          am2=am2+am*m2(i,k)
247          !         al0=al0+am*long0d(i)
248       END DO
249    END DO
250
251  END SUBROUTINE my_25
252
253END MODULE mellor_yamada
Note: See TracBrowser for help on using the repository browser.