Newer
Older

WAUTELET Philippe
committed
!MNH_LIC Copyright 1998-2020 CNRS, Meteo-France and Universite Paul Sabatier
!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence

WAUTELET Philippe
committed
!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
!MNH_LIC for details. version 1.
!-----------------------------------------------------------------
! ######################
MODULE MODI_WRITE_LB_n
! ######################
!
INTERFACE
!

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILEDATA
!
TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics
END SUBROUTINE WRITE_LB_n
!
END INTERFACE
!
END MODULE MODI_WRITE_LB_n
!
!
!
! ##############################
! ##############################
!
!!**** *WRITE_LFIFM_n* - routine to write LB fields in the LFIFM file
!!
!! PURPOSE
!! -------
! The purpose of this routine is to write LB fields in the
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
!
!!** METHOD
!! ------
!! The LB fields (distributed on the processors) are gathered. Then
!! they are writen on the file.
!!
!! EXTERNAL
!! --------
!! FMWRIT : FM-routine to write a record
!! GET_DISTRIBX_LB : to get the indices of the LB arrays
!! GET_DISTRIBY_LB for each sub-domain
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_DIM_n : contains dimensions
!! Module MODD_LUNIT_n : contains logical unit variables.
!! Module MODD_LSFIELD_n : contains Lateral boundaries variables
!! Module MODD_CONF_n : contains configuration variables
!! Module MODD_PARAM_n : contains parameterization options
!! Module MODD_TURB_n : contains turbulence options
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!! P Jabouille *Meteo France*
!!
!! MODIFICATIONS
!! -------------
!! Original 15/10/98 //
!! D. Gazen 22/01/01 treat NSV_* with floating indices
!! J.-P. Pinty 06/05/04 treat NSV_* for C1R3 and ELEC
!! P. Tulet 06/03/05 treat NSV_* for DUST, SALT and ORILAM
!! 05/06 Remove KEPS
!! G. Tanguy 10/09 add ILENCH=LEN(YCOMMENT) after
!! change of YCOMMENT
!! M. Leriche 07/10 add NSV_* for ice phase chemistry
!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O

RODIER Quentin
committed
!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes
!-------------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!
USE MODD_DIM_n
USE MODD_DYN_n
USE MODD_CONF_n
USE MODD_LSFIELD_n
USE MODD_LUNIT_n
USE MODD_PARAM_n
USE MODD_TURB_n
USE MODD_NSV

WAUTELET Philippe
committed
USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Field_write_lb
USE MODE_TOOLS, ONLY: UPCASE
!
USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
USE MODD_ICE_C1R3_DESCR, ONLY: C1R3NAMES
USE MODD_CH_M9_n, ONLY: CNAMES, CICNAMES
USE MODD_LG, ONLY: CLGNAMES
USE MODD_ELEC_DESCR, ONLY: CELECNAMES
USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES
USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
USE MODD_CH_AEROSOL
USE MODD_CH_AERO_n
USE MODI_CH_AER_REALLFI_n
USE MODD_CONF
USE MODD_REF, ONLY : XRHODREFZ
USE MODD_CONF, ONLY : CPROGRAM

RODIER Quentin
committed
USE MODD_GRID_n, ONLY : XZZ
USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT
USE MODD_DUST
USE MODD_SALT
USE MODI_DUSTLFI_n
USE MODI_SALTLFI_n
USE MODD_PARAMETERS, ONLY: JPHEXT

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILEDATA

