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

Method CalcMatrix

comp/interpolate.cpp:480–555  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

478 void CheckElement (const FiniteElement& fel) const override { }
479
480 void
481 CalcMatrix (const FiniteElement & inner_fel,
482 const BaseMappedIntegrationRule & mir,
483 BareSliceMatrix<double,ColMajor> mat,
484 LocalHeap & lh) const override
485 {
486 static Timer t1("interpolateDiffOp, CalcMat");
487 static Timer tm2("interpolateDiffOp, CalcMat m2");
488 static Timer t23("interpolateDiffOp, mult 23");
489 static Timer t23t("interpolateDiffOp, mult 23t");
490 RegionTracer reg(TaskManager::GetThreadId(), t1);
491
492 HeapReset hr(lh);
493
494 const ElementTransformation & trafo = mir.GetTransformation();
495 ElementId ei = trafo.GetElementId();
496 auto & interpol_fel = fes->GetFE(ei, lh);
497 // int dim = func->Dimension();
498
499 /** Calc Element Matrix - shape * dual_shape **/
500 FlatMatrix<double> elmat(interpol_fel.GetNDof(), lh);
501 elmat = 0.0;
502 bool symmetric_so_far = false;
503
504 size_t nshape = inner_fel.GetNDof();
505 FlatMatrix<> m2m3 (elmat.Height(), nshape, lh);
506
507 // auto saveud = nonconst_trafo.userdata;
508 try
509 {
510 RegionTracer reg(TaskManager::GetThreadId(), tm2);
511 for (auto & sbfi : single_bli)
512 sbfi->CalcElementMatrixAdd (interpol_fel, trafo, elmat, symmetric_so_far, lh);
513
514 CalcInverse(elmat);
515
516 MixedFiniteElement mfe = (testfunction)
517 ? MixedFiniteElement (interpol_fel, inner_fel)
518 : MixedFiniteElement (inner_fel, interpol_fel);
519
520 if (testfunction)
521 {
522 FlatMatrix<> m3T(nshape, interpol_fel.GetNDof(), lh);
523 m3T = 0.0;
524 for (auto & sbfi : m3_bli)
525 sbfi->CalcElementMatrixAdd (mfe, trafo, m3T, symmetric_so_far, lh);
526 RegionTracer reg(TaskManager::GetThreadId(), t23t);
527 m2m3 = elmat * Trans(m3T);
528 }
529 else
530 {
531 FlatMatrix<> m3(interpol_fel.GetNDof(), nshape, lh);
532 m3 = 0.0;
533 for (auto & sbfi : m3_bli)
534 sbfi->CalcElementMatrixAdd (mfe, trafo, m3, symmetric_so_far, lh);
535 RegionTracer reg(TaskManager::GetThreadId(), t23);
536 m2m3 = elmat * m3;
537 }

Callers 1

CalcLinearizedMatrixMethod · 0.45

Calls 9

MixedFiniteElementClass · 0.85
IMClass · 0.85
GetTransformationMethod · 0.80
CalcInverseFunction · 0.50
TransFunction · 0.50
DimFunction · 0.50
GetNDofMethod · 0.45
HeightMethod · 0.45
SizeMethod · 0.45

Tested by

no test coverage detected