45 std::vector<MeshLib::Node*>
const& subsfc_nodes,
48 std::map<std::size_t, std::size_t>
const& subsfc_sfc_id_map)
56 auto new_nodes = std::unique_ptr<MeshLib::Node* []> {
60 for (
unsigned j = 0; j < nElemNodes; ++j)
62 std::size_t
const subsfc_id(
64 new_nodes[j] = subsfc_nodes[subsfc_id];
65 std::size_t new_idx = (nElemNodes == 2) ? (3 - j) : (nElemNodes + j);
66 new_nodes[new_idx] = subsfc_nodes[subsfc_sfc_id_map.at(subsfc_id)];
86 std::string
const&
name,
bool on_top,
87 bool copy_material_ids)
89 INFO(
"Extracting top surface of mesh '{:s}' ... ", mesh.
getName());
90 double const flag = on_top ? -1.0 : 1.0;
91 Eigen::Vector3d
const dir({0, 0, flag});
92 double const angle(90);
93 std::unique_ptr<MeshLib::Mesh> sfc_mesh(
nullptr);
95 std::string
const prop_name(
"bulk_node_ids");
100 mesh, dir, angle, prop_name));
104 sfc_mesh = (on_top) ? std::make_unique<MeshLib::Mesh>(mesh)
105 : std::unique_ptr<MeshLib::Mesh>(
109 sfc_mesh->getProperties().createNewPropertyVector<std::size_t>(
113 pv->resize(sfc_mesh->getNumberOfNodes());
114 std::iota(pv->begin(), pv->end(), 0);
118 ERR(
"Could not create and initialize property '{%s}'.", prop_name);
125 std::vector<MeshLib::Node*> subsfc_nodes =
127 std::vector<MeshLib::Element*> subsfc_elements =
130 std::size_t
const n_subsfc_nodes(subsfc_nodes.size());
132 std::vector<MeshLib::Node*>
const& sfc_nodes(sfc_mesh->getNodes());
133 std::size_t
const n_sfc_nodes(sfc_nodes.size());
135 if (!sfc_mesh->getProperties().existsPropertyVector<std::size_t>(prop_name))
137 ERR(
"Need subsurface node ids, but the property '{:s}' is not "
143 auto const*
const node_id_pv =
144 sfc_mesh->getProperties().getPropertyVector<std::size_t>(prop_name);
147 std::map<std::size_t, std::size_t> subsfc_sfc_id_map;
148 for (std::size_t k(0); k < n_sfc_nodes; ++k)
150 std::size_t
const subsfc_id((*node_id_pv)[k]);
151 std::size_t
const sfc_id(k + n_subsfc_nodes);
152 subsfc_sfc_id_map.insert(std::make_pair(subsfc_id, sfc_id));
155 node[0], node[1], node[2] - (flag * thickness), sfc_id));
159 std::vector<MeshLib::Element*>
const& sfc_elements(sfc_mesh->getElements());
160 std::size_t
const n_sfc_elements(sfc_elements.size());
161 for (std::size_t k(0); k < n_sfc_elements; ++k)
164 subsfc_nodes, *sfc_elements[k], *node_id_pv, subsfc_sfc_id_map));
171 ERR(
"Could not copy the property 'MaterialIDs' since the original mesh "
172 "does not contain such a property.");
175 auto const*
const materials =
178 auto*
const new_materials =
179 new_mesh->getProperties().createNewPropertyVector<
int>(
183 ERR(
"Can not set material properties for new layer");
187 new_materials->reserve(subsfc_elements.size());
188 std::copy(materials->cbegin(), materials->cend(),
189 std::back_inserter(*new_materials));
191 if (copy_material_ids &&
192 sfc_mesh->getProperties().existsPropertyVector<
int>(
"MaterialIDs"))
194 auto const& sfc_material_ids =
195 *sfc_mesh->getProperties().getPropertyVector<
int>(
"MaterialIDs");
196 std::copy(sfc_material_ids.cbegin(), sfc_material_ids.cend(),
197 std::back_inserter(*new_materials));
201 int const new_layer_id(
202 *(std::max_element(materials->cbegin(), materials->cend())) + 1);
203 auto const n_new_props(subsfc_elements.size() -
205 std::fill_n(std::back_inserter(*new_materials), n_new_props,
Definition of AddLayerToMesh class.
Definition of Duplicate functions.
void INFO(char const *fmt, Args const &... args)
void ERR(char const *fmt, Args const &... args)
Definition of the Mesh class.
Definition of the Node class.
std::size_t getID() const
virtual MeshElemType getGeomType() const =0
virtual const Node * getNode(unsigned idx) const =0
virtual unsigned getNumberOfBaseNodes() const =0
virtual constexpr unsigned getDimension() const =0
Get dimension of the mesh element.
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
const std::string getName() const
Get name of the mesh.
Properties & getProperties()
std::size_t getNumberOfElements() const
Get the number of elements.
PropertyVector< T > const * getPropertyVector(std::string const &name) const
bool existsPropertyVector(std::string const &name) const
void copy(PETScVector const &x, PETScVector &y)
std::vector< Node * > copyNodeVector(const std::vector< Node * > &nodes)
Creates a deep copy of a Node vector.
MeshLib::Element * extrudeElement(std::vector< MeshLib::Node * > const &subsfc_nodes, MeshLib::Element const &sfc_elem, MeshLib::PropertyVector< std::size_t > const &sfc_to_subsfc_id_map, std::map< std::size_t, std::size_t > const &subsfc_sfc_id_map)
TemplateElement< MeshLib::PrismRule6 > Prism
MeshLib::Mesh * addLayerToMesh(MeshLib::Mesh const &mesh, double thickness, std::string const &name, bool on_top, bool copy_material_ids)
std::unique_ptr< Mesh > createFlippedMesh(Mesh const &mesh)
std::vector< Element * > copyElementVector(std::vector< Element * > const &elements, std::vector< Node * > const &new_nodes, std::vector< std::size_t > const *const node_id_map)
TemplateElement< MeshLib::HexRule8 > Hex
TemplateElement< MeshLib::QuadRule4 > Quad