Skip to content

Commit 5fe4007

Browse files
committed
Did some minor refactoring of the math datafields in order to make them work a bit faster.
1 parent ef553de commit 5fe4007

File tree

2 files changed

+137
-61
lines changed

2 files changed

+137
-61
lines changed

PostLib/FEMathData.cpp

Lines changed: 103 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,32 @@ SOFTWARE.*/
2727
#include "stdafx.h"
2828
#include "FEMathData.h"
2929
#include "FEPostModel.h"
30-
#include <FECore/MathObject.h>
31-
3230
using namespace Post;
3331

32+
FEMathDataField::FEMathDataField(Post::FEPostModel* fem, unsigned int flag) : ModelDataField(fem, DATA_SCALAR, DATA_NODE, NODE_DATA, flag)
33+
{
34+
m_eq = "";
35+
m_math.AddVariable("x", 0.0);
36+
m_math.AddVariable("y", 0.0);
37+
m_math.AddVariable("z", 0.0);
38+
m_math.AddVariable("t", 0.0);
39+
BuildMath();
40+
}
41+
42+
void FEMathDataField::BuildMath()
43+
{
44+
m_math.Create(m_eq);
45+
}
46+
47+
double FEMathDataField::value(double x, double y, double z, double t)
48+
{
49+
if (!m_math.IsValid()) return 0.0;
50+
51+
std::vector<double> vars = { x, y, z, t };
52+
double v = m_math.value_s(vars);
53+
return v;
54+
}
55+
3456
FEMathData::FEMathData(FEState* state, FEMathDataField* pdf) : FENodeData_T<float>(state, pdf)
3557
{
3658
m_pdf = pdf;
@@ -39,21 +61,44 @@ FEMathData::FEMathData(FEState* state, FEMathDataField* pdf) : FENodeData_T<floa
3961
// evaluate all the nodal data for this state
4062
void FEMathData::eval(int n, float* pv)
4163
{
42-
double time = m_state->m_time;
43-
MSimpleExpression math;
44-
math.AddVariable("t", time);
64+
if ((m_pdf == nullptr) || (pv == nullptr)) return;
4565

66+
double time = m_state->m_time;
4667
FEPostModel& fem = *GetFSModel();
4768
vec3f r = fem.NodePosition(n, m_state->GetID());
48-
math.AddVariable("x", (double)r.x);
49-
math.AddVariable("y", (double)r.y);
50-
math.AddVariable("z", (double)r.z);
69+
double v = m_pdf->value(r.x, r.y, r.z, time);
70+
*pv = (float)v;
71+
}
5172

52-
const std::string& eq = m_pdf->EquationString();
53-
math.Create(eq);
73+
FEMathVec3DataField::FEMathVec3DataField(Post::FEPostModel* fem, unsigned int flag) : ModelDataField(fem, DATA_VEC3, DATA_NODE, NODE_DATA, flag)
74+
{
75+
for (int i = 0; i < 3; ++i)
76+
{
77+
m_eq[i] = "";
78+
m_math[i].AddVariable("x");
79+
m_math[i].AddVariable("y");
80+
m_math[i].AddVariable("z");
81+
m_math[i].AddVariable("t");
82+
}
83+
BuildMath();
84+
}
5485

55-
double v = math.value();
56-
if (pv) *pv = (float) v;
86+
void FEMathVec3DataField::BuildMath()
87+
{
88+
for (int i = 0; i < 3; ++i)
89+
{
90+
m_math[i].Create(m_eq[i]);
91+
}
92+
}
93+
94+
vec3d FEMathVec3DataField::value(double x, double y, double z, double t)
95+
{
96+
vec3d v;
97+
std::vector<double> vars = { x, y, z, t };
98+
if (m_math[0].IsValid()) v.x = m_math[0].value_s(vars);
99+
if (m_math[1].IsValid()) v.y = m_math[1].value_s(vars);
100+
if (m_math[2].IsValid()) v.z = m_math[2].value_s(vars);
101+
return v;
57102
}
58103

59104
FEMathVec3Data::FEMathVec3Data(FEState* state, FEMathVec3DataField* pdf) : FENodeData_T<vec3f>(state, pdf)
@@ -64,29 +109,58 @@ FEMathVec3Data::FEMathVec3Data(FEState* state, FEMathVec3DataField* pdf) : FENod
64109
// evaluate all the nodal data for this state
65110
void FEMathVec3Data::eval(int n, vec3f* pv)
66111
{
112+
if (pv == nullptr) return;
113+
67114
FEState& state = *m_state;
68115
int ntime = state.GetID();
69116
double time = (double)state.m_time;
70117

71-
MSimpleExpression math;
72-
math.AddVariable("t", time);
73-
74118
FEPostModel& fem = *GetFSModel();
75119
vec3f r = fem.NodePosition(n, ntime);
76-
math.AddVariable("x", (double)r.x);
77-
math.AddVariable("y", (double)r.y);
78-
math.AddVariable("z", (double)r.z);
120+
vec3d v = m_pdf->value(r.x, r.y, r.z, time);
121+
122+
vec3f vf;
123+
vf.x = (float)(v.x);
124+
vf.y = (float)(v.y);
125+
vf.z = (float)(v.z);
126+
*pv = vf;
127+
}
79128

80-
const std::string& x = m_pdf->EquationString(0);
81-
const std::string& y = m_pdf->EquationString(1);
82-
const std::string& z = m_pdf->EquationString(2);
129+
FEMathMat3DataField::FEMathMat3DataField(Post::FEPostModel* fem, unsigned int flag) : ModelDataField(fem, DATA_MAT3, DATA_NODE, NODE_DATA, flag)
130+
{
131+
for (int i = 0; i < 9; ++i)
132+
{
133+
m_eq[i] = "";
134+
m_math[i].AddVariable("x");
135+
m_math[i].AddVariable("y");
136+
m_math[i].AddVariable("z");
137+
m_math[i].AddVariable("t");
138+
}
139+
BuildMath();
140+
}
83141

84-
vec3f v;
85-
v.x = (float)math.value(x);
86-
v.y = (float)math.value(y);
87-
v.z = (float)math.value(z);
142+
void FEMathMat3DataField::BuildMath()
143+
{
144+
for (int i = 0; i < 9; ++i)
145+
{
146+
m_math[i].Create(m_eq[i]);
147+
}
148+
}
88149

89-
if (pv) *pv = v;
150+
mat3d FEMathMat3DataField::value(double x, double y, double z, double t)
151+
{
152+
mat3d m;
153+
std::vector<double> vars = { x, y, z, t };
154+
if (m_math[0].IsValid()) m[0][0] = m_math[0].value_s(vars);
155+
if (m_math[1].IsValid()) m[0][1] = m_math[1].value_s(vars);
156+
if (m_math[2].IsValid()) m[0][2] = m_math[2].value_s(vars);
157+
if (m_math[3].IsValid()) m[1][0] = m_math[3].value_s(vars);
158+
if (m_math[4].IsValid()) m[1][1] = m_math[4].value_s(vars);
159+
if (m_math[5].IsValid()) m[1][2] = m_math[5].value_s(vars);
160+
if (m_math[6].IsValid()) m[2][0] = m_math[6].value_s(vars);
161+
if (m_math[7].IsValid()) m[2][1] = m_math[7].value_s(vars);
162+
if (m_math[8].IsValid()) m[2][2] = m_math[8].value_s(vars);
163+
return m;
90164
}
91165

92166
FEMathMat3Data::FEMathMat3Data(FEState* state, FEMathMat3DataField* pdf) : FENodeData_T<mat3f>(state, pdf)
@@ -97,26 +171,15 @@ FEMathMat3Data::FEMathMat3Data(FEState* state, FEMathMat3DataField* pdf) : FENod
97171
// evaluate the nodal data for this state
98172
void FEMathMat3Data::eval(int n, mat3f* pv)
99173
{
100-
if (pv == nullptr) return;
174+
if ((m_pdf==nullptr)||(pv == nullptr)) return;
101175

102176
FEState& state = *m_state;
103177
int ntime = state.GetID();
104178
double time = (double)state.m_time;
105-
MSimpleExpression math;
106-
math.AddVariable("t", time);
107179

108180
FEPostModel& fem = *GetFSModel();
109181
vec3f r = fem.NodePosition(n, ntime);
110-
math.AddVariable("x", (double)r.x);
111-
math.AddVariable("y", (double)r.y);
112-
math.AddVariable("z", (double)r.z);
113-
114-
float m[9] = { 0.f };
115-
for (int i = 0; i < 9; ++i)
116-
{
117-
const std::string& eq = m_pdf->EquationString(i);
118-
m[i] = (float) math.value(eq);
119-
}
120182

121-
*pv = mat3f(m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8]);
183+
mat3d m = m_pdf->value(r.x, r.y, r.z, time);
184+
*pv = mat3f(m[0][0], m[0][1], m[0][2], m[1][3], m[1][4], m[1][5], m[2][6], m[2][7], m[2][8]);
122185
}

