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

Last change on this file since 5116 was 5116, checked in by abarral, 2 months ago

rename modules properly lmdz_*
move ismin, ismax, minmax into new lmdz_libmath.f90
(lint) uppercase fortran keywords

  • 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.1 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  IMPLICIT NONE
11
12
13  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
14  ! (  10/01/98  )
15
16  !=======================================================================
17  !
18  !   Auteur:  P. Le Van
19  !   -------
20  !
21  !   Objet:
22  !   ------
23  !
24  !   Dissipation horizontale
25  !
26  !=======================================================================
27  !-----------------------------------------------------------------------
28  !   Declarations:
29  !   -------------
30
31  include "dimensions.h"
32  include "paramet.h"
33  include "comgeom.h"
34  include "comdissnew.h"
35  include "comdissipn.h"
36
37  !   Arguments:
38  !   ----------
39
40  REAL, INTENT(IN) :: vcov(ijb_v:ije_v, llm) ! covariant meridional wind
41  REAL, INTENT(IN) :: ucov(ijb_u:ije_u, llm) ! covariant zonal wind
42  REAL, INTENT(IN) :: teta(ijb_u:ije_u, llm) ! potential temperature
43  REAL, INTENT(IN) :: p(ijb_u:ije_u, llmp1) ! interlayer pressure
44  ! tendencies (.../s) on covariant winds and potential temperature
45  REAL, INTENT(OUT) :: dv(ijb_v:ije_v, llm)
46  REAL, INTENT(OUT) :: du(ijb_u:ije_u, llm)
47  REAL, INTENT(OUT) :: dh(ijb_u:ije_u, llm)
48
49  !   Local:
50  !   ------
51
52  REAL :: gdx(ijb_u:ije_u, llm), gdy(ijb_v:ije_v, llm)
53  REAL :: grx(ijb_u:ije_u, llm), gry(ijb_v:ije_v, llm)
54  REAL :: te1dt(llm), te2dt(llm), te3dt(llm)
55  REAL :: deltapres(ijb_u:ije_u, llm)
56
57  INTEGER :: l, ij
58
59  REAL :: SSUM
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.