diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index 36f8e778d50dd0106d0a68737a151f66ba0d942a..1387fef42fba629b1b789ccc6e4aebad9aa2806e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -5310,25 +5310,56 @@ END SUBROUTINE IO_Field_box_user_intern_write SUBROUTINE IO_Field_user_write( TPOUTPUT ) -! #if 0 ! IMPORTANT: uncomment the previous line (set to '#if 1') if you want to use the next lines +! IMPORTANT: these are examples and some fields could not exist in your simulation => crash is possible in this case +! IMPORTANT: adapt this subroutine to what you want to write, do not keep everything that is present here +! if it has no meaning/use for you +USE MODD_CONF_n, ONLY: NRR USE MODD_DYN_n, ONLY: XTSTEP USE MODD_FIELD_n, ONLY: XUT, XVT, XRT, XTHT, XSVT +USE MODD_NSV, ONLY: NSV +USE MODD_OUT_n, ONLY: LOUT_BIGBOX_WRITE, NOUT_NBOXES USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PRECIP_n, ONLY: XINPRR + +! This block is for the SURFEX-field example +USE MODD_IO_SURF_MNH, ONLY: NHALO, NIU, NJU, NIB, NJB, NIE, NJE +USE MODD_MNH_SURFEX_n, ONLY: YSURF_CUR +USE MODD_SURF_PAR, ONLY: XUNDEF_SFX => XUNDEF #endif -! + IMPLICIT NONE -! + TYPE(TFILEDATA), INTENT(IN) :: TPOUTPUT !Output structure -! -TYPE(TFIELDMETADATA) :: TZFIELD -! + #if 0 ! IMPORTANT: uncomment the previous line (set to '#if 1') if you want to use the next lines +LOGICAL, DIMENSION(:), ALLOCATABLE :: LBOX_WRITE +TYPE(TFIELDMETADATA) :: TZFIELD + + +INTEGER :: IKB +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK ! work array written in the file + +! LBOX_WRITE provides the list of boxes (subdomains) to write (TRUE=>write the box, FALSE=>do not write it) +! +! The entry at position 0 is for the main domain +! Entry 0 is set to true by default if there are no boxes / subdomains (NOUT_BOXES=0 (which is the default value) +! in namelist NAM_OUTPUT) +! or if LOUT_MAINDOMAIN_WRITE=T (also in namelist NAM_OUTPUT) ! -INTEGER :: IKB +! If there are boxes, by default, all the user fields present in this subroutine will be written in all the boxes +! If you do not want this behaviour (ie you do not want to write your fields in all boxes, you have to modify LBOX_WRITE) +! otherwise, do not change the following block +ALLOCATE( LBOX_WRITE(0:NOUT_NBOXES) ) +LBOX_WRITE(:) = .TRUE. +IF ( .NOT. LOUT_BIGBOX_WRITE ) LBOX_WRITE(0) = .FALSE. +! Example: if you do not want to write your field in the box number 2, uncomment the following line +! (remark, for this to work, you need at least 2 boxes!) +! LBOX_WRITE(2) = .FALSE. +! It is also possible to adapt this for different fields and therefore write different fields in different boxes + IKB=JPVEXT+1 @@ -5343,7 +5374,7 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 2, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XUT(:,:,IKB) ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XUT(:,:,IKB) ) TZFIELD = TFIELDMETADATA( & CMNHNAME = 'VTLOW', & @@ -5356,7 +5387,7 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 2, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XVT(:,:,IKB) ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XVT(:,:,IKB) ) TZFIELD = TFIELDMETADATA( & CMNHNAME = 'THTLOW', & @@ -5369,8 +5400,9 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 2, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XTHT(:,:,IKB) ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XTHT(:,:,IKB) ) +IF ( NRR > 0 ) THEN TZFIELD = TFIELDMETADATA( & CMNHNAME = 'RVTLOW', & CLONGNAME = '', & @@ -5383,8 +5415,10 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 2, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XRT(:,:,IKB,1) ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XRT(:,:,IKB,1) ) +END IF +IF ( SIZE( XINPRR ) > 0 ) THEN TZFIELD = TFIELDMETADATA( & CMNHNAME = 'ACPRRSTEP', & CLONGNAME = '', & @@ -5397,8 +5431,10 @@ TZFIELD = TFIELDMETADATA( & NDIMS = 2, & LTIMEDEP = .TRUE. ) !XACPRR is multiplied by 1000. to convert from m to kg m-2 (water density is assumed to be 1000 kg m-3) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XINPRR*XTSTEP*1.0E3 ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XINPRR*XTSTEP*1.0E3 ) +END IF +IF ( NSV > 0 ) THEN TZFIELD = TFIELDMETADATA( & CMNHNAME = 'SVT001', & CLONGNAME = 'SVT001', & @@ -5410,7 +5446,29 @@ TZFIELD = TFIELDMETADATA( & NTYPE = TYPEREAL, & NDIMS = 3, & LTIMEDEP = .TRUE. ) -CALL IO_Field_write( TPOUTPUT, TZFIELD, XSVT(:,:,:,1) ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), XSVT(:,:,:,1) ) +END IF + +! Example of a field from SURFEX that needs to be converted to the right dimensions before writing +ALLOCATE( ZWORK(NIU,NJU) ) + +ZWORK(:,:) = XUNDEF_SFX +ZWORK(NIB:NIE+2*NHALO,NJB:NJE+2*NHALO) = RESHAPE( YSURF_CUR%DU%XT2M(:), [ NIE+2*NHALO-NIB+1,NJE+2*NHALO-NJB+1 ] ) + +TZFIELD = TFIELDMETADATA( & + CMNHNAME = 'T2M', & + CLONGNAME = 'Near surface Air Temperature', & + CSTDNAME = '', & + CUNITS = 'K', & + CDIR = 'XY', & + CCOMMENT = 'X_Y_air temperature at 2m', & + NGRID = 1, & + NTYPE = TYPEREAL, & + NDIMS = 2, & + LTIMEDEP = .TRUE. ) +CALL IO_Field_box_user_write( TPOUTPUT, TZFIELD, LBOX_WRITE(:), ZWORK ) + +DEALLOCATE( ZWORK ) #endif END SUBROUTINE IO_Field_user_write