diff --git a/CMakeLists.txt b/CMakeLists.txt index 9673a5b7..fc60e61d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -104,7 +104,7 @@ ecbuild_add_option( FEATURE OUTPUT_MANAGER ecbuild_add_option( FEATURE OUTPUT_MANAGER_ENCODER_REPORT CONDITION HAVE_OUTPUT_MANAGER - DEFAULT OFF + DEFAULT OFF DESCRIPTION "Enable generation of the encoding report" ) ecbuild_add_option( FEATURE OUTPUT_MANAGER_TOOL diff --git a/src/multiom/CMakeLists.txt b/src/multiom/CMakeLists.txt index 123360cf..c0d117c3 100644 --- a/src/multiom/CMakeLists.txt +++ b/src/multiom/CMakeLists.txt @@ -1,5 +1,3 @@ - - if ( HAVE_OUTPUT_MANAGER ) # Update on new big features diff --git a/src/multiom/common/general_utils_mod.F90 b/src/multiom/common/general_utils_mod.F90 index e7daf5ba..8a9523b9 100644 --- a/src/multiom/common/general_utils_mod.F90 +++ b/src/multiom/common/general_utils_mod.F90 @@ -10,12 +10,44 @@ #define PP_SECTION_NAME 'GENERAL_UTILS_MOD' MODULE GENERAL_UTILS_MOD + ! Symbolds imported from intrinsic modules + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: ERROR_UNIT + USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: OUTPUT_UNIT + + ! Symbols imported from other modules within the project. + USE :: DATAKINDS_DEF_MOD, ONLY: JPIB_K + IMPLICIT NONE !> Default visibility of the module PRIVATE -! Whitelist of public symbols +!> Dr Hook interface for tracing forwarding +INTERFACE + SUBROUTINE DR_HOOK_DEFAULT8_IF(CDNAME,KSWITCH,PKEY) + USE :: DATAKINDS_DEF_MOD, ONLY: JPIM_K + USE :: DATAKINDS_DEF_MOD, ONLY: JPTR_K + IMPLICIT NONE + CHARACTER(LEN=*), INTENT(IN) :: CDNAME + INTEGER(KIND=JPIM_K), INTENT(IN) :: KSWITCH + REAL(KIND=JPTR_K), INTENT(INOUT) :: PKEY + END SUBROUTINE DR_HOOK_DEFAULT8_IF +END INTERFACE + +!> Tracing variables +PROCEDURE(DR_HOOK_DEFAULT8_IF), POINTER :: DR_HOOK => NULL() +LOGICAL :: LHOOK_ = .FALSE. + +!> Default error unit +INTEGER(KIND=JPIB_K) :: JPERR_UNIT=ERROR_UNIT +INTEGER(KIND=JPIB_K) :: JPOUT_UNIT=OUTPUT_UNIT + +!> Whitelist of public symbols (Interfaces) +PUBLIC :: DR_HOOK_DEFAULT8_IF + +!> Whitelist of public symbols (Procedures) +PUBLIC :: SET_CUSTOM_UNITS +PUBLIC :: SET_DR_HOOK PUBLIC :: ENVVAR_IS_DEFINED PUBLIC :: READ_ENVVAR PUBLIC :: REPLACE_ENVVAR_IN_STRING @@ -28,6 +60,42 @@ MODULE GENERAL_UTILS_MOD CONTAINS +#define PP_PROCEDURE_TYPE 'SUBROUTINE' +#define PP_PROCEDURE_NAME 'SET_DR_HOOK' +SUBROUTINE SET_DR_HOOK( LHOOK, DR_HOOK_PROCEDURE ) +IMPLICIT NONE + + ! Dummy arguments + LOGICAL, INTENT(IN) :: LHOOK + PROCEDURE(DR_HOOK_DEFAULT8_IF), POINTER, INTENT(IN) :: DR_HOOK_PROCEDURE + + !> Set the hook + LHOOK_ = LHOOK + DR_HOOK => DR_HOOK_PROCEDURE + +END SUBROUTINE SET_DR_HOOK +#undef PP_PROCEDURE_NAME +#undef PP_PROCEDURE_TYPE + +#define PP_PROCEDURE_TYPE 'SUBROUTINE' +#define PP_PROCEDURE_NAME 'SET_CUSTOM_UNITS' +SUBROUTINE SET_CUSTOM_UNITS( CUSTOM_OUTPUT_UNIT, CUSTOM_ERROR_UNIT ) + + ! Symbols imported from other modules within the project. + USE :: DATAKINDS_DEF_MOD, ONLY: JPIM_K + +IMPLICIT NONE + + ! Dummy arguments + INTEGER(KIND=JPIM_K), INTENT(IN) :: CUSTOM_OUTPUT_UNIT + INTEGER(KIND=JPIM_K), INTENT(IN) :: CUSTOM_ERROR_UNIT + + JPERR_UNIT = CUSTOM_ERROR_UNIT + JPOUT_UNIT = CUSTOM_OUTPUT_UNIT + +END SUBROUTINE SET_CUSTOM_UNITS +#undef PP_PROCEDURE_NAME +#undef PP_PROCEDURE_TYPE #define PP_PROCEDURE_TYPE 'FUNCTION' #define PP_PROCEDURE_NAME 'NEED_FIT_SPECTRUM' diff --git a/src/multiom/hooks/debug/debug_mod.F90 b/src/multiom/hooks/debug/debug_mod.F90 index 94efdd92..d083ee7e 100644 --- a/src/multiom/hooks/debug/debug_mod.F90 +++ b/src/multiom/hooks/debug/debug_mod.F90 @@ -104,7 +104,10 @@ MODULE DEBUG_MOD !> TODO: Add more options to add messages to the frame (i.e. int message, float messge, etc.) !> Print all error frames and their messages - PROCEDURE, PUBLIC, PASS, NON_OVERRIDABLE :: PRINT_ERROR_STACK => DEBUG_PRINT_ERROR_STACK + PROCEDURE, PUBLIC, PASS, NON_OVERRIDABLE :: PRINT_ERROR_STACK_I64 => DEBUG_PRINT_ERROR_STACK_I64 + PROCEDURE, PUBLIC, PASS, NON_OVERRIDABLE :: PRINT_ERROR_STACK_I32 => DEBUG_PRINT_ERROR_STACK_I32 + + GENERIC, PUBLIC :: PRINT_ERROR_STACK => PRINT_ERROR_STACK_I64, PRINT_ERROR_STACK_I32 END TYPE @@ -360,7 +363,7 @@ END SUBROUTINE DEBUG_PUSH_ERROR_MSG !> @param [in] THIS The `DEBUG_T` object containing the error stack to be printed. !> @param [in] UNIT The output unit where the error stack will be printed. !> This can be a file unit or the standard output. -SUBROUTINE DEBUG_PRINT_ERROR_STACK( THIS, UNIT ) +SUBROUTINE DEBUG_PRINT_ERROR_STACK_I64( THIS, UNIT ) ! Symbols imported from other modules within the project. USE :: DATAKINDS_DEF_MOD, ONLY: JPIB_K @@ -506,6 +509,40 @@ SUBROUTINE DEBUG_PRINT_ERROR_STACK( THIS, UNIT ) !> Exit point RETURN -END SUBROUTINE DEBUG_PRINT_ERROR_STACK +END SUBROUTINE DEBUG_PRINT_ERROR_STACK_I64 + +!> +!> @brief Prints all error frames and their associated messages in the `DEBUG_T` structure. +!> +!> This subroutine traverses the error stack in the `DEBUG_T` object and prints +!> each error frame along with its corresponding error messages to the specified +!> output unit. This is useful for debugging purposes, as it provides a complete +!> overview of all recorded errors. +!> +!> @param [in] THIS The `DEBUG_T` object containing the error stack to be printed. +!> @param [in] UNIT The output unit where the error stack will be printed. +!> This can be a file unit or the standard output. +SUBROUTINE DEBUG_PRINT_ERROR_STACK_I32( THIS, UNIT ) + + ! Symbols imported from other modules within the project. + USE :: DATAKINDS_DEF_MOD, ONLY: JPIM_K + USE :: DATAKINDS_DEF_MOD, ONLY: JPIB_K + +IMPLICIT NONE + + !> Dummy arguments + CLASS(DEBUG_T), INTENT(IN) :: THIS + INTEGER(KIND=JPIM_K), INTENT(IN) :: UNIT + + !> Local variables + INTEGER(KIND=JPIB_K) :: LOC_UNIT + + !> Convert the integer unit to the default kind + LOC_UNIT = INT(UNIT, KIND=JPIB_K) + + !> Call the I64 version of the subroutine + CALL THIS%PRINT_ERROR_STACK_I64( LOC_UNIT ) + +END SUBROUTINE DEBUG_PRINT_ERROR_STACK_I32 END MODULE DEBUG_MOD diff --git a/src/multiom/ifs-interface/ifs_msg_mod.F90 b/src/multiom/ifs-interface/ifs_msg_mod.F90 index e723603a..19b5478f 100644 --- a/src/multiom/ifs-interface/ifs_msg_mod.F90 +++ b/src/multiom/ifs-interface/ifs_msg_mod.F90 @@ -97,6 +97,8 @@ MODULE IFS_MSG_MOD INTEGER (KIND=JPIB_K) :: KLEV INTEGER (KIND=JPIB_K) :: IFCST INTEGER (KIND=JPIB_K) :: NSTEP + INTEGER (KIND=JPIB_K) :: ITMAX + INTEGER (KIND=JPIB_K) :: ITMIN CHARACTER(LEN=2) :: MARSTYPE CHARACTER(LEN=14) :: CDATE !> @brief true if there are missing values in the message END TYPE @@ -1909,6 +1911,12 @@ PP_THREAD_SAFE FUNCTION WRITE_WAM( DATA, UNIT, HOOKS ) RESULT(RET) WRITE(UNIT,IOSTAT=STAT) INT( DATA%NSTEP, INT64 ) PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_WRITE_WAM ) + WRITE(UNIT,IOSTAT=STAT) INT( DATA%ITMIN, INT64 ) + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_WRITE_WAM ) + + WRITE(UNIT,IOSTAT=STAT) INT( DATA%ITMAX, INT64 ) + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_WRITE_WAM ) + WRITE(UNIT,IOSTAT=STAT) DATA%LRSTST0 PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_WRITE_WAM ) @@ -2171,6 +2179,20 @@ PP_THREAD_SAFE FUNCTION READ_WAM(DATA, UNIT, VERBOSE, HOOKS ) RESULT(RET) WRITE(ERROR_UNIT,*) ' + MSG_WAM%NSTEP................. :: ', DATA%NSTEP ENDIF + READ(UNIT,IOSTAT=STAT) ITMP + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_READ_WAM ) + DATA%ITMIN = INT( ITMP, KIND(DATA%ITMIN) ) + IF ( VERBOSE ) THEN + WRITE(ERROR_UNIT,*) ' + MSG_WAM%ITMIN................. :: ', DATA%ITMIN + ENDIF + + READ(UNIT,IOSTAT=STAT) ITMP + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_READ_WAM ) + DATA%ITMAX = INT( ITMP, KIND(DATA%ITMAX) ) + IF ( VERBOSE ) THEN + WRITE(ERROR_UNIT,*) ' + MSG_WAM%ITMAX................. :: ', DATA%ITMAX + ENDIF + READ(UNIT,IOSTAT=STAT) DATA%LRSTST0 PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_READ_WAM ) IF ( VERBOSE ) THEN @@ -2354,6 +2376,10 @@ PP_THREAD_SAFE FUNCTION PRINT_WAM( DATA, UNIT, HOOKS ) RESULT(RET) PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_PRINT_WAM ) WRITE(UNIT,*,IOSTAT=STAT) ' + MSG_WAM%NSTEP................. :: ', DATA%NSTEP PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_PRINT_WAM ) + WRITE(UNIT,*,IOSTAT=STAT) ' + MSG_WAM%ITMIN................. :: ', DATA%ITMIN + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_PRINT_WAM ) + WRITE(UNIT,*,IOSTAT=STAT) ' + MSG_WAM%ITMAX................. :: ', DATA%ITMAX + PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_PRINT_WAM ) WRITE(UNIT,*,IOSTAT=STAT) ' + MSG_WAM%LRSTST0............... :: ', DATA%LRSTST0 PP_DEBUG_DEVELOP_COND_THROW( STAT.NE.0, ERRFLAG_UNABLE_TO_PRINT_WAM ) WRITE(UNIT,*,IOSTAT=STAT) ' + MSG_WAM%MARSTYPE.............. :: ', DATA%MARSTYPE diff --git a/src/multiom/multiom_api.F90 b/src/multiom/multiom_api.F90 index 8c2052da..60dcf8da 100644 --- a/src/multiom/multiom_api.F90 +++ b/src/multiom/multiom_api.F90 @@ -97,6 +97,9 @@ MODULE MULTIOM_API USE :: GENERAL_UTILS_MOD, ONLY: READ_TYPE_FROM_ENV USE :: GENERAL_UTILS_MOD, ONLY: READ_YAML_FROM_ENV USE :: GENERAL_UTILS_MOD, ONLY: NEED_FIT_SPECTRUM + USE :: GENERAL_UTILS_MOD, ONLY: SET_CUSTOM_UNITS + USE :: GENERAL_UTILS_MOD, ONLY: SET_DR_HOOK + USE :: GENERAL_UTILS_MOD, ONLY: DR_HOOK_DEFAULT8_IF IMPLICIT NONE @@ -116,12 +119,23 @@ MODULE MULTIOM_API PUBLIC :: JPRM_K PUBLIC :: JPRD_K +! Serialization helpers +PUBLIC :: MODEL_PAR_SERIAL_T +PUBLIC :: PAR_SERIALIZE +PUBLIC :: PAR_DESERIALIZE + ! Enumerators +PUBLIC :: CPREFIX2IPREFIX +PUBLIC :: IPREFIX2IMSGTYPE PUBLIC :: IPREFIX2ILEVTYPE PUBLIC :: ILEVTYPE2CLEVTYPE PUBLIC :: IREPRES2CREPRES PUBLIC :: VALUES_SP_E PUBLIC :: VALUES_DP_E +PUBLIC :: ATM_MSG_E +PUBLIC :: WAM_MSG_E +PUBLIC :: REPRES_GAUSSIANGRID_E +PUBLIC :: REPRES_SPHERICALHARMONICS_E ! ifs interface PUBLIC :: OM_ATM_MSG_T @@ -165,6 +179,14 @@ MODULE MULTIOM_API PUBLIC :: MAKE_OUTPUT_MANAGER PUBLIC :: DESTROY_OUTPUT_MANAGER +! General utils +PUBLIC :: READ_TYPE_FROM_ENV +PUBLIC :: READ_YAML_FROM_ENV +PUBLIC :: NEED_FIT_SPECTRUM +PUBLIC :: SET_CUSTOM_UNITS +PUBLIC :: SET_DR_HOOK +PUBLIC :: DR_HOOK_DEFAULT8_IF + END MODULE MULTIOM_API #undef PP_SECTION_NAME #undef PP_SECTION_TYPE