WAUTELET Philippe
committed
use modd_field, only: tfielddata, TYPELOG, TYPEREAL
!
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!
TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics
!
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
INTEGER :: ILUOUT ! logical unit
!
INTEGER :: IRR ! Index for moist variables
INTEGER :: JRR,JSV ! loop index for moist and scalar variables
!
LOGICAL :: GHORELAX_R, GHORELAX_SV ! global hor. relax. informations
INTEGER :: IRIMX,IRIMY ! size of the RIM zone
CHARACTER (LEN=1), DIMENSION (7) :: YC ! array with the prefix of the moist variables
LOGICAL, DIMENSION (7) :: GUSER ! array with the use indicator of the moist variables
REAL, DIMENSION(SIZE(XLBXSVM, 1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZRHODREFX
REAL, DIMENSION(SIZE(XLBYSVM, 1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZRHODREFY

WAUTELET Philippe
committed
INTEGER :: JK
! Integers, counters for dust modes

WAUTELET Philippe
committed
INTEGER :: JMOM, IMOMENTS, JMODE, ISV_NAME_IDX
INTEGER :: IMI ! Current model index
CHARACTER(LEN=2) :: INDICE ! to index CCN and IFN fields of LIMA scheme

RODIER Quentin
committed
INTEGER :: I
INTEGER :: ILBX,ILBY
INTEGER :: IIB, IIE, IJB, IJE, IKB, IKE
INTEGER :: IIU, IJU, IKU
REAL, DIMENSION(SIZE(XLBXSVM,1), SIZE(XLBXSVM,2), SIZE(XLBXSVM,3)) :: ZLBXZZ
REAL, DIMENSION(SIZE(XLBYSVM,1), SIZE(XLBYSVM,2), SIZE(XLBYSVM,3)) :: ZLBYZZ

WAUTELET Philippe
committed
TYPE(TFIELDDATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
!* 1. SOME INITIALIZATIONS
! --------------------
!

RODIER Quentin
committed
IIB=JPHEXT+1
IIE=SIZE(XZZ,1)-JPHEXT
IIU=SIZE(XZZ,1)
IJB=JPHEXT+1
IJE=SIZE(XZZ,2)-JPHEXT
IJU=SIZE(XZZ,2)
IKB=JPVEXT+1
IKE=SIZE(XZZ,3)-JPVEXT
IKU=SIZE(XZZ,3)
! 2. WRITE THE DIMENSION OF LB FIELDS
! --------------------------------
!

WAUTELET Philippe
committed
CALL IO_Field_write(TPFILE,'RIMX',NRIMX)
CALL IO_Field_write(TPFILE,'RIMY',NRIMY)
!
!* 3. BASIC VARIABLES
! --------------
!

WAUTELET Philippe
committed
CALL IO_Field_write(TPFILE,'HORELAX_UVWTH',LHORELAX_UVWTH)
!
!gathering and writing of the LB fields

WAUTELET Philippe
committed
IF(NSIZELBXU_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBXUM', NSIZELBXU_ll,XLBXUM)
IF(NSIZELBX_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBXVM', NSIZELBX_ll,XLBXVM)
IF(NSIZELBX_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBXWM', NSIZELBX_ll,XLBXWM)
IF(NSIZELBY_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBYUM', NSIZELBY_ll,XLBYUM)
IF(NSIZELBYV_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBYVM', NSIZELBYV_ll,XLBYVM)
IF(NSIZELBY_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBYWM', NSIZELBY_ll,XLBYWM)
IF(NSIZELBX_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBXTHM',NSIZELBX_ll,XLBXTHM)
IF(NSIZELBY_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBYTHM',NSIZELBY_ll,XLBYTHM)
!
!* 4 LB-TKE
! ------
!
IF(CTURB/='NONE') THEN

WAUTELET Philippe
committed
CALL IO_Field_write(TPFILE,'HORELAX_TKE',LHORELAX_TKE)

WAUTELET Philippe
committed
IF(NSIZELBXTKE_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBXTKEM',NSIZELBXTKE_ll,XLBXTKEM)
IF(NSIZELBYTKE_ll /= 0) CALL IO_Field_write_lb(TPFILE,'LBYTKEM',NSIZELBYTKE_ll,XLBYTKEM)
END IF
!
!
!* 6 LB-Rx
! -----
!
IF (NRR >=1) THEN
GHORELAX_R = LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. &
LHORELAX_RI .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. &
LHORELAX_RH

WAUTELET Philippe
committed
!
TZFIELD%CMNHNAME = 'HORELAX_R'
TZFIELD%CSTDNAME = ''

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = 'HORELAX_R'
TZFIELD%CUNITS = ''
TZFIELD%CDIR = '--'
TZFIELD%CCOMMENT = 'Switch to activate the HOrizontal RELAXation'

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'NONE'
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPELOG
TZFIELD%NDIMS = 0
TZFIELD%LTIMEDEP = .FALSE.

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_R)

WAUTELET Philippe
committed
!
GUSER(:)=(/LUSERV,LUSERC,LUSERR,LUSERI,LUSERS,LUSERG,LUSERH/)
YC(:)=(/"V","C","R","I","S","G","H"/)
IRR=0

WAUTELET Philippe
committed
!
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
! Loop on moist variables
DO JRR=1,7
IF (GUSER(JRR)) THEN
IRR=IRR+1
IF(NSIZELBXR_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBXR'//YC(JRR)//'M'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = 'LBXR'//YC(JRR)//'M'
TZFIELD%CLBTYPE = 'LBX'
TZFIELD%CCOMMENT = '2_Y_Z_LBXR'//YC(JRR)//'M'

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXR_ll,XLBXRM(:,:,:,IRR))

WAUTELET Philippe
committed
!
TZFIELD%CMNHNAME = 'LBYR'//YC(JRR)//'M'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = 'LBYR'//YC(JRR)//'M'
TZFIELD%CLBTYPE = 'LBY'
TZFIELD%CCOMMENT = '2_Y_Z_LBYR'//YC(JRR)//'M'
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYR_ll,XLBYRM(:,:,:,IRR))
END IF
END IF
END DO
END IF
!
!* 7 LB-SV
! -----
!
IF (NSV >=1) THEN
GHORELAX_SV=ANY ( LHORELAX_SV )
!
TZFIELD%CMNHNAME = 'HORELAX_SV'
TZFIELD%CSTDNAME = ''

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = 'HORELAX_SV'
TZFIELD%CUNITS = ''
TZFIELD%CDIR = '--'
TZFIELD%CCOMMENT = ''

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'NONE'
TZFIELD%NGRID = 0
TZFIELD%NTYPE = TYPELOG
TZFIELD%NDIMS = 0
TZFIELD%LTIMEDEP = .FALSE.

WAUTELET Philippe
committed
CALL IO_Field_write(TPFILE,TZFIELD,GHORELAX_SV)
IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2
IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2

WAUTELET Philippe
committed
IF (NSV_USER>0) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = 1,NSV_USER
IF(NSIZELBXSV_ll /= 0) THEN
WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBYSVM',JSV

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
END DO
END IF
!
IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'm-3'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.
!
DO JSV = NSV_C2R2BEG,NSV_C2R2END
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END IF
END DO
END IF
!

WAUTELET Philippe
committed
IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'm-3'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_C1R3BEG,NSV_C1R3END
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
END DO
END IF
!
! LIMA: CCN and IFN scalar variables
!
IF (CCLOUD=='LIMA' ) THEN

WAUTELET Philippe
committed
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!
DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
IF (NSV_ELECEND>=NSV_ELECBEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.
!
DO JSV = NSV_ELECBEG,NSV_ELECEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF

WAUTELET Philippe
committed
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END IF
END DO
END IF
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
!
!
IF (LORILAM) THEN
DO JK=1,SIZE(XLBXSVM,3)
ZRHODREFX(:,:,JK) = XRHODREFZ(JK)
ZRHODREFY(:,:,JK) = XRHODREFZ(JK)
ENDDO
!
IF (NSIZELBXSV_ll /= 0) &
XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.)
IF (NSIZELBYSV_ll /= 0) &
XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND) = MAX(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND), 0.)
IF (LDEPOS_AER(IMI).AND.(NSIZELBXSV_ll /= 0)) &
XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBXSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.)
IF (LDEPOS_AER(IMI).AND.(NSIZELBYSV_ll /= 0)) &
XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND) = MAX(XLBYSVM(:,:,:,NSV_AERDEPBEG:NSV_AERDEPEND), 0.)
IF (LAERINIT) THEN ! GRIBEX CASE (aerosols initialization)
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) &
CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX)
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSP > 1)) &
CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY)
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) &
CALL CH_AER_REALLFI_n(XLBXSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBXSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFX)
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSP > 1)) &
CALL CH_AER_REALLFI_n(XLBYSVM(:,:,:,NSV_AERBEG:NSV_AEREND),XLBYSVM(:,:,:,NSV_CHEMBEG-1+JP_CH_CO),ZRHODREFY)
END IF
!

