--- trunk/libf/dyn3d/Dissipation/gradiv2.f90 2012/01/10 19:02:02 56 +++ trunk/dyn3d/Dissipation/gradiv2.f90 2013/11/15 18:45:49 76 @@ -4,41 +4,47 @@ contains - SUBROUTINE gradiv2(klevel, xcov, ycov, ld, gdx, gdy, cdivu) + SUBROUTINE gradiv2(xcov, ycov, ld, gdx, gdy, cdivu) ! From LMDZ4/libf/dyn3d/gradiv2.F, version 1.1.1.1 2004/05/19 12:53:07 ! P. Le Van - ! Calcul de grad div du vecteur v. + ! Calcul du gradient de la divergence du vecteur v. - USE dimens_m, ONLY : llm - USE paramet_m, ONLY : ip1jm, ip1jmp1, jjp1 - USE comgeom, ONLY : cuvscvgam1, cvuscugam1, unsair_gam1, unsapolnga1, & + USE comgeom, ONLY: cuvscvgam1, cvuscugam1, unsair_gam1, unsapolnga1, & unsapolsga1 - USE filtreg_m, ONLY : filtreg - - INTEGER, intent(in):: klevel - - ! composantes covariantes de v: - REAL, intent(in):: xcov(ip1jmp1, klevel), ycov(ip1jm, klevel) + USE dimens_m, ONLY: iim, jjm, llm + use divergf_m, only: divergf + USE filtreg_m, ONLY: filtreg + use grad_m, only: grad + use laplacien_m, only: laplacien + use nr_util, only: assert_eq, assert + + ! Composantes covariantes de v : + REAL, intent(in):: xcov(:, :, :) ! (iim + 1, jjm + 1, klevel) + REAL, intent(in):: ycov(:, :, :) ! (iim + 1, jjm, klevel) integer, intent(in):: ld - REAL, intent(out):: gdx(ip1jmp1, klevel), gdy(ip1jm, klevel) + REAL, intent(out):: gdx(:, :, :) ! (iim + 1, jjm + 1, klevel) + REAL, intent(out):: gdy(:, :, :) ! (iim + 1, jjm, klevel) real, intent(in):: cdivu ! Variables locales : - REAL div(ip1jmp1, llm) - REAL nugrads - INTEGER iter + REAL nugrads, div(iim + 1, jjm + 1, llm) + INTEGER iter, klevel !-------------------------------------------------------------- - gdx = xcov - gdy = ycov + call assert((/size(xcov, 1), size(ycov, 1), size(gdx, 1), size(gdy, 1)/) & + == iim + 1, "gradiv2 iim") + call assert((/size(xcov, 2) - 1, size(ycov, 2), size(gdx, 2) - 1, & + size(gdy, 2)/) == jjm, "gradiv2 iim") + klevel = assert_eq(size(xcov, 3), size(ycov, 3), size(gdx, 3), & + size(gdy, 3), "gradiv2 klevel") - CALL divergf(klevel, gdx, gdy, div) + CALL divergf(klevel, xcov, ycov, div) IF (ld > 1) THEN - CALL laplacien(klevel, div, div) + CALL laplacien(klevel, div) ! Itération de l'opérateur laplacien_gam DO iter = 1, ld -2 @@ -47,7 +53,7 @@ END DO ENDIF - CALL filtreg(div, jjp1, klevel, 2, 1, .TRUE., 1) + CALL filtreg(div, jjm + 1, klevel, 2, 1, .TRUE.) CALL grad(klevel, div, gdx, gdy) nugrads = (-1.)**ld * cdivu