/[lmdze]/trunk/dyn3d/Dissipation/dissip.f
ViewVC logotype

Diff of /trunk/dyn3d/Dissipation/dissip.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/dissip.f90 revision 54 by guez, Tue Dec 6 15:07:04 2011 UTC trunk/libf/dyn3d/Dissipation/dissip.f90 revision 64 by guez, Wed Aug 29 14:47:17 2012 UTC
# Line 7  contains Line 7  contains
7    SUBROUTINE dissip(vcov, ucov, teta, p, dv, du, dh)    SUBROUTINE dissip(vcov, ucov, teta, p, dv, du, dh)
8    
9      ! From dyn3d/dissip.F, version 1.1.1.1 2004/05/19 12:53:05      ! From dyn3d/dissip.F, version 1.1.1.1 2004/05/19 12:53:05
     ! Avec nouveaux opĂ©rateurs star : gradiv2, divgrad2, nxgraro2  
10      ! Author: P. Le Van      ! Author: P. Le Van
11      ! Objet : dissipation horizontale      ! Objet : calcul de la dissipation horizontale
12        ! Avec opĂ©rateurs star : gradiv2, divgrad2, nxgraro2
13    
14      USE dimens_m, ONLY : iim, jjm, llm      USE dimens_m, ONLY: iim, jjm, llm
15      USE paramet_m, ONLY : iip1, iip2, ip1jmp1, llmp1      USE comdissnew, ONLY: nitergdiv, nitergrot, niterh
16      USE comdissnew, ONLY : lstardis, nitergdiv, nitergrot, niterh      USE inidissip_m, ONLY: dtdiss, tetah, tetaudiv, tetaurot, cdivu, crot, cdivh
     USE inidissip_m, ONLY : dtdiss, tetah, tetaudiv, tetaurot, cdivu, crot, &  
          cdivh  
17      use gradiv2_m, only: gradiv2      use gradiv2_m, only: gradiv2
18        use nr_util, only: assert
19    
20      ! Arguments:      REAL, intent(in):: vcov(:, :, :) ! (iim + 1, jjm, llm)
21      REAL vcov((iim + 1) * jjm, llm), ucov(ip1jmp1, llm), teta(ip1jmp1, llm)      REAL, intent(in):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm)
22      REAL, INTENT (IN) :: p(ip1jmp1, llmp1)      REAL, intent(in):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
23      REAL dv((iim + 1) * jjm, llm), du(ip1jmp1, llm), dh(ip1jmp1, llm)      REAL, INTENT(IN):: p(:, :, :) ! (iim + 1, jjm + 1, llm + 1)
24        REAL, intent(out):: dv(:, :, :) ! (iim + 1, jjm, llm)
25        REAL, intent(out):: du(:, :, :) ! (iim + 1, jjm + 1, llm)
26        REAL, intent(out):: dh(:, :, :) ! (iim + 1, jjm + 1, llm)
27    
28      ! Local:      ! Local:
29      REAL gdx(ip1jmp1, llm), gdy((iim + 1) * jjm, llm)      REAL gdx(iim + 1, jjm + 1, llm), gdy(iim + 1, jjm, llm)
30      REAL grx(ip1jmp1, llm), gry((iim + 1) * jjm, llm)      REAL grx(iim + 1, jjm + 1, llm), gry(iim + 1, jjm, llm)
31      REAL te1dt(llm), te2dt(llm), te3dt(llm)      REAL tedt(llm)
32      REAL deltapres(ip1jmp1, llm)      REAL deltapres(iim + 1, jjm + 1, llm)
33        INTEGER l
     INTEGER l, ij  