WAUTELET Philippe
committed
TZFIELD%CSTDNAME = ''

RODIER Quentin
committed
TZFIELD%CUNITS = 'ppp'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_AERBEG,NSV_AEREND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!
IF (LDEPOS_AER(IMI)) THEN
DO JSV = NSV_AERDEPBEG,NSV_AERDEPEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEAERNAMES(JSV-NSV_AERDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.
DO JSV = NSV_CHEMBEG,NSV_CHEMEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!
TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END IF
END DO
!
DO JSV = NSV_CHICBEG,NSV_CHICEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!
TZFIELD%CMNHNAME = 'LBY_'//TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END IF
END DO
!
DO JSV = NSV_LNOXBEG,NSV_LNOXEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_LINOX'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_LINOX'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
END IF
END DO
!
IF (LDUST) THEN
DO JK=1,size(XLBXSVM,3)
ZRHODREFX(:,:,JK) = XRHODREFZ(JK)
ENDDO
DO JK=1,size(XLBYSVM,3)
ZRHODREFY(:,:,JK) = XRHODREFZ(JK)
ENDDO
IF (NSIZELBXSV_ll /= 0) &
XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.)
IF (NSIZELBYSV_ll /= 0) &
XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND) = MAX(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), 0.)
IF (LDEPOS_DST(IMI).AND.(NSIZELBXSV_ll /= 0)) &
XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.)
IF (LDEPOS_DST(IMI).AND.(NSIZELBYSV_ll /= 0)) &
XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_DSTDEPBEG:NSV_DSTDEPEND), 0.)
IF ((LDSTINIT).OR.(LDSTPRES)) THEN ! GRIBEX case (dust initialization)
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN
CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX)
END IF
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_DST > 1)) THEN
CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY)
END IF
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) &
CALL DUSTLFI_n(XLBXSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFX)
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_DST > 1)) &
CALL DUSTLFI_n(XLBYSVM(:,:,:,NSV_DSTBEG:NSV_DSTEND), ZRHODREFY)
END IF
!
IF ((CPROGRAM == 'REAL ').OR. (CPROGRAM == 'IDEAL ')) THEN
! In this case CDUSTNAMES is not allocated. We will use YPDUST_INI,
!but remember that this variable does not follow JPDUSTORDER
IMOMENTS = INT(NSV_DSTEND - NSV_DSTBEG + 1)/NMODE_DST
!Should equal 3 at this point
IF (IMOMENTS > 3) THEN
WRITE(YMSG,*) 'number of DST moments must be 3',NSV_DSTBEG, NSV_DSTEND,NMODE_DST,IMOMENTS
CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LB_n',YMSG)

