source: LMDZ6/trunk/libf/dyn3dmem/dissip_loc.F90 @ 5248

Last change on this file since 5248 was 5246, checked in by abarral, 23 hours ago

Convert fixed-form to free-form sources .F -> .{f,F}90
(WIP: some .F remain, will be handled in subsequent commits)

  • 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.0 KB
RevLine 
[1987]1!
2! $Id: $
3!
[5246]4SUBROUTINE dissip_loc( vcov,ucov,teta,p, dv,du,dh )
5  !
6  USE parallel_lmdz
7  USE write_field_loc
8  USE dissip_mod, ONLY: dissip_allocate
9  USE comconst_mod, ONLY: dtdiss
10  IMPLICIT NONE
[1632]11
12
[5246]13  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
14                              ! (  10/01/98  )
[1632]15
[5246]16  !=======================================================================
17  !
18  !   Auteur:  P. Le Van
19  !   -------
20  !
21  !   Objet:
22  !   ------
23  !
24  !   Dissipation horizontale
25  !
26  !=======================================================================
27  !-----------------------------------------------------------------------
28  !   Declarations:
29  !   -------------
[1632]30
[5246]31  include "dimensions.h"
32  include "paramet.h"
33  include "comgeom.h"
34  include "comdissnew.h"
35  include "comdissipn.h"
[1632]36
[5246]37  !   Arguments:
38  !   ----------
[1632]39
[5246]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)
[1632]48
[5246]49  !   Local:
50  !   ------
[1632]51
[5246]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)
[1632]56
[5246]57  INTEGER :: l,ij
[1632]58
[5246]59  REAL :: SSUM
60  integer :: ijb,ije
61
62  LOGICAl,SAVE :: first=.TRUE.
[1632]63!$OMP THREADPRIVATE(first)
64
[5246]65  IF (first) THEN
66    CALL dissip_allocate
67    first=.FALSE.
68  ENDIF
69  !-----------------------------------------------------------------------
70  !   initialisations:
71  !   ----------------
[1632]72
[5246]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 )
[1632]83
[5246]84  ijb=ij_begin
85  ije=ij_end
[1632]86
[5246]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
[1632]93
[5246]94  if (pole_sud) ije=ij_end-iip1
[1632]95
[5246]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
[1632]101
[5246]102  !-----------------------------------------------------------------------
103  !   Calcul de la dissipation:
104  !   -------------------------
[1632]105
[5246]106  !   Calcul de la partie   grad  ( div ) :
107  !   -------------------------------------
[1632]108
109
110
[5246]111  IF(lstardis) THEN
112   ! IF (.FALSE.) THEN
113     CALL gradiv2_loc( llm,ucov,vcov,nitergdiv,gdx,gdy )
114  ELSE
115      ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
116  ENDIF
[1632]117
[5246]118#ifdef DEBUG_IO
119  call WriteField_u('gdx',gdx)
120  call WriteField_v('gdy',gdy)
[1632]121#endif
122
[5246]123  ijb=ij_begin
124  ije=ij_end
125  if (pole_sud) ije=ij_end-iip1
[1632]126
[5246]127!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
128  DO l=1,llm
129     if (pole_nord) then
130       DO ij = 1, iip1
131          gdx(     ij ,l) = 0.
132       ENDDO
133     endif
[1632]134
[5246]135     if (pole_sud) then
136       DO ij = 1, iip1
137          gdx(ij+ip1jm,l) = 0.
138       ENDDO
139     endif
[1632]140
[5246]141     if (pole_nord) ijb=ij_begin+iip1
142     DO ij = ijb,ije
143        du(ij,l) = du(ij,l) - te1dt(l) *gdx(ij,l)
144     ENDDO
[1632]145
[5246]146     if (pole_nord) ijb=ij_begin
147     DO ij = ijb,ije
148        dv(ij,l) = dv(ij,l) - te1dt(l) *gdy(ij,l)
149     ENDDO
[1632]150
[5246]151   ENDDO
152!$OMP END DO NOWAIT
153  !   calcul de la partie   n X grad ( rot ):
154  !   ---------------------------------------
[1632]155
[5246]156  IF(lstardis) THEN
157   ! IF (.FALSE.) THEN
158     CALL nxgraro2_loc( llm,ucov, vcov, nitergrot,grx,gry )
159  ELSE
160      ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
161  ENDIF
162
163#ifdef DEBUG_IO
164  call WriteField_u('grx',grx)
165  call WriteField_v('gry',gry)
[1632]166#endif
167
168
[5246]169  ijb=ij_begin
170  ije=ij_end
171  if (pole_sud) ije=ij_end-iip1
172
173!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
174  DO l=1,llm
175
176     if (pole_nord) then
177       DO ij = 1, iip1
178          grx(ij,l) = 0.
179       ENDDO
180     endif
181
182     if (pole_nord) ijb=ij_begin+iip1
183     DO ij = ijb,ije
184        du(ij,l) = du(ij,l) - te2dt(l) * grx(ij,l)
185     ENDDO
186
187     if (pole_nord) ijb=ij_begin
188     DO ij =  ijb, ije
189        dv(ij,l) = dv(ij,l) - te2dt(l) * gry(ij,l)
190     ENDDO
191
192  ENDDO
193!$OMP END DO NOWAIT
194
195  !   calcul de la partie   div ( grad ):
196  !   -----------------------------------
197
198
199  IF(lstardis) THEN
200   ! IF (.FALSE.) THEN
201
202  ijb=ij_begin
203  ije=ij_end
204
205!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
206   DO l = 1, llm
207      DO ij = ijb, ije
208        deltapres(ij,l) = AMAX1( 0.,  p(ij,l) - p(ij,l+1) )
[1632]209      ENDDO
[5246]210   ENDDO
211!$OMP END DO NOWAIT
212     CALL divgrad2_loc( llm,teta, deltapres  ,niterh, gdx )
213  ELSE
214      ! CALL divgrad_p ( llm,teta, niterh, gdx        )
215  ENDIF
[1632]216
[5246]217#ifdef DEBUG_IO
218  call WriteField_u('gdx',gdx)
219#endif
220
221
222  ijb=ij_begin
223  ije=ij_end
224
225!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
226  DO l = 1,llm
227     DO ij = ijb,ije
228        dh( ij,l ) = dh( ij,l ) - te3dt(l) * gdx( ij,l )
229     ENDDO
230  ENDDO
231!$OMP END DO NOWAIT
232
233  RETURN
234END SUBROUTINE dissip_loc
Note: See TracBrowser for help on using the repository browser.