From b9054a6ed52ab616503d8049897e796d5e7e3509 Mon Sep 17 00:00:00 2001
From: Guillermo Suarez <guillermo.suarez@scicomp.uni-kl.de>
Date: Thu, 25 Jul 2024 07:41:45 +0000
Subject: [PATCH] Fix/filter fieldconvert

---
 CHANGELOG.md                                      |  3 +++
 docs/user-guide/utilities/fieldconvert.tex        |  4 ++--
 docs/user-guide/xml/xml-filters.tex               |  9 +++++++--
 .../ProcessModules/ProcessBoundaryExtract.cpp     | 10 +++++-----
 library/SolverUtils/Filters/FilterAeroForces.cpp  |  2 +-
 library/SolverUtils/Filters/FilterCheckpoint.cpp  |  3 ++-
 .../SolverUtils/Filters/FilterFieldConvert.cpp    | 15 ++++++++++++++-
 library/SolverUtils/Filters/FilterFieldConvert.h  |  2 ++
 8 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 13a78b4fde..36ce4cb5e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,9 @@ v5.7.0
 - Fix memory-leak with LowEnergyBlock preconditioner for time-updated matrices (!1627)
 - Fix Fourier expansion integration weights are related test (!1803)
 - Separate MeshGraph input/output functions into a new class (!1778)
+- Added checkpoint file writing start time in the fieldconvert filter (!1789)
+- Fix fieldconvert filter incorrect boundary values (!1789)
+- Fix numerical precision issues with filters OutputStartTime (!1789)
 - Fix AdaptiveSFD for MPI (!1821)
 
 **IncNavierStokesSolver**
diff --git a/docs/user-guide/utilities/fieldconvert.tex b/docs/user-guide/utilities/fieldconvert.tex
index 5c75617ca1..6e2e2c4f8d 100644
--- a/docs/user-guide/utilities/fieldconvert.tex
+++ b/docs/user-guide/utilities/fieldconvert.tex
@@ -641,7 +641,7 @@ FieldConvert -m dof file.xml file.fld out.stdout
 This module interpolates the output data to a truly equispaced set of
 points (not equispaced along the collapsed coordinate
 system). Therefore a tetrahedron is represented by a tetrahedral
-number of poinst. This produces much smaller output files. The points
+number of points. This produces much smaller output files. The points
 are then connected together by simplices (triangles and tetrahedrons).
 
 \begin{lstlisting}[style=BashInputStyle]
@@ -651,7 +651,7 @@ FieldConvert -m equispacedoutput test.xml test.fld test.dat
 or
 
 \begin{lstlisting}[style=BashInputStyle]
-FieldConvert -m equispacedouttput test.xml test.fld test.vtu
+FieldConvert -m equispacedoutput test.xml test.fld test.vtu
 \end{lstlisting}
 
 
diff --git a/docs/user-guide/xml/xml-filters.tex b/docs/user-guide/xml/xml-filters.tex
index 6aabe5f69f..af1936527b 100644
--- a/docs/user-guide/xml/xml-filters.tex
+++ b/docs/user-guide/xml/xml-filters.tex
@@ -559,6 +559,8 @@ The following parameters are supported:
     Number of timesteps after which output is written, $M$.\\
     \inltt{Modules} & \xmark   &  &
     FieldConvert modules to run, separated by a white space.\\
+    \inltt{OutputStartTime} & \xmark & 0 &
+    Specifies the simulation time at which to start writing checkpoint files.\\
     \bottomrule
   \end{tabularx}
 \end{center}
@@ -568,11 +570,14 @@ As an example, consider:
 \begin{lstlisting}[style=XMLStyle,gobble=2]
   <FILTER TYPE="FieldConvert">
       <PARAM NAME="OutputFile">MyFile.vtu</PARAM>
-      <PARAM NAME="OutputFrequency">100</PARAM>
+      <PARAM NAME="OutputFrequency">100</PARAM>      
+      <PARAM NAME="OutputStartTime"> 50.0 </PARAM>
       <PARAM NAME="Modules"> vorticity isocontour:fieldid=0:fieldvalue=0.1 </PARAM>
   </FILTER>
 \end{lstlisting}
 
+See the Checkpoint fields filter for more details about the \inltt{OutputStartTime} parameter.
+
 This will create a sequence of files named \inltt{MyFile\_*\_fc.vtu} containing isocontours. 
 The result will be output every 100 time steps.
 
@@ -1216,4 +1221,4 @@ An example is given below:
       <PARAM NAME="RootOutputL2Norm">1</PARAM>
     </FILTER>
   </FILTERS>
