Newer
Older
!MNH_LIC Copyright 1997-2023 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.
!-----------------------------------------------------------------

WAUTELET Philippe
committed
MODULE MODE_WRITE_SURF_MNH_TOOLS
IMPLICIT NONE

WAUTELET Philippe
committed
CONTAINS
SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
!

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, tfieldlist, NMNHDIM_UNUSED
use modd_parameters, only: NMNHNAMELGTMAX

WAUTELET Philippe
committed

WAUTELET Philippe
committed
use mode_field, only: Find_field_id_from_mnhname

WAUTELET Philippe
committed
USE MODE_MSG
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
CHARACTER(LEN=2), INTENT(IN) :: HDIR ! Expected type of the data field (XX,XY,--...)
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
INTEGER, INTENT(IN) :: KGRID ! Localization on the model grid
INTEGER, INTENT(IN) :: KTYPE ! Datatype
INTEGER, INTENT(IN) :: KDIMS ! Number of dimensions
CHARACTER(LEN=*), INTENT(IN) :: HSUBR ! name of the subroutine calling

WAUTELET Philippe
committed
TYPE(TFIELDMETADATA), INTENT(OUT) :: TPFIELD ! metadata of field

WAUTELET Philippe
committed
!
CHARACTER(LEN=32) :: YTXT
INTEGER :: IDX,IID, IRESP
LOGICAL :: GWARN

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
IF ( LEN_TRIM( HREC ) > NMNHNAMELGTMAX ) &
CALL PRINT_MSG( NVERB_WARNING, 'IO', TRIM(HSUBR), 'HREC is too long (' // TRIM(HREC) // ')' )

WAUTELET Philippe
committed
CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.)
IF (IRESP==0) THEN
TPFIELD = TFIELDMETADATA( TFIELDLIST(IID) )

