From 8009eda032b6acc22afb93f081131c58f66f7894 Mon Sep 17 00:00:00 2001 From: Philipp Geier Date: Fri, 21 Feb 2025 14:34:15 +0000 Subject: [PATCH] MULTIOM grib1-to-grib2 Fix setting reduced_gg grid --- src/multiom/api/api_encoder_wrapper_mod.F90 | 3 +++ src/multiom/api/api_extract_metadata_c.cc | 9 +++++---- .../grib2-section3/grib2_section3_040_mod.F90 | 8 +++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/multiom/api/api_encoder_wrapper_mod.F90 b/src/multiom/api/api_encoder_wrapper_mod.F90 index 60efdd638..71883fd05 100644 --- a/src/multiom/api/api_encoder_wrapper_mod.F90 +++ b/src/multiom/api/api_encoder_wrapper_mod.F90 @@ -879,6 +879,9 @@ PP_THREAD_SAFE FUNCTION MULTIO_GRIB2_ENCODER_ENCODE( MULTIO_GRIB2, C_MARS_DICT, PP_TRYCALL(ERRFLAG_EXTRACT_MARS_DICTIONARY) EXTRACT_MARS_DICTIONARY( F_MARS_DICT, MARS_DICT, HOOKS ) PP_TRYCALL(ERRFLAG_EXTRACT_PAR_DICTIONARY) EXTRACT_PAR_DICTIONARY( F_PAR_DICT, PAR_DICT, HOOKS ) + + ! WRITE(6, *) "PAR YAML.." + ! PP_TRYCALL(ERRFLAG_EXTRACT_PAR_DICTIONARY) PAR_DICT%WRITE_TO_YAML(6_JPIB_K, 0_JPIB_K, HOOKS) ! Call the encoder PP_TRYCALL(ERRFLAG_CALL_THE_ENCODER) ENCODER%ENCODE( MARS_DICT, PAR_DICT, METADATA_LIST, HOOKS ) diff --git a/src/multiom/api/api_extract_metadata_c.cc b/src/multiom/api/api_extract_metadata_c.cc index 2be7ff1e6..ab1c77126 100644 --- a/src/multiom/api/api_extract_metadata_c.cc +++ b/src/multiom/api/api_extract_metadata_c.cc @@ -132,7 +132,8 @@ namespace { int getAndSetLongArray(codes_handle* h, void* dict, const char* key, const char* setName=NULL) { if(hasKey(h, key)) { - int ret = multio_grib2_dict_set(dict, setName == NULL ? key : setName, arrayToJSONString(getLongArray(h, key)).data()); + auto jsonData = arrayToJSONString(getLongArray(h, key)); + int ret = multio_grib2_dict_set(dict, setName == NULL ? key : setName, jsonData.data()); if(ret != 0) return ret; } return 0; @@ -148,10 +149,10 @@ namespace { ret = getAndSet(h, geom, "truncateDegrees", "truncate-degrees"); if(ret != 0) return ret; - ret = getAndSetIfNonZero(h, geom, "numberOfPointsALongAMeridian", "number-of-points-along-a-meridian"); + ret = getAndSetIfNonZero(h, geom, "numberOfPointsAlongAMeridian", "number-of-points-along-a-meridian"); if(ret != 0) return ret; - ret = getAndSetIfNonZero(h, geom, "numberOfParallelsBetweenPoleAndEquator", "number-of-parallels-between-pole-and-equator"); + ret = getAndSetIfNonZero(h, geom, "numberOfParallelsBetweenAPoleAndTheEquator", "number-of-parallels-between-pole-and-equator"); if(ret != 0) return ret; ret = getAndSet(h, geom, "latitudeOfFirstGridPointInDegrees", "latitude-of-first-grid-point-in-degrees"); @@ -165,7 +166,7 @@ namespace { ret = getAndSet(h, geom, "longitudeOfLastGridPointInDegrees", "longitude-of-last-grid-point-in-degrees"); if(ret != 0) return ret; - + ret = getAndSetLongArray(h, geom, "pl", "pl"); if(ret != 0) return ret; diff --git a/src/multiom/encoders/encoder-grib2/grib2-section3/grib2_section3_040_mod.F90 b/src/multiom/encoders/encoder-grib2/grib2-section3/grib2_section3_040_mod.F90 index 47f28b06e..78d006d1c 100644 --- a/src/multiom/encoders/encoder-grib2/grib2-section3/grib2_section3_040_mod.F90 +++ b/src/multiom/encoders/encoder-grib2/grib2-section3/grib2_section3_040_mod.F90 @@ -511,6 +511,7 @@ PP_THREAD_SAFE FUNCTION GRIB2_SECTION3_040_ALLOCATE( THIS, & INTEGER(KIND=JPIB_K), PARAMETER :: ERRFLAG_GEOMETRY_PL_ARRAY_NOT_ASSOCIATED=3_JPIB_K INTEGER(KIND=JPIB_K), PARAMETER :: ERRFLAG_NOT_IMPLEMENTED=4_JPIB_K INTEGER(KIND=JPIB_K), PARAMETER :: ERRFLAG_METADATA=5_JPIB_K + INTEGER(KIND=JPIB_K), PARAMETER :: ERRFLAG_GEOMETRY_PL_ARRAY_WRONG_SIZE=6_JPIB_K ! Local variables declared by the preprocessor for debugging purposes PP_DEBUG_DECL_VARS @@ -534,11 +535,12 @@ PP_THREAD_SAFE FUNCTION GRIB2_SECTION3_040_ALLOCATE( THIS, & ! Enable section 3 PP_METADATA_SET( METADATA, ERRFLAG_METADATA, 'gridDefinitionTemplateNumber', 40 ) - + ! Configure the representation SELECT TYPE ( R => PAR%GEOMETRY%REPRES ) CLASS IS (REGULAR_GG_T) + ! Set the specific metadata for a regular_gg grid PP_METADATA_SET( METADATA, ERRFLAG_METADATA, 'gridType','regular_gg' ) @@ -556,6 +558,8 @@ PP_THREAD_SAFE FUNCTION GRIB2_SECTION3_040_ALLOCATE( THIS, & ! Error handling PP_DEBUG_CRITICAL_COND_THROW( .NOT. ASSOCIATED(R%PL), ERRFLAG_GEOMETRY_PL_ARRAY_NOT_ASSOCIATED ) + + PP_DEBUG_CRITICAL_COND_THROW( R%NUMBER_OF_PARALLELS_BETWEEN_POLE_AND_EQUATOR.NE.(SIZE(R%PL)/2), ERRFLAG_GEOMETRY_PL_ARRAY_WRONG_SIZE ) ! Set the specific metadata for a reduced_gg grid PP_METADATA_SET( METADATA, ERRFLAG_METADATA, 'gridType','reduced_gg' ) @@ -609,6 +613,8 @@ PP_THREAD_SAFE FUNCTION GRIB2_SECTION3_040_ALLOCATE( THIS, & PP_DEBUG_PUSH_MSG_TO_FRAME( 'not implemented' ) CASE (ERRFLAG_METADATA) PP_DEBUG_PUSH_MSG_TO_FRAME( 'metadata error' ) + CASE (ERRFLAG_GEOMETRY_PL_ARRAY_WRONG_SIZE) + PP_DEBUG_PUSH_MSG_TO_FRAME( 'Wrong size of PL array or N has a invalid number' ) CASE DEFAULT PP_DEBUG_PUSH_MSG_TO_FRAME( 'unhandled error' ) END SELECT