source: LMDZ5/branches/testing/libf/dyn3dmem/advtrac_loc.F @ 1695

Last change on this file since 1695 was 1669, checked in by Laurent Fairhead, 12 years ago

Version testing basée sur la r1668

http://lmdz.lmd.jussieu.fr/utilisateurs/distribution-du-modele/versions-intermediaires


Testing release based on r1668

File size: 12.6 KB
Line 
1!
2! $Id: advtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
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
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
27      USE control_mod
28      USE advtrac_mod
29      IMPLICIT NONE
30c
31#include "dimensions.h"
32#include "paramet.h"
33#include "comconst.h"
34#include "comvert.h"
35#include "comdissip.h"
36#include "comgeom2.h"
37#include "logic.h"
38#include "temps.h"
39#include "ener.h"
40#include "description.h"
41
42c-------------------------------------------------------------------
43c     Arguments
44c-------------------------------------------------------------------
45c     Ajout PPM
46c--------------------------------------------------------
47      REAL massebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm)
48c--------------------------------------------------------
49      INTEGER iapptrac
50      REAL pbarug(ijb_u:ije_u,llm),pbarvg(ijb_v:ije_v,llm)
51      REAL wg(ijb_u:ije_u,llm)
52      REAL q(ijb_u:ije_u,llm,nqtot),massem(ijb_u:ije_u,llm)
53      REAL p( ijb_u:ije_u,llmp1 ),teta(ijb_u:ije_u,llm)
54      REAL pk(ijb_u:ije_u,llm)
55
56c-------------------------------------------------------------
57c     Variables locales
58c-------------------------------------------------------------
59
60      REAL zdp(ijb_u:ije_u)
61      REAL (kind=kind(1.d0)) :: t_initial, t_final, tps_cpu
62      INTEGER,SAVE :: iadvtr=0
63c$OMP THREADPRIVATE(iadvtr)
64      INTEGER ij,l,iq,iiq
65      REAL zdpmin, zdpmax
66c----------------------------------------------------------
67c     Rajouts pour PPM
68c----------------------------------------------------------
69      INTEGER indice,n
70      REAL dtbon ! Pas de temps adaptatif pour que CFL<1
71      REAL CFLmaxz,aaa,bbb ! CFL maximum
72      REAL psppm(iim,jjb_u:jje_u) ! pression  au sol
73      REAL unatppm(iim,jjb_u:jje_u,llm),vnatppm(iim,jjb_u:jje_u,llm)
74      REAL qppm(iim*jjnb_u,llm,nqtot)
75      REAL fluxwppm(iim,jjb_u:jje_u,llm)
76      REAL apppm(llmp1), bpppm(llmp1)
77      LOGICAL dum,fill
78      DATA fill/.true./
79      DATA dum/.true./
80      integer ijb,ije,ijbu,ijbv,ijeu,ijev,j
81      type(Request) :: 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          call vlspltgen_loc( q,iadv, 2., massem, wg ,
157     *                        pbarug,pbarvg,dtvr,p,
158     *                        pk,teta )
159
160#ifdef DEBUG_IO     
161          do j=1,nqtot
162            call WriteField_u('q_adv'//trim(int2str(j)),
163     .                q(:,:,j))
164          enddo
165#endif
166         
167          GOTO 1234     
168c-----------------------------------------------------------
169c     Appel des sous programmes d'advection
170c-----------------------------------------------------------
171      do iq=1,nqtot
172c        call clock(t_initial)
173        if(iadv(iq) == 0) cycle
174c   ----------------------------------------------------------------
175c   Schema de Van Leer I MUSCL
176c   ----------------------------------------------------------------
177        if(iadv(iq).eq.10) THEN
178     
179!LF         call vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
180
181c   ----------------------------------------------------------------
182c   Schema "pseudo amont" + test sur humidite specifique
183C    pour la vapeur d'eau. F. Codron
184c   ----------------------------------------------------------------
185        else if(iadv(iq).eq.14) then
186c
187cym           stop 'advtrac : appel à vlspltqs :schema non parallelise'
188!LF           CALL vlspltqs_p( q(1,1,1), 2., massem, wg ,
189!LF     *                 pbarug,pbarvg,dtvr,p,pk,teta )
190c   ----------------------------------------------------------------
191c   Schema de Frederic Hourdin
192c   ----------------------------------------------------------------
193        else if(iadv(iq).eq.12) then
194          stop 'advtrac : schema non parallelise'
195c            Pas de temps adaptatif
196           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
197           if (n.GT.1) then
198           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
199     s             dtvr,'n=',n
200           endif
201           do indice=1,n
202            call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
203           end do
204        else if(iadv(iq).eq.13) then
205          stop 'advtrac : schema non parallelise'
206c            Pas de temps adaptatif
207           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
208           if (n.GT.1) then
209           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
210     s             dtvr,'n=',n
211           endif
212          do indice=1,n
213            call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
214          end do
215c   ----------------------------------------------------------------
216c   Schema de pente SLOPES
217c   ----------------------------------------------------------------
218        else if (iadv(iq).eq.20) then
219          stop 'advtrac : schema non parallelise'
220
221            call pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
222
223c   ----------------------------------------------------------------
224c   Schema de Prather
225c   ----------------------------------------------------------------
226        else if (iadv(iq).eq.30) then
227          stop 'advtrac : schema non parallelise'
228c            Pas de temps adaptatif
229           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
230           if (n.GT.1) then
231           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
232     s             dtvr,'n=',n
233           endif
234           call  prather(q(1,1,iq),wg,massem,pbarug,pbarvg,
235     s                     n,dtbon)
236c   ----------------------------------------------------------------
237c   Schemas PPM Lin et Rood
238c   ----------------------------------------------------------------
239       else if (iadv(iq).eq.11.OR.(iadv(iq).GE.16.AND.
240     s                     iadv(iq).LE.18)) then
241
242           stop 'advtrac : schema non parallelise'
243
244c        Test sur le flux horizontal
245c        Pas de temps adaptatif
246         call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
247         if (n.GT.1) then
248           write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',
249     s             dtvr,'n=',n
250         endif
251c        Test sur le flux vertical
252         CFLmaxz=0.
253         do l=2,llm
254           do ij=iip2,ip1jm
255            aaa=wg(ij,l)*dtvr/massem(ij,l)
256            CFLmaxz=max(CFLmaxz,aaa)
257            bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
258            CFLmaxz=max(CFLmaxz,bbb)
259           enddo
260         enddo
261         if (CFLmaxz.GE.1) then
262            write(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
263         endif
264
265c-----------------------------------------------------------
266c        Ss-prg interface LMDZ.4->PPM3d
267c-----------------------------------------------------------
268
269          call interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem,
270     s                 apppm,bpppm,massebx,masseby,pbarug,pbarvg,
271     s                 unatppm,vnatppm,psppm)
272
273          do indice=1,n
274c---------------------------------------------------------------------
275c                         VL (version PPM) horiz. et PPM vert.
276c---------------------------------------------------------------------
277                if (iadv(iq).eq.11) then
278c                  Ss-prg PPM3d de Lin
279                  call ppm3d(1,qppm(1,1,iq),
280     s                       psppm,psppm,
281     s                       unatppm,vnatppm,fluxwppm,dtbon,2,2,2,1,
282     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
283     s                       fill,dum,220.)
284
285c----------------------------------------------------------------------
286c                           Monotonic PPM
287c----------------------------------------------------------------------
288               else if (iadv(iq).eq.16) then
289c                  Ss-prg PPM3d de Lin
290                  call ppm3d(1,qppm(1,1,iq),
291     s                       psppm,psppm,
292     s                       unatppm,vnatppm,fluxwppm,dtbon,3,3,3,1,
293     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
294     s                       fill,dum,220.)
295c---------------------------------------------------------------------
296
297c---------------------------------------------------------------------
298c                           Semi Monotonic PPM
299c---------------------------------------------------------------------
300               else if (iadv(iq).eq.17) then
301c                  Ss-prg PPM3d de Lin
302                  call ppm3d(1,qppm(1,1,iq),
303     s                       psppm,psppm,
304     s                       unatppm,vnatppm,fluxwppm,dtbon,4,4,4,1,
305     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
306     s                       fill,dum,220.)
307c---------------------------------------------------------------------
308
309c---------------------------------------------------------------------
310c                         Positive Definite PPM
311c---------------------------------------------------------------------
312                else if (iadv(iq).eq.18) then
313c                  Ss-prg PPM3d de Lin
314                  call ppm3d(1,qppm(1,1,iq),
315     s                       psppm,psppm,
316     s                       unatppm,vnatppm,fluxwppm,dtbon,5,5,5,1,
317     s                       iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,
318     s                       fill,dum,220.)
319c---------------------------------------------------------------------
320                endif
321            enddo
322c-----------------------------------------------------------------
323c               Ss-prg interface PPM3d-LMDZ.4
324c-----------------------------------------------------------------
325                  call interpost(q(1,1,iq),qppm(1,1,iq))
326            endif
327c----------------------------------------------------------------------
328
329c-----------------------------------------------------------------
330c On impose une seule valeur du traceur au pôle Sud j=jjm+1=jjp1
331c et Nord j=1
332c-----------------------------------------------------------------
333
334c                  call traceurpole(q(1,1,iq),massem)
335
336c calcul du temps cpu pour un schema donne
337
338
339       end DO
340
3411234  CONTINUE
342c$OMP BARRIER
343
344      ijb=ij_begin
345      ije=ij_end
346
347c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
348       DO l = 1, llm
349         DO ij = ijb, ije
350           finmasse(ij,l) =  p(ij,l) - p(ij,l+1)
351         ENDDO
352       ENDDO
353c$OMP END DO
354
355       CALL qminimum_loc( q, 2, finmasse )
356
357
358       RETURN
359       END
360
Note: See TracBrowser for help on using the repository browser.