WAUTELET Philippe
committed
!Modify and check CLONGNAME
IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC)) THEN
CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CLONGNAME different ('//TRIM(TPFIELD%CLONGNAME) &
//'/'//TRIM(HREC)//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%CLONGNAME = TRIM(HREC)

WAUTELET Philippe
committed
END IF
!Modify and check CDIR
IF (TPFIELD%CDIR/=HDIR) THEN
CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CDIR different ('//TRIM(TPFIELD%CDIR) &
//'/'//TRIM(HDIR)//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%CDIR = HDIR

WAUTELET Philippe
committed
END IF
!Modify and check CCOMMENT
IF (LEN_TRIM(HCOMMENT)/=0) THEN
IF (TRIM(TPFIELD%CCOMMENT)/=TRIM(HCOMMENT)) THEN
!Usually in SURFEX fields, units are given at the end of the comment and between parenthesis
!Neglect that part of the comment for comparison
IDX = INDEX(HCOMMENT,'(',BACK=.TRUE.)
IF (IDX/=0) THEN
IF (TRIM(TPFIELD%CCOMMENT)/=TRIM(HCOMMENT(1:IDX-1))) THEN
GWARN = .TRUE.
ELSE
GWARN = .FALSE.
END IF
ELSE
GWARN = .TRUE.
END IF
IF (GWARN) THEN
CALL PRINT_MSG(NVERB_INFO,'IO',TRIM(HSUBR),'CCOMMENT different ('//TRIM(TPFIELD%CCOMMENT) &
//'/'//TRIM(HCOMMENT)//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%CCOMMENT = TRIM(HCOMMENT)

WAUTELET Philippe
committed
END IF
ELSE
CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),'CCOMMENT was empty -> replaced by TPFIELD%CCOMMENT for article ' &
//TRIM(HREC))
END IF
!Modify and check NGRID
IF (TPFIELD%NGRID/=KGRID) THEN
WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NGRID,KGRID
CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NGRID different ('//TRIM(YTXT) &
//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%NGRID = KGRID

WAUTELET Philippe
committed
END IF
!Modify and check NTYPE
IF (TPFIELD%NTYPE/=KTYPE) THEN
WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NTYPE,KTYPE
CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NTYPE different ('//TRIM(YTXT) &
//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%NTYPE = KTYPE

WAUTELET Philippe
committed
END IF
!Modify and check NDIMS
!
IF(TPFIELD%CMNHNAME=='EMIS' .AND. TPFIELD%NDIMS/=2) THEN
!Special (temporary) treatment for EMIS
CALL PRINT_MSG(NVERB_INFO,'IO',TRIM(HSUBR),'NDIMS forced to 2 for EMIS')
TPFIELD%NDIMS = 2
TPFIELD%NDIMLIST(3) = TPFIELD%NDIMLIST(4) ! Necessary if LTIMEDEP=.TRUE.
TPFIELD%NDIMLIST(4:) = NMNHDIM_UNUSED
END IF
!

WAUTELET Philippe
committed
IF (TPFIELD%NDIMS/=KDIMS) THEN
WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NDIMS,KDIMS
CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NDIMS different ('//TRIM(YTXT) &
//') than expected for article '//TRIM(HREC))

WAUTELET Philippe
committed
TPFIELD%NDIMS = KDIMS

WAUTELET Philippe
committed
END IF
ELSE
CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata')

WAUTELET Philippe
committed
TPFIELD = TFIELDMETADATA( &
CMNHNAME = TRIM(HREC), &
CSTDNAME = '', &
CLONGNAME = TRIM(HREC), &
CUNITS = '', &
CDIR = HDIR, &
CCOMMENT = TRIM(HCOMMENT), &
NGRID = KGRID, &
NTYPE = KTYPE, &
NDIMS = KDIMS, &
LTIMEDEP = .FALSE. )

WAUTELET Philippe
committed
#if 0
IF (TPFIELD%NDIMS==0 .OR. TPFIELD%NTYPE==TYPECHAR .OR. TPFIELD%NTYPE==TYPEDATE .OR. TPFIELD%NTYPE==TYPELOG) THEN
TPFIELD%LTIMEDEP = .FALSE.
ELSE
TPFIELD%LTIMEDEP = .TRUE.
END IF

WAUTELET Philippe
committed
#endif

WAUTELET Philippe
committed
END IF
!
END SUBROUTINE PREPARE_METADATA_WRITE_SURF
END MODULE MODE_WRITE_SURF_MNH_TOOLS
! #############################################################
SUBROUTINE WRITE_SURFX0_MNH(HREC,PFIELD,KRESP,HCOMMENT)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEX0* - routine to write a real scalar
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITEX0 is
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! 06/08 P. Peyrille, V. Masson : change test for writing
!! YY, XY, DX, DY in 1D or 2D configuration
!! 03/09, G.Tanguy : add write_surft1_mnh
!! replace ZUNDEF(surfex) by XUNDEF(MNH)
!! 08/2015 M.Moge write the COVERS as 2D fields because SURFEX cannot write/read 3D fields
!! with Z-splitting using NB_PROC_IO_W / NB_PROC_IO_W
!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF, ONLY: CPROGRAM
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEREAL

WAUTELET Philippe
committed
USE MODD_GRID

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
REAL, INTENT(IN) :: PFIELD ! the real scalar to write
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
INTEGER :: IID, IRESP
TYPE(TFIELDMETADATA) :: TZFIELD

WAUTELET Philippe
committed
!
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF( ( HREC=='LAT0' .OR. HREC=='LON0' .OR. HREC=='RPK' .OR. HREC=='BETA' &
.OR. HREC=='LATORI'.OR. HREC=='LONORI' )&
.AND. CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU' ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX0_MNH',TRIM(HREC)//' not written in file by externalized surface')

WAUTELET Philippe
committed
!
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEREAL,0,'WRITE_SURFX0_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,PFIELD,KRESP)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
IF (TRIM(CPROGRAM)=='PGD') THEN
!Store these variables (necessary for PREP_PGD program when writing netCDF files)
SELECT CASE(TRIM(HREC))
CASE('LON0')
XLON0 = PFIELD
CASE('LAT0')
XLAT0 = PFIELD
CASE('BETA')
XBETA = PFIELD
CASE('RPK')
XRPK = PFIELD
CASE('LONORI')
XLONORI = PFIELD
CASE('LATORI')
XLATORI = PFIELD
CASE DEFAULT
!Nothing to do
END SELECT
END IF
!

WAUTELET Philippe
committed
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
END IF
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFX0_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFX1_MNH(HREC,KL,PFIELD,KRESP,HCOMMENT,HDIR)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
!!
!! PURPOSE
!! -------
!
! The purpose of WRITE_SURFX1 is
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O

WAUTELET Philippe
committed
!! P. Wautelet 01/02/2019: bug: forgotten if for iib=iie and XX (same as for YY)

WAUTELET Philippe
committed
! P. Wautelet 08/12/2023: compute global grid 1D coordinates when needed (for PGD files)
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, tfieldlist, TYPEREAL

WAUTELET Philippe
committed
USE MODD_GRID_n, ONLY: XXHAT, XXHATM, XXHAT_ll, XXHATM_ll, &
XYHAT, XYHATM, XYHAT_ll, XYHATM_ll, &
XHAT_BOUND, XHATM_BOUND

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX

WAUTELET Philippe
committed
USE MODD_IO_SURF_MNH, ONLY :NMASK, CMASK, &

WAUTELET Philippe
committed
NIU, NJU, NIB, NJB, NIE, NJE, &
NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, &
NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
USE MODD_PARAMETERS, ONLY: XUNDEF, JPHEXT

WAUTELET Philippe
committed
use mode_field, only: Find_field_id_from_mnhname
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG

WAUTELET Philippe
committed
USE MODE_SET_GRID, only: INTERP_HORGRID_1DIR_TO_MASSPOINTS, STORE_GRID_1DIR

WAUTELET Philippe
committed
USE MODE_TOOLS_ll
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
USE MODI_UNPACK_1D_2D

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
INTEGER, INTENT(IN) :: KL ! number of points
REAL, DIMENSION(KL), INTENT(IN) :: PFIELD ! array containing the data field
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
! ! 'H' : field with
! ! horizontal spatial dim.
! ! 'A' : entire field with
! ! horizontal spatial dim. :
! ! It is not distributed on
! ! the processors
! ! '-' : no horizontal dim.
!
!* 0.2 Declarations of local variables
!
INTEGER :: J1D ! loop counter
INTEGER :: JILOOP,JJLOOP ! loop indexes

WAUTELET Philippe
committed
!
REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK ! work array written in the file
REAL, DIMENSION(:), ALLOCATABLE :: ZW1D ! 1D work array
!

WAUTELET Philippe
committed
INTEGER :: IID, IRESP
INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for unpacking

WAUTELET Philippe
committed
REAL :: ZUNDEF ! undefined value in SURFEX
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
!* 1. Special cases with no writing
! -----------------------------------
!
IF( HREC=='LAT' &
.OR. HREC=='LON' &
.OR. HREC=='MESH_SIZE' &
.OR. HREC=='DX' &
.OR. HREC=='DY' ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(HREC)//' with mask '// &
TRIM(CMASK)//' not written in file by externalized surface')
RETURN
!
ELSE IF( ( (CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU') &
.OR. CMASK/='FULL ') &
.AND. ( HREC=='ZS' .OR. HREC=='XX' .OR. HREC=='YY') ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX1_MNH',TRIM(HREC)//' with mask '// &
TRIM(CMASK)//' not written in file by externalized surface')
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
RETURN
!
END IF
!
!* 2. Ecriture
! --------------
!
!
IF (HDIR=='A') THEN
IIU = NIU_ALL
IJU = NJU_ALL
IIB = NIB_ALL
IJB = NJB_ALL
IIE = NIE_ALL
IJE = NJE_ALL
ALLOCATE(IMASK(SIZE(NMASK_ALL)))
IMASK = NMASK_ALL
ELSE
IIU = NIU+2*NHALO
IJU = NJU+2*NHALO
IIB = NIB
IJB = NJB
IIE = NIE+2*NHALO
IJE = NJE+2*NHALO
ALLOCATE(IMASK(SIZE(NMASK)))
IMASK = NMASK
END IF
!
ALLOCATE(ZWORK(IIU,IJU))
ZWORK(:,:) = XUNDEF
!
IF (HDIR=='H' .OR. HDIR=='A') THEN
CALL UNPACK_1D_2D(IMASK,PFIELD,ZWORK(IIB:IIE,IJB:IJE))
IF ( HREC=='ZS' ) THEN
IF (LWEST_ll()) THEN
DO JILOOP = 1,JPHEXT
ZWORK(JILOOP,:) = ZWORK(IIB,:)
END DO
END IF
IF (LEAST_ll()) THEN
DO JILOOP = IIU-JPHEXT+1,IIU
ZWORK(JILOOP,:)=ZWORK(IIU-JPHEXT,:)
END DO
END IF
IF (LSOUTH_ll()) THEN
DO JJLOOP = 1,JPHEXT
ZWORK(:,JJLOOP)=ZWORK(:,IJB)
END DO
END IF
IF (LNORTH_ll()) THEN
DO JJLOOP =IJU-JPHEXT+1,IJU
ZWORK(:,JJLOOP)=ZWORK(:,IJU-JPHEXT)
END DO
END IF
END IF
END IF
CALL GET_SURF_UNDEF(ZUNDEF)
WHERE (ZWORK==ZUNDEF) ZWORK=XUNDEF

WAUTELET Philippe
committed
!
!! Add cases in 2D (IJB=IJE) and 1D (IJB=IJE and IIB=IIE)
!! to write the correct mesh
IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') &
.AND. CMASK=='FULL ' .AND. (HREC=='XX' .OR. HREC=='DX') ) THEN
ALLOCATE(ZW1D(IIU))
IF (IIB<IIE .AND. HREC=='XX') THEN
ZW1D(IIB+1:IIE) = 0.5 * ZWORK(IIB:IIE-1,1+JPHEXT) + 0.5 * ZWORK(IIB+1:IIE,1+JPHEXT)
ZW1D(IIB) = 1.5 * ZWORK(IIB ,1+JPHEXT) - 0.5 * ZWORK(IIB+1 ,1+JPHEXT)
DO J1D=JPHEXT,1,-1
ZW1D( J1D) = 2. * ZW1D(J1D+1) - ZW1D(J1D+2)
ZW1D(IIU+1-J1D) = 2. * ZW1D(IIU-J1D) - ZW1D(IIU-J1D-1)
END DO

WAUTELET Philippe
committed
ELSE IF (IIB==IIE .AND. (HREC=='DX' .OR. HREC=='XX')) THEN
ZW1D(IIB-1) = - 0.5 * ZWORK(IIB,1+JPHEXT)
ZW1D(IIB) = 0.5 * ZWORK(IIB,1+JPHEXT)
ZW1D(IIB+1) = 1.5 * ZWORK(IIB,1+JPHEXT)
END IF
!

WAUTELET Philippe
committed
IF (HDIR=='A') THEN

WAUTELET Philippe
committed
CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )

WAUTELET Philippe
committed
TZFIELD%CDIR = '--'

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)

WAUTELET Philippe
committed
END IF
IF (HDIR=='H') THEN

WAUTELET Philippe
committed
CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TFIELDLIST(IID),ZW1D(1+NHALO:IIU-NHALO),KRESP)

WAUTELET Philippe
committed
IF (.NOT. (ASSOCIATED(XXHAT))) THEN
!Store XXHAT if not yet done (necessary for PREP_PGD program when writing netCDF files)
ALLOCATE(XXHAT(IIU-2*NHALO))

WAUTELET Philippe
committed
ALLOCATE(XXHATM(IIU-2*NHALO))

WAUTELET Philippe
committed
XXHAT(:) = ZW1D(1+NHALO:IIU-NHALO)

WAUTELET Philippe
committed
! Interpolations of positions to mass points

WAUTELET Philippe
committed
CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'X', XXHAT, XXHATM )

WAUTELET Philippe
committed
! Collect global domain boundaries
! No need to allocate XXHAT_ll, XXHATM_ll, XHAT_BOUND, XHATM_BOUND, this is done in STORE_GRID_1DIR
CALL STORE_GRID_1DIR( 'X', XXHAT, XXHATM, XXHAT_ll, XXHATM_ll, XHAT_BOUND, XHATM_BOUND )

WAUTELET Philippe
committed
END IF

WAUTELET Philippe
committed
END IF
DEALLOCATE(ZW1D)
ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') &
.AND. CMASK=='FULL ' .AND. (HREC=='YY' .OR. HREC=='DY') ) THEN
ALLOCATE(ZW1D(IJU))
IF (IJB<IJE .AND. HREC=='YY') THEN
ZW1D(IJB+1:IJE) = 0.5 * ZWORK(1+JPHEXT,IJB:IJE-1) + 0.5 * ZWORK(1+JPHEXT,IJB+1:IJE)
ZW1D(IJB) = 1.5 * ZWORK(1+JPHEXT,IJB ) - 0.5 * ZWORK(1+JPHEXT,IJB+1 )
DO J1D=JPHEXT,1,-1
ZW1D( J1D) = 2. * ZW1D(J1D+1) - ZW1D(J1D+2)
ZW1D(IJU+1-J1D) = 2. * ZW1D(IJU-J1D) - ZW1D(IJU-J1D-1)
END DO
ELSE IF (IJB==IJE .AND. (HREC=='DY' .OR. HREC=='YY')) THEN
ZW1D(IJB-1) = - 0.5 * ZWORK(1+JPHEXT,IJB)
ZW1D(IJB) = 0.5 * ZWORK(1+JPHEXT,IJB)
ZW1D(IJB+1) = 1.5 * ZWORK(1+JPHEXT,IJB)
END IF

WAUTELET Philippe
committed
IF (HDIR=='A') THEN

WAUTELET Philippe
committed
CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( TFIELDLIST(IID) )

WAUTELET Philippe
committed
TZFIELD%CDIR = '--'

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)

WAUTELET Philippe
committed
END IF
IF (HDIR=='H') THEN

WAUTELET Philippe
committed
CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TFIELDLIST(IID),ZW1D(1+NHALO:IJU-NHALO),KRESP)

WAUTELET Philippe
committed
IF (.NOT. (ASSOCIATED(XYHAT))) THEN
!Store XYHAT if not yet done (necessary for PREP_PGD program when writing netCDF files)
ALLOCATE(XYHAT(IJU-2*NHALO))

WAUTELET Philippe
committed
ALLOCATE(XYHATM(IJU-2*NHALO))

WAUTELET Philippe
committed
XYHAT(:) = ZW1D(1+NHALO:IJU-NHALO)

WAUTELET Philippe
committed
! Interpolations of positions to mass points

WAUTELET Philippe
committed
CALL INTERP_HORGRID_1DIR_TO_MASSPOINTS( 'Y', XYHAT, XYHATM )

WAUTELET Philippe
committed
! Collect global domain boundaries
! No need to allocate XYHAT_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND, this is done in STORE_GRID_1DIR
CALL STORE_GRID_1DIR( 'Y', XYHAT, XYHATM, XYHAT_ll, XYHATM_ll, XHAT_BOUND, XHATM_BOUND )

WAUTELET Philippe
committed
END IF

WAUTELET Philippe
committed
END IF
DEALLOCATE(ZW1D)
ELSE IF (HDIR=='H') THEN

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO),KRESP)

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(:,:),KRESP)

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,1,'WRITE_SURFX1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,PFIELD(:),KRESP)

