source: LMDZ5/trunk/libf/dyn3dmem/advtrac_loc.F @ 2600

Last change on this file since 2600 was 2600, checked in by Ehouarn Millour, 8 years ago

Cleanup in the dynamics: turn comvert.h into module comvert_mod.F90
EM

  • 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: 13.1 KB
Line 
1!
2! $Id$
3!
4c
5c
6#define DEBUG_IO
7#undef DEBUG_IO
8      SUBROUTINE advtrac_loc(pbarug,pbarvg ,wg,
9     *                   p,  massem,q,teta,
10     *                   pk   )
11
12c     Auteur :  F. Hourdin
13c
14c     Modif. P. Le Van     (20/12/97)
15c            F. Codron     (10/99)
16c            D. Le Croller (07/2001)
17c            M.A Filiberti (04/2002)
18c
19      USE parallel_lmdz
20      USE Write_Field_loc
21      USE Write_Field
22      USE Bands
23      USE mod_hallo
24      USE Vampir
25      USE times
26      USE infotrac, ONLY: nqtot, iadv, ok_iso_verif
27      USE control_mod, ONLY: iapp_tracvl, day_step, planet_type
28      USE advtrac_mod, ONLY: finmasse
29      USE comconst_mod, ONLY: dtvr
30      IMPLICIT NONE
31c
32      include "dimensions.h"
33      include "paramet.h"
34      include "comdissip.h"
35      include "comgeom2.h"
36      include "logic.h"
37      include "temps.h"
38      include "ener.h"
39      include "description.h"
40
41c-------------------------------------------------------------------
42c     Arguments
43c-------------------------------------------------------------------
44c     Ajout PPM
45c--------------------------------------------------------
46      REAL massebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm)
47c--------------------------------------------------------
48      INTEGER iapptrac
49      REAL pbarug(ijb_u:ije_u,llm),pbarvg(ijb_v:ije_v,llm)
50      REAL wg(ijb_u:ije_u,llm)
51      REAL q(ijb_u:ije_u,llm,nqtot),massem(ijb_u:ije_u,llm)
52      REAL p( ijb_u:ije_u,llmp1 ),teta(ijb_u:ije_u,llm)
53      REAL pk(ijb_u:ije_u,llm)
54
55c-------------------------------------------------------------
56c     Variables locales
57c-------------------------------------------------------------
58
59      REAL zdp(ijb_u:ije_u)
60      REAL (kind=kind(1.d0)) :: t_initial, t_final, tps_cpu
61      INTEGER,SAVE :: iadvtr=0
62c$OMP THREADPRIVATE(iadvtr)
63      INTEGER ij,l,iq,iiq
64      REAL zdpmin, zdpmax
65c----------------------------------------------------------
66c     Rajouts pour PPM
67c----------------------------------------------------------
68      INTEGER indice,n
69      REAL dtbon ! Pas de temps adaptatif pour que CFL<1
70      REAL CFLmaxz,aaa,bbb ! CFL maximum
71      REAL psppm(iim,jjb_u:jje_u) ! pression  au sol
72      REAL unatppm(iim,jjb_u:jje_u,llm),vnatppm(iim,jjb_u:jje_u,llm)
73      REAL qppm(iim*jjnb_u,llm,nqtot)
74      REAL fluxwppm(iim,jjb_u:jje_u,llm)
75      REAL apppm(llmp1), bpppm(llmp1)
76      LOGICAL dum,fill
77      DATA fill/.true./
78      DATA dum/.true./
79      integer ijb,ije,ijbu,ijbv,ijeu,ijev,j
80      type(Request),SAVE :: testRequest
81!$OMP THREADPRIVATE(testRequest)
82
83c  test sur l''eventuelle creation de valeurs negatives de la masse
84         ijb=ij_begin
85         ije=ij_end
86         if (pole_nord) ijb=ij_begin+iip1
87         if (pole_sud) ije=ij_end-iip1
88         
89c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)         
90         DO l=1,llm-1
91            DO ij = ijb+1,ije
92              zdp(ij) =    pbarug(ij-1,l)   - pbarug(ij,l)
93     s                  - pbarvg(ij-iip1,l) + pbarvg(ij,l)
94     s                  +       wg(ij,l+1)  - wg(ij,l)
95            ENDDO
96           
97c            CALL SCOPY( jjm -1 ,zdp(iip1+iip1),iip1,zdp(iip2),iip1 )
98c ym  ---> pourquoi jjm-1 et non jjm ? a cause du pole ?
99           
100            do ij=ijb,ije-iip1+1,iip1
101              zdp(ij)=zdp(ij+iip1-1)
102            enddo
103           
104            DO ij = ijb,ije
105               zdp(ij)= zdp(ij)*dtvr/ massem(ij,l)
106            ENDDO
107
108
109c            CALL minmax ( ip1jm-iip1, zdp(iip2), zdpmin,zdpmax )
110c  ym ---> eventuellement a revoir
111            CALL minmax ( ije-ijb+1, zdp(ijb), zdpmin,zdpmax )
112           
113            IF(MAX(ABS(zdpmin),ABS(zdpmax)).GT.0.5) THEN
114            PRINT*,'WARNING DP/P l=',l,'  MIN:',zdpmin,
115     s        '   MAX:', zdpmax
116            ENDIF
117
118         ENDDO
119c$OMP END DO NOWAIT
120
121c-------------------------------------------------------------------
122c   Advection proprement dite (Modification Le Croller (07/2001)
123c-------------------------------------------------------------------
124
125c----------------------------------------------------
126c        Calcul des moyennes basées sur la masse
127c----------------------------------------------------
128
129cym      ----> Normalement, inutile pour les schémas classiques
130cym      ----> Revérifier lors de la parallélisation des autres schemas
131   
132cym          call massbar_p(massem,massebx,masseby)         
133
134#ifdef DEBUG_IO   
135          CALL WriteField_u('massem',massem)
136          CALL WriteField_u('wg',wg)
137          CALL WriteField_u('pbarug',pbarug)
138          CALL WriteField_v('pbarvg',pbarvg)
139          CALL WriteField_u('p_tmp',p)
140          CALL WriteField_u('pk_tmp',pk)
141          CALL WriteField_u('teta_tmp',teta)
142          do j=1,nqtot
143            call WriteField_u('q_adv'//trim(int2str(j)),
144     .                q(:,:,j))
145          enddo
146#endif
147
148!         
149!       call Register_Hallo_v(pbarvg,llm,1,1,1,1,TestRequest)
150!
151!       call SendRequest(TestRequest)
152!c$OMP BARRIER
153!       call WaitRequest(TestRequest)
154c$OMP BARRIER
155                 
156          !write(*,*) 'advtrac 157: appel de vlspltgen_loc'
157          call vlspltgen_loc( q,iadv, 2., massem, wg ,
158     *                        pbarug,pbarvg,dtvr,p,
159     *                        pk,teta )
160
161          !write(*,*) 'advtrac 162: apres appel vlspltgen_loc'
162      if (ok_iso_verif) then
163           call check_isotopes(q,ijb_u,ije_u,'advtrac 162')
164      endif !if (ok_iso_verif) then
165
166#ifdef DEBUG_IO     
167          do j=1,nqtot
168            call WriteField_u('q_adv'//trim(int2str(j)),
169     .                q(:,:,j))
170          enddo
171#endif
172         
173          GOTO 1234     
174c-----------------------------------------------------------
175c     Appel des sous programmes d'advection
176c-----------------------------------------------------------
177      do iq=1,nqtot
178c        call clock(t_initial)
179        if(iadv(iq) == 0) cycle
180c   ----------------------------------------------------------------
181c   Schema de Van Leer I MUSCL
182c   ----------------------------------------------------------------
183        if(iadv(iq).eq.10) THEN
184     
185!LF            call vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
186
187c   ----------------------------------------------------------------
188c   Schema "pseudo amont" + test sur humidite specifique
189C    pour la vapeur d'eau. F. Codron
190c   ----------------------------------------------------------------
191        else if(iadv(iq).eq.14) then
192c
193cym           stop 'advtrac : appel à vlspltqs :schema non parallelise'
194!LF           CALL vlspltqs_p( q(1,1,1), 2., massem, wg ,
195!LF     *                 pbarug,pbarvg,dtvr,p,pk,teta )
196c   ----------------------------------------------------------------
197c   Schema de Frederic Hourdin
198c   ----------------------------------------------------------------
199        else if(iadv(iq).eq.12) then
200          stop 'advtrac : schema non parallelise'
201c            Pas de temps adaptatif
202           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
203           if (n.GT.1) then
204           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
205     s             dtvr,'n=',n
206           endif
207           do indice=1,n
208            call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
209           end do
210        else if(iadv(iq).eq.13) then
211          stop 'advtrac : schema non parallelise'
212c            Pas de temps adaptatif
213           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
214           if (n.GT.1) then
215           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
216     s             dtvr,'n=',n
217           endif
218          do indice=1,n
219            call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
220          end do
221c   ----------------------------------------------------------------
222c   Schema de pente SLOPES
223c   ----------------------------------------------------------------
224        else if (iadv(iq).eq.20) then
225          stop 'advtrac : schema non parallelise'
226
227            call pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
228
229c   ----------------------------------------------------------------
230c   Schema de Prather
231c   ----------------------------------------------------------------
232        else if (iadv(iq).eq.30) then
233          stop 'advtrac : schema non parallelise'
234c            Pas de temps adaptatif
235           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
236           if (n.GT.1) then
237           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
238     s             dtvr,'n=',n
239           endif
240           call  prather(q(1,1,iq),wg,massem,pbarug,pbarvg,
241     s                     n,dtbon)
242c   ----------------------------------------------------------------
243c   Schemas PPM Lin et Rood
244c   ----------------------------------------------------------------
245       else if (iadv(iq).eq.11.OR.(iadv(iq).GE.16.AND.
246     s                     iadv(iq).LE.18)) then
247
248           stop 'advtrac : schema non parallelise'
249
250c        Test sur le flux horizontal
251c        Pas de temps adaptatif
252         call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
253         if (n.GT.1) then
254           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
255     s             dtvr,'n=',n
256         endif
257c        Test sur le flux vertical
258         CFLmaxz=0.
259         do l=2,llm
260           do ij=iip2,ip1jm
261            aaa=wg(ij,l)*dtvr/massem(ij,l)
262            CFLmaxz=max(CFLmaxz,aaa)
263            bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
264            CFLmaxz=max(CFLmaxz,bbb)
265           enddo
266         enddo
267         if (CFLmaxz.GE.1) then
268            write(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
269         endif
270
271c-----------------------------------------------------------
272c        Ss-prg interface LMDZ.4->PPM3d
273c-----------------------------------------------------------
274
275          call interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem,
276     s                 apppm,bpppm,massebx,masseby,pbarug,pbarvg,
277     s                 unatppm,vnatppm,psppm)
278
279          do indice=1,n
280c---------------------------------------------------------------------
281c                         VL (version PPM) horiz. et PPM vert.
282c---------------------------------------------------------------------
283                if (iadv(iq).eq.11) then
284c                  Ss-prg PPM3d de Lin
285                  call ppm3d(1,qppm(1,1,iq),
286     s                       psppm,psppm,
287     s                       unatppm,vnatppm,fluxwppm,dtbon,2,2,2,1,
288     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
289     s                       fill,dum,220.)
290
291c----------------------------------------------------------------------
292c                           Monotonic PPM
293c----------------------------------------------------------------------
294               else if (iadv(iq).eq.16) then
295c                  Ss-prg PPM3d de Lin
296                  call ppm3d(1,qppm(1,1,iq),
297     s                       psppm,psppm,
298     s                       unatppm,vnatppm,fluxwppm,dtbon,3,3,3,1,
299     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
300     s                       fill,dum,220.)
301c---------------------------------------------------------------------
302
303c---------------------------------------------------------------------
304c                           Semi Monotonic PPM
305c---------------------------------------------------------------------
306               else if (iadv(iq).eq.17) then
307c                  Ss-prg PPM3d de Lin
308                  call ppm3d(1,qppm(1,1,iq),
309     s                       psppm,psppm,
310     s                       unatppm,vnatppm,fluxwppm,dtbon,4,4,4,1,
311     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
312     s                       fill,dum,220.)
313c---------------------------------------------------------------------
314
315c---------------------------------------------------------------------
316c                         Positive Definite PPM
317c---------------------------------------------------------------------
318                else if (iadv(iq).eq.18) then
319c                  Ss-prg PPM3d de Lin
320                  call ppm3d(1,qppm(1,1,iq),
321     s                       psppm,psppm,
322     s                       unatppm,vnatppm,fluxwppm,dtbon,5,5,5,1,
323     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
324     s                       fill,dum,220.)
325c---------------------------------------------------------------------
326                endif
327            enddo
328c-----------------------------------------------------------------
329c               Ss-prg interface PPM3d-LMDZ.4
330c-----------------------------------------------------------------
331                  call interpost(q(1,1,iq),qppm(1,1,iq))
332            endif
333c----------------------------------------------------------------------
334
335c-----------------------------------------------------------------
336c On impose une seule valeur du traceur au pôle Sud j=jjm+1=jjp1
337c et Nord j=1
338c-----------------------------------------------------------------
339
340c                  call traceurpole(q(1,1,iq),massem)
341
342c calcul du temps cpu pour un schema donne
343
344
345       end DO
346
3471234  CONTINUE
348c$OMP BARRIER
349
350      if (planet_type=="earth") then
351
352      ijb=ij_begin
353      ije=ij_end
354
355c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
356       DO l = 1, llm
357         DO ij = ijb, ije
358           finmasse(ij,l) =  p(ij,l) - p(ij,l+1)
359         ENDDO
360       ENDDO
361c$OMP END DO
362
363        ! CRisi: on passe nqtot et non nq
364       CALL qminimum_loc( q, nqtot, finmasse )
365
366      endif ! of if (planet_type=="earth")
367
368       RETURN
369       END
370
Note: See TracBrowser for help on using the repository browser.