MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / InterpolateDiffOp

Method InterpolateDiffOp

comp/interpolate.cpp:388–475  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

386
387 public:
388 InterpolateDiffOp (shared_ptr<CoefficientFunction> afunc,
389 shared_ptr<FESpace> afes,
390 shared_ptr<DifferentialOperator> adiffop,
391 int abonus_intorder,
392 bool atestfunction,
393 VorB avb=VOL)
394 : DifferentialOperator (adiffop->Dim(), 1, avb, 0),
395 func(afunc), fes(afes), bonus_intorder(abonus_intorder), testfunction(atestfunction), diffop(adiffop)
396 {
397 // copied from Set (dualshapes)
398
399 /** Trial-Proxy **/
400 auto single_evaluator = fes->GetEvaluator(vb);
401 if (dynamic_pointer_cast<BlockDifferentialOperator>(single_evaluator))
402 single_evaluator = dynamic_pointer_cast<BlockDifferentialOperator>(single_evaluator)->BaseDiffOp();
403 auto trial = make_shared<ProxyFunction>(fes, false, false, single_evaluator,
404 nullptr, nullptr, nullptr, nullptr, nullptr);
405
406 /** Test-Proxy (dual) **/
407 auto dual_evaluator = fes->GetAdditionalEvaluators()["dual"];
408 for (VorB avb = VOL; avb < vb; avb++) {
409 dual_evaluator = dual_evaluator->GetTrace();
410 if ( dual_evaluator == nullptr )
411 { throw Exception(fes->GetClassName() + string(" has no dual trace operator for vb = ") + \
412 to_string(avb) + string(" -> ") + to_string(avb + 1) + string("!")); }
413 }
414 if (dynamic_pointer_cast<BlockDifferentialOperator>(dual_evaluator))
415 dual_evaluator = dynamic_pointer_cast<BlockDifferentialOperator>(dual_evaluator)->BaseDiffOp();
416 auto dual = make_shared<ProxyFunction>(fes, true, false, dual_evaluator,
417 nullptr, nullptr, nullptr, nullptr, nullptr);
418 auto dual_tr = make_shared<ProxyFunction>(fes, false, false, dual_evaluator,
419 nullptr, nullptr, nullptr, nullptr, nullptr);
420
421 dual_diffop = dual_evaluator;
422
423
424 //Get FESpace of proxy to interpolate
425 func->TraverseTree
426 ( [&] (CoefficientFunction & nodecf)
427 {
428 if (auto proxy = dynamic_cast<ProxyFunction*> (&nodecf))
429 fes_func = proxy->GetFESpace();
430 });
431
432
433 dual_fecf = make_shared<FECoefficientFunction> (dual_evaluator);
434
435 for (auto element_vb : fes->GetDualShapeNodes(vb))
436 {
437 shared_ptr<CoefficientFunction> dual_trial;
438 shared_ptr<CoefficientFunction> proxy_cf;
439 if (dual -> Dimension() == 1)
440 {
441 dual_trial = dual * trial;
442 proxy_cf = atestfunction ? (dual_tr * afunc) : (dual * afunc) ;
443 }
444 else
445 {

Callers

nothing calls this directly

Calls 11

GetFESpaceMethod · 0.80
InnerProductFunction · 0.50
DimMethod · 0.45
BaseDiffOpMethod · 0.45
GetTraceMethod · 0.45
GetClassNameMethod · 0.45
TraverseTreeMethod · 0.45
GetDualShapeNodesMethod · 0.45
DimensionMethod · 0.45
AppendMethod · 0.45

Tested by

no test coverage detected