From ee2ddc016acddd9e0b9908221e98c0584aa471d4 Mon Sep 17 00:00:00 2001
From: Alexander Jaust <alexander.jaust@ipvs.uni-stuttgart.de>
Date: Wed, 24 Apr 2019 17:59:02 +0200
Subject: [PATCH] first version that works

---
 .../iterative/main_freeflow.cc                | 10 ++++++-
 .../iterative/main_solidenergy.cc             | 11 +++++++-
 .../iterative/precice-config.xml              | 10 ++++---
 .../iterative/precicewrapper.cc               | 26 ++++++++++++++++---
 .../iterative/precicewrapper.hh               |  9 +++++--
 .../monolithic/problem_freeflow.hh            |  3 ++-
 6 files changed, 57 insertions(+), 12 deletions(-)

diff --git a/appl/conjugateheattransfer/iterative/main_freeflow.cc b/appl/conjugateheattransfer/iterative/main_freeflow.cc
index 05506f0..fcf3563 100644
--- a/appl/conjugateheattransfer/iterative/main_freeflow.cc
+++ b/appl/conjugateheattransfer/iterative/main_freeflow.cc
@@ -187,7 +187,6 @@ int main(int argc, char** argv) try
 
     //const double preciceDt = precice.initialize();
     //precice.initializeData();
-    const double preciceDt = couplingInterface.initialize();
 
     // Read initialdata for heat-flux if available
     /*
@@ -209,6 +208,15 @@ int main(int argc, char** argv) try
     GetPropType<FreeFlowTypeTag, Properties::IOFields>::initOutputModule(freeFlowVtkWriter);
     freeFlowVtkWriter.write(0.0);
 
+    const double preciceDt = couplingInterface.initialize();
+
+    couplingInterface.initializeData();
+
+    if (couplingInterface.isInitialDataAvailable())
+    {
+      couplingInterface.readHeatFluxFromOtherSolver();
+    }
+
     // instantiate time loop
     using Scalar = GetPropType<FreeFlowTypeTag, Properties::Scalar>;
     const auto tEnd = getParam<Scalar>("TimeLoop.TEnd");
diff --git a/appl/conjugateheattransfer/iterative/main_solidenergy.cc b/appl/conjugateheattransfer/iterative/main_solidenergy.cc
index a8f272c..891e0cb 100644
--- a/appl/conjugateheattransfer/iterative/main_solidenergy.cc
+++ b/appl/conjugateheattransfer/iterative/main_solidenergy.cc
@@ -195,7 +195,6 @@ int main(int argc, char** argv) try
     }
     */
 
