Skip to content
Snippets Groups Projects
Commit 52060957 authored by Éric Béchet's avatar Éric Béchet
Browse files

added gradient in parametric space.

parent 75c62333
No related branches found
No related tags found
No related merge requests found
...@@ -53,7 +53,8 @@ class FunctionSpace : public FunctionSpaceBase ...@@ -53,7 +53,8 @@ class FunctionSpace : public FunctionSpaceBase
typedef typename TensorialTraits<T>::ValType ValType; typedef typename TensorialTraits<T>::ValType ValType;
typedef typename TensorialTraits<T>::GradType GradType; typedef typename TensorialTraits<T>::GradType GradType;
virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)=0; virtual void f(MElement *ele, double u, double v, double w, std::vector<ValType> &vals)=0;
virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)=0; virtual void gradf(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) =0;
virtual void gradfuvw(MElement *ele, double u, double v, double w,std::vector<GradType> &grads) {}; // should return to pure virtual once all is done.
virtual int getNumKeys(MElement *ele)=0; // if one needs the number of dofs virtual int getNumKeys(MElement *ele)=0; // if one needs the number of dofs
virtual void getKeys(MElement *ele, std::vector<Dof> &keys)=0; virtual void getKeys(MElement *ele, std::vector<Dof> &keys)=0;
}; };
...@@ -102,6 +103,20 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double> ...@@ -102,6 +103,20 @@ class ScalarLagrangeFunctionSpace : public FunctionSpace<double>
)); ));
} }
virtual void gradfuvw(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)
{
int ndofs= ele->getNumVertices();
grads.reserve(grads.size()+ndofs);
double gradsuvw[256][3];
ele->getGradShapeFunctions(u, v, w, gradsuvw);
for (int i=0;i<ndofs;++i)
grads.push_back(GradType(
gradsuvw[i][0] ,
gradsuvw[i][1] ,
gradsuvw[i][2]
));
}
virtual int getNumKeys(MElement *ele) {return ele->getNumVertices();} virtual int getNumKeys(MElement *ele) {return ele->getNumVertices();}
virtual void getKeys(MElement *ele, std::vector<Dof> &keys) // appends ... virtual void getKeys(MElement *ele, std::vector<Dof> &keys) // appends ...
...@@ -177,6 +192,26 @@ public : ...@@ -177,6 +192,26 @@ public :
} }
} }
virtual void gradfuvw(MElement *ele, double u, double v, double w,std::vector<GradType> &grads)
{
std::vector<SVector3> gradsd;
ScalarFS->gradfuvw(ele,u,v,w,gradsd);
int nbdofs=gradsd.size();
int nbcomp=comp.size();
int curpos=grads.size();
grads.reserve(curpos+nbcomp*nbdofs);
GradType val;
for (int j=0;j<nbcomp;++j)
{
for (int i=0;i<nbdofs;++i)
{
tensprod(multipliers[j],gradsd[i],val);
grads.push_back(val);
}
}
}
virtual int getNumKeys(MElement *ele) {return ScalarFS->getNumKeys(ele)*comp.size();} virtual int getNumKeys(MElement *ele) {return ScalarFS->getNumKeys(ele)*comp.size();}
virtual void getKeys(MElement *ele, std::vector<Dof> &keys) virtual void getKeys(MElement *ele, std::vector<Dof> &keys)
......
...@@ -21,7 +21,7 @@ void groupOfElements::addPhysical(int dim, int physical, ...@@ -21,7 +21,7 @@ void groupOfElements::addPhysical(int dim, int physical,
const elementFilter &filter){ const elementFilter &filter){
std::map<int, std::vector<GEntity*> > groups[4]; std::map<int, std::vector<GEntity*> > groups[4];
GModel::current()->getPhysicalGroups(groups); GModel::current()->getPhysicalGroups(groups);
std::vector<GEntity*> ent = groups[dim][physical]; std::vector<GEntity*> &ent = groups[dim][physical];
for (unsigned int i = 0; i < ent.size(); i++){ for (unsigned int i = 0; i < ent.size(); i++){
addElementary(ent[i], filter); addElementary(ent[i], filter);
} }
......
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