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()