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

Last change on this file since 5423 was 5324, checked in by abarral, 6 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
RevLine 
[4469]1
[5246]2!
[1632]3! $Header$
4!
[5246]5 SUBROUTINE vlspltgen_loc( q,pente_max,masse,w,pbaru,pbarv, &
6         pdt, p,pk,teta                 )
[1632]7
[5246]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
[5271]35  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
[5285]36USE paramet_mod_h
[5271]37IMPLICIT NONE
[1632]38
[5246]39  !
[5271]40
[1632]41
[5272]42
[5246]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
[1632]59
[5246]60  REAL :: qmin,qmax
61  DATA qmin,qmax/0.,1.e33/
[1632]62
[5246]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.
[1632]70!$OMP THREADPRIVATE(firstcall)
[5246]71  type(request),SAVE :: MyRequest1
[1848]72!$OMP THREADPRIVATE(MyRequest1)
[5246]73  type(request),SAVE :: MyRequest2
[1848]74!$OMP THREADPRIVATE(MyRequest2)
[5246]75  !    fonction psat(T)
[1632]76
[5246]77   FOEEW ( PTARG,PDELARG ) = EXP ( &
78         (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) &
79         / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
[1632]80
[5246]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
[1632]88
[5246]89  ! Allocate variables depending on dynamic variable nqtot
[1632]90
[5246]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.
[1632]97
[5246]98  call SetTag(MyRequest1,100)
99  call SetTag(MyRequest2,101)
[1632]100
101
[5246]102    ijb=ij_begin-iip1
103    ije=ij_end+iip1
104    if (pole_nord) ijb=ij_begin
105    if (pole_sud) ije=ij_end
[1632]106
[5246]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'
[1632]125
[5246]126    zzpbar = 0.5 * pdt
127    zzw    = pdt
[1632]128
[5246]129  ijb=ij_begin
130  ije=ij_end
131  if (pole_nord) ijb=ijb+iip1
132  if (pole_sud)  ije=ije-iip1
[1632]133
[5246]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
[1632]141
[5246]142  ijb=ij_begin-iip1
143  ije=ij_end
144  if (pole_nord) ijb=ij_begin
145  if (pole_sud)  ije=ij_end-iip1
[1632]146
[5246]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
[1632]154
[5246]155  ijb=ij_begin
156  ije=ij_end
[1632]157
[5246]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
[1632]167
[5246]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
[1632]175
[5246]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')
[2270]195
[5246]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)
[1632]211#else
[5246]212      call vlx_loc(zq,pente_max,zm,mu, &
213            ij_begin,ij_end,iq)
[1632]214#endif
215
[5246]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
[1632]227
[5246]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)
[1632]237#else
[5246]238      call vlxqs_loc(zq,pente_max,zm,mu, &
239            qsat,ij_begin,ij_end,iq)
[1632]240#endif
241
[5246]242!$OMP MASTER
[1632]243      call VTb(VTHallo)
[5246]244!$OMP END MASTER
[1632]245
[5246]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
[1632]253
[5246]254!$OMP MASTER
[1632]255      call VTe(VTHallo)
[5246]256!$OMP END MASTER
257      CASE DEFAULT
258         CALL abort_gcm("vlspltgen_loc","schema non parallelise",1)
259    END SELECT
[1632]260
[5246]261  enddo !DO iq=1,nqtot
[2270]262
263
[5246]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)
[1632]290#ifdef _ADV_HALLO
[5246]291      call vlx_loc(zq,pente_max,zm,mu, &
292            ij_begin+2*iip1,ij_end-2*iip1,iq)
293#endif
294      CASE(14)
[1632]295#ifdef _ADV_HALLO
[5246]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
[1632]302
[5246]303  enddo
304!$OMP BARRIER
305!$OMP MASTER
306  call VTb(VTHallo)
307!$OMP END MASTER
[1632]308
[5246]309   ! call WaitRecvRequest(MyRequest1)
310   ! call WaitSendRequest(MyRequest1)
311!$OMP BARRIER
312   call WaitRequest(MyRequest1)
[1632]313
314
[5246]315!$OMP MASTER
316  call VTe(VTHallo)
317!$OMP END MASTER
318!$OMP BARRIER
[1632]319
[5246]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
[2270]333
[5246]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
[1632]341
[5246]342   enddo
[1632]343
[5246]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
[1632]353#ifdef _ADV_HALLO
[5246]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)
[1632]358#else
[5246]359      call vlz_loc(zq,pente_max,zm,mw, &
360            ij_begin,ij_end,iq)
[1632]361#endif
[5246]362!$OMP BARRIER
[1632]363
[5246]364!$OMP MASTER
365      call VTb(VTHallo)
366!$OMP END MASTER
[1632]367
[5246]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)
[1632]375      enddo
[5246]376!$OMP MASTER
377      call VTe(VTHallo)
378!$OMP END MASTER
379!$OMP BARRIER
380      CASE DEFAULT
[1632]381
[5246]382        CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
383     END SELECT
[1632]384
[5246]385  enddo
386!$OMP BARRIER
[1632]387
[5246]388!$OMP MASTER
389  call VTb(VTHallo)
390!$OMP END MASTER
[1632]391
[5246]392  call SendRequest(MyRequest2)
[2270]393
[5246]394!$OMP MASTER
395  call VTe(VTHallo)
396!$OMP END MASTER
[2270]397
[1632]398
[5246]399  call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
[1632]400
[5246]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
[1632]411#ifdef _ADV_HALLO
[5246]412      call vlz_loc(zq,pente_max,zm,mw, &
413            ij_begin+2*iip1,ij_end-2*iip1,iq)
[1632]414#endif
415
[5246]416!$OMP BARRIER
417      CASE DEFAULT
418      CALL abort_gcm("vlspltgen_p","schema non parallelise",1)
419    END SELECT
[1632]420
[5246]421  enddo
422  ! !write(*,*) 'vlspltgen_loc 476'
[1632]423
[5246]424!$OMP BARRIER
425  ! !write(*,*) 'vlspltgen_loc 477'
426!$OMP MASTER
427  call VTb(VTHallo)
428!$OMP END MASTER
[1632]429
[5246]430   ! call WaitRecvRequest(MyRequest2)
431   ! call WaitSendRequest(MyRequest2)
432!$OMP BARRIER
433   CALL WaitRequest(MyRequest2)
[1632]434
[5246]435!$OMP MASTER
436  call VTe(VTHallo)
437!$OMP END MASTER
438!$OMP BARRIER
[1632]439
[2270]440
[5246]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
[1632]454
[5246]455   enddo !do iq=1,nqtot
[1632]456
[5246]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
[1632]471
[5246]472   enddo !do iq=1,nqtot
[1632]473
[5246]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'
[1632]495
[5246]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
[1632]505
[5246]506  call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
[1632]507
[5246]508!$OMP BARRIER
[1632]509
[5246]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.