Global matrix assembling

The bilinear-form consists of a couple of integrators acting on the domain or on the boundary. It has a reference to the finite element space it is defined on. The sparse matrices are stored in the bilinear-form object.

template <typename SCAL = double>
void BilinearForm :: Assemble ()
{
  ARRAY<int> dnums;
  Matrix<SCAL> Matrix elmat;
  ElementTransformation eltrans;
      
  int ndof = fespace.GetNDof();
      
  BaseMatrix & mat = GetMatrix();
  mat = 0.0;
      
  LocalHeap locheap (1000000);

  // assembling of volume terms
  int ne = ma.GetNE();
  for (int i = 0; i < ne; i++)
    {
      locheap.CleanUp();
      if (!fespace.DefinedOn (ma.GetElIndex (i))) continue;

      ma.GetElementTransformation (i, eltrans);
      const FiniteElement & fel = fespace.GetFE (i);
      fespace.GetDofNrs (i, dnums);

      for (int j = 0; j < parts.Size(); j++)
	{
	  const BilinearFormIntegrator & bfi = *parts.Get(j);
	  if (bfi.BoundaryForm()) continue;
	      
	  bfi.AssembleElementMatrix (fel, eltrans, elmat, &locheap);
	  fespace.TransformMatrix (i, elmat);
	  mat->AddElementMatrix (dnums, elmat);
	}
    }
       
  // assembling of surface terms
  int nse = ma.GetNSE();
  for (int i = 0; i < nse; i++)
    {
      locheap.CleanUp();
      if (!fespace.DefinedOnBoundary (ma.GetSElIndex (i))) continue;

      ma.GetSurfaceElementTransformation (i, eltrans);
      const FiniteElement & fel = fespace.GetSFE (i);
      fespace.GetSDofNrs (i, dnums);

      for (int j = 1; j <= parts.Size(); j++)
	{
	  const BilinearFormIntegrator & bfi = *parts.Get(j);
	  if (!bfi.BoundaryForm()) continue;
	      
	  bfi.AssembleElementMatrix (fel, eltrans, elmat, &locheap);
	  fespace.TransformSurfMatrix (i, elmat);
	  mat->AddElementMatrix (dnums, elmat);
	}
    }
}

Alphabetic index Hierarchy of classes



This page was generated with the help of DOC++.