45 std::string ForcingBody::classNameBody =
48 std::string ForcingBody::classNameField =
53 const std::weak_ptr<EquationSystem> &pEquation)
54 :
Forcing(pSession, pEquation), m_hasTimeFcnScaling(false)
60 const unsigned int &pNumForcingFields,
const TiXmlElement *pForce)
64 const TiXmlElement *funcNameElmt = pForce->FirstChildElement(
"BODYFORCE");
67 funcNameElmt = pForce->FirstChildElement(
"FIELDFORCE");
70 "Requires BODYFORCE or FIELDFORCE tag "
71 "specifying function name which prescribes body force.");
78 bool singleMode, halfMode;
79 m_session->MatchSolverInfo(
"ModeType",
"SingleMode", singleMode,
false);
80 m_session->MatchSolverInfo(
"ModeType",
"HalfMode", halfMode,
false);
83 m_transform = (singleMode || halfMode || homogeneous);
86 funcNameElmt = pForce->FirstChildElement(
"BODYFORCETIMEFCN");
89 funcNameElmt = pForce->FirstChildElement(
"FIELDFORCETIMEFCN");
95 std::string funcNameTime = funcNameElmt->GetText();
98 "Expression must be given in BODYFORCETIMEFCN or "
99 "FIELDFORCETIMEFCN.");
101 m_session->SubstituteExpressions(funcNameTime);
103 m_session->GetInterpreter(), funcNameTime);
117 tmp[i] = pFields[i]->GetPhys();
120 Update(pFields, tmp, 0.0);
134 if (!boost::iequals(eqn->GetVlist(),
"x y z t"))
137 int nq = pFields[0]->GetNpoints();
139 std::string varstr =
"x y z";
140 std::vector<Array<OneD, const NekDouble>> fielddata = {xc, yc,
145 varstr +=
" " +
m_session->GetVariable(j);
146 fielddata.push_back(inarray[j]);
155 std::string s_FieldStr =
m_session->GetVariable(i);
157 "Variable '" + s_FieldStr +
"' not defined.");
159 ->Evaluate(s_FieldStr,
m_Forcing[i], time);
188 outarray[i], 1, outarray[i], 1);
193 Update(fields, inarray, time);
221 Vmath::Svtvp(ncoeff, TimeFcn[0], tmp, 1, outarray[i], 1,
227 Update(fields, inarray, time);
233 Vmath::Vadd(ncoeff, outarray[i], 1, tmp, 1, outarray[i], 1);
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
virtual SOLVER_UTILS_EXPORT void v_Apply(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time)
LibUtilities::EquationSharedPtr m_timeFcnEqn
void Update(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const Array< OneD, Array< OneD, NekDouble >> &inarray, const NekDouble &time)
virtual SOLVER_UTILS_EXPORT void v_InitObject(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const unsigned int &pNumForcingFields, const TiXmlElement *pForce)
virtual SOLVER_UTILS_EXPORT void v_ApplyCoeff(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble &time)
Defines a forcing term to be explicitly applied.
int m_NumVariable
Number of variables.
Array< OneD, Array< OneD, NekDouble > > m_Forcing
Evaluated forcing function.
SOLVER_UTILS_EXPORT void EvaluateTimeFunction(LibUtilities::SessionReaderSharedPtr pSession, std::string pFieldName, Array< OneD, NekDouble > &pArray, const std::string &pFunctionName, NekDouble pTime=NekDouble(0))
SOLVER_UTILS_EXPORT SessionFunctionSharedPtr GetFunction(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const LibUtilities::SessionReaderSharedPtr &pSession, std::string pName, bool pCache=false)
Get a SessionFunction by name.
LibUtilities::SessionReaderSharedPtr m_session
Session reader.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Equation > EquationSharedPtr
@ eFunctionTypeExpression
ForcingFactory & GetForcingFactory()
Declaration of the forcing factory singleton.
The above copyright notice and this permission notice shall be included.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.