| 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 | { |
nothing calls this directly
no test coverage detected