WAUTELET Philippe
committed
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!
DEALLOCATE(ZWORK)
DEALLOCATE(IMASK)
!
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFX1_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFX2COV_MNH(HREC,KL1,KL2,PFIELD,OFLAG,KRESP,HCOMMENT,HDIR)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
!!
!! PURPOSE
!! -------
!
! The purpose of WRITE_SURFX1 is
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPELOG, TYPEREAL

WAUTELET Philippe
committed
USE MODD_DATA_COVER_PAR, ONLY: JPCOVER
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, &
NIU, NJU, NIB, NJB, NIE, NJE, &
NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, &
NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
USE MODD_PARAMETERS, ONLY: XUNDEF, JPHEXT

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_TOOLS_ll
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
USE MODI_GET_SURF_UNDEF

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC), INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
INTEGER, INTENT(IN) :: KL1,KL2 ! number of points
REAL, DIMENSION(KL1,KL2), INTENT(IN) :: PFIELD ! array containing the data field
LOGICAL,DIMENSION(:), INTENT(IN) :: OFLAG ! mask for array filling

WAUTELET Philippe
committed
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
! ! 'H' : field with
! ! horizontal spatial dim.
! ! 'A' : entire field with
! ! horizontal spatial dim. :
! ! It is not distributed on
! ! the processors
! ! '-' : no horizontal dim.
!
!* 0.2 Declarations of local variables
!
INTEGER :: J1D ! loop counter

