Changeset 1992 for LMDZ5/trunk/libf/phylmd/coefkzmin.F90
- Timestamp:
- Mar 5, 2014, 2:19:12 PM (10 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/coefkzmin.F90
r1988 r1992 1 !2 SUBROUTINE coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm3 . ,km,kn)4 1 5 USE dimphy 6 IMPLICIT NONE 2 SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn) 7 3 8 include "YOMCST.h" 4 USE dimphy 5 IMPLICIT NONE 9 6 10 c....................................................................... 11 c Entrees modifies en attendant une version ou les zlev, et zlay soient 12 c disponibles. 7 include "YOMCST.h" 13 8 14 REAL ycdragm(klon) 9 ! ....................................................................... 10 ! Entrees modifies en attendant une version ou les zlev, et zlay soient 11 ! disponibles. 15 12 16 REAL yu(klon,klev), yv(klon,klev) 17 REAL yt(klon,klev), yq(klon,klev) 18 REAL ypaprs(klon,klev+1), ypplay(klon,klev) 19 REAL yustar(klon) 20 real yzlay(klon,klev),yzlev(klon,klev+1),yteta(klon,klev) 13 REAL ycdragm(klon) 21 14 22 integer i 15 REAL yu(klon, klev), yv(klon, klev) 16 REAL yt(klon, klev), yq(klon, klev) 17 REAL ypaprs(klon, klev+1), ypplay(klon, klev) 18 REAL yustar(klon) 19 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev) 23 20 24 c....................................................................... 25 c 26 c En entree : 27 c ----------- 28 c 29 c zlev : altitude a chaque niveau (interface inferieure de la couche 30 c de meme indice) 31 c ustar : u* 32 c 33 c teta : temperature potentielle au centre de chaque couche 34 c (en entree : la valeur au debut du pas de temps) 35 c 36 c en sortier : 37 c ------------ 38 c 39 c km : diffusivite turbulente de quantite de mouvement (au bas de chaque 40 c couche) 41 c (en sortie : la valeur a la fin du pas de temps) 42 c kn : diffusivite turbulente des scalaires (au bas de chaque couche) 43 c (en sortie : la valeur a la fin du pas de temps) 44 c 45 c....................................................................... 21 INTEGER i 46 22 47 real ustar(klon) 48 real kmin,qmin,pblhmin(klon),coriol(klon) 49 REAL zlev(klon,klev+1) 50 REAL teta(klon,klev) 23 ! ....................................................................... 51 24 52 REAL km(klon,klev) 53 REAL kn(klon,klev) 54 integer knon 25 ! En entree : 26 ! ----------- 27 28 ! zlev : altitude a chaque niveau (interface inferieure de la couche 29 ! de meme indice) 30 ! ustar : u* 31 32 ! teta : temperature potentielle au centre de chaque couche 33 ! (en entree : la valeur au debut du pas de temps) 34 35 ! en sortier : 36 ! ------------ 37 38 ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque 39 ! couche) 40 ! (en sortie : la valeur a la fin du pas de temps) 41 ! kn : diffusivite turbulente des scalaires (au bas de chaque couche) 42 ! (en sortie : la valeur a la fin du pas de temps) 43 44 ! ....................................................................... 45 46 REAL ustar(klon) 47 REAL kmin, qmin, pblhmin(klon), coriol(klon) 48 REAL zlev(klon, klev+1) 49 REAL teta(klon, klev) 50 51 REAL km(klon, klev) 52 REAL kn(klon, klev) 53 INTEGER knon 55 54 56 55 57 integer nlay,nlev58 integer ig,k56 INTEGER nlay, nlev 57 INTEGER ig, k 59 58 60 real,parameter :: kap=0.459 REAL, PARAMETER :: kap = 0.4 61 60 62 nlay=klev 63 nlev=klev+1 64 c....................................................................... 65 c en attendant une version ou les zlev, et zlay soient 66 c disponibles. 67 c Debut de la partie qui doit etre unclue a terme dans clmain. 68 c 69 do i=1,knon 70 yzlay(i,1)=RD*yt(i,1)/(0.5*(ypaprs(i,1)+ypplay(i,1))) 71 . *(ypaprs(i,1)-ypplay(i,1))/RG 72 enddo 73 do k=2,klev 74 do i=1,knon 75 yzlay(i,k)=yzlay(i,k-1)+RD*0.5*(yt(i,k-1)+yt(i,k)) 76 s /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG 77 enddo 78 enddo 79 do k=1,klev 80 do i=1,knon 81 cATTENTION:on passe la temperature potentielle virt. pour le calcul de K 82 yteta(i,k)=yt(i,k)*(ypaprs(i,1)/ypplay(i,k))**rkappa 83 s *(1.+0.61*yq(i,k)) 84 enddo 85 enddo 86 do i=1,knon 87 yzlev(i,1)=0. 88 yzlev(i,klev+1)=2.*yzlay(i,klev)-yzlay(i,klev-1) 89 enddo 90 do k=2,klev 91 do i=1,knon 92 yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1)) 93 enddo 94 enddo 61 nlay = klev 62 nlev = klev + 1 63 ! ....................................................................... 64 ! en attendant une version ou les zlev, et zlay soient 65 ! disponibles. 66 ! Debut de la partie qui doit etre unclue a terme dans clmain. 95 67 96 yustar(1:knon) =SQRT(ycdragm(1:knon)* 97 $ (yu(1:knon,1)*yu(1:knon,1)+yv(1:knon,1)*yv(1:knon,1))) 68 DO i = 1, knon 69 yzlay(i, 1) = rd*yt(i, 1)/(0.5*(ypaprs(i,1)+ypplay(i, & 70 1)))*(ypaprs(i,1)-ypplay(i,1))/rg 71 END DO 72 DO k = 2, klev 73 DO i = 1, knon 74 yzlay(i, k) = yzlay(i, k-1) + rd*0.5*(yt(i,k-1)+yt(i,k))/ypaprs(i, k)*( & 75 ypplay(i,k-1)-ypplay(i,k))/rg 76 END DO 77 END DO 78 DO k = 1, klev 79 DO i = 1, knon 80 ! ATTENTION:on passe la temperature potentielle virt. pour le calcul de 81 ! K 82 yteta(i, k) = yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**rkappa* & 83 (1.+0.61*yq(i,k)) 84 END DO 85 END DO 86 DO i = 1, knon 87 yzlev(i, 1) = 0. 88 yzlev(i, klev+1) = 2.*yzlay(i, klev) - yzlay(i, klev-1) 89 END DO 90 DO k = 2, klev 91 DO i = 1, knon 92 yzlev(i, k) = 0.5*(yzlay(i,k)+yzlay(i,k-1)) 93 END DO 94 END DO 98 95 99 c Fin de la partie qui doit etre unclue a terme dans clmain. 96 yustar(1:knon) = sqrt(ycdragm(1:knon)*(yu(1:knon,1)*yu(1:knon,1)+yv(1:knon, & 97 1)*yv(1:knon,1))) 100 98 101 Cette routine est ecrite pour avoir en entree ustar, teta et zlev 102 c Ici, on a inclut le calcul de ces trois variables dans la routine 103 c coefkzmin en attendant une nouvelle version de la couche limite 104 c ou ces variables seront disponibles. 99 ! Fin de la partie qui doit etre unclue a terme dans clmain. 105 100 106 c Debut de la routine coefkzmin proprement dite. 101 ! ette routine est ecrite pour avoir en entree ustar, teta et zlev 102 ! Ici, on a inclut le calcul de ces trois variables dans la routine 103 ! coefkzmin en attendant une nouvelle version de la couche limite 104 ! ou ces variables seront disponibles. 107 105 108 ustar=yustar 109 teta=yteta 110 zlev=yzlev 106 ! Debut de la routine coefkzmin proprement dite. 111 107 112 do ig=1,knon 113 coriol(ig)=1.e-4 114 pblhmin(ig)=0.07*ustar(ig)/max(abs(coriol(ig)),2.546e-5) 115 enddo 116 117 do k=2,klev 118 do ig=1,knon 119 if (teta(ig,2).gt.teta(ig,1)) then 120 qmin=ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 121 kmin=kap*zlev(ig,k)*qmin 122 else 123 kmin=0. ! kmin n'est utilise que pour les SL stables. 124 endif 125 kn(ig,k)=kmin 126 km(ig,k)=kmin 127 enddo 128 enddo 108 ustar = yustar 109 teta = yteta 110 zlev = yzlev 111 112 DO ig = 1, knon 113 coriol(ig) = 1.E-4 114 pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5) 115 END DO 116 117 DO k = 2, klev 118 DO ig = 1, knon 119 IF (teta(ig,2)>teta(ig,1)) THEN 120 qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 121 kmin = kap*zlev(ig, k)*qmin 122 ELSE 123 kmin = 0. ! kmin n'est utilise que pour les SL stables. 124 END IF 125 kn(ig, k) = kmin 126 km(ig, k) = kmin 127 END DO 128 END DO 129 129 130 130 131 return132 end 131 RETURN 132 END SUBROUTINE coefkzmin
Note: See TracChangeset
for help on using the changeset viewer.