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