source: LMDZ5/trunk/libf/phylmd/phys_output_mod.F90 @ 2686

Last change on this file since 2686 was 2665, checked in by dcugnet, 8 years ago
  • A (re)startphy.nc file (standard name: "startphy0.nc") can be read by ce0l to get land mask, so mask can be defined (in decreasing priority order) from: 1) "o2a.nc file" if this file is found 2) "startphy0.nc" if this file is found 3) "Relief.nc" otherwise
  • Sub-cell scales parameters for orographic gravity waves can be read from file "oro_params.nc" if the configuration key "read_orop" is TRUE. The effect is to bypass the "grid_noro" routine in ce0l, so that any pre-defined mask (from o2a.nc or startphy0.nc) is then overwritten.
  • The gcm stops if the "limit.nc" records number differs from the current year number of days. A warning is issued in case the gcm calendar does not match the time axis attribute "calendar" (if available) from the "limit.nc" file. This attribute is now added to the "limit.nc" time axis.
  • Few simplifications in grid_noro
  • Few parameters changes in acama_gwd and flott_gwd.
  • Variable d_u can be saved in the outputs.
  • 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
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.2 KB
Line 
1! $Id: phys_output_mod.F90 2665 2016-10-12 12:53:20Z musat $
2!
3
4MODULE phys_output_mod
5  USE indice_sol_mod
6  USE phys_output_var_mod
7  USE aero_mod, only : naero_spc,name_aero
8  USE phys_output_write_mod, ONLY : phys_output_write
9  REAL, DIMENSION(nfiles),SAVE :: ecrit_files
10
11! Abderrahmane 12 2007
12!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
13!!! Ecreture des Sorties du modele dans les fichiers Netcdf :
14! histmth.nc : moyennes mensuelles
15! histday.nc : moyennes journalieres
16! histhf.nc  : moyennes toutes les 3 heures
17! histins.nc : valeurs instantanees
18!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
19
20CONTAINS
21
22!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23!!!!!!!!! Ouverture des fichier et definition des variable de sortie !!!!!!!!
24  !! histbeg, histvert et histdef
25!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
26
27  SUBROUTINE phys_output_open(rlon,rlat,pim,tabij,ipt,jpt,plon,plat, &
28       jjmp1,nlevSTD,clevSTD,rlevSTD, dtime, ok_veget, &
29       type_ocean, iflag_pbl,iflag_pbl_split,ok_mensuel,ok_journe, &
30       ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, read_climoz, &
31       phys_out_filestations, &
32       new_aod, aerosol_couple, flag_aerosol_strat, &
33       pdtphys, paprs, pphis, pplay, lmax_th, ptconv, ptconvth, ivap, &
34       d_u, d_t, qx, d_qx, zmasse, ok_sync)   
35
36    USE iophy
37    USE dimphy
38    USE infotrac_phy, ONLY: nqtot, nqo, niadv, tname, ttext
39    USE ioipsl
40    USE phys_cal_mod, only : hour, calend
41    USE mod_phys_lmdz_para
42    USE aero_mod, only : naero_spc,name_aero
43        !Martin
44    USE surface_data, ONLY : ok_snow
45    USE phys_output_ctrlout_mod
46    USE mod_grid_phy_lmdz, only: klon_glo,nbp_lon,nbp_lat
47    USE print_control_mod, ONLY: prt_level,lunout
48    USE vertical_layers_mod, ONLY: ap,bp,preff,presnivs
49    USE time_phylmdz_mod, ONLY: day_ini, itau_phy, start_time, annee_ref, day_ref
50#ifdef CPP_XIOS
51    ! ug Pour les sorties XIOS
52    USE wxios
53#endif
54
55    IMPLICIT NONE
56    include "clesphys.h"
57    include "thermcell.h"
58    include "YOMCST.h"
59
60    ! ug Nouveaux arguments n\'ecessaires au histwrite_mod:
61    INTEGER, INTENT(IN)                         :: ivap
62    INTEGER, DIMENSION(klon), INTENT(IN)        :: lmax_th
63    LOGICAL, INTENT(IN)                         :: ok_sync
64    LOGICAL, DIMENSION(klon, klev), INTENT(IN)  :: ptconv, ptconvth
65    REAL, INTENT(IN)                            :: pdtphys
66    REAL, DIMENSION(klon), INTENT(IN)           :: pphis
67    REAL, DIMENSION(klon, klev), INTENT(IN)     :: pplay, d_u, d_t
68    REAL, DIMENSION(klon, klev+1), INTENT(IN)   :: paprs
69    REAL, DIMENSION(klon,klev,nqtot), INTENT(IN):: qx, d_qx
70    REAL, DIMENSION(klon, klev), INTENT(IN)      :: zmasse
71
72
73    REAL,DIMENSION(klon),INTENT(IN) :: rlon
74    REAL,DIMENSION(klon),INTENT(IN) :: rlat
75    INTEGER, INTENT(IN)             :: pim
76    INTEGER, DIMENSION(pim)            :: tabij
77    INTEGER,DIMENSION(pim), INTENT(IN) :: ipt, jpt
78    REAL,DIMENSION(pim), INTENT(IN) :: plat, plon
79    REAL,DIMENSION(pim,2) :: plat_bounds, plon_bounds
80
81    INTEGER                               :: jjmp1
82    INTEGER                               :: nlevSTD, radpas
83    LOGICAL                               :: ok_mensuel, ok_journe, ok_hf, ok_instan
84    LOGICAL                               :: ok_LES,ok_ade,ok_aie
85    INTEGER                               :: flag_aerosol_strat
86    LOGICAL                               :: new_aod, aerosol_couple
87    INTEGER, INTENT(IN)::  read_climoz ! read ozone climatology
88    !     Allowed values are 0, 1 and 2
89    !     0: do not read an ozone climatology
90    !     1: read a single ozone climatology that will be used day and night
91    !     2: read two ozone climatologies, the average day and night
92    !     climatology and the daylight climatology
93
94    REAL                                  :: dtime
95    INTEGER                               :: idayref
96    REAL                                  :: zjulian_start, zjulian
97    REAL, DIMENSION(klev)                 :: Ahyb, Bhyb, Alt
98    CHARACTER(LEN=4), DIMENSION(nlevSTD)  :: clevSTD
99    REAL, DIMENSION(nlevSTD)              :: rlevSTD
100    INTEGER                               :: nsrf, k, iq, iiq, iff, i, j, ilev
101    INTEGER                               :: naero
102    LOGICAL                               :: ok_veget
103    INTEGER                               :: iflag_pbl
104    INTEGER                               :: iflag_pbl_split
105    CHARACTER(LEN=4)                      :: bb2
106    CHARACTER(LEN=2)                      :: bb3
107    CHARACTER(LEN=6)                      :: type_ocean
108    INTEGER, DIMENSION(nbp_lon*jjmp1)         ::  ndex2d
109    INTEGER, DIMENSION(nbp_lon*jjmp1*klev)    :: ndex3d
110    INTEGER                               :: imin_ins, imax_ins
111    INTEGER                               :: jmin_ins, jmax_ins
112    INTEGER, DIMENSION(nfiles)            :: phys_out_levmin, phys_out_levmax
113    INTEGER, DIMENSION(nfiles)            :: phys_out_filelevels
114    CHARACTER(LEN=20), DIMENSION(nfiles)  :: chtimestep = (/ 'Default', 'Default', 'Default', 'Default', 'Default', &
115                                                             'Default', 'Default', 'Default', 'Default' /)
116    LOGICAL, DIMENSION(nfiles)            :: phys_out_filekeys
117    LOGICAL, DIMENSION(nfiles)            :: phys_out_filestations
118
119!!!!!!!!!! stockage dans une region limitee pour chaque fichier !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
120    !                 entre [phys_out_lonmin,phys_out_lonmax] et [phys_out_latmin,phys_out_latmax]
121
122    LOGICAL, DIMENSION(nfiles), SAVE  :: phys_out_regfkey       = (/ .FALSE., .FALSE., .FALSE.,  .FALSE., &
123                                                                    .FALSE., .FALSE., .FALSE., .FALSE.,  .FALSE. /)
124    REAL, DIMENSION(nfiles), SAVE     :: phys_out_lonmin        = (/   -180.,   -180.,   -180.,    -180., &
125                                                                     -180.,   -180., -180.,   -180.,    -180. /)
126    REAL, DIMENSION(nfiles), SAVE     :: phys_out_lonmax        = (/    180.,    180.,    180.,     180., &
127                                                                      180.,    180., 180.,    180.,     180. /)
128    REAL, DIMENSION(nfiles), SAVE     :: phys_out_latmin        = (/    -90.,    -90.,    -90.,     -90., &
129                                                                    -90., -90., -90.,    -90.,     -90. /)
130    REAL, DIMENSION(nfiles), SAVE     :: phys_out_latmax        = (/  90.,     90.,     90.,     90., &
131                                                                    90., 90., 90., 90., 90. /)                       
132#ifdef CPP_XIOS
133    ! ug Variables utilis\'ees pour r\'ecup\'erer le calendrier pour xios
134    INTEGER :: x_an, x_mois, x_jour
135    REAL :: x_heure
136    INTEGER :: ini_an, ini_mois, ini_jour
137    REAL :: ini_heure
138#endif
139
140    WRITE(lunout,*) 'Debut phys_output_mod.F90'
141    ! Initialisations (Valeurs par defaut
142
143    IF (.NOT. ALLOCATED(o_trac)) ALLOCATE(o_trac(nqtot))
144    IF (.NOT. ALLOCATED(o_trac_cum)) ALLOCATE(o_trac_cum(nqtot))
145    ALLOCATE(o_dtr_the(nqtot),o_dtr_con(nqtot),o_dtr_lessi_impa(nqtot))
146    ALLOCATE(o_dtr_lessi_nucl(nqtot),o_dtr_insc(nqtot),o_dtr_bcscav(nqtot))
147    ALLOCATE(o_dtr_evapls(nqtot),o_dtr_ls(nqtot),o_dtr_trsp(nqtot))
148    ALLOCATE(o_dtr_sscav(nqtot),o_dtr_sat(nqtot),o_dtr_uscav(nqtot))
149    ALLOCATE(o_dtr_dry(nqtot),o_dtr_vdf(nqtot))
150
151
152    levmax = (/ klev, klev, klev, klev, klev, klev, nlevSTD, nlevSTD, nlevSTD /)
153
154    phys_out_filenames(1) = 'histmth'
155    phys_out_filenames(2) = 'histday'
156    phys_out_filenames(3) = 'histhf6h'
157    phys_out_filenames(4) = 'histhf3h'
158    phys_out_filenames(5) = 'histhf3hm'
159    phys_out_filenames(6) = 'histstn'
160    phys_out_filenames(7) = 'histmthNMC'
161    phys_out_filenames(8) = 'histdayNMC'
162    phys_out_filenames(9) = 'histhfNMC.nc'
163
164    type_ecri(1) = 'ave(X)'
165    type_ecri(2) = 'ave(X)'
166    type_ecri(3) = 'inst(X)'
167    type_ecri(4) = 'inst(X)'
168    type_ecri(5) = 'ave(X)'
169    type_ecri(6) = 'inst(X)'
170    type_ecri(7) = 'inst(X)'
171    type_ecri(8) = 'inst(X)'
172    type_ecri(9) = 'inst(X)'
173
174    clef_files(1) = ok_mensuel
175    clef_files(2) = ok_journe
176    clef_files(3) = ok_hf
177    clef_files(4) = ok_instan
178    clef_files(5) = ok_LES
179    clef_files(6) = ok_instan
180    clef_files(7) = ok_histNMC(1)
181    clef_files(8) = ok_histNMC(2)
182    clef_files(9) = ok_histNMC(3)
183
184    !sortir des fichiers "stations" si clef_stations(:)=.TRUE.
185    clef_stations(1) = .FALSE.
186    clef_stations(2) = .FALSE.
187    clef_stations(3) = .FALSE.
188    clef_stations(4) = .FALSE.
189    clef_stations(5) = .FALSE.
190    clef_stations(6) = .FALSE.
191    clef_stations(7) = .FALSE.
192    clef_stations(8) = .FALSE.
193    clef_stations(9) = .FALSE.
194
195    lev_files(1) = lev_histmth
196    lev_files(2) = lev_histday
197    lev_files(3) = lev_histhf
198    lev_files(4) = lev_histins
199    lev_files(5) = lev_histLES
200    lev_files(6) = lev_histins
201    lev_files(7) = levout_histNMC(1)
202    lev_files(8) = levout_histNMC(2)
203    lev_files(9) = levout_histNMC(3)
204
205    ecrit_files(1) = ecrit_mth
206    ecrit_files(2) = ecrit_day
207    ecrit_files(3) = ecrit_hf
208    ecrit_files(4) = ecrit_ins
209    ecrit_files(5) = ecrit_LES
210    ecrit_files(6) = ecrit_ins
211    ecrit_files(7) = freq_outNMC(1)
212    ecrit_files(8) = freq_outNMC(2)
213    ecrit_files(9) = freq_outNMC(3)
214
215    !! Lectures des parametres de sorties dans physiq.def
216
217    CALL getin('phys_out_regfkey',phys_out_regfkey)
218    CALL getin('phys_out_lonmin',phys_out_lonmin)
219    CALL getin('phys_out_lonmax',phys_out_lonmax)
220    CALL getin('phys_out_latmin',phys_out_latmin)
221    CALL getin('phys_out_latmax',phys_out_latmax)
222    phys_out_levmin(:)=levmin(:)
223    CALL getin('phys_out_levmin',levmin)
224    phys_out_levmax(:)=levmax(:)
225    CALL getin('phys_out_levmax',levmax)
226    CALL getin('phys_out_filenames',phys_out_filenames)
227    phys_out_filekeys(:)=clef_files(:)
228    CALL getin('phys_out_filekeys',clef_files)
229    phys_out_filestations(:)=clef_stations(:)
230    CALL getin('phys_out_filestations',clef_stations)
231    phys_out_filelevels(:)=lev_files(:)
232    CALL getin('phys_out_filelevels',lev_files)
233    CALL getin('phys_out_filetimesteps',chtimestep)
234    phys_out_filetypes(:)=type_ecri(:)
235    CALL getin('phys_out_filetypes',type_ecri)
236
237    type_ecri_files(:)=type_ecri(:)
238
239!    if (ok_all_xml) phys_out_filelevels = 999
240
241    WRITE(lunout,*)'phys_out_lonmin=',phys_out_lonmin
242    WRITE(lunout,*)'phys_out_lonmax=',phys_out_lonmax
243    WRITE(lunout,*)'phys_out_latmin=',phys_out_latmin
244    WRITE(lunout,*)'phys_out_latmax=',phys_out_latmax
245    WRITE(lunout,*)'phys_out_filenames=',phys_out_filenames
246    WRITE(lunout,*)'phys_out_filetypes=',type_ecri
247    WRITE(lunout,*)'phys_out_filekeys=',clef_files
248    WRITE(lunout,*)'phys_out_filestations=',clef_stations
249    WRITE(lunout,*)'phys_out_filelevels=',lev_files
250
251! A noter pour
252! l heure initiale - dans les fichiers histoire hist* - on met comme 
253! heure de debut soit la vraie heure (pour le 1D) soit 0h (pour le 3D)
254! afin d avoir une seule sortie mensuelle par mois lorsque l on tourne
255! par annee (IM).
256!
257     idayref = day_ref
258     IF (klon_glo==1) THEN
259       ! current_time (used to compute hour) is updated at the begining of
260       ! the physics; to set the correct outputs "initial time" we thus
261       ! have to use (hour-dtphys).
262         CALL ymds2ju(annee_ref, 1, idayref, hour-pdtphys, zjulian)
263         print *,'phys_output_mod: annee,iday,hour,zjulian=',annee_ref,idayref, hour, zjulian
264     ELSE
265         CALL ymds2ju(annee_ref, 1, idayref, 0.0, zjulian)
266         CALL ymds2ju(annee_ref, 1, day_ini, start_time*rday, zjulian_start)
267     END IF
268
269#ifdef CPP_XIOS
270    ! ug R\'eglage du calendrier xios
271    !Temps julian => an, mois, jour, heure
272    CALL ju2ymds(zjulian, x_an, x_mois, x_jour, x_heure)
273    CALL ju2ymds(zjulian_start, ini_an, ini_mois, ini_jour, ini_heure)
274    CALL wxios_set_cal(dtime, calend, x_an, x_mois, x_jour, x_heure, ini_an, &
275                       ini_mois, ini_jour, ini_heure )
276#endif
277
278!!!!!!!!!!!!!!!!!!!!!!! Boucle sur les fichiers !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
279    ! Appel de histbeg et histvert pour creer le fichier et les niveaux verticaux !!
280    ! Appel des histbeg pour definir les variables (nom, moy ou inst, freq de sortie ..
281!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
282
283    zdtime_moy = dtime         ! Frequence ou l on moyenne
284
285    ! Calcul des Ahyb, Bhyb et Alt
286    DO k=1,klev
287       Ahyb(k)=(ap(k)+ap(k+1))/2.
288       Bhyb(k)=(bp(k)+bp(k+1))/2.
289       Alt(k)=log(preff/presnivs(k))*8.
290    ENDDO
291    !          if(prt_level.ge.1) then
292    WRITE(lunout,*)'Ap Hybrid = ',Ahyb(1:klev)
293    WRITE(lunout,*)'Bp Hybrid = ',Bhyb(1:klev)
294    WRITE(lunout,*)'Alt approx des couches pour une haut d echelle de 8km = ',Alt(1:klev)
295    !          endif
296
297  ecrit_files(7) = ecrit_files(1)
298  ecrit_files(8) = ecrit_files(2)
299  ecrit_files(9) = ecrit_files(3)
300
301  DO iff=1,nfiles
302
303       ! Calculate ecrit_files for all files
304      IF ( chtimestep(iff).eq.'Default' ) then
305          ! Par defaut ecrit_files = (ecrit_mensuel ecrit_jour ecrit_hf
306          ! ...)*86400.
307          ecrit_files(iff)=ecrit_files(iff)*86400.
308      ELSE IF (chtimestep(iff).eq.'-1') then
309          PRINT*,'ecrit_files(',iff,') < 0 so IOIPSL work on different'
310          PRINT*,'months length'
311          ecrit_files(iff)=-1.
312      else
313       CALL convers_timesteps(chtimestep(iff),dtime,ecrit_files(iff))
314      ENDIF
315
316       WRITE(lunout,*)'ecrit_files(',iff,')= ',ecrit_files(iff)
317       zoutm(iff) = ecrit_files(iff) ! Frequence ou l on ecrit en seconde
318
319
320#ifdef CPP_XIOS
321!!! Ouverture de chaque fichier XIOS !!!!!!!!!!!
322    IF (.not. ok_all_xml) then
323      if (prt_level >= 10) then
324        print*,'phys_output_open: call wxios_add_file with phys_out_filenames(iff)=',trim(phys_out_filenames(iff))   
325      endif
326      CALL wxios_add_file(phys_out_filenames(iff),chtimestep(iff),lev_files(iff)) 
327    ENDIF
328
329!!! Declaration des axes verticaux de chaque fichier:
330    if (prt_level >= 10) then
331      print*,'phys_output_open: Declare vertical axes for each file'
332    endif
333   if (iff.le.6) then
334    CALL wxios_add_vaxis("presnivs", &
335            levmax(iff) - levmin(iff) + 1, presnivs(levmin(iff):levmax(iff)))
336    CALL wxios_add_vaxis("Ahyb", &
337            levmax(iff) - levmin(iff) + 1, Ahyb)
338    CALL wxios_add_vaxis("Bhyb", &
339            levmax(iff) - levmin(iff) + 1, Bhyb)
340    CALL wxios_add_vaxis("Alt", &
341            levmax(iff) - levmin(iff) + 1, Alt)
342   else
343    ! NMC files
344    CALL wxios_add_vaxis("plev", &
345            levmax(iff) - levmin(iff) + 1, rlevSTD(levmin(iff):levmax(iff)))
346   endif
347#endif
348
349        IF (clef_files(iff)) THEN
350!!!!!!!!!!!!!!!!! Traitement dans le cas ou l'on veut stocker sur un domaine limite !!
351!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
352          IF (phys_out_regfkey(iff)) then
353             imin_ins=1
354             imax_ins=nbp_lon
355             jmin_ins=1
356             jmax_ins=jjmp1
357
358             ! correction abderr       
359             do i=1,nbp_lon
360                WRITE(lunout,*)'io_lon(i)=',io_lon(i)
361                IF (io_lon(i).le.phys_out_lonmin(iff)) imin_ins=i
362                IF (io_lon(i).le.phys_out_lonmax(iff)) imax_ins=i+1
363             enddo
364
365             do j=1,jjmp1
366                WRITE(lunout,*)'io_lat(j)=',io_lat(j)
367                IF (io_lat(j).ge.phys_out_latmin(iff)) jmax_ins=j+1
368                IF (io_lat(j).ge.phys_out_latmax(iff)) jmin_ins=j
369             enddo
370
371             WRITE(lunout,*)'On stoke le fichier histoire numero ',iff,' sur ', &
372                  imin_ins,imax_ins,jmin_ins,jmax_ins
373             WRITE(lunout,*)'longitudes : ', &
374                  io_lon(imin_ins),io_lon(imax_ins), &
375                  'latitudes : ', &
376                  io_lat(jmax_ins),io_lat(jmin_ins)
377
378             CALL histbeg(phys_out_filenames(iff),nbp_lon,io_lon,jjmp1,io_lat, &
379                  imin_ins,imax_ins-imin_ins+1, &
380                  jmin_ins,jmax_ins-jmin_ins+1, &
381                  itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
382!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
383             !IM fichiers stations
384          else IF (clef_stations(iff)) THEN
385
386             if (prt_level >= 10) then
387             WRITE(lunout,*)'phys_output_open: iff=',iff,'  phys_out_filenames(iff)=',phys_out_filenames(iff)
388             endif
389             
390             CALL histbeg_phy_all(rlon,rlat,pim,tabij,ipt,jpt,plon,plat,plon_bounds,plat_bounds, &
391                  phys_out_filenames(iff), &
392                  itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
393          else
394             CALL histbeg_phy_all(phys_out_filenames(iff),itau_phy,zjulian,&
395                 dtime,nhorim(iff),nid_files(iff))
396          endif
397
398#ifndef CPP_IOIPSL_NO_OUTPUT
399          if (iff.le.6) then
400             CALL histvert(nid_files(iff), "presnivs", "Vertical levels", "Pa", & 
401               levmax(iff) - levmin(iff) + 1, &
402               presnivs(levmin(iff):levmax(iff)), nvertm(iff),"down")
403!!!! Composantes de la coordonnee sigma-hybride
404          CALL histvert(nid_files(iff), "Ahyb","Ahyb comp of Hyb Cord ", "Pa", &
405               levmax(iff) - levmin(iff) + 1,Ahyb,nvertap(iff))
406
407          CALL histvert(nid_files(iff), "Bhyb","Bhyb comp of Hyb Cord", " ", &
408               levmax(iff) - levmin(iff) + 1,Bhyb,nvertbp(iff))
409
410          CALL histvert(nid_files(iff), "Alt","Height approx for scale heigh of 8km at levels", "Km", &                       
411               levmax(iff) - levmin(iff) + 1,Alt,nvertAlt(iff))
412
413          else
414             CALL histvert(nid_files(iff), "plev", "pressure", "Pa", &
415               levmax(iff) - levmin(iff) + 1, &
416              rlevSTD(levmin(iff):levmax(iff)), nvertm(iff), "down")
417          endif
418#endif
419
420     ENDIF ! clef_files
421
422!CR: ajout d'une variable eau
423!      IF (nqtot>=3) THEN
424
425       IF (nqtot>=nqo+1) THEN
426!            DO iq=3,nqtot 
427            DO iq=nqo+1,nqtot
428            iiq=niadv(iq)
429            o_trac(iq-nqo) = ctrl_out((/ 4, 5, 5, 5, 10, 10, 11, 11, 11 /), &
430                           tname(iiq),'Tracer '//ttext(iiq), "-",  &
431                           (/ '', '', '', '', '', '', '', '', '' /))
432            o_dtr_vdf(iq-nqo) = ctrl_out((/ 4, 7, 7, 7, 10, 10, 11, 11, 11 /), &
433                              'd'//trim(tname(iq))//'_vdf',  &
434                              'Tendance tracer '//ttext(iiq), "-" , &
435                              (/ '', '', '', '', '', '', '', '', '' /))
436
437            o_dtr_the(iq-nqo) = ctrl_out((/ 5, 7, 7, 7, 10, 10, 11, 11, 11 /), &
438                              'd'//trim(tname(iq))//'_the', &
439                              'Tendance tracer '//ttext(iiq), "-", &
440                              (/ '', '', '', '', '', '', '', '', '' /))
441
442            o_dtr_con(iq-nqo) = ctrl_out((/ 5, 7, 7, 7, 10, 10, 11, 11, 11 /), &
443                              'd'//trim(tname(iq))//'_con', &
444                              'Tendance tracer '//ttext(iiq), "-", &
445                              (/ '', '', '', '', '', '', '', '', '' /))
446
447            o_dtr_lessi_impa(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
448                                     'd'//trim(tname(iq))//'_lessi_impa', &
449                                     'Tendance tracer '//ttext(iiq), "-", &
450                                     (/ '', '', '', '', '', '', '', '', '' /))
451
452            o_dtr_lessi_nucl(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
453                                     'd'//trim(tname(iq))//'_lessi_nucl', &
454                                     'Tendance tracer '//ttext(iiq), "-", &
455                                     (/ '', '', '', '', '', '', '', '', '' /))
456
457            o_dtr_insc(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
458                               'd'//trim(tname(iq))//'_insc', &
459                               'Tendance tracer '//ttext(iiq), "-", &
460                               (/ '', '', '', '', '', '', '', '', '' /))
461
462            o_dtr_bcscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
463                                 'd'//trim(tname(iq))//'_bcscav', &
464                                 'Tendance tracer '//ttext(iiq), "-", &
465                                 (/ '', '', '', '', '', '', '', '', '' /))
466
467            o_dtr_evapls(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
468                                 'd'//trim(tname(iq))//'_evapls', &
469                                 'Tendance tracer '//ttext(iiq), "-", &
470                                 (/ '', '', '', '', '', '', '', '', '' /))
471
472            o_dtr_ls(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
473                             'd'//trim(tname(iq))//'_ls', &
474                             'Tendance tracer '//ttext(iiq), "-", &
475                             (/ '', '', '', '', '', '', '', '', '' /))
476
477            o_dtr_trsp(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
478                               'd'//trim(tname(iq))//'_trsp', &
479                               'Tendance tracer '//ttext(iiq), "-", &
480                               (/ '', '', '', '', '', '', '', '', '' /))
481
482            o_dtr_sscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
483                                'd'//trim(tname(iq))//'_sscav', &
484                                'Tendance tracer '//ttext(iiq), "-", &
485                                (/ '', '', '', '', '', '', '', '', '' /))
486
487            o_dtr_sat(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
488                               'd'//trim(tname(iq))//'_sat', &
489                               'Tendance tracer '//ttext(iiq), "-", &
490                               (/ '', '', '', '', '', '', '', '', '' /))
491
492            o_dtr_uscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
493                                'd'//trim(tname(iq))//'_uscav', &
494                                'Tendance tracer '//ttext(iiq), "-", &
495                                 (/ '', '', '', '', '', '', '', '', '' /))
496
497            o_dtr_dry(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11 /), &
498                              'cum'//'d'//trim(tname(iq))//'_dry', &
499                              'tracer tendency dry deposition'//ttext(iiq), "-", &
500                              (/ '', '', '', '', '', '', '', '', '' /))
501
502            o_trac_cum(iq-nqo) = ctrl_out((/ 3, 4, 10, 10, 10, 10, 11, 11, 11 /), &
503                               'cum'//tname(iiq),&
504                               'Cumulated tracer '//ttext(iiq), "-", &
505                               (/ '', '', '', '', '', '', '', '', '' /))
506            ENDDO
507      ENDIF
508
509
510   ENDDO !  iff
511
512    ! Updated write frequencies due to phys_out_filetimesteps.
513    ! Write frequencies are now in seconds. 
514    ecrit_mth = ecrit_files(1)
515    ecrit_day = ecrit_files(2)
516    ecrit_hf  = ecrit_files(3)
517    ecrit_ins = ecrit_files(4)
518    ecrit_LES = ecrit_files(5)
519    ecrit_ins = ecrit_files(6)
520
521    if (prt_level >= 10) then
522      WRITE(lunout,*)'swaero_diag=',swaero_diag
523      WRITE(lunout,*)'phys_output_open: ends here'
524    endif
525
526  end SUBROUTINE phys_output_open
527
528
529
530  SUBROUTINE convers_timesteps(str,dtime,timestep)
531
532    use ioipsl
533    USE phys_cal_mod
534    USE time_phylmdz_mod, ONLY: day_ref, annee_ref
535    USE print_control_mod, ONLY: lunout
536
537    IMPLICIT NONE
538
539    CHARACTER(LEN=20)   :: str
540    CHARACTER(LEN=10)   :: type
541    INTEGER             :: ipos,il
542    real                :: ttt,xxx,timestep,dayseconde,dtime
543    parameter (dayseconde=86400.)
544
545    ipos=scan(str,'0123456789.',.TRUE.)
546    ! 
547    il=len_trim(str)
548    WRITE(lunout,*) "ipos = ", ipos
549    WRITE(lunout,*) "il = ", il
550    if (ipos == 0) call abort_physic("convers_timesteps", "bad str", 1)
551    read(str(1:ipos),*) ttt
552    WRITE(lunout,*)ttt
553    type=str(ipos+1:il)
554
555
556    IF ( il == ipos ) then
557       type='day'
558    endif
559
560    IF ( type == 'day'.or.type == 'days'.or.type == 'jours'.or.type == 'jour' ) timestep = ttt * dayseconde
561    IF ( type == 'mounths'.or.type == 'mth'.or.type == 'mois' ) then
562       WRITE(lunout,*)'annee_ref,day_ref mon_len',annee_ref,day_ref,mth_len
563       timestep = ttt * dayseconde * mth_len
564    endif
565    IF ( type == 'hours'.or.type == 'hr'.or.type == 'heurs') timestep = ttt * dayseconde / 24.
566    IF ( type == 'mn'.or.type == 'minutes'  ) timestep = ttt * 60.
567    IF ( type == 's'.or.type == 'sec'.or.type == 'secondes'   ) timestep = ttt
568    IF ( type == 'TS' ) timestep = ttt * dtime
569
570    WRITE(lunout,*)'type =      ',type
571    WRITE(lunout,*)'nb j/h/m =  ',ttt
572    WRITE(lunout,*)'timestep(s)=',timestep
573
574  END SUBROUTINE convers_timesteps
575
576END MODULE phys_output_mod
577
578
Note: See TracBrowser for help on using the repository browser.