WAUTELET Philippe
committed
!
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'ppp'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
IF (IMOMENTS == 1) THEN
DO JMODE=1, NMODE_DST
!Index from which names are picked
ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2
JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted
+ 1 & !Number of moments in this mode
+ (NSV_DSTBEG -1) !Previous list of tracers
IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
ENDIF !Check on border points in X direction
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
ENDIF !Check on points in Y direction
ENDDO ! Loop on mode
ELSE ! valeur IMOMENTS =/ 1
DO JMODE=1,NMODE_DST
DO JMOM=1,IMOMENTS
ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM
JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted
+ JMOM & !Number of moments in this mode
+ (NSV_DSTBEG -1)

WAUTELET Philippe
committed
!
IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
ENDIF !Check on border points in X direction
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
ENDIF !Check on points in Y direction
ENDDO ! Loop on moments
ENDDO ! Loop on modes
END IF ! valeur IMOMENTS
ELSE ! Test CPROGRAM
! We are in the subprogram MESONH, CDUSTNAMES are allocated and are
!in the same order as the variables in XSVM (i.e. following JPDUSTORDER)

WAUTELET Philippe
committed
!
TZFIELD%CSTDNAME = ''

RODIER Quentin
committed
TZFIELD%CUNITS = 'ppp'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_DSTBEG,NSV_DSTEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
END DO
IF (LDEPOS_DST(IMI)) THEN
DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
!
IF (LSALT) THEN
DO JK=1,size(XLBXSVM,3)
ZRHODREFX(:,:,JK) = XRHODREFZ(JK)
ZRHODREFY(:,:,JK) = XRHODREFZ(JK)
ENDDO

