--- trunk/libf/dyn3d/divergf.f 2011/12/12 13:25:01 55 +++ trunk/Sources/dyn3d/divergf.f 2015/05/06 15:51:03 137 @@ -1,86 +1,52 @@ -! -! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/divergf.F,v 1.1.1.1 2004/05/19 12:53:05 lmdzadmin Exp $ -! - SUBROUTINE divergf(klevel,x,y,div) -c -c P. Le Van -c -c ********************************************************************* -c ... calcule la divergence a tous les niveaux d'1 vecteur de compos. -c x et y... -c x et y etant des composantes covariantes ... -c ********************************************************************* - use dimens_m - use paramet_m - use comgeom - use filtreg_m, only: filtreg - IMPLICIT NONE -c -c x et y sont des arguments d'entree pour le s-prog -c div est un argument de sortie pour le s-prog -c -c -c --------------------------------------------------------------------- -c -c ATTENTION : pendant ce s-pg , ne pas toucher au COMMON/scratch/ . -c -c --------------------------------------------------------------------- -c -c .......... variables en arguments ................... -c - INTEGER, intent(in):: klevel - REAL x( ip1jmp1,klevel ),y( ip1jm,klevel ),div( ip1jmp1,klevel ) - INTEGER l,ij -c -c ............... variables locales ......................... - - REAL aiy1( iip1 ) , aiy2( iip1 ) - REAL sumypn,sumyps -c ................................................................... -c - REAL SSUM -c -c - DO 10 l = 1,klevel -c - DO ij = iip2, ip1jm - 1 - div( ij + 1, l ) = - * cvusurcu( ij+1 ) * x( ij+1,l ) - cvusurcu( ij ) * x( ij , l) + - * cuvsurcv(ij-iim) * y(ij-iim,l) - cuvsurcv(ij+1) * y(ij+1,l) - ENDDO -c -c .... correction pour div( 1,j,l) ...... -c .... div(1,j,l)= div(iip1,j,l) .... -c -CDIR$ IVDEP - DO ij = iip2,ip1jm,iip1 - div( ij,l ) = div( ij + iim,l ) - ENDDO -c -c .... calcul aux poles ..... -c - DO ij = 1,iim - aiy1(ij) = cuvsurcv( ij ) * y( ij , l ) - aiy2(ij) = cuvsurcv( ij+ ip1jmi1 ) * y( ij+ ip1jmi1, l ) - ENDDO - sumypn = SSUM ( iim,aiy1,1 ) / apoln - sumyps = SSUM ( iim,aiy2,1 ) / apols -c - DO ij = 1,iip1 - div( ij , l ) = - sumypn - div( ij + ip1jm, l ) = sumyps - ENDDO - 10 CONTINUE -c - - CALL filtreg( div, jjp1, klevel, 2, 2, .TRUE., 1 ) - -c - DO l = 1, klevel - DO ij = iip2,ip1jm - div(ij,l) = div(ij,l) * unsaire(ij) - ENDDO - ENDDO -c - RETURN - END +module divergf_m + + IMPLICIT NONE + +contains + + SUBROUTINE divergf(klevel, x, y, div) + + ! From libf/dyn3d/divergf.F, version 1.1.1.1 2004/05/19 12:53:05 + + ! P. Le Van + + ! Calcule la divergence à tous les niveaux d'un vecteur de + ! composantes x et y. x et y sont des composantes covariantes. + + USE comgeom, ONLY: apoln, apols, cuvsurcv_2d, cvusurcu_2d, unsaire_2d + USE dimens_m, ONLY: iim, jjm + USE filtreg_scal_m, ONLY: filtreg_scal + + INTEGER, intent(in):: klevel + REAL, intent(in):: x(iim + 1, jjm + 1, klevel), y(iim + 1, jjm, klevel) + real, intent(out):: div(iim + 1, jjm + 1, klevel) ! in (unit of x, y) m-2 + + ! Variables locales : + + INTEGER l, i, j + + !------------------------------------------------------------ + + DO l = 1, klevel + forall (i = 2:iim + 1, j = 2:jjm) div(i, j, l) = cvusurcu_2d(i, j) & + * x(i, j, l) - cvusurcu_2d(i - 1, j) * x(i - 1, j , l) & + + cuvsurcv_2d(i, j - 1) * y(i, j - 1, l) - cuvsurcv_2d(i, j) & + * y(i, j, l) + + div(1, 2:jjm, l) = div(iim + 1, 2:jjm, l) + + ! Calcul aux pôles + div(:, 1, l) = - SUM(cuvsurcv_2d(:iim, 1) * y(:iim, 1, l)) / apoln + div(:, jjm + 1, l) = SUM(cuvsurcv_2d(:iim, jjm) * y(:iim, jjm, l)) & + / apols + end DO + + CALL filtreg_scal(div, direct = .true., intensive = .false.) + + DO l = 1, klevel + div(:, 2:jjm, l) = div(:, 2:jjm, l) * unsaire_2d(:, 2:jjm) + ENDDO + + END SUBROUTINE divergf + +end module divergf_m