source: LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.f90 @ 5282

Last change on this file since 5282 was 5282, checked in by abarral, 6 hours ago

Turn iniprint.h clesphys.h into modules
Remove unused description.h

  • 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.5 KB
Line 
1!#define DEBUG_IO
2MODULE call_calfis_mod
3
4    REAL,POINTER,SAVE :: ucov(:,:)
5    REAL,POINTER,SAVE :: vcov(:,:)
6    REAL,POINTER,SAVE :: teta(:,:)
7    REAL,POINTER,SAVE :: masse(:,:)
8    REAL,POINTER,SAVE :: ps(:)
9    REAL,POINTER,SAVE :: phis(:)
10    REAL,POINTER,SAVE :: q(:,:,:)
11    REAL,POINTER,SAVE :: flxw(:,:)
12
13    REAL,POINTER,SAVE :: p(:,:)
14    REAL,POINTER,SAVE :: pks(:)
15    REAL,POINTER,SAVE :: pk(:,:)
16    REAL,POINTER,SAVE :: pkf(:,:)
17    REAL,POINTER,SAVE :: phi(:,:)
18    REAL,POINTER,SAVE :: du(:,:)
19    REAL,POINTER,SAVE :: dv(:,:)
20    REAL,POINTER,SAVE :: dteta(:,:)
21    REAL,POINTER,SAVE :: dq(:,:,:)
22    REAL,POINTER,SAVE :: dufi(:,:)
23    REAL,POINTER,SAVE :: dvfi(:,:)
24    REAL,POINTER,SAVE :: dtetafi(:,:)
25    REAL,POINTER,SAVE :: dqfi(:,:,:)
26    REAL,POINTER,SAVE :: dpfi(:)
27   
28   
29   
30   
31   
32CONTAINS
33
34  SUBROUTINE call_calfis_allocate
35  USE bands
36  USE allocate_field_mod
37  USE parallel_lmdz
38  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
39  USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
40          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
41  USE infotrac, ONLY: nqtot
42  IMPLICIT NONE
43    TYPE(distrib),POINTER :: d
44    d=>distrib_physic
45
46    CALL allocate_u(ucov,llm,d)
47    CALL allocate_v(vcov,llm,d)
48    CALL allocate_u(teta,llm,d)
49    CALL allocate_u(masse,llm,d)
50    CALL allocate_u(ps,d)
51    CALL allocate_u(phis,d)
52    CALL allocate_u(q,llm,nqtot,d)
53    CALL allocate_u(flxw,llm,d)
54    CALL allocate_u(p,llmp1,d)
55    CALL allocate_u(pks,d)
56    pks(:)=0
57    CALL allocate_u(pk,llm,d)
58    pk(:,:)=0
59    CALL allocate_u(pkf,llm,d)
60    CALL allocate_u(phi,llm,d)
61    CALL allocate_u(du,llm,d)
62    CALL allocate_v(dv,llm,d)
63    CALL allocate_u(dteta,llm,d)
64    CALL allocate_u(dq,llm,nqtot,d)
65    CALL allocate_u(dufi,llm,d)
66    CALL allocate_v(dvfi,llm,d)
67    CALL allocate_u(dtetafi,llm,d)
68    CALL allocate_u(dqfi,llm,nqtot,d)
69    CALL allocate_u(dpfi,d)
70
71  END SUBROUTINE call_calfis_allocate
72
73
74  SUBROUTINE call_calfis(itau,lafin,ucov_dyn,vcov_dyn,teta_dyn,masse_dyn,ps_dyn, &
75                         phis_dyn,q_dyn,flxw_dyn)
76  USE dimensions_mod, ONLY: iim, jjm, llm, ndm
77  USE paramet_mod_h, ONLY: iip1, iip2, iip3, jjp1, llmp1, llmp2, llmm1, kftd, ip1jm, ip1jmp1, &
78          ip1jmi1, ijp1llm, ijmllm, mvar, jcfil, jcfllm
79  USE exner_hyb_loc_m, only: exner_hyb_loc
80  use exner_milieu_loc_m, only: exner_milieu_loc
81  USE parallel_lmdz
82  USE times
83  USE mod_hallo
84  USE Bands
85  USE vampir
86  USE infotrac, ONLY: nqtot
87  USE control_mod
88  USE write_field_loc
89  USE write_field
90  USE comconst_mod, ONLY: dtphys
91  USE logic_mod, ONLY: leapf, forward, ok_strato
92  USE comvert_mod, ONLY: ap, bp, pressure_exner
93  USE temps_mod, ONLY: day_ini, day_ref, jd_ref, jh_ref, start_time
94  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS, CPPKEY_DEBUGIO
95  USE strings_mod, ONLY: int2str
96  USE iniprint_mod_h
97  IMPLICIT NONE
98
99    INTEGER,INTENT(IN) :: itau ! (time) iteration step number
100    LOGICAL,INTENT(IN) :: lafin ! .true. if final time step
101    REAL,INTENT(INOUT) :: ucov_dyn(ijb_u:ije_u,llm) ! covariant zonal wind
102    REAL,INTENT(INOUT) :: vcov_dyn(ijb_v:ije_v,llm) ! covariant meridional wind
103    REAL,INTENT(INOUT) :: teta_dyn(ijb_u:ije_u,llm) ! potential temperature
104    REAL,INTENT(INOUT) :: masse_dyn(ijb_u:ije_u,llm) ! air mass
105    REAL,INTENT(INOUT) :: ps_dyn(ijb_u:ije_u) ! surface pressure
106    REAL,INTENT(INOUT) :: phis_dyn(ijb_u:ije_u) ! surface geopotential
107    REAL,INTENT(INOUT) :: q_dyn(ijb_u:ije_u,llm,nqtot) ! advected tracers
108    REAL,INTENT(INOUT) :: flxw_dyn(ijb_u:ije_u,llm) ! vertical mass flux
109
110    REAL :: dufi_tmp(iip1,llm)   
111    REAL :: dvfi_tmp(iip1,llm) 
112    REAL :: dtetafi_tmp(iip1,llm)
113    REAL :: dpfi_tmp(iip1)
114    REAL :: dqfi_tmp(iip1,llm,nqtot)
115
116    REAL :: jD_cur, jH_cur
117    CHARACTER(LEN=15) :: ztit
118    TYPE(Request),SAVE :: Request_physic
119!$OMP THREADPRIVATE(Request_physic )
120    INTEGER :: ijb,ije,l,iq
121   
122   
123IF (CPPKEY_DEBUGIO) THEN
124    CALL WriteField_u('ucovfi',ucov)
125    CALL WriteField_v('vcovfi',vcov)
126    CALL WriteField_u('tetafi',teta)
127    CALL WriteField_u('pfi',p)
128    CALL WriteField_u('pkfi',pk)
129    DO iq=1,nqtot
130      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
131    ENDDO
132END IF
133
134!
135!     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
136!
137
138
139  !$OMP MASTER
140    CALL suspend_timer(timer_caldyn)
141    IF (prt_level >= 10) THEN
142      WRITE(lunout,*) 'leapfrog_p: Entree dans la physique : Iteration No ',itau
143    ENDIF
144  !$OMP END MASTER
145   
146           jD_cur = jD_ref + day_ini - day_ref                           &
147     &        + (itau+1)/day_step
148
149           IF (planet_type .eq."generic") THEN
150              ! AS: we make jD_cur to be pday
151              jD_cur = int(day_ini + itau/day_step)
152           ENDIF
153
154           jH_cur = jH_ref + start_time +                                &
155     &              mod(itau+1,day_step)/float(day_step)
156    if (jH_cur > 1.0 ) then
157      jD_cur = jD_cur +1.
158      jH_cur = jH_cur -1.
159    endif
160
161!   Inbterface avec les routines de phylmd (phymars ... )
162!   -----------------------------------------------------
163
164!+jld
165
166!  Diagnostique de conservation de l'energie : initialisation
167 
168!-jld
169  !$OMP BARRIER
170  !$OMP MASTER
171    CALL VTb(VThallo)
172  !$OMP END MASTER
173
174IF (CPPKEY_DEBUGIO) THEN
175    CALL WriteField_u('ucovfi',ucov)
176    CALL WriteField_v('vcovfi',vcov)
177    CALL WriteField_u('tetafi',teta)
178    CALL WriteField_u('pfi',p)
179    CALL WriteField_u('pkfi',pk)
180END IF
181   
182    CALL SetTag(Request_physic,800)
183    CALL Register_SwapField_u(ucov_dyn,ucov,distrib_physic,Request_physic,up=2,down=2)
184    CALL Register_SwapField_v(vcov_dyn,vcov,distrib_physic,Request_physic,up=2,down=2)
185    CALL Register_SwapField_u(teta_dyn,teta,distrib_physic,Request_physic,up=2,down=2)
186    CALL Register_SwapField_u(masse_dyn,masse,distrib_physic,Request_physic,up=1,down=2)
187    CALL Register_SwapField_u(ps_dyn,ps,distrib_physic,Request_physic,up=2,down=2)
188    CALL Register_SwapField_u(phis_dyn,phis,distrib_physic,Request_physic,up=2,down=2)
189    CALL Register_SwapField_u(q_dyn,q,distrib_physic,Request_physic,up=2,down=2)
190    CALL Register_SwapField_u(flxw_dyn,flxw,distrib_physic,Request_physic,up=2,down=2)
191 
192    CALL SendRequest(Request_Physic)
193  !$OMP BARRIER
194    CALL WaitRequest(Request_Physic)       
195
196  !$OMP BARRIER
197  !$OMP MASTER
198    CALL Set_Distrib(distrib_Physic)
199    CALL VTe(VThallo)
200       
201    CALL VTb(VTphysiq)
202  !$OMP END MASTER
203  !$OMP BARRIER
204
205    CALL pression_loc (  ip1jmp1, ap, bp, ps,  p      )
206
207  !$OMP BARRIER
208    CALL exner_hyb_loc(  ip1jmp1, ps, p, pks, pk, pkf )
209  !$OMP BARRIER
210    CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
211
212
213    CALL Register_Hallo_u(p,llmp1,2,2,2,2,Request_physic)
214    CALL Register_Hallo_u(pk,llm,2,2,2,2,Request_physic)
215    CALL Register_Hallo_u(phi,llm,2,2,2,2,Request_physic)
216       
217    CALL SendRequest(Request_Physic)
218  !$OMP BARRIER
219    CALL WaitRequest(Request_Physic)
220             
221  !$OMP BARRIER
222 
223 
224IF (CPPKEY_DEBUGIO) THEN
225    CALL WriteField_u('ucovfi',ucov)
226    CALL WriteField_v('vcovfi',vcov)
227    CALL WriteField_u('tetafi',teta)
228    CALL WriteField_u('pfi',p)
229    CALL WriteField_u('pkfi',pk)
230    DO iq=1,nqtot
231      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
232    ENDDO
233END IF
234
235  !$OMP BARRIER
236
237IF (CPPKEY_PHYS) THEN
238    CALL calfis_loc(lafin ,jD_cur, jH_cur,                       &
239                     ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,   &
240                     du,dv,dteta,dq,                             &
241                     flxw, dufi,dvfi,dtetafi,dqfi,dpfi  )
242END IF
243    ijb=ij_begin
244    ije=ij_end 
245    IF ( .not. pole_nord) THEN
246 
247    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
248      DO l=1,llm
249        dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l)
250        dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l) 
251        dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l) 
252        dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:) 
253      ENDDO
254    !$OMP END DO NOWAIT
255
256    !$OMP MASTER
257      dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim) 
258    !$OMP END MASTER
259   
260    ENDIF ! of if ( .not. pole_nord)
261
262  !$OMP BARRIER
263  !$OMP MASTER
264    CALL Set_Distrib(distrib_Physic_bis)
265    CALL VTb(VThallo)
266  !$OMP END MASTER
267  !$OMP BARRIER
268 
269    CALL Register_Hallo_u(dufi,llm,1,0,0,1,Request_physic)
270    CALL Register_Hallo_v(dvfi,llm,1,0,0,1,Request_physic)
271    CALL Register_Hallo_u(dtetafi,llm,1,0,0,1,Request_physic)
272    CALL Register_Hallo_u(dpfi,1,1,0,0,1,Request_physic)
273
274    DO iq=1,nqtot
275      CALL Register_Hallo_u(dqfi(:,:,iq),llm,1,0,0,1,Request_physic)
276    ENDDO
277       
278    CALL SendRequest(Request_Physic)
279  !$OMP BARRIER
280    CALL WaitRequest(Request_Physic)
281             
282  !$OMP BARRIER
283  !$OMP MASTER
284    CALL VTe(VThallo)
285    CALL Set_Distrib(distrib_Physic)
286  !$OMP END MASTER
287  !$OMP BARRIER       
288    ijb=ij_begin
289    IF (.not. pole_nord) THEN
290       
291    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
292      DO l=1,llm
293        dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
294        dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l)
295        dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)+dtetafi_tmp(1:iip1,l)
296        dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:) + dqfi_tmp(1:iip1,l,:)
297      ENDDO
298    !$OMP END DO NOWAIT
299
300    !$OMP MASTER
301      dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
302    !$OMP END MASTER
303         
304    endif ! of if (.not. pole_nord)
305       
306       
307IF (CPPKEY_DEBUGIO) THEN
308    CALL WriteField_u('dufi',dufi)
309    CALL WriteField_v('dvfi',dvfi)
310    CALL WriteField_u('dtetafi',dtetafi)
311    CALL WriteField_u('dpfi',dpfi)
312    DO iq=1,nqtot
313      CALL WriteField_u('dqfi'//trim(int2str(iq)),dqfi(:,:,iq))
314    ENDDO
315END IF
316
317  !$OMP BARRIER
318
319!      ajout des tendances physiques:
320!      ------------------------------
321IF (CPPKEY_DEBUGIO) THEN
322    CALL WriteField_u('ucovfi',ucov)
323    CALL WriteField_v('vcovfi',vcov)
324    CALL WriteField_u('tetafi',teta)
325    CALL WriteField_u('psfi',ps)
326    DO iq=1,nqtot
327      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
328    ENDDO
329END IF
330
331IF (CPPKEY_DEBUGIO) THEN
332    CALL WriteField_u('ucovfi',ucov)
333    CALL WriteField_v('vcovfi',vcov)
334    CALL WriteField_u('tetafi',teta)
335    CALL WriteField_u('psfi',ps)
336    DO iq=1,nqtot
337      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
338    ENDDO
339END IF
340
341    CALL addfi_loc( dtphys, leapf, forward   ,              &
342                    ucov, vcov, teta , q   ,ps ,            &
343                    dufi, dvfi, dtetafi , dqfi ,dpfi  )
344    ! since addfi updates ps(), also update p(), masse() and pk()
345    CALL pression_loc(ip1jmp1,ap,bp,ps,p)
346!$OMP BARRIER
347    CALL massdair_loc(p,masse)
348!$OMP BARRIER
349    if (pressure_exner) then
350      CALL exner_hyb_loc(ijnb_u,ps,p,pks,pk,pkf)
351    else
352      CALL exner_milieu_loc(ijnb_u,ps,p,pks,pk,pkf)
353    endif
354!$OMP BARRIER
355
356IF (CPPKEY_DEBUGIO) THEN
357    CALL WriteField_u('ucovfi',ucov)
358    CALL WriteField_v('vcovfi',vcov)
359    CALL WriteField_u('tetafi',teta)
360    CALL WriteField_u('psfi',ps)
361    DO iq=1,nqtot
362      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
363    ENDDO
364END IF
365
366    IF (ok_strato) THEN
367!      CALL top_bound_loc( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
368      CALL top_bound_loc(vcov,ucov,teta,masse,dtphys)
369    ENDIF
370
371  !$OMP BARRIER
372  !$OMP MASTER
373    CALL VTe(VTphysiq)
374    CALL VTb(VThallo)
375  !$OMP END MASTER
376
377    CALL SetTag(Request_physic,800)
378    CALL Register_SwapField_u(ucov,ucov_dyn,distrib_caldyn,Request_physic)
379    CALL Register_SwapField_v(vcov,vcov_dyn,distrib_caldyn,Request_physic)
380    CALL Register_SwapField_u(teta,teta_dyn,distrib_caldyn,Request_physic)
381    CALL Register_SwapField_u(masse,masse_dyn,distrib_caldyn,Request_physic)
382    CALL Register_SwapField_u(ps,ps_dyn,distrib_caldyn,Request_physic)
383    CALL Register_SwapField_u(q,q_dyn,distrib_caldyn,Request_physic)
384    CALL SendRequest(Request_Physic)
385  !$OMP BARRIER
386    CALL WaitRequest(Request_Physic)     
387
388  !$OMP BARRIER
389  !$OMP MASTER
390    CALL VTe(VThallo)
391    CALL set_distrib(distrib_caldyn)
392  !$OMP END MASTER
393  !$OMP BARRIER
394
395!
396!  Diagnostique de conservation de l'energie : difference
397    IF (ip_ebil_dyn.ge.1 ) THEN
398      ztit='bil phys'
399!      CALL diagedyn(ztit,2,1,1,dtphys,ucov, vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
400      write(lunout,*)"call_calfis: diagedyn disabled in dyn3dmem !!"
401    ENDIF
402
403IF (CPPKEY_DEBUGIO) THEN
404    CALL WriteField_u('ucovfi',ucov_dyn)
405    CALL WriteField_v('vcovfi',vcov_dyn)
406    CALL WriteField_u('tetafi',teta_dyn)
407    CALL WriteField_u('psfi',ps_dyn)
408    DO iq=1,nqtot
409      CALL WriteField_u('qfi'//trim(int2str(iq)),q_dyn(:,:,iq))
410    ENDDO
411END IF
412
413
414!-jld
415    !$OMP MASTER
416      CALL resume_timer(timer_caldyn)
417    !$OMP END MASTER
418
419  END SUBROUTINE call_calfis
420 
421END MODULE call_calfis_mod
Note: See TracBrowser for help on using the repository browser.