#include "FiniteElemSpace.h" #include "DOFAdmin.h" #include "DOFVector.h" #include "BasisFunction.h" #include "Mesh.h" #include namespace AMDiS { std::vector FiniteElemSpace::feSpaces; FiniteElemSpace::FiniteElemSpace(DOFAdmin* admin_, const BasisFunction* bas_fcts_, Mesh* aMesh, const std::string& aString) : name(aString), admin(admin_), basFcts(bas_fcts_), mesh(aMesh) { FUNCNAME("FiniteElemSpace::FiniteElemSpace()"); TEST_EXIT(mesh)("no Mesh\n"); if (!admin) { const DOFAdmin *admin_local = NULL; int i, j; const DimVec *ndof = NULL; ndof = basFcts->getNumberOfDOFs(); TEST_EXIT(ndof)("no n_dof or basFcts->n_dof\n"); for (i = 0; i < mesh->getNumberOfDOFAdmin(); i++) { admin_local = &(mesh->getDOFAdmin(i)); for (j = 0; j <= mesh->getDim(); j++) { if (admin_local->getNumberOfDOFs(j) != (*ndof)[j]) break; } if (j > mesh->getDim()) break; admin_local = NULL; } if (!admin_local) { admin_local = mesh->createDOFAdmin(name, *ndof); } admin = const_cast(admin_local); } feSpaces.push_back(this); } FiniteElemSpace *FiniteElemSpace::provideFESpace(DOFAdmin *admin, const BasisFunction *basFcts, Mesh *mesh, const std::string& name_) { int numSpaces = static_cast(feSpaces.size()); for (int i = 0; i < numSpaces; i++) { if (admin) { if (feSpaces[i]->admin == admin) { return feSpaces[i]; } } else { if (feSpaces[i]->basFcts == basFcts && feSpaces[i]->mesh == mesh) { return feSpaces[i]; } } } if(admin) { ERROR_EXIT("no fespace found for this admin\n"); return NULL; } else { return NEW FiniteElemSpace(NULL, basFcts, mesh, name_); } } }