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

Method CalcLinearizedAdd

comp/contact.cpp:549–669  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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++)

Callers 1

Calls 15

GetTransformationMethod · 0.80
GetMemoryMethod · 0.80
RangeFunction · 0.50
TransFunction · 0.50
SizeMethod · 0.45
GetNDofMethod · 0.45
AssignMemoryMethod · 0.45
DimensionMethod · 0.45
ApplyMethod · 0.45
RangeMethod · 0.45
EvaluateMethod · 0.45
ColMethod · 0.45

Tested by

no test coverage detected