source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/dissip_loc.f90 @ 5153

Last change on this file since 5153 was 5136, checked in by abarral, 8 weeks ago

Put comgeom.h, comgeom2.h into 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
File size: 5.3 KB
Line 
1! $Id: $
2
3SUBROUTINE dissip_loc(vcov, ucov, teta, p, dv, du, dh)
4  !
5  USE parallel_lmdz
6  USE write_field_loc
7  USE dissip_mod, ONLY: dissip_allocate
8  USE comconst_mod, ONLY: dtdiss
9  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
10  USE lmdz_comdissipn, ONLY: tetaudiv, tetaurot, tetah, cdivu, crot, cdivh
11  USE lmdz_comdissnew, ONLY: lstardis, nitergdiv, nitergrot, niterh, tetagdiv, &
12          tetagrot, tetatemp, coefdis, vert_prof_dissip
13  USE lmdz_comgeom
14
15  IMPLICIT NONE
16
17
18  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
19  ! (  10/01/98  )
20
21  !=======================================================================
22  !
23  !   Auteur:  P. Le Van
24  !   -------
25  !
26  !   Objet:
27  !   ------
28  !
29  !   Dissipation horizontale
30  !
31  !=======================================================================
32  !-----------------------------------------------------------------------
33  !   Declarations:
34  !   -------------
35
36  INCLUDE "dimensions.h"
37  INCLUDE "paramet.h"
38
39  !   Arguments:
40  !   ----------
41
42  REAL, INTENT(IN) :: vcov(ijb_v:ije_v, llm) ! covariant meridional wind
43  REAL, INTENT(IN) :: ucov(ijb_u:ije_u, llm) ! covariant zonal wind
44  REAL, INTENT(IN) :: teta(ijb_u:ije_u, llm) ! potential temperature
45  REAL, INTENT(IN) :: p(ijb_u:ije_u, llmp1) ! interlayer pressure
46  ! tendencies (.../s) on covariant winds and potential temperature
47  REAL, INTENT(OUT) :: dv(ijb_v:ije_v, llm)
48  REAL, INTENT(OUT) :: du(ijb_u:ije_u, llm)
49  REAL, INTENT(OUT) :: dh(ijb_u:ije_u, llm)
50
51  !   Local:
52  !   ------
53
54  REAL :: gdx(ijb_u:ije_u, llm), gdy(ijb_v:ije_v, llm)
55  REAL :: grx(ijb_u:ije_u, llm), gry(ijb_v:ije_v, llm)
56  REAL :: te1dt(llm), te2dt(llm), te3dt(llm)
57  REAL :: deltapres(ijb_u:ije_u, llm)
58
59  INTEGER :: l, ij
60  INTEGER :: ijb, ije
61
62  LOGICAl, SAVE :: first = .TRUE.
63  !$OMP THREADPRIVATE(first)
64
65  IF (first) THEN
66    CALL dissip_allocate
67    first = .FALSE.
68  ENDIF
69  !-----------------------------------------------------------------------
70  !   initialisations:
71  !   ----------------
72
73  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
74  DO l = 1, llm
75    te1dt(l) = tetaudiv(l) * dtdiss
76    te2dt(l) = tetaurot(l) * dtdiss
77    te3dt(l) = tetah(l) * dtdiss
78  ENDDO
79  !$OMP END DO NOWAIT
80  ! CALL initial0( ijp1llm, du )
81  ! CALL initial0( ijmllm , dv )
82  ! CALL initial0( ijp1llm, dh )
83
84  ijb = ij_begin
85  ije = ij_end
86
87  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
88  DO l = 1, llm
89    du(ijb:ije, l) = 0
90    dh(ijb:ije, l) = 0
91  ENDDO
92  !$OMP END DO NOWAIT
93
94  IF (pole_sud) ije = ij_end - iip1
95
96  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
97  DO l = 1, llm
98    dv(ijb:ije, l) = 0
99  ENDDO
100  !$OMP END DO NOWAIT
101
102  !-----------------------------------------------------------------------
103  !   Calcul de la dissipation:
104  !   -------------------------
105
106  !   Calcul de la partie   grad  ( div ) :
107  !   -------------------------------------
108
109  IF(lstardis) THEN
110    ! IF (.FALSE.) THEN
111    CALL gradiv2_loc(llm, ucov, vcov, nitergdiv, gdx, gdy)
112  ELSE
113    ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
114  ENDIF
115
116  IF (CPPKEY_DEBUGIO) THEN
117    CALL WriteField_u('gdx', gdx)
118    CALL WriteField_v('gdy', gdy)
119  END IF
120
121  ijb = ij_begin
122  ije = ij_end
123  IF (pole_sud) ije = ij_end - iip1
124
125  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
126  DO l = 1, llm
127    IF (pole_nord) THEN
128      DO ij = 1, iip1
129        gdx(ij, l) = 0.
130      ENDDO
131    endif
132
133    IF (pole_sud) THEN
134      DO ij = 1, iip1
135        gdx(ij + ip1jm, l) = 0.
136      ENDDO
137    endif
138
139    IF (pole_nord) ijb = ij_begin + iip1
140    DO ij = ijb, ije
141      du(ij, l) = du(ij, l) - te1dt(l) * gdx(ij, l)
142    ENDDO
143
144    IF (pole_nord) ijb = ij_begin
145    DO ij = ijb, ije
146      dv(ij, l) = dv(ij, l) - te1dt(l) * gdy(ij, l)
147    ENDDO
148
149  ENDDO
150  !$OMP END DO NOWAIT
151  !   calcul de la partie   n X grad ( rot ):
152  !   ---------------------------------------
153
154  IF(lstardis) THEN
155    ! IF (.FALSE.) THEN
156    CALL nxgraro2_loc(llm, ucov, vcov, nitergrot, grx, gry)
157  ELSE
158    ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
159  ENDIF
160
161  IF (CPPKEY_DEBUGIO) THEN
162    CALL WriteField_u('grx', grx)
163    CALL WriteField_v('gry', gry)
164  END IF
165
166  ijb = ij_begin
167  ije = ij_end
168  IF (pole_sud) ije = ij_end - iip1
169
170  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
171  DO l = 1, llm
172
173    IF (pole_nord) THEN
174      DO ij = 1, iip1
175        grx(ij, l) = 0.
176      ENDDO
177    endif
178
179    IF (pole_nord) ijb = ij_begin + iip1
180    DO ij = ijb, ije
181      du(ij, l) = du(ij, l) - te2dt(l) * grx(ij, l)
182    ENDDO
183
184    IF (pole_nord) ijb = ij_begin
185    DO ij = ijb, ije
186      dv(ij, l) = dv(ij, l) - te2dt(l) * gry(ij, l)
187    ENDDO
188
189  ENDDO
190  !$OMP END DO NOWAIT
191
192  !   calcul de la partie   div ( grad ):
193  !   -----------------------------------
194
195  IF(lstardis) THEN
196    ! IF (.FALSE.) THEN
197
198    ijb = ij_begin
199    ije = ij_end
200
201    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
202    DO l = 1, llm
203      DO ij = ijb, ije
204        deltapres(ij, l) = AMAX1(0., p(ij, l) - p(ij, l + 1))
205      ENDDO
206    ENDDO
207    !$OMP END DO NOWAIT
208    CALL divgrad2_loc(llm, teta, deltapres, niterh, gdx)
209  ELSE
210    ! CALL divgrad_p ( llm,teta, niterh, gdx        )
211  ENDIF
212
213  IF (CPPKEY_DEBUGIO) THEN
214    CALL WriteField_u('gdx', gdx)
215  END IF
216
217  ijb = ij_begin
218  ije = ij_end
219
220  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
221  DO l = 1, llm
222    DO ij = ijb, ije
223      dh(ij, l) = dh(ij, l) - te3dt(l) * gdx(ij, l)
224    ENDDO
225  ENDDO
226  !$OMP END DO NOWAIT
227
228
229END SUBROUTINE dissip_loc
Note: See TracBrowser for help on using the repository browser.