source: LMDZ6/branches/Amaury_dev/libf/dyn3d/lmdz_advect.f90 @ 5229

Last change on this file since 5229 was 5186, checked in by abarral, 3 months ago

Encapsulate files in modules

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1MODULE lmdz_advect
2  IMPLICIT NONE; PRIVATE
3  PUBLIC advect
4
5CONTAINS
6
7  SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta)
8
9    USE comconst_mod, ONLY: daysec
10    USE logic_mod, ONLY: conser
11    USE ener_mod, ONLY: gtot
12    USE lmdz_ssum_scopy, ONLY: ssum
13    USE lmdz_comgeom
14
15    USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
16    USE lmdz_paramet
17    IMPLICIT NONE
18    !=======================================================================
19
20    !   Auteurs:  P. Le Van , Fr. Hourdin  .
21    !   -------
22
23    !   Objet:
24    !   ------
25
26    !   *************************************************************
27    !   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
28    !   *************************************************************
29    !    ces termes sont ajoutes a du,dv,dteta et dq .
30    !  Modif F.Forget 03/94 : on retire q de advect
31
32    !=======================================================================
33    !-----------------------------------------------------------------------
34    !   Declarations:
35    !   -------------
36
37
38
39
40    !   Arguments:
41    !   ----------
42
43    REAL :: vcov(ip1jm, llm), ucov(ip1jmp1, llm), teta(ip1jmp1, llm)
44    REAL :: massebx(ip1jmp1, llm), masseby(ip1jm, llm), w(ip1jmp1, llm)
45    REAL :: dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm)
46
47    !   Local:
48    !   ------
49
50    REAL :: uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1)
51    REAL :: unsaire2(ip1jmp1), ge(ip1jmp1)
52    REAL :: deuxjour, ww, gt, uu, vv
53
54    INTEGER :: ij, l
55
56    !-----------------------------------------------------------------------
57    !   2. Calculs preliminaires:
58    !   -------------------------
59
60    IF (conser)  THEN
61      deuxjour = 2. * daysec
62
63      DO   ij = 1, ip1jmp1
64        unsaire2(ij) = unsaire(ij) * unsaire(ij)
65      END DO
66    END IF
67
68
69    !------------------  -yy ----------------------------------------------
70    !   .  Calcul de     u
71
72    DO  l = 1, llm
73      DO    ij = iip2, ip1jmp1
74        uav(ij, l) = 0.25 * (ucov(ij, l) + ucov(ij - iip1, l))
75      ENDDO
76      DO    ij = iip2, ip1jm
77        uav(ij, l) = uav(ij, l) + uav(ij + iip1, l)
78      ENDDO
79      DO      ij = 1, iip1
80        uav(ij, l) = 0.
81        uav(ip1jm + ij, l) = 0.
82      ENDDO
83    ENDDO
84
85    !------------------  -xx ----------------------------------------------
86    !   .  Calcul de     v
87
88    DO  l = 1, llm
89      DO    ij = 2, ip1jm
90        vav(ij, l) = 0.25 * (vcov(ij, l) + vcov(ij - 1, l))
91      ENDDO
92      DO    ij = 1, ip1jm, iip1
93        vav(ij, l) = vav(ij + iim, l)
94      ENDDO
95      DO    ij = 1, ip1jm - 1
96        vav(ij, l) = vav(ij, l) + vav(ij + 1, l)
97      ENDDO
98      DO    ij = 1, ip1jm, iip1
99        vav(ij + iim, l) = vav(ij, l)
100      ENDDO
101    ENDDO
102
103    !-----------------------------------------------------------------------
104
105    DO l = 1, llmm1
106
107
108      ! ......   calcul de  - w/2.    au niveau  l+1   .......
109
110      DO ij = 1, ip1jmp1
111        wsur2(ij) = - 0.5 * w(ij, l + 1)
112      END DO
113
114
115      ! .....................     calcul pour  du     ..................
116
117      DO ij = iip2, ip1jm - 1
118        ww = wsur2 (ij) + wsur2(ij + 1)
119        uu = 0.5 * (ucov(ij, l) + ucov(ij, l + 1))
120        du(ij, l) = du(ij, l) - ww * (uu - uav(ij, l)) / massebx(ij, l)
121        du(ij, l + 1) = du(ij, l + 1) + ww * (uu - uav(ij, l + 1)) / massebx(ij, l + 1)
122      END DO
123
124      ! .....  correction pour  du(iip1,j,l)  ........
125      ! .....     du(iip1,j,l)= du(1,j,l)   .....
126
127      !DIR$ IVDEP
128      DO   ij = iip1 + iip1, ip1jm, iip1
129        du(ij, l) = du(ij - iim, l)
130        du(ij, l + 1) = du(ij - iim, l + 1)
131      END DO
132
133      ! .................    calcul pour   dv      .....................
134
135      DO ij = 1, ip1jm
136        ww = wsur2(ij + iip1) + wsur2(ij)
137        vv = 0.5 * (vcov(ij, l) + vcov(ij, l + 1))
138        dv(ij, l) = dv(ij, l) - ww * (vv - vav(ij, l)) / masseby(ij, l)
139        dv(ij, l + 1) = dv(ij, l + 1) + ww * (vv - vav(ij, l + 1)) / masseby(ij, l + 1)
140      END DO
141
142      !
143
144      ! ............................................................
145      ! ...............    calcul pour   dh      ...................
146      ! ............................................................
147
148      !                   ---z
149      !   calcul de  - d( teta  * w )      qu'on ajoute a   dh
150      !               ...............
151
152      DO ij = 1, ip1jmp1
153        ww = wsur2(ij) * (teta(ij, l) + teta(ij, l + 1))
154        dteta(ij, l) = dteta(ij, l) - ww
155        dteta(ij, l + 1) = dteta(ij, l + 1) + ww
156      END DO
157
158      IF(conser)  THEN
159        DO ij = 1, ip1jmp1
160          ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij)
161        END DO
162        gt = SSUM(ip1jmp1, ge, 1)
163        gtot(l) = deuxjour * SQRT(gt / ip1jmp1)
164      END IF
165
166    END DO
167
168  END SUBROUTINE advect
169
170END MODULE lmdz_advect
Note: See TracBrowser for help on using the repository browser.