source: LMDZ6/trunk/libf/phylmd/phys_output_mod.F90 @ 5367

Last change on this file since 5367 was 5357, checked in by idelkadi, 14 months ago

Modifications to have more choice for archiving time frequencies in output files (with IOIPSL) :
month(s),mth,m,mois,day(s),d,jour(s),j,...

  • 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 Id
File size: 30.4 KB
Line 
1! $Id: phys_output_mod.F90 5357 2024-11-30 12:40:53Z abarral $
2!
3
4MODULE phys_output_mod
5  USE indice_sol_mod
6  USE phys_output_var_mod
7  USE phys_output_write_mod, ONLY : phys_output_write
8  REAL, DIMENSION(nfiles),SAVE :: ecrit_files
9
10! Abderrahmane 12 2007
11!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12!!! Ecreture des Sorties du modele dans les fichiers Netcdf :
13! histmth.nc : moyennes mensuelles
14! histday.nc : moyennes journalieres
15! histhf.nc  : moyennes toutes les 3 heures
16! histins.nc : valeurs instantanees
17! AI. nov 2024 : Modifs pour rajouter plus de choix pour la frequence temporelle d'archivage
18!                dans les fichiers de sorties (avec IOIPSL) :
19!                month(s),m,mth,mois,m,day(s),d,jour(s),j, ...
20!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21
22CONTAINS
23
24!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
25!!!!!!!!! Ouverture des fichier et definition des variable de sortie !!!!!!!!
26  !! histbeg, histvert et histdef
27!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28
29  SUBROUTINE phys_output_open(rlon,rlat,pim,tabij,ipt,jpt,plon,plat, &
30       jjmp1,nlevSTD,clevSTD,rlevSTD, dtime, ok_veget, &
31       type_ocean, iflag_pbl,iflag_pbl_split,ok_mensuel,ok_journe, &
32       ok_hf,ok_instan,ok_LES,ok_ade,ok_aie, read_climoz, &
33       phys_out_filestations, &
34       aerosol_couple, flag_aerosol_strat, &
35       pdtphys, paprs, pphis, pplay, lmax_th, ptconv, ptconvth, ivap, &
36       d_u, d_t, qx, d_qx, zmasse, ok_sync)   
37
38    USE iophy
39    USE dimphy
40    USE infotrac_phy, ONLY: nqtot, tracers, niso, ntraciso=>ntiso
41    USE strings_mod,  ONLY: maxlen
42    USE ioipsl
43    USE phys_cal_mod, only : hour, calend
44    USE mod_phys_lmdz_para
45    !Martin
46    USE surface_data, ONLY : landice_opt
47    USE phys_output_ctrlout_mod
48    USE mod_grid_phy_lmdz, only: klon_glo,nbp_lon,nbp_lat
49    USE print_control_mod, ONLY: prt_level,lunout
50    USE vertical_layers_mod, ONLY: ap,bp,preff,presnivs, aps, bps, pseudoalt, presinter
51    USE time_phylmdz_mod, ONLY: day_ini, itau_phy, start_time, annee_ref, day_ref
52    ! ug Pour les sorties XIOS
53    use wxios_mod
54   USE infotrac_phy, ONLY: nbtr_bin
55#ifdef ISO
56    USE isotopes_mod, ONLY: isoName,iso_HTO
57#ifdef ISOTRAC
58    use isotrac_mod, only: index_zone,index_iso,strtrac
59#endif
60#endif
61
62    USE clesphys_mod_h
63    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_STRATAER
64
65    USE yomcst_mod_h
66IMPLICIT NONE
67
68
69    ! ug Nouveaux arguments n\'ecessaires au histwrite_mod:
70    INTEGER, INTENT(IN)                         :: ivap
71    INTEGER, DIMENSION(klon), INTENT(IN)        :: lmax_th
72    LOGICAL, INTENT(IN)                         :: ok_sync
73    LOGICAL, DIMENSION(klon, klev), INTENT(IN)  :: ptconv, ptconvth
74    REAL, INTENT(IN)                            :: pdtphys
75    REAL, DIMENSION(klon), INTENT(IN)           :: pphis
76    REAL, DIMENSION(klon, klev), INTENT(IN)     :: pplay, d_u, d_t
77    REAL, DIMENSION(klon, klev+1), INTENT(IN)   :: paprs
78    REAL, DIMENSION(klon,klev,nqtot), INTENT(IN):: qx, d_qx
79    REAL, DIMENSION(klon, klev), INTENT(IN)      :: zmasse
80
81
82    REAL,DIMENSION(klon),INTENT(IN) :: rlon
83    REAL,DIMENSION(klon),INTENT(IN) :: rlat
84    INTEGER, INTENT(IN)             :: pim
85    INTEGER, DIMENSION(pim)            :: tabij
86    INTEGER,DIMENSION(pim), INTENT(IN) :: ipt, jpt
87    REAL,DIMENSION(pim), INTENT(IN) :: plat, plon
88    REAL,DIMENSION(pim,2) :: plat_bounds, plon_bounds
89
90    INTEGER                               :: jjmp1
91    INTEGER                               :: nlevSTD, radpas
92    LOGICAL                               :: ok_mensuel, ok_journe, ok_hf, ok_instan
93    LOGICAL                               :: ok_LES,ok_ade,ok_aie
94    INTEGER                               :: flag_aerosol_strat
95    LOGICAL                               :: aerosol_couple
96    INTEGER, INTENT(IN)::  read_climoz ! read ozone climatology
97    !     Allowed values are 0, 1 and 2
98    !     0: do not read an ozone climatology
99    !     1: read a single ozone climatology that will be used day and night
100    !     2: read two ozone climatologies, the average day and night
101    !     climatology and the daylight climatology
102
103    REAL                                  :: dtime
104    INTEGER                               :: idayref
105    REAL                                  :: zjulian_start, zjulian
106    CHARACTER(LEN=4), DIMENSION(nlevSTD)  :: clevSTD
107    REAL, DIMENSION(nlevSTD)              :: rlevSTD
108    INTEGER                               :: nsrf, k, iq, iff, i, j, ilev, itr, itrb, ixt, iiso, izone
109    INTEGER                               :: naero
110    LOGICAL                               :: ok_veget
111    INTEGER                               :: iflag_pbl
112    INTEGER                               :: iflag_pbl_split
113    CHARACTER(LEN=4)                      :: bb2
114    CHARACTER(LEN=2)                      :: bb3
115    CHARACTER(LEN=6)                      :: type_ocean
116    INTEGER, DIMENSION(nbp_lon*jjmp1)         ::  ndex2d
117    INTEGER, DIMENSION(nbp_lon*jjmp1*klev)    :: ndex3d
118    INTEGER                               :: imin_ins, imax_ins
119    INTEGER                               :: jmin_ins, jmax_ins
120    INTEGER, DIMENSION(nfiles)            :: phys_out_levmin, phys_out_levmax
121    INTEGER, DIMENSION(nfiles)            :: phys_out_filelevels
122    CHARACTER(LEN=20), DIMENSION(nfiles)  :: chtimestep = (/ 'Default', 'Default', 'Default', 'Default', 'Default', &
123                                                             'Default', 'Default', 'Default', 'Default', 'Default' /)
124    LOGICAL, DIMENSION(nfiles)            :: phys_out_filekeys
125    LOGICAL, DIMENSION(nfiles)            :: phys_out_filestations
126
127#ifdef ISO
128    CHARACTER(LEN=maxlen) :: outiso
129    CHARACTER(LEN=20) :: unit
130#endif
131    CHARACTER(LEN=maxlen) :: tnam, lnam, dn
132    INTEGER :: flag(nfiles)
133
134!!!!!!!!!! stockage dans une region limitee pour chaque fichier !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
135    !                 entre [phys_out_lonmin,phys_out_lonmax] et [phys_out_latmin,phys_out_latmax]
136    LOGICAL, DIMENSION(nfiles), SAVE :: &
137      phys_out_regfkey = [.FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE.]
138    REAL,    DIMENSION(nfiles), SAVE :: &
139      phys_out_lonmin  = [  -180.,   -180.,   -180.,   -180.,   -180.,   -180.,   -180.,   -180.,   -180.,   -180.], &
140      phys_out_lonmax  = [   180.,    180.,    180.,    180.,    180.,    180.,    180.,    180.,    180.,    180.], &
141      phys_out_latmin  = [   -90.,    -90.,    -90.,    -90.,    -90.,    -90.,    -90.,    -90.,    -90.,    -90.], &
142      phys_out_latmax  = [    90.,     90.,     90.,     90.,     90.,     90.,     90.,     90.,     90.,     90.]
143    REAL, DIMENSION(klev,2) :: Ahyb_bounds, Bhyb_bounds
144    REAL, DIMENSION(klev+1)   :: lev_index
145               
146    ! ug Variables utilis\'ees pour r\'ecup\'erer le calendrier pour xios
147    INTEGER :: x_an, x_mois, x_jour
148    REAL :: x_heure
149    INTEGER :: ini_an, ini_mois, ini_jour
150    REAL :: ini_heure
151
152    INTEGER                         :: ISW
153    REAL, DIMENSION(NSW)            :: wl1_sun, wl2_sun !wavelength bounds (in um) for SW
154    REAL, DIMENSION(NSW)            :: wn1_sun, wn2_sun !wavenumber bounds (in m-1) for SW
155    REAL, DIMENSION(NSW)            :: spectband  !mean wavenumb. of each sp.band
156    REAL, DIMENSION(NSW,2)          :: spbnds_sun !bounds of spectband
157
158    WRITE(lunout,*) 'Debut phys_output_mod.F90'
159    ! Initialisations (Valeurs par defaut
160
161    DO ilev=1,klev
162      Ahyb_bounds(ilev,1) = ap(ilev)
163      Ahyb_bounds(ilev,2) = ap(ilev+1)
164      Bhyb_bounds(ilev,1) = bp(ilev)
165      Bhyb_bounds(ilev,2) = bp(ilev+1)
166      lev_index(ilev) = REAL(ilev)
167    END DO
168      lev_index(klev+1) = REAL(klev+1)
169
170    IF (.NOT. ALLOCATED(o_trac)) ALLOCATE(o_trac(nqtot))
171    IF (.NOT. ALLOCATED(o_trac_cum)) ALLOCATE(o_trac_cum(nqtot))
172    ALLOCATE(o_dtr_the(nqtot),o_dtr_con(nqtot),o_dtr_lessi_impa(nqtot))
173    ALLOCATE(o_dtr_lessi_nucl(nqtot),o_dtr_insc(nqtot),o_dtr_bcscav(nqtot))
174    ALLOCATE(o_dtr_evapls(nqtot),o_dtr_ls(nqtot),o_dtr_trsp(nqtot))
175    ALLOCATE(o_dtr_sscav(nqtot),o_dtr_sat(nqtot),o_dtr_uscav(nqtot))
176    ALLOCATE(o_dtr_dry(nqtot),o_dtr_vdf(nqtot))
177IF (CPPKEY_STRATAER) THEN
178    ALLOCATE(o_nd_mode(nbtr_bin),o_sulfmmr_mode(nbtr_bin))
179END IF
180#ifdef ISO
181    ALLOCATE(o_xtprecip(ntraciso))
182    ALLOCATE(o_xtplul(ntraciso))
183    ALLOCATE(o_xtpluc(ntraciso))
184    ALLOCATE(o_xtevap(ntraciso))
185    ALLOCATE(o_xtevap_srf(ntraciso,4))
186    ALLOCATE(o_xtovap(ntraciso))
187    ALLOCATE(o_xtoliq(ntraciso))
188    ALLOCATE(o_xtcond(ntraciso))
189    ALLOCATE(o_xtrunoff_diag(ntraciso))
190    ALLOCATE(o_dxtdyn(ntraciso))
191    ALLOCATE(o_dxtldyn(ntraciso))
192    ALLOCATE(o_dxtcon(ntraciso))
193    ALLOCATE(o_dxtlsc(ntraciso))
194    ALLOCATE(o_dxteva(ntraciso))
195    ALLOCATE(o_dxtajs(ntraciso))
196    ALLOCATE(o_dxtvdf(ntraciso))
197    ALLOCATE(o_dxtthe(ntraciso))
198    ALLOCATE(o_dxtch4(ntraciso))
199    if (iso_HTO.gt.0) then
200      ALLOCATE(o_dxtprod_nucl(ntraciso))
201      ALLOCATE(o_dxtcosmo(ntraciso))
202      ALLOCATE(o_dxtdecroiss(ntraciso))
203    endif
204#endif
205
206    levmax = [klev, klev, klev, klev, klev, klev, nlevSTD, nlevSTD, nlevSTD, klev]
207
208    phys_out_filenames(1) = 'histmth'
209    phys_out_filenames(2) = 'histday'
210    phys_out_filenames(3) = 'histhf6h'
211    phys_out_filenames(4) = 'histhf3h'
212    phys_out_filenames(5) = 'histhf3hm'
213    phys_out_filenames(6) = 'histstn'
214    phys_out_filenames(7) = 'histmthNMC'
215    phys_out_filenames(8) = 'histdayNMC'
216    phys_out_filenames(9) = 'histhfNMC'
217    phys_out_filenames(10)= 'histstrataer'
218
219    type_ecri(1) = 'ave(X)'
220    type_ecri(2) = 'ave(X)'
221    type_ecri(3) = 'inst(X)'
222    type_ecri(4) = 'inst(X)'
223    type_ecri(5) = 'ave(X)'
224    type_ecri(6) = 'inst(X)'
225    type_ecri(7) = 'inst(X)'
226    type_ecri(8) = 'inst(X)'
227    type_ecri(9) = 'inst(X)'
228    type_ecri(10)= 'ave(X)'
229
230    clef_files(1) = ok_mensuel
231    clef_files(2) = ok_journe
232    clef_files(3) = ok_hf
233    clef_files(4) = ok_instan
234    clef_files(5) = ok_LES
235    clef_files(6) = ok_instan
236    clef_files(7) = ok_histNMC(1)
237    clef_files(8) = ok_histNMC(2)
238    clef_files(9) = ok_histNMC(3)
239    IF (CPPKEY_STRATAER) THEN
240      clef_files(10)= .TRUE.
241    ELSE
242      clef_files(10)= .FALSE.
243    END IF
244
245    !sortir des fichiers "stations" si clef_stations(:)=.TRUE.
246    clef_stations(1) = .FALSE.
247    clef_stations(2) = .FALSE.
248    clef_stations(3) = .FALSE.
249    clef_stations(4) = .FALSE.
250    clef_stations(5) = .FALSE.
251    clef_stations(6) = .FALSE.
252    clef_stations(7) = .FALSE.
253    clef_stations(8) = .FALSE.
254    clef_stations(9) = .FALSE.
255    clef_stations(10)= .FALSE.
256
257    lev_files(1) = lev_histmth
258    lev_files(2) = lev_histday
259    lev_files(3) = lev_histhf
260    lev_files(4) = lev_histins
261    lev_files(5) = lev_histLES
262    lev_files(6) = lev_histins
263    lev_files(7) = levout_histNMC(1)
264    lev_files(8) = levout_histNMC(2)
265    lev_files(9) = levout_histNMC(3)
266    lev_files(10)= 5
267
268    ecrit_files(1) = ecrit_mth
269    ecrit_files(2) = ecrit_day
270    ecrit_files(3) = ecrit_hf
271    ecrit_files(4) = ecrit_ins
272    ecrit_files(5) = ecrit_LES
273    ecrit_files(6) = ecrit_ins
274    ecrit_files(7) = freq_outNMC(1)
275    ecrit_files(8) = freq_outNMC(2)
276    ecrit_files(9) = freq_outNMC(3)
277    ecrit_files(10)= ecrit_mth
278
279    !! Lectures des parametres de sorties dans physiq.def
280
281    CALL getin('phys_out_regfkey',phys_out_regfkey)
282    CALL getin('phys_out_lonmin',phys_out_lonmin)
283    CALL getin('phys_out_lonmax',phys_out_lonmax)
284    CALL getin('phys_out_latmin',phys_out_latmin)
285    CALL getin('phys_out_latmax',phys_out_latmax)
286    phys_out_levmin(:)=levmin(:)
287    CALL getin('phys_out_levmin',levmin)
288    phys_out_levmax(:)=levmax(:)
289    CALL getin('phys_out_levmax',levmax)
290    CALL getin('phys_out_filenames',phys_out_filenames)
291    phys_out_filekeys(:)=clef_files(:)
292    CALL getin('phys_out_filekeys',clef_files)
293    phys_out_filestations(:)=clef_stations(:)
294    CALL getin('phys_out_filestations',clef_stations)
295    phys_out_filelevels(:)=lev_files(:)
296    CALL getin('phys_out_filelevels',lev_files)
297    CALL getin('phys_out_filetimesteps',chtimestep)
298    phys_out_filetypes(:)=type_ecri(:)
299    CALL getin('phys_out_filetypes',type_ecri)
300
301    type_ecri_files(:)=type_ecri(:)
302
303!    if (ok_all_xml) phys_out_filelevels = 999
304
305    WRITE(lunout,*)'phys_out_lonmin=',phys_out_lonmin
306    WRITE(lunout,*)'phys_out_lonmax=',phys_out_lonmax
307    WRITE(lunout,*)'phys_out_latmin=',phys_out_latmin
308    WRITE(lunout,*)'phys_out_latmax=',phys_out_latmax
309    WRITE(lunout,*)'phys_out_filenames=',phys_out_filenames
310    WRITE(lunout,*)'phys_out_filetypes=',type_ecri
311    WRITE(lunout,*)'phys_out_filekeys=',clef_files
312    WRITE(lunout,*)'phys_out_filestations=',clef_stations
313    WRITE(lunout,*)'phys_out_filelevels=',lev_files
314    WRITE(lunout,*)'phys_out_regfkey=',phys_out_regfkey
315
316! A noter pour
317! l heure initiale - dans les fichiers histoire hist* - on met comme 
318! heure de debut soit la vraie heure (pour le 1D) soit 0h (pour le 3D)
319! afin d avoir une seule sortie mensuelle par mois lorsque l on tourne
320! par annee (IM).
321!
322     idayref = day_ref
323     IF (klon_glo==1) THEN
324       ! current_time (used to compute hour) is updated at the begining of
325       ! the physics; to set the correct outputs "initial time" we thus
326       ! have to use (hour-dtphys).
327         CALL ymds2ju(annee_ref, 1, idayref, hour-pdtphys, zjulian)
328         print *,'phys_output_mod: annee,iday,hour,zjulian=',annee_ref,idayref, hour, zjulian
329     ELSE
330         CALL ymds2ju(annee_ref, 1, idayref, 0.0, zjulian)
331         CALL ymds2ju(annee_ref, 1, day_ini, start_time*rday, zjulian_start)
332     ENDIF
333
334    IF (using_xios) THEN
335      ! ug R\'eglage du calendrier xios
336      !Temps julian => an, mois, jour, heure
337      CALL ju2ymds(zjulian, x_an, x_mois, x_jour, x_heure)
338      CALL ju2ymds(zjulian_start, ini_an, ini_mois, ini_jour, ini_heure)
339      CALL wxios_set_cal(dtime, calend, x_an, x_mois, x_jour, x_heure, ini_an, &
340                         ini_mois, ini_jour, ini_heure )
341    ENDIF
342
343!!!!!!!!!!!!!!!!!!!!!!! Boucle sur les fichiers !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
344    ! Appel de histbeg et histvert pour creer le fichier et les niveaux verticaux !!
345    ! Appel des histbeg pour definir les variables (nom, moy ou inst, freq de sortie ..
346!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
347
348    zdtime_moy = dtime         ! Frequence ou l on moyenne
349
350
351  ecrit_files(7) = ecrit_files(1)
352  ecrit_files(8) = ecrit_files(2)
353  ecrit_files(9) = ecrit_files(3)
354
355  DO iff=1,nfiles
356
357       ! Calculate ecrit_files for all files
358      IF ( chtimestep(iff).eq.'Default' ) THEN
359          ! Par defaut ecrit_files = (ecrit_mensuel ecrit_jour ecrit_hf
360          ! ...)*86400.
361          ecrit_files(iff)=ecrit_files(iff)*86400.
362      ELSE IF (chtimestep(iff).eq.'-1') THEN
363          PRINT*,'ecrit_files(',iff,') < 0 so IOIPSL work on different'
364          PRINT*,'months length'
365          ecrit_files(iff)=-1.
366      ELSE
367       CALL convers_timesteps(chtimestep(iff),dtime,ecrit_files(iff))
368      ENDIF
369
370       WRITE(lunout,*)'ecrit_files(',iff,')= ',ecrit_files(iff)
371       zoutm(iff) = ecrit_files(iff) ! Frequence ou l on ecrit en seconde
372
373
374    IF (using_xios) THEN
375      !!! Ouverture de chaque fichier XIOS !!!!!!!!!!!
376      IF (.not. ok_all_xml) THEN
377        IF (prt_level >= 10) THEN
378         print*,'phys_output_open: call wxios_add_file with phys_out_filenames(iff)=',trim(phys_out_filenames(iff))   
379        ENDIF
380        CALL wxios_add_file(phys_out_filenames(iff),chtimestep(iff),lev_files(iff)) 
381      ENDIF
382
383      !!! Declaration des axes verticaux de chaque fichier:
384      IF (prt_level >= 10) THEN
385        print*,'phys_output_open: Declare vertical axes for each file'
386      ENDIF
387
388      IF (iff.LE.6.OR.iff.EQ.10) THEN
389        CALL wxios_add_vaxis("presnivs", &
390              levmax(iff) - levmin(iff) + 1, presnivs(levmin(iff):levmax(iff)))
391        CALL wxios_add_vaxis("presinter", &
392              klev + 1, presinter(1:klev+1))
393        CALL wxios_add_vaxis("Ahyb", &
394              levmax(iff) - levmin(iff) + 1, aps(levmin(iff):levmax(iff)), positif='down', &
395              bnds=Ahyb_bounds(levmin(iff):levmax(iff),:))
396        CALL wxios_add_vaxis("Bhyb", &
397              levmax(iff) - levmin(iff) + 1, bps(levmin(iff):levmax(iff)), positif='down', &
398              bnds=Bhyb_bounds(levmin(iff):levmax(iff),:))
399        CALL wxios_add_vaxis("klev", levmax(iff) - levmin(iff) + 1, &
400                              lev_index(levmin(iff):levmax(iff)))
401        CALL wxios_add_vaxis("klevp1", klev+1, &
402                              lev_index(1:klev+1))
403        CALL wxios_add_vaxis("bnds", 2, (/1.,2./))
404 
405        CALL wxios_add_vaxis("Alt", &
406                levmax(iff) - levmin(iff) + 1, pseudoalt)
407
408        ! wl1_sun/wl2_sun: minimum/maximum bound of wavelength (in um)
409        SELECT CASE(NSW)
410          CASE(6)
411            wl1_sun(1:6) = [0.180, 0.250, 0.440, 0.690, 1.190, 2.380]
412            wl2_sun(1:6) = [0.250, 0.440, 0.690, 1.190, 2.380, 4.000]
413          CASE(2)
414            wl1_sun(1:2) = [0.250, 0.690]
415            wl2_sun(1:2) = [0.690, 4.000]
416        END SELECT
417
418        DO ISW=1, NSW
419          wn1_sun(ISW)=1.e+6/wl1_sun(ISW)
420          wn2_sun(ISW)=1.e+6/wl2_sun(ISW)
421          spbnds_sun(ISW,1)=wn2_sun(ISW)
422          spbnds_sun(ISW,2)=wn1_sun(ISW)
423          spectband(ISW)=(wn1_sun(ISW)+wn2_sun(ISW))/2
424        ENDDO
425!
426!!! ajout axe vertical spectband : solar band number
427        CALL wxios_add_vaxis("spectband", NSW, spectband, positif='down')
428      ELSE
429        ! NMC files
430        CALL wxios_add_vaxis("plev", &
431                levmax(iff) - levmin(iff) + 1, rlevSTD(levmin(iff):levmax(iff)))
432      ENDIF
433    ENDIF !using_xios
434
435        IF (clef_files(iff)) THEN
436!!!!!!!!!!!!!!!!! Traitement dans le cas ou l'on veut stocker sur un domaine limite !!
437!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
438          IF (phys_out_regfkey(iff)) THEN
439             imin_ins=1
440             imax_ins=nbp_lon
441             jmin_ins=1
442             jmax_ins=jjmp1
443
444             ! correction abderr       
445             DO i=1,nbp_lon
446                WRITE(lunout,*)'io_lon(i)=',io_lon(i)
447                IF (io_lon(i).le.phys_out_lonmin(iff)) imin_ins=i
448                IF (io_lon(i).le.phys_out_lonmax(iff)) imax_ins=i+1
449             ENDDO
450
451             DO j=1,jjmp1
452                WRITE(lunout,*)'io_lat(j)=',io_lat(j)
453                IF (io_lat(j).ge.phys_out_latmin(iff)) jmax_ins=j+1
454                IF (io_lat(j).ge.phys_out_latmax(iff)) jmin_ins=j
455             ENDDO
456
457             WRITE(lunout,*)'On stoke le fichier histoire numero ',iff,' sur ', &
458                  imin_ins,imax_ins,jmin_ins,jmax_ins
459             WRITE(lunout,*)'longitudes : ', &
460                  io_lon(imin_ins),io_lon(imax_ins), &
461                  'latitudes : ', &
462                  io_lat(jmax_ins),io_lat(jmin_ins)
463
464             CALL histbeg(phys_out_filenames(iff),nbp_lon,io_lon,jjmp1,io_lat, &
465                  imin_ins,imax_ins-imin_ins+1, &
466                  jmin_ins,jmax_ins-jmin_ins+1, &
467                  itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
468!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
469             !IM fichiers stations
470          ELSE IF (clef_stations(iff)) THEN
471
472             IF (prt_level >= 10) THEN
473             WRITE(lunout,*)'phys_output_open: iff=',iff,'  phys_out_filenames(iff)=',phys_out_filenames(iff)
474             ENDIF
475             
476             CALL histbeg_phy_all(rlon,rlat,pim,tabij,ipt,jpt,plon,plat,plon_bounds,plat_bounds, &
477                  phys_out_filenames(iff), &
478                  itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
479          ELSE
480
481             IF (prt_level >= 10) THEN
482             WRITE(lunout,*)'phys_output_open: iff=',iff,'  phys_out_filenames(iff)=',phys_out_filenames(iff)
483             ENDIF
484
485             CALL histbeg_phy_all(phys_out_filenames(iff),itau_phy,zjulian,&
486                 dtime,nhorim(iff),nid_files(iff))
487          ENDIF
488
489#ifndef CPP_IOIPSL_NO_OUTPUT
490          IF (iff.LE.6.OR.iff.EQ.10) THEN
491             CALL histvert(nid_files(iff), "presnivs", "Vertical levels", "Pa", & 
492               levmax(iff) - levmin(iff) + 1, &
493               presnivs(levmin(iff):levmax(iff)), nvertm(iff),"down")
494!!!! Composantes de la coordonnee sigma-hybride
495          CALL histvert(nid_files(iff), "Ahyb","Ahyb comp of Hyb Cord ", "Pa", &
496               levmax(iff) - levmin(iff) + 1,aps,nvertap(iff))
497
498          CALL histvert(nid_files(iff), "Bhyb","Bhyb comp of Hyb Cord", " ", &
499               levmax(iff) - levmin(iff) + 1,bps,nvertbp(iff))
500
501          CALL histvert(nid_files(iff), "Alt","Height approx for scale heigh of 8km at levels", "Km", &                       
502               levmax(iff) - levmin(iff) + 1,pseudoalt,nvertAlt(iff))
503
504          ELSE
505          ! NMC files
506             CALL histvert(nid_files(iff), "plev", "pressure", "Pa", &
507               levmax(iff) - levmin(iff) + 1, &
508              rlevSTD(levmin(iff):levmax(iff)), nvertm(iff), "down")
509          ENDIF
510#endif
511
512     ENDIF ! clef_files
513
514          itr = 0; itrb = 0
515          DO iq = 1, nqtot
516            IF(.NOT.(tracers(iq)%isAdvected .AND. tracers(iq)%isInPhysics)) CYCLE
517            itr = itr + 1
518            dn = 'd'//TRIM(tracers(iq)%name)//'_'
519
520            flag = [1, 5, 5, 5, 10, 10, 11, 11, 11, 11]
521            lnam = 'Tracer '//TRIM(tracers(iq)%longName)
522            tnam = TRIM(tracers(iq)%name);  o_trac          (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
523
524            flag = [4, 7, 7, 7, 10, 10, 11, 11, 11, 11]
525            lnam = 'Tendance tracer '//TRIM(tracers(iq)%longName)
526            tnam = TRIM(dn)//'vdf';         o_dtr_vdf       (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
527
528            flag = [5, 7, 7, 7, 10, 10, 11, 11, 11, 11]
529            tnam = TRIM(dn)//'the';         o_dtr_the       (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
530            tnam = TRIM(dn)//'con';         o_dtr_con       (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
531
532            flag = [7, 7, 7, 7, 10, 10, 11, 11, 11, 11]
533            tnam = TRIM(dn)//'lessi_impa';  o_dtr_lessi_impa(itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
534            tnam = TRIM(dn)//'lessi_nucl';  o_dtr_lessi_nucl(itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
535            tnam = TRIM(dn)//'insc';        o_dtr_insc      (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
536            tnam = TRIM(dn)//'bcscav';      o_dtr_bcscav    (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
537            tnam = TRIM(dn)//'evapls';      o_dtr_evapls    (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
538            tnam = TRIM(dn)//'ls';          o_dtr_ls        (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
539            tnam = TRIM(dn)//'trsp';        o_dtr_trsp      (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
540            tnam = TRIM(dn)//'sscav';       o_dtr_sscav     (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
541            tnam = TRIM(dn)//'sat';         o_dtr_sat       (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
542            tnam = TRIM(dn)//'uscav';       o_dtr_uscav     (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
543
544            lnam = 'tracer tendency dry deposition'//TRIM(tracers(iq)%longName)
545            tnam = 'cum'//TRIM(dn)//'dry';  o_dtr_dry       (itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
546
547            flag = [1, 4, 10, 10, 10, 10, 11, 11, 11, 11]
548            lnam = 'Cumulated tracer '//TRIM(tracers(iq)%longName)
549            tnam = 'cum'//TRIM(tracers(iq)%name); o_trac_cum(itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
550           
551IF (CPPKEY_STRATAER) THEN
552            if(tracers(iq)%name(1:3)=='BIN') then
553               itrb = itrb + 1
554               flag = [11, 11, 11, 11, 11, 11, 11, 11, 11, 1]
555               lnam = 'Dry particle concentration in '//TRIM(tracers(iq)%longName)
556               tnam = TRIM(tracers(iq)%name)//'_nd_mode';     o_nd_mode       (itrb) = ctrl_out(flag, tnam, lnam, "part/m3", [('',i=1,nfiles)])
557               lnam = 'Sulfate MMR in '//TRIM(tracers(iq)%longName)
558               tnam = TRIM(tracers(iq)%name)//'_sulfmmr_mode';o_sulfmmr_mode  (itrb) = ctrl_out(flag, tnam, lnam, "kg(H2SO4)/kg(air)", [('',i=1,nfiles)])
559            endif
560END IF
561         ENDDO
562
563   ENDDO !  iff
564
565#ifdef ISO
566    write(*,*) 'phys_output_mid 589'
567    do ixt=1,ntraciso
568      outiso = TRIM(isoName(ixt))
569      i = INDEX(outiso, '_', .TRUE.)
570      outiso = outiso(1:i-1)//outiso(i+1:LEN_TRIM(outiso))
571
572      flag = [1,  1,  1, 10,  5, 10, 11, 11, 11, 11]; unit = 'kg/(s*m2)'
573      o_xtprecip(ixt)=ctrl_out(flag, 'precip'//TRIM(outiso), 'Precip Totale liq+sol', unit, [('',i=1,nfiles)])
574      o_xtpluc  (ixt)=ctrl_out(flag,   'pluc'//TRIM(outiso),    'Convective Precip.', unit, [('',i=1,nfiles)])
575
576      flag = [1,  1,  1, 10, 10, 10, 11, 11, 11, 11]
577      o_xtplul  (ixt)=ctrl_out(flag,   'plul'//TRIM(outiso),   'Large-scale Precip.', unit, [('',i=1,nfiles)])
578      o_xtevap  (ixt)=ctrl_out(flag,   'evap'//TRIM(outiso),             'Evaporat.', unit, [('',i=1,nfiles)])
579
580      ! ajout Camille 8 mai 2023
581      flag = [1, 6, 10, 10, 10, 10, 11, 11, 11, 11]
582      o_xtevap_srf (ixt,1)=ctrl_out(flag,   'evap_ter'//TRIM(outiso), 'Evap sfc'//clnsurf(1), unit, [('',i=1,nfiles)])
583      o_xtevap_srf (ixt,2)=ctrl_out(flag,   'evap_lic'//TRIM(outiso), 'Evap sfc'//clnsurf(2), unit, [('',i=1,nfiles)])
584      o_xtevap_srf (ixt,3)=ctrl_out(flag,   'evap_oce'//TRIM(outiso), 'Evap sfc'//clnsurf(3), unit, [('',i=1,nfiles)])
585      o_xtevap_srf (ixt,4)=ctrl_out(flag,   'evap_sic'//TRIM(outiso), 'Evap sfc'//clnsurf(4), unit, [('',i=1,nfiles)])
586
587      flag = [2,  3,  4, 10, 10, 10, 11, 11, 11, 11]; unit = 'kg/kg'
588      o_xtovap  (ixt)=ctrl_out(flag,   'ovap'//TRIM(outiso),     'Specific humidity', unit, [('',i=1,nfiles)])
589      o_xtoliq  (ixt)=ctrl_out(flag,   'oliq'//TRIM(outiso),          'Liquid water', unit, [('',i=1,nfiles)])
590      o_xtcond  (ixt)=ctrl_out(flag,  'ocond'//TRIM(outiso),       'Condensed water', unit, [('',i=1,nfiles)])
591
592      flag = [1,  1,  1, 10, 5, 10, 11, 11, 11, 11]; unit = 'kg/m2/s'
593      o_xtrunoff_diag  (ixt)=ctrl_out(flag, 'runoffland'//TRIM(outiso), 'Run-off rate land for bucket', unit, [('',i=1,nfiles)])
594
595      flag = [4, 10, 10, 10, 10, 10, 11, 11, 11, 11]; unit = '(kg/kg)/s'
596      o_dxtdyn  (ixt)=ctrl_out(flag,  'dqdyn'//TRIM(outiso),           'Dynamics dQ', unit, [('',i=1,nfiles)])
597      o_dxtldyn (ixt)=ctrl_out(flag, 'dqldyn'//TRIM(outiso),          'Dynamics dQL', unit, [('',i=1,nfiles)])
598      o_dxtcon  (ixt)=ctrl_out(flag,  'dqcon'//TRIM(outiso),         'Convection dQ', unit, [('',i=1,nfiles)])
599      o_dxteva  (ixt)=ctrl_out(flag,  'dqeva'//TRIM(outiso),      'Reevaporation dQ', unit, [('',i=1,nfiles)])
600      o_dxtlsc  (ixt)=ctrl_out(flag,  'dqlsc'//TRIM(outiso),       'Condensation dQ', unit, [('',i=1,nfiles)])
601      o_dxtajs  (ixt)=ctrl_out(flag,  'dqajs'//TRIM(outiso),        'Dry adjust. dQ', unit, [('',i=1,nfiles)])
602      o_dxtvdf  (ixt)=ctrl_out(flag,  'dqvdf'//TRIM(outiso),     'Boundary-layer dQ', unit, [('',i=1,nfiles)])
603      o_dxtthe  (ixt)=ctrl_out(flag,  'dqthe'//TRIM(outiso),            'Thermal dQ', unit, [('',i=1,nfiles)])
604
605      IF(ok_qch4) o_dxtch4(ixt)=ctrl_out(flag, 'dqch4'//TRIM(outiso), 'H2O due to CH4 oxidation & photolysis', &
606                                                                                      unit, [('',i=1,nfiles)])
607      IF(ixt == iso_HTO) THEN
608      o_dxtprod_nucl(ixt)=ctrl_out(flag, 'dqprodnucl'//TRIM(outiso), 'dHTO/dt due to nuclear production',      &
609                                                                                      unit, [('',i=1,nfiles)])
610      o_dxtcosmo    (ixt)=ctrl_out(flag,    'dqcosmo'//TRIM(outiso), 'dHTO/dt due to cosmogenic production',   &
611                                                                                      unit, [('',i=1,nfiles)])
612      o_dxtdecroiss (ixt)=ctrl_out(flag, 'dqdecroiss'//TRIM(outiso), 'dHTO/dt due to radiative destruction',   &
613                                                                                      unit, [('',i=1,nfiles)])
614      END IF
615    enddo !do ixt=1,niso
616    write(*,*) 'phys_output_mid 596'
617#endif
618
619   ! Updated write frequencies due to phys_out_filetimesteps.
620    ! Write frequencies are now in seconds. 
621    ecrit_mth = ecrit_files(1)
622    ecrit_day = ecrit_files(2)
623    ecrit_hf  = ecrit_files(3)
624    ecrit_ins = ecrit_files(4)
625    ecrit_LES = ecrit_files(5)
626    ecrit_ins = ecrit_files(6)
627
628    IF (prt_level >= 10) THEN
629      WRITE(lunout,*)'swaerofree_diag=',swaerofree_diag
630      WRITE(lunout,*)'swaero_diag=',swaero_diag
631      WRITE(lunout,*)'dryaod_diag=',dryaod_diag
632      WRITE(lunout,*)'ok_4xCO2atm=',ok_4xCO2atm
633      WRITE(lunout,*)'phys_output_open: ends here'
634    ENDIF
635
636!  DO iq=1,nqtot
637!    IF(.NOT.(tracers(iq)%isAdvected .AND. tracers(iq)%isInPhysics)) CYCLE
638!    WRITE(*,'(a,i1,a,10i3)')'trac(',iq,')%flag = ',o_trac(iq)%flag
639!    WRITE(*,'(a,i1,a)')'trac(',iq,')%name = '//TRIM(o_trac(iq)%name)
640!    WRITE(*,'(a,i1,a)')'trac(',iq,')%description = '//TRIM(o_trac(iq)%description)
641!  END DO
642
643  END SUBROUTINE phys_output_open
644
645  SUBROUTINE convers_timesteps(str,dtime,timestep)
646
647    use ioipsl
648    USE phys_cal_mod
649    USE time_phylmdz_mod, ONLY: day_ref, annee_ref
650    USE print_control_mod, ONLY: lunout
651
652    IMPLICIT NONE
653
654    CHARACTER(LEN=20)   :: str
655    CHARACTER(LEN=10)   :: type
656    INTEGER             :: ipos,il
657    real                :: ttt,xxx,timestep,dayseconde,dtime
658    parameter (dayseconde=86400.)
659
660    ipos=scan(str,'0123456789.',.TRUE.)
661    ! 
662    il=len_trim(str)
663    WRITE(lunout,*) "ipos = ", ipos
664    WRITE(lunout,*) "il = ", il
665    IF (ipos == 0) CALL abort_physic("convers_timesteps", "bad str", 1)
666    read(str(1:ipos),*) ttt
667    WRITE(lunout,*)ttt
668    type=str(ipos+1:il)
669
670    IF ( il == ipos ) THEN
671       type='day'
672    ENDIF
673
674    IF ( type == 'day'.or.type == 'days'.or.type == 'd'.or.type == 'jours'.or.type == 'jour'.or.type == 'j' )&
675           &  timestep = ttt * dayseconde
676    IF ( type == 'months'.or.type == 'month'.or.type == 'mth'.or.type == 'mois'.or.type == 'm' ) THEN
677       WRITE(lunout,*)'annee_ref,day_ref mon_len',annee_ref,day_ref,mth_len
678       timestep = ttt * dayseconde * mth_len
679    ENDIF
680    IF ( type == 'hours'.or.type == 'hour'.or.type == 'hr'.or.type == 'heures'.or.type == 'heure'.or.type =='h' )&
681           &  timestep = ttt * dayseconde / 24.
682    IF ( type == 'mn'.or.type == 'minutes'.or.type == 'minute'.or.type == 'm' ) timestep = ttt * 60.
683    IF ( type == 's'.or.type == 'sec'.or.type == 'secondes'.or.type =='seconde'   ) timestep = ttt
684    IF ( type == 'TS' ) timestep = ttt * dtime
685
686    WRITE(lunout,*)'type =      ',type
687    WRITE(lunout,*)'nb j/h/m =  ',ttt
688    WRITE(lunout,*)'timestep(s)=',timestep
689
690  END SUBROUTINE convers_timesteps
691
692END MODULE phys_output_mod
Note: See TracBrowser for help on using the repository browser.