Skip to content
Snippets Groups Projects
Commit aec9f2ad authored by Nicolas Marsic's avatar Nicolas Marsic
Browse files

Introducing Dof::RejectedDof() to handle Dofs that are not part of...

Introducing Dof::RejectedDof() to handle Dofs that are not part of FunctionSpace in both assembly and interpolation -- Seems ok
parent d4a3ba63
No related branches found
No related tags found
No related merge requests found
#include <limits.h>
#include <sstream>
#include "ReferenceSpaceManager.h"
......@@ -9,7 +8,6 @@
using namespace std;
const Dof FunctionSpace::rejectedDof(INT_MAX, INT_MAX);
const size_t FunctionSpace::nGeoType = 9;
size_t FunctionSpace::nxtOffset = 0;
......@@ -162,12 +160,15 @@ size_t FunctionSpace::findMaxType(void){
nDof = it->second[e].size();
for(size_t d = 0; d < nDof; d++){
// This Dof Type
type = it->second[e][d].getType();
// If this Dof type is bigger, it becomes the new 'maxType'
if(type > maxType)
maxType = type;
// Check if not a RejectedDof
if(it->second[e][d] != Dof::RejectedDof()){
// This Dof Type
type = it->second[e][d].getType();
// If this Dof type is bigger, it becomes the new 'maxType'
if(type > maxType)
maxType = type;
}
}
}
}
......@@ -177,7 +178,7 @@ size_t FunctionSpace::findMaxType(void){
}
void FunctionSpace::getUnorderedKeys(const MElement& elem,
std::vector<Dof>& dof, bool full) const{
std::vector<Dof>& dof) const{
// Const_Cast //
MElement& element = const_cast<MElement&>(elem);
......@@ -245,44 +246,21 @@ void FunctionSpace::getUnorderedKeys(const MElement& elem,
it++;
}
// Reject Keys or mark them rejected //
if(full)
markMyKeys(dof);
else
rejectKeys(dof);
// Mark rejected keys //
markKeys(dof);
}
void FunctionSpace::rejectKeys(vector<Dof>& dof) const{
// Temp list
list<Dof> tmp(dof.begin(), dof.end());
// Look in rejection map
list<Dof>::iterator end = tmp.end();
list<Dof>::iterator it = tmp.begin();
while(it != end)
if(rejected.count(*it) == 1)
it = tmp.erase(it);
else
it++;
void FunctionSpace::markKeys(vector<Dof>& dof) const{
if(rejected.size() != 0){
const size_t nDof = dof.size();
// Rebuild dof vector (if needed)
if(tmp.size() != dof.size()){
dof.clear();
dof.assign(tmp.begin(), tmp.end());
for(size_t i = 0; i < nDof; i++)
if(rejected.count(dof[i]) == 1)
dof[i] = Dof::RejectedDof();
}
}
void FunctionSpace::markMyKeys(vector<Dof>& dof) const{
const size_t nDof = dof.size();
for(size_t i = 0; i < nDof; i++)
if(rejected.count(dof[i]) == 1)
dof[i] = rejectedDof;
}
void FunctionSpace::getKeys(const MElement& elem, std::vector<Dof>& dof,
bool full) const{
void FunctionSpace::getKeys(const MElement& elem, std::vector<Dof>& dof) const{
// Const_Cast //
MElement& element = const_cast<MElement&>(elem);
......@@ -306,7 +284,7 @@ void FunctionSpace::getKeys(const MElement& elem, std::vector<Dof>& dof,
MElement* permElement = factory.create(lowOrderTag, vertex, element.getNum());
// Get Dofs from permuted Element //
getUnorderedKeys(*permElement, dof, full);
getUnorderedKeys(*permElement, dof);
// Free and Return //
delete permElement;
......@@ -325,7 +303,8 @@ void FunctionSpace::getKeys(const GroupOfElement& goe,
nDof = allDofs[i].size();
for(size_t j = 0; j < nDof; j++)
dof.insert(allDofs[i][j]);
if(allDofs[i][j] != Dof::RejectedDof())
dof.insert(allDofs[i][j]);
}
}
......@@ -341,28 +320,3 @@ FunctionSpace::getKeys(const GroupOfElement& goe) const{
// Return vector //
return it->second;
}
void FunctionSpace::delKeys(const GroupOfElement& goe,
std::set<Dof>& dof) const{
// Get Dofs //
const vector<vector<Dof> >& allDofs = getKeys(goe);
// Remove them from map //
const size_t size = allDofs.size();
set<Dof>::iterator end;
set<Dof>::iterator it;
size_t nDof;
for(size_t i = 0; i < size; i++){
nDof = allDofs[i].size();
for(size_t j = 0; j < nDof; j++){
end = dof.end();
it = dof.find(allDofs[i][j]);
if(it != end)
dof.erase(it);
}
}
}
......@@ -31,9 +31,6 @@ class GroupOfElement;
class FunctionSpace{
protected:
// A Dof suposed to be rejected
static const Dof rejectedDof;
// Number of possible geomtrical topologies & Dof Type offset //
static const size_t nGeoType;
static size_t nxtOffset;
......@@ -78,8 +75,6 @@ class FunctionSpace{
void getKeys(const GroupOfElement& goe, std::set<Dof>& dof) const;
const std::vector<std::vector<Dof> >& getKeys(const GroupOfElement& goe)const;
void delKeys(const GroupOfElement& goe, std::set<Dof>& dof) const;
protected:
FunctionSpace(void);
void build(const std::vector<const GroupOfElement*>& goe,
......@@ -92,11 +87,8 @@ class FunctionSpace{
size_t findMaxType(void);
void getUnorderedKeys(const MElement& element, std::vector<Dof>& dof,
bool full) const;
void rejectKeys(std::vector<Dof>& dof) const;
void markMyKeys(std::vector<Dof>& dof) const;
void getKeys(const MElement& element, std::vector<Dof>& dof, bool full) const;
void getUnorderedKeys(const MElement& element, std::vector<Dof>& dof) const;
void markKeys(std::vector<Dof>& dof) const;
};
......@@ -154,14 +146,6 @@ class FunctionSpace{
@param goe A GroupOfElement
@return Returns a vector of vector of Dof such that:
dof[i][j] is the jth Dof of the ith element of the given GroupOfElement
**
@fn void FunctionSpace::delKeys(const GroupOfElement&, std::set<Dof>&) const
@param goe A GroupOfElement
@param dof A set of Dof%s
Removes from the given set the Dof%s associated to the MElement%s
of the given GroupOfElement
*/
//////////////////////
......@@ -192,9 +176,4 @@ inline const Basis& FunctionSpace::getBasis(size_t eType) const{
return *basis[eType];
}
inline
void FunctionSpace::getKeys(const MElement& elem, std::vector<Dof>& dof) const{
getKeys(elem, dof, false);
}
#endif
......@@ -65,18 +65,16 @@ double FunctionSpaceScalar::interpolateInABC(const MElement& element,
basis.getFunctions(fun, element, abc[0], abc[1], abc[2]);
// Get All Dofs (even those that are supposed to be rejected)
// Get All Dofs
vector<Dof> myDof;
getKeys(element, myDof, true);
getKeys(element, myDof);
// Interpolate (in Reference Place) //
double val = 0;
for(size_t i = 0, j = 0; i < nFun; i++){
if(myDof[i] != rejectedDof){
val += fun(i, 0) * coef[j];
j++;
}
for(size_t i = 0; i < nFun; i++){
if(myDof[i] != Dof::RejectedDof())
val += fun(i, 0) * coef[i];
}
// Return Interpolated Value //
......@@ -99,9 +97,9 @@ interpolateDerivativeInABC(const MElement& element,
basis.getDerivative(fun, element, abc[0], abc[1], abc[2]);
// Get All Dofs (even those that are supposed to be rejected)
// Get All Dofs
vector<Dof> myDof;
getKeys(element, myDof, true);
getKeys(element, myDof);
// Interpolate (in Reference Place) //
fullMatrix<double> val(1, 3);
......@@ -109,13 +107,11 @@ interpolateDerivativeInABC(const MElement& element,
val(0, 1) = 0;
val(0, 2) = 0;
for(size_t i = 0, j = 0; i < nFun; i++){
if(myDof[i] != rejectedDof){
val(0, 0) += fun(i, 0) * coef[j];
val(0, 1) += fun(i, 1) * coef[j];
val(0, 2) += fun(i, 2) * coef[j];
j++;
for(size_t i = 0; i < nFun; i++){
if(myDof[i] != Dof::RejectedDof()){
val(0, 0) += fun(i, 0) * coef[i];
val(0, 1) += fun(i, 1) * coef[i];
val(0, 2) += fun(i, 2) * coef[i];
}
}
......
......@@ -68,9 +68,9 @@ interpolateInABC(const MElement& element,
basis.getFunctions(fun, element, abc[0], abc[1], abc[2]);
// Get All Dofs (even those that are supposed to be rejected)
// Get All Dofs
vector<Dof> myDof;
getKeys(element, myDof, true);
getKeys(element, myDof);
// Interpolate (in Reference Place) //
fullMatrix<double> val(1, 3);
......@@ -78,13 +78,11 @@ interpolateInABC(const MElement& element,
val(0, 1) = 0;
val(0, 2) = 0;
for(size_t i = 0, j = 0; i < nFun; i++){
if(myDof[i] != rejectedDof){
val(0, 0) += fun(i, 0) * coef[j];
val(0, 1) += fun(i, 1) * coef[j];
val(0, 2) += fun(i, 2) * coef[j];
j++;
for(size_t i = 0; i < nFun; i++){
if(myDof[i] != Dof::RejectedDof()){
val(0, 0) += fun(i, 0) * coef[i];
val(0, 1) += fun(i, 1) * coef[i];
val(0, 2) += fun(i, 2) * coef[i];
}
}
......@@ -110,9 +108,9 @@ interpolateDerivativeInABC(const MElement& element,
basis.getDerivative(fun, element, abc[0], abc[1], abc[2]);
// Get All Dofs (even those that are supposed to be rejected)
// Get All Dofs
vector<Dof> myDof;
getKeys(element, myDof, true);
getKeys(element, myDof);
// Interpolate (in Reference Place) //
fullMatrix<double> val(1, 3);
......@@ -120,13 +118,11 @@ interpolateDerivativeInABC(const MElement& element,
val(0, 1) = 0;
val(0, 2) = 0;
for(size_t i = 0, j = 0; i < nFun; i++){
if(myDof[i] != rejectedDof){
val(0, 0) += fun(i, 0) * coef[j];
val(0, 1) += fun(i, 1) * coef[j];
val(0, 2) += fun(i, 2) * coef[j];
j++;
for(size_t i = 0; i < nFun; i++){
if(myDof[i] != Dof::RejectedDof()){
val(0, 0) += fun(i, 0) * coef[i];
val(0, 1) += fun(i, 1) * coef[i];
val(0, 2) += fun(i, 2) * coef[i];
}
}
......
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