39 std::vector<FractureProperty*>
const& frac_props,
40 std::vector<JunctionProperty*>
const& junction_props,
41 std::unordered_map<int, int>
const& fracID_to_local,
42 Eigen::Vector3d
const& x)
45 std::vector<bool> levelsets(frac_props.size());
46 for (std::size_t i = 0; i < frac_props.size(); i++)
51 std::vector<double> enrichments(frac_props.size() + junction_props.size());
53 for (std::size_t i = 0; i < frac_props.size(); i++)
55 auto const* frac = frac_props[i];
56 enrichments[i] = Heaviside(
57 std::accumulate(cbegin(frac->branches_slave),
58 cend(frac->branches_slave), levelsets[i],
59 [&](
bool const enrich,
auto const& branch)
60 { return enrich && levelsetBranch(branch, x); }));
64 for (std::size_t i = 0; i < junction_props.size(); i++)
66 auto const* junction = junction_props[i];
67 auto fid1 = fracID_to_local.at(junction->fracture_ids[0]);
68 auto fid2 = fracID_to_local.at(junction->fracture_ids[1]);
69 bool const enrich = levelsets[fid1] && levelsets[fid2];
70 enrichments[i + frac_props.size()] = Heaviside(enrich);
77 std::size_t this_frac_id,
78 std::vector<FractureProperty*>
const& frac_props,
79 std::vector<JunctionProperty*>
const& junction_props,
80 std::unordered_map<int, int>
const& fracID_to_local,
81 Eigen::Vector3d
const& x)
83 auto this_frac_local_index = fracID_to_local.at(this_frac_id);
84 auto const& this_frac = *frac_props[this_frac_local_index];
86 std::vector<bool> levelsets(frac_props.size());
87 for (std::size_t i = 0; i < frac_props.size(); i++)
92 std::vector<double> enrichments(frac_props.size() + junction_props.size());
93 enrichments[this_frac_local_index] = 1.0;
96 if (frac_props.size() > 1)
98 for (
auto const& branch : this_frac.branches_master)
100 if (branch.master_fracture_id != this_frac.fracture_id)
105 if (fracID_to_local.find(branch.slave_fracture_id) ==
106 fracID_to_local.end())
111 double sign = boost::math::sign(
112 this_frac.normal_vector.dot(branch.normal_vector_branch));
113 auto slave_fid = fracID_to_local.at(branch.slave_fracture_id);
114 double const enrich = levelsets[slave_fid] ? 1. : 0.;
115 enrichments[slave_fid] = sign * enrich;
120 for (
unsigned i = 0; i < junction_props.size(); i++)
122 auto const* junction = junction_props[i];
123 if (!ranges::contains(junction->fracture_ids, this_frac.fracture_id))
128 auto another_frac_id =
129 (junction->fracture_ids[0] == this_frac.fracture_id)
130 ? junction->fracture_ids[1]
131 : junction->fracture_ids[0];
132 auto fid = fracID_to_local.at(another_frac_id);
133 double const enrich = levelsets[fid] ? 1. : 0.;
134 enrichments[i + frac_props.size()] = enrich;
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)
std::vector< double > uGlobalEnrichments(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)