PostLib/FEMathData.h

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ SOFTWARE.*/
2626

2727
#pragma once
2828
#include "FEMeshData_T.h"
29+
#include <FECore/MathObject.h>
2930

3031
namespace Post {
3132

@@ -72,16 +73,13 @@ class FEMathMat3Data : public FENodeData_T<mat3f>
7273
class FEMathDataField : public ModelDataField
7374
{
7475
public:
75-
FEMathDataField(Post::FEPostModel* fem, unsigned int flag = 0) : ModelDataField(fem, DATA_SCALAR, DATA_NODE, NODE_DATA, flag)
76-
{
77-
m_eq = "";
78-
}
76+
FEMathDataField(Post::FEPostModel* fem, unsigned int flag = 0);
7977

8078
//! Create a copy
8179
ModelDataField* Clone() const override
8280
{
8381
FEMathDataField* pd = new FEMathDataField(m_fem);
84-
pd->m_eq = m_eq;
82+
pd->SetEquationString(m_eq);
8583
return pd;
8684
}
8785

@@ -91,31 +89,30 @@ class FEMathDataField : public ModelDataField
9189
return new FEMathData(pstate, this);
9290
}
9391

94-
void SetEquationString(const std::string& eq) { m_eq = eq; }
92+
void SetEquationString(const std::string& eq) { m_eq = eq; BuildMath(); }
9593

9694
const std::string& EquationString() const { return m_eq; }
9795

96+
double value(double x, double y, double z, double t);
97+
98+
private:
99+
void BuildMath();
100+
98101
private:
99102
std::string m_eq; //!< equation string
103+
MSimpleExpression m_math;
100104
};
101105

