Commit 461fd48a authored by GILLES Sebastien's avatar GILLES Sebastien
Browse files

#1022 Make hybridVector operator a template class, and add arguments that will...

#1022 Make hybridVector operator a template class, and add arguments that will replace pressure inside.
parent 68af1e18
......@@ -1242,8 +1242,6 @@
BE71B91D1DB75AE5005DCB59 /* Darcy.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8DF1DB75AE5005DCB59 /* Darcy.hxx */; };
BE71B9201DB75AE5005DCB59 /* Darcy.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8E21DB75AE5005DCB59 /* Darcy.hpp */; };
BE71B9211DB75AE5005DCB59 /* Darcy.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8E31DB75AE5005DCB59 /* Darcy.hxx */; };
BE71B9221DB75AE5005DCB59 /* HybridVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE71B8E61DB75AE5005DCB59 /* HybridVector.cpp */; };
BE71B9231DB75AE5005DCB59 /* HybridVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE71B8E61DB75AE5005DCB59 /* HybridVector.cpp */; };
BE71B9241DB75AE5005DCB59 /* HybridVector.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8E71DB75AE5005DCB59 /* HybridVector.hpp */; };
BE71B9251DB75AE5005DCB59 /* HybridVector.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8E81DB75AE5005DCB59 /* HybridVector.hxx */; };
BE71B9281DB75AE5005DCB59 /* T21.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8EB1DB75AE5005DCB59 /* T21.hpp */; };
......@@ -1252,8 +1250,6 @@
BE71B92B1DB75AE5005DCB59 /* T33.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE71B8ED1DB75AE5005DCB59 /* T33.cpp */; };
BE71B92C1DB75AE5005DCB59 /* T33.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8EE1DB75AE5005DCB59 /* T33.hpp */; };
BE71B92D1DB75AE5005DCB59 /* T33.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8EF1DB75AE5005DCB59 /* T33.hxx */; };
BE71B92E1DB75AE5005DCB59 /* HybridVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE71B8F11DB75AE5005DCB59 /* HybridVector.cpp */; };
BE71B92F1DB75AE5005DCB59 /* HybridVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE71B8F11DB75AE5005DCB59 /* HybridVector.cpp */; };
BE71B9301DB75AE5005DCB59 /* HybridVector.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8F21DB75AE5005DCB59 /* HybridVector.hpp */; };
BE71B9311DB75AE5005DCB59 /* HybridVector.hxx in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8F31DB75AE5005DCB59 /* HybridVector.hxx */; };
BE71B9341DB75AE5005DCB59 /* T21.hpp in Headers */ = {isa = PBXBuildFile; fileRef = BE71B8F61DB75AE5005DCB59 /* T21.hpp */; };
......@@ -5873,7 +5869,6 @@
BE71B8DF1DB75AE5005DCB59 /* Darcy.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Darcy.hxx; sourceTree = "<group>"; };
BE71B8E21DB75AE5005DCB59 /* Darcy.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Darcy.hpp; sourceTree = "<group>"; };
BE71B8E31DB75AE5005DCB59 /* Darcy.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Darcy.hxx; sourceTree = "<group>"; };
BE71B8E61DB75AE5005DCB59 /* HybridVector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridVector.cpp; sourceTree = "<group>"; };
BE71B8E71DB75AE5005DCB59 /* HybridVector.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridVector.hpp; sourceTree = "<group>"; };
BE71B8E81DB75AE5005DCB59 /* HybridVector.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridVector.hxx; sourceTree = "<group>"; };
BE71B8EB1DB75AE5005DCB59 /* T21.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = T21.hpp; sourceTree = "<group>"; };
......@@ -5881,7 +5876,6 @@
BE71B8ED1DB75AE5005DCB59 /* T33.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = T33.cpp; sourceTree = "<group>"; };
BE71B8EE1DB75AE5005DCB59 /* T33.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = T33.hpp; sourceTree = "<group>"; };
BE71B8EF1DB75AE5005DCB59 /* T33.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = T33.hxx; sourceTree = "<group>"; };
BE71B8F11DB75AE5005DCB59 /* HybridVector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HybridVector.cpp; sourceTree = "<group>"; };
BE71B8F21DB75AE5005DCB59 /* HybridVector.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridVector.hpp; sourceTree = "<group>"; };
BE71B8F31DB75AE5005DCB59 /* HybridVector.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HybridVector.hxx; sourceTree = "<group>"; };
BE71B8F61DB75AE5005DCB59 /* T21.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = T21.hpp; sourceTree = "<group>"; };
......@@ -10267,7 +10261,6 @@
BE71B8E51DB75AE5005DCB59 /* GlobalVariationalOperatorInstances */ = {
isa = PBXGroup;
children = (
BE71B8E61DB75AE5005DCB59 /* HybridVector.cpp */,
BE71B8E71DB75AE5005DCB59 /* HybridVector.hpp */,
BE71B8E81DB75AE5005DCB59 /* HybridVector.hxx */,
BE71B8EB1DB75AE5005DCB59 /* T21.hpp */,
......@@ -10282,7 +10275,6 @@
BE71B8F01DB75AE5005DCB59 /* LocalVariationalOperatorInstances */ = {
isa = PBXGroup;
children = (
BE71B8F11DB75AE5005DCB59 /* HybridVector.cpp */,
BE71B8F21DB75AE5005DCB59 /* HybridVector.hpp */,
BE71B8F31DB75AE5005DCB59 /* HybridVector.hxx */,
BE71B8F61DB75AE5005DCB59 /* T21.hpp */,
......@@ -15470,11 +15462,9 @@
BE17E7B01D7EA9E300A1AE6A /* SolidDisplacement.cpp in Sources */,
BE17E7B11D7EA9E300A1AE6A /* LoadOnSolid.cpp in Sources */,
BE17E7B21D7EA9E300A1AE6A /* InitialPorosityValue.cpp in Sources */,
BE71B9231DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE71B92B1DB75AE5005DCB59 /* T33.cpp in Sources */,
BE17E7B41D7EA9E300A1AE6A /* Fluidmass.cpp in Sources */,
BE17E7B61D7EA9E300A1AE6A /* Porosity.cpp in Sources */,
BE71B92F1DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE17E7B71D7EA9E300A1AE6A /* PenalizationPorosity.cpp in Sources */,
BE17E7B91D7EA9E300A1AE6A /* GradOnGradientBasedElasticityTensor.cpp in Sources */,
BE17E7BB1D7EA9E300A1AE6A /* ScalarDivVectorial.cpp in Sources */,
......@@ -15844,13 +15834,11 @@
BE6FB2241D8C3BF300B9F0FB /* LoadOnSolid.cpp in Sources */,
BE6FB2121D8C3BD800B9F0FB /* FluidPressure.cpp in Sources */,
BE71B9121DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE71B92E1DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE6FB20A1D8C3BCD00B9F0FB /* VariableHolder.cpp in Sources */,
BE6FB2111D8C3BD800B9F0FB /* Porosity.cpp in Sources */,
BE6FB2271D8C3BF300B9F0FB /* Porosity.cpp in Sources */,
BE71B90A1DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE6FB22C1D8C3BF300B9F0FB /* InternalFriction.cpp in Sources */,
BE71B9221DB75AE5005DCB59 /* HybridVector.cpp in Sources */,
BE6FB2101D8C3BD800B9F0FB /* SolidVelocity.cpp in Sources */,
BE6FB22B1D8C3BF300B9F0FB /* InitialPorosityValue.cpp in Sources */,
);
//! \file
//
//
// HybridVector.hxx
// HappyHeart
//
// Created by Sebastien Gilles on 03/02/15.
// Copyright (c) 2015 Inria. All rights reserved.
//
#include "Operators/GlobalVariationalOperator/ExtractLocalDofValues.hpp"
#include "ModelInstances/UnderDevelopment/Poromechanics/ImplicitStep/ImplicitStepFluid/NewtonFixedPoint/GlobalVariationalOperatorInstances/HybridVector.hpp"
namespace HappyHeart
{
namespace PoromechanicsNS
{
namespace ImplicitStepFluidNS
{
namespace NewtonFixedPointNS
{
namespace GlobalVariationalOperatorNS
{
HybridVector
::HybridVector(const FEltSpace& felt_space,
const Unknown& fluid_mass,
const Unknown& fluid_velocity,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
const ParameterAtDof<ParameterNS::Type::scalar>& current_fluid_pressure,
double fluid_source_term,
const QuadratureRulePerTopology* const quadrature_rule_per_topology)
: parent(felt_space,
fluid_mass,
fluid_velocity,
std::move(quadrature_rule_per_topology),
AllocateGradientFEltPhi::yes,
DoComputeProcessorWiseLocal2Global::no,
density,
porosity,
current_fluid_pressure,
fluid_source_term)
{
assert(fluid_mass.GetNature() == UnknownNS::Nature::scalar);
felt_space.ComputeLocal2Global(Advanced::GlobalVariationalOperatorNS::DetermineExtendedUnknownList(felt_space, fluid_velocity),
DoComputeProcessorWiseLocal2Global::yes);
}
const std::string& HybridVector::ClassName()
{
static std::string name("HybridVector (part of fluid mass contrib to rhs)");
return name;
}
void HybridVector
::SetComputeEltArrayArguments(const LocalFEltSpace& local_felt_space,
typename parent::local_variational_operator_type& local_operator,
std::tuple<const GlobalVector&>&& additional_arguments) const
{
::HappyHeart::GlobalVariationalOperatorNS::ExtractLocalDofValues(local_felt_space,
this->GetNthUnknown(1), // for velocity
std::get<0>(additional_arguments),
local_operator.GetNonCstCurrentLocalVelocity());
}
} // namespace GlobalVariationalOperatorNS
} // namespace NewtonFixedPointNS
} // namespace ImplicitStepFluidNS
} // namespace PoromechanicsNS
} // namespace HappyHeart
......@@ -45,11 +45,12 @@ namespace HappyHeart
*
* \todo Improve the comment by writing its mathematical definition!
*/
template<class HyperelasticLawT>
class HybridVector final
: public GlobalVariationalOperator
<
HybridVector,
LocalVariationalOperatorNS::HybridVector
HybridVector<HyperelasticLawT>,
LocalVariationalOperatorNS::HybridVector<HyperelasticLawT>
>
{
......@@ -57,19 +58,22 @@ namespace HappyHeart
public:
//! \copydoc doxygen_hide_alias_self
using self = HybridVector;
using self = HybridVector<HyperelasticLawT>;
//! Alias to unique pointer.
using const_unique_ptr = std::unique_ptr<const self>;
//! Returns the name of the operator.
static const std::string& ClassName();
//! alias to local operator type.
using local_operator_type = LocalVariationalOperatorNS::HybridVector<HyperelasticLawT>;
//! Convenient alias to pinpoint the GlobalVariationalOperator parent.
using parent = GlobalVariationalOperator
<
self,
LocalVariationalOperatorNS::HybridVector
local_operator_type
>;
//! Friendship to the parent class so that the CRTP can reach private methods defined below.
......@@ -96,6 +100,7 @@ namespace HappyHeart
const Unknown& fluid_velocity,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator,
const ParameterAtDof<ParameterNS::Type::scalar>& current_fluid_pressure,
double fluid_source_term,
const QuadratureRulePerTopology* const quadrature_rule_per_topology = nullptr);
......@@ -144,6 +149,9 @@ namespace HappyHeart
typename parent::local_variational_operator_type& local_operator,
std::tuple<const GlobalVector&>&& additional_arguments) const;
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator_;
};
......
//! \file
//
//
// HybridVector.hxx
// HybridVector<HyperelasticLawT>.hxx
// HappyHeart
//
// Created by Sebastien Gilles on 03/02/15.
......@@ -30,14 +30,69 @@ namespace HappyHeart
namespace GlobalVariationalOperatorNS
{
template<class HyperelasticLawT>
HybridVector<HyperelasticLawT>
::HybridVector(const FEltSpace& felt_space,
const Unknown& fluid_mass,
const Unknown& fluid_velocity,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator,
const ParameterAtDof<ParameterNS::Type::scalar>& current_fluid_pressure,
double fluid_source_term,
const QuadratureRulePerTopology* const quadrature_rule_per_topology)
: parent(felt_space,
fluid_mass,
fluid_velocity,
std::move(quadrature_rule_per_topology),
AllocateGradientFEltPhi::yes,
DoComputeProcessorWiseLocal2Global::no,
density,
porosity,
update_current_pressure_operator,
current_fluid_pressure,
fluid_source_term),
update_current_pressure_operator_(update_current_pressure_operator)
{
assert(fluid_mass.GetNature() == UnknownNS::Nature::scalar);
felt_space.ComputeLocal2Global(Advanced::GlobalVariationalOperatorNS::DetermineExtendedUnknownList(felt_space, fluid_velocity),
DoComputeProcessorWiseLocal2Global::yes);
}
template<class HyperelasticLawT>
const std::string& HybridVector<HyperelasticLawT>::ClassName()
{
static std::string name("HybridVector (part of fluid mass contrib to rhs)");
return name;
}
template<class HyperelasticLawT>
void HybridVector<HyperelasticLawT>
::SetComputeEltArrayArguments(const LocalFEltSpace& local_felt_space,
typename parent::local_variational_operator_type& local_operator,
std::tuple<const GlobalVector&>&& additional_arguments) const
{
::HappyHeart::GlobalVariationalOperatorNS::ExtractLocalDofValues(local_felt_space,
this->GetNthUnknown(1), // for velocity
std::get<0>(additional_arguments),
local_operator.GetNonCstCurrentLocalVelocity());
}
template<class HyperelasticLawT>
template<class LinearAlgebraTupleT>
inline void HybridVector
inline void HybridVector<HyperelasticLawT>
::Assemble(LinearAlgebraTupleT&& global_vector_with_coeff_tuple,
const GlobalVector& current_velocity,
const Domain& domain) const
{
//update_current_pressure_operator_.Update
return parent::AssembleImpl(std::move(global_vector_with_coeff_tuple),
domain,
current_velocity);
......
//! \file
//
//
// HybridVector.hxx
// HappyHeart
//
// Created by Sebastien Gilles on 03/02/15.
// Copyright (c) 2015 Inria. All rights reserved.
//
#include "ModelInstances/UnderDevelopment/Poromechanics/ImplicitStep/ImplicitStepFluid/NewtonFixedPoint/LocalVariationalOperatorInstances/HybridVector.hpp"
namespace HappyHeart
{
namespace PoromechanicsNS
{
namespace ImplicitStepFluidNS
{
namespace NewtonFixedPointNS
{
namespace LocalVariationalOperatorNS
{
HybridVector::HybridVector(const ExtendedUnknown::vector_const_shared_ptr& unknown_list,
typename parent::elementary_data_type&& a_elementary_data,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
const ParameterAtDof<ParameterNS::Type::scalar>& current_fluid_pressure,
double fluid_source_term)
: parent(unknown_list, std::move(a_elementary_data)),
porosity_parent(porosity),
density_(density),
current_fluid_pressure_(current_fluid_pressure),
fluid_source_term_(fluid_source_term)
{
decltype(auto) elementary_data = GetElementaryData();
decltype(auto) vel_ref_felt = elementary_data.GetRefFElt(GetNthUnknown(1));
current_local_velocity_.resize(vel_ref_felt.Ndof());
}
HybridVector::~HybridVector() = default;
const std::string& HybridVector::ClassName()
{
static std::string name("HybridVectorWithPorosity");
return name;
}
void HybridVector::ComputeEltArray()
{
auto& elementary_data = GetNonCstElementaryData();
const auto& infos_at_quad_pt_list = elementary_data.GetInformationsAtQuadraturePointList();
auto& vector_result = elementary_data.GetNonCstVectorResult();
const auto& geom_elt = elementary_data.GetCurrentGeomElt();
const auto& mass_ref_felt = elementary_data.GetRefFElt(GetNthUnknown(0));
const auto Nmass_node = static_cast<int>(mass_ref_felt.Nnode());
decltype(auto) vel_ref_felt = elementary_data.GetRefFElt(GetNthUnknown(1));
const auto Nvel_node = static_cast<std::size_t>(vel_ref_felt.Nnode());
const auto Nvel_component = static_cast<int>(vel_ref_felt.Ncomponent());
decltype(auto) porosity = porosity_parent::GetPorosity();
decltype(auto) density = GetDensity();
decltype(auto) local_velocity = GetCurrentLocalVelocity();
const auto fluid_source_term = GetFluidSourceTerm();
decltype(auto) current_fluid_pressure = GetCurrentFluidPressure();
for (const auto& infos_at_quad_pt : infos_at_quad_pt_list)
{
const auto& phi = infos_at_quad_pt.GetRefFEltPhi();
const auto& gradient_felt_phi = infos_at_quad_pt.GetGradientFEltPhi();
const auto& quad_pt = infos_at_quad_pt.GetQuadraturePoint();
const auto porosity_value = porosity.GetValue(quad_pt, geom_elt);
const double quad_pt_factor = quad_pt.GetWeight()
* infos_at_quad_pt.GetAbsoluteValueJacobianDeterminant();
const auto density_value = density.GetValue(quad_pt, geom_elt);
const auto current_fluid_pressure_value = current_fluid_pressure.GetValue(quad_pt, geom_elt);
for (int mass_node_index = 0; mass_node_index < Nmass_node; ++mass_node_index)
{
int dof_index = mass_node_index;
auto& new_item = vector_result(dof_index);
const auto factor = quad_pt_factor
* phi(mass_node_index)
* density_value;
const auto factor_with_porosity = factor * porosity_value;
const auto factor_with_fluid_pressure = factor
* current_fluid_pressure_value
* fluid_source_term;
for (auto vel_node_index = 0ul; vel_node_index < Nvel_node; ++vel_node_index)
{
auto vel_dof_index = static_cast<std::size_t>(vel_node_index);
for (int component = 0; component < Nvel_component; ++component, vel_dof_index += Nvel_node)
{
// Equivalent in Freefem:
// - int2d(ThF)( weighting(x) * rhoF * divPhi(velFr,velFz,phi) * qtest )
// + int2d(ThF)( weighting(x) * rhoF * divPhi(velSHalfVhfr,velSHalfVhfz,phi) * qtest )
// NOTE: it is velFr - velSHalfVhf that is given to Assemble (\todo #820 document that!!!)
assert(vel_dof_index < local_velocity.size());
new_item += factor_with_porosity
* local_velocity[vel_dof_index]
* gradient_felt_phi(Nmass_node + static_cast<int>(vel_node_index), component);
}
}
// int2d(ThF)( weighting(x) * beta * rhoF * pOld * qtest)
new_item += factor_with_fluid_pressure;
}
}
}
} // namespace LocalVariationalOperatorNS
} // namespace NewtonFixedPointNS
} // namespace ImplicitStepFluidNS
} //namespace PoromechanicsNS
} // namespace HappyHeart
......@@ -22,6 +22,7 @@
# include "Operators/LocalVariationalOperator/LinearLocalVariationalOperator.hpp"
# include "ModelInstances/UnderDevelopment/Poromechanics/Crtp/Porosity.hpp"
# include "ModelInstances/UnderDevelopment/Poromechanics/Parameter/UpdatePressureAtQuadPt.hpp"
namespace HappyHeart
......@@ -50,15 +51,16 @@ namespace HappyHeart
* \todo Improve the comment by writing its mathematical definition!
* \todo #559 Time dependency has been momentarily dropped.
*/
template<class HyperelasticLawT>
class HybridVector final
: public ::HappyHeart::Advanced::LocalVariationalOperatorNS::LinearLocalVariationalOperator<LocalVector>,
private Crtp::Porosity<HybridVector>
private Crtp::Porosity<HybridVector<HyperelasticLawT>>
{
public:
//! \copydoc doxygen_hide_alias_self
using self = HybridVector;
using self = HybridVector<HyperelasticLawT>;
//! Alias to unique pointer.
using unique_ptr = std::unique_ptr<self>;
......@@ -93,11 +95,12 @@ namespace HappyHeart
typename parent::elementary_data_type&& elementary_data,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator,
const ParameterAtDof<ParameterNS::Type::scalar>& current_fluid_pressure,
double fluid_source_term);
//! Destructor.
virtual ~HybridVector();
virtual ~HybridVector() = default;
//! Copy constructor.
HybridVector(const HybridVector&) = delete;
......@@ -159,6 +162,9 @@ namespace HappyHeart
//! Fluid source term ('beta' in Freefem).
const double fluid_source_term_;
//! Operator which updates the pressure at quadrature points (computed from fluidmass).
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator_;
};
......
//! \file
//
//
// HybridVector.hxx
// HybridVector<HyperelasticLawT>.hxx
// HappyHeart
//
// Created by Sebastien Gilles on 03/02/15.
......@@ -30,33 +30,154 @@ namespace HappyHeart
namespace LocalVariationalOperatorNS
{
template<class HyperelasticLawT>
HybridVector<HyperelasticLawT>::HybridVector(const ExtendedUnknown::vector_const_shared_ptr& unknown_list,
typename parent::elementary_data_type&& a_elementary_data,
const ScalarParameter<>& density,
const ParameterAtDof<ParameterNS::Type::scalar, ParameterNS::TimeDependencyNS::None, 2u>& porosity,
GlobalParameterOperatorNS::UpdatePressureAtQuadPt<HyperelasticLawT, DataNS::TimeLabel2::current>& update_current_pressure_operator,
const ParameterAtDof<ParameterNS::Type::