@@ -27,10 +27,32 @@ SOFTWARE.*/
2727#include " stdafx.h"
2828#include " FEMathData.h"
2929#include " FEPostModel.h"
30- #include < FECore/MathObject.h>
31-
3230using 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+
3456FEMathData::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
4062void 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
59104FEMathVec3Data::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
65110void 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
92166FEMathMat3Data::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
98172void 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}
0 commit comments