60 if (formulation ==
"Helmholtz")
61 return std::make_shared<Helmholtz>();
62 else if (formulation ==
"Laplacian")
63 return std::make_shared<Laplacian>();
64 else if (formulation ==
"Electrostatics")
65 return std::make_shared<Electrostatics>();
67 else if (formulation ==
"Bilaplacian")
68 return std::make_shared<BilaplacianMain>();
69 else if (formulation ==
"BilaplacianAux")
70 return std::make_shared<BilaplacianAux>();
72 else if (formulation ==
"LinearElasticity")
73 return std::make_shared<LinearElasticity>();
74 else if (formulation ==
"HookeLinearElasticity")
75 return std::make_shared<HookeLinearElasticity>();
76 else if (formulation ==
"IncompressibleLinearElasticity")
77 return std::make_shared<IncompressibleLinearElasticityDispacement>();
78 else if (formulation ==
"IncompressibleLinearElasticityPressure")
79 return std::make_shared<IncompressibleLinearElasticityPressure>();
81 else if (formulation ==
"SaintVenant")
82 return std::make_shared<SaintVenantElasticity>();
83 else if (formulation ==
"NeoHookean")
84 return std::make_shared<NeoHookeanElasticity>();
85 else if (formulation ==
"IsochoricNeoHookean")
86 return std::make_shared<IsochoricNeoHookean>();
87 else if (formulation ==
"MooneyRivlin")
88 return std::make_shared<MooneyRivlinElasticity>();
89 else if (formulation ==
"MooneyRivlin3Param")
90 return std::make_shared<MooneyRivlin3ParamElasticity>();
91 else if (formulation ==
"MooneyRivlin3ParamSymbolic")
92 return std::make_shared<MooneyRivlin3ParamSymbolic>();
93 else if (formulation ==
"MultiModels")
94 return std::make_shared<MultiModel>();
95 else if (formulation ==
"MaterialSum")
96 return std::make_shared<SumModel>();
97 else if (formulation ==
"UnconstrainedOgden")
98 return std::make_shared<UnconstrainedOgdenElasticity>();
99 else if (formulation ==
"IncompressibleOgden")
100 return std::make_shared<IncompressibleOgdenElasticity>();
101 else if (formulation ==
"VolumePenalty")
102 return std::make_shared<VolumePenalty>();
103 else if (formulation ==
"InversionBarrier")
104 return std::make_shared<InversionBarrier>();
106 else if (formulation ==
"HGOFiber")
107 return std::make_shared<HGOFiber>();
108 else if (formulation ==
"HGODispersion")
109 return std::make_shared<HGODispersion>();
111 else if (formulation ==
"ActiveFiber")
112 return std::make_shared<ActiveFiber>();
114 else if (formulation ==
"Stokes")
115 return std::make_shared<StokesVelocity>();
116 else if (formulation ==
"StokesPressure")
117 return std::make_shared<StokesPressure>();
118 else if (formulation ==
"NavierStokes")
119 return std::make_shared<NavierStokesVelocity>();
120 else if (formulation ==
"NavierStokesFSI")
121 return std::make_shared<NavierStokesVelocity>();
122 else if (formulation ==
"OperatorSplitting")
123 return std::make_shared<OperatorSplitting>();
125 else if (formulation ==
"AMIPS")
126 return std::make_shared<AMIPSEnergy>();
127 else if (formulation ==
"FixedCorotational")
128 return std::make_shared<FixedCorotational>();
154 const int n_bases,
const int n_pressure_bases,
const int problem_dim,
const bool add_average,
158 assert(velocity_stiffness.rows() == velocity_stiffness.cols());
159 assert(velocity_stiffness.rows() == n_bases * problem_dim);
161 assert(mixed_stiffness.size() == 0 || mixed_stiffness.rows() == n_bases * problem_dim);
162 assert(mixed_stiffness.size() == 0 || mixed_stiffness.cols() == n_pressure_bases);
164 assert(pressure_stiffness.size() == 0 || pressure_stiffness.rows() == n_pressure_bases);
165 assert(pressure_stiffness.size() == 0 || pressure_stiffness.cols() == n_pressure_bases);
167 const int avg_offset = add_average ? 1 : 0;
169 std::vector<Eigen::Triplet<double>> blocks;
170 blocks.reserve(velocity_stiffness.nonZeros() + 2 * mixed_stiffness.nonZeros() + pressure_stiffness.nonZeros() + 2 * avg_offset * velocity_stiffness.rows());
172 for (
int k = 0; k < velocity_stiffness.outerSize(); ++k)
174 for (StiffnessMatrix::InnerIterator it(velocity_stiffness, k); it; ++it)
176 blocks.emplace_back(it.row(), it.col(), it.value());
180 for (
int k = 0; k < mixed_stiffness.outerSize(); ++k)
182 for (StiffnessMatrix::InnerIterator it(mixed_stiffness, k); it; ++it)
184 blocks.emplace_back(it.row(), n_bases * problem_dim + it.col(), it.value());
185 blocks.emplace_back(it.col() + n_bases * problem_dim, it.row(), it.value());
189 for (
int k = 0; k < pressure_stiffness.outerSize(); ++k)
191 for (StiffnessMatrix::InnerIterator it(pressure_stiffness, k); it; ++it)
193 blocks.emplace_back(n_bases * problem_dim + it.row(), n_bases * problem_dim + it.col(), it.value());
199 const double val = 1.0 / n_pressure_bases;
200 for (
int i = 0; i < n_pressure_bases; ++i)
202 blocks.emplace_back(n_bases * problem_dim + i, n_bases * problem_dim + n_pressure_bases,
val);
203 blocks.emplace_back(n_bases * problem_dim + n_pressure_bases, n_bases * problem_dim + i,
val);
207 stiffness.resize(n_bases * problem_dim + n_pressure_bases + avg_offset, n_bases * problem_dim + n_pressure_bases + avg_offset);
208 stiffness.setFromTriplets(blocks.begin(), blocks.end());
209 stiffness.makeCompressed();
221 if (assembler ==
"Mass")
225 return std::max(basis_degree * 2, 1);
227 return basis_degree * 2 + 1;
229 else if (assembler ==
"NavierStokes" || assembler ==
"NavierStokesFSI")
232 return std::max((basis_degree - 1) + basis_degree, 1);
234 return std::max(basis_degree * 2, 1);
236 return basis_degree * 2 + 1;
244 return std::max((basis_degree - 1) * 2, 1);
255 return std::max(basis_degree * 2, 1);
259 return (basis_degree - 1) * 2 + 1;
static int quadrature_order(const std::string &assembler, const int basis_degree, const BasisType &b_type, const int dim)
utility for retrieving the needed quadrature order to precisely integrate the given form on the given...
static void merge_mixed_matrices(const int n_bases, const int n_pressure_bases, const int problem_dim, const bool add_average, const StiffnessMatrix &velocity_stiffness, const StiffnessMatrix &mixed_stiffness, const StiffnessMatrix &pressure_stiffness, StiffnessMatrix &stiffness)
utility to merge 3 blocks of mixed matrices, A=velocity_stiffness, B=mixed_stiffness,...