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

virtual ~ArtificialDiffusion ()
 
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...
 
void SetElmtHP (const Array< OneD, NekDouble > &hOverP)
 Set h/p scaling. More...
 

Protected Member Functions

 ArtificialDiffusion (const LibUtilities::SessionReaderSharedPtr &pSession, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int spacedim)
 Constructor. More...
 
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...
 
Array< OneD, NekDoublem_hOverP
 h/p scaling More...
 

Detailed Description

Encapsulates the artificial diffusion used in shock capture.

Definition at line 68 of file ArtificialDiffusion.h.

Constructor & Destructor Documentation

◆ ~ArtificialDiffusion()

virtual Nektar::ArtificialDiffusion::~ArtificialDiffusion ( )
inlinevirtual

Definition at line 71 of file ArtificialDiffusion.h.

71 {}

◆ ArtificialDiffusion()

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

Constructor.

Definition at line 48 of file ArtificialDiffusion.cpp.

52  : m_session(pSession),
53  m_fields(pFields)
54 {
55  // Create auxiliary object to convert variables
57  m_session, spacedim);
58 
60  .CreateInstance("LDG", "LDG");
61  m_diffusion->SetFluxVector(&ArtificialDiffusion::GetFluxVector, this);
62  m_diffusion->InitObject (m_session, m_fields);
63 
64  // Get constant scaling
65  m_session->LoadParameter("mu0", m_mu0, 1.0);
66 
67  // Init h/p scaling
68  int nElements = m_fields[0]->GetExpSize();
69  m_hOverP = Array<OneD, NekDouble>(nElements, 1.0);
70 }
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array of fields.
LibUtilities::SessionReaderSharedPtr m_session
Session reader.
Array< OneD, NekDouble > m_hOverP
h/p scaling
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.
Definition: NekFactory.hpp:145
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
DiffusionFactory & GetDiffusionFactory()
Definition: Diffusion.cpp:41

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

Member Function Documentation

◆ DoArtificialDiffusion()

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

Apply the artificial diffusion.

Definition at line 75 of file ArtificialDiffusion.cpp.

78 {
79  v_DoArtificialDiffusion(inarray, outarray);
80 }
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 
)

Apply the artificial diffusion the outarray is in coeff space.

Definition at line 111 of file ArtificialDiffusion.cpp.

114 {
115  v_DoArtificialDiffusionCoeff(inarray, outarray);
116 }
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 
)

Calculate the artificial viscosity.

Definition at line 143 of file ArtificialDiffusion.cpp.

146 {
147  v_GetArtificialViscosity(physfield, mu);
148 }
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 161 of file ArtificialDiffusion.cpp.

165 {
166  unsigned int nDim = qfield.size();
167  unsigned int nConvectiveFields = qfield[0].size();
168  unsigned int nPts = qfield[0][0].size();
169 
170  // Get Artificial viscosity
171  Array<OneD, NekDouble> mu{nPts, 0.0};
172  GetArtificialViscosity(inarray, mu);
173 
174  // Compute viscous tensor
175  for (unsigned int j = 0; j < nDim; ++j)
176  {
177  for (unsigned int i = 0; i < nConvectiveFields; ++i)
178  {
179  Vmath::Vmul(nPts, qfield[j][i], 1, mu , 1, viscousTensor[j][i], 1);
180  }
181  }
182 }
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.cpp:192

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

Referenced by ArtificialDiffusion().

◆ SetElmtHP()

void Nektar::ArtificialDiffusion::SetElmtHP ( const Array< OneD, NekDouble > &  hOverP)

Set h/p scaling.

Definition at line 153 of file ArtificialDiffusion.cpp.

154 {
155  m_hOverP = hOverP;
156 }

References m_hOverP.

◆ 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 85 of file ArtificialDiffusion.cpp.

88 {
89  int i;
90  int nvariables = inarray.size();
91  int npoints = m_fields[0]->GetNpoints();
92 
93  Array<OneD, Array<OneD, NekDouble> > outarrayDiff(nvariables);
94 
95  for (i = 0; i < nvariables; ++i)
96  {
97  outarrayDiff[i] = Array<OneD, NekDouble>(npoints, 0.0);
98  }
99 
100  m_diffusion->Diffuse(nvariables, m_fields, inarray, outarrayDiff);
101 
102  for (i = 0; i < nvariables; ++i)
103  {
104  Vmath::Vadd(npoints,
105  outarray[i], 1,
106  outarrayDiff[i], 1,
107  outarray[i], 1);
108  }
109 }
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.cpp:322

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 118 of file ArtificialDiffusion.cpp.

121 {
122  size_t nvariables = inarray.size();
123  size_t ncoeffs = m_fields[0]->GetNcoeffs();
124 
125  Array<OneD, Array<OneD, NekDouble> > outarrayDiff {nvariables};
126 
127  for (int i = 0; i < nvariables; ++i)
128  {
129  outarrayDiff[i] = Array<OneD, NekDouble>{ncoeffs, 0.0};
130  }
131 
132  m_diffusion->DiffuseCoeffs(nvariables, m_fields, inarray, outarrayDiff);
133 
134  for (int i = 0; i < nvariables; ++i)
135  {
136  Vmath::Vadd(ncoeffs,
137  outarray[i], 1,
138  outarrayDiff[i], 1,
139  outarray[i], 1);
140  }
141 }

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_hOverP

Array<OneD, NekDouble> Nektar::ArtificialDiffusion::m_hOverP
protected

◆ m_mu0

NekDouble Nektar::ArtificialDiffusion::m_mu0
protected

Constant scaling.

Definition at line 101 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 93 of file ArtificialDiffusion.h.

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

◆ m_varConv

VariableConverterSharedPtr Nektar::ArtificialDiffusion::m_varConv
protected

Auxiliary object to convert variables.

Definition at line 97 of file ArtificialDiffusion.h.

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