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

Last change on this file since 5300 was 5285, checked in by abarral, 4 days ago

As discussed internally, remove generic ONLY: ... for new _mod_h modules

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