34    
35      !-----------------------------------------------------------------------      !-----------------------------------------------------------------------
36    
37      ! Initializations:      call assert((/size(vcov, 1), size(ucov, 1), size(teta, 1), size(p, 1), &
38      te1dt = tetaudiv * dtdiss           size(dv, 1), size(du, 1), size(dh, 1)/) == iim + 1, "dissip iim")
39      te2dt = tetaurot * dtdiss      call assert((/size(vcov, 2), size(ucov, 2) - 1, size(teta, 2) - 1, &
40      te3dt = tetah * dtdiss           size(p, 2) - 1, size(dv, 2), size(du, 2) - 1, size(dh, 2) - 1/) &
41      du = 0.           == jjm, "dissip jjm")
42      dv = 0.      call assert((/size(vcov, 3), size(ucov, 3), size(teta, 3), size(p, 3) - 1, &
43      dh = 0.           size(dv, 3), size(du, 3), size(dh, 3)/) == llm, "dissip llm")
44    
45      ! Calcul de la dissipation:      du(:, 1, :) = 0.
46        du(:, jjm + 1, :) = 0.
47    
48      ! Calcul de la partie grad (div) :      ! Calcul de la partie grad (div) :
49    
50      IF (lstardis) THEN      CALL gradiv2(ucov, vcov, nitergdiv, gdx, gdy, cdivu)
51         CALL gradiv2(llm, ucov, vcov, nitergdiv, gdx, gdy, cdivu)      tedt = tetaudiv * dtdiss
52      ELSE      forall (l = 1: llm)
53         CALL gradiv(llm, ucov, vcov, nitergdiv, gdx, gdy, cdivu)         du(:, 2: jjm, l) = - tedt(l) * gdx(:, 2: jjm, l)
54      END IF         dv(:, :, l) = - tedt(l) * gdy(:, :, l)
55        END forall
56      DO l = 1, llm  
57         DO ij = 1, iip1      ! Calcul de la partie n X grad (rot) :
58            gdx(ij, l) = 0.  
59            gdx(ij+(iim + 1) * jjm, l) = 0.      CALL nxgraro2(llm, ucov, vcov, nitergrot, grx, gry, crot)
60         END DO      tedt = tetaurot * dtdiss
61        forall (l = 1: llm)
62         DO ij = iip2, (iim + 1) * jjm         du(:, 2: jjm, l) = du(:, 2: jjm, l) - tedt(l) * grx(:, 2: jjm, l)
63            du(ij, l) = du(ij, l) - te1dt(l) * gdx(ij, l)         dv(:, :, l) = dv(:, :, l) - tedt(l) * gry(:, :, l)
64         END DO      END forall
        DO ij = 1, (iim + 1) * jjm  
           dv(ij, l) = dv(ij, l) - te1dt(l) * gdy(ij, l)  
        END DO  
     END DO  
   
     ! calcul de la partie n X grad (rot) :  
   
     IF (lstardis) THEN  
        CALL nxgraro2(llm, ucov, vcov, nitergrot, grx, gry, crot)  
     ELSE  
        CALL nxgrarot(llm, ucov, vcov, nitergrot, grx, gry, crot)  
     END IF  
   
   
     DO l = 1, llm  
        DO ij = 1, iip1  
           grx(ij, l) = 0.  
        END DO  
   
        DO ij = iip2, (iim + 1) * jjm  
           du(ij, l) = du(ij, l) - te2dt(l) * grx(ij, l)  
        END DO  
        DO ij = 1, (iim + 1) * jjm  
           dv(ij, l) = dv(ij, l) - te2dt(l) * gry(ij, l)  
        END DO  
     END DO  
65    
66      ! calcul de la partie div (grad) :      ! calcul de la partie div (grad) :
67    
68      IF (lstardis) THEN      forall (l = 1: llm) &
69         DO l = 1, llm           deltapres(:, :, l) = max(0., p(:, :, l) - p(:, :, l + 1))
70            DO ij = 1, ip1jmp1      CALL divgrad2(llm, teta, deltapres, niterh, gdx, cdivh)
71               deltapres(ij, l) = max(0., p(ij, l) - p(ij, l + 1))      forall (l = 1: llm) dh(:, :, l) = - tetah(l) * dtdiss * gdx(:, :, l)
           END DO  
        END DO  
   
        CALL divgrad2(llm, teta, deltapres, niterh, gdx, cdivh)  
     ELSE  
        CALL divgrad(llm, teta, niterh, gdx, cdivh)  
     END IF  
   
     forall (l = 1: llm) dh(:, l) = dh(:, l) - te3dt(l) * gdx(:, l)  
72    
73    END SUBROUTINE dissip    END SUBROUTINE dissip
74    

Legend:
Removed from v.54  
changed lines
  Added in v.64

  ViewVC Help
Powered by ViewVC 1.1.21