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

Last change on this file since 5452 was 3003, checked in by Laurent Fairhead, 7 years ago

Modifications to the code and xml files to output Ap and B, the coefficients
of the hybrid coordinates as requested by the CMIP6 DataRequest?
LF (with guidance from A. Caubel and S. Senesi)

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