WAUTELET Philippe
committed
!
REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK ! work array written in the file
!
INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for unpacking

WAUTELET Philippe
committed
REAL :: ZUNDEF ! undefined value in SURFEX
CHARACTER(LEN=2) :: YDIR

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC) :: YREC

WAUTELET Philippe
committed
!
!JUANZ
INTEGER :: NCOVER,ICOVER,IKL2, JL2
REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
!JUANZ
LOGICAL :: GCOVER_PACKED ! .T. if cover fields are all packed together

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2COV_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
!* 2. Ecriture
! --------------
!
IF (CMASK/='FULL') RETURN
!
IF (HDIR=='A') THEN
YDIR='--'
IIU = NIU_ALL
IJU = NJU_ALL
IIB = NIB_ALL
IJB = NJB_ALL
IIE = NIE_ALL
IJE = NJE_ALL
ALLOCATE(IMASK(SIZE(NMASK_ALL)))
IMASK = NMASK_ALL
ELSE
YDIR='XY'
IIU = NIU+2*NHALO
IJU = NJU+2*NHALO
IIB = NIB
IJB = NJB
IIE = NIE+2*NHALO
IJE = NJE+2*NHALO
ALLOCATE(IMASK(SIZE(NMASK)))
IMASK = NMASK
END IF
!
! we write the COVERS as 2D fields because SURFEX cannot write/read 3D fields
! with Z-splitting using NB_PROC_IO_W / NB_PROC_IO_W, so we do not use GCOVER_PACKED
!GCOVER_PACKED = ( NB_PROCIO_W /= 1 )
GCOVER_PACKED = .FALSE.

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( &
CMNHNAME = 'COVER_PACKED', &
CSTDNAME = '', &
CLONGNAME = 'COVER_PACKED', &
CUNITS = '', &
CDIR = '--', &
CCOMMENT = '', &
NGRID = 0, &
NTYPE = TYPELOG, &
NDIMS = 0, &
LTIMEDEP = .FALSE. )

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,GCOVER_PACKED,KRESP)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX2COV_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!
ALLOCATE(ZWORK(IIU,IJU))
ZWORK(:,:) = XUNDEF
NCOVER=COUNT(OFLAG)
ALLOCATE(ZWORK3D(IIU,IJU,NCOVER))
ZWORK3D = XUNDEF
!
ICOVER=0
DO IKL2=1,NCOVER
CALL UNPACK_1D_2D(IMASK,PFIELD(:,IKL2),ZWORK3D(IIB:IIE,IJB:IJE,IKL2))

WAUTELET Philippe
committed
!
IF (.NOT. GCOVER_PACKED) THEN
ICOVER=0

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( &
CMNHNAME = 'generic for COVER variables', & !Temporary name to ease identification
CSTDNAME = '', &
CUNITS = '', &
CDIR = YDIR, &
NGRID = 4, &
NTYPE = TYPEREAL, &
NDIMS = 2, &
LTIMEDEP = .FALSE. )
WRITE(YREC,'(A5,I3.3)') 'COVER',JL2

WAUTELET Philippe
committed
TZFIELD%CMNHNAME = TRIM(YREC)

WAUTELET Philippe
committed
TZFIELD%CLONGNAME = TRIM(YREC)
TZFIELD%CCOMMENT = 'X_Y_'//TRIM(YREC)
IF (OFLAG(JL2)) THEN
ICOVER=ICOVER+1

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,ICOVER),KRESP)

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,YDIR,HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2COV_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),KRESP)
END IF
!
DEALLOCATE(ZWORK3D)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX2COV_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!
DEALLOCATE(ZWORK)
DEALLOCATE(IMASK)
!
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFX2COV_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFX2_MNH(HREC,KL1,KL2,PFIELD,KRESP,HCOMMENT,HDIR)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
!!
!! PURPOSE
!! -------
!
! The purpose of WRITE_SURFX2 is
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! G.TANGUY 03/2009 add replace ZUNDEF(surfex) by XUNDEF(MNH)
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
! P. Wautelet 07/02/2023: treat 2D case separately
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE
USE MODD_DATA_COVER_PAR, ONLY: JPCOVER

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEREAL

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, &
NIU, NJU, NIB, NJB, NIE, NJE, &
NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, &
NIE_ALL, NJE_ALL, NMASK_ALL, NHALO
USE MODD_PARAMETERS, ONLY: XUNDEF

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_TOOLS_ll
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
USE MODI_UNPACK_1D_2D

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC), INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
INTEGER, INTENT(IN) :: KL1,KL2 ! number of points
REAL, DIMENSION(KL1,KL2), INTENT(IN) :: PFIELD ! array containing the data field
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
! ! 'H' : field with
! ! horizontal spatial dim.
! ! 'A' : entire field with
! ! horizontal spatial dim. :
! ! It is not distributed on
! ! the processors
! ! '-' : no horizontal dim.
!
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK ! work array written in the file
REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD ! work array written in the file
!
INTEGER :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields

