LMDZ
phystokenc_mod.F90
Go to the documentation of this file.
1 !
2 ! $Id: phystokenc_mod.F90 2343 2015-08-20 10:02:53Z emillour $
3 !
5 
6  IMPLICIT NONE
7 
8  LOGICAL,SAVE :: offline
9 !$OMP THREADPRIVATE(offline)
10  INTEGER,SAVE :: istphy
11 !$OMP THREADPRIVATE(istphy)
12 
13 
14 CONTAINS
15 
16  SUBROUTINE init_phystokenc(offline_dyn,istphy_dyn)
17  IMPLICIT NONE
18  LOGICAL,INTENT(IN) :: offline_dyn
19  INTEGER,INTENT(IN) :: istphy_dyn
20 
21  offline=offline_dyn
22  istphy=istphy_dyn
23 
24  END SUBROUTINE init_phystokenc
25 
26 SUBROUTINE phystokenc (nlon,nlev,pdtphys,rlon,rlat, &
27  pt,pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, &
28  pfm_therm,pentr_therm, &
29  cdragh, pcoefh,yu1,yv1,ftsol,pctsrf, &
30  frac_impa,frac_nucl, &
31  pphis,paire,dtime,itap, &
32  psh, pda, pphi, pmp, pupwd, pdnwd)
33 
34  USE ioipsl
35  USE dimphy
36  USE infotrac_phy, ONLY : nqtot
37  USE iophy
38  USE indice_sol_mod
39  USE print_control_mod, ONLY: lunout
41 
42  IMPLICIT NONE
43 
44 !======================================================================
45 ! Auteur(s) FH
46 ! Objet: Ecriture des variables pour transport offline
47 !
48 !======================================================================
49 
50 ! Arguments:
51 !
52  REAL,DIMENSION(klon,klev), INTENT(IN) :: psh ! humidite specifique
53  REAL,DIMENSION(klon,klev), INTENT(IN) :: pda
54  REAL,DIMENSION(klon,klev,klev), INTENT(IN):: pphi
55  REAL,DIMENSION(klon,klev), INTENT(IN) :: pmp
56  REAL,DIMENSION(klon,klev), INTENT(IN) :: pupwd ! saturated updraft mass flux
57  REAL,DIMENSION(klon,klev), INTENT(IN) :: pdnwd ! saturated downdraft mass flux
58 
59 ! EN ENTREE:
60 ! ==========
61 !
62 ! divers:
63 ! -------
64 !
65  INTEGER nlon ! nombre de points horizontaux
66  INTEGER nlev ! nombre de couches verticales
67  REAL pdtphys ! pas d'integration pour la physique (seconde)
68  INTEGER itap
69  INTEGER, SAVE :: physid
70 !$OMP THREADPRIVATE(physid)
71 
72 ! convection:
73 ! -----------
74 !
75  REAL pmfu(klon,klev) ! flux de masse dans le panache montant
76  REAL pmfd(klon,klev) ! flux de masse dans le panache descendant
77  REAL pen_u(klon,klev) ! flux entraine dans le panache montant
78  REAL pde_u(klon,klev) ! flux detraine dans le panache montant
79  REAL pen_d(klon,klev) ! flux entraine dans le panache descendant
80  REAL pde_d(klon,klev) ! flux detraine dans le panache descendant
81  REAL pt(klon,klev)
82  REAL,ALLOCATABLE,SAVE :: t(:,:)
83 !$OMP THREADPRIVATE(t)
84 !
85  REAL rlon(klon), rlat(klon), dtime
86  REAL zx_tmp_3d(nbp_lon,nbp_lat,klev),zx_tmp_2d(nbp_lon,nbp_lat)
87 
88 ! Couche limite:
89 ! --------------
90 !
91  REAL cdragh(klon) ! cdrag
92  REAL pcoefh(klon,klev) ! coeff melange CL
93  REAL pcoefh_buf(klon,klev) ! coeff melange CL + cdrag
94  REAL yv1(klon)
95  REAL yu1(klon),pphis(klon),paire(klon)
96 
97 ! Les Thermiques : (Abderr 25 11 02)
98 ! ---------------
99  REAL, INTENT(IN) :: pfm_therm(klon,klev+1)
100  REAL pentr_therm(klon,klev)
101 
102  REAL,ALLOCATABLE,SAVE :: entr_therm(:,:)
103  REAL,ALLOCATABLE,SAVE :: fm_therm(:,:)
104 !$OMP THREADPRIVATE(entr_therm)
105 !$OMP THREADPRIVATE(fm_therm)
106 !
107 ! Lessivage:
108 ! ----------
109 !
110  REAL frac_impa(klon,klev)
111  REAL frac_nucl(klon,klev)
112 !
113 ! Arguments necessaires pour les sources et puits de traceur
114 !
115  REAL ftsol(klon,nbsrf) ! Temperature du sol (surf)(Kelvin)
116  REAL pctsrf(klon,nbsrf) ! Pourcentage de sol f(nature du sol)
117 !======================================================================
118 !
119  INTEGER i, k, kk
120  REAL,ALLOCATABLE,SAVE :: mfu(:,:) ! flux de masse dans le panache montant
121  REAL,ALLOCATABLE,SAVE :: mfd(:,:) ! flux de masse dans le panache descendant
122  REAL,ALLOCATABLE,SAVE :: en_u(:,:) ! flux entraine dans le panache montant
123  REAL,ALLOCATABLE,SAVE :: de_u(:,:) ! flux detraine dans le panache montant
124  REAL,ALLOCATABLE,SAVE :: en_d(:,:) ! flux entraine dans le panache descendant
125  REAL,ALLOCATABLE,SAVE :: de_d(:,:) ! flux detraine dans le panache descendant
126  REAL,ALLOCATABLE,SAVE :: coefh(:,:) ! flux detraine dans le panache descendant
127 
128  REAL,ALLOCATABLE,SAVE :: pyu1(:)
129  REAL,ALLOCATABLE,SAVE :: pyv1(:)
130  REAL,ALLOCATABLE,SAVE :: pftsol(:,:)
131  REAL,ALLOCATABLE,SAVE :: ppsrf(:,:)
132 !$OMP THREADPRIVATE(mfu,mfd,en_u,de_u,en_d,de_d,coefh)
133 !$OMP THREADPRIVATE(pyu1,pyv1,pftsol,ppsrf)
134 
135 
136  REAL,DIMENSION(:,:), ALLOCATABLE,SAVE :: sh
137  REAL,DIMENSION(:,:), ALLOCATABLE,SAVE :: da
138  REAL,DIMENSION(:,:,:), ALLOCATABLE,SAVE :: phi
139  REAL,DIMENSION(:,:), ALLOCATABLE,SAVE :: mp
140  REAL,DIMENSION(:,:), ALLOCATABLE,SAVE :: upwd
141  REAL,DIMENSION(:,:), ALLOCATABLE,SAVE :: dnwd
142 
143  REAL, SAVE :: dtcum
144  INTEGER, SAVE:: iadvtr=0
145 !$OMP THREADPRIVATE(dtcum,iadvtr)
146  REAL zmin,zmax
147  LOGICAL ok_sync
148  CHARACTER(len=12) :: nvar
149  logical, parameter :: lstokenc=.false.
150 !
151 !======================================================================
152 
153  iadvtr=iadvtr+1
154 
155 ! Dans le meme vecteur on recombine le drag et les coeff d'echange
156  pcoefh_buf(:,1) = cdragh(:)
157  pcoefh_buf(:,2:klev) = pcoefh(:,2:klev)
158 
159  ok_sync = .true.
160 
161 ! Initialization done only once
162 !======================================================================
163  IF (iadvtr==1) THEN
164  ALLOCATE( t(klon,klev))
165  ALLOCATE( mfu(klon,klev))
166  ALLOCATE( mfd(klon,klev))
167  ALLOCATE( en_u(klon,klev))
168  ALLOCATE( de_u(klon,klev))
169  ALLOCATE( en_d(klon,klev))
170  ALLOCATE( de_d(klon,klev))
171  ALLOCATE( coefh(klon,klev))
172  ALLOCATE( entr_therm(klon,klev))
173  ALLOCATE( fm_therm(klon,klev))
174  ALLOCATE( pyu1(klon))
175  ALLOCATE( pyv1(klon))
176  ALLOCATE( pftsol(klon,nbsrf))
177  ALLOCATE( ppsrf(klon,nbsrf))
178 
179  ALLOCATE(sh(klon,klev))
180  ALLOCATE(da(klon,klev))
181  ALLOCATE(phi(klon,klev,klev))
182  ALLOCATE(mp(klon,klev))
183  ALLOCATE(upwd(klon,klev))
184  ALLOCATE(dnwd(klon,klev))
185 
186  CALL initphysto('phystoke', dtime, dtime*istphy,dtime*istphy,physid)
187 
188  ! Write field phis and aire only once
189  CALL histwrite_phy(physid,lstokenc,"phis",itap,pphis)
190  CALL histwrite_phy(physid,lstokenc,"aire",itap,paire)
191  CALL histwrite_phy(physid,lstokenc,"longitudes",itap,rlon)
192  CALL histwrite_phy(physid,lstokenc,"latitudes",itap,rlat)
193 
194  END IF
195 
196 
197 ! Set to zero cumulating fields
198 !======================================================================
199  IF (mod(iadvtr,istphy)==1.OR.istphy==1) THEN
200  WRITE(lunout,*)'reinitialisation des champs cumules a iadvtr=',iadvtr
201  mfu(:,:)=0.
202  mfd(:,:)=0.
203  en_u(:,:)=0.
204  de_u(:,:)=0.
205  en_d(:,:)=0.
206  de_d(:,:)=0.
207  coefh(:,:)=0.
208  t(:,:)=0.
209  fm_therm(:,:)=0.
210  entr_therm(:,:)=0.
211  pyv1(:)=0.
212  pyu1(:)=0.
213  pftsol(:,:)=0.
214  ppsrf(:,:)=0.
215  sh(:,:)=0.
216  da(:,:)=0.
217  phi(:,:,:)=0.
218  mp(:,:)=0.
219  upwd(:,:)=0.
220  dnwd(:,:)=0.
221  dtcum=0.
222  ENDIF
223 
224 
225 ! Cumulate fields at each time step
226 !======================================================================
227  DO k=1,klev
228  DO i=1,klon
229  mfu(i,k)=mfu(i,k)+pmfu(i,k)*pdtphys
230  mfd(i,k)=mfd(i,k)+pmfd(i,k)*pdtphys
231  en_u(i,k)=en_u(i,k)+pen_u(i,k)*pdtphys
232  de_u(i,k)=de_u(i,k)+pde_u(i,k)*pdtphys
233  en_d(i,k)=en_d(i,k)+pen_d(i,k)*pdtphys
234  de_d(i,k)=de_d(i,k)+pde_d(i,k)*pdtphys
235  coefh(i,k)=coefh(i,k)+pcoefh_buf(i,k)*pdtphys
236  t(i,k)=t(i,k)+pt(i,k)*pdtphys
237  fm_therm(i,k)=fm_therm(i,k)+pfm_therm(i,k)*pdtphys
238  entr_therm(i,k)=entr_therm(i,k)+pentr_therm(i,k)*pdtphys
239  sh(i,k) = sh(i,k) + psh(i,k)*pdtphys
240  da(i,k) = da(i,k) + pda(i,k)*pdtphys
241  mp(i,k) = mp(i,k) + pmp(i,k)*pdtphys
242  upwd(i,k) = upwd(i,k) + pupwd(i,k)*pdtphys
243  dnwd(i,k) = dnwd(i,k) + pdnwd(i,k)*pdtphys
244  ENDDO
245  ENDDO
246 
247  DO kk=1,klev
248  DO k=1,klev
249  DO i=1,klon
250  phi(i,k,kk) = phi(i,k,kk) + pphi(i,k,kk)*pdtphys
251  END DO
252  END DO
253  END DO
254 
255  DO i=1,klon
256  pyv1(i)=pyv1(i)+yv1(i)*pdtphys
257  pyu1(i)=pyu1(i)+yu1(i)*pdtphys
258  END DO
259  DO k=1,nbsrf
260  DO i=1,klon
261  pftsol(i,k)=pftsol(i,k)+ftsol(i,k)*pdtphys
262  ppsrf(i,k)=ppsrf(i,k)+pctsrf(i,k)*pdtphys
263  ENDDO
264  ENDDO
265 
266 ! Add time step to cumulated time
267  dtcum=dtcum+pdtphys
268 
269 
270 ! Write fields to file, if it is time to do so
271 !======================================================================
272  IF(mod(iadvtr,istphy)==0) THEN
273 
274  ! normalize with time period
275  DO k=1,klev
276  DO i=1,klon
277  mfu(i,k)=mfu(i,k)/dtcum
278  mfd(i,k)=mfd(i,k)/dtcum
279  en_u(i,k)=en_u(i,k)/dtcum
280  de_u(i,k)=de_u(i,k)/dtcum
281  en_d(i,k)=en_d(i,k)/dtcum
282  de_d(i,k)=de_d(i,k)/dtcum
283  coefh(i,k)=coefh(i,k)/dtcum
284  t(i,k)=t(i,k)/dtcum
285  fm_therm(i,k)=fm_therm(i,k)/dtcum
286  entr_therm(i,k)=entr_therm(i,k)/dtcum
287  sh(i,k)=sh(i,k)/dtcum
288  da(i,k)=da(i,k)/dtcum
289  mp(i,k)=mp(i,k)/dtcum
290  upwd(i,k)=upwd(i,k)/dtcum
291  dnwd(i,k)=dnwd(i,k)/dtcum
292  ENDDO
293  ENDDO
294  DO kk=1,klev
295  DO k=1,klev
296  DO i=1,klon
297  phi(i,k,kk) = phi(i,k,kk)/dtcum
298  END DO
299  END DO
300  END DO
301  DO i=1,klon
302  pyv1(i)=pyv1(i)/dtcum
303  pyu1(i)=pyu1(i)/dtcum
304  END DO
305  DO k=1,nbsrf
306  DO i=1,klon
307  pftsol(i,k)=pftsol(i,k)/dtcum
308  ppsrf(i,k)=ppsrf(i,k)/dtcum
309  ENDDO
310  ENDDO
311 
312  ! write fields
313  CALL histwrite_phy(physid,lstokenc,"t",itap,t)
314  CALL histwrite_phy(physid,lstokenc,"mfu",itap,mfu)
315  CALL histwrite_phy(physid,lstokenc,"mfd",itap,mfd)
316  CALL histwrite_phy(physid,lstokenc,"en_u",itap,en_u)
317  CALL histwrite_phy(physid,lstokenc,"de_u",itap,de_u)
318  CALL histwrite_phy(physid,lstokenc,"en_d",itap,en_d)
319  CALL histwrite_phy(physid,lstokenc,"de_d",itap,de_d)
320  CALL histwrite_phy(physid,lstokenc,"coefh",itap,coefh)
321  CALL histwrite_phy(physid,lstokenc,"fm_th",itap,fm_therm)
322  CALL histwrite_phy(physid,lstokenc,"en_th",itap,entr_therm)
323  CALL histwrite_phy(physid,lstokenc,"frac_impa",itap,frac_impa)
324  CALL histwrite_phy(physid,lstokenc,"frac_nucl",itap,frac_nucl)
325  CALL histwrite_phy(physid,lstokenc,"pyu1",itap,pyu1)
326  CALL histwrite_phy(physid,lstokenc,"pyv1",itap,pyv1)
327  CALL histwrite_phy(physid,lstokenc,"ftsol1",itap,pftsol(:,1))
328  CALL histwrite_phy(physid,lstokenc,"ftsol2",itap,pftsol(:,2))
329  CALL histwrite_phy(physid,lstokenc,"ftsol3",itap,pftsol(:,3))
330  CALL histwrite_phy(physid,lstokenc,"ftsol4",itap,pftsol(:,4))
331  CALL histwrite_phy(physid,lstokenc,"psrf1",itap,ppsrf(:,1))
332  CALL histwrite_phy(physid,lstokenc,"psrf2",itap,ppsrf(:,2))
333  CALL histwrite_phy(physid,lstokenc,"psrf3",itap,ppsrf(:,3))
334  CALL histwrite_phy(physid,lstokenc,"psrf4",itap,ppsrf(:,4))
335  CALL histwrite_phy(physid,lstokenc,"sh",itap,sh)
336  CALL histwrite_phy(physid,lstokenc,"da",itap,da)
337  CALL histwrite_phy(physid,lstokenc,"mp",itap,mp)
338  CALL histwrite_phy(physid,lstokenc,"upwd",itap,upwd)
339  CALL histwrite_phy(physid,lstokenc,"dnwd",itap,dnwd)
340 
341 
342 ! phi
343  DO k=1,klev
344  IF (k<10) THEN
345  WRITE(nvar,'(i1)') k
346  ELSE IF (k<100) THEN
347  WRITE(nvar,'(i2)') k
348  ELSE
349  WRITE(nvar,'(i3)') k
350  END IF
351  nvar='phi_lev'//trim(nvar)
352 
353  CALL histwrite_phy(physid,lstokenc,nvar,itap,phi(:,:,k))
354  END DO
355 
356  ! Syncronize file
357 !$OMP MASTER
358  IF (ok_sync) CALL histsync(physid)
359 !$OMP END MASTER
360 
361 
362  ! Calculate min and max values for some fields (coefficients de lessivage)
363  zmin=1e33
364  zmax=-1e33
365  DO k=1,klev
366  DO i=1,klon
367  zmax=max(zmax,frac_nucl(i,k))
368  zmin=min(zmin,frac_nucl(i,k))
369  ENDDO
370  ENDDO
371  WRITE(lunout,*)'------ coefs de lessivage (min et max) --------'
372  WRITE(lunout,*)'facteur de nucleation ',zmin,zmax
373  zmin=1e33
374  zmax=-1e33
375  DO k=1,klev
376  DO i=1,klon
377  zmax=max(zmax,frac_impa(i,k))
378  zmin=min(zmin,frac_impa(i,k))
379  ENDDO
380  ENDDO
381  WRITE(lunout,*)'facteur d impaction ',zmin,zmax
382 
383  ENDIF ! IF(MOD(iadvtr,istphy)==0)
384 
385 END SUBROUTINE phystokenc
386 
387 END MODULE phystokenc_mod
!$Id klon initialisation mois suivants day_rain itap
Definition: calcul_divers.h:18
!$Header!common tracstoke istphy
Definition: tracstoke.h:4
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
logical, save offline
Definition: control_mod.F90:30
subroutine initphysto(infile, tstep, t_ops, t_wrt, fileid)
Definition: initphysto.F90:5
integer, save nqtot
Definition: infotrac_phy.F90:8
subroutine phystokenc(nlon, nlev, pdtphys, rlon, rlat, pt, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, pfm_therm, pentr_therm, cdragh, pcoefh, yu1, yv1, ftsol, pctsrf, frac_impa, frac_nucl, pphis, paire, dtime, itap, psh, pda, pphi, pmp, pupwd, pdnwd)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer, parameter nbsrf
INTERFACE SUBROUTINE RRTM_ECRT_140GP pt
subroutine init_phystokenc(offline_dyn, istphy_dyn)
Definition: dimphy.F90:1
Definition: iophy.F90:4
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
Definition: iniprint.h:7