--- trunk/libf/phylmd/clvent.f 2008/07/21 16:05:07 12 +++ trunk/Sources/phylmd/clvent.f 2018/01/05 14:45:45 247 @@ -1,120 +1,89 @@ - SUBROUTINE clvent(knon,dtime, u1lay,v1lay,coef,t,ven, - e paprs,pplay,delp, - s d_ven,flux_v) - use dimens_m - use dimphy - use iniprint - use YOMCST - IMPLICIT none -c====================================================================== -c Auteur(s): Z.X. Li (LMD/CNRS) date: 19930818 -c Objet: diffusion vertical de la vitesse "ven" -c====================================================================== -c Arguments: -c dtime----input-R- intervalle du temps (en second) -c u1lay----input-R- vent u de la premiere couche (m/s) -c v1lay----input-R- vent v de la premiere couche (m/s) -c coef-----input-R- le coefficient d'echange (m**2/s) multiplie par -c le cisaillement du vent (dV/dz); la premiere -c valeur indique la valeur de Cdrag (sans unite) -c t--------input-R- temperature (K) -c ven------input-R- vitesse horizontale (m/s) -c paprs----input-R- pression a inter-couche (Pa) -c pplay----input-R- pression au milieu de couche (Pa) -c delp-----input-R- epaisseur de couche (Pa) -c -c -c d_ven----output-R- le changement de "ven" -c flux_v---output-R- (diagnostic) flux du vent: (kg m/s)/(m**2 s) -c====================================================================== - INTEGER knon - REAL, intent(in):: dtime - REAL u1lay(klon), v1lay(klon) - REAL coef(klon,klev) - REAL t(klon,klev), ven(klon,klev) - REAL paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev) - REAL d_ven(klon,klev) - REAL flux_v(klon,klev) -c====================================================================== -c====================================================================== - INTEGER i, k - REAL zx_cv(klon,2:klev) - REAL zx_dv(klon,2:klev) - REAL zx_buf(klon) - REAL zx_coef(klon,klev) - REAL local_ven(klon,klev) - REAL zx_alf1(klon), zx_alf2(klon) -c====================================================================== - DO k = 1, klev - DO i = 1, knon - local_ven(i,k) = ven(i,k) - ENDDO - ENDDO -c====================================================================== - DO i = 1, knon -ccc zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) - zx_alf1(i) = 1.0 - zx_alf2(i) = 1.0 - zx_alf1(i) - zx_coef(i,1) = coef(i,1) - . * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) - . * pplay(i,1)/(RD*t(i,1)) - zx_coef(i,1) = zx_coef(i,1) * dtime*RG - ENDDO -c====================================================================== - DO k = 2, klev - DO i = 1, knon - zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) - . *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 - zx_coef(i,k) = zx_coef(i,k) * dtime*RG - ENDDO - ENDDO -c====================================================================== - DO i = 1, knon - zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i)+zx_coef(i,2) - zx_cv(i,2) = local_ven(i,1)*delp(i,1) / zx_buf(i) - zx_dv(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) - . /zx_buf(i) - ENDDO - DO k = 3, klev - DO i = 1, knon - zx_buf(i) = delp(i,k-1) + zx_coef(i,k) - . + zx_coef(i,k-1)*(1.-zx_dv(i,k-1)) - zx_cv(i,k) = (local_ven(i,k-1)*delp(i,k-1) - . +zx_coef(i,k-1)*zx_cv(i,k-1) )/zx_buf(i) - zx_dv(i,k) = zx_coef(i,k)/zx_buf(i) - ENDDO - ENDDO - DO i = 1, knon - local_ven(i,klev) = ( local_ven(i,klev)*delp(i,klev) - . +zx_coef(i,klev)*zx_cv(i,klev) ) - . / ( delp(i,klev) + zx_coef(i,klev) - . -zx_coef(i,klev)*zx_dv(i,klev) ) - ENDDO - DO k = klev-1, 1, -1 - DO i = 1, knon - local_ven(i,k) = zx_cv(i,k+1) + zx_dv(i,k+1)*local_ven(i,k+1) - ENDDO - ENDDO -c====================================================================== -c== flux_v est le flux de moment angulaire (positif vers bas) -c== dont l'unite est: (kg m/s)/(m**2 s) - DO i = 1, knon - flux_v(i,1) = zx_coef(i,1)/(RG*dtime) - . *(local_ven(i,1)*zx_alf1(i) - . +local_ven(i,2)*zx_alf2(i)) - ENDDO - DO k = 2, klev - DO i = 1, knon - flux_v(i,k) = zx_coef(i,k)/(RG*dtime) - . * (local_ven(i,k)-local_ven(i,k-1)) - ENDDO - ENDDO -c - DO k = 1, klev - DO i = 1, knon - d_ven(i,k) = local_ven(i,k) - ven(i,k) - ENDDO - ENDDO -c - RETURN - END +module clvent_m + + IMPLICIT none + +contains + + SUBROUTINE clvent(dtime, u1lay, v1lay, coef, cdrag, t, ven, paprs, pplay, & + delp, d_ven, flux_v) + + ! Author: Z. X. Li (LMD/CNRS) + ! Date: 1993/08/18 + ! Objet : diffusion verticale de la vitesse + + USE dimphy, ONLY: klev + use nr_util, only: assert + USE suphec_m, ONLY: rd, rg + + REAL, intent(in):: dtime ! intervalle de temps (en s) + + REAL, intent(in):: u1lay(:), v1lay(:) ! (knon) + ! vent de la premiere couche (m / s) + + REAL, intent(in):: coef(:, 2:) ! (knon, 2:klev) + ! Coefficient d'echange (m**2 / s) multiplié par le cisaillement du + ! vent (dV / dz) + + REAL, intent(in):: cdrag(:) ! (knon) sans unité + REAL, intent(in):: t(:, :) ! (knon, klev) ! temperature (K) + REAL, intent(in):: ven(:, :) ! (knon, klev) vitesse horizontale (m / s) + REAL, intent(in):: paprs(:, :) ! (knon, klev + 1) pression a + ! inter-couche (Pa) + real, intent(in):: pplay(:, :) ! (knon, klev) pression au milieu + ! de couche (Pa) + real, intent(in):: delp(:, :) ! (knon, klev) epaisseur de couche (Pa) + REAL, intent(out):: d_ven(:, :) ! (knon, klev) ! le changement de "ven" + + REAL, intent(out):: flux_v(:) ! (knon) + ! (diagnostic) flux du vent à la surface, en (kg m / s) / (m**2 s) + ! flux_v est le flux de moment angulaire (positif vers bas) + + ! Local: + INTEGER k + REAL zx_cv(size(u1lay), 2:klev) ! (knon, 2:klev) + REAL zx_dv(size(u1lay), 2:klev) ! (knon, 2:klev) + REAL zx_buf(size(u1lay)) ! (knon) + REAL zx_coef(size(u1lay), klev) ! (knon, klev) + REAL local_ven(size(u1lay), klev) ! (knon, klev) + + !------------------------------------------------------------------ + + call assert(size(u1lay) == [size(v1lay), size(coef, 1), size(t, 1), & + size(ven, 1), size(paprs, 1), size(pplay, 1), size(delp, 1), & + size(d_ven, 1), size(flux_v)], "clvent knon") + + zx_coef(:, 1) = cdrag * (1. + SQRT(u1lay**2 + v1lay**2)) * pplay(:, 1) & + / (RD * t(:, 1)) * dtime * RG + + DO k = 2, klev + zx_coef(:, k) = coef(:, k) * RG / (pplay(:, k - 1) - pplay(:, k)) & + * (paprs(:, k) * 2 / (t(:, k) + t(:, k - 1)) / RD)**2 * dtime * RG + ENDDO + + zx_buf = delp(:, 1) + zx_coef(:, 1) + zx_coef(:, 2) + zx_cv(:, 2) = ven(:, 1) * delp(:, 1) / zx_buf + zx_dv(:, 2) = zx_coef(:, 2) / zx_buf + + DO k = 3, klev + zx_buf = delp(:, k - 1) + zx_coef(:, k) & + + zx_coef(:, k - 1) * (1. - zx_dv(:, k - 1)) + zx_cv(:, k) = (ven(:, k - 1) * delp(:, k - 1) & + + zx_coef(:, k - 1) * zx_cv(:, k - 1)) / zx_buf + zx_dv(:, k) = zx_coef(:, k) / zx_buf + ENDDO + + local_ven(:, klev) = (ven(:, klev) * delp(:, klev) & + + zx_coef(:, klev) * zx_cv(:, klev)) & + / (delp(:, klev) + zx_coef(:, klev) & + - zx_coef(:, klev) * zx_dv(:, klev)) + + DO k = klev - 1, 1, - 1 + local_ven(:, k) = zx_cv(:, k + 1) + zx_dv(:, k + 1) * local_ven(:, k + 1) + ENDDO + + flux_v = zx_coef(:, 1) / (RG * dtime) * local_ven(:, 1) + d_ven = local_ven - ven + + END SUBROUTINE clvent + +end module clvent_m