77
88#include " spr.h"
99#include " apfMesh.h"
10+ #include " apfShape.h"
1011#include < pcu_util.h>
1112
1213namespace spr {
@@ -16,8 +17,16 @@ apf::Field* getGradIPField(apf::Field* f, const char* name, int order)
1617 PCU_ALWAYS_ASSERT (f);
1718 apf::Mesh* m = getMesh (f);
1819 int vt = apf::getValueType (f);
19- PCU_ALWAYS_ASSERT (vt == apf::SCALAR || vt == apf::VECTOR);
20- apf::Field* ip_field = apf::createIPField (m,name,vt+1 ,order);
20+ PCU_ALWAYS_ASSERT (vt == apf::SCALAR || vt == apf::VECTOR || vt == apf::MATRIX);
21+ apf::Field* ip_field = NULL ;
22+ if (vt == apf::MATRIX)
23+ {
24+ ip_field = apf::createPackedField (m, name, 27 , apf::getIPShape (m->getDimension (), order));
25+ }
26+ else
27+ {
28+ ip_field = apf::createIPField (m,name,vt+1 ,order);
29+ }
2130 apf::MeshIterator* it = m->begin (m->getDimension ());
2231 apf::MeshEntity* e;
2332 while ((e = m->iterate(it)))
@@ -35,12 +44,18 @@ apf::Field* getGradIPField(apf::Field* f, const char* name, int order)
3544 apf::getGrad (fe,xi,value);
3645 apf::setVector (ip_field,e,p,value);
3746 }
38- else
47+ else if (vt == apf::VECTOR)
3948 {
4049 apf::Matrix3x3 value;
4150 apf::getVectorGrad (fe,xi,value);
4251 apf::setMatrix (ip_field,e,p,value);
4352 }
53+ else if (vt == apf::MATRIX)
54+ {
55+ apf::Vector<27 > value;
56+ apf::getMatrixGrad (fe, xi, value);
57+ apf::setComponents (ip_field, e, p, &value[0 ]);
58+ }
4459 }
4560 apf::destroyElement (fe);
4661 apf::destroyMeshElement (me);
0 commit comments