16 #include "libmesh/mesh_base.h" 17 #include "libmesh/numeric_vector.h" 18 #include "libmesh/transient_system.h" 19 #include "libmesh/explicit_system.h" 24 _displaced_problem(displaced_problem),
25 _ref_mesh(_displaced_problem.refMesh()),
26 _nl_soln(_displaced_problem._nl_solution),
27 _aux_soln(*_displaced_problem._aux_solution)
35 _displaced_problem(x._displaced_problem),
36 _ref_mesh(x._ref_mesh),
38 _aux_soln(x._aux_soln),
39 _sys_to_nonghost_and_ghost_soln(x._sys_to_nonghost_and_ghost_soln),
40 _sys_to_var_num_and_direction(x._sys_to_var_num_and_direction)
48 unsigned int num_displacements = displacement_variables.size();
54 for (
unsigned int i = 0; i < num_displacements; i++)
56 std::string displacement_name = displacement_variables[i];
58 for (
const auto sys_num :
make_range(es.n_systems()))
60 auto & sys = es.get_system(sys_num);
61 if (sys.has_variable(displacement_name))
64 val.first.push_back(sys.variable_number(displacement_name));
65 val.second.push_back(i);
73 auto & sys = es.get_system(pr.first);
74 mooseAssert(sys.number() <=
_nl_soln.size(),
75 "The system number should always be less than or equal to the number of nonlinear " 76 "systems. If it is equal, then this system is the auxiliary system");
81 std::make_pair(nonghost_soln,
89 auto & sys = es.get_system(sys_num);
92 Threads::parallel_reduce(node_range, send_list);
95 ghost_soln->init(soln->size(), soln->local_size(), send_list.
send_list(),
true,
GHOSTED);
96 soln->localize(*ghost_soln, send_list.
send_list());
103 Node & displaced_node = *(*nd);
109 auto & var_numbers = var_num_and_direction.first;
110 auto & directions = var_num_and_direction.second;
113 const auto direction = directions[i];
114 if (reference_node.n_dofs(sys_num, var_numbers[i]) > 0)
115 displaced_node(direction) =
116 reference_node(direction) +
118 reference_node.dof_number(sys_num, var_numbers[i], 0));
std::map< unsigned int, std::pair< std::vector< unsigned int >, std::vector< unsigned int > > > _sys_to_var_num_and_direction
const std::vector< const NumericVector< Number > * > & _nl_soln
void join(const UpdateDisplacedMeshThread &)
virtual EquationSystems & es() override
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual const Node & nodeRef(const dof_id_type i) const
FEProblemBase & _fe_problem
const NumericVector< Number > & _aux_soln
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
StoredRange< MeshBase::const_node_iterator, const Node *> ConstNodeRange
std::vector< std::string > _displacements
UpdateDisplacedMeshThread(FEProblemBase &fe_problem, DisplacedProblem &displaced_problem)
static std::unique_ptr< NumericVector< Number > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
const std::vector< dof_id_type > & send_list() const
IntRange< T > make_range(T beg, T end)
virtual void onNode(NodeRange::const_iterator &nd) override
Called for each node.
std::map< unsigned int, std::pair< const NumericVector< Number > *, std::shared_ptr< NumericVector< Number > > > > _sys_to_nonghost_and_ghost_soln
StoredRange< MeshBase::node_iterator, Node *> NodeRange
DisplacedProblem & _displaced_problem
auto index_range(const T &sizable)