WAUTELET Philippe
committed
INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK ! mask for unpacking
REAL :: ZUNDEF ! undefined value in SURFEX
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFX2_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF (HDIR=='A') THEN
IIU = NIU_ALL
IJU = NJU_ALL
IIB = NIB_ALL
IJB = NJB_ALL
IIE = NIE_ALL
IJE = NJE_ALL
ALLOCATE(IMASK(SIZE(NMASK_ALL)))
IMASK = NMASK_ALL
ELSE
IIU = NIU+2*NHALO
IJU = NJU+2*NHALO
IIB = NIB
IJB = NJB
IIE = NIE+2*NHALO
IJE = NJE+2*NHALO
ALLOCATE(IMASK(SIZE(NMASK)))
IMASK = NMASK
END IF
!
CALL GET_SURF_UNDEF(ZUNDEF)

WAUTELET Philippe
committed
!
IF (HDIR=='H' .OR. HDIR=='A') THEN
ALLOCATE(ZWORK(IIU,IJU,SIZE(PFIELD,2)))
ZWORK(:,:,:) = XUNDEF
CALL UNPACK_1D_2D(NMASK,PFIELD(:,:),ZWORK(IIB:IIE,IJB:IJE,:))
WHERE (ZWORK==ZUNDEF) ZWORK=XUNDEF

WAUTELET Philippe
committed
!
IF (HDIR=='H') THEN
IF ( SIZE(PFIELD,2) == 1 ) THEN
! 2D case
CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX2_MNH',TZFIELD)
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,1),KRESP)
ELSE
CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2_MNH',TZFIELD)
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),KRESP)
END IF

WAUTELET Philippe
committed
END IF
IF (HDIR=='A') THEN
IF ( SIZE(PFIELD,2) == 1 ) THEN
! 2D case
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX2_MNH',TZFIELD)
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(:,:,1),KRESP)
ELSE
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2_MNH',TZFIELD)
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZWORK(:,:,:),KRESP)
END IF

WAUTELET Philippe
committed
END IF
!
DEALLOCATE(ZWORK)
DEALLOCATE(IMASK)
ELSE IF (HDIR=='-') THEN
ALLOCATE(ZFIELD(KL1,KL2))
ZFIELD=PFIELD
WHERE (ZFIELD==ZUNDEF) ZFIELD=XUNDEF

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX2_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ZFIELD(:,:),KRESP)

WAUTELET Philippe
committed
!
DEALLOCATE(ZFIELD)
END IF
!
IF (KRESP /=0) THEN

WAUTELET Philippe
committed
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX2_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFX2_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFN0_MNH(HREC,KFIELD,KRESP,HCOMMENT)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEN0* - routine to write an integer
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITEN0 is
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEINT

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NIU_ALL, NJU_ALL
USE MODD_PARAMETERS, ONLY: JPHEXT

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
INTEGER, INTENT(IN) :: KFIELD ! the integer to write
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
INTEGER :: IFIELD
TYPE(TFIELDMETADATA) :: TZFIELD
CHARACTER(LEN=5) :: YMSG
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF( (HREC=='IMAX' .OR. HREC=='JMAX' .OR. HREC=='KMAX') .AND. &
CSTORAGE_TYPE/='PG' .AND. CSTORAGE_TYPE/='SU' ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(HREC)//' not written in file by externalized surface')

WAUTELET Philippe
committed
ELSE IF (HREC=='VERSION' .OR. HREC=='BUG') THEN
!Field is in fieldlist

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,HREC,KFIELD,KRESP)
IF (HREC=='IMAX') IFIELD = NIU_ALL-2*JPHEXT
IF (HREC=='JMAX') IFIELD = NJU_ALL-2*JPHEXT

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEINT,0,'WRITE_SURFN0_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,IFIELD,KRESP)

WAUTELET Philippe
committed
END IF
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFN0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFN0_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFN1_MNH(HREC,KL,KFIELD,KRESP,HCOMMENT,HDIR)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEN0* - routine to write an integer
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITEN0 is
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEINT

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, &
NIU, NJU, NIB, NJB, NIE, NJE
USE MODD_PARAMETERS, ONLY: NUNDEF

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write
INTEGER, INTENT(IN) :: KL ! number of points

WAUTELET Philippe
committed
INTEGER, DIMENSION(KL), INTENT(IN) :: KFIELD ! the integers to be written
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
! ! 'H' : field with
! ! horizontal spatial dim.
! ! '-' : no horizontal dim.
!
!* 0.2 Declarations of local variables
!
INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array written in the file
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEINT,1,'WRITE_SURFN1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,KFIELD,KRESP)

WAUTELET Philippe
committed
!
ALLOCATE(IWORK(NIU,NJU))
IWORK(:,:) = NUNDEF

WAUTELET Philippe
committed
!
CALL UNPACK_1D_2D(NMASK,KFIELD,IWORK(NIB:NIE,NJB:NJE))

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEINT,2,'WRITE_SURFN1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,IWORK(:,:),KRESP)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
END IF

