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

Method RestrictInline

comp/hdivfes.cpp:567–619  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

565 }
566
567 virtual void RestrictInline (int finelevel, BaseVector & v) const
568 {
569 size_t nc = space.GetNDofLevel (finelevel-1) / 3;
570 size_t nf = space.GetNDofLevel (finelevel) / 3;
571
572 auto fv = v.FV<double>();
573 fv.Range(3*nf, fv.Size()) = 0;
574
575 // every face from coarse level got split
576 for (size_t i = 0; i < nf; i++)
577 {
578 auto [info, nrs] = ma->GetParentFaces(i);
579 if (nrs[0] != -1 && nrs[1] == -1)
580 {
581 fv(3*nrs[0]) = 0;
582 fv(3*nrs[0]+1) = 0;
583 fv(3*nrs[0]+2) = 0;
584 }
585 }
586
587 for (int loop = 0; loop < 5; loop++)
588 for (size_t i = nf; i-- > nc; )
589 {
590 auto [info, nrs] = ma->GetParentFaces(i);
591 int pa1 = nrs[0];
592 int pa2 = nrs[1];
593 int pa3 = nrs[2];
594 int pa4 = nrs[3];
595
596 if (pa2 == -1)
597 {
598 if (info==20) ;// interior face:: do nothing
599 else{ // bisect or red face
600 Vec<3> fvecf = fv.Range(3*i, 3*i+3);
601 Vec<3> fvecc = Trans(boundaryprol[info]) * fvecf;
602 fv.Range(3*pa1, 3*pa1+3) += fvecc;
603 fv.Range(3*i, 3*i+3) = 0.0;
604 }
605 }
606 else
607 {
608 Vec<3> fvecf = fv.Range(3*i, 3*i+3);
609 Vec<12> fvecc = Trans(innerprol[info]) * fvecf;
610
611 fv.Range(3*pa1, 3*pa1+3) += fvecc.Range(0,3);
612 fv.Range(3*pa2, 3*pa2+3) += fvecc.Range(3,6);
613 fv.Range(3*pa3, 3*pa3+3) += fvecc.Range(6,9);
614 fv.Range(3*pa4, 3*pa4+3) += fvecc.Range(9,12);
615
616 fv.Range(3*i, 3*i+3) = 0.0;
617 }
618 }
619 }
620 };
621
622// BDM1 prol in TRIG

Callers

nothing calls this directly

Calls 5

FV<double>Method · 0.80
TransFunction · 0.50
GetNDofLevelMethod · 0.45
RangeMethod · 0.45
SizeMethod · 0.45

Tested by

no test coverage detected