diff --git a/appl/conjugateheattransfer/iterative/main_freeflow.cc b/appl/conjugateheattransfer/iterative/main_freeflow.cc index 05506f097400aeafc7341da1023e92eb78d743d0..fcf35634b70d90f83f1eab2f607ee34c01a9d03b 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 a8f272c45b1b91f141d19b3ff5dc02a38d80db63..891e0cbdecfa41f5009fedec6ed7208372d2bedf 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 916f5f356fadb789c9f9bded30ce33846ecb4875..f983ded3329165ce1c04549978199dd2c383e324 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 844c43daa5e1fa4f2edb1da0b7fbd1db6a888bc0..19738d71df6e4fffd72749ce74322871150adef0 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 98887c0930c3d5b9cf617900027e3ccdb75906ed..abc9b8e3bae79a312d93d8454855abc2ec9468ae 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 9f7880a8b525b2b35283f6a6aeec0376c54d14b7..306f5a7848259aa1f69035e80bd83fc6216c64da 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; }