WAUTELET Philippe
committed
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFN1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFN1_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFC0_MNH(HREC,HFIELD,KRESP,HCOMMENT)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEC0* - routine to write an integer
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITEC0 is
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPECHAR, TYPELOG

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NIU_ALL, NJU_ALL

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
CHARACTER(LEN=40), INTENT(IN) :: HFIELD ! the string to write
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
LOGICAL :: GCARTESIAN
TYPE(TFIELDMETADATA) :: TZFIELD
CHARACTER(LEN=5) :: YMSG
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFC0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU') &
.AND. HREC=='GRID_TYPE ' ) THEN
IF (HFIELD(1:10)=='CONF PROJ ') THEN
GCARTESIAN = .FALSE.
ELSE IF (HFIELD(1:10)=='CARTESIAN ') THEN
GCARTESIAN = .TRUE.
END IF

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,'CARTESIAN',GCARTESIAN,KRESP)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFC0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!

WAUTELET Philippe
committed
END IF
!

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPECHAR,0,'WRITE_SURFC0_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,HFIELD,KRESP)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFC0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFC0_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFL1_MNH(HREC,KL,OFIELD,KRESP,HCOMMENT,HDIR)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEL1* - routine to write a logical array
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITEL1 is
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEINT, TYPELOG

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: NMASK, CMASK, &
NIU, NJU, NIB, NJB, NIE, NJE

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
USE MODI_UNPACK_1D_2D

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write
INTEGER, INTENT(IN) :: KL ! number of points
LOGICAL, DIMENSION(KL), INTENT(IN) :: OFIELD ! array containing the data field

WAUTELET Philippe
committed
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
! ! 'H' : field with
! ! horizontal spatial dim.
! ! '-' : no horizontal dim.
!
!* 0.2 Declarations of local variables
!
LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK ! work array written in the file
INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK ! work array written in the file

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------

WAUTELET Philippe
committed
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF (HDIR=='-') THEN
IF( (CMASK /= 'FULL ').AND. (HREC=='COVER') ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL1_MNH',TRIM(HREC)//' with mask '// &
TRIM(CMASK)//' not written in file by externalized surface')

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPELOG,1,'WRITE_SURFL1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,OFIELD(:),KRESP)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
!
ALLOCATE(GWORK(NIU,NJU))
GWORK(:,:) = .FALSE.

WAUTELET Philippe
committed
!
CALL UNPACK_1D_2D(NMASK,OFIELD,GWORK(NIB:NIE,NJB:NJE))

WAUTELET Philippe
committed
!
ALLOCATE(IWORK(NIU,NJU))
IWORK = 0
WHERE(GWORK) IWORK = 1

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEINT,2,'WRITE_SURFL1_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,IWORK(:,:),KRESP)

WAUTELET Philippe
committed
DEALLOCATE(IWORK)
DEALLOCATE(GWORK)
!
END IF
!

WAUTELET Philippe
committed
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFL1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFL1_MNH
!
!
! #############################################################
SUBROUTINE WRITE_SURFL0_MNH(HREC,OFIELD,KRESP,HCOMMENT)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITEL1* - routine to write a logical
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
!!
!! PURPOSE
!! -------
!
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! S.Malardel *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 01/08/03
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPELOG

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_IO_SURF_MNH, ONLY: CMASK

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_MSG
USE MODE_WRITE_SURF_MNH_TOOLS
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC),INTENT(IN) :: HREC ! name of the article to write

WAUTELET Philippe
committed
LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field
INTEGER, INTENT(OUT) :: KRESP ! return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!
!* 0.2 Declarations of local variables
!

WAUTELET Philippe
committed
CHARACTER(LEN=4), PARAMETER :: YSUFFIX = '_SFX'

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
CHARACTER(LEN=MNH_LEN_HREC) :: YREC

WAUTELET Philippe
committed
TYPE(TFIELDMETADATA) :: TZFIELD
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))

WAUTELET Philippe
committed
!
IF( (CMASK /= 'FULL ').AND. (HREC=='COVER') ) THEN
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFL0_MNH',TRIM(HREC)//' with mask '// &
TRIM(CMASK)//' not written in file by externalized surface')
RETURN

WAUTELET Philippe
committed
! Add a suffix to logical variables coming from SURFEX
! This is done because some variables can have the same name than MesoNH variables
! This suffix has been added in MesoNH 5.6.0

