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

Legend:
Removed from v.26  
changed lines
  Added in v.56

  ViewVC Help
Powered by ViewVC 1.1.21