--- trunk/libf/dyn3d/geopot.f90 2010/04/06 17:52:58 32 +++ trunk/libf/dyn3d/geopot.f90 2013/06/24 15:39:52 70 @@ -1,38 +1,46 @@ -SUBROUTINE geopot(ngrid,teta,pk,pks,phis,phi) +module geopot_m - ! From libf/dyn3d/geopot.F, version 1.1.1.1 2004/05/19 - ! Author: P. Le Van - ! Objet : calcul du géopotentiel aux milieux des couches - ! L'integration se fait de bas en haut. + IMPLICIT NONE - USE dimens_m - USE paramet_m +contains - IMPLICIT NONE + SUBROUTINE geopot(teta, pk, pks, phis, phi) + + ! From libf/dyn3d/geopot.F, version 1.1.1.1 2004/05/19 + ! Author: P. Le Van + ! Objet : calcul du géopotentiel aux milieux des couches + ! L'intégration se fait de bas en haut. + + USE dimens_m, ONLY: iim, jjm, llm + use nr_util, only: assert + + REAL, INTENT(IN):: teta(:, :, :) ! (iim + 1, jjm + 1, llm) + REAL, INTENT(IN):: pk(:, :, :) ! (iim + 1, jjm + 1, llm) + REAL, INTENT(IN):: pks(:, :) ! (iim + 1, jjm + 1) + REAL, INTENT(IN):: phis(:, :) ! (iim + 1, jjm + 1) + REAL, INTENT(out):: phi(:, :, :) ! (iim + 1, jjm + 1, llm) + + ! Local: + INTEGER l + + ! ----------------------------------------------------------------------- + + call assert((/size(teta, 1), size(pk, 1), size(pks, 1), size(phis, 1), & + size(phi, 1)/) == iim + 1, "geopot iim") + call assert((/size(teta, 2), size(pk, 2), size(pks, 2), size(phis, 2), & + size(phi, 2)/) == jjm + 1, "geopot jjm") + call assert((/size(teta, 3), size(pk, 3), size(phi, 3)/) == llm, & + "geopot llm") + + ! Calcul de phi au niveau 1 près du sol : + phi(:, :, 1) = phis + teta(:, :, 1) * (pks - pk(:, :, 1)) + + ! Calcul de phi aux niveaux supérieurs : + DO l = 2, llm + phi(:, :, l) = phi(:, :, l-1) + 0.5 * (teta(:, :, l) + teta(:, :, l-1)) & + * (pk(:, :, l-1) - pk(:, :, l)) + END DO - ! Arguments: - INTEGER, INTENT (IN):: ngrid - REAL, INTENT (IN):: teta(ngrid,llm), pks(ngrid) - REAL, INTENT (IN) :: phis(ngrid) - REAL, INTENT (IN) :: pk(ngrid,llm) - REAL, INTENT (out):: phi(ngrid,llm) - - ! Local: - INTEGER l, ij - - ! ----------------------------------------------------------------------- - - ! calcul de phi au niveau 1 pres du sol - DO ij = 1, ngrid - phi(ij,1) = phis(ij) + teta(ij,1)*(pks(ij)-pk(ij,1)) - end DO - - ! calcul de phi aux niveaux superieurs - DO l = 2, llm - DO ij = 1, ngrid - phi(ij,l) = phi(ij,l-1) + 0.5 * (teta(ij,l) + teta(ij,l-1)) & - * (pk(ij,l-1) - pk(ij,l)) - END DO - END DO + END SUBROUTINE geopot -END SUBROUTINE geopot +end module geopot_m