RODIER Quentin
committed
IIU = SIZE(XZZ,1)
IJU = SIZE(XZZ,2)
IKU = SIZE(XZZ,3)
IF (SIZE(ZLBXZZ) .NE. 0 ) THEN
ILBX=SIZE(ZLBXZZ,1)/2-1
ZLBXZZ(1:ILBX+1,:,:) = XZZ(IIB-1:IIB-1+ILBX,:,:)
ZLBXZZ(ILBX+2:2*ILBX+2,:,:) = XZZ(IIE+1-ILBX:IIE+1,:,:)
ENDIF
IF (SIZE(ZLBYZZ) .NE. 0 ) THEN
ILBY=SIZE(ZLBYZZ,2)/2-1
ZLBYZZ(:,1:ILBY+1,:) = XZZ(:,IJB-1:IJB-1+ILBY,:)
ZLBYZZ(:,ILBY+2:2*ILBY+2,:) = XZZ(:,IJE+1-ILBY:IJE+1,:)
ENDIF
IF (NSIZELBXSV_ll /= 0) &
XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.)
IF (NSIZELBYSV_ll /= 0) &
XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND) = MAX(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), 0.)
IF (LDEPOS_SLT(IMI).AND.(NSIZELBXSV_ll /= 0)) &
XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBXSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.)
IF (LDEPOS_SLT(IMI).AND.(NSIZELBYSV_ll /= 0)) &
XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND) = MAX(XLBYSVM(:,:,:,NSV_SLTDEPBEG:NSV_SLTDEPEND), 0.)
IF ((LSLTINIT).OR.(LSLTPRES)) THEN ! GRIBEX case (dust initialization)
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN

RODIER Quentin
committed
CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ)
END IF
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'REAL ').AND.(NSV_SLT > 1)) THEN

