source: LMDZ6/trunk/libf/dyn3dmem/vlspltgen_loc.F90 @ 5452

Last change on this file since 5452 was 5324, checked in by abarral, 7 weeks ago

[WIP] Remove uses of DEBUGIO cpp key (deprecated)

  • 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: 12.4 KB
Line 
1
2!
3! $Header$
4!
5 SUBROUTINE vlspltgen_loc( q,pente_max,masse,w,pbaru,pbarv, &
6         pdt, p,pk,teta                 )
7
8  !
9  ! Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron
10  !
11  !    ********************************************************************
12  !      Schema  d'advection " pseudo amont " .
13  !  + test sur humidite specifique: Q advecte< Qsat aval
14  !               (F. Codron, 10/99)
15  !    ********************************************************************
16  ! q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
17  !
18  ! pente_max facteur de limitation des pentes: 2 en general
19  !                                            0 pour un schema amont
20  ! pbaru,pbarv,w flux de masse en u ,v ,w
21  ! pdt pas de temps
22  !
23  ! teta temperature potentielle, p pression aux interfaces,
24  ! pk exner au milieu des couches necessaire pour calculer Qsat
25  !   --------------------------------------------------------------------
26  USE parallel_lmdz
27  USE mod_hallo
28  USE Write_Field_loc
29  USE VAMPIR
30  ! ! CRisi: on rajoute variables utiles d'infotrac
31  USE infotrac, ONLY : nqtot, tracers, isoCheck
32  USE vlspltgen_mod
33  USE comconst_mod, ONLY: cpp
34  USE logic_mod, ONLY: adv_qsat_liq
35  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
36USE paramet_mod_h
37IMPLICIT NONE
38
39  !
40
41
42
43  !
44  !   Arguments:
45  !   ----------
46  REAL :: masse(ijb_u:ije_u,llm),pente_max
47  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
48  REAL :: q(ijb_u:ije_u,llm,nqtot)
49  REAL :: w(ijb_u:ije_u,llm),pdt
50  REAL :: p(ijb_u:ije_u,llmp1),teta(ijb_u:ije_u,llm)
51  REAL :: pk(ijb_u:ije_u,llm)
52  !
53  !  Local
54  !   ---------
55  !
56  INTEGER :: ij,l
57  !
58  REAL :: zzpbar, zzw
59
60  REAL :: qmin,qmax
61  DATA qmin,qmax/0.,1.e33/
62
63  !--pour rapport de melange saturant--
64
65  REAL :: rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
66  REAL :: ptarg,pdelarg,foeew,zdelta
67  REAL :: tempe(ijb_u:ije_u)
68  INTEGER :: ijb,ije,iq,iq2,ifils
69  LOGICAL, SAVE :: firstcall=.TRUE.
70!$OMP THREADPRIVATE(firstcall)
71  type(request),SAVE :: MyRequest1
72!$OMP THREADPRIVATE(MyRequest1)
73  type(request),SAVE :: MyRequest2
74!$OMP THREADPRIVATE(MyRequest2)
75  !    fonction psat(T)
76
77   FOEEW ( PTARG,PDELARG ) = EXP ( &
78         (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) &
79         / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
80
81    r2es  = 380.11733
82    r3les = 17.269
83    r3ies = 21.875
84    r4les = 35.86
85    r4ies = 7.66
86    retv = 0.6077667
87    rtt  = 273.16
88
89  ! Allocate variables depending on dynamic variable nqtot
90
91     IF (firstcall) THEN
92        firstcall=.FALSE.
93     END IF
94  !-- Calcul de Qsat en chaque point
95  !-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
96  !   pour eviter une exponentielle.
97
98  call SetTag(MyRequest1,100)
99  call SetTag(MyRequest2,101)
100
101
102    ijb=ij_begin-iip1
103    ije=ij_end+iip1
104    if (pole_nord) ijb=ij_begin
105    if (pole_sud) ije=ij_end
106
107!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
108    DO l = 1, llm
109     DO ij = ijb, ije
110      tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
111     ENDDO
112     DO ij = ijb, ije
113      IF (adv_qsat_liq) THEN
114         zdelta = 0.
115      ELSE
116         zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
117      ENDIF
118      play   = 0.5*(p(ij,l)+p(ij,l+1))
119      qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
120      qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
121     ENDDO
122    ENDDO
123!$OMP END DO NOWAIT
124   ! PRINT*,'Debut vlsplt version debug sans vlyqs'
125
126    zzpbar = 0.5 * pdt
127    zzw    = pdt
128
129  ijb=ij_begin
130  ije=ij_end
131  if (pole_nord) ijb=ijb+iip1
132  if (pole_sud)  ije=ije-iip1
133
134!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
135  DO l=1,llm
136    DO ij = ijb,ije
137        mu(ij,l)=pbaru(ij,l) * zzpbar
138     ENDDO
139  ENDDO
140!$OMP END DO NOWAIT
141
142  ijb=ij_begin-iip1
143  ije=ij_end
144  if (pole_nord) ijb=ij_begin
145  if (pole_sud)  ije=ij_end-iip1
146
147!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
148  DO l=1,llm
149     DO ij=ijb,ije
150        mv(ij,l)=pbarv(ij,l) * zzpbar
151     ENDDO
152  ENDDO
153!$OMP END DO NOWAIT
154
155  ijb=ij_begin
156  ije=ij_end
157
158  DO iq=1,nqtot
159!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
160  DO l=1,llm
161     DO ij=ijb,ije
162        mw(ij,l,iq)=w(ij,l) * zzw
163     ENDDO
164  ENDDO
165!$OMP END DO NOWAIT
166  ENDDO
167
168  DO iq=1,nqtot
169!$OMP MASTER
170  DO ij=ijb,ije
171     mw(ij,llm+1,iq)=0.
172  ENDDO
173!$OMP END MASTER
174  ENDDO
175
176   ! CALL SCOPY(ijp1llm,q,1,zq,1)
177   ! CALL SCOPY(ijp1llm,masse,1,zm,1)
178
179   ijb=ij_begin
180   ije=ij_end
181
182  DO iq=1,nqtot
183!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
184    DO l=1,llm
185      zq(ijb:ije,l,iq)=q(ijb:ije,l,iq)
186      zm(ijb:ije,l,iq)=masse(ijb:ije,l)
187    ENDDO
188!$OMP END DO NOWAIT
189  ENDDO
190
191  ! ! verif temporaire
192  ijb=ij_begin
193  ije=ij_end
194  call check_isotopes(zq,ijb,ije,'vlspltgen_loc 191')
195
196!$OMP BARRIER
197  DO iq=1,nqtot
198    ! ! CRisi: on ne boucle que sur les pères= ceux qui sont transportés directement par l'air
199    IF(tracers(iq)%parent /= 'air') CYCLE
200    ! !write(*,*) 'vlspltgen 192: iq,iadv=',iq,tracers(iq)%iadv
201    SELECT CASE(tracers(iq)%iadv)
202      CASE(0); CYCLE
203      CASE(10)
204#ifdef _ADV_HALO
205  ! CRisi: on ajoute les nombres de fils et tableaux des fils
206  ! On suppose qu'on ne peut advecter les fils que par le schéma 10.
207      call vlx_loc(zq,pente_max,zm,mu, &
208            ij_begin,ij_begin+2*iip1-1,iq)
209      call vlx_loc(zq,pente_max,zm,mu, &
210            ij_end-2*iip1+1,ij_end,iq)
211#else
212      call vlx_loc(zq,pente_max,zm,mu, &
213            ij_begin,ij_end,iq)
214#endif
215
216!$OMP MASTER
217      call VTb(VTHallo)
218!$OMP END MASTER
219      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
220      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
221  ! CRisi
222      do ifils=1,tracers(iq)%nqDescen
223        iq2=tracers(iq)%iqDescen(ifils)
224        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
225        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
226      enddo
227
228!$OMP MASTER
229      call VTe(VTHallo)
230!$OMP END MASTER
231      CASE(14)
232#ifdef _ADV_HALO
233      call vlxqs_loc(zq,pente_max,zm,mu, &
234            qsat,ij_begin,ij_begin+2*iip1-1,iq)
235      call vlxqs_loc(zq,pente_max,zm,mu, &
236            qsat,ij_end-2*iip1+1,ij_end,iq)
237#else
238      call vlxqs_loc(zq,pente_max,zm,mu, &
239            qsat,ij_begin,ij_end,iq)
240#endif
241
242!$OMP MASTER
243      call VTb(VTHallo)
244!$OMP END MASTER
245
246      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
247      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
248      do ifils=1,tracers(iq)%nqDescen
249        iq2=tracers(iq)%iqDescen(ifils)
250        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
251        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
252      enddo
253
254!$OMP MASTER
255      call VTe(VTHallo)
256!$OMP END MASTER
257      CASE DEFAULT
258         CALL abort_gcm("vlspltgen_loc","schema non parallelise",1)
259    END SELECT
260
261  enddo !DO iq=1,nqtot
262
263
264!$OMP BARRIER
265!$OMP MASTER
266  call VTb(VTHallo)
267!$OMP END MASTER
268
269  call SendRequest(MyRequest1)
270
271!$OMP MASTER
272  call VTe(VTHallo)
273!$OMP END MASTER
274!$OMP BARRIER
275
276  ! ! verif temporaire
277  ijb=ij_begin-2*iip1
278  ije=ij_end+2*iip1
279  if (pole_nord) ijb=ij_begin
280  if (pole_sud)  ije=ij_end
281  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 280')
282
283  do iq=1,nqtot
284    IF(tracers(iq)%parent /= 'air') CYCLE
285    ! !write(*,*) 'vlspltgen 279: iq=',iq
286
287    SELECT CASE(tracers(iq)%iadv)
288      CASE(0); CYCLE
289      CASE(10)
290#ifdef _ADV_HALLO
291      call vlx_loc(zq,pente_max,zm,mu, &
292            ij_begin+2*iip1,ij_end-2*iip1,iq)
293#endif
294      CASE(14)
295#ifdef _ADV_HALLO
296      call vlxqs_loc(zq,pente_max,zm,mu, &
297            qsat,ij_begin+2*iip1,ij_end-2*iip1,iq)
298#endif
299      CASE DEFAULT
300      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
301    END SELECT
302
303  enddo
304!$OMP BARRIER
305!$OMP MASTER
306  call VTb(VTHallo)
307!$OMP END MASTER
308
309   ! call WaitRecvRequest(MyRequest1)
310   ! call WaitSendRequest(MyRequest1)
311!$OMP BARRIER
312   call WaitRequest(MyRequest1)
313
314
315!$OMP MASTER
316  call VTe(VTHallo)
317!$OMP END MASTER
318!$OMP BARRIER
319
320
321  IF(isoCheck) THEN
322       call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326')
323       ijb=ij_begin-2*iip1
324       ije=ij_end+2*iip1
325       if (pole_nord) ijb=ij_begin
326       if (pole_sud)  ije=ij_end
327       call check_isotopes(zq,ijb,ije,'vlspltgen_loc 336')
328  END IF
329
330  do iq = 1, nqtot
331   IF(tracers(iq)%parent /= 'air') CYCLE
332   ! !write(*,*) 'vlspltgen 321: iq=',iq
333
334    SELECT CASE(tracers(iq)%iadv)
335      CASE(0); CYCLE
336      CASE(10); call   vly_loc(zq,pente_max,zm,mv,     iq)
337      CASE(14); call vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
338      CASE DEFAULT
339      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
340    END SELECT
341
342   enddo
343
344  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357')
345
346  do iq = 1, nqtot
347   IF(tracers(iq)%parent /= 'air') CYCLE
348  ! !write(*,*) 'vlspltgen 349: iq=',iq
349    SELECT CASE(tracers(iq)%iadv)
350      CASE(0); CYCLE
351      CASE(10,14)
352!$OMP BARRIER
353#ifdef _ADV_HALLO
354      call vlz_loc(zq,pente_max,zm,mw, &
355            ij_begin,ij_begin+2*iip1-1,iq)
356      call vlz_loc(zq,pente_max,zm,mw, &
357            ij_end-2*iip1+1,ij_end,iq)
358#else
359      call vlz_loc(zq,pente_max,zm,mw, &
360            ij_begin,ij_end,iq)
361#endif
362!$OMP BARRIER
363
364!$OMP MASTER
365      call VTb(VTHallo)
366!$OMP END MASTER
367
368      call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
369      call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
370      ! ! CRisi
371      do ifils=1,tracers(iq)%nqDescen
372        iq2=tracers(iq)%iqDescen(ifils)
373        call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest2)
374        call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest2)
375      enddo
376!$OMP MASTER
377      call VTe(VTHallo)
378!$OMP END MASTER
379!$OMP BARRIER
380      CASE DEFAULT
381
382        CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
383     END SELECT
384
385  enddo
386!$OMP BARRIER
387
388!$OMP MASTER
389  call VTb(VTHallo)
390!$OMP END MASTER
391
392  call SendRequest(MyRequest2)
393
394!$OMP MASTER
395  call VTe(VTHallo)
396!$OMP END MASTER
397
398
399  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
400
401!$OMP BARRIER
402  do iq=1,nqtot
403    IF(tracers(iq)%parent /= 'air') CYCLE
404  ! !write(*,*) 'vlspltgen 409: iq=',iq
405
406    SELECT CASE(tracers(iq)%iadv)
407      CASE(0); CYCLE
408      CASE(10,14)
409!$OMP BARRIER
410
411#ifdef _ADV_HALLO
412      call vlz_loc(zq,pente_max,zm,mw, &
413            ij_begin+2*iip1,ij_end-2*iip1,iq)
414#endif
415
416!$OMP BARRIER
417      CASE DEFAULT
418      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
419    END SELECT
420
421  enddo
422  ! !write(*,*) 'vlspltgen_loc 476'
423
424!$OMP BARRIER
425  ! !write(*,*) 'vlspltgen_loc 477'
426!$OMP MASTER
427  call VTb(VTHallo)
428!$OMP END MASTER
429
430   ! call WaitRecvRequest(MyRequest2)
431   ! call WaitSendRequest(MyRequest2)
432!$OMP BARRIER
433   CALL WaitRequest(MyRequest2)
434
435!$OMP MASTER
436  call VTe(VTHallo)
437!$OMP END MASTER
438!$OMP BARRIER
439
440
441  ! !write(*,*) 'vlspltgen_loc 494'
442  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461')
443
444  do iq=1,nqtot
445    IF(tracers(iq)%parent /= 'air') CYCLE
446  ! !write(*,*) 'vlspltgen 449: iq=',iq
447    SELECT CASE(tracers(iq)%iadv)
448      CASE(0); CYCLE
449      CASE(10); call   vly_loc(zq,pente_max,zm,mv,     iq)
450      CASE(14); call vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
451      CASE DEFAULT
452         CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
453    END SELECT
454
455   enddo !do iq=1,nqtot
456
457  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493')
458
459  do iq=1,nqtot
460    IF(tracers(iq)%parent /= 'air') CYCLE
461  ! !write(*,*) 'vlspltgen 477: iq=',iq
462    SELECT CASE(tracers(iq)%iadv)
463      CASE(0); CYCLE
464      CASE(10); call   vlx_loc(zq,pente_max,zm,mu, &
465            ij_begin,ij_end,iq)
466      CASE(14); call vlxqs_loc(zq,pente_max,zm,mu, &
467            qsat, ij_begin,ij_end,iq)
468      CASE DEFAULT
469      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
470    END SELECT
471
472   enddo !do iq=1,nqtot
473
474  ! !write(*,*) 'vlspltgen 550: apres derniere serie de call vlx'
475  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521')
476
477  ijb=ij_begin
478  ije=ij_end
479  ! !write(*,*) 'vlspltgen_loc 557'
480!$OMP BARRIER
481
482  ! !write(*,*) 'vlspltgen_loc 559'
483  DO iq=1,nqtot
484   ! !write(*,*) 'vlspltgen_loc 561, iq=',iq
485!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
486    DO l=1,llm
487       DO ij=ijb,ije
488          ! print *,'zq-->',ij,l,iq,zq(ij,l,iq)
489          ! print *,'q-->',ij,l,iq,q(ij,l,iq)
490         q(ij,l,iq)=zq(ij,l,iq)
491       ENDDO
492    ENDDO
493!$OMP END DO NOWAIT
494  ! !write(*,*) 'vlspltgen_loc 575'
495
496!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
497    DO l=1,llm
498       DO ij=ijb,ije-iip1+1,iip1
499          q(ij+iim,l,iq)=q(ij,l,iq)
500       ENDDO
501    ENDDO
502!$OMP END DO NOWAIT
503  ! !write(*,*) 'vlspltgen_loc 583'
504  ENDDO !DO iq=1,nqtot
505
506  call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
507
508!$OMP BARRIER
509
510  !c$OMP MASTER
511   ! call WaitSendRequest(MyRequest1)
512   ! call WaitSendRequest(MyRequest2)
513  !c$OMP END MASTER
514  !c$OMP BARRIER
515
516  ! !write(*,*) 'vlspltgen 597: sortie'
517  RETURN
518END SUBROUTINE vlspltgen_loc
Note: See TracBrowser for help on using the repository browser.