WAUTELET Philippe
committed
YREC = TRIM(HREC) // TRIM(YSUFFIX)
IF ( LEN_TRIM(HREC) + LEN_TRIM(YSUFFIX) > MNH_LEN_HREC ) &
CALL PRINT_MSG( NVERB_WARNING, 'IO', 'WRITE_SURFL0_MNH', TRIM(TFILE_SURFEX%CNAME) // &
': YREC was truncated from ' // TRIM(HREC) // TRIM(YSUFFIX) // ' to ' // TRIM(YREC) )

RODIER Quentin
committed
CALL PREPARE_METADATA_WRITE_SURF(YREC,'--',HCOMMENT,0,TYPELOG,0,'WRITE_SURFL0_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,OFIELD,KRESP)

WAUTELET Philippe
committed
END IF
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFL0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF
!-------------------------------------------------------------------------------
END SUBROUTINE WRITE_SURFL0_MNH
!
! #############################################################
SUBROUTINE WRITE_SURFT0_MNH(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
! #############################################################
!

WAUTELET Philippe
committed
!!**** *WRITET0* - routine to write a MESO-NH date_time scalar
!!
!! PURPOSE
!! -------
!

WAUTELET Philippe
committed
! The purpose of WRITET0 is
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! V. MASSON *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 18/08/97
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEDATE

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_TYPE_DATE

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_IO_FILE

WAUTELET Philippe
committed
USE MODE_MSG

WAUTELET Philippe
committed
USE MODE_WRITE_SURF_MNH_TOOLS

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC), INTENT(IN) :: HREC ! name of the article to be written
INTEGER, INTENT(IN) :: KYEAR ! year
INTEGER, INTENT(IN) :: KMONTH ! month
INTEGER, INTENT(IN) :: KDAY ! day
REAL, INTENT(IN) :: PTIME ! time
INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!* 0.2 Declarations of local variables
!
!
CHARACTER(LEN=MNH_LEN_HREC) :: YRECFM ! Name of the article to be written

WAUTELET Philippe
committed
INTEGER, DIMENSION(3) :: ITDATE
CHARACTER(LEN=5) :: YMSG
TYPE (DATE_TIME) :: TZDATA
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
!
IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT0_MNH',TRIM(HREC)//' not written in file by externalized surface')
RETURN
TZDATA%nyear = kyear
TZDATA%nmonth = kmonth
TZDATA%nday = kday
TZDATA%xtime = PTIME

WAUTELET Philippe
committed
CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEDATE,0,'WRITE_SURFT0_MNH',TZFIELD)

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,TZDATA,KRESP)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
!
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
! #############################################################
SUBROUTINE WRITE_SURFT1_MNH(HREC,KL1,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
! #############################################################
!
!!**** * - routine to write a date vector
!!
!! PURPOSE
!! -------
!
!
!!** METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!!
!! AUTHOR
!! ------
!!
!! G.TANGUY *METEO-FRANCE*
!!
!! MODIFICATIONS
!! -------------
!!
!! original 03/03/09
!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
!----------------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
!

WAUTELET Philippe
committed
use modd_field, only: tfieldmetadata, TYPEINT, TYPEREAL

WAUTELET Philippe
committed
USE MODD_IO, ONLY: TFILE_SURFEX
USE MODD_CONF_n, ONLY: CSTORAGE_TYPE

WAUTELET Philippe
committed
use MODE_IO_FIELD_WRITE, only: IO_Field_write
USE MODE_IO_FILE

WAUTELET Philippe
committed
USE MODE_MSG

WAUTELET Philippe
committed
IMPLICIT NONE
!
!* 0.1 Declarations of arguments
!

RODIER Quentin
committed
CHARACTER(LEN=MNH_LEN_HREC), INTENT(IN) :: HREC ! name of the article to be written
INTEGER, INTENT(IN) :: KL1 ! number of points
INTEGER, DIMENSION(KL1), INTENT(IN) :: KYEAR ! year
INTEGER, DIMENSION(KL1), INTENT(IN) :: KMONTH ! month
INTEGER, DIMENSION(KL1), INTENT(IN) :: KDAY ! day
REAL, DIMENSION(KL1), INTENT(IN) :: PTIME ! time
INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! Comment string
!* 0.2 Declarations of local variables
!
!

WAUTELET Philippe
committed
CHARACTER(LEN=5) :: YMSG
INTEGER, DIMENSION(3,KL1) :: ITDATE
TYPE(TFIELDMETADATA) :: TZFIELD
!-------------------------------------------------------------------------------
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(TFILE_SURFEX%CNAME)//': writing '//TRIM(HREC))
!
IF( HREC=='DTCUR' .AND. CSTORAGE_TYPE/='SU' ) THEN

WAUTELET Philippe
committed
CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFT1_MNH',TRIM(HREC)//' not written in file by externalized surface')
RETURN

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
ITDATE(1,:) = KYEAR (:)
ITDATE(2,:) = KMONTH (:)
ITDATE(3,:) = KDAY (:)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( &
CMNHNAME = TRIM(HREC)//'%TDATE', &
CSTDNAME = '', &
CLONGNAME = TRIM(HREC)//'%TDATE', &
CUNITS = '', &
CDIR = '--', &
CCOMMENT = TRIM(HCOMMENT), &
NGRID = 0, &
NTYPE = TYPEINT, &
NDIMS = 2, &
LTIMEDEP = .FALSE. )

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,ITDATE(:,:),KRESP)

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
TZFIELD = TFIELDMETADATA( &
CMNHNAME = TRIM(HREC)//'%xtime', &
CSTDNAME = '', &
CLONGNAME = TRIM(HREC)//'%xtime', &
CUNITS = '', &
CDIR = '--', &
CCOMMENT = TRIM(HCOMMENT), &
NGRID = 0, &
NTYPE = TYPEREAL, &
NDIMS = 1, &
LTIMEDEP = .FALSE. )

WAUTELET Philippe
committed
!

WAUTELET Philippe
committed
CALL IO_Field_write(TFILE_SURFEX,TZFIELD,PTIME(:),KRESP)

WAUTELET Philippe
committed
!
IF (KRESP /=0) THEN
WRITE ( YMSG, '( I5 )' ) KRESP
CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFT1_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
END IF

WAUTELET Philippe
committed
!