120 std::vector<std::size_t>
const& active_elements,
121 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
122 const double t,
double const dt, std::vector<GlobalVector*>
const& xs,
123 std::vector<GlobalVector*>
const& x_prevs,
int const process_id,
129 OGS_FATAL(
"Process id is not 0 but {}", process_id);
132 if (dof_tables.size() != 1)
136 auto const& dof_table = *(dof_tables.front());
140 OGS_FATAL(
"More than 1 solution vector");
142 auto const& x = *xs.front();
144 if (x_prevs.size() != 1)
148 auto const& x_prev = *x_prevs.front();
159 bool assembly_error =
false;
160#pragma omp parallel num_threads(num_threads_)
163#pragma omp single nowait
165 INFO(
"Number of threads: {}", omp_get_num_threads());
171 std::vector<double> local_M_data;
172 std::vector<double> local_K_data;
173 std::vector<double> local_b_data;
174 std::vector<double> local_Jac_data;
175 std::vector<GlobalIndexType> indices;
179 auto stats_this_thread = stats->clone();
182 stats_this_thread->data};
185 if (active_elements.empty())
190 std::ptrdiff_t
const n_loc_asm =
191 static_cast<std::ptrdiff_t
>(local_assemblers.size());
193#pragma omp for nowait
194 for (std::ptrdiff_t element_id = 0; element_id < n_loc_asm;
201 auto& loc_asm = local_assemblers[element_id];
205 assembleWithJacobianOneElement(
206 element_id, loc_asm, dof_table, t, dt, x, x_prev,
207 local_M_data, local_K_data, local_b_data,
208 local_Jac_data, indices, *jac_asm, cache);
213 assembly_error =
true;
218 local_K_data, local_b_data,
227 std::ptrdiff_t
const n_act_elem =
228 static_cast<std::ptrdiff_t
>(active_elements.size());
230#pragma omp for nowait
231 for (std::ptrdiff_t i = 0; i < n_act_elem; ++i)
238 auto const element_id = active_elements[i];
239 auto& loc_asm = local_assemblers[element_id];
243 assembleWithJacobianOneElement(
244 element_id, loc_asm, dof_table, t, dt, x, x_prev,
245 local_M_data, local_K_data, local_b_data,
246 local_Jac_data, indices, *jac_asm, cache);
251 assembly_error =
true;
256 local_K_data, local_b_data,
virtual void assembleWithJacobian(LocalAssemblerInterface &local_assembler, double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)=0
void assembleWithJacobian(BaseLib::PolymorphicRandomAccessContainerView< LocalAssemblerInterface > const &local_assemblers, std::vector< std::size_t > const &active_elements, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, const double t, double const dt, std::vector< GlobalVector * > const &xs, std::vector< GlobalVector * > const &x_prevs, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
void assembleWithJacobianOneElement(const std::size_t mesh_item_id, ProcessLib::LocalAssemblerInterface &local_assembler, const NumLib::LocalToGlobalIndexMap &dof_table, const double t, const double dt, const GlobalVector &x, const GlobalVector &x_prev, std::vector< double > &local_M_data, std::vector< double > &local_K_data, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data, std::vector< GlobalIndexType > &indices, ProcessLib::AbstractJacobianAssembler &jacobian_assembler, ProcessLib::Assembly::MultiMatrixElementCache &cache)