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