| 547 | } |
| 548 | |
| 549 | void ContactEnergy::CalcLinearizedAdd(const FiniteElement& primary_fel, |
| 550 | const FiniteElement& secondary_fel, |
| 551 | const BaseMappedIntegrationRule& primary_mir, |
| 552 | FlatVector<double> elx, |
| 553 | FlatMatrix<double> elmat, |
| 554 | LocalHeap& lh) |
| 555 | { |
| 556 | HeapReset hr(lh); |
| 557 | ProxyUserData ud(trial_proxies.Size(), cf_gridfunctions.Size(), lh); |
| 558 | const_cast<ElementTransformation&>(primary_mir.GetTransformation()).userdata = &ud; |
| 559 | ud.fel = & primary_fel; |
| 560 | |
| 561 | for(auto proxy : trial_proxies) |
| 562 | { |
| 563 | IntRange trial_range = proxy->IsOther() ? IntRange(proxy->Evaluator()->BlockDim() * primary_fel.GetNDof(), elx.Size()) : IntRange(0, proxy->Evaluator()->BlockDim() * primary_fel.GetNDof()); |
| 564 | ud.AssignMemory(proxy, primary_mir.Size(), proxy->Dimension(), lh); |
| 565 | if(proxy->IsOther()) |
| 566 | proxy->Evaluator()->Apply(secondary_fel, *primary_mir.GetOtherMIR(), elx.Range(trial_range), |
| 567 | ud.GetMemory(proxy), lh); |
| 568 | else |
| 569 | proxy->Evaluator()->Apply(primary_fel, primary_mir, elx.Range(trial_range), |
| 570 | ud.GetMemory(proxy), lh); |
| 571 | } |
| 572 | |
| 573 | for(auto gf : cf_gridfunctions) |
| 574 | ud.AssignMemory(gf, primary_mir.Size(), gf->Dimension(), lh); |
| 575 | |
| 576 | FlatMatrix<> dderiv(primary_mir.Size(), 1,lh); |
| 577 | FlatMatrix<AutoDiffDiff<1,double>> ddval(primary_mir.Size(), 1, lh); |
| 578 | |
| 579 | FlatArray<FlatMatrix<>> diags(trial_proxies.Size(), lh); |
| 580 | for (int k1 : Range(trial_proxies)) |
| 581 | { |
| 582 | auto proxy = trial_proxies[k1]; |
| 583 | diags[k1].AssignMemory(primary_mir.Size(), proxy->Dimension(), lh); |
| 584 | for (int k = 0; k < proxy->Dimension(); k++) |
| 585 | { |
| 586 | ud.trialfunction = proxy; |
| 587 | ud.trial_comp = k; |
| 588 | ud.testfunction = proxy; |
| 589 | ud.test_comp = k; |
| 590 | cf -> Evaluate (primary_mir, ddval); |
| 591 | for (size_t i = 0; i < primary_mir.Size(); i++) |
| 592 | diags[k1](i,k) = ddval(i,0).DDValue(0); |
| 593 | } |
| 594 | } |
| 595 | |
| 596 | for (int k1 : Range(trial_proxies)) |
| 597 | for (int l1 : Range(trial_proxies)) |
| 598 | { |
| 599 | HeapReset hr(lh); |
| 600 | |
| 601 | auto proxy1 = trial_proxies[k1]; |
| 602 | auto proxy2 = trial_proxies[l1]; |
| 603 | |
| 604 | FlatTensor<3> proxyvalues(lh, primary_mir.Size(), proxy2->Dimension(), proxy1->Dimension()); |
| 605 | for (int k = 0; k < proxy1->Dimension(); k++) |
| 606 | for (int l = 0; l < proxy2->Dimension(); l++) |
no test coverage detected