From d0846763dac3fc942ca41a030aa7329ca95ff60d Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 26 Aug 2021 11:13:02 +0200
Subject: [PATCH] Change initialization order to fix FPE trapping mess

PETSc was initialized after FPEManager and could replace its defined
policy leading to unexpected trapping (underflows for instance when
multiplying very small numbers)
---
 src/utils/PETScWrapper.cpp | 1 +
 src/utils/PugsUtils.cpp    | 9 +++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/utils/PETScWrapper.cpp b/src/utils/PETScWrapper.cpp
index f88bbfd8a..18b16aa14 100644
--- a/src/utils/PETScWrapper.cpp
+++ b/src/utils/PETScWrapper.cpp
@@ -13,6 +13,7 @@ initialize([[maybe_unused]] int& argc, [[maybe_unused]] char* argv[])
 {
 #ifdef PUGS_HAS_PETSC
   PetscOptionsSetValue(NULL, "-no_signal_handler", "true");
+  PetscOptionsSetValue(NULL, "-fp_trap", "false");
   PetscInitialize(&argc, &argv, 0, 0);
 #endif   // PUGS_HAS_PETSC
 }
diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp
index d35fa95f4..696dd8f86 100644
--- a/src/utils/PugsUtils.cpp
+++ b/src/utils/PugsUtils.cpp
@@ -79,6 +79,8 @@ std::string
 initialize(int& argc, char* argv[])
 {
   parallel::Messenger::create(argc, argv);
+  bool enable_fpe     = true;
+  bool enable_signals = true;
 
   std::string filename;
   {
@@ -100,10 +102,8 @@ initialize(int& argc, char* argv[])
     bool enable_color = true;
     app.add_flag("--color,!--no-color", enable_color, "Colorize console output [default: true]");
 
-    bool enable_fpe = true;
     app.add_flag("--fpe,!--no-fpe", enable_fpe, "Trap floating point exceptions [default: true]");
 
-    bool enable_signals = true;
     app.add_flag("--signal,!--no-signal", enable_signals, "Catches signals [default: true]");
 
     bool pause_on_error = false;
@@ -119,14 +119,15 @@ initialize(int& argc, char* argv[])
     }
 
     ConsoleManager::init(enable_color);
-    FPEManager::init(enable_fpe);
     SignalManager::setPauseForDebug(pause_on_error);
-    SignalManager::init(enable_signals);
   }
 
   PETScWrapper::initialize(argc, argv);
   SLEPcWrapper::initialize(argc, argv);
 
+  FPEManager::init(enable_fpe);
+  SignalManager::init(enable_signals);
+
   setDefaultOMPEnvironment();
   Kokkos::initialize(argc, argv);
   std::cout << "----------------- " << rang::fg::green << "pugs exec info" << rang::fg::reset
-- 
GitLab