102106
class FEMathVec3DataField : public ModelDataField
103107
{
104108
public:
105-
FEMathVec3DataField(Post::FEPostModel* fem, unsigned int flag = 0) : ModelDataField(fem, DATA_VEC3, DATA_NODE, NODE_DATA, flag)
106-
{
107-
m_eq[0] = "";
108-
m_eq[1] = "";
109-
m_eq[2] = "";
110-
}
109+
FEMathVec3DataField(Post::FEPostModel* fem, unsigned int flag = 0);
111110

112111
//! Create a copy
113112
ModelDataField* Clone() const override
114113
{
115114
FEMathVec3DataField* pd = new FEMathVec3DataField(m_fem);
116-
pd->m_eq[0] = m_eq[0];
117-
pd->m_eq[1] = m_eq[1];
118-
pd->m_eq[2] = m_eq[2];
115+
pd->SetEquationStrings(m_eq[0], m_eq[1], m_eq[2]);
119116
return pd;
120117
}
121118

@@ -130,28 +127,37 @@ class FEMathVec3DataField : public ModelDataField
130127
m_eq[0] = x;
131128
m_eq[1] = y;
132129
m_eq[2] = z;
130+
BuildMath();
133131
}
134132

135-
void SetEquationString(int n, const std::string& eq) { m_eq[n] = eq; }
133+
void SetEquationString(int n, const std::string& eq) { m_eq[n] = eq; BuildMath(); }
136134

137135
const std::string& EquationString(int n) const { return m_eq[n]; }
138136

137+
vec3d value(double x, double y, double z, double t);
138+
139+
private:
140+
void BuildMath();
141+
139142
private:
140143
std::string m_eq[3]; //!< equation string
144+
MSimpleExpression m_math[3];
141145
};
142146

143147
class FEMathMat3DataField : public ModelDataField
144148
{
145149
public:
146-
FEMathMat3DataField(Post::FEPostModel* fem, unsigned int flag = 0) : ModelDataField(fem, DATA_MAT3, DATA_NODE, NODE_DATA, flag)
147-
{
148-
}
150+
FEMathMat3DataField(Post::FEPostModel* fem, unsigned int flag = 0);
149151

150152
//! Create a copy
151153
ModelDataField* Clone() const override
152154
{
153155
FEMathMat3DataField* pd = new FEMathMat3DataField(m_fem);
154-
for (int i = 0; i < 9; ++i) pd->m_eq[i] = m_eq[i];
156+
pd->SetEquationStrings(
157+
m_eq[0], m_eq[1], m_eq[2],
158+
m_eq[3], m_eq[4], m_eq[5],
159+
m_eq[6], m_eq[7], m_eq[8]
160+
);
155161
return pd;
156162
}
157163

@@ -169,13 +175,20 @@ class FEMathMat3DataField : public ModelDataField
169175
m_eq[0] = m00; m_eq[1] = m01; m_eq[2] = m02;
170176
m_eq[3] = m10; m_eq[4] = m11; m_eq[5] = m12;
171177
m_eq[6] = m20; m_eq[7] = m21; m_eq[8] = m22;
178+
BuildMath();
172179
}
173180

174-
void SetEquationString(int n, const std::string& eq) { m_eq[n] = eq; }
181+
void SetEquationString(int n, const std::string& eq) { m_eq[n] = eq; BuildMath(); }
175182

176183
const std::string& EquationString(int n) const { return m_eq[n]; }
177184

185+
mat3d value(double x, double y, double z, double t);
186+
187+
private:
188+
void BuildMath();
189+
178190
private:
179191
std::string m_eq[9]; //!< equation string
192+
MSimpleExpression m_math[9];
180193
};
181194
}

0 commit comments

Comments
 (0)