Nektar++
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::ArtificialDiffusion Class Referenceabstract

Encapsulates the artificial diffusion used in shock capture. More...

#include <ArtificialDiffusion.h>

Inheritance diagram for Nektar::ArtificialDiffusion:
[legend]

Public Member Functions

void DoArtificialDiffusion (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 Apply the artificial diffusion. More...
 
void DoArtificialDiffusionCoeff (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 Apply the artificial diffusion the outarray is in coeff space. More...
 
void GetArtificialViscosity (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &mu)
 Calculate the artificial viscosity. More...
 

Protected Member Functions

 ArtificialDiffusion (const LibUtilities::SessionReaderSharedPtr &pSession, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int spacedim)
 Constructor. More...
 
virtual ~ArtificialDiffusion ()=default
 
virtual void v_DoArtificialDiffusion (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 
virtual void v_DoArtificialDiffusionCoeff (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
 
virtual void v_GetArtificialViscosity (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &mu)=0
 
void GetFluxVector (const Array< OneD, Array< OneD, NekDouble > > &inarray, const Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &viscousTensor)
 Return the flux vector for the artificial viscosity operator. More...
 

Protected Attributes

LibUtilities::SessionReaderSharedPtr m_session
 Session reader. More...
 
Array< OneD, MultiRegions::ExpListSharedPtrm_fields
 Array of fields. More...
 
VariableConverterSharedPtr m_varConv
 Auxiliary object to convert variables. More...
 
SolverUtils::DiffusionSharedPtr m_diffusion
 LDG Diffusion operator. More...
 
NekDouble m_mu0
 Constant scaling. More...
 

Detailed Description

Encapsulates the artificial diffusion used in shock capture.

Definition at line 69 of file ArtificialDiffusion.h.

Constructor & Destructor Documentation

◆ ArtificialDiffusion()

Nektar::ArtificialDiffusion::ArtificialDiffusion ( const LibUtilities::SessionReaderSharedPtr pSession,
const Array< OneD, MultiRegions::ExpListSharedPtr > &  pFields,
const int  spacedim 
)
protected

Constructor.

Definition at line 47 of file ArtificialDiffusion.cpp.

51 : m_session(pSession), m_fields(pFields)
52{
53 // Create auxiliary object to convert variables
55 spacedim);
56
60 m_diffusion->InitObject(m_session, m_fields);
61
62 // Get constant scaling
63 m_session->LoadParameter("mu0", m_mu0, 1.0);
64}
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array of fields.
LibUtilities::SessionReaderSharedPtr m_session
Session reader.
NekDouble m_mu0
Constant scaling.
VariableConverterSharedPtr m_varConv
Auxiliary object to convert variables.
void GetFluxVector(const Array< OneD, Array< OneD, NekDouble > > &inarray, const Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &viscousTensor)
Return the flux vector for the artificial viscosity operator.
SolverUtils::DiffusionSharedPtr m_diffusion
LDG Diffusion operator.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
DiffusionFactory & GetDiffusionFactory()
Definition: Diffusion.cpp:39

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), Nektar::SolverUtils::GetDiffusionFactory(), GetFluxVector(), m_diffusion, m_fields, m_mu0, m_session, and m_varConv.

◆ ~ArtificialDiffusion()

virtual Nektar::ArtificialDiffusion::~ArtificialDiffusion ( )
protectedvirtualdefault

Member Function Documentation

◆ DoArtificialDiffusion()

void Nektar::ArtificialDiffusion::DoArtificialDiffusion ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray 
)
inline

Apply the artificial diffusion.

Definition at line 73 of file ArtificialDiffusion.h.

76 {
77 v_DoArtificialDiffusion(inarray, outarray);
78 }
virtual void v_DoArtificialDiffusion(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)

References v_DoArtificialDiffusion().

◆ DoArtificialDiffusionCoeff()

void Nektar::ArtificialDiffusion::DoArtificialDiffusionCoeff ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray 
)
inline

Apply the artificial diffusion the outarray is in coeff space.

Definition at line 81 of file ArtificialDiffusion.h.

84 {
85 v_DoArtificialDiffusionCoeff(inarray, outarray);
86 }
virtual void v_DoArtificialDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)

References v_DoArtificialDiffusionCoeff().

◆ GetArtificialViscosity()

void Nektar::ArtificialDiffusion::GetArtificialViscosity ( const Array< OneD, Array< OneD, NekDouble > > &  physfield,
Array< OneD, NekDouble > &  mu 
)
inline

Calculate the artificial viscosity.

Definition at line 89 of file ArtificialDiffusion.h.

92 {
93 v_GetArtificialViscosity(physfield, mu);
94 }
virtual void v_GetArtificialViscosity(const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &mu)=0

References v_GetArtificialViscosity().

