Skip to content

Commit b344d2f

Browse files
committed
Added IntegrateElements and IntegrateFaces to python post module.
1 parent 941a4de commit b344d2f

9 files changed

Lines changed: 125 additions & 15 deletions

File tree

MeshLib/FSMesh.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2858,6 +2858,11 @@ void FSMesh::UpdateMeshPartitions()
28582858
}
28592859
}
28602860

2861+
FSElemSet* FSMesh::FindFEElemSet(const std::string& szname)
2862+
{
2863+
return m_pFEElemSet.FindByName(szname);
2864+
}
2865+
28612866
FSSurface* FSMesh::FindFESurface(const string& name)
28622867
{
28632868
return m_pFESurface.FindByName(name);

MeshLib/FSMesh.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ class FSMesh : public FSCoreMesh
277277
FSGroup* FindFEGroup(int nid);
278278
//! Find FE part set by name
279279
FSPartSet* FindFEPartSet(const std::string& name);
280+
//! Find FE element set by name
281+
FSElemSet* FindFEElemSet(const std::string& szname);
280282
//! Find FE surface by name
281283
FSSurface* FindFESurface(const std::string& szname);
282284
//! Find FE edge set by name

PostGL/GLDisplacementMap.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -195,21 +195,7 @@ void CGLDisplacementMap::UpdateState(int ntime, bool breset)
195195
{
196196
m_ntag[ntime] = nfield;
197197

198-
FEState& s = *pfem->GetState(ntime);
199-
200-
// get the reference state
201-
Post::FERefState& ref = *s.m_ref;
202-
203-
// set the current nodal positions
204-
for (int i = 0; i < pm->Nodes(); ++i)
205-
{
206-
FSNode& node = pm->Node(i);
207-
vec3f dr = pfem->EvaluateNodeVector(i, ntime, nfield);
208-
209-
// the actual nodal position is stored in the state
210-
// this is the field that will be used for strain calculations
211-
s.m_NODE[i].m_rt = ref.m_Node[i].m_rt + dr;
212-
}
198+
pfem->EvaluateNodalPosition(nfield, ntime);
213199
}
214200
}
215201

PostLib/FEDataManager.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ int FEDataManager::FindDataField(const std::string& fieldName)
9191
return -1;
9292
}
9393

94+
int FEDataManager::GetFieldCode(const std::string& fieldName)
95+
{
96+
int n = FindDataField(fieldName);
97+
if (n >= 0)
98+
{
99+
auto p = DataField(n);
100+
return (*p)->GetFieldID();
101+
}
102+
return -1;
103+
}
104+
94105
FEDataFieldPtr FEDataManager::DataField(int i)
95106
{
96107
if ((i < 0) || (i >= m_Data.size())) return m_Data.end();

PostLib/FEDataManager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class FEDataManager
5858
//! find the index of a datafield
5959
int FindDataField(const std::string& fieldName);
6060

61+
//! Get the field code of a datafield
62+
int GetFieldCode(const std::string& fieldName);
63+
6164
//! find the data field given an index
6265
FEDataFieldPtr DataField(int i);
6366

PostLib/FEPostModel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,9 @@ class FEPostModel
249249
//! Evaluate a field at a given time
250250
bool Evaluate(int nfield, int ntime, bool breset = false);
251251

252+
//! Update the nodal positions based on the displacement field
253+
bool EvaluateNodalPosition(int nfield, int ntime);
254+
252255
//! Get the nodal coordinates of an element at time (returns nr of nodes of element)
253256
int GetElementCoords(int iel, int ntime, vec3f* r);
254257

PostLib/evaluate.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,30 @@ bool FEPostModel::IsValidFieldCode(int nfield, int nstate)
201201
return true;
202202
}
203203

204+
bool FEPostModel::EvaluateNodalPosition(int nfield, int ntime)
205+
{
206+
FEState* s = GetState(ntime);
207+
if (s == nullptr) return false;
208+
209+
FSMeshBase* pm = s->GetFEMesh();
210+
211+
// get the reference state
212+
Post::FERefState& ref = *s->m_ref;
213+
214+
// set the current nodal positions
215+
for (int i = 0; i < pm->Nodes(); ++i)
216+
{
217+
FSNode& node = pm->Node(i);
218+
vec3f dr = EvaluateNodeVector(i, ntime, nfield);
219+
220+
// the actual nodal position is stored in the state
221+
// this is the field that will be used for strain calculations
222+
s->m_NODE[i].m_rt = ref.m_Node[i].m_rt + dr;
223+
}
224+
225+
return true;
226+
}
227+
204228
//-----------------------------------------------------------------------------
205229
// Evaluate a data field at a particular time
206230
bool FEPostModel::Evaluate(int nfield, int ntime, bool breset)
@@ -260,9 +284,11 @@ void FEPostModel::EvalNodeField(int ntime, int nfield)
260284
FACEDATA& d = state.m_FACE[i];
261285
d.m_val = 0.f;
262286
d.m_ntag = 0;
287+
f.Deactivate();
263288
if (f.IsEnabled())
264289
{
265290
d.m_ntag = 1;
291+
f.Activate();
266292
for (int j = 0; j < f.Nodes(); ++j) { float val = state.m_NODE[f.n[j]].m_val; faceData.value(i, j) = val; d.m_val += val; }
267293
d.m_val /= (float)f.Nodes();
268294
}

