! ! $Id: $ ! SUBROUTINE dissip_loc( vcov,ucov,teta,p, dv,du,dh ) c USE parallel_lmdz USE write_field_loc USE dissip_mod, ONLY: dissip_allocate USE comconst_mod, ONLY: dtdiss IMPLICIT NONE c .. Avec nouveaux operateurs star : gradiv2 , divgrad2, nxgraro2 ... c ( 10/01/98 ) c======================================================================= c c Auteur: P. Le Van c ------- c c Objet: c ------ c c Dissipation horizontale c c======================================================================= c----------------------------------------------------------------------- c Declarations: c ------------- include "dimensions.h" include "paramet.h" include "comgeom.h" include "comdissnew.h" include "comdissipn.h" c Arguments: c ---------- REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature REAL,INTENT(IN) :: p(ijb_u:ije_u,llmp1) ! interlayer pressure ! tendencies (.../s) on covariant winds and potential temperature REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm) REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm) REAL,INTENT(OUT) :: dh(ijb_u:ije_u,llm) c Local: c ------ REAL gdx(ijb_u:ije_u,llm),gdy(ijb_v:ije_v,llm) REAL grx(ijb_u:ije_u,llm),gry(ijb_v:ije_v,llm) REAL te1dt(llm),te2dt(llm),te3dt(llm) REAL deltapres(ijb_u:ije_u,llm) INTEGER l,ij REAL SSUM integer :: ijb,ije LOGICAl,SAVE :: first=.TRUE. !$OMP THREADPRIVATE(first) IF (first) THEN CALL dissip_allocate first=.FALSE. ENDIF c----------------------------------------------------------------------- c initialisations: c ---------------- c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l=1,llm te1dt(l) = tetaudiv(l) * dtdiss te2dt(l) = tetaurot(l) * dtdiss te3dt(l) = tetah(l) * dtdiss ENDDO c$OMP END DO NOWAIT c CALL initial0( ijp1llm, du ) c CALL initial0( ijmllm , dv ) c CALL initial0( ijp1llm, dh ) ijb=ij_begin ije=ij_end c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l=1,llm du(ijb:ije,l)=0 dh(ijb:ije,l)=0 ENDDO c$OMP END DO NOWAIT if (pole_sud) ije=ij_end-iip1 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l=1,llm dv(ijb:ije,l)=0 ENDDO c$OMP END DO NOWAIT c----------------------------------------------------------------------- c Calcul de la dissipation: c ------------------------- c Calcul de la partie grad ( div ) : c ------------------------------------- IF(lstardis) THEN c IF (.FALSE.) THEN CALL gradiv2_loc( llm,ucov,vcov,nitergdiv,gdx,gdy ) ELSE ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy ) ENDIF #ifdef DEBUG_IO call WriteField_u('gdx',gdx) call WriteField_v('gdy',gdy) #endif ijb=ij_begin ije=ij_end if (pole_sud) ije=ij_end-iip1 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l=1,llm if (pole_nord) then DO ij = 1, iip1 gdx( ij ,l) = 0. ENDDO endif if (pole_sud) then DO ij = 1, iip1 gdx(ij+ip1jm,l) = 0. ENDDO endif if (pole_nord) ijb=ij_begin+iip1 DO ij = ijb,ije du(ij,l) = du(ij,l) - te1dt(l) *gdx(ij,l) ENDDO if (pole_nord) ijb=ij_begin DO ij = ijb,ije dv(ij,l) = dv(ij,l) - te1dt(l) *gdy(ij,l) ENDDO ENDDO c$OMP END DO NOWAIT c calcul de la partie n X grad ( rot ): c --------------------------------------- IF(lstardis) THEN c IF (.FALSE.) THEN CALL nxgraro2_loc( llm,ucov, vcov, nitergrot,grx,gry ) ELSE ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry ) ENDIF #ifdef DEBUG_IO call WriteField_u('grx',grx) call WriteField_v('gry',gry) #endif ijb=ij_begin ije=ij_end if (pole_sud) ije=ij_end-iip1 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l=1,llm if (pole_nord) then DO ij = 1, iip1 grx(ij,l) = 0. ENDDO endif if (pole_nord) ijb=ij_begin+iip1 DO ij = ijb,ije du(ij,l) = du(ij,l) - te2dt(l) * grx(ij,l) ENDDO if (pole_nord) ijb=ij_begin DO ij = ijb, ije dv(ij,l) = dv(ij,l) - te2dt(l) * gry(ij,l) ENDDO ENDDO c$OMP END DO NOWAIT c calcul de la partie div ( grad ): c ----------------------------------- IF(lstardis) THEN c IF (.FALSE.) THEN ijb=ij_begin ije=ij_end c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1, llm DO ij = ijb, ije deltapres(ij,l) = AMAX1( 0., p(ij,l) - p(ij,l+1) ) ENDDO ENDDO c$OMP END DO NOWAIT CALL divgrad2_loc( llm,teta, deltapres ,niterh, gdx ) ELSE ! CALL divgrad_p ( llm,teta, niterh, gdx ) ENDIF #ifdef DEBUG_IO call WriteField_u('gdx',gdx) #endif ijb=ij_begin ije=ij_end c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) DO l = 1,llm DO ij = ijb,ije dh( ij,l ) = dh( ij,l ) - te3dt(l) * gdx( ij,l ) ENDDO ENDDO c$OMP END DO NOWAIT RETURN END