Referenced by GetFluxVector().

◆ GetFluxVector()

void Nektar::ArtificialDiffusion::GetFluxVector ( const Array< OneD, Array< OneD, NekDouble > > &  inarray,
const Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &  qfield,
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &  viscousTensor 
)
protected

Return the flux vector for the artificial viscosity operator.

Definition at line 121 of file ArtificialDiffusion.cpp.

125{
126 unsigned int nDim = qfield.size();
127 unsigned int nConvectiveFields = qfield[0].size();
128 unsigned int nPts = qfield[0][0].size();
129
130 // Get Artificial viscosity
131 Array<OneD, NekDouble> mu{nPts, 0.0};
132 GetArtificialViscosity(inarray, mu);
133
134 // Compute viscous tensor
135 for (unsigned int j = 0; j < nDim; ++j)
136 {
137 for (unsigned int i = 0; i < nConvectiveFields; ++i)
138 {
139 Vmath::Vmul(nPts, qfield[j][i], 1, mu, 1, viscousTensor[j][i], 1);
140 }
141 }
142}
void GetArtificialViscosity(const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &mu)
Calculate the artificial viscosity.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
Definition: Vmath.hpp:72

References GetArtificialViscosity(), and Vmath::Vmul().

Referenced by ArtificialDiffusion().

◆ v_DoArtificialDiffusion()

void Nektar::ArtificialDiffusion::v_DoArtificialDiffusion ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray 
)
protectedvirtual

Definition at line 69 of file ArtificialDiffusion.cpp.

72{
73 int nvariables = inarray.size();
74 int npoints = m_fields[0]->GetNpoints();
75
76 Array<OneD, Array<OneD, NekDouble>> outarrayDiff(nvariables);
77
78 for (int i = 0; i < nvariables; ++i)
79 {
80 outarrayDiff[i] = Array<OneD, NekDouble>(npoints, 0.0);
81 }
82
83 m_diffusion->Diffuse(nvariables, m_fields, inarray, outarrayDiff);
84
85 for (int i = 0; i < nvariables; ++i)
86 {
87 Vmath::Vadd(npoints, outarray[i], 1, outarrayDiff[i], 1, outarray[i],
88 1);
89 }
90}
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.
Definition: Vmath.hpp:180

References m_diffusion, m_fields, and Vmath::Vadd().

Referenced by DoArtificialDiffusion().

◆ v_DoArtificialDiffusionCoeff()

void Nektar::ArtificialDiffusion::v_DoArtificialDiffusionCoeff ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray 
)
protectedvirtual

Definition at line 95 of file ArtificialDiffusion.cpp.

98{
99 size_t nvariables = inarray.size();
100 size_t ncoeffs = m_fields[0]->GetNcoeffs();
101
102 Array<OneD, Array<OneD, NekDouble>> outarrayDiff{nvariables};
103
104 for (size_t i = 0; i < nvariables; ++i)
105 {
106 outarrayDiff[i] = Array<OneD, NekDouble>{ncoeffs, 0.0};
107 }
108
109 m_diffusion->DiffuseCoeffs(nvariables, m_fields, inarray, outarrayDiff);
110
111 for (size_t i = 0; i < nvariables; ++i)
112 {
113 Vmath::Vadd(ncoeffs, outarray[i], 1, outarrayDiff[i], 1, outarray[i],
114 1);
115 }
116}

References m_diffusion, m_fields, and Vmath::Vadd().

Referenced by DoArtificialDiffusionCoeff().

◆ v_GetArtificialViscosity()

virtual void Nektar::ArtificialDiffusion::v_GetArtificialViscosity ( const Array< OneD, Array< OneD, NekDouble > > &  physfield,
Array< OneD, NekDouble > &  mu 
)
protectedpure virtual

Member Data Documentation

◆ m_diffusion

SolverUtils::DiffusionSharedPtr Nektar::ArtificialDiffusion::m_diffusion
protected

◆ m_fields

Array<OneD, MultiRegions::ExpListSharedPtr> Nektar::ArtificialDiffusion::m_fields
protected

◆ m_mu0

NekDouble Nektar::ArtificialDiffusion::m_mu0
protected

Constant scaling.

Definition at line 106 of file ArtificialDiffusion.h.

Referenced by ArtificialDiffusion(), and Nektar::NonSmoothShockCapture::v_GetArtificialViscosity().

◆ m_session

LibUtilities::SessionReaderSharedPtr Nektar::ArtificialDiffusion::m_session
protected

Session reader.

Definition at line 98 of file ArtificialDiffusion.h.

Referenced by ArtificialDiffusion(), and Nektar::NonSmoothShockCapture::NonSmoothShockCapture().

◆ m_varConv

VariableConverterSharedPtr Nektar::ArtificialDiffusion::m_varConv
protected