Commit 8c6c046e authored by GILLES Sebastien's avatar GILLES Sebastien
Browse files

#879 Poromechanics: introduce a PorosityParameter object which handles the...

#879 Poromechanics: introduce a PorosityParameter object which handles the value on both solid and fluid mesh.
parent 9143ab70
......@@ -286,6 +286,7 @@
BE2B66621A2778C700E80864 /* RefFEltSpace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE2B66321A2778C700E80864 /* RefFEltSpace.cpp */; };
BE2B66631A2778C700E80864 /* RefFEltSpace.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE2B66331A2778C700E80864 /* RefFEltSpace.hpp */; };
BE2B66641A2778C700E80864 /* RefFEltSpace.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE2B66341A2778C700E80864 /* RefFEltSpace.hxx */; };
BE2B8D9A1CAE9B4300224CEF /* PorosityParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE2B8D971CAE9B4300224CEF /* PorosityParameter.cpp */; };
BE2DCB521C7477430070090E /* libmesh6.c in Sources */ = {isa = PBXBuildFile; fileRef = BE2DCB431C7477420070090E /* libmesh6.c */; settings = {COMPILER_FLAGS = "-w"; }; };
BE2DCB531C7477430070090E /* libmesh6.h in Headers */ = {isa = PBXBuildFile; fileRef = BE2DCB441C7477420070090E /* libmesh6.h */; };
BE2E0CC81ABAFBA800B543E8 /* Domain.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE2E0CC21ABAFBA800B543E8 /* Domain.hpp */; };
......@@ -4345,6 +4346,9 @@
BE2B66321A2778C700E80864 /* RefFEltSpace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RefFEltSpace.cpp; sourceTree = "<group>"; };
BE2B66331A2778C700E80864 /* RefFEltSpace.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = RefFEltSpace.hpp; sourceTree = "<group>"; };
BE2B66341A2778C700E80864 /* RefFEltSpace.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = RefFEltSpace.hxx; sourceTree = "<group>"; };
BE2B8D971CAE9B4300224CEF /* PorosityParameter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PorosityParameter.cpp; path = Private/PorosityParameter.cpp; sourceTree = "<group>"; };
BE2B8D981CAE9B4300224CEF /* PorosityParameter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = PorosityParameter.hpp; path = Private/PorosityParameter.hpp; sourceTree = "<group>"; };
BE2B8D991CAE9B4300224CEF /* PorosityParameter.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = PorosityParameter.hxx; path = Private/PorosityParameter.hxx; sourceTree = "<group>"; };
BE2D0C6018E08560005E8E51 /* Edge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = Edge.hpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
BE2D0C6118E08560005E8E51 /* Face.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; lineEnding = 0; path = Face.hpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
BE2D0C6318E08560005E8E51 /* BuildInterfaceHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BuildInterfaceHelper.cpp; sourceTree = "<group>"; };
......@@ -8317,6 +8321,9 @@
BE9BE1B21C96D02B0065BEFE /* SolidOnFluidMesh.cpp */,
BE9BE1B31C96D02B0065BEFE /* SolidOnFluidMesh.hpp */,
BE9BE1B41C96D02B0065BEFE /* SolidOnFluidMesh.hxx */,
BE2B8D971CAE9B4300224CEF /* PorosityParameter.cpp */,
BE2B8D981CAE9B4300224CEF /* PorosityParameter.hpp */,
BE2B8D991CAE9B4300224CEF /* PorosityParameter.hxx */,
);
name = Private;
sourceTree = "<group>";
......@@ -12294,6 +12301,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
BE2B8D9A1CAE9B4300224CEF /* PorosityParameter.cpp in Sources */,
BE946D881C7DF62A003A829A /* PorosityVariationalFormulation.cpp in Sources */,
BE51CDB41CA3FE9400B66D2A /* ImplicitStepFluidVariationalFormulation.cpp in Sources */,
BEF1832C1C6DE3B2008A6F1E /* Ale.cpp in Sources */,
......@@ -29,6 +29,7 @@
# include "ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluidVariationalFormulation.hpp"
# include "ModelInstances/UnderDevelopment/Poromechanics/Private/SolidOnFluidMesh.hpp"
# include "ModelInstances/UnderDevelopment/Poromechanics/Private/PorosityParameter.hpp"
// \todo #823 Move later in VariationalFormulations!
# include "ModelInstances/UnderDevelopment/Poromechanics/GlobalVariationalOperatorInstances/Mass.hpp"
......@@ -160,20 +161,6 @@ namespace HappyHeart
/// \name Accessors.
///{
//! Accessor to porosity vector.
const GlobalVector& GetPorosityVector() const noexcept;
//! Non constant Accessor to porosity vector.
GlobalVector& GetNonCstPorosityVector() noexcept;
//! Accessor to porosity vector from previous time iteration.
const GlobalVector& GetPorosityVectorPreviousTimeIteration() const noexcept;
//! Accessor to porosity parameter.
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type& GetPorosity() const noexcept;
//! Accessor to porosity parameter from previous time iteration.
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type& GetPorosityPreviousTimeIteration() const noexcept;
//! Get the initial value of porosity.
double GetInitialPorosityValue() const noexcept;
......@@ -235,6 +222,12 @@ namespace HappyHeart
//! Non constant accessor to the inlet pressure parameter.
Parameter<ParameterNS::Type::vector, ParameterNS::TimeDependencyNS::None>& GetNonCstInletPressure() noexcept;
//! Constant accessor to the object which manages porosity parameters on either god of dof.
const Private::PorosityParameter& GetPorosityParameter() const noexcept;
//! Non constant accessor to the object which manages porosity parameters on either god of dof.
Private::PorosityParameter& GetNonCstPorosityParameter() noexcept;
///@}
private:
......@@ -313,12 +306,10 @@ namespace HappyHeart
//! Material parameters related to the solid.
Solid::unique_ptr solid_ = nullptr;
//! Porosity parameter.
ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type::unique_ptr porosity_ = nullptr;
//!
//! Porosity parameter from previous time iteration.
ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type::unique_ptr porosity_prev_time_it_ = nullptr;
//! Parameter that encapsulates fluid_mass_vector.
ParameterAtDof<ParameterNS::Type::scalar>::type::unique_ptr fluid_mass_param_ = nullptr;
......@@ -350,6 +341,9 @@ namespace HappyHeart
* \todo #873 #820 At the moment time dependancy is unceremoniously ignored!
*/
Parameter<ParameterNS::Type::vector, ParameterNS::TimeDependencyNS::None>::unique_ptr inlet_pressure_ = nullptr;
//! Object which manages porosity parameters on either god of dof.
Private::PorosityParameter::unique_ptr porosity_param_ = nullptr;
};
......
......@@ -48,6 +48,7 @@ namespace HappyHeart
{
decltype(auto) varf = GetNonCstPorosityVariationalFormulation();
varf.Update();
GetNonCstPorosityParameter().Update(); // Must be called after varf.Update().
}
......
......@@ -34,51 +34,7 @@ namespace HappyHeart
return false; // ie no additional condition
}
template<class SolidVariationalFormulationPolicyT>
inline const GlobalVector& Model<SolidVariationalFormulationPolicyT>::GetPorosityVector() const noexcept
{
const auto& varf = GetPorosityVariationalFormulation();
return varf.GetSystemSolution(varf.GetNumberingSubset());
}
template<class SolidVariationalFormulationPolicyT>
inline GlobalVector& Model<SolidVariationalFormulationPolicyT>::GetNonCstPorosityVector() noexcept
{
return const_cast<GlobalVector&>(GetPorosityVector());
}
template<class SolidVariationalFormulationPolicyT>
inline const GlobalVector& Model<SolidVariationalFormulationPolicyT>
::GetPorosityVectorPreviousTimeIteration() const noexcept
{
const auto& varf = GetPorosityVariationalFormulation();
return varf.GetPorosityFromPreviousTimeIteration();
}
template<class SolidVariationalFormulationPolicyT>
inline const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type&
Model<SolidVariationalFormulationPolicyT>
::GetPorosity() const noexcept
{
assert(!(!porosity_));
return *porosity_;
}
template<class SolidVariationalFormulationPolicyT>
inline const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type&
Model<SolidVariationalFormulationPolicyT>
::GetPorosityPreviousTimeIteration() const noexcept
{
assert(!(!porosity_prev_time_it_));
return *porosity_prev_time_it_;
}
template<class SolidVariationalFormulationPolicyT>
inline double Model<SolidVariationalFormulationPolicyT>::GetInitialPorosityValue() const noexcept
{
......@@ -240,6 +196,22 @@ namespace HappyHeart
{
return const_cast<Parameter<ParameterNS::Type::vector, ParameterNS::TimeDependencyNS::None>&>(GetInletPressure());
}
template<class SolidVariationalFormulationPolicyT>
inline const Private::PorosityParameter& Model<SolidVariationalFormulationPolicyT>
::GetPorosityParameter() const noexcept
{
assert(!(!porosity_param_));
return *porosity_param_;
}
template<class SolidVariationalFormulationPolicyT>
inline Private::PorosityParameter& Model<SolidVariationalFormulationPolicyT>::GetNonCstPorosityParameter() noexcept
{
return const_cast<Private::PorosityParameter&>(GetPorosityParameter());
}
} // namespace PoromechanicsNS
......
......@@ -192,26 +192,10 @@ namespace HappyHeart
// Beware: porosity_ must be defined after porosity_varf_.
// \todo #820 That's why it's not done within InitParameters; if kept this way comments should
// point it out.
// const auto& unknown = unknown_manager.GetUnknown(EnumUnderlyingType(UnknownIndex::porosity));
// decltype(auto) felt_space_dim = solid_god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::solid));
// decltype(auto) felt_space_dim_minus_1 = solid_god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::inlet_border));
// const auto& porosity_varf = GetPorosityVariationalFormulation();
//
// using type = ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type;
//
// porosity_ = std::make_unique<type>("Porosity",
// solid_mesh,
// felt_space_dim,
// felt_space_dim_minus_1,
// unknown,
// porosity_varf.GetSystemSolution(porosity_varf.GetNumberingSubset()));
//
// porosity_prev_time_it_ = std::make_unique<type>("Porosity from previous time iteration",
// solid_mesh,
// felt_space_dim,
// felt_space_dim_minus_1,
// unknown,
// porosity_varf.GetPorosityPreviousTimeIteration());
const auto& porosity_varf = GetPorosityVariationalFormulation();
porosity_param_ =
std::make_unique<Private::PorosityParameter>(porosity_varf.GetSystemSolution(porosity_varf.GetNumberingSubset()));
}
}
......@@ -223,7 +207,7 @@ namespace HappyHeart
decltype(auto) mpi = parent::MpiHappyHeart();
decltype(auto) fluid_god_of_dof = parent::GetGodOfDof(EnumUnderlyingType(MeshIndex::fluid));
decltype(auto) time_manager = parent::GetTimeManager();
decltype(auto) porosity = GetPorosity();
decltype(auto) porosity_parameter = GetPorosityParameter();
decltype(auto) bc_manager = ::HappyHeart::Private::DirichletBoundaryConditionManager::GetInstance();
decltype(auto) fluid_density = GetFluidDensity();
decltype(auto) fluid_viscosity = GetFluidViscosity();
......@@ -243,8 +227,8 @@ namespace HappyHeart
numbering_subset,
time_manager,
fluid_god_of_dof,
porosity,
GetPorosityPreviousTimeIteration(),
porosity_parameter.GetOnFluidMesh(),
porosity_parameter.GetOnFluidMeshPrevTimeIt(),
fluid_density,
fluid_viscosity,
std::move(bc_list),
......@@ -266,7 +250,7 @@ namespace HappyHeart
implicit_step_fluid_varf_ = std::make_unique<varf_type>(mpi,
time_manager,
fluid_god_of_dof,
porosity,
porosity_parameter.GetOnFluidMesh(),
GetInletPressure(),
std::move(bc_list));
......@@ -330,7 +314,7 @@ namespace HappyHeart
const auto degree_of_exactness = DEFAULT_DEGREE_OF_EXACTNESS;
auto default_rule = DetermineDefaultQuadratureRule(degree_of_exactness);
decltype(auto) porosity = GetPorosity();
decltype(auto) porosity = GetPorosityParameter().GetOnFluidMesh();
fluid_mass_operator_ = std::make_unique<GlobalVariationalOperatorNS::Mass>(felt_space,
velocity,
......
......@@ -43,12 +43,6 @@ namespace HappyHeart
{
decltype(auto) numbering_subset = GetNumberingSubset();
// First of all, update porosity from previous time iteration, before computing the new solution.
// \todo #530 Use swap when sorted out!
GetNonCstPorosityPreviousTimeIteration().Copy(parent::GetSystemSolution(numbering_subset),
__FILE__,
__LINE__);
UpdateSecondMember();
// decltype(auto) time_manager = parent::GetTimeManager();
......@@ -87,12 +81,6 @@ namespace HappyHeart
GlobalMatrixWithCoefficient matrix(GetNonCstSystemMatrix(numbering_subset, numbering_subset), 1.);
GetMass().Assemble(std::make_tuple(std::ref(matrix)));
}
{
porosity_previous_time_iteration_ =
std::make_unique<GlobalVector>(GetSystemRhs(numbering_subset));
}
}
......
......@@ -165,9 +165,6 @@ namespace HappyHeart
//! Fluid density.
const ScalarParameter<>& GetFluidDensity() const noexcept;
//! Porosity of the previous time iteration.
GlobalVector& GetNonCstPorosityPreviousTimeIteration() noexcept;
//! Constant accessor to the current solid displacement (on solid mesh).
const GlobalVector& GetSolidDisplacement() const noexcept;
......@@ -205,9 +202,6 @@ namespace HappyHeart
//! Fluid density.
const ScalarParameter<>& fluid_density_;
//! Porosity of the previous time iteration.
GlobalVector::unique_ptr porosity_previous_time_iteration_ = nullptr;
//! Current solid displacement (on solid mesh).
const GlobalVector& solid_displacement_;
......
......@@ -72,20 +72,7 @@ namespace HappyHeart
return fluid_density_;
}
inline const GlobalVector& PorosityVariationalFormulation::GetPorosityPreviousTimeIteration() const noexcept
{
assert(!(!porosity_previous_time_iteration_));
return *porosity_previous_time_iteration_;
}
inline GlobalVector& PorosityVariationalFormulation::GetNonCstPorosityPreviousTimeIteration() noexcept
{
return const_cast<GlobalVector&>(GetPorosityPreviousTimeIteration());
}
inline const GlobalVector& PorosityVariationalFormulation::GetSolidDisplacement() const noexcept
{
return solid_displacement_;
......
//! \file
//
//
// PorosityParameter.cpp
// HappyHeart
//
// Created by Sebastien Gilles on 01/04/16.
// Copyright © 2016 Inria. All rights reserved.
//
#include "FiniteElement/FiniteElementSpace/GodOfDofManager.hpp"
#include "ModelInstances/UnderDevelopment/Poromechanics/Private/PorosityParameter.hpp"
#include "ModelInstances/UnderDevelopment/Poromechanics/InputParameterList.hpp"
namespace HappyHeart
{
namespace PoromechanicsNS
{
namespace Private
{
PorosityParameter::PorosityParameter(const GlobalVector& solution_porosity_varf)
: solution_porosity_varf_(solution_porosity_varf)
{
decltype(auto) god_of_dof_manager = GodOfDofManager::GetInstance();
decltype(auto) unknown_manager = UnknownManager::GetInstance();
decltype(auto) unknown = unknown_manager.GetUnknown(EnumUnderlyingType(UnknownIndex::porosity));
{
decltype(auto) god_of_dof = god_of_dof_manager.GetGodOfDof(EnumUnderlyingType(MeshIndex::solid));
decltype(auto) mesh = god_of_dof.GetGeometricMeshRegion();
decltype(auto) felt_space = god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::solid));
on_solid_mesh_ =
std::make_unique<ParameterAtDof<ParameterNS::Type::scalar>::type>("Porosity on solid mesh",
mesh,
felt_space,
unknown,
solution_porosity_varf);
}
{
decltype(auto) god_of_dof = god_of_dof_manager.GetGodOfDof(EnumUnderlyingType(MeshIndex::fluid));
decltype(auto) mesh = god_of_dof.GetGeometricMeshRegion();
decltype(auto) felt_space =
god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::fluid));
decltype(auto) numbering_subset =
god_of_dof.GetNumberingSubset(EnumUnderlyingType(NumberingSubsetIndex::porosity));
decltype(auto) felt_space_dim_minus_1 =
god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::inlet_border));
on_fluid_mesh_vector_ = std::make_unique<GlobalVector>(numbering_subset);
auto& underlying_vector = GetNonCstOnFluidMeshVector();
AllocateGlobalVector(god_of_dof, underlying_vector);
// \todo #820 Works only because same underlying mesh and same shape function!
on_fluid_mesh_vector_previous_time_iteration_ = std::make_unique<GlobalVector>(underlying_vector);
underlying_vector.Copy(solution_porosity_varf, __FILE__, __LINE__);
on_fluid_mesh_ =
std::make_unique<fluid_param_at_dof_type>("Porosity on fluid mesh",
mesh,
felt_space,
felt_space_dim_minus_1,
unknown,
underlying_vector);
on_fluid_mesh_prev_time_it_ =
std::make_unique<fluid_param_at_dof_type>("Porosity on fluid mesh from previous time iteration",
mesh,
felt_space,
felt_space_dim_minus_1,
unknown,
GetNonCstOnFluidMeshVectorPreviousTimeIteration());
}
}
void PorosityParameter::Update()
{
// Parameter on solid mesh has automatically been updated when PorosityVariationalFormulation was
// called, as it is a mere reference on the solution there.
// Now the solution must also be 'ported' to the fluid mesh.
auto& on_fluid_vector = GetNonCstOnFluidMeshVector();
// \todo #530 Use Swap when things clarified about it!
GetNonCstOnFluidMeshVectorPreviousTimeIteration().Copy(on_fluid_vector,
__FILE__, __LINE__);
// \todo #820 Works only because same mesh and same shape function at the moment; the former won't
// hold indefinitely (an interpolator will be required at this point).
on_fluid_vector.Copy(GetSolutionPorosityVarf(), __FILE__, __LINE__);
}
} // namespace Private
} // namespace PoromechanicsNS
} // namespace HappyHeart
//! \file
//
//
// PorosityParameter.hpp
// HappyHeart
//
// Created by Sebastien Gilles on 01/04/16.
// Copyright © 2016 Inria. All rights reserved.
//
#ifndef HAPPY_HEART_x_MODEL_INSTANCES_x_UNDER_DEVELOPMENT_x_POROMECHANICS_x_PRIVATE_x_POROSITY_PARAMETER_HPP_
# define HAPPY_HEART_x_MODEL_INSTANCES_x_UNDER_DEVELOPMENT_x_POROMECHANICS_x_PRIVATE_x_POROSITY_PARAMETER_HPP_
# include <memory>
# include <vector>
# include "Parameters/ParameterAtDof.hpp"
namespace HappyHeart
{
namespace PoromechanicsNS
{
namespace Private
{
/*!
* \brief Object in charge of managing porosity parameter; it can spit out the value of this parameter
* on either solid or fluid god of dof.
*/
class PorosityParameter
{
public:
//! Alias to self.
using self = PorosityParameter;
//! Alias to unique pointer.
using unique_ptr = std::unique_ptr<self>;
//! Alias to ParameterAtDof on fluid mesh.
using fluid_param_at_dof_type =
ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>::type;
public:
/// \name Special members.
///@{
/*!
* \brief Constructor.
*
* \param[in] solution_porosity_varf Solution of the PorosityVariationalFormulation.
*
*/
explicit PorosityParameter(const GlobalVector& solution_porosity_varf);
//! Destructor.
~PorosityParameter() = default;
//! Copy constructor.
PorosityParameter(const PorosityParameter&) = delete;
//! Move constructor.
PorosityParameter(PorosityParameter&&) = delete;
//! Copy affectation.
PorosityParameter& operator=(const PorosityParameter&) = delete;
//! Move affectation.
PorosityParameter& operator=(PorosityParameter&&) = delete;
///@}
/*!
* \brief Update all porosity related value.
*
* This should be called immediately after the PorosityVariationalFormulation has been computed.
*/
void Update();
private:
/// \name Accessors
///@{
//! Constant accessor to the solution of the PorosityVariationalFormulation.
const GlobalVector& GetSolutionPorosityVarf() const noexcept;
//! Constant accessor to the porosity parameter on the solid mesh.
const ParameterAtDof<ParameterNS::Type::scalar>::type& GetOnSolidMesh() const noexcept;
//! Non constant accessor to the porosity parameter on the solid mesh.
ParameterAtDof<ParameterNS::Type::scalar>::type& GetNonCstOnSolidMesh() noexcept;
//! Constant accessor to the porosity parameter on the fluid mesh.
const fluid_param_at_dof_type& GetOnFluidMesh() const noexcept;
//! Non constant accessor to the porosity parameter on the fluid mesh.
fluid_param_at_dof_type& GetNonCstOnFluidMesh() noexcept;
//! Constant accessor to the porosity parameter on the fluid mesh during previous time iteration..
const fluid_param_at_dof_type& GetOnFluidMeshPrevTimeIt() const noexcept;
//! Non constant accessor to the porosity parameter on the fluid mesh during previous time iteration..
fluid_param_at_dof_type& GetNonCstOnFluidMeshPrevTimeIt() noexcept;
//! Constant accessor to the underlying global vector for porosity on fluid mesh.
const GlobalVector& GetOnFluidMeshVector() const noexcept;
//! Non constant accessor to the underlying global vector for porosity on fluid mesh.
GlobalVector& GetNonCstOnFluidMeshVector() noexcept;
/*!
* \brief Constant accessor to the underlying global vector for porosity on fluid mesh from previous
* time iteration.
*/
const GlobalVector& GetOnFluidMeshVectorPreviousTimeIteration() const noexcept;
/*!
* \brief Non constant accessor to the underlying global vector for porosity on fluid mesh from
* previous time iteration.
*/
GlobalVector& GetNonCstOnFluidMeshVectorPreviousTimeIteration() noexcept;
///@}