6 #include "nuto/mechanics/constitutive/ConstitutiveBase.h" 7 #include "nuto/mechanics/constitutive/inputoutput/ConstitutiveIOBase.h" 8 #include "nuto/mechanics/constitutive/inputoutput/ConstitutiveIOMap.h" 9 #include "nuto/mechanics/constitutive/inputoutput/ConstitutiveScalar.h" 10 #include "nuto/mechanics/constitutive/inputoutput/ConstitutiveVector.h" 11 #include "nuto/mechanics/constitutive/staticData/DataMoistureTransport.h" 12 #include "nuto/mechanics/elements/ElementOutputBlockVectorDouble.h" 13 #include "nuto/mechanics/elements/ElementOutputBlockMatrixDouble.h" 14 #include "nuto/mechanics/structures/unstructured/Structure.h" 45 for (
int i = 0; i < rS.GetNumNodes(); i++)
48 NuTo::NodeBase&
node = *rS.NodeGetNodePtr(i);
50 double factor = (node.Get(NuTo::Node::eDof::COORDINATES)[0] < 0) ? 0.5 : 1.0;
52 if (node.GetNum(NuTo::Node::eDof::RELATIVEHUMIDITY) != 0)
57 if (node.GetNum(NuTo::Node::eDof::WATERVOLUMEFRACTION) != 0)
69 NuTo::ConstitutiveInputMap constitutiveInputMap;
70 std::vector<NuTo::Constitutive::eInput> inputs{
74 for (
auto input : inputs)
76 constitutiveInputMap[input] = NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(input);
80 (*constitutiveInputMap.at(eInput::RELATIVE_HUMIDITY_DT1))[0] = 0.1;
81 for (
unsigned int i = 0; i < TDim; ++i)
83 (*constitutiveInputMap.at(eInput::RELATIVE_HUMIDITY_GRADIENT))[i] = 0.2;
86 (*constitutiveInputMap.at(eInput::WATER_VOLUME_FRACTION_DT1))[0] = 0.1;
87 for (
unsigned int i = 0; i < TDim; ++i)
89 (*constitutiveInputMap.at(eInput::WATER_VOLUME_FRACTION_GRADIENT))[i] = 0.2;
91 return constitutiveInputMap;
98 NuTo::ConstitutiveOutputMap constitutiveOutputMap;
99 std::vector<eOutput> outputs{
100 eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_B, eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_N,
101 eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_B, eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_N,
102 eOutput::D_INTERNAL_GRADIENT_RH_D_RH_BB_H0, eOutput::D_INTERNAL_GRADIENT_RH_D_RH_NN_H0,
103 eOutput::D_INTERNAL_GRADIENT_RH_D_WV_BN_H0, eOutput::D_INTERNAL_GRADIENT_RH_D_WV_NN_H0,
104 eOutput::D_INTERNAL_GRADIENT_WV_D_RH_NN_H0, eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BB_H0,
105 eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BN_H0, eOutput::D_INTERNAL_GRADIENT_WV_D_WV_NN_H0,
106 eOutput::D_INTERNAL_GRADIENT_RH_D_RH_NN_H1, eOutput::D_INTERNAL_GRADIENT_RH_D_WV_NN_H1,
107 eOutput::D_INTERNAL_GRADIENT_WV_D_WV_NN_H1};
109 for (
auto output : outputs)
111 constitutiveOutputMap[output] = NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(output);
114 return constitutiveOutputMap;
121 double quotient = rCalcValue / rTgtValue;
122 if (quotient < 1.0 - rTol || quotient > 1.0 + rTol)
124 std::cout << rResultName <<
" - Target Value: " << rTgtValue <<
" - Calculated Value: " << rCalcValue
125 <<
" - WRONG" << std::endl;
130 std::cout << rResultName <<
" - Target Value: " << rTgtValue <<
" - Calculated Value: " << rCalcValue
131 <<
" - CORRECT" << std::endl;
140 bool ValuesCorrect =
true;
144 for (
unsigned int i = 0; i < TDim; ++i)
148 (*outputMap.at(eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_B))[i], -6e-13) &&
152 (*outputMap.at(eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_N))[0],
155 for (
unsigned int i = 0; i < TDim; ++i)
158 "InternalGradientWV_B [" + std::to_string(i) +
"]",
159 (*outputMap.at(eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_B))[i], 3.2e-7) &&
163 (*outputMap.at(eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_N))[0],
170 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_RH_BB_H0))[0], -3e-12) &&
174 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_RH_NN_H0))[0], -0.01999995) &&
176 for (
unsigned int i = 0; i < TDim; ++i)
180 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_WV_BN_H0))[i], 8e-13) &&
185 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_WV_NN_H0))[0], 0.0199999) &&
188 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_RH_NN_H0))[0], -5e-8) &&
191 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BB_H0))[0], 1.6e-6) &&
193 for (
unsigned int i = 0; i < TDim; ++i)
197 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BN_H0))[i], 6.4e-7) &&
201 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_NN_H0))[0], 1e-7) &&
207 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_RH_NN_H1))[0], -0.15) &&
210 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_WV_NN_H1))[0], -0.2) &&
213 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_NN_H1))[0], 1000.0) &&
218 throw NuTo::Exception(__PRETTY_FUNCTION__,
"One or more constitutive output values not correct");
226 NuTo::ConstitutiveInputMap constitutiveInputMap;
229 constitutiveInputMap[eInput::RELATIVE_HUMIDITY_BOUNDARY] =
230 NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(eInput::RELATIVE_HUMIDITY_BOUNDARY);
235 (*constitutiveInputMap.at(eInput::RELATIVE_HUMIDITY_BOUNDARY))[0] = 0.4;
238 return constitutiveInputMap;
246 NuTo::ConstitutiveOutputMap constitutiveOutputMap;
247 constitutiveOutputMap[eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_BOUNDARY_N] =
248 NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_BOUNDARY_N);
249 constitutiveOutputMap[eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_BOUNDARY_N] =
250 NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(
251 eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_BOUNDARY_N);
253 constitutiveOutputMap[eOutput::D_INTERNAL_GRADIENT_RH_D_RH_BOUNDARY_NN_H0] =
254 NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(eOutput::D_INTERNAL_GRADIENT_RH_D_RH_BOUNDARY_NN_H0);
255 constitutiveOutputMap[eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BOUNDARY_NN_H0] =
256 NuTo::ConstitutiveIOBase::makeConstitutiveIO<TDim>(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BOUNDARY_NN_H0);
257 return constitutiveOutputMap;
265 bool ValuesCorrect =
true;
268 "mInternalGradientRH_Boundary_N",
269 (*outputMap.at(eOutput::INTERNAL_GRADIENT_RELATIVE_HUMIDITY_BOUNDARY_N))[0], 6e-4) &&
272 "mInternalGradientWV_Boundary_N",
273 (*outputMap.at(eOutput::INTERNAL_GRADIENT_WATER_VOLUME_FRACTION_BOUNDARY_N))[0], 8e-10) &&
278 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_RH_D_RH_BOUNDARY_NN_H0))[0], 1e-3) &&
282 (*outputMap.at(eOutput::D_INTERNAL_GRADIENT_WV_D_WV_BOUNDARY_NN_H0))[0], 1e-9) &&
289 "One or more constitutive output values for the BOUNDARY element not correct");
297 NuTo::Structure S(TDim);
300 std::string testName = std::string(
"ConstitutiveOutputTests") + std::to_string(TDim) +
"D";
302 std::cout << std::endl
303 <<
"-------------------------------------" << std::endl
304 <<
"Start test: " << testName << std::endl
305 <<
"-------------------------------------" << std::endl;
309 SetupStructure<TDim>(S, testName);
310 auto SEC = SetupSection<TDim>(S);
312 std::pair<int, int> meshInfo;
317 meshInfo = NuTo::MeshGenerator::Grid(S, {1}, {1});
320 meshInfo = NuTo::MeshGenerator::Grid(S, {1, 1}, {1, 1});
323 meshInfo = NuTo::MeshGenerator::Grid(S, {1, 1, 1}, {1, 1, 1});
330 for (
auto& it : rDofIPTMap)
331 S.InterpolationTypeAdd(meshInfo.second, it.first, it.second);
333 S.ElementGroupSetSection(meshInfo.first, SEC);
336 SetupIntegrationType<TDim>(S, meshInfo.first);
338 S.ElementTotalConvertToInterpolationType();
343 S.NodeBuildGlobalDofs();
345 NuTo::ElementBase&
element = *S.ElementGetElementPtr(0);
352 NuTo::ConstitutiveInputMap constitutiveInputMap = ConstitutiveOutputTest_CreateConstitutiveInputMap<TDim>();
353 NuTo::ConstitutiveOutputMap constitutiveOutputMap = ConstitutiveOutputTest_CreateConstitutiveOutputMap<TDim>();
355 NuTo::Constitutive::IPConstitutiveLawBase& ipLaw = element.GetIPData().GetIPConstitutiveLaw(0);
356 ipLaw.Evaluate<TDim>(constitutiveInputMap, constitutiveOutputMap);
358 ConstitutiveOutputTest_CheckAndPrintResults<TDim>(constitutiveOutputMap);
394 if (rNodePtr->GetNum(NuTo::Node::eDof::COORDINATES) > 0)
396 double x = rNodePtr->Get(NuTo::Node::eDof::COORDINATES)[0];
398 if (x >= 0.0 - Tol && x <= 0.0 + Tol)
406 int nGrpBE = S.GroupCreate(
"NODES");
407 S.GroupAddNodeFunction(nGrpBE, GetBoundaryNodesLambda);
409 int eGrpBE = S.GroupCreate(
"ELEMENTS");
410 S.GroupAddElementsFromNodes(eGrpBE, nGrpBE,
false);
412 int boundaryNodeID = S.NodeCreateDOFs(
"RELATIVEHUMIDITY");
413 NuTo::NodeBase* BEPtr = S.NodeGetNodePtr(boundaryNodeID);
416 S.BoundaryElementsCreate(eGrpBE, nGrpBE, BEPtr);
418 NuTo::ElementBase& boundaryElement = *S.ElementGetElementPtr(1);
420 NuTo::ConstitutiveInputMap constitutiveInputMapBoundary =
421 ConstitutiveOutputTest_CreateConstitutiveInputMapBoundary<TDim>();
422 NuTo::ConstitutiveOutputMap constitutiveOutputMapBoundary =
423 ConstitutiveOutputTest_CreateConstitutiveOutputMapBoundary<TDim>();
428 NuTo::Constitutive::IPConstitutiveLawBase& ipLawBoundary = boundaryElement.GetIPData().GetIPConstitutiveLaw(0);
429 ipLawBoundary.Evaluate<TDim>(constitutiveInputMapBoundary, constitutiveOutputMapBoundary);
431 ConstitutiveOutputTest_CheckAndPrintResultsBoundary<TDim>(constitutiveOutputMapBoundary);
visualize water volume fraction
int ConstitutiveLawID
Definition: MoistureTransport_Setup.h:97
double DensityWater
Definition: MoistureTransport_Setup.h:80
double BoundaryEnvironmentalRH
Definition: MoistureTransport_Setup.h:85
NuTo::ConstitutiveOutputMap ConstitutiveOutputTest_CreateConstitutiveOutputMapBoundary()
Definition: MoistureTransport_ConstitutiveOutputTest.h:243
Base class for all exceptions thrown in NuTo.
Definition: Exception.h:9
NuTo::ConstitutiveOutputMap ConstitutiveOutputTest_CreateConstitutiveOutputMap()
Definition: MoistureTransport_ConstitutiveOutputTest.h:95
double BoundaryDiffusionCoefficientRH
Definition: MoistureTransport_Setup.h:86
void ConstitutiveOutputTests(std::map< NuTo::Node::eDof, NuTo::Interpolation::eTypeOrder > rDofIPTMap)
Definition: MoistureTransport_ConstitutiveOutputTest.h:295
NuTo::ConstitutiveInputMap ConstitutiveOutputTest_CreateConstitutiveInputMapBoundary()
Definition: MoistureTransport_ConstitutiveOutputTest.h:223
double InitialWaterVolumeFraction
Definition: MoistureTransport_Setup.h:74
visualize relative humidity
double PoreVolumeFraction
Definition: MoistureTransport_Setup.h:76
double BoundaryDiffusionCoefficientWV
Definition: MoistureTransport_Setup.h:87
void SetParametersConstitutiveLaw()
Definition: MoistureTransport_Setup.h:119
void ConstitutiveOutputTest_SetNodalValues(NuTo::Structure &rS, const MoistureTransportControl &rMT)
Definition: MoistureTransport_ConstitutiveOutputTest.h:43
double InitialRelativeHumidity
Definition: MoistureTransport_Setup.h:73
element
Definition: DamageBar.py:31
Definition: DamageLaw.h:5
NuTo::ConstitutiveInputMap ConstitutiveOutputTest_CreateConstitutiveInputMap()
Definition: MoistureTransport_ConstitutiveOutputTest.h:66
double DiffusionExponentWV
Definition: MoistureTransport_Setup.h:82
auto GetBoundaryNodesLambda
Definition: MultiPhysics2D.cpp:405
double DiffusionCoefficientWV
Definition: MoistureTransport_Setup.h:81
bool CheckResultInRelTolerance(std::string rResultName, double rCalcValue, double rTgtValue, double rTol=1e-6)
Definition: MoistureTransport_ConstitutiveOutputTest.h:118
void SetupStaticData()
Definition: MoistureTransport_Setup.h:176
node
Definition: Brick8NCoupling.py:104
Eigen::Vector4d DesorptionCoeffs
Definition: MoistureTransport_Setup.h:95
double DensitySaturatedWaterVapor
Definition: MoistureTransport_Setup.h:79
void ConstitutiveOutputTest_CheckAndPrintResultsBoundary(const NuTo::ConstitutiveOutputMap &outputMap)
Definition: MoistureTransport_ConstitutiveOutputTest.h:262
Definition: MoistureTransport_Setup.h:68
void ConstitutiveOutputTest_SetupMoistureTransport(MoistureTransportControl &rMT)
Definition: MoistureTransport_ConstitutiveOutputTest.h:17
void ConstitutiveOutputTest_CheckAndPrintResults(const NuTo::ConstitutiveOutputMap &outputMap)
Definition: MoistureTransport_ConstitutiveOutputTest.h:137
Eigen::Vector4d AdsorptionCoeffs
Definition: MoistureTransport_Setup.h:94
double MassExchangeRate
–> Calculated from relative humidity
Definition: MoistureTransport_Setup.h:75
double DiffusionExponentRH
Definition: MoistureTransport_Setup.h:78
double DiffusionCoefficientRH
Definition: MoistureTransport_Setup.h:77