-    const double preciceDt = couplingInterface.initialize();
 
     // Read initialdata for heat-flux if available
     /*
@@ -217,6 +216,16 @@ int main(int argc, char** argv) try
     GetPropType<SolidEnergyTypeTag, Properties::IOFields>::initOutputModule(solidEnergyVtkWriter);
     solidEnergyVtkWriter.write(0.0);
 
+    const double preciceDt = couplingInterface.initialize();
+
+    if ( couplingInterface.hasToWriteInitialData() )
+    {
+      getBoundaryTemperatures<GetPropType<SolidEnergyTypeTag, Properties::ThermalConductivityModel>>(*solidEnergyProblem, *solidEnergyGridVariables, sol );
+      couplingInterface.announceInitialDataWritten();
+    }
+
+    couplingInterface.initializeData();
+
     // instantiate time loop
     using Scalar = GetPropType<SolidEnergyTypeTag, Properties::Scalar>;
     const auto tEnd = getParam<Scalar>("TimeLoop.TEnd");
diff --git a/appl/conjugateheattransfer/iterative/precice-config.xml b/appl/conjugateheattransfer/iterative/precice-config.xml
index 916f5f3..f983ded 100644
--- a/appl/conjugateheattransfer/iterative/precice-config.xml
+++ b/appl/conjugateheattransfer/iterative/precice-config.xml
@@ -23,17 +23,21 @@
 
     <participant name="FreeFlow">
       <use-mesh name="FreeFlowMesh" provide="yes"/>
+      <use-mesh name="SolidEnergyMesh" from="SolidEnergy"/>
+
       <write-data name="FreeFlow-Heat-Flux" mesh="FreeFlowMesh"/>
       <read-data name="Solid-Heat-Flux" mesh="FreeFlowMesh"/>
     </participant>
 
     <participant name="SolidEnergy">
-      <use-mesh name="FreeFlowMesh" from="FreeFlow"/>
       <use-mesh name="SolidEnergyMesh" provide="yes"/>
+      <use-mesh name="FreeFlowMesh" from="FreeFlow"/>
       
       <read-data name="FreeFlow-Heat-Flux" mesh="SolidEnergyMesh"/>
       <write-data name="Solid-Heat-Flux" mesh="SolidEnergyMesh"/>
 
+
+      <mapping:nearest-neighbor direction="write" from="SolidEnergyMesh" to="FreeFlowMesh" constraint="consistent"/> 
       <mapping:nearest-neighbor direction="read" from="FreeFlowMesh" to="SolidEnergyMesh" constraint="consistent"/> 
       <!--
       <mapping:nearest-projection direction="read" from="FreeFlowMesh" to="SolidEnergyMesh" constraint="consistent"/>
@@ -50,8 +54,8 @@
       <max-time value="100"/>
       <timestep-length value="1" />
 
-      <exchange data="FreeFlow-Heat-Flux" mesh="FreeFlowMesh" from="FreeFlow" to="SolidEnergy" />
-      <exchange data="Solid-Heat-Flux" mesh="FreeFlowMesh" from="FreeFlow" to="SolidEnergy" initialize="false" />
+      <exchange data="FreeFlow-Heat-Flux" mesh="FreeFlowMesh" from="FreeFlow" to="SolidEnergy" initialize="false" />
+      <exchange data="Solid-Heat-Flux" mesh="FreeFlowMesh" from="SolidEnergy" to="FreeFlow" initialize="true" />
            
     </coupling-scheme:parallel-explicit>
   </solver-interface>
diff --git a/appl/conjugateheattransfer/iterative/precicewrapper.cc b/appl/conjugateheattransfer/iterative/precicewrapper.cc
index 844c43d..19738d7 100644
--- a/appl/conjugateheattransfer/iterative/precicewrapper.cc
+++ b/appl/conjugateheattransfer/iterative/precicewrapper.cc
@@ -85,11 +85,16 @@ double PreciceWrapper::initialize()
   timeStepSize_ = precice_->initialize();
   assert( timeStepSize_ > 0 );
 
-  precice_->initializeData();
   preciceWasInitialized_ = true;
   return timeStepSize_;
 }
 
+void PreciceWrapper::initializeData()
+{
+  assert( preciceWasInitialized_ );
+  precice_->initializeData();
+}
+
 void PreciceWrapper::finalize()
 {
   assert( wasCreated_ );
@@ -187,7 +192,7 @@ bool PreciceWrapper::isCoupledEntity(const int faceID) const
 std::vector<double>& PreciceWrapper::getHeatFluxToWrite()
 {
   assert( wasCreated_ );
-  assert( heatFluxToWrite_ != HeatFluxType::UNDEFINED);
+  assert( writeHeatFluxType_ != HeatFluxType::UNDEFINED);
   if ( writeHeatFluxType_ == HeatFluxType::FreeFlow )
     return freeFlowHeatFlux_;
   else
@@ -265,14 +270,14 @@ void PreciceWrapper::actionIsFulfilled(const std::string& condition)
 void PreciceWrapper::readBlockScalarDataFromPrecice(const int dataID, std::vector<double> &data)
 {
   assert( wasCreated_ );
-  assert( vertexIDs.size() == data.size() );
+  assert( vertexIDs_.size() == data.size() );
   precice_->readBlockScalarData( dataID, vertexIDs_.size(), vertexIDs_.data(), data.data() );
 }
 
 void PreciceWrapper::writeBlockScalarDataToPrecice(const int dataID, std::vector<double> &data)
 {
   assert( wasCreated_ );
-  assert( vertexIDs.size() == data.size() );
+  assert( vertexIDs_.size() == data.size() );
   precice_->writeBlockScalarData( dataID, vertexIDs_.size(), vertexIDs_.data(), data.data() );
 }
 
@@ -282,6 +287,19 @@ bool PreciceWrapper::hasToWriteInitialData()
   return checkIfActionIsRequired(precice::constants::actionWriteInitialData());
 }
 
+void PreciceWrapper::announceInitialDataWritten()
+{
+  assert( wasCreated_ );
+  writeHeatFluxToOtherSolver();
+  precice_->fulfilledAction( precice::constants::actionWriteInitialData() );
+}
+
+bool PreciceWrapper::isInitialDataAvailable()
+{
+  assert( wasCreated_ );
+  return precice_->isReadDataAvailable();
+}
+
 
 bool PreciceWrapper::hasToReadIterationCheckpoint()
 {
diff --git a/appl/conjugateheattransfer/iterative/precicewrapper.hh b/appl/conjugateheattransfer/iterative/precicewrapper.hh
index 98887c0..abc9b8e 100644
--- a/appl/conjugateheattransfer/iterative/precicewrapper.hh
+++ b/appl/conjugateheattransfer/iterative/precicewrapper.hh
@@ -29,8 +29,6 @@ private:
   void readBlockScalarDataFromPrecice( const int dataID, std::vector<double>& data );
   void writeBlockScalarDataToPrecice( const int dataID, std::vector<double>& data );
 
-  bool hasToWriteInitialData();
-
   bool meshWasCreated_;
   bool preciceWasInitialized_;
   int meshID_;
@@ -80,12 +78,18 @@ public:
   bool hasToWriteIterationCheckpoint();
   void announceIterationCheckpointWritten();
 
+  bool hasToWriteInitialData();
+  void announceInitialDataWritten();
+
+  bool isInitialDataAvailable();
+
   void setMesh( const std::string& meshName,
                 const size_t numPoints,
                 std::vector<double>& coordinates,
                 const std::vector<int>& dumuxFaceIDs ) ;
 
   double initialize();
+  void initializeData();
   void finalize();
   //static void initializeData();
 
@@ -105,6 +109,7 @@ public:
   bool isCoupledEntity( const int faceID ) const;
 
 
+
   std::vector<double>& getHeatFluxToWrite();
 
 //  static void readScalarQuantitiy( const int dataID, std::vector<double>& data );
diff --git a/appl/conjugateheattransfer/monolithic/problem_freeflow.hh b/appl/conjugateheattransfer/monolithic/problem_freeflow.hh
index 9f7880a..306f5a7 100644
--- a/appl/conjugateheattransfer/monolithic/problem_freeflow.hh
+++ b/appl/conjugateheattransfer/monolithic/problem_freeflow.hh
@@ -230,7 +230,8 @@ public:
           const Scalar insideLambda = volVars.effectiveThermalConductivity();
           const Scalar boundaryTemperature = couplingInterface.getHeatFluxAtFace(faceId);
           // q = -lambda * (t_face - t_cc) / dx
-          const Scalar qHeat = -insideLambda * (cellCenterTemperature-boundaryTemperature) / distance;
+          //const Scalar qHeat = -insideLambda * (cellCenterTemperature-boundaryTemperature) / distance;
+          const Scalar qHeat = insideLambda * (cellCenterTemperature-boundaryTemperature) / distance;
 
           values[Indices::energyEqIdx] = qHeat;
         }
-- 
GitLab