From 7f063fce81210d53ae0b04db738833bcf2015102 Mon Sep 17 00:00:00 2001 From: Nicolas Marsic <nicolas.marsic@gmail.com> Date: Wed, 8 Jan 2014 15:58:34 +0000 Subject: [PATCH] DDM Tests: Rewritting SystemAbstract::getSolution + FunctionSpace::getUnorderedKeys() + FunctionSpace::getAllDofs with set + FunctionSpace::getKeys(set) --- FunctionSpace/FunctionSpace.cpp | 87 +++++++++++++++++++++++---------- FunctionSpace/FunctionSpace.h | 9 ++-- 2 files changed, 67 insertions(+), 29 deletions(-) diff --git a/FunctionSpace/FunctionSpace.cpp b/FunctionSpace/FunctionSpace.cpp index ea38989248..fa9035ea74 100644 --- a/FunctionSpace/FunctionSpace.cpp +++ b/FunctionSpace/FunctionSpace.cpp @@ -144,43 +144,28 @@ void FunctionSpace::insertDof(Dof& d, } } */ -vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ + +vector<Dof> FunctionSpace::getUnorderedKeys(const MElement& elem) const{ // Const_Cast // MElement& element = const_cast<MElement&>(elem); - // Create New Element With Permuted Vertices // - // Permutation - const vector<size_t>& vPerm = - (*this->basis)[0]->getReferenceSpace().getNodeIndexFromABCtoUVW(elem); - - // Permuted Vertices + // Vertex, Edge & Face // const size_t nVertex = element.getNumPrimaryVertices(); + const size_t nEdge = element.getNumEdges(); + const size_t nFace = element.getNumFaces(); + vector<MVertex*> vertex(nVertex); + vector<MEdge> edge(nEdge); + vector<MFace> face(nFace); for(size_t i = 0; i < nVertex; i++) - vertex[i] = element.getVertex(vPerm[i]); - - // New Element - MElementFactory factory; - int parentTag = ElementType::ParentTypeFromTag(elem.getTypeForMSH()); - int lowOrderTag = ElementType::getTag(parentTag, 1, false); - - MElement* permElement = factory.create(lowOrderTag, vertex); - - // Edge & Face from Permuted Element // - const size_t nEdge = permElement->getNumEdges(); - const size_t nFace = permElement->getNumFaces(); - - vector<MEdge> edge(nEdge); - vector<MFace> face(nFace); + vertex[i] = element.getVertex(i); for(size_t i = 0; i < nEdge; i++) - edge[i] = permElement->getEdge(i); + edge[i] = element.getEdge(i); for(size_t i = 0; i < nFace; i++) - face[i] = permElement->getFace(i); - - delete permElement; + face[i] = element.getFace(i); // Create Dof // size_t nDof = @@ -226,6 +211,56 @@ vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ return myDof; } +vector<Dof> FunctionSpace::getKeys(const MElement& elem) const{ + // Const_Cast // + MElement& element = const_cast<MElement&>(elem); + + // Create New Element With Permuted Vertices // + // Permutation + const vector<size_t>& vPerm = + (*this->basis)[0]->getReferenceSpace().getNodeIndexFromABCtoUVW(elem); + + // Permuted Vertices + const size_t nVertex = element.getNumPrimaryVertices(); + vector<MVertex*> vertex(nVertex); + + for(size_t i = 0; i < nVertex; i++) + vertex[i] = element.getVertex(vPerm[i]); + + // New Element + MElementFactory factory; + int parentTag = ElementType::ParentTypeFromTag(elem.getTypeForMSH()); + int lowOrderTag = ElementType::getTag(parentTag, 1, false); + + MElement* permElement = factory.create(lowOrderTag, vertex); + + // Get Dofs from permuted Element // + vector<Dof> myDofs = getUnorderedKeys(*permElement); + + // Free and Return // + delete permElement; + return myDofs; +} + +void FunctionSpace::getKeys(const GroupOfElement& goe, + std::set<Dof>& dof) const{ + // Get Elements // + const vector<const MElement*>& element = goe.getAll(); + const size_t nElement = element.size(); + + // Loop on Elements // + for(size_t e = 0; e < nElement; e++){ + // Get my Dofs + vector<Dof> myDof = getUnorderedKeys(*element[e]); + const size_t nDof = myDof.size(); + + // Add my Dofs + for(size_t d = 0; d < nDof; d++) + dof.insert(myDof[d]); + } +} + + const GroupOfDof& FunctionSpace:: getGoDFromElement(const MElement& element) const{ diff --git a/FunctionSpace/FunctionSpace.h b/FunctionSpace/FunctionSpace.h index 75f6b3eb7d..8c7847f610 100644 --- a/FunctionSpace/FunctionSpace.h +++ b/FunctionSpace/FunctionSpace.h @@ -75,12 +75,15 @@ class FunctionSpace{ GroupOfElement& getSupport(void) const; bool isScalar(void) const; + std::vector<Dof> getUnorderedKeys(const MElement& element) const; std::vector<Dof> getKeys(const MElement& element) const; std::vector<Dof> getKeys(const MVertex& vertex) const; std::vector<Dof> getKeys(const MEdge& edge) const; std::vector<Dof> getKeys(const MFace& face) const; - const std::vector<Dof> getAllDofs(void) const; + void getKeys(const GroupOfElement& goe, std::set<Dof>& dof) const; + + const std::set<Dof>& getAllDofs(void) const; const std::vector<GroupOfDof*>& getAllGroups(void) const; const GroupOfDof& getGoDFromElement(const MElement& element) const; @@ -209,8 +212,8 @@ inline size_t FunctionSpace::groupNumber(void) const{ return group->size(); } -inline const std::vector<Dof> FunctionSpace::getAllDofs(void) const{ - return std::vector<Dof>(dof->begin(), dof->end()); +inline const std::set<Dof>& FunctionSpace::getAllDofs(void) const{ + return *dof; } inline const std::vector<GroupOfDof*>& FunctionSpace::getAllGroups(void) const{ -- GitLab