From 76eb4a2971491c92201c691810535eb8a7d637c5 Mon Sep 17 00:00:00 2001 From: Willem Deconinck <willem.deconinck@ecmwf.int> Date: Tue, 10 Dec 2024 16:02:21 +0000 Subject: [PATCH] transi: Throw errors gracefully for known not-yet-implemented code paths, rather than MPL_ABORT --- src/transi/CMakeLists.txt | 2 +- src/transi/transi.c | 2 +- src/transi/transi_module.F90 | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/transi/CMakeLists.txt b/src/transi/CMakeLists.txt index deb311088..ae97cf5ff 100644 --- a/src/transi/CMakeLists.txt +++ b/src/transi/CMakeLists.txt @@ -39,7 +39,7 @@ if( HAVE_GPU ) PUBLIC_INCLUDES $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> PRIVATE_LIBS trans_gpu_dp - PRIVATE_DEFINITIONS ECTRANS_HAVE_MPI=${ectrans_HAVE_MPI} + PRIVATE_DEFINITIONS ECTRANS_HAVE_MPI=${ectrans_HAVE_MPI} ECTRANS_GPU_VERSION ) if( HAVE_ACC AND CMAKE_Fortran_COMPILER_ID MATCHES NVHPC ) # Propagate flags as link options for downstream targets. Only required for NVHPC diff --git a/src/transi/transi.c b/src/transi/transi.c index 90cbf0623..569e3b974 100644 --- a/src/transi/transi.c +++ b/src/transi/transi.c @@ -44,7 +44,7 @@ const char* trans_error_msg(int errcode) case TRANS_ERROR: return "Trans: Error"; case TRANS_NOTIMPL: - return "Trans: Not (yet) implemented"; + return "Trans: Not implemented"; case TRANS_MISSING_ARG: return "Trans: Required member of the argument structure is missing or not allocated"; case TRANS_UNRECOGNIZED_ARG: diff --git a/src/transi/transi_module.F90 b/src/transi/transi_module.F90 index 982fa4da8..4976f3125 100644 --- a/src/transi/transi_module.F90 +++ b/src/transi/transi_module.F90 @@ -600,6 +600,15 @@ function trans_setup(trans) bind(C,name="trans_setup") result(iret) if( trans%llatlon /= 0 ) llatlon = .True. if( trans%llatlon == 2 ) llatlonshift = .True. +#ifdef ECTRANS_GPU_VERSION + if (llatlon) then + call transi_error("trans_setup: lonlat grid input not (yet) implemented for GPU") + trans%handle = 0 ! Not created! + iret = TRANS_NOTIMPL + return + endif +#endif + if ( .not. is_init ) then err = trans_init() endif @@ -1621,6 +1630,12 @@ function trans_dirtrans_adj(args) bind(C,name="trans_dirtrans_adj") result(iret) RGPM => RGP endif +#ifdef ECTRANS_GPU_VERSION + call transi_error("trans_dirtrans_adj: ERROR: Not implemented for GPU") + iret = TRANS_NOTIMPL + return +#endif + if( args%nvordiv > 0 .and. args%nscalar > 0 ) then call DIR_TRANSAD( KRESOL=trans%handle, & & KPROMA=args%nproma, & @@ -1861,6 +1876,13 @@ function trans_invtrans_adj(args) bind(C,name="trans_invtrans_adj") result(iret) RGPM => RGP endif +#ifdef ECTRANS_GPU_VERSION + call transi_error("trans_invtrans_adj: ERROR: Not implemented for GPU") + iret = TRANS_NOTIMPL + return +#endif + + ! Note that llatlon is not an option in INV_TRANSAD unlile INV_TRANS and DIR_TRANS if( args%nvordiv > 0 .and. args%nscalar > 0 ) then call INV_TRANSAD( KRESOL=trans%handle, & @@ -2293,6 +2315,11 @@ function trans_vordiv_to_UV(args) bind(C,name="trans_vordiv_to_UV") result(iret) endif call C_F_POINTER( args%rspv, RSPV, (/args%nfld,args%ncoeff/) ) +#ifdef ECTRANS_GPU_VERSION + call transi_error("trans_vordiv_to_UV: ERROR: Not implemented for GPU") + iret = TRANS_NOTIMPL + return +#endif if ( .not. is_init ) then err = trans_init()