Skip to content
Snippets Groups Projects
write_lfin.f90 78.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
    
    !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    
    !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
    
    !MNH_LIC for details. version 1.
    
    !-----------------------------------------------------------------
    !--------------- special set of characters for RCS information
    !-----------------------------------------------------------------
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    ! $Source: /srv/cvsroot/MNH-VX-Y-Z/src/MNH/write_lfin.f90,v $ $Revision: 1.2.2.4.2.4.2.8.2.4.2.5 $
    
    ! masdev4_7 BUG1 2007/06/20 16:58:20
    
    !-----------------------------------------------------------------
    !     #########################
          MODULE MODI_WRITE_LFIFM_n
    !     #########################
    !
    INTERFACE
    !
    
    SUBROUTINE WRITE_LFIFM_n(TPFILE,HDADFILE)
    
    CHARACTER(LEN=28), INTENT(IN) :: HDADFILE     ! corresponding FM-file name of 
                                                  ! its DAD model
    
    TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
    
    END SUBROUTINE WRITE_LFIFM_n
    !
    END INTERFACE
    !
    END MODULE MODI_WRITE_LFIFM_n
    !
    !
    !     ##########################################
    
          SUBROUTINE WRITE_LFIFM_n(TPFILE,HDADFILE)
    
    !     ##########################################
    !
    !!****  *WRITE_LFIFM_n* - routine to write a LFIFM file for model $n
    !!
    !!    PURPOSE
    !!    -------
    !        The purpose of this routine is to write an initial LFIFM File 
    
    !     of name YFMFILE//'.lfi' with the FM routines.  
    
    !
    !!**  METHOD
    !!    ------
    !!      The data are written in the LFIFM file :
    !!        - dimensions
    !!        - grid variables
    !!        - configuration variables
    !!        - prognostic variables at time t and t-dt
    !!        - 1D anelastic reference state
    !!
    !!      The localization on the model grid is also indicated :
    !!
    !!        IGRID = 1 for mass grid point
    !!        IGRID = 2 for U grid point
    !!        IGRID = 3 for V grid point
    !!        IGRID = 4 for w grid point
    !!        IGRID = 0 for meaningless case
    !!          
    !!
    !!    EXTERNAL
    !!    --------
    !!      WRITE_BALLOON_n : routine to write balloon records
    !!      WRITE_LB_n : routine to write LB fields
    !!      FMWRIT     : FM-routine to write a record
    !!
    !!
    !!    IMPLICIT ARGUMENTS
    !!    ------------------
    !!      Module MODD_DIM_n   : contains dimensions
    !!      Module MODD_TIME    : contains time variables for all models
    !!      Module MODD_TIME_n   : contains time variables 
    !!      Module MODD_GRID    : contains spatial grid variables for all models
    !!      Module MODD_GRID_n : contains spatial grid variables
    !!      Module MODD_REF     : contains reference state variables
    !!      Module MODD_LUNIT_n: contains logical unit variables.
    !!      Module MODD_CONF    : contains configuration variables for all models
    !!      Module MODD_CONF_n  : contains configuration variables
    !!      Module MODD_FIELD_n  : contains prognostic variables
    !!      Module MODD_GR_FIELD_n : contains surface prognostic variables
    !!      Module MODD_LSFIELD_n  : contains Larger Scale variables
    !!      Module MODD_PARAM_n    : contains parameterization options
    !!      Module MODD_TURB_n    : contains turbulence options
    !!      Module MODD_FRC    : contains forcing variables
    !!      Module MODD_DEEP_CONVECTION_n : contains deep convection tendencies
    !!      Module MODD_PARAM_KAFR_n : contains configuration
    !!      Module MODD_AIRCRAFT_BALLOON : contains balloon and aircraft variables
    !!
    !!    REFERENCE
    !!    ---------
    !!
    !!
    !!    AUTHOR
    !!    ------
    !!  	V. Ducrocq   *Meteo France* 
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original    06/05/94 
    !!       V. Ducrocq    27/06/94                  
    !!       J.Stein       20/10/94 (name of the FMFILE)
    !!       J.Stein       06/12/94 add the LS fields   
    !!       J.P. Lafore   09/01/95 add the DRYMASST
    !!       J.Stein       20/01/95 add TKE and change the ycomment for the water 
    !!                              variables       
    !!       J.Stein       23/01/95 add a TKE switch and MODD_PARAM_n
    !!       J.Stein       16/03/95 remove R from the historical variables
    !!       J.Stein       20/03/95 add the EPS var.  
    !!       J.Stein       30/06/95 add the variables related to the subgrid condens
    !!       S. Belair     01/09/95 add surface variables and ground parameters
    !!       J.-P. Pinty   15/09/95 add the radiation parameters
    !!       J.Stein       23/01/96 add the TSZ0 option for the surface scheme
    !!       M.Georgelin   13/12/95 add the forcing variables 
    !!       J.-P. Pinty   15/02/96 add external control for the forcing
    !!       J.Stein P.Bougeault  15/03/96 add the cloud fraction and change the
    !!                                     surface parameters for TSZ0 option
    !!       J.Stein P.Jabouille  30/04/96 add the storage type
    !!       J.Stein P.Jabouille  20/05/96 switch for XSIGS and XSRC 
    !!       J.Stein              10/10/96 change Xsrc into XSRCM and XRCT
    
    !!       J.P. Lafore          30/07/96 add YFMFILE and HDADFILE writing
    
    !!                                     corresponding to MY_NAME and DAD_NAME (for nesting)
    !!       V.Masson      08/10/96 add LTHINSHELL
    !!       J.-P. Pinty   15/12/96 add the microphysics (ice)
    !!       J.-P. Pinty   11/01/97 add the deep convection
    !!       J.-P. Pinty   27/01/97 split the recording of the SV array
    !!       J.-P. Pinty   29/01/97 set recording of PRCONV and PACCONV in mm/h and
    !!                                                         mm respectively
    !!       J. Viviand    04/02/97 convert precipitation rates in mm/h
    !!       J.P. Lafore   25/11/96 resolution ratio and position for nesting
    !!       J.P. Lafore   26/02/97 adding of "surfacic" LS fields
    !!       J.Stein       22/06/97 use the absolute pressure
    !!       V.Masson      09/07/97 add directional z0 and Subgrid-Scale Orography
    !!       V.Masson      18/08/97 call to fmwrit directly with dates and strings
    !!       J.Stein       22/10/97 add the LB fields for U,V,W, THETA, RV....
    !!       P.Bechtold    24/01/98 add convective tracer tendencies
    !!       P.Jabouille   15/10/98 //
    !!       P.Jabouille   25/05/99 replace 'DTRAD_CLONLY' by 'DTRAD_CLLY' (size too long)
    !!       J. Stein      20/05/98 remove NXEND and NYEND
    !!       V. Masson     04/01/00 remove TSZ0 option
    !!       P. Jabouille  03/04/00 write XCIT only for MESONH program
    !!       K. Suhre      03/12/99 add chemical variable names                         
    !        F.solmon /V.Masson   06/00 adapt for patch surface variables
    !!       D.Gazen       22/01/01 use MODD_NSV and add names to scalar variables
    !!       G.Jaubert     06/06/01 add Balloon current positions
    !!       P.Jabouille   10/04/02 extra radiative surface flux
    !!       J.-P. Pinty   29/11/02 add C3R5, ICE2, ICE4, CELEC
    !!       V. Masson     01/2004  removes surface (externalization)
    !!                     05/2006  Remove KEPS
    !!       J. escobar    02/09/2009 missing YDIR for CLDFR variable
    !!                     October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after
    !!                                              change of YCOMMENT
    !!       P. Aumond     12/2009 Mean_UM,...
    !!       M. Leriche    16/07/10 add ice phase chemical species
    !!       C. Barthe     Jan. 2011  add diagnostics for elec
    !!       J. Escobar    Feb. 2012  replace MINVAL/MAXVAL by MIN_ll/MAX_ll in OUTPUT_LISTING
    !!       P.Peyrille    06/12 2D west african monsoon: ADV forcing and fluxes writing
    !!                     AEROSOLS and ozone vertical distribution are also written
    !!       M.Tomasini    06/12 2D west african monsoon: nesting for ADV forcing writing
    
    !!       Pialat/Tulet  15/02/2012 add ForeFire variables
    
    !!       J. Escobar    Mars 2014 , missing YDIR="XY" in 1.6 for tendencies fields 
    
    !!       J.escobar & M.Leriche 23/06/2014 Pb with JSA increment versus ini_nsv order initialization 
    
    !!       P. Tulet      Nov 2014 accumulated moles of aqueous species that fall at the surface
    
    !!       C.Lac         Dec.2014 writing past wind fields for centred advection
    
    !!       J.-P. Pinty   Jan 2015 add LNOx and flash map diagnostics
    
    !!       J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
    
    !!       P. Tulet & M. Leriche    Nov 2015 add mean pH value in the rain at the surface
    
    !!       J.escobar     04/08/2015 suit Pb with writ_lfin JSA increment , modif in ini_nsv to have good order initialization
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !!       Modification    01/2016  (JP Pinty) Add LIMA
    
    !!       M.Mazoyer     04/16 : Add supersaturation fields
    
    !!       P.Wautelet    11/07/2016 removed MNH_NCWRIT define
    
    !!                   
    !-------------------------------------------------------------------------------
    !
    !*       0.    DECLARATIONS
    !              ------------
    !
    USE MODD_DIM_n
    USE MODD_CONF
    USE MODD_CONF_n
    USE MODD_GRID
    USE MODD_GRID_n
    USE MODD_TIME
    USE MODD_TIME_n
    USE MODD_FIELD_n
    USE MODD_MEAN_FIELD_n
    USE MODD_DUMMY_GR_FIELD_n
    USE MODD_LSFIELD_n
    USE MODD_DYN_n
    USE MODD_PARAM_n
    USE MODD_REF
    USE MODD_LUNIT_n
    USE MODD_TURB_n
    USE MODD_RADIATIONS_n,   ONLY : XDTHRAD, NCLEARCOL_TM1, XFLALWD, &
                                    XZENITH, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD, &
    
                                    XDIRSRFSWD, XSCAFLASWD, XDIRFLASWD, XAZIM
    
    USE MODD_REF_n,  ONLY : XRHODREF
    USE MODD_FRC
    USE MODD_PRECIP_n
    USE MODD_ELEC_n
    USE MODD_CST
    USE MODD_CLOUDPAR
    USE MODD_DEEP_CONVECTION_n
    USE MODD_PARAM_KAFR_n
    USE MODD_NESTING
    USE MODD_PARAMETERS
    USE MODD_GR_FIELD_n
    USE MODD_CH_MNHC_n,       ONLY: LUSECHEM,LCH_CONV_LINOX, &
    
                                    LUSECHAQ,LUSECHIC,LCH_PH, XCH_PHINIT
    
    USE MODD_CH_PH_n
    USE MODD_CH_M9_n
    USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
    USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
    
    USE MODD_ELEC_DESCR,      ONLY: CELECNAMES, LLNOX_EXPLICIT
    
    USE MODD_LG,              ONLY: CLGNAMES
    USE MODD_NSV
    USE MODD_AIRCRAFT_BALLOON
    USE MODD_HURR_CONF, ONLY: LFILTERING,CFILTERING,NDIAG_FILT
    USE MODD_HURR_FIELD_n
    USE MODD_PREP_REAL, ONLY: CDUMMY_2D, XDUMMY_2D
    USE MODD_DUST
    USE MODD_SALT
    USE MODD_PASPOL
    
    #ifdef MNH_FOREFIRE
    USE MODD_FOREFIRE
    #endif
    
    USE MODD_CONDSAMP
    USE MODD_CH_AEROSOL
    
    USE MODD_PAST_FIELD_n
    
    USE MODD_ADV_n, ONLY: CUVW_ADV_SCHEME,XRTKEMS,CTEMP_SCHEME
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    USE MODD_PARAM_LIMA     , ONLY: NMOD_CCN, LSCAV, LAERO_MASS,                &
                                    NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI
    USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
    USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
    USE MODD_LIMA_PRECIP_SCAVENGING_n
    !
    
    USE MODE_FMWRIT
    USE MODE_ll
    
    USE MODD_IO_ll, ONLY: TFILEDATA
    USE MODE_FIELD, ONLY: TFIELDDATA
    
    USE MODE_IO_ll, ONLY: UPCASE,CLOSE_ll
    
    USE MODE_FIELD
    
    USE MODE_GRIDPROJ
    USE MODE_MODELN_HANDLER
    !
    USE MODI_GATHER_ll
    USE MODI_WRITE_LB_n
    USE MODI_WRITE_BALLOON_n
    USE MODI_DUSTLFI_n
    USE MODI_SALTLFI_n
    USE MODI_CH_AER_REALLFI_n
    !
    
    !20131128
    USE MODE_MPPDB
    USE MODE_EXTRAPOL
    
    ! Modif Eddy fluxes
    USE MODD_DEF_EDDY_FLUX_n       ! Ajout PP
    USE MODD_DEF_EDDYUV_FLUX_n     ! Ajout PP
    USE MODD_LATZ_EDFLX            ! Ajout PP
    !
    USE MODD_2D_FRC                  ! Ajout PP
    USE MODD_ADVFRC_n              ! Modif PP ADV FRC
    USE MODD_RELFRC_n
    !
    
    USE MODD_PARAM_C2R2
    
    ! 
    IMPLICIT NONE
    !
    !*       0.1   Declarations of arguments
    !
    CHARACTER(LEN=28), INTENT(IN) :: HDADFILE     ! corresponding FM-file name of 
                                                  ! its DAD model
    
    TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
    
    !
    !*       0.2   Declarations of local variables
    !
    INTEGER           :: ILUOUT         ! logical unit
    INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
                                        !in LFI subroutines at the open of the file              
    INTEGER           :: IGRID          ! IGRID : grid indicator
    INTEGER           :: ILENCH         ! ILENCH : length of comment string 
    !
    
    CHARACTER(LEN=28) :: YFMFILE        ! Name of FM-file to write
    
    CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be written
    CHARACTER(LEN=100):: YCOMMENT       ! Comment string
    CHARACTER (LEN=2) :: YDIR           ! Type of the data field
    !
    INTEGER           :: IRR            ! Index for moist variables
    INTEGER           :: JSV            ! loop index for scalar variables
    INTEGER           :: JSA            ! beginning of chemical-aerosol variables
    
    ! 
    CHARACTER(LEN=3)  :: YFRC           ! to mark the time of the forcing
    INTEGER           :: JT             ! loop index
    !
    INTEGER           :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX  ! dust modes
    ! 
    REAL,DIMENSION(:,:), ALLOCATABLE  :: ZWORK2D     ! Working array
    REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZWORK3D     ! Working array
    !
    REAL                              :: ZLATOR, ZLONOR ! geographical coordinates of 1st mass point
    REAL                              :: ZXHATM, ZYHATM ! conformal    coordinates of 1st mass point
    REAL, DIMENSION(:), ALLOCATABLE   :: ZXHAT_ll    !  Position x in the conformal
                                                     ! plane (array on the complete domain)
    REAL, DIMENSION(:), ALLOCATABLE   :: ZYHAT_ll    !   Position y in the conformal
                                                     ! plane (array on the complete domain)
    INTEGER :: IMI ! Current model index
    !
    INTEGER           :: ICH_NBR        ! to write number and names of scalar 
    INTEGER,DIMENSION(:),ALLOCATABLE :: ICH_NAMES !(chem+aero+dust) variables
    CHARACTER(LEN=16),DIMENSION(:),ALLOCATABLE :: YDSTNAMES,YCHNAMES, YSLTNAMES
    INTEGER           :: ILREC,ILENG    !in NSV.DIM and NSV.TITRE
    INTEGER           :: INFO_ll
    INTEGER :: IKRAD
    INTEGER           :: JI,JJ,JK   ! loop index
    INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !
    CHARACTER(LEN=2)  :: INDICE
    INTEGER           :: I
    
    !-------------------------------------------------------------------------------
    
    TYPE(TFIELDDATA) :: TZFIELD
    
    !
    !*	0. Initialization
    !
    IMI = GET_CURRENT_MODEL_INDEX()
    !
    CALL FMLOOK_ll(CLUOUT,CLUOUT,ILUOUT,IRESP)
    !
    
    ALLOCATE(ZWORK2D(SIZE(XTHT,1),SIZE(XTHT,2)))
    ALLOCATE(ZWORK3D(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)))
    
    !
    !*       0.2     ARRAYS BOUNDS INITIALIZATION
    !
    IIU=NIMAX+2*JPHEXT
    IJU=NJMAX+2*JPHEXT
    IKU=NKMAX+2*JPVEXT
    
    CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
    
    IKB=1+JPVEXT
    IKE=IKU-JPVEXT
    !
    !*       1.     WRITES IN THE LFI FILE
    ! 
    !
    
    !*       1.0    YFMFILE and HDADFILE writing :
    
    CALL IO_WRITE_FIELD(TPFILE,'MASDEV',  CLUOUT,IRESP,NMASDEV)
    CALL IO_WRITE_FIELD(TPFILE,'BUGFIX',  CLUOUT,IRESP,NBUGFIX)
    CALL IO_WRITE_FIELD(TPFILE,'BIBUSER', CLUOUT,IRESP,CBIBUSER)
    CALL IO_WRITE_FIELD(TPFILE,'PROGRAM', CLUOUT,IRESP,CPROGRAM)
    CALL IO_WRITE_FIELD(TPFILE,'FILETYPE',CLUOUT,IRESP,TPFILE%CTYPE)
    
    CALL IO_WRITE_FIELD(TPFILE,'MY_NAME', CLUOUT,IRESP,TPFILE%CNAME)
    CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',CLUOUT,IRESP,HDADFILE)
    
    !
    IF (LEN_TRIM(HDADFILE)>0) THEN
    
      CALL IO_WRITE_FIELD(TPFILE,'DXRATIO',CLUOUT,IRESP,NDXRATIO_ALL(IMI))
      CALL IO_WRITE_FIELD(TPFILE,'DYRATIO',CLUOUT,IRESP,NDYRATIO_ALL(IMI))
      CALL IO_WRITE_FIELD(TPFILE,'XOR',    CLUOUT,IRESP,NXOR_ALL(IMI))
      CALL IO_WRITE_FIELD(TPFILE,'YOR',    CLUOUT,IRESP,NYOR_ALL(IMI))
    
    END IF
    !
    !*       1.1    Type and Dimensions :
    !
    
    CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',CLUOUT,IRESP,CSTORAGE_TYPE)
    
    CALL IO_WRITE_FIELD(TPFILE,'IMAX',CLUOUT,IRESP,NIMAX_ll)
    CALL IO_WRITE_FIELD(TPFILE,'JMAX',CLUOUT,IRESP,NJMAX_ll)
    CALL IO_WRITE_FIELD(TPFILE,'KMAX',CLUOUT,IRESP,NKMAX)
    
    CALL IO_WRITE_FIELD(TPFILE,'JPHEXT',CLUOUT,IRESP,JPHEXT)
    
    !
    !*       1.2    Grid variables :
    !
    IF (.NOT.LCARTESIAN) THEN
    
      CALL IO_WRITE_FIELD(TPFILE,'RPK',   CLUOUT,IRESP,XRPK)
      CALL IO_WRITE_FIELD(TPFILE,'LONORI',CLUOUT,IRESP,XLONORI)
      CALL IO_WRITE_FIELD(TPFILE,'LATORI',CLUOUT,IRESP,XLATORI)
    
    ! 
    !* diagnostic of 1st mass point
    !
      ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT))
      CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) !//
      CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) !//
      ZXHATM = 0.5 * (ZXHAT_ll(1)+ZXHAT_ll(2))
      ZYHATM = 0.5 * (ZYHAT_ll(1)+ZYHAT_ll(2))
      CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
      DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
    !
    
      !LONOR and LATOR not in TFIELDLIST because local variables
    
      TZFIELD%CMNHNAME   = 'LONOR'
      TZFIELD%CSTDNAME   = ''
      TZFIELD%CLONGNAME  = 'MesoNH: LONOR'
      TZFIELD%CUNITS     = 'degree'
      TZFIELD%CDIR       = '--'
      TZFIELD%CCOMMENT   = 'Longitude of 1st mass point'
      TZFIELD%NGRID      = 0
      TZFIELD%NTYPE      = TYPEREAL
      TZFIELD%NDIMS      = 0
      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZLONOR)
    !
      TZFIELD%CMNHNAME   = 'LATOR'
      TZFIELD%CLONGNAME  = 'MesoNH: LATOR'
      TZFIELD%CCOMMENT   = 'Latitude of 1st mass point'
      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZLATOR)
    
    CALL IO_WRITE_FIELD(TPFILE,'THINSHELL',CLUOUT,IRESP,LTHINSHELL)
    CALL IO_WRITE_FIELD(TPFILE,'LAT0',CLUOUT,IRESP,XLAT0)
    CALL IO_WRITE_FIELD(TPFILE,'LON0',CLUOUT,IRESP,XLON0)
    CALL IO_WRITE_FIELD(TPFILE,'BETA',CLUOUT,IRESP,XBETA)
    
    CALL IO_WRITE_FIELD(TPFILE,'XHAT',CLUOUT,IRESP,XXHAT)
    CALL IO_WRITE_FIELD(TPFILE,'YHAT',CLUOUT,IRESP,XYHAT)
    CALL IO_WRITE_FIELD(TPFILE,'ZHAT',CLUOUT,IRESP,XZHAT)
    
    ! #ifdef MNH_NCWRIT
    ! !
    ! !*SB*MAY2012
    ! !*SB* * WRITE ALT
    
    ! IF (LNETCDF) CALL IO_WRITE_FIELD(TPFILE,'ALT',CLUOUT,IRESP,XZZ)
    
    IF (.NOT.LCARTESIAN) THEN
    
      CALL IO_WRITE_FIELD(TPFILE,'LAT',CLUOUT,IRESP,XLAT)
      CALL IO_WRITE_FIELD(TPFILE,'LON',CLUOUT,IRESP,XLON)
    
    CALL IO_WRITE_FIELD(TPFILE,'ZS',   CLUOUT,IRESP,XZS)
    CALL IO_WRITE_FIELD(TPFILE,'ZSMT', CLUOUT,IRESP,XZSMT)
    CALL IO_WRITE_FIELD(TPFILE,'SLEVE',CLUOUT,IRESP,LSLEVE)
    
    !
    IF (LSLEVE) THEN
    
    WAUTELET Philippe's avatar
    WAUTELET Philippe committed
      CALL IO_WRITE_FIELD(TPFILE,'LEN1',CLUOUT,IRESP,XLEN1)
      CALL IO_WRITE_FIELD(TPFILE,'LEN2',CLUOUT,IRESP,XLEN2)
    
    CALL IO_WRITE_FIELD(TPFILE,'DTMOD',CLUOUT,IRESP,TDTMOD)
    CALL IO_WRITE_FIELD(TPFILE,'DTCUR',CLUOUT,IRESP,TDTCUR)
    CALL IO_WRITE_FIELD(TPFILE,'DTEXP',CLUOUT,IRESP,TDTEXP)
    CALL IO_WRITE_FIELD(TPFILE,'DTSEG',CLUOUT,IRESP,TDTSEG)
    
    !
    !*       1.3    Configuration  variables :
    !
    
    CALL IO_WRITE_FIELD(TPFILE,'L1D',      CLUOUT,IRESP,L1D)
    CALL IO_WRITE_FIELD(TPFILE,'L2D',      CLUOUT,IRESP,L2D)
    CALL IO_WRITE_FIELD(TPFILE,'PACK',     CLUOUT,IRESP,LPACK)
    CALL IO_WRITE_FIELD(TPFILE,'CARTESIAN',CLUOUT,IRESP,LCARTESIAN)
    CALL IO_WRITE_FIELD(TPFILE,'LBOUSS',   CLUOUT,IRESP,LBOUSS)
    !
    CALL IO_WRITE_FIELD(TPFILE,'SURF',     CLUOUT,IRESP,CSURF)
    CALL IO_WRITE_FIELD(TPFILE,'CPL_AROME',CLUOUT,IRESP,LCPL_AROME)
    CALL IO_WRITE_FIELD(TPFILE,'COUPLING', CLUOUT,IRESP,LCOUPLING)
    
    !*       1.4    Prognostic variables :
    !
    !
    
    !*       1.4.1  Time t:
    
    !
    !20131128 check XUT-> X_Y_W_U wind component for PRC
    !  CALL EXTRAPOL('W',XUT)
    !  CALL EXTRAPOL('E',XUT)
    !  CALL EXTRAPOL('N',XUT)
    !  CALL EXTRAPOL('S',XUT)
    
    CALL MPPDB_CHECK3D(XUT,"write_lfifmn before IO_WRITE_FIELD::XUT",PRECISION)
    
    CALL IO_WRITE_FIELD(TPFILE,'UT',CLUOUT,IRESP,XUT)
    
    CALL MPPDB_CHECK3D(XUT,"write_lfifmn after IO_WRITE_FIELD::XUT",PRECISION)
    
    !
    !20131128 check XVT-> X_Y_W_V wind component for PRC
    CALL MPPDB_CHECK3D(XVT,"write_lfifmn::XVT",PRECISION)
    
    CALL IO_WRITE_FIELD(TPFILE,'VT',CLUOUT,IRESP,XVT)
    
    CALL IO_WRITE_FIELD(TPFILE,'WT',CLUOUT,IRESP,XWT)
    
    CALL IO_WRITE_FIELD(TPFILE,'THT',CLUOUT,IRESP,XTHT)
    
    !*       1.4.2  Time t-dt:
    
    IF ( (CUVW_ADV_SCHEME == 'CEN4TH') .AND. (CTEMP_SCHEME == 'LEFR') ) THEN
    
      YRECFM='UM'
      YCOMMENT='X_Y_Z_U component of wind (m/s)'
      IGRID=2
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XUM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
      YRECFM='VM'
      YCOMMENT='X_Y_Z_V component of wind (m/s)'
      IGRID=3
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XVM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
      YRECFM='WM'
      YCOMMENT='X_Y_Z_vertical wind (m/s)'
      IGRID=4
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XWM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
       YRECFM='DUM'
      YCOMMENT='X_Y_Z_U component of wind (m/s)'
      IGRID=2
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDUM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
      YRECFM='DVM'
      YCOMMENT='X_Y_Z_V component of wind (m/s)'
      IGRID=3
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDVM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
      YRECFM='DWM'
      YCOMMENT='X_Y_Z_vertical wind (m/s)'
      IGRID=4
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDWM,IGRID,ILENCH,YCOMMENT,IRESP)
    
    IF (MEAN_COUNT /= 0) THEN
    !
    
      YCOMMENT='X_Y_Z_U component of mean wind (m/s)'
      IGRID=2
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XUM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_U component of mean wind variance(m2/s2)'
    
      IGRID=2
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XU2_MEAN/MEAN_COUNT-XUM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='UMMA'
      YCOMMENT='X_Y_Z_U component of max wind (m/s)'
      IGRID=2
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XUM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_V component of mean wind (m/s)'
      IGRID=3
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XVM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_V component of mean wind variance (m2/s2)'
    
      IGRID=3
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XV2_MEAN/MEAN_COUNT-XVM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='VMMA'
      YCOMMENT='X_Y_Z_V component of max wind (m/s)'
      IGRID=3
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XVM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_vertical mean wind (m/s)'
      IGRID=4
      ILENCH=LEN(YCOMMENT)
     ZWORK3D = XWM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_vertical mean wind  variance(m2/s2)'
    
      IGRID=4
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XW2_MEAN/MEAN_COUNT-XWM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='WMMA'
      YCOMMENT='X_Y_Z_vertical max wind (m/s)'
      IGRID=4
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XWM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean potential temperature (K)'
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XTHM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean potential temperature variance (K2)'
    
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XTH2_MEAN/MEAN_COUNT-XTHM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='THMMA'
      YCOMMENT='X_Y_Z_max potential temperature (K)'
      IGRID=1
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XTHM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean temperature (K)'
    
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D= XTEMPM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean temperature variance (K2)'
    
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XTEMP2_MEAN/MEAN_COUNT-XTEMPM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='TEMPMMA'
      YCOMMENT='X_Y_Z_max  temperature (K)'
      IGRID=1
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XTEMPM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean ABSolute Pressure (Pa)'
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D= XPABSM_MEAN/MEAN_COUNT
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YCOMMENT='X_Y_Z_mean ABSolute Pressure variance(Pa2)'
    
      IGRID=1
      ILENCH=LEN(YCOMMENT)
      ZWORK3D = XPABS2_MEAN/MEAN_COUNT-XPABSM_MEAN**2/MEAN_COUNT**2
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
      YRECFM='PABSMMA'
      YCOMMENT='X_Y_Z_max ABSolute Pressure (Pa)'
    
      IGRID=1
      ILENCH=LEN(YCOMMENT)
    
      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XPABSM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
      IF (CTURB /= 'NONE') THEN
        YRECFM='TKEMME'
        YCOMMENT='X_Y_Z_mean kinetic energy (m2/s2)'
        IGRID=1
        ILENCH=LEN(YCOMMENT)
        ZWORK3D= XTKEM_MEAN/MEAN_COUNT
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
        YRECFM='TKEMMA'
        YCOMMENT='X_Y_Z_max kinetic energy (m2/s2)'
        IGRID=1
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XTKEM_MAX,IGRID,ILENCH,YCOMMENT,IRESP)
    
    !
    END IF
    !
    !
    IF (CTURB /= 'NONE') THEN
    
      CALL IO_WRITE_FIELD(TPFILE,'TKET',CLUOUT,IRESP,XTKET)
      IF (CPROGRAM == 'MESONH') CALL IO_WRITE_FIELD(TPFILE,'TKEMS',CLUOUT,IRESP,XRTKEMS)
    
    CALL IO_WRITE_FIELD(TPFILE,'PABST',CLUOUT,IRESP,XPABST)
    
    !
    IF (NRR >=1) THEN
    
      IF (LUSERV) CALL IO_WRITE_FIELD(TPFILE,'RVT',CLUOUT,IRESP,XRT(:,:,:,IDX_RVT))
    
      IF (LUSERC) THEN
    
        CALL IO_WRITE_FIELD(TPFILE,'RCT',CLUOUT,IRESP,XRT(:,:,:,IDX_RCT))
        WRITE (ILUOUT,*) IDX_RCT,' RC min-max ',MIN_ll(XRT(:,:,:,IDX_RCT),INFO_ll),MAX_ll(XRT(:,:,:,IDX_RCT),INFO_ll)
    
      END IF
      IF (LUSERR) THEN
    
        CALL IO_WRITE_FIELD(TPFILE,'RRT',CLUOUT,IRESP,XRT(:,:,:,IDX_RRT))
        WRITE (ILUOUT,*) IDX_RRT,' RR min-max ',MIN_ll(XRT(:,:,:,IDX_RRT),INFO_ll),MAX_ll(XRT(:,:,:,IDX_RRT),INFO_ll)
    
      END IF 
      IF (LUSERI) THEN
    
        CALL IO_WRITE_FIELD(TPFILE,'RIT',CLUOUT,IRESP,XRT(:,:,:,IDX_RIT))
        WRITE (ILUOUT,*) IDX_RIT,' RI min-max ',MIN_ll(XRT(:,:,:,IDX_RIT),INFO_ll),MAX_ll(XRT(:,:,:,IDX_RIT),INFO_ll)
    
        IF ( CPROGRAM == 'MESONH' .AND. CCLOUD(1:3) == 'ICE') THEN
    
          YRECFM= 'CIT'
          YCOMMENT='X_Y_Z_Cloud Ice concentration (/M3)'
          ILENCH=LEN(YCOMMENT)
    
          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XCIT(:,:,:),   IGRID,ILENCH,  &
    
                      YCOMMENT,IRESP)
        END IF
    
      END IF 
      IF (LUSERS) THEN
    
        CALL IO_WRITE_FIELD(TPFILE,'RST',CLUOUT,IRESP,XRT(:,:,:,IDX_RST))
        WRITE (ILUOUT,*) IDX_RST,' RS min-max ',MINVAL(XRT(:,:,:,IDX_RST)),MAXVAL(XRT(:,:,:,IDX_RST))
    
      END IF
      IF (LUSERG) THEN
    
        CALL IO_WRITE_FIELD(TPFILE,'RGT',CLUOUT,IRESP,XRT(:,:,:,IDX_RGT))
        WRITE (ILUOUT,*) IDX_RGT,' RG min-max ',MINVAL(XRT(:,:,:,IDX_RGT)),MAXVAL(XRT(:,:,:,IDX_RGT))
    
      IF (LUSERH) CALL IO_WRITE_FIELD(TPFILE,'RHT',CLUOUT,IRESP,XRT(:,:,:,IDX_RHT))
    
    END IF
    !
    IF (NSV >=1) THEN
      JSA=0
      IGRID=1                                       ! individually in the file
      ! User scalar variables
      DO JSV = 1,NSV_USER
    
        WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
        WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
    
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
        JSA=JSA+1
      END DO
      ! microphysical C2R2 scheme scalar variables
      DO JSV = NSV_C2R2BEG,NSV_C2R2END
    
        YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
        WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/M3)'
    
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
        JSA=JSA+1
      END DO
      ! microphysical C3R5 scheme additional scalar variables
      DO JSV = NSV_C1R3BEG,NSV_C1R3END
    
        YRECFM=TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
        WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/M3)'
    
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
        JSA=JSA+1
      END DO
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
    !
    ! microphysical LIMA variables
    !
      DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
    ! Nc
         IF (JSV .EQ. NSV_LIMA_NC) THEN
            YRECFM=TRIM(CLIMA_WARM_NAMES(1))//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! Nr
         IF (JSV .EQ. NSV_LIMA_NR) THEN
            YRECFM=TRIM(CLIMA_WARM_NAMES(2))//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! N CCN free
         IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
            WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
            YRECFM=TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! N CCN acti
         IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
            WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
            YRECFM=TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! Scavenging
         IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
            YRECFM=TRIM(CAERO_MASS(1))//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (kg/kg)'
         END IF
    ! Ni
         IF (JSV .EQ. NSV_LIMA_NI) THEN
            YRECFM=TRIM(CLIMA_COLD_NAMES(1))//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! N IFN free
         IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
            WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
            YRECFM=TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! N IFN nucl
         IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
            WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
            YRECFM=TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! N IMM nucl
         I = 0
         IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
            I = I + 1
            WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
            YRECFM=TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    ! Hom. freez. of CCN
         IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
            YRECFM=TRIM(CLIMA_COLD_NAMES(5))//'T'
            WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/kg)'
         END IF
    !
    !
         ILENCH=LEN(YCOMMENT)
    
         CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
              YCOMMENT,IRESP)
         JSA=JSA+1
      END DO
    !
      IF (LSCAV .AND. LAERO_MASS) THEN
      IF (ASSOCIATED(XINPAP)) THEN
      IF (SIZE(XINPAP) /= 0 ) THEN
         ZWORK2D(:,:)  = XINPAP(:,:)
         YRECFM      = 'INPAP'
         YCOMMENT    = 'X_Y_INstantaneous Precipitating Aerosol Rate (kg/m2/s)'
         IGRID       = 1
         ILENCH      = LEN(YCOMMENT)
    
         CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D,IGRID,ILENCH, &
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
                                                 YCOMMENT,IRESP) ! unit conversion
         ZWORK2D(:,:)  = XRHOLW*XINPRR(:,:)*XSVT(:,:,2,NSV_LIMA_SCAVMASS)/ &
                                            max( 1.e-20,XRT(:,:,2,3) ) !~2=at ground level
         YRECFM      = 'INPBP'
         YCOMMENT    = 'X_Y_INstantaneous Precipitating Aerosol Rate (kg/m2/s)'
         IGRID       = 1
         ILENCH      = LEN(YCOMMENT)
    
         CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D,IGRID,ILENCH, &
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
                                                 YCOMMENT,IRESP) ! unit conversion
    !
         ZWORK2D(:,:)  = XACPAP(:,:)
         YRECFM      = 'ACPAP'
         YCOMMENT    = 'X_Y_ACcumulated Precipitating Aerosol Rate (kg/m2)'
         IGRID       = 1
         ILENCH      = LEN(YCOMMENT)
    
         CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D,IGRID,ILENCH, &
    
    Gaelle TANGUY's avatar
    Gaelle TANGUY committed
                                                 YCOMMENT,IRESP) ! unit conversion
      END IF
      END IF
      END IF
    !
    !
    
      ! electrical scalar variables
      DO JSV = NSV_ELECBEG,NSV_ELECEND
    
        YRECFM=TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
    
        IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN 
    
          WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (C/m3)'
    
          WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
    
        END IF
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = 0.
    
        ZWORK3D(:,:,:) = XSVT(:,:,:,JSV) * XRHODREF(:,:,:) ! C/kg --> C/m3
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
        JSA=JSA+1
      END DO
      IF (CELEC /= 'NONE') THEN
        YRECFM='EFIELDU'
        YCOMMENT='X_Y_Z_EFIELDU (V/m)'
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XEFIELDU(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        YRECFM='EFIELDV'
        YCOMMENT='X_Y_Z_EFIELDV (V/m)'
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XEFIELDV(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        YRECFM='EFIELDW'
        YCOMMENT='X_Y_Z_EFIELDW (V/m)'
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XEFIELDW(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='EMODULE'
        YCOMMENT='X_Y_Z_EMODULE (V/m)'
        ZWORK3D(:,:,:) = (XEFIELDU**2 + XEFIELDV**2 + XEFIELDW**2)**0.5
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='NI_IAGGS'
        YCOMMENT='X_Y_Z_NI_IAGGS (pC/m3/s)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = XNI_IAGGS(:,:,:) * 1.E12
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='NI_IDRYG'
        YCOMMENT='X_Y_Z_NI_IDRYG (pC/m3/s)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = XNI_IDRYG(:,:,:) * 1.E12
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='NI_SDRYG'
        YCOMMENT='X_Y_Z_NI_SDRYG (pC/m3/s)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = XNI_SDRYG(:,:,:) * 1.E12
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='INDUC_CG'
        YCOMMENT='X_Y_Z_INDUC_CG (pC/m3/s)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = XIND_RATE(:,:,:) * 1.E12
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
    
     !
        ZWORK2D(:,:) = 0.
        YRECFM='TRIG_IC'
        YCOMMENT='X_Y_Z_FLASH_MAP_TRIG_IC (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK2D(:,:) = FLOAT(NMAP_TRIG_IC(:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D(:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK2D(:,:) = 0.
        YRECFM='IMPACT_CG'
        YCOMMENT='X_Y_Z_FLASH_MAP_IMPACT_CG (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK2D(:,:) = FLOAT(NMAP_IMPACT_CG(:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D(:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK2D(:,:) = 0.
        YRECFM='AREA_CG'
        YCOMMENT='X_Y_Z_FLASH_MAP_2DAREA_CG (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK2D(:,:) = FLOAT(NMAP_2DAREA_CG(:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D(:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK2D(:,:) = 0.
        YRECFM='AREA_IC'
        YCOMMENT='X_Y_Z_FLASH_MAP_2DAREA_IC (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK2D(:,:) = FLOAT(NMAP_2DAREA_IC(:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D(:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='FLASH_3DCG'
        YCOMMENT='X_Y_Z_FLASH_MAP_3DCG (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = FLOAT(NMAP_3DCG(:,:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        ZWORK3D(:,:,:) = 0.
        YRECFM='FLASH_3DIC'
        YCOMMENT='X_Y_Z_FLASH_MAP_3DIC (no unit)'
        ILENCH=LEN(YCOMMENT)
        ZWORK3D(:,:,:) = FLOAT(NMAP_3DIC(:,:,:))
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
     !
        IF (LLNOX_EXPLICIT) THEN
          YRECFM='LINOX'
          WRITE(YCOMMENT,'(A6,A3,I3.3,A10)')'X_Y_Z_','SVT',JSV,' (mol/mol)'
          ILENCH=LEN(YCOMMENT)
    
          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,NSV_LNOXEND),IGRID,ILENCH, &
    
                      YCOMMENT,IRESP)
          JSA=JSA+1
        END IF
    
      END IF
      ! lagrangian variables
      DO JSV = NSV_LGBEG,NSV_LGEND
    
        YRECFM=TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
        WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (M)'
    
        ILENCH=LEN(YCOMMENT)
    
        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
                    YCOMMENT,IRESP)
    
      END DO
      ! Passive scalar variables        
     IF (LPASPOL) THEN
      DO JSV = NSV_PPBEG,NSV_PPEND
    
          WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
          WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
          ILENCH=LEN(YCOMMENT)
    
          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
    
    !
     IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN
          YRECFM= 'SUPSATMAX'
          YCOMMENT='X_Y_Z_Supersaturation'
          ILENCH=LEN(YCOMMENT)
    
          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSUPSAT(:,:,:),IGRID,ILENCH,  &
    
                      YCOMMENT,IRESP)
    !
          YRECFM= 'NACT'
          YCOMMENT='X_Y_Z_Nact'
          ILENCH=LEN(YCOMMENT)
    
          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XNACT(:,:,:),IGRID,ILENCH,  &
    
                      YCOMMENT,IRESP)
     END IF