13#include <unordered_set>
20std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>
23 std::vector<std::string>
const& residuum_names,
24 std::vector<std::reference_wrapper<ProcessLib::ProcessVariable>>
27 auto const num_residua = residuum_names.size();
29 std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>
31 residuum_vectors.reserve(num_residua);
33 for (std::size_t i = 0; i < num_residua; ++i)
35 auto const& residuum_name = residuum_names[i];
36 auto const& pv = pvs[i].get();
38 residuum_vectors.emplace_back(*MeshLib::getOrCreateMeshProperty<double>(
40 pv.getNumberOfGlobalComponents()));
43 return residuum_vectors;
53 : bulk_element_ids{*
MeshLib::bulkElementIDs(mesh)},
54 bulk_node_ids{*
MeshLib::bulkNodeIDs(mesh)},
55 residuum_vectors{std::move(residuum_vectors)}
62 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submeshes,
63 std::vector<std::string>
const& residuum_names,
64 std::vector<std::reference_wrapper<ProcessVariable>>
const& pvs)
66 DBUG(
"AssemblyMixinBase initializeSubmeshOutput().");
68 auto const num_residua = residuum_names.size();
70 if (pvs.size() != num_residua)
73 "The number of passed residuum names does not match the number "
74 "of process variables for process id {}: {} != {}",
75 process_id, num_residua, pvs.size());
79 for (
auto& mesh_ref : submeshes)
81 auto& mesh = mesh_ref.get();
84 mesh, createResiduumVectors(mesh, residuum_names, pvs));
88 createResiduumVectors(bulk_mesh, residuum_names, pvs);
94 DBUG(
"AssemblyMixinBase updateActiveElements().");
126 DBUG(
"AssemblyMixinBase updateActiveElementsImpl().");
131 active_element_ids.empty()
142 sad.active_element_ids = sad.bulk_element_ids;
149 std::unordered_set<std::size_t> active_element_ids_set(
150 active_element_ids.begin(), active_element_ids.end());
154 auto& aeis = sad.active_element_ids;
155 auto& beis = sad.bulk_element_ids;
157 aeis.reserve(beis.getNumberOfTuples());
159 for (
auto bei : beis)
161 if (active_element_ids_set.contains(bei))
178 for (std::size_t variable_id = 0; variable_id < residuum_vectors.size();
181 transformVariableFromGlobalVector(
182 rhs, variable_id, local_to_global_index_map,
183 residuum_vectors[variable_id].get(), std::negate<double>());
192 for (std::size_t variable_id = 0; variable_id < sad.
residuum_vectors.size();
195 transformVariableFromGlobalVector(
196 rhs, variable_id, local_to_global_index_map,
198 std::negate<double>());
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Global vector based on Eigen vector.
void updateActiveElementsImpl(ProcessLib::ProcessVariable const &pv)
static void copyResiduumVectorsToSubmesh(GlobalVector const &rhs, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, SubmeshAssemblyData const &sad)
std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors_bulk_
static void copyResiduumVectorsToBulkMesh(GlobalVector const &rhs, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors)
@ NO_DEACTIVATED_SUBDOMAINS
@ HAS_DEACTIVATED_SUBDOMAINS
void initializeAssemblyOnSubmeshes(const int process_id, MeshLib::Mesh &bulk_mesh, std::vector< std::reference_wrapper< MeshLib::Mesh > > const &submeshes, std::vector< std::string > const &residuum_names, std::vector< std::reference_wrapper< ProcessVariable > > const &pvs)
void updateActiveElements(ProcessLib::ProcessVariable const &pv)
ActiveElementIDsState ids_state_
std::vector< SubmeshAssemblyData > submesh_assembly_data_
std::vector< std::size_t > const & getActiveElementIDs() const
std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > createResiduumVectors(MeshLib::Mesh &mesh, std::vector< std::string > const &residuum_names, std::vector< std::reference_wrapper< ProcessLib::ProcessVariable > > pvs)
SubmeshAssemblyData(MeshLib::Mesh const &mesh, std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > &&residuum_vectors)
MeshLib::PropertyVector< std::size_t > const & bulk_node_ids
std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors