vector<ForcingSharedPtr> Forcing::Load( const LibUtilities::SessionReaderSharedPtr& pSession, const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, const unsigned int& pNumForcingFields) { vector<ForcingSharedPtr> vForceList; if (!pSession->DefinesElement("Nektar/Forcing")) { return vForceList; } TiXmlElement* vForcing = pSession->GetElement("Nektar/Forcing"); if (vForcing) { unsigned int vNumForcingFields = pNumForcingFields; if (!pNumForcingFields) { vNumForcingFields = pFields.num_elements(); } TiXmlElement* vForce = vForcing->FirstChildElement("FORCE"); while (vForce) { string vType = vForce->Attribute("TYPE"); vForceList.push_back(GetForcingFactory().CreateInstance( vType, pSession, pFields, vNumForcingFields, vForce)); vForce = vForce->NextSiblingElement("FORCE"); } } return vForceList; }
namespace SolverUtils { std::string ForcingProgrammatic::className = GetForcingFactory(). RegisterCreatorFunction("Programmatic", ForcingProgrammatic::create, "Programmatic Forcing"); ForcingProgrammatic::ForcingProgrammatic( const LibUtilities::SessionReaderSharedPtr& pSession) : Forcing(pSession) { } Array<OneD, Array<OneD, NekDouble> >& ForcingProgrammatic::UpdateForces() { return m_Forcing; } void ForcingProgrammatic::v_InitObject( const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, const unsigned int& pNumForcingFields, const TiXmlElement* pForce) { m_NumVariable = pNumForcingFields; int nq = pFields[0]->GetTotPoints(); m_Forcing = Array<OneD, Array<OneD, NekDouble> > (m_NumVariable); for (int i = 0; i < m_NumVariable; ++i) { m_Forcing[i] = Array<OneD, NekDouble> (nq, 0.0); } } void ForcingProgrammatic::v_Apply( const Array<OneD, MultiRegions::ExpListSharedPtr> &fields, const Array<OneD, Array<OneD, NekDouble> > &inarray, Array<OneD, Array<OneD, NekDouble> > &outarray, const NekDouble &time) { for (int i = 0; i < m_NumVariable; i++) { Vmath::Vadd(outarray[i].num_elements(), outarray[i], 1, m_Forcing[i], 1, outarray[i], 1); } } }
namespace SolverUtils { std::string ForcingAbsorption::className = GetForcingFactory(). RegisterCreatorFunction("Absorption", ForcingAbsorption::create, "Forcing Absorption"); ForcingAbsorption::ForcingAbsorption(const LibUtilities::SessionReaderSharedPtr& pSession) : Forcing(pSession), m_hasRefFlow(false), m_hasRefFlowTime(false) { } void ForcingAbsorption::v_InitObject( const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, const unsigned int& pNumForcingFields, const TiXmlElement* pForce) { m_NumVariable = pNumForcingFields; int npts = pFields[0]->GetTotPoints(); const TiXmlElement* funcNameElmt; funcNameElmt = pForce->FirstChildElement("COEFF"); ASSERTL0(funcNameElmt, "Requires COEFF tag, specifying function " "name which prescribes absorption layer coefficient."); string funcName = funcNameElmt->GetText(); ASSERTL0(m_session->DefinesFunction(funcName), "Function '" + funcName + "' not defined."); std::string s_FieldStr; m_Absorption = Array<OneD, Array<OneD, NekDouble> > (m_NumVariable); m_Forcing = Array<OneD, Array<OneD, NekDouble> > (m_NumVariable); for (int i = 0; i < m_NumVariable; ++i) { s_FieldStr = m_session->GetVariable(i); ASSERTL0(m_session->DefinesFunction(funcName, s_FieldStr), "Variable '" + s_FieldStr + "' not defined."); m_Absorption[i] = Array<OneD, NekDouble> (npts, 0.0); m_Forcing[i] = Array<OneD, NekDouble> (npts, 0.0); EvaluateFunction(pFields, m_session, s_FieldStr, m_Absorption[i], funcName); } funcNameElmt = pForce->FirstChildElement("REFFLOW"); if (funcNameElmt) { string funcName = funcNameElmt->GetText(); ASSERTL0(m_session->DefinesFunction(funcName), "Function '" + funcName + "' not defined."); m_Refflow = Array<OneD, Array<OneD, NekDouble> > (m_NumVariable); for (int i = 0; i < m_NumVariable; ++i) { s_FieldStr = m_session->GetVariable(i); ASSERTL0(m_session->DefinesFunction(funcName, s_FieldStr), "Variable '" + s_FieldStr + "' not defined."); m_Refflow[i] = Array<OneD, NekDouble> (npts, 0.0); EvaluateFunction(pFields, m_session, s_FieldStr, m_Refflow[i], funcName); } m_hasRefFlow = true; } funcNameElmt = pForce->FirstChildElement("REFFLOWTIME"); if (funcNameElmt) { m_funcNameTime = funcNameElmt->GetText(); ASSERTL0(m_session->DefinesFunction(funcName), "Function '" + funcName + "' not defined."); m_hasRefFlowTime = true; } } void ForcingAbsorption::v_Apply( const Array<OneD, MultiRegions::ExpListSharedPtr> &fields, const Array<OneD, Array<OneD, NekDouble> > &inarray, Array<OneD, Array<OneD, NekDouble> > &outarray, const NekDouble &time) { int nq = m_Forcing[0].num_elements(); std::string s_FieldStr; Array<OneD, NekDouble> TimeScale(1); Array<OneD, Array<OneD, NekDouble> > RefflowScaled(m_NumVariable); if (m_hasRefFlow) { for (int i = 0; i < m_NumVariable; i++) { RefflowScaled[i] = Array<OneD, NekDouble> (nq); if (m_hasRefFlowTime) { s_FieldStr = m_session->GetVariable(i); EvaluateTimeFunction(m_session, s_FieldStr, TimeScale, m_funcNameTime, time); Vmath::Smul(nq, TimeScale[0], m_Refflow[i],1,RefflowScaled[i],1); } else { Vmath::Vcopy(nq, m_Refflow[i],1, RefflowScaled[i],1); } Vmath::Vsub(nq, inarray[i], 1, RefflowScaled[i], 1, m_Forcing[i], 1); Vmath::Vmul(nq, m_Absorption[i], 1, m_Forcing[i], 1, m_Forcing[i], 1); Vmath::Vadd(nq, m_Forcing[i], 1, outarray[i], 1, outarray[i], 1); } } else { for (int i = 0; i < m_NumVariable; i++) { Vmath::Vmul(nq, m_Absorption[i], 1, inarray[i], 1, m_Forcing[i], 1); Vmath::Vadd(nq, m_Forcing[i], 1, outarray[i], 1, outarray[i], 1); } } } }