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