Changeset 1992 for LMDZ5/trunk/libf/phylmd/yamada.F90
- Timestamp:
- Mar 5, 2014, 2:19:12 PM (10 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/yamada.F90
r1988 r1992 1 ! 1 2 2 ! $Header$ 3 ! 4 SUBROUTINE yamada(ngrid,dt,g,rconst,plev,temp 5 s ,zlev,zlay,u,v,teta,cd,q2,km,kn,ustar 6 s ,l_mix) 7 use dimphy 8 IMPLICIT NONE 9 c....................................................................... 10 cym#include "dimensions.h" 11 cym#include "dimphy.h" 12 c....................................................................... 13 c 14 c dt : pas de temps 15 c g : g 16 c zlev : altitude a chaque niveau (interface inferieure de la couche 17 c de meme indice) 18 c zlay : altitude au centre de chaque couche 19 c u,v : vitesse au centre de chaque couche 20 c (en entree : la valeur au debut du pas de temps) 21 c teta : temperature potentielle au centre de chaque couche 22 c (en entree : la valeur au debut du pas de temps) 23 c cd : cdrag 24 c (en entree : la valeur au debut du pas de temps) 25 c q2 : $q^2$ au bas de chaque couche 26 c (en entree : la valeur au debut du pas de temps) 27 c (en sortie : la valeur a la fin du pas de temps) 28 c km : diffusivite turbulente de quantite de mouvement (au bas de chaque 29 c couche) 30 c (en sortie : la valeur a la fin du pas de temps) 31 c kn : diffusivite turbulente des scalaires (au bas de chaque couche) 32 c (en sortie : la valeur a la fin du pas de temps) 33 c 34 c....................................................................... 35 REAL dt,g,rconst 36 real plev(klon,klev+1),temp(klon,klev) 37 real ustar(klon),snstable 38 REAL zlev(klon,klev+1) 39 REAL zlay(klon,klev) 40 REAL u(klon,klev) 41 REAL v(klon,klev) 42 REAL teta(klon,klev) 43 REAL cd(klon) 44 REAL q2(klon,klev+1) 45 REAL km(klon,klev+1) 46 REAL kn(klon,klev+1) 47 integer l_mix,ngrid 3 4 SUBROUTINE yamada(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, & 5 cd, q2, km, kn, ustar, l_mix) 6 USE dimphy 7 IMPLICIT NONE 8 ! ....................................................................... 9 ! ym#include "dimensions.h" 10 ! ym#include "dimphy.h" 11 ! ....................................................................... 12 13 ! dt : pas de temps 14 ! g : g 15 ! zlev : altitude a chaque niveau (interface inferieure de la couche 16 ! de meme indice) 17 ! zlay : altitude au centre de chaque couche 18 ! u,v : vitesse au centre de chaque couche 19 ! (en entree : la valeur au debut du pas de temps) 20 ! teta : temperature potentielle au centre de chaque couche 21 ! (en entree : la valeur au debut du pas de temps) 22 ! cd : cdrag 23 ! (en entree : la valeur au debut du pas de temps) 24 ! q2 : $q^2$ au bas de chaque couche 25 ! (en entree : la valeur au debut du pas de temps) 26 ! (en sortie : la valeur a la fin du pas de temps) 27 ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque 28 ! couche) 29 ! (en sortie : la valeur a la fin du pas de temps) 30 ! kn : diffusivite turbulente des scalaires (au bas de chaque couche) 31 ! (en sortie : la valeur a la fin du pas de temps) 32 33 ! ....................................................................... 34 REAL dt, g, rconst 35 REAL plev(klon, klev+1), temp(klon, klev) 36 REAL ustar(klon), snstable 37 REAL zlev(klon, klev+1) 38 REAL zlay(klon, klev) 39 REAL u(klon, klev) 40 REAL v(klon, klev) 41 REAL teta(klon, klev) 42 REAL cd(klon) 43 REAL q2(klon, klev+1) 44 REAL km(klon, klev+1) 45 REAL kn(klon, klev+1) 46 INTEGER l_mix, ngrid 48 47 49 48 50 integer nlay,nlev51 cym PARAMETER (nlay=klev)52 cym PARAMETER (nlev=klev+1)49 INTEGER nlay, nlev 50 ! ym PARAMETER (nlay=klev) 51 ! ym PARAMETER (nlev=klev+1) 53 52 54 logicalfirst55 savefirst56 data first/.true./57 c$OMP THREADPRIVATE(first)53 LOGICAL first 54 SAVE first 55 DATA first/.TRUE./ 56 !$OMP THREADPRIVATE(first) 58 57 59 integer ig,k58 INTEGER ig, k 60 59 61 real ri,zrif,zalpha,zsm62 real rif(klon,klev+1),sm(klon,klev+1),alpha(klon,klev)60 REAL ri, zrif, zalpha, zsm 61 REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev) 63 62 64 real m2(klon,klev+1),dz(klon,klev+1),zq,n2(klon,klev+1)65 real l(klon,klev+1),l0(klon)63 REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1) 64 REAL l(klon, klev+1), l0(klon) 66 65 67 real sq(klon),sqz(klon),zz(klon,klev+1)68 integeriter66 REAL sq(klon), sqz(klon), zz(klon, klev+1) 67 INTEGER iter 69 68 70 real ric,rifc,b1,kap71 save ric,rifc,b1,kap72 data ric,rifc,b1,kap/0.195,0.191,16.6,0.3/73 c$OMP THREADPRIVATE(ric,rifc,b1,kap)69 REAL ric, rifc, b1, kap 70 SAVE ric, rifc, b1, kap 71 DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.3/ 72 !$OMP THREADPRIVATE(ric,rifc,b1,kap) 74 73 75 real frif,falpha,fsm74 REAL frif, falpha, fsm 76 75 77 frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))78 falpha(ri)=1.318*(0.2231-ri)/(0.2341-ri)79 fsm(ri)=1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))76 frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156)) 77 falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri) 78 fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri)) 80 79 81 nlay=klev 82 nlev=klev+1 83 84 if (0.eq.1.and.first) then 85 do ig=1,1000 86 ri=(ig-800.)/500. 87 if (ri.lt.ric) then 88 zrif=frif(ri) 89 else 90 zrif=rifc 91 endif 92 if(zrif.lt.0.16) then 93 zalpha=falpha(zrif) 94 zsm=fsm(zrif) 95 else 96 zalpha=1.12 97 zsm=0.085 98 endif 99 print*,ri,rif,zalpha,zsm 100 enddo 101 first=.false. 102 endif 80 nlay = klev 81 nlev = klev + 1 103 82 104 c Correction d'un bug sauvage a verifier. 105 c do k=2,nlev 106 do k=2,nlay 107 do ig=1,ngrid 108 dz(ig,k)=zlay(ig,k)-zlay(ig,k-1) 109 m2(ig,k)=((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig,k-1))**2) 110 s /(dz(ig,k)*dz(ig,k)) 111 n2(ig,k)=g*2.*(teta(ig,k)-teta(ig,k-1)) 112 s /(teta(ig,k-1)+teta(ig,k)) /dz(ig,k) 113 ri=n2(ig,k)/max(m2(ig,k),1.e-10) 114 if (ri.lt.ric) then 115 rif(ig,k)=frif(ri) 116 else 117 rif(ig,k)=rifc 118 endif 119 if(rif(ig,k).lt.0.16) then 120 alpha(ig,k)=falpha(rif(ig,k)) 121 sm(ig,k)=fsm(rif(ig,k)) 122 else 123 alpha(ig,k)=1.12 124 sm(ig,k)=0.085 125 endif 126 zz(ig,k)=b1*m2(ig,k)*(1.-rif(ig,k))*sm(ig,k) 127 enddo 128 enddo 83 IF (0==1 .AND. first) THEN 84 DO ig = 1, 1000 85 ri = (ig-800.)/500. 86 IF (ri<ric) THEN 87 zrif = frif(ri) 88 ELSE 89 zrif = rifc 90 END IF 91 IF (zrif<0.16) THEN 92 zalpha = falpha(zrif) 93 zsm = fsm(zrif) 94 ELSE 95 zalpha = 1.12 96 zsm = 0.085 97 END IF 98 PRINT *, ri, rif, zalpha, zsm 99 END DO 100 first = .FALSE. 101 END IF 129 102 130 c iterration pour determiner la longueur de melange 103 ! Correction d'un bug sauvage a verifier. 104 ! do k=2,nlev 105 DO k = 2, nlay 106 DO ig = 1, ngrid 107 dz(ig, k) = zlay(ig, k) - zlay(ig, k-1) 108 m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, & 109 k-1))**2)/(dz(ig,k)*dz(ig,k)) 110 n2(ig, k) = g*2.*(teta(ig,k)-teta(ig,k-1))/(teta(ig,k-1)+teta(ig,k))/ & 111 dz(ig, k) 112 ri = n2(ig, k)/max(m2(ig,k), 1.E-10) 113 IF (ri<ric) THEN 114 rif(ig, k) = frif(ri) 115 ELSE 116 rif(ig, k) = rifc 117 END IF 118 IF (rif(ig,k)<0.16) THEN 119 alpha(ig, k) = falpha(rif(ig,k)) 120 sm(ig, k) = fsm(rif(ig,k)) 121 ELSE 122 alpha(ig, k) = 1.12 123 sm(ig, k) = 0.085 124 END IF 125 zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k) 126 END DO 127 END DO 131 128 132 do ig=1,ngrid 133 l0(ig)=100. 134 enddo 135 do k=2,klev-1 136 do ig=1,ngrid 137 l(ig,k)=l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) 138 enddo 139 enddo 129 ! iterration pour determiner la longueur de melange 140 130 141 do iter=1,10 142 do ig=1,ngrid 143 sq(ig)=1.e-10 144 sqz(ig)=1.e-10 145 enddo 146 do k=2,klev-1 147 do ig=1,ngrid 148 q2(ig,k)=l(ig,k)**2*zz(ig,k) 149 l(ig,k)=min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) 150 s ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) 151 zq=sqrt(q2(ig,k)) 152 sqz(ig)=sqz(ig)+zq*zlev(ig,k)*(zlay(ig,k)-zlay(ig,k-1)) 153 sq(ig)=sq(ig)+zq*(zlay(ig,k)-zlay(ig,k-1)) 154 enddo 155 enddo 156 do ig=1,ngrid 157 l0(ig)=0.2*sqz(ig)/sq(ig) 158 enddo 159 c(abd 3 5 2) print*,'ITER=',iter,' L0=',l0 131 DO ig = 1, ngrid 132 l0(ig) = 100. 133 END DO 134 DO k = 2, klev - 1 135 DO ig = 1, ngrid 136 l(ig, k) = l0(ig)*kap*zlev(ig, k)/(kap*zlev(ig,k)+l0(ig)) 137 END DO 138 END DO 160 139 161 enddo 140 DO iter = 1, 10 141 DO ig = 1, ngrid 142 sq(ig) = 1.E-10 143 sqz(ig) = 1.E-10 144 END DO 145 DO k = 2, klev - 1 146 DO ig = 1, ngrid 147 q2(ig, k) = l(ig, k)**2*zz(ig, k) 148 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, & 149 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10))) 150 zq = sqrt(q2(ig,k)) 151 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1)) 152 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1)) 153 END DO 154 END DO 155 DO ig = 1, ngrid 156 l0(ig) = 0.2*sqz(ig)/sq(ig) 157 END DO 158 ! (abd 3 5 2) print*,'ITER=',iter,' L0=',l0 162 159 163 do k=2,klev 164 do ig=1,ngrid 165 l(ig,k)=min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) 166 s ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) 167 q2(ig,k)=l(ig,k)**2*zz(ig,k) 168 km(ig,k)=l(ig,k)*sqrt(q2(ig,k))*sm(ig,k) 169 kn(ig,k)=km(ig,k)*alpha(ig,k) 170 enddo 171 enddo 160 END DO 172 161 173 return 174 end 162 DO k = 2, klev 163 DO ig = 1, ngrid 164 l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, & 165 k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10))) 166 q2(ig, k) = l(ig, k)**2*zz(ig, k) 167 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) 168 kn(ig, k) = km(ig, k)*alpha(ig, k) 169 END DO 170 END DO 171 172 RETURN 173 END SUBROUTINE yamada
Note: See TracChangeset
for help on using the changeset viewer.