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

Method AddLinearizedElementMatrix

fem/symbolicintegrator.cpp:5360–5503  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5358 }
5359
5360 void SymbolicEnergy ::
5361 AddLinearizedElementMatrix (const FiniteElement & fel,
5362 ProxyUserData & ud,
5363 const BaseMappedIntegrationRule & mir,
5364 FlatVector<double> elveclin,
5365 FlatMatrix<double> elmat,
5366 LocalHeap & lh) const
5367 {
5368 static Timer t("SymbolicEnergy::AddLinearizedElementMatrix (nosimd)", NoTracing);
5369 static Timer tdmat("SymbolicEnergy::CalcDMat (nosimd)", NoTracing);
5370 // Timer & tdmat = const_cast<Timer&> (timer);
5371 static Timer tbmat("SymbolicEnergy::CalcBMat (nosimd)", NoTracing);
5372 static Timer tmult("SymbolicEnergy::mult", NoTracing);
5373 RegionTimer reg(t);
5374
5375 HeapReset hr(lh);
5376
5377 FlatMatrix<> dderiv(mir.Size(), 1,lh);
5378 FlatMatrix<AutoDiffDiff<1,double>> ddval(mir.Size(), 1, lh);
5379
5380 FlatArray<FlatMatrix<>> diags(trial_proxies.Size(), lh);
5381 FlatArray<FlatMatrix<>> dWdB(trial_proxies.Size(), lh);
5382 for (int k1 : Range(trial_proxies))
5383 {
5384 auto proxy = trial_proxies[k1];
5385 diags[k1].AssignMemory(mir.Size(), proxy->Dimension(), lh);
5386 dWdB[k1].AssignMemory(mir.Size(), proxy->Dimension(), lh);
5387 for (int k = 0; k < proxy->Dimension(); k++)
5388 {
5389 ud.trialfunction = proxy;
5390 ud.trial_comp = k;
5391 ud.testfunction = proxy;
5392 ud.test_comp = k;
5393 cf -> Evaluate (mir, ddval);
5394 for (size_t i = 0; i < mir.Size(); i++)
5395 diags[k1](i,k) = ddval(i,0).DDValue(0);
5396 for (size_t i = 0; i < mir.Size(); i++)
5397 dWdB[k1](i,k) = ddval(i,0).DValue(0);
5398 }
5399 }
5400
5401 for (int k1 : Range(trial_proxies))
5402 for (int l1 : Range(trial_proxies))
5403 {
5404 HeapReset hr(lh);
5405 if (!nonzeros_proxies(k1,l1)) continue;
5406
5407 auto proxy1 = trial_proxies[k1];
5408 auto proxy2 = trial_proxies[l1];
5409
5410 FlatTensor<3> proxyvalues(lh, mir.Size(), proxy2->Dimension(), proxy1->Dimension());
5411 for (int k = 0; k < proxy1->Dimension(); k++)
5412 for (int l = 0; l < proxy2->Dimension(); l++)
5413 {
5414 ud.trialfunction = proxy1;
5415 ud.trial_comp = k;
5416 ud.testfunction = proxy2;
5417 ud.test_comp = l;

Callers

nothing calls this directly

Calls 15

CalcLinearizedMatrixMethod · 0.80
IsNonlinearMethod · 0.80
CalcHessianAddMethod · 0.80
RangeFunction · 0.50
TransFunction · 0.50
SizeMethod · 0.45
AssignMemoryMethod · 0.45
DimensionMethod · 0.45
EvaluateMethod · 0.45
ColMethod · 0.45
GetWeightMethod · 0.45
WidthMethod · 0.45

Tested by

no test coverage detected