-\end{lstlisting}
\ No newline at end of file
+\end{lstlisting}
diff --git a/library/FieldUtils/ProcessModules/ProcessBoundaryExtract.cpp b/library/FieldUtils/ProcessModules/ProcessBoundaryExtract.cpp
index c7f28e801a..dfd2cae3f3 100644
--- a/library/FieldUtils/ProcessModules/ProcessBoundaryExtract.cpp
+++ b/library/FieldUtils/ProcessModules/ProcessBoundaryExtract.cpp
@@ -118,13 +118,13 @@ void ProcessBoundaryExtract::v_Process(po::variables_map &vm)
     else
     {
         m_f->m_bndRegionsToWrite = bndRegions;
+    }
 
-        if (m_f->m_exp[0]->GetNumElmts() != 0)
+    if (m_f->m_exp[0]->GetNumElmts() != 0)
+    {
+        for (int i = 0; i < m_f->m_exp.size(); ++i)
         {
-            for (int i = 0; i < m_f->m_exp.size(); ++i)
-            {
-                m_f->m_exp[i]->FillBndCondFromField(m_f->m_exp[i]->GetCoeffs());
-            }
+            m_f->m_exp[i]->FillBndCondFromField(m_f->m_exp[i]->GetCoeffs());
         }
     }
 }
diff --git a/library/SolverUtils/Filters/FilterAeroForces.cpp b/library/SolverUtils/Filters/FilterAeroForces.cpp
index 60a16ddcdf..3bb7fbb8ef 100644
--- a/library/SolverUtils/Filters/FilterAeroForces.cpp
+++ b/library/SolverUtils/Filters/FilterAeroForces.cpp
@@ -447,7 +447,7 @@ void FilterAeroForces::v_Update(
     {
         return;
     }
-    if ((m_index++) % m_outputFrequency || (time < m_startTime))
+    if ((m_index++) % m_outputFrequency || (time - m_startTime) < -1.0e-07)
     {
         return;
     }
diff --git a/library/SolverUtils/Filters/FilterCheckpoint.cpp b/library/SolverUtils/Filters/FilterCheckpoint.cpp
index c142c2373f..ec91df53f3 100644
--- a/library/SolverUtils/Filters/FilterCheckpoint.cpp
+++ b/library/SolverUtils/Filters/FilterCheckpoint.cpp
@@ -96,7 +96,8 @@ void FilterCheckpoint::v_Update(
     const NekDouble &time)
 {
 
-    if (m_index++ % m_outputFrequency > 0 || time < m_outputStartTime)
+    if (m_index++ % m_outputFrequency > 0 ||
+        (time - m_outputStartTime) < -1.0e-07)
     {
         return;
     }
diff --git a/library/SolverUtils/Filters/FilterFieldConvert.cpp b/library/SolverUtils/Filters/FilterFieldConvert.cpp
index 25035d13ce..44f1a13ba5 100644
--- a/library/SolverUtils/Filters/FilterFieldConvert.cpp
+++ b/library/SolverUtils/Filters/FilterFieldConvert.cpp
@@ -75,6 +75,18 @@ FilterFieldConvert::FilterFieldConvert(
         }
     }
 
+    // Time after which we need to write checkfiles
+    it = pParams.find("OutputStartTime");
+    if (it == pParams.end())
+    {
+        m_outputStartTime = 0;
+    }
+    else
+    {
+        LibUtilities::Equation equ(m_session->GetInterpreter(), it->second);
+        m_outputStartTime = equ.Evaluate();
+    }
+
     // Restart file
     it = pParams.find("RestartFile");
     if (it == pParams.end())
@@ -444,7 +456,8 @@ void FilterFieldConvert::v_Update(
     const NekDouble &time)
 {
     m_index++;
-    if (m_index % m_sampleFrequency > 0)
+    if (m_index % m_sampleFrequency > 0 ||
+        (time - m_outputStartTime) < -1.0e-07)
     {
         return;
     }
diff --git a/library/SolverUtils/Filters/FilterFieldConvert.h b/library/SolverUtils/Filters/FilterFieldConvert.h
index 6e39a48fca..3ac9ffd19a 100644
--- a/library/SolverUtils/Filters/FilterFieldConvert.h
+++ b/library/SolverUtils/Filters/FilterFieldConvert.h
@@ -127,6 +127,8 @@ protected:
     NekDouble m_phaseSamplePhase;
     NekDouble m_phaseTolerance;
     NekDouble m_dt;
+    // Time when we start writing checkfiles
+    NekDouble m_outputStartTime;
 
     std::vector<ModuleSharedPtr> m_modules;
     LibUtilities::FieldMetaDataMap m_fieldMetaData;
-- 
GitLab