diff --git a/Solver/SElement.cpp b/Solver/SElement.cpp new file mode 100644 index 0000000000000000000000000000000000000000..32a4505bbbb50bb0da7e288fd644ba2dc6c085c7 --- /dev/null +++ b/Solver/SElement.cpp @@ -0,0 +1,86 @@ +#include "SElement.h" + +simpleFunction<double> * SElement::_enrichement_s = 0,* SElement::_enrichement_t = 0; + +void SElement::gradNodalFunctions ( double u, double v, double w, double invjac[3][3],double Grads[][3], + simpleFunction<double> *_enrichement) +{ + double grads[256][3]; + _e->getGradShapeFunctions(u, v, w, grads); + + int nbNodes = getNumNodalShapeFunctions(); + for (int j = 0; j < nbNodes; j++){ + Grads[j][0] = invjac[0][0] * grads[j][0] + invjac[0][1] * grads[j][1] + + invjac[0][2] * grads[j][2]; + Grads[j][1] = invjac[1][0] * grads[j][0] + invjac[1][1] * grads[j][1] + + invjac[1][2] * grads[j][2]; + Grads[j][2] = invjac[2][0] * grads[j][0] + invjac[2][1] * grads[j][1] + + invjac[2][2] * grads[j][2]; + } + + if (_enrichement){ + const int N = getNumNodalShapeFunctions(); + SPoint3 p; + double sf[256]; + _e->getShapeFunctions(u, v, w, sf); + // FIXME : re-use sf for computing coordinates + _e->pnt(u,v,w,p); + double E = (*_enrichement_s)(p.x(),p.y(),p.z()); + double dEdx,dEdy,dEdz; + _enrichement_s->gradient(p.x(),p.y(),p.z(),dEdx,dEdy,dEdz); + for (int i=0;i<N;i++){ + Grads[i][0] = Grads[i][0] * E + dEdx * sf[i]; + Grads[i][1] = Grads[i][1] * E + dEdy * sf[i]; + Grads[i][2] = Grads[i][2] * E + dEdz * sf[i]; + } + } +} + +void SElement::nodalFunctions ( double u, double v, double w, double s[], + simpleFunction<double> *_enrichement) +{ + _e->getShapeFunctions(u, v, w, s); + if (_enrichement){ + const int N = getNumNodalShapeFunctions(); + SPoint3 p; + // FIXME : re-use s for computing coordinates + _e->pnt(u,v,w,p); + double E = (*_enrichement_s)(p.x(),p.y(),p.z()); + for (int i=0;i<N;i++){ + s[i] *= E; + } + } +} + + +void SElement::gradNodalShapeFunctions ( double u, double v, double w, double invjac[3][3], + double grads[][3]) +{ + gradNodalFunctions (u,v,w,invjac,grads,_enrichement_s); +} + +void SElement::gradNodalTestFunctions ( double u, double v, double w, double invjac[3][3], + double grads[][3]) +{ + gradNodalFunctions (u,v,w,invjac,grads,_enrichement_t); +} + +void SElement::nodalShapeFunctions ( double u, double v, double w, double s[]) +{ + nodalFunctions (u,v,w,s,_enrichement_s); +} + +void SElement::nodalTestFunctions ( double u, double v, double w, double s[]) +{ + nodalFunctions (u,v,w,s,_enrichement_t); +} + +int SElement::getNumNodalShapeFunctions ( ) const { + if (_e->getParent())return _e->getParent()->getNumVertices(); + return _e->getNumVertices(); +} + +int SElement::getNumNodalTestFunctions ( ) const { + if (_e->getParent())return _e->getParent()->getNumVertices(); + return _e->getNumVertices(); +}