RODIER Quentin
committed
CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ)
END IF
IF ((NSIZELBXSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN

RODIER Quentin
committed
CALL SALTLFI_n(XLBXSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFX, ZLBXZZ)
END IF
IF ((NSIZELBYSV_ll /= 0).AND.(CPROGRAM == 'IDEAL ').AND.(NSV_SLT > 1)) THEN

RODIER Quentin
committed
CALL SALTLFI_n(XLBYSVM(:,:,:,NSV_SLTBEG:NSV_SLTEND), ZRHODREFY, ZLBYZZ)
IF ((CPROGRAM == 'REAL ').OR. (CPROGRAM == 'IDEAL ')) THEN
! In this case CSALTNAMES is not allocated. We will use YPSALT_INI,
!but remember that this variable does not follow JPSALTORDER
IMOMENTS = INT(NSV_SLTEND - NSV_SLTBEG + 1)/NMODE_SLT
!Should equal 3 at this point
WRITE(YMSG,*) 'number of SLT moments must be 3',NSV_SLTBEG, NSV_SLTEND,NMODE_SLT,IMOMENTS
CALL PRINT_MSG(NVERB_FATAL,'GEN','WRITE_LB_n',YMSG)

WAUTELET Philippe
committed
END IF ! Test IMOMENTS
!
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'ppp'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
IF (IMOMENTS == 1) THEN
DO JMODE=1, NMODE_SLT
!Index from which names are picked
ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + 2
JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted
+ 1 & !Number of moments in this mode
+ (NSV_SLTBEG -1) !Previous list of tracers
IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPSALT_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
ENDIF !Check on border points in X direction
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPSALT_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
ENDIF !Check on points in Y direction
ENDDO ! Loop on mode
ELSE ! valeur IMOMENTS =/ 1
DO JMODE=1,NMODE_SLT
DO JMOM=1,IMOMENTS
ISV_NAME_IDX = (JPSALTORDER(JMODE) - 1)*3 + JMOM
JSV = (JMODE-1)*IMOMENTS & !Number of moments previously counted
+ JMOM & !Number of moments in this mode
+ (NSV_SLTBEG -1)
IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(YPSALT_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
ENDIF !Check on border points in X direction
IF(NSIZELBYSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(YPSALT_INI(ISV_NAME_IDX))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
ENDIF !Check on points in Y direction
ENDDO ! Loop on moments
ENDDO ! Loop on modes
END IF ! valeur IMOMENTS
ELSE ! Test CPROGRAM
! We are in the subprogram MESONH, CSALTNAMES are allocated and are
!in the same order as the variables in XSVM (i.e. following JPSALTORDER)

WAUTELET Philippe
committed
TZFIELD%CSTDNAME = ''

RODIER Quentin
committed
TZFIELD%CUNITS = 'ppp'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_SLTBEG,NSV_SLTEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END DO
IF (LDEPOS_SLT(IMI)) THEN
DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
IF(NSIZELBXSV_ll /= 0) THEN

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CDESLTNAMES(JSV-NSV_SLTDEPBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
!
IF (NSV_LGEND>=NSV_LGBEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'm'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.
!
DO JSV = NSV_LGBEG,NSV_LGEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))
END IF
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))
END IF
END DO
END IF

WAUTELET Philippe
committed
! passive pollutants
IF (NSV_PPEND>=NSV_PPBEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.
!

WAUTELET Philippe
committed
DO JSV = NSV_PPBEG,NSV_PPEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_PP'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_PP'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
END DO
END IF

WAUTELET Philippe
committed
IF (NSV_CSEND>=NSV_CSBEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_CSBEG,NSV_CSEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_CS'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_CS'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
END DO
END IF
#ifdef MNH_FOREFIRE
! ForeFire scalar variables

WAUTELET Philippe
committed
IF (NSV_FFEND>=NSV_FFBEG) THEN
TZFIELD%CSTDNAME = ''
TZFIELD%CUNITS = 'kg kg-1'

WAUTELET Philippe
committed
TZFIELD%CDIR = ''

WAUTELET Philippe
committed
TZFIELD%NGRID = 1
TZFIELD%NTYPE = TYPEREAL
TZFIELD%NDIMS = 3
TZFIELD%LTIMEDEP = .TRUE.

WAUTELET Philippe
committed
!
DO JSV = NSV_FFBEG,NSV_FFEND
IF(NSIZELBXSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBX_FF'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBX'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBXSV_ll,XLBXSVM(:,:,:,JSV))

WAUTELET Philippe
committed
END IF
!
IF(NSIZELBYSV_ll /= 0) THEN
TZFIELD%CMNHNAME = 'LBY_FF'

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME)

WAUTELET Philippe
committed
TZFIELD%CLBTYPE = 'LBY'
WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV

WAUTELET Philippe
committed
CALL IO_Field_write_lb(TPFILE,TZFIELD,NSIZELBYSV_ll,XLBYSVM(:,:,:,JSV))