39 #include <boost/core/ignore_unused.hpp>
47 std::string Diffusion3DHomogeneous1D::type[] = {
49 "LDG3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
51 "LFRDG3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
53 "LFRSD3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
55 "LFRHU3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
57 "LFRcmin3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
59 "LFRcinf3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
61 "LDGNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
63 "LFRDGNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
65 "LFRSDNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
67 "LFRHUNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
69 "LFRcminNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create),
71 "LFRcinfNS3DHomogeneous1D", Diffusion3DHomogeneous1D::create)};
78 Diffusion3DHomogeneous1D::Diffusion3DHomogeneous1D(std::string diffType)
82 m_diffType = diffType.substr(0, diffType.length() - 15);
93 void Diffusion3DHomogeneous1D::v_InitObject(
97 int nConvectiveFields = pFields.size();
103 for (
int i = 0; i < nConvectiveFields; ++i)
105 pFields_plane0[i] = pFields[i]->GetPlane(0);
107 m_planeDiff->InitObject(pSession, pFields_plane0);
109 m_numPoints = pFields[0]->GetTotPoints();
110 m_planes = pFields[0]->GetZIDs();
111 m_numPlanes = m_planes.size();
112 m_numPointsPlane = m_numPoints / m_numPlanes;
113 m_homoLen = pFields[0]->GetHomoLen();
114 m_trans = pFields[0]->GetTransposition();
117 if (m_diffType ==
"LDG")
120 m_planeDiff->SetFluxVector(m_fluxVector);
122 else if (m_diffType ==
"LDGNS")
125 m_planeDiff->SetFluxVectorNS(m_fluxVectorNS);
127 m_planeDiff->SetFluxPenaltyNS(m_fluxPenaltyNS);
129 else if (m_diffType ==
"LFRDGNS" || m_diffType ==
"LFRHUNS" ||
130 m_diffType ==
"LFRSDNS")
133 m_planeDiff->SetFluxVectorNS(m_fluxVectorNS);
151 for (
int i = 0; i < m_numPlanes; ++i)
153 m_planePos[i] = i * m_numPointsPlane;
163 for (
int i = 0; i < nConvectiveFields; ++i)
168 for (
int i = 0; i < m_numPlanes; ++i)
170 m_homoDerivPlane[i] =
173 for (
int j = 0; j < nConvectiveFields; ++j)
176 m_numPointsPlane, m_homoDerivStore[j] + m_planePos[i]);
186 void Diffusion3DHomogeneous1D::v_Diffuse(
187 const std::size_t nConvectiveFields,
194 boost::ignore_unused(pFwd, pBwd);
198 const int nPointsTot = fields[0]->GetNpoints();
204 for (
int i = 0; i < nConvectiveFields - 1; ++i)
206 fields[0]->PhysDeriv(2, inarray[i], m_homoDerivStore[i]);
211 for (
int i = 0; i < m_numPlanes; ++i)
215 for (
int j = 0; j < inarray.size(); ++j)
218 m_numPointsPlane, tmp2 = inarray[j] + m_planePos[i]);
221 for (
int j = 0; j < nConvectiveFields; ++j)
223 m_fieldsPlane[j] = fields[j]->GetPlane(i);
225 m_numPointsPlane, tmp2 = outarray[j] + m_planePos[i]);
230 m_planeDiff->SetHomoDerivs(m_homoDerivPlane[i]);
233 if (m_diffType ==
"LDGNS")
236 std::size_t nTracePts =
237 m_fieldsPlane[0]->GetTrace()->GetTotPoints();
238 std::size_t nScalar = m_inarrayPlane.size();
242 for (std::size_t k = 0; k < nScalar; ++k)
246 m_fieldsPlane[k]->GetFwdBwdTracePhys(m_inarrayPlane[k],
251 m_planeDiff->Diffuse(nConvectiveFields, m_fieldsPlane,
252 m_inarrayPlane, m_outarrayPlane, Fwd, Bwd);
256 m_planeDiff->Diffuse(nConvectiveFields, m_fieldsPlane,
257 m_inarrayPlane, m_outarrayPlane);
263 m_planeDiff->GetFluxTensor();
266 for (
int j = 0; j < nConvectiveFields - 1; ++j)
269 tmp2 = viscHComp[j] + m_planePos[i], 1);
276 for (
int j = 0; j < nConvectiveFields - 1; ++j)
278 fields[j + 1]->PhysDeriv(2, viscHComp[j], tmp);
279 Vmath::Vadd(nPointsTot, outarray[j + 1], 1, tmp, 1, outarray[j + 1],
285 for (
int j = 0; j < nConvectiveFields; ++j)
287 fields[j]->HomogeneousFwdTrans(m_numPoints, inarray[j], tmp);
289 for (
int i = 0; i < m_numPlanes; ++i)
291 beta = 2 * M_PI * m_trans->GetK(i) / m_homoLen;
295 &tmp[0] + i * m_numPointsPlane, 1,
296 &tmp[0] + i * m_numPointsPlane, 1);
299 fields[0]->HomogeneousBwdTrans(m_numPoints, tmp, tmp);
301 Vmath::Vsub(nPointsTot, outarray[j], 1, tmp, 1, outarray[j], 1);
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ beta
Gauss Radau pinned at x=-1,.
DiffusionFactory & GetDiffusionFactory()
The above copyright notice and this permission notice shall be included.
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.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.