Skip to content
Snippets Groups Projects
Commit c5f1ada7 authored by Oliver Sander's avatar Oliver Sander Committed by sander@FU-BERLIN.DE
Browse files

shorter and much more general implementation using AlienElementLocalBasisFunction

[[Imported from SVN: r8220]]
parent 4a513821
No related branches found
No related tags found
No related merge requests found
...@@ -85,47 +85,32 @@ public: ...@@ -85,47 +85,32 @@ public:
for (; it != endIt; ++it) { for (; it != endIt; ++it) {
typedef typename GridView::template Codim<0>::Entity EntityType; typedef typename P1NodalBasis<GridView,double>::LocalFiniteElement LP1FE;
const LP1FE& coarseBaseSet = p1Basis.getLocalFiniteElement(*it);
// Get local finite element typedef typename Dune::LocalFiniteElementFunctionBase<LP1FE>::type FunctionBaseClass;
const typename P1NodalBasis<GridView,double>::LocalFiniteElement& coarseBaseSet = p1Basis.getLocalFiniteElement(*it);
const int numCoarseBaseFct = coarseBaseSet.localBasis().size(); typedef typename GridView::template Codim<0>::Entity Element;
AlienElementLocalBasisFunction<Element, LP1FE, FunctionBaseClass> f(*it, *it, coarseBaseSet.localBasis());
// preallocate vector for function evaluations for (int i=0; i<coarseBaseSet.localBasis().size(); i++) {
std::vector<Dune::FieldVector<field_type,1> > values(numCoarseBaseFct);
const Dune::GenericReferenceElement<ctype,dim>& fineRefElement f.setIndex(i);
= Dune::GenericReferenceElements<ctype, dim>::general(it->type()); std::vector<double> values;
fineBasis.getLocalFiniteElement(*it).localInterpolation().interpolate(f,values);
// Get local finite element
const typename Basis::LocalFiniteElement& fineBaseSet = fineBasis.getLocalFiniteElement(*it);
const int numFineBaseFct = fineBaseSet.localBasis().size();
for (int j=0; j<numFineBaseFct; j++)
{
const Dune::LocalKey& jLocalKey = fineBaseSet.localCoefficients().localKey(j);
int globalFine = fineBasis.index(*it, j);
Dune::FieldVector<ctype, dim> fineBasePosition = fineRefElement.position(jLocalKey.subEntity(), jLocalKey.codim());
Dune::FieldVector<ctype, dim> local = fineBasePosition;
#warning Position computation is wrong!
// Evaluate coarse grid base functions for (size_t j=0; j<values.size(); j++) {
coarseBaseSet.localBasis().evaluateFunction(local, values);
for (int i=0; i<numCoarseBaseFct; i++)
{
if (values[i] > 0.001) if (values[i] > 0.001)
{ {
const Dune::LocalKey& iLocalKey = coarseBaseSet.localCoefficients().localKey(i); size_t globalFine = fineBasis.index(*it, j);
int globalCoarse = p1Basis.index(*it, i); size_t globalCoarse = p1Basis.index(*it, i);
indices.add(globalFine, globalCoarse); indices.add(globalFine, globalCoarse);
} }
} }
} }
} }
...@@ -135,52 +120,37 @@ public: ...@@ -135,52 +120,37 @@ public:
// ///////////////////////////////////////////// // /////////////////////////////////////////////
// Compute the matrix // Compute the matrix
// ///////////////////////////////////////////// // /////////////////////////////////////////////
it = gridView.template begin<0>();
for (; it != endIt; ++it) {
// Get local finite element
const typename P1NodalBasis<GridView,double>::LocalFiniteElement& coarseBaseSet = p1Basis.getLocalFiniteElement(*it);
const int numCoarseBaseFct = coarseBaseSet.localBasis().size();
typedef typename GridView::template Codim<0>::Entity EntityType;
// preallocate vector for function evaluations
std::vector<Dune::FieldVector<field_type,1> > values(numCoarseBaseFct);
const Dune::GenericReferenceElement<ctype,dim>& fineRefElement for (it = gridView.template begin<0>(); it != endIt; ++it) {
= Dune::GenericReferenceElements<ctype, dim>::general(it->type());
// Get local finite element typedef typename P1NodalBasis<GridView,double>::LocalFiniteElement LP1FE;
const typename Basis::LocalFiniteElement& fineBaseSet = fineBasis.getLocalFiniteElement(*it); const LP1FE& coarseBaseSet = p1Basis.getLocalFiniteElement(*it);
const int numFineBaseFct = fineBaseSet.localBasis().size(); typedef typename Dune::LocalFiniteElementFunctionBase<LP1FE>::type FunctionBaseClass;
for (int j=0; j<numFineBaseFct; j++) typedef typename GridView::template Codim<0>::Entity Element;
{ AlienElementLocalBasisFunction<Element, LP1FE, FunctionBaseClass> f(*it, *it, coarseBaseSet.localBasis());
const Dune::LocalKey& jLocalKey = fineBaseSet.localCoefficients().localKey(j);
int globalFine = fineBasis.index(*it, j); for (int i=0; i<coarseBaseSet.localBasis().size(); i++) {
Dune::FieldVector<ctype, dim> fineBasePosition = fineRefElement.position(jLocalKey.subEntity(), jLocalKey.codim()); f.setIndex(i);
Dune::FieldVector<ctype, dim> local = fineBasePosition; std::vector<double> values;
#warning Position computation is wrong! fineBasis.getLocalFiniteElement(*it).localInterpolation().interpolate(f,values);
// Evaluate coarse grid base functions for (size_t j=0; j<values.size(); j++) {
coarseBaseSet.localBasis().evaluateFunction(local, values);
for (int i=0; i<numCoarseBaseFct; i++)
{
if (values[i] > 0.001) if (values[i] > 0.001)
{ {
const Dune::LocalKey& iLocalKey = coarseBaseSet.localCoefficients().localKey(i); size_t globalFine = fineBasis.index(*it, j);
int globalCoarse = p1Basis.index(*it, i); size_t globalCoarse = p1Basis.index(*it, i);
TransferMatrixBlock matValue = identity; TransferMatrixBlock matValue = identity;
matValue *= values[i]; matValue *= values[i];
(*this->matrix_)[globalFine][globalCoarse] = matValue; (*this->matrix_)[globalFine][globalCoarse] = matValue;
} }
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment