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
RevLine 
[1632]1!
[1673]2! $Id$
[1632]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
[1823]19      USE parallel_lmdz
[1632]20      USE Write_Field_loc
21      USE Write_Field
22      USE Bands
23      USE mod_hallo
24      USE Vampir
25      USE times
[2270]26      USE infotrac, ONLY: nqtot, iadv, ok_iso_verif
[1987]27      USE control_mod, ONLY: iapp_tracvl, day_step, planet_type
28      USE advtrac_mod, ONLY: finmasse
[2597]29      USE comconst_mod, ONLY: dtvr
[1632]30      IMPLICIT NONE
31c
[2597]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"
[1632]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
[1848]80      type(Request),SAVE :: testRequest
81!$OMP THREADPRIVATE(testRequest)
[1632]82
[2270]83c  test sur l''eventuelle creation de valeurs negatives de la masse
[1632]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                 
[2286]156          !write(*,*) 'advtrac 157: appel de vlspltgen_loc'
[1632]157          call vlspltgen_loc( q,iadv, 2., massem, wg ,
158     *                        pbarug,pbarvg,dtvr,p,
159     *                        pk,teta )
160
[2286]161          !write(*,*) 'advtrac 162: apres appel vlspltgen_loc'
[2270]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
[1632]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         
[2600]173          GOTO 1234     
[1632]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     
[2600]185!LF            call vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
[1632]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
[1673]350      if (planet_type=="earth") then
351
[1632]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
[2270]363        ! CRisi: on passe nqtot et non nq
364       CALL qminimum_loc( q, nqtot, finmasse )
[1632]365
[1673]366      endif ! of if (planet_type=="earth")
[1632]367
368       RETURN
369       END
370
Note: See TracBrowser for help on using the repository browser.