254 {
256
257 feRhs->getOpPtrVector().clear();
258 feLhs->getOpPtrVector().clear();
259
260 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"Cleared FEs";
261
263
265
266 feRhs->getRuleHook = vol_rule;
267 feLhs->getRuleHook = vol_rule;
268
269
270
271
272 auto get_child_op = [&](auto &pip) {
273 auto op_this_child =
274 new OpLoopThis<DomainEle>(
m_field,
simple->getDomainFEName(), child_bit,
275 parent_bit.flip(), Sev::noisy);
276 auto fe_child_ptr = op_this_child->getThisFEPtr();
277 fe_child_ptr->getRuleHook = [](
int,
int,
int p) {
return -1; };
280 child_bit, parent_bit.flip(), MBEDGE, child_edges);
281
282 CHKERR setDGSetIntegrationPoints<2>(
283 fe_child_ptr->setRuleHook, [](int, int, int p) { return 2 * p; },
284 boost::make_shared<Range>(child_edges));
285 pip.push_back(op_this_child);
286 return fe_child_ptr;
287 };
288
289
290
291 auto get_field_eval_op = [&](auto fe_child_ptr) {
293
294
295
296 auto field_eval_data = field_eval_ptr->getData<
DomainEle>();
297
299 field_eval_data,
simple->getDomainFEName(), parent_bit,
301
302
303 auto new_T_ptr = boost::make_shared<MatrixDouble>();
304 auto old_T_ptr = boost::make_shared<MatrixDouble>();
305 auto new_TAU_ptr = boost::make_shared<MatrixDouble>();
306 auto old_TAU_ptr = boost::make_shared<MatrixDouble>();
307 auto new_EP_ptr = boost::make_shared<MatrixDouble>();
308 auto old_EP_ptr = boost::make_shared<MatrixDouble>();
309
310 auto new_U_ptr = boost::make_shared<MatrixDouble>();
311 auto old_U_ptr = boost::make_shared<MatrixDouble>();
312 auto new_flux_ptr = boost::make_shared<MatrixDouble>();
313 auto old_flux_ptr = boost::make_shared<MatrixDouble>();
314
315 if (auto fe_eval_ptr = field_eval_data->feMethodPtr.lock()) {
316 fe_eval_ptr->getRuleHook = [](
int,
int,
int p) {
return -1; };
317 fe_eval_ptr->getOpPtrVector().push_back(
318 new OpCalculateVectorFieldValues<1>("T", old_T_ptr));
319 fe_eval_ptr->getOpPtrVector().push_back(
320 new OpCalculateVectorFieldValues<1>("TAU", old_TAU_ptr));
322 fe_eval_ptr->getOpPtrVector().push_back(
323 new OpCalculateVectorFieldValues<size_symm>("EP", old_EP_ptr));
324 fe_eval_ptr->getOpPtrVector().push_back(
325 new OpCalculateVectorFieldValues<SPACE_DIM>("U", old_U_ptr));
326 fe_eval_ptr->getOpPtrVector().push_back(
327 new OpCalculateHVecVectorField<3>("FLUX", old_flux_ptr));
328
329 } else {
331 "Field evaluator method pointer is expired");
332 }
333
334 auto op_ptr = field_eval_ptr->getDataOperator<
SPACE_DIM>(
335 {
336
337 {old_T_ptr, new_T_ptr},
338 {old_TAU_ptr, new_TAU_ptr},
339 {old_EP_ptr, new_EP_ptr},
340 {old_U_ptr, new_U_ptr},
341 {old_flux_ptr, new_flux_ptr}
342
343 },
346
347 fe_child_ptr->getOpPtrVector().push_back(op_ptr);
348
349 using FieldTupleVec = std::vector<
350 std::tuple<std::string, boost::shared_ptr<MatrixDouble>, int>>;
351
352 return std::make_pair(
353
354 std::vector<std::pair<std::string, boost::shared_ptr<MatrixDouble>>>{
355 {"T", new_T_ptr}, {"TAU", new_TAU_ptr}, {"EP", new_EP_ptr}},
356
357 std::vector<std::pair<std::string, boost::shared_ptr<MatrixDouble>>>{
358 {"U", new_U_ptr}, {"FLUX", new_flux_ptr}}
359
360 );
361 };
362
363
364 auto dg_projection_base = [&](auto fe_child_ptr, auto vec_data_ptr) {
366
367 auto entity_data_l2 = boost::make_shared<EntitiesFieldData>(MBENTITYSET);
368 auto mass_ptr = boost::make_shared<MatrixDouble>();
369 auto coeffs_ptr = boost::make_shared<MatrixDouble>();
370
371 constexpr int projection_order = 2;
372
373 for (
auto &[
field_name, data_ptr] : vec_data_ptr.first) {
374
375 fe_child_ptr->getOpPtrVector().push_back(new OpDGProjectionMassMatrix(
378 fe_child_ptr->getOpPtrVector().push_back(new OpDGProjectionCoefficients(
379 data_ptr, coeffs_ptr, mass_ptr, entity_data_l2,
381
382
384 op_set_coeffs->doWorkRhsHook =
385 [coeffs_ptr](DataOperator *base_op_ptr,
int side, EntityType
type,
386 EntitiesFieldData::EntData &data) -> MoFEMErrorCode {
388 auto field_ents = data.getFieldEntities();
389 auto nb_dofs = data.getIndices().size();
390 if (!field_ents.size())
392 if (auto e_ptr = field_ents[0]) {
393 auto field_ent_data = e_ptr->getEntFieldData();
394 std::copy(coeffs_ptr->data().data(),
395 coeffs_ptr->data().data() + nb_dofs,
396 field_ent_data.begin());
397 }
399 };
400 fe_child_ptr->getOpPtrVector().push_back(op_set_coeffs);
401 }
402
403 for (auto &p : vec_data_ptr.second) {
405 auto data_ptr = p.second;
406
408
409 using OpDomainMass = FormsIntegrators<DomainEleOp>::Assembly<
411
412
414 fe_child_ptr->getOpPtrVector().push_back(
416 using OpVec = FormsIntegrators<DomainEleOp>::Assembly<
418 fe_child_ptr->getOpPtrVector().push_back(
420 }
421
423
424 using OpDomainMass = FormsIntegrators<DomainEleOp>::Assembly<
426
427
429 fe_child_ptr->getOpPtrVector().push_back(
431 using OpVec = FormsIntegrators<DomainEleOp>::Assembly<
433 fe_child_ptr->getOpPtrVector().push_back(
435 }
436 }
437
439 };
440
441
442 auto fe_child_ptr = get_child_op(
feRhs->getOpPtrVector());
443
444
445 CHKERR dg_projection_base(fe_child_ptr, get_field_eval_op(fe_child_ptr));
446
447 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"Before looping FEs";
450
451
452
453 MOFEM_LOG(
"REMESHING", Sev::inform) <<
"After looping RHS";
454
455
456
457
459};
void simple(double P1[], double P2[], double P3[], double c[], const int N)
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
constexpr int SPACE_DIM
[Define dimension]
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::BiLinearForm< GAUSS >::OpMass< 1, FIELD_DIM > OpDomainMass
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
@ L2
field with C-1 continuity
@ MOFEM_ATOM_TEST_INVALID
PetscErrorCode DMoFEMLoopFiniteElementsUpAndLowRank(DM dm, const char fe_name[], MoFEM::FEMethod *method, int low_rank, int up_rank, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
#define MOFEM_LOG(channel, severity)
Log.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
constexpr auto field_name
virtual int get_comm_size() const =0
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.
int geom_order
Order if fixed.