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

Method Interpolate

comp/gridfunction.cpp:285–374  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

283
284
285 void GridFunction :: Interpolate (const CoefficientFunction & cf,
286 const Region * reg, int mdcomp, LocalHeap & clh)
287 {
288 static Timer t("GridFunction::Interpolate"); RegionTimer r(t);
289 shared_ptr<FESpace> fes = GetFESpace();
290 shared_ptr<MeshAccess> ma = fes->GetMeshAccess();
291 int dim = fes->GetDimension();
292
293 Array<int> cnti(fes->GetNDof());
294 cnti = 0;
295
296 auto tempvec = GetVector(mdcomp).CreateVector();
297
298 if (reg)
299 {
300 auto regdofs = make_shared<BitArray> (fes->GetDofs(*reg));
301 Projector proj(regdofs, false);
302 tempvec = proj * GetVector(mdcomp);
303 }
304 else
305 tempvec = 0.0;
306
307 auto vb = reg ? reg->VB() : VOL;
308 IterateElements
309 (*fes, vb, clh,
310 [&] (FESpace::Element el, LocalHeap & lh)
311 {
312 if (reg)
313 if (!reg->Mask().Test(el.GetIndex())) return;
314
315 if (!fes->DefinedOn(el)) return;
316
317 const FiniteElement & fel = fes->GetFE (el, lh);
318 int ndof = fel.GetNDof();
319 int fesdim = fespace->GetDimension();
320 // int dimcf = cf.Dimension();
321 const ElementTransformation & eltrans = ma->GetTrafo (el, lh);
322
323 FlatVector<> elvec(ndof*fesdim, lh), elvec1(ndof*fesdim, lh);
324
325 // GetElementVector (mdcomp, el.GetDofs(), elvec1);
326 // cout << "elvec, before: " << endl << elvec1 << endl;
327
328 // fel.Interpolate (eltrans, cf, elvec.AsMatrix(ndof/dimcf, dimcf), lh);
329 fel.Interpolate (eltrans, cf, elvec.AsMatrix(ndof, fesdim), lh);
330 // cout << "elvec: " << endl << elvec << endl;
331
332 fes->TransformVec (el, elvec, TRANSFORM_SOL_INVERSE);
333
334 // GetElementVector (mdcomp, el.GetDofs(), elvec1);
335 tempvec.GetIndirect (el.GetDofs(), elvec1);
336 elvec1 += elvec;
337 // SetElementVector (mdcomp, el.GetDofs(), elvec1);
338 tempvec.SetIndirect (el.GetDofs(), elvec1);
339
340 for (auto d : el.GetDofs())
341 if (IsRegularDof(d)) cnti[d]++;
342 });

Callers

nothing calls this directly

Calls 15

IsRegularDofFunction · 0.85
GetMeshAccessMethod · 0.80
TransformVecMethod · 0.80
GetIndirectMethod · 0.80
GetParallelDofsMethod · 0.80
AllReduceDofDataMethod · 0.80
SetParallelStatusMethod · 0.80
CumulateMethod · 0.80
GetFESpaceFunction · 0.70
IterateElementsFunction · 0.70
GetDimensionMethod · 0.45
GetNDofMethod · 0.45

Tested by

no test coverage detected