PyLib/PyFBSMesh.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ void init_FSMesh(py::module_& m)
8787

8888
.def("Surfaces", &FSMesh::FESurfaces, DOC(FSMesh, FESurfaces))
8989
.def("Surface", &FSMesh::GetFESurface, py::return_value_policy::reference, DOC(FSMesh, GetFESurface))
90+
.def("FindSurface", &FSMesh::FindFESurface, py::return_value_policy::reference)
91+
9092
.def("NodeIndexFromID", &FSMesh::NodeIndexFromID, DOC(FSMesh, NodeIndexFromID))
9193

9294
.def("MeshDataFields", &FSMesh::MeshDataFields, DOC(FSMesh, MeshDataFields))
@@ -97,6 +99,7 @@ void init_FSMesh(py::module_& m)
9799

98100
.def("ElemSets", &FSMesh::FEElemSets, DOC(FSMesh, FEElemSets))
99101
.def("ElemSet", &FSMesh::GetFEElemSet, py::return_value_policy::reference, DOC(FSMesh, GetFEElemSet))
102+
.def("FindElemSet", &FSMesh::FindFEElemSet, py::return_value_policy::reference)
100103

101104
.def("NodeSets", &FSMesh::FENodeSets, DOC(FSMesh, FENodeSets))
102105
.def("NodeSet", &FSMesh::GetFENodeSet, py::return_value_policy::reference, DOC(FSMesh, GetFENodeSet))

PyLib/PyFBSPost.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,74 @@ FEPostModel* GetActivePostModel()
7878
}
7979
#endif
8080

81+
double PostIntegrateElements(FEPostModel& model, FSElemSet& set, ModelDataField& field, int component, int state)
82+
{
83+
FEState* ps = model.GetState(state);
84+
if (ps == nullptr)
85+
{
86+
throw pyGenericExcept("Invalid state index.");
87+
}
88+
89+
FSMesh* mesh = set.GetMesh();
90+
if (mesh == nullptr) return 0.0;
91+
std::vector<int> elemList = set.CopyItems();
92+
93+
// update the model's state
94+
Post::FEDataManager* DM = model.GetDataManager();
95+
if (DM)
96+
{
97+
int dispField = DM->GetFieldCode("displacement");
98+
if (dispField >= 0)
99+
{
100+
if (!model.EvaluateNodalPosition(dispField, state))
101+
{
102+
return 0.0;
103+
}
104+
}
105+
}
106+
107+
if (!model.Evaluate(field.GetFieldID() | component, state))
108+
{
109+
return 0.0;
110+
}
111+
112+
return Post::IntegrateElems(*mesh, elemList, ps);
113+
}
114+
115+
double PostIntegrateFaces(FEPostModel& model, FSSurface& surf, ModelDataField& field, int component, int state)
116+
{
117+
FEState* ps = model.GetState(state);
118+
if (ps == nullptr)
119+
{
120+
throw pyGenericExcept("Invalid state index.");
121+
}
122+
123+
FSMesh* mesh = surf.GetMesh();
124+
if (mesh == nullptr) return 0.0;
125+
std::vector<int> elemList = surf.CopyItems();
126+
127+
// update the model's state
128+
Post::FEDataManager* DM = model.GetDataManager();
129+
if (DM)
130+
{
131+
int dispField = DM->GetFieldCode("displacement");
132+
if (dispField >= 0)
133+
{
134+
if (!model.EvaluateNodalPosition(dispField, state))
135+
{
136+
return 0.0;
137+
}
138+
}
139+
}
140+
141+
if (!model.Evaluate(field.GetFieldID() | component, state, true))
142+
{
143+
return 0.0;
144+
}
145+
146+
return Post::IntegrateFaces(*mesh, elemList, ps);
147+
}
148+
81149
void init_FBSPost(py::module& m)
82150
{
83151
py::module post = m.def_submodule("post", "Module used to interact with plot files");
@@ -87,6 +155,9 @@ void init_FBSPost(py::module& m)
87155
post.def("GetActiveModel", &GetActivePostModel, "Returns the active FEPostModel instance.", py::return_value_policy::reference);
88156
#endif
89157

158+
post.def("IntegrateElements", &PostIntegrateElements, "Integrates a data field over an element set.");
159+
post.def("IntegrateFaces" , &PostIntegrateFaces , "Integrates a data field over a surface.");
160+
90161
InitStandardDataFields();
91162
post.def("AddStandardDataField", pybind11::overload_cast<FEPostModel&, const std::string&>(&AddStandardDataField),
92163
"Adds a standard data field to the model.", py::arg("model"), py::arg("dataField"));

0 commit comments

Comments
 (0)