27 std::size_t
const n_variables,
29 std::vector<unsigned>
const& dofIndex_to_localIndex,
31 bool const is_axially_symmetric,
35 dofIndex_to_localIndex),
40 DisplacementDim>(e, is_axially_symmetric,
44 assert(
_element.getDimension() == DisplacementDim - 1);
46 unsigned const n_integration_points =
49 _ip_data.reserve(n_integration_points);
53 auto frac_id =
_process_data.map_materialID_to_fractureID[mat_id];
62 ranges::views::transform(
65 ranges::to<std::vector>;
67 for (
unsigned ip = 0; ip < n_integration_points; ip++)
79 ip_data.integration_weight =
81 sm.integralMeasure * sm.detJ;
82 ip_data.h_matrices.setZero(DisplacementDim,
83 ShapeFunction::NPOINTS * DisplacementDim);
90 ip_data.w.setZero(DisplacementDim);
91 ip_data.sigma.setZero(DisplacementDim);
94 ip_data.sigma_prev.resize(DisplacementDim);
95 ip_data.w_prev.resize(DisplacementDim);
97 ip_data.C.resize(DisplacementDim, DisplacementDim);
100 ip_data.aperture_prev = ip_data.aperture0;
109 Eigen::VectorXd
const& local_u,
110 Eigen::VectorXd& local_b, Eigen::MatrixXd& local_J)
112 auto const N_DOF_PER_VAR = ShapeFunction::NPOINTS * DisplacementDim;
115 auto const n_enrich_var = n_fractures + n_junctions;
129 using BlockVectorType =
130 typename Eigen::VectorXd::FixedSegmentReturnType<N_DOF_PER_VAR>::Type;
131 using BlockMatrixType =
132 Eigen::Block<Eigen::MatrixXd, N_DOF_PER_VAR, N_DOF_PER_VAR>;
134 std::vector<BlockVectorType> vec_local_b_g;
135 for (
unsigned i = 0; i < n_enrich_var; i++)
137 vec_local_b_g.push_back(
138 local_b.segment<N_DOF_PER_VAR>(N_DOF_PER_VAR * i));
140 std::vector<std::vector<BlockMatrixType>> vec_local_J_gg(n_enrich_var);
141 for (
unsigned i = 0; i < n_enrich_var; i++)
143 for (
unsigned j = 0; j < n_enrich_var; j++)
145 auto sub_gg = local_J.block<N_DOF_PER_VAR, N_DOF_PER_VAR>(
146 N_DOF_PER_VAR * i, N_DOF_PER_VAR * j);
147 vec_local_J_gg[i].push_back(sub_gg);
151 std::vector<Eigen::VectorXd> vec_nodal_g;
152 for (
unsigned i = 0; i < n_enrich_var; i++)
154 auto sub =
const_cast<Eigen::VectorXd&
>(local_u).segment<N_DOF_PER_VAR>(
156 vec_nodal_g.push_back(sub);
164 int const index_normal = DisplacementDim - 1;
167 unsigned const n_integration_points =
173 for (
unsigned ip = 0; ip < n_integration_points; ip++)
176 auto const& integration_weight = ip_data.integration_weight;
177 auto const& H = ip_data.h_matrices;
178 auto& mat = ip_data.fracture_material;
179 auto& sigma = ip_data.sigma;
180 auto const& sigma_prev = ip_data.sigma_prev;
182 auto const& w_prev = ip_data.w_prev;
184 auto& state = *ip_data.material_state_variables;
194 Eigen::VectorXd nodal_gap(N_DOF_PER_VAR);
196 for (
unsigned i = 0; i < n_enrich_var; i++)
198 nodal_gap += levelsets[i] * vec_nodal_g[i];
202 w.noalias() = R * H * nodal_gap;
205 ip_data.aperture = ip_data.aperture0 + w[index_normal];
208 mat.computeConstitutiveRelation(
209 t, x_position, ip_data.aperture0,
210 Eigen::Matrix<double, DisplacementDim, 1>::Zero(),
214 w_prev, w, sigma_prev, sigma, C, state);
217 for (
unsigned i = 0; i < n_enrich_var; i++)
219 vec_local_b_g[i].noalias() -= levelsets[i] * H.transpose() *
220 R.transpose() * sigma *
225 for (
unsigned i = 0; i < n_enrich_var; i++)
227 for (
unsigned j = 0; j < n_enrich_var; j++)
230 vec_local_J_gg[i][j].noalias() +=
231 (levelsets[i] * H.transpose() * R.transpose()) * C *
232 (levelsets[j] * R * H) * integration_weight;
241 Eigen::VectorXd
const& local_u)
243 auto const N_DOF_PER_VAR = ShapeFunction::NPOINTS * DisplacementDim;
246 auto const n_enrich_var = n_fractures + n_junctions;
252 int const index_normal = DisplacementDim - 1;
254 unsigned const n_integration_points =
261 std::vector<Eigen::VectorXd> vec_nodal_g;
262 for (
unsigned i = 0; i < n_enrich_var; i++)
264 auto sub =
const_cast<Eigen::VectorXd&
>(local_u).segment<N_DOF_PER_VAR>(
266 vec_nodal_g.push_back(sub);
269 for (
unsigned ip = 0; ip < n_integration_points; ip++)
272 auto const& H = ip_data.h_matrices;
273 auto& mat = ip_data.fracture_material;
274 auto& sigma = ip_data.sigma;
275 auto const& sigma_prev = ip_data.sigma_prev;
277 auto const& w_prev = ip_data.w_prev;
279 auto& state = *ip_data.material_state_variables;
280 auto& b_m = ip_data.aperture;
290 Eigen::VectorXd nodal_gap(N_DOF_PER_VAR);
292 for (
unsigned i = 0; i < n_enrich_var; i++)
294 nodal_gap += levelsets[i] * vec_nodal_g[i];
298 w.noalias() = R * H * nodal_gap;
301 b_m = ip_data.aperture0 + w[index_normal];
305 "Element {:d}, gp {:d}: Fracture aperture is {:g}, but it must "
311 mat.computeConstitutiveRelation(
312 t, x_position, ip_data.aperture0,
313 Eigen::Matrix<double, DisplacementDim, 1>::Zero(),
317 w_prev, w, sigma_prev, sigma, C, state);
324 for (
unsigned ip = 0; ip < n_integration_points; ip++)
327 ele_b += ip_data.aperture;
329 ele_sigma += ip_data.sigma;
331 ele_b /= n_integration_points;
332 ele_w /= n_integration_points;
333 ele_sigma /= n_integration_points;
336 Eigen::Map<GlobalDimVectorType>(
337 &(*
_process_data.element_fracture_stresses)[e_id * DisplacementDim]) =
340 Eigen::Map<GlobalDimVectorType>(
341 &(*
_process_data.element_local_jumps)[e_id * DisplacementDim]) = ele_w;
349 std::vector<GlobalVector*>
const& ,
350 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
351 std::vector<double>& cache)
const
353 unsigned const n_integration_points =
_ip_data.size();
356 double, DisplacementDim, Eigen::Dynamic, Eigen::RowMajor>>(
357 cache, DisplacementDim, n_integration_points);
359 for (
unsigned ip = 0; ip < n_integration_points; ip++)
361 cache_matrix.col(ip).noalias() =
_ip_data[ip].sigma;
std::vector< double > duGlobalEnrichments(std::size_t this_frac_id, std::vector< FractureProperty * > const &frac_props, std::vector< JunctionProperty * > const &junction_props, std::unordered_map< int, int > const &fracID_to_local, Eigen::Vector3d const &x)