Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Private Member Functions | Friends | List of all members
Nektar::EulerCFE Class Reference

#include <EulerCFE.h>

Inheritance diagram for Nektar::EulerCFE:
Inheritance graph
[legend]
Collaboration diagram for Nektar::EulerCFE:
Collaboration graph
[legend]

Public Member Functions

virtual ~EulerCFE ()
 problem type selector More...
 
- Public Member Functions inherited from Nektar::CompressibleFlowSystem
virtual ~CompressibleFlowSystem ()
 Destructor for CompressibleFlowSystem class. More...
 
NekDouble GetStabilityLimit (int n)
 Function to calculate the stability limit for DG/CG. More...
 
Array< OneD, NekDoubleGetStabilityLimitVector (const Array< OneD, int > &ExpOrder)
 Function to calculate the stability limit for DG/CG (a vector of them). More...
 
- Public Member Functions inherited from Nektar::SolverUtils::UnsteadySystem
virtual SOLVER_UTILS_EXPORT ~UnsteadySystem ()
 Destructor. More...
 
SOLVER_UTILS_EXPORT NekDouble GetTimeStep (const Array< OneD, const Array< OneD, NekDouble > > &inarray)
 Calculate the larger time-step mantaining the problem stable. More...
 
- Public Member Functions inherited from Nektar::SolverUtils::EquationSystem
virtual SOLVER_UTILS_EXPORT ~EquationSystem ()
 Destructor. More...
 
SOLVER_UTILS_EXPORT void SetUpTraceNormals (void)
 
SOLVER_UTILS_EXPORT void InitObject ()
 Initialises the members of this object. More...
 
SOLVER_UTILS_EXPORT void DoInitialise ()
 Perform any initialisation necessary before solving the problem. More...
 
SOLVER_UTILS_EXPORT void DoSolve ()
 Solve the problem. More...
 
SOLVER_UTILS_EXPORT void TransCoeffToPhys ()
 Transform from coefficient to physical space. More...
 
SOLVER_UTILS_EXPORT void TransPhysToCoeff ()
 Transform from physical to coefficient space. More...
 
SOLVER_UTILS_EXPORT void Output ()
 Perform output operations after solve. More...
 
SOLVER_UTILS_EXPORT NekDouble LinfError (unsigned int field, const Array< OneD, NekDouble > &exactsoln=NullNekDouble1DArray)
 Linf error computation. More...
 
SOLVER_UTILS_EXPORT std::string GetSessionName ()
 Get Session name. More...
 
template<class T >
boost::shared_ptr< T > as ()
 
SOLVER_UTILS_EXPORT void ResetSessionName (std::string newname)
 Reset Session name. More...
 
SOLVER_UTILS_EXPORT
LibUtilities::SessionReaderSharedPtr 
GetSession ()
 Get Session name. More...
 
SOLVER_UTILS_EXPORT
MultiRegions::ExpListSharedPtr 
GetPressure ()
 Get pressure field if available. More...
 
SOLVER_UTILS_EXPORT void PrintSummary (std::ostream &out)
 Print a summary of parameters and solver characteristics. More...
 
SOLVER_UTILS_EXPORT void SetLambda (NekDouble lambda)
 Set parameter m_lambda. More...
 
SOLVER_UTILS_EXPORT void EvaluateFunction (Array< OneD, Array< OneD, NekDouble > > &pArray, std::string pFunctionName, const NekDouble pTime=0.0, const int domain=0)
 Evaluates a function as specified in the session file. More...
 
SOLVER_UTILS_EXPORT void EvaluateFunction (std::vector< std::string > pFieldNames, Array< OneD, Array< OneD, NekDouble > > &pFields, const std::string &pName, const NekDouble &pTime=0.0, const int domain=0)
 Populate given fields with the function from session. More...
 
SOLVER_UTILS_EXPORT void EvaluateFunction (std::vector< std::string > pFieldNames, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const std::string &pName, const NekDouble &pTime=0.0, const int domain=0)
 Populate given fields with the function from session. More...
 
SOLVER_UTILS_EXPORT void EvaluateFunction (std::string pFieldName, Array< OneD, NekDouble > &pArray, const std::string &pFunctionName, const NekDouble &pTime=0.0, const int domain=0)
 
SOLVER_UTILS_EXPORT std::string DescribeFunction (std::string pFieldName, const std::string &pFunctionName, const int domain)
 Provide a description of a function for a given field name. More...
 
SOLVER_UTILS_EXPORT void InitialiseBaseFlow (Array< OneD, Array< OneD, NekDouble > > &base)
 Perform initialisation of the base flow. More...
 
SOLVER_UTILS_EXPORT void SetInitialConditions (NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
 Initialise the data in the dependent fields. More...
 
SOLVER_UTILS_EXPORT void EvaluateExactSolution (int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
 Evaluates an exact solution. More...
 
SOLVER_UTILS_EXPORT NekDouble L2Error (unsigned int field, const Array< OneD, NekDouble > &exactsoln, bool Normalised=false)
 Compute the L2 error between fields and a given exact solution. More...
 
SOLVER_UTILS_EXPORT NekDouble L2Error (unsigned int field, bool Normalised=false)
 Compute the L2 error of the fields. More...
 
SOLVER_UTILS_EXPORT Array
< OneD, NekDouble
ErrorExtraPoints (unsigned int field)
 Compute error (L2 and L_inf) over an larger set of quadrature points return [L2 Linf]. More...
 
SOLVER_UTILS_EXPORT void WeakAdvectionGreensDivergenceForm (const Array< OneD, Array< OneD, NekDouble > > &F, Array< OneD, NekDouble > &outarray)
 Compute the inner product $ (\nabla \phi \cdot F) $. More...
 
SOLVER_UTILS_EXPORT void WeakAdvectionDivergenceForm (const Array< OneD, Array< OneD, NekDouble > > &F, Array< OneD, NekDouble > &outarray)
 Compute the inner product $ (\phi, \nabla \cdot F) $. More...
 
SOLVER_UTILS_EXPORT void WeakAdvectionNonConservativeForm (const Array< OneD, Array< OneD, NekDouble > > &V, const Array< OneD, const NekDouble > &u, Array< OneD, NekDouble > &outarray, bool UseContCoeffs=false)
 Compute the inner product $ (\phi, V\cdot \nabla u) $. More...
 
f SOLVER_UTILS_EXPORT void AdvectionNonConservativeForm (const Array< OneD, Array< OneD, NekDouble > > &V, const Array< OneD, const NekDouble > &u, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wk=NullNekDouble1DArray)
 Compute the non-conservative advection. More...
 
SOLVER_UTILS_EXPORT void WeakDGAdvection (const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField, bool NumericalFluxIncludesNormal=true, bool InFieldIsInPhysSpace=false, int nvariables=0)
 Calculate the weak discontinuous Galerkin advection. More...
 
SOLVER_UTILS_EXPORT void WeakDGDiffusion (const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField, bool NumericalFluxIncludesNormal=true, bool InFieldIsInPhysSpace=false)
 Calculate weak DG Diffusion in the LDG form. More...
 
SOLVER_UTILS_EXPORT void Checkpoint_Output (const int n)
 Write checkpoint file of m_fields. More...
 
SOLVER_UTILS_EXPORT void Checkpoint_Output (const int n, MultiRegions::ExpListSharedPtr &field, std::vector< Array< OneD, NekDouble > > &fieldcoeffs, std::vector< std::string > &variables)
 Write checkpoint file of custom data fields. More...
 
SOLVER_UTILS_EXPORT void Checkpoint_BaseFlow (const int n)
 Write base flow file of m_fields. More...
 
SOLVER_UTILS_EXPORT void WriteFld (const std::string &outname)
 Write field data to the given filename. More...
 
SOLVER_UTILS_EXPORT void WriteFld (const std::string &outname, MultiRegions::ExpListSharedPtr &field, std::vector< Array< OneD, NekDouble > > &fieldcoeffs, std::vector< std::string > &variables)
 Write input fields to the given filename. More...
 
SOLVER_UTILS_EXPORT void ImportFld (const std::string &infile, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
 Input field data from the given file. More...
 
SOLVER_UTILS_EXPORT void ImportFldToMultiDomains (const std::string &infile, Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const int ndomains)
 Input field data from the given file to multiple domains. More...
 
SOLVER_UTILS_EXPORT void ImportFld (const std::string &infile, std::vector< std::string > &fieldStr, Array< OneD, Array< OneD, NekDouble > > &coeffs)
 Output a field. Input field data into array from the given file. More...
 
SOLVER_UTILS_EXPORT void ImportFld (const std::string &infile, MultiRegions::ExpListSharedPtr &pField, std::string &pFieldName)
 Output a field. Input field data into ExpList from the given file. More...
 
SOLVER_UTILS_EXPORT void ScanForHistoryPoints ()
 Builds map of which element holds each history point. More...
 
SOLVER_UTILS_EXPORT void WriteHistoryData (std::ostream &out)
 Probe each history point and write to file. More...
 
SOLVER_UTILS_EXPORT void SessionSummary (SummaryList &vSummary)
 Write out a session summary. More...
 
SOLVER_UTILS_EXPORT Array
< OneD,
MultiRegions::ExpListSharedPtr > & 
UpdateFields ()
 
SOLVER_UTILS_EXPORT
LibUtilities::FieldMetaDataMap
UpdateFieldMetaDataMap ()
 Get hold of FieldInfoMap so it can be updated. More...
 
SOLVER_UTILS_EXPORT NekDouble GetFinalTime ()
 Return final time. More...
 
SOLVER_UTILS_EXPORT int GetNcoeffs ()
 
SOLVER_UTILS_EXPORT int GetNcoeffs (const int eid)
 
SOLVER_UTILS_EXPORT int GetNumExpModes ()
 
SOLVER_UTILS_EXPORT const
Array< OneD, int > 
GetNumExpModesPerExp ()
 
SOLVER_UTILS_EXPORT int GetNvariables ()
 
SOLVER_UTILS_EXPORT const
std::string 
GetVariable (unsigned int i)
 
SOLVER_UTILS_EXPORT int GetTraceTotPoints ()
 
SOLVER_UTILS_EXPORT int GetTraceNpoints ()
 
SOLVER_UTILS_EXPORT int GetExpSize ()
 
SOLVER_UTILS_EXPORT int GetPhys_Offset (int n)
 
SOLVER_UTILS_EXPORT int GetCoeff_Offset (int n)
 
SOLVER_UTILS_EXPORT int GetTotPoints ()
 
SOLVER_UTILS_EXPORT int GetTotPoints (int n)
 
SOLVER_UTILS_EXPORT int GetNpoints ()
 
SOLVER_UTILS_EXPORT int GetNumElmVelocity ()
 
SOLVER_UTILS_EXPORT int GetSteps ()
 
SOLVER_UTILS_EXPORT NekDouble GetTimeStep ()
 
SOLVER_UTILS_EXPORT void CopyFromPhysField (const int i, Array< OneD, NekDouble > &output)
 
SOLVER_UTILS_EXPORT void CopyToPhysField (const int i, Array< OneD, NekDouble > &output)
 
SOLVER_UTILS_EXPORT void SetSteps (const int steps)
 
SOLVER_UTILS_EXPORT void ZeroPhysFields ()
 
SOLVER_UTILS_EXPORT void FwdTransFields ()
 
SOLVER_UTILS_EXPORT void GetFluxVector (const int i, Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &flux)
 
SOLVER_UTILS_EXPORT void GetFluxVector (const int i, Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &fluxX, Array< OneD, Array< OneD, NekDouble > > &fluxY)
 
SOLVER_UTILS_EXPORT void GetFluxVector (const int i, const int j, Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &flux)
 
SOLVER_UTILS_EXPORT void NumericalFlux (Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numflux)
 
SOLVER_UTILS_EXPORT void NumericalFlux (Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numfluxX, Array< OneD, Array< OneD, NekDouble > > &numfluxY)
 
SOLVER_UTILS_EXPORT void NumFluxforScalar (const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &uflux)
 
SOLVER_UTILS_EXPORT void NumFluxforVector (const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, NekDouble > > &qflux)
 
SOLVER_UTILS_EXPORT void SetModifiedBasis (const bool modbasis)
 
SOLVER_UTILS_EXPORT int NoCaseStringCompare (const std::string &s1, const std::string &s2)
 Perform a case-insensitive string comparison. More...
 
SOLVER_UTILS_EXPORT int GetCheckpointNumber ()
 
SOLVER_UTILS_EXPORT void SetCheckpointNumber (int num)
 
SOLVER_UTILS_EXPORT int GetCheckpointSteps ()
 
SOLVER_UTILS_EXPORT void SetCheckpointSteps (int num)
 
SOLVER_UTILS_EXPORT void SetTime (const NekDouble time)
 
SOLVER_UTILS_EXPORT void SetInitialStep (const int step)
 
SOLVER_UTILS_EXPORT void SetBoundaryConditions (NekDouble time)
 Evaluates the boundary conditions at the given time. More...
 
virtual SOLVER_UTILS_EXPORT bool v_NegatedOp ()
 Virtual function to identify if operator is negated in DoSolve. More...
 

Static Public Member Functions

static
SolverUtils::EquationSystemSharedPtr 
create (const LibUtilities::SessionReaderSharedPtr &pSession)
 Creates an instance of this class. More...
 
- Static Public Member Functions inherited from Nektar::CompressibleFlowSystem
static
SolverUtils::EquationSystemSharedPtr 
create (const LibUtilities::SessionReaderSharedPtr &pSession)
 Creates an instance of this class. More...
 

Public Attributes

ProblemType m_problemType
 
- Public Attributes inherited from Nektar::SolverUtils::UnsteadySystem
NekDouble m_cflSafetyFactor
 CFL safety factor (comprise between 0 to 1). More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 
- Static Public Attributes inherited from Nektar::CompressibleFlowSystem
static std::string className
 Name of class. More...
 

Protected Member Functions

 EulerCFE (const LibUtilities::SessionReaderSharedPtr &pSession)
 
virtual void v_InitObject ()
 Initialization object for CompressibleFlowSystem class. More...
 
virtual void v_GenerateSummary (SolverUtils::SummaryList &s)
 Print a summary of time stepping parameters. More...
 
void DoOdeRhs (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
 Compute the right-hand side. More...
 
void DoOdeProjection (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
 Compute the projection and call the method for imposing the boundary conditions in case of discontinuous projection. More...
 
virtual void v_SetInitialConditions (NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
 Set the initial conditions. More...
 
virtual void v_EvaluateExactSolution (unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time=0.0)
 Get the exact solutions for isentropic vortex and Ringleb flow problems. More...
 
- Protected Member Functions inherited from Nektar::CompressibleFlowSystem
 CompressibleFlowSystem (const LibUtilities::SessionReaderSharedPtr &pSession)
 
void GetFluxVector (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
 Return the flux vector for the compressible Euler equations. More...
 
void GetFluxVectorDeAlias (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
 Return the flux vector for the compressible Euler equations by using the de-aliasing technique. More...
 
void GetViscousFluxVector (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &derivatives, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &viscousTensor)
 Return the flux vector for the LDG diffusion problem. More...
 
void GetFluxVectorPDESC (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
 
void GetViscousFluxVectorDeAlias (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &derivatives, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &viscousTensor)
 Return the flux vector for the LDG diffusion problem. More...
 
void SetCommonBC (const std::string &userDefStr, const int n, const NekDouble time, int &cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &inarray)
 Set boundary conditions which can be: a) Wall and Symmerty BCs implemented at CompressibleFlowSystem level since they are compressible solver specific; b) Time dependent BCs. More...
 
void WallBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Wall boundary conditions for compressible flow problems. More...
 
void WallViscousBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Wall boundary conditions for viscous compressible flow problems. More...
 
void SymmetryBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Symmetry boundary conditions for compressible flow problems. More...
 
void RiemannInvariantBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Outflow characteristic boundary conditions for compressible flow problems. More...
 
void PressureOutflowNonReflectiveBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Pressure outflow non-reflective boundary conditions for compressible flow problems. More...
 
void PressureOutflowBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Pressure outflow boundary conditions for compressible flow problems. More...
 
void PressureOutflowFileBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Pressure outflow boundary conditions for compressible flow problems. More...
 
void PressureInflowFileBC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Pressure inflow boundary conditions for compressible flow problems where either the density and the velocities are assigned from a file or the full state is assigned from a file (depending on the problem type, either subsonic or supersonic). More...
 
void ExtrapOrder0BC (int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Extrapolation of order 0 for all the variables such that, at the boundaries, a trivial Riemann problem is solved. More...
 
void GetVelocityVector (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &velocity)
 
void GetSoundSpeed (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &pressure, Array< OneD, NekDouble > &soundspeed)
 
void GetMach (Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &soundspeed, Array< OneD, NekDouble > &mach)
 
void GetTemperature (const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &pressure, Array< OneD, NekDouble > &temperature)
 
void GetPressure (const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &pressure)
 Calculate the pressure field $ p = (\gamma-1)(E-\frac{1}{2}\rho\| \mathbf{v} \|^2) $ assuming an ideal gas law. More...
 
void GetPressure (const Array< OneD, const Array< OneD, NekDouble > > &physfield, const Array< OneD, const Array< OneD, NekDouble > > &velocity, Array< OneD, NekDouble > &pressure)
 
void GetEnthalpy (const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &pressure, Array< OneD, NekDouble > &enthalpy)
 
void GetEntropy (const Array< OneD, const Array< OneD, NekDouble > > &physfield, const Array< OneD, const NekDouble > &pressure, const Array< OneD, const NekDouble > &temperature, Array< OneD, NekDouble > &entropy)
 
void GetSmoothArtificialViscosity (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &eps_bar)
 
void GetDynamicViscosity (const Array< OneD, const NekDouble > &temperature, Array< OneD, NekDouble > &mu)
 
void GetStdVelocity (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &stdV)
 
virtual bool v_PostIntegrate (int step)
 
bool CalcSteadyState (bool output)
 
void GetSensor (const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, NekDouble > &Sensor, Array< OneD, NekDouble > &SensorKappa)
 
void GetElementDimensions (Array< OneD, Array< OneD, NekDouble > > &outarray, Array< OneD, NekDouble > &hmin)
 
void GetAbsoluteVelocity (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &Vtot)
 
void GetArtificialDynamicViscosity (const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &mu_var)
 
void SetVarPOrderElmt (const Array< OneD, const Array< OneD, NekDouble > > &physfield, Array< OneD, NekDouble > &PolyOrder)
 
void GetForcingTerm (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > outarrayForcing)
 
virtual NekDouble v_GetTimeStep (const Array< OneD, const Array< OneD, NekDouble > > &inarray)
 Return the timestep to be used for the next step in the time-marching loop. More...
 
NekDouble GetGasConstant ()
 
NekDouble GetGamma ()
 
const Array< OneD, const Array
< OneD, NekDouble > > & 
GetVecLocs ()
 
const Array< OneD, const Array
< OneD, NekDouble > > & 
GetNormals ()
 
virtual void v_ExtraFldOutput (std::vector< Array< OneD, NekDouble > > &fieldcoeffs, std::vector< std::string > &variables)
 
- Protected Member Functions inherited from Nektar::SolverUtils::UnsteadySystem
SOLVER_UTILS_EXPORT UnsteadySystem (const LibUtilities::SessionReaderSharedPtr &pSession)
 Initialises UnsteadySystem class members. More...
 
SOLVER_UTILS_EXPORT NekDouble MaxTimeStepEstimator ()
 Get the maximum timestep estimator for cfl control. More...
 
virtual SOLVER_UTILS_EXPORT void v_DoSolve ()
 Solves an unsteady problem. More...
 
virtual SOLVER_UTILS_EXPORT void v_DoInitialise ()
 Sets up initial conditions. More...
 
virtual SOLVER_UTILS_EXPORT void v_AppendOutput1D (Array< OneD, Array< OneD, NekDouble > > &solution1D)
 Print the solution at each solution point in a txt file. More...
 
virtual SOLVER_UTILS_EXPORT void v_NumericalFlux (Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numflux)
 
virtual SOLVER_UTILS_EXPORT void v_NumericalFlux (Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, NekDouble > > &numfluxX, Array< OneD, Array< OneD, NekDouble > > &numfluxY)
 
virtual SOLVER_UTILS_EXPORT void v_NumFluxforScalar (const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &uflux)
 
virtual SOLVER_UTILS_EXPORT void v_NumFluxforVector (const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, NekDouble > > &qflux)
 
virtual SOLVER_UTILS_EXPORT bool v_PreIntegrate (int step)
 
virtual SOLVER_UTILS_EXPORT bool v_SteadyStateCheck (int step)
 
SOLVER_UTILS_EXPORT void CheckForRestartTime (NekDouble &time)
 
SOLVER_UTILS_EXPORT void SVVVarDiffCoeff (const Array< OneD, Array< OneD, NekDouble > > vel, StdRegions::VarCoeffMap &varCoeffMap)
 Evaluate the SVV diffusion coefficient according to Moura's paper where it should proportional to h time velocity. More...
 
- Protected Member Functions inherited from Nektar::SolverUtils::EquationSystem
SOLVER_UTILS_EXPORT EquationSystem (const LibUtilities::SessionReaderSharedPtr &pSession)
 Initialises EquationSystem class members. More...
 
int nocase_cmp (const std::string &s1, const std::string &s2)
 
virtual SOLVER_UTILS_EXPORT
NekDouble 
v_LinfError (unsigned int field, const Array< OneD, NekDouble > &exactsoln=NullNekDouble1DArray)
 Virtual function for the L_inf error computation between fields and a given exact solution. More...
 
virtual SOLVER_UTILS_EXPORT
NekDouble 
v_L2Error (unsigned int field, const Array< OneD, NekDouble > &exactsoln=NullNekDouble1DArray, bool Normalised=false)
 Virtual function for the L_2 error computation between fields and a given exact solution. More...
 
virtual SOLVER_UTILS_EXPORT void v_TransCoeffToPhys ()
 Virtual function for transformation to physical space. More...
 
virtual SOLVER_UTILS_EXPORT void v_TransPhysToCoeff ()
 Virtual function for transformation to coefficient space. More...
 
SOLVER_UTILS_EXPORT void SetUpBaseFields (SpatialDomains::MeshGraphSharedPtr &mesh)
 
SOLVER_UTILS_EXPORT void ImportFldBase (std::string pInfile, SpatialDomains::MeshGraphSharedPtr pGraph)
 
virtual SOLVER_UTILS_EXPORT void v_Output (void)
 
virtual SOLVER_UTILS_EXPORT
MultiRegions::ExpListSharedPtr 
v_GetPressure (void)
 

Private Member Functions

void SetBoundaryConditions (Array< OneD, Array< OneD, NekDouble > > &physarray, NekDouble time)
 Set boundary conditions which can be: a) Wall and Symmerty BCs implemented at CompressibleFlowSystem level since they are compressible solver specific; b) Isentropic vortex and Ringleb flow BCs implemented at EulerCFE level since they are Euler solver specific; c) Time dependent BCs. More...
 
void EvaluateIsentropicVortex (const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &y, const Array< OneD, NekDouble > &z, Array< OneD, Array< OneD, NekDouble > > &u, NekDouble time, const int o=0)
 Isentropic Vortex Test Case. More...
 
void GetExactIsentropicVortex (int field, Array< OneD, NekDouble > &outarray, NekDouble time)
 Compute the exact solution for the isentropic vortex problem. More...
 
void SetInitialIsentropicVortex (NekDouble initialtime)
 Set the initial condition for the isentropic vortex problem. More...
 
void SetBoundaryIsentropicVortex (int bcRegion, NekDouble time, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Set the boundary conditions for the isentropic vortex problem. More...
 
void GetExactRinglebFlow (int field, Array< OneD, NekDouble > &outarray)
 Ringleb Flow Test Case. More...
 
void SetInitialRinglebFlow (void)
 Set the initial condition for the Ringleb flow problem. More...
 
void SetBoundaryRinglebFlow (int bcRegion, NekDouble time, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
 Set the boundary conditions for the Ringleb flow problem. More...
 

Friends

class MemoryManager< EulerCFE >
 

Additional Inherited Members

- Protected Types inherited from Nektar::SolverUtils::EquationSystem
enum  HomogeneousType { eHomogeneous1D, eHomogeneous2D, eHomogeneous3D, eNotHomogeneous }
 Parameter for homogeneous expansions. More...
 
- Protected Attributes inherited from Nektar::CompressibleFlowSystem
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
 
SolverUtils::RiemannSolverSharedPtr m_riemannSolverLDG
 
SolverUtils::AdvectionSharedPtr m_advection
 
SolverUtils::DiffusionSharedPtr m_diffusion
 
Array< OneD, Array< OneD,
NekDouble > > 
m_vecLocs
 
NekDouble m_gamma
 
NekDouble m_pInf
 
NekDouble m_rhoInf
 
NekDouble m_uInf
 
NekDouble m_vInf
 
NekDouble m_wInf
 
NekDouble m_UInf
 
NekDouble m_gasConstant
 
NekDouble m_Twall
 
std::string m_ViscosityType
 
std::string m_shockCaptureType
 
std::string m_EqTypeStr
 
NekDouble m_mu
 
NekDouble m_Skappa
 
NekDouble m_Kappa
 
NekDouble m_mu0
 
NekDouble m_FacL
 
NekDouble m_FacH
 
NekDouble m_eps_max
 
NekDouble m_thermalConductivity
 
NekDouble m_Cp
 
NekDouble m_C1
 
NekDouble m_C2
 
NekDouble m_hFactor
 
NekDouble m_Prandtl
 
NekDouble m_amplitude
 
NekDouble m_omega
 
std::ofstream m_errFile
 
int m_steadyStateSteps
 
NekDouble m_steadyStateTol
 
std::vector
< SolverUtils::ForcingSharedPtr
m_forcing
 
StdRegions::StdQuadExpSharedPtr m_OrthoQuadExp
 
StdRegions::StdHexExpSharedPtr m_OrthoHexExp
 
bool m_smoothDiffusion
 
Array< OneD, NekDoublem_pressureStorage
 
Array< OneD, Array< OneD,
NekDouble > > 
m_fieldStorage
 
Array< OneD, Array< OneD,
NekDouble > > 
m_un
 
- Protected Attributes inherited from Nektar::SolverUtils::UnsteadySystem
int m_infosteps
 Number of time steps between outputting status information. More...
 
LibUtilities::TimeIntegrationWrapperSharedPtr m_intScheme
 Wrapper to the time integration scheme. More...
 
LibUtilities::TimeIntegrationSchemeOperators m_ode
 The time integration scheme operators to use. More...
 
LibUtilities::TimeIntegrationSolutionSharedPtr m_intSoln
 
NekDouble m_epsilon
 
bool m_explicitDiffusion
 Indicates if explicit or implicit treatment of diffusion is used. More...
 
bool m_explicitAdvection
 Indicates if explicit or implicit treatment of advection is used. More...
 
bool m_explicitReaction
 Indicates if explicit or implicit treatment of reaction is used. More...
 
bool m_homoInitialFwd
 Flag to determine if simulation should start in homogeneous forward transformed state. More...
 
std::vector< int > m_intVariables
 
std::vector< FilterSharedPtrm_filters
 
- Protected Attributes inherited from Nektar::SolverUtils::EquationSystem
LibUtilities::CommSharedPtr m_comm
 Communicator. More...
 
LibUtilities::SessionReaderSharedPtr m_session
 The session reader. More...
 
LibUtilities::FieldIOSharedPtr m_fld
 Field input/output. More...
 
std::map< std::string, Array
< OneD, Array< OneD, float > > > 
m_interpWeights
 Map of the interpolation weights for a specific filename. More...
 
std::map< std::string, Array
< OneD, Array< OneD, unsigned
int > > > 
m_interpInds
 Map of the interpolation indices for a specific filename. More...
 
Array< OneD,
MultiRegions::ExpListSharedPtr
m_fields
 Array holding all dependent variables. More...
 
Array< OneD,
MultiRegions::ExpListSharedPtr
m_base
 Base fields. More...
 
Array< OneD,
MultiRegions::ExpListSharedPtr
m_derivedfields
 Array holding all dependent variables. More...
 
SpatialDomains::BoundaryConditionsSharedPtr m_boundaryConditions
 Pointer to boundary conditions object. More...
 
SpatialDomains::MeshGraphSharedPtr m_graph
 Pointer to graph defining mesh. More...
 
std::string m_sessionName
 Name of the session. More...
 
NekDouble m_time
 Current time of simulation. More...
 
int m_initialStep
 Number of the step where the simulation should begin. More...
 
NekDouble m_fintime
 Finish time of the simulation. More...
 
NekDouble m_timestep
 Time step size. More...
 
NekDouble m_lambda
 Lambda constant in real system if one required. More...
 
std::set< std::string > m_loadedFields
 
NekDouble m_checktime
 Time between checkpoints. More...
 
int m_nchk
 Number of checkpoints written so far. More...
 
int m_steps
 Number of steps to take. More...
 
int m_checksteps
 Number of steps between checkpoints. More...
 
int m_spacedim
 Spatial dimension (>= expansion dim). More...
 
int m_expdim
 Expansion dimension. More...
 
bool m_singleMode
 Flag to determine if single homogeneous mode is used. More...
 
bool m_halfMode
 Flag to determine if half homogeneous mode is used. More...
 
bool m_multipleModes
 Flag to determine if use multiple homogenenous modes are used. More...
 
bool m_useFFT
 Flag to determine if FFT is used for homogeneous transform. More...
 
bool m_homogen_dealiasing
 Flag to determine if dealiasing is used for homogeneous simulations. More...
 
bool m_specHP_dealiasing
 Flag to determine if dealisising is usde for the Spectral/hp element discretisation. More...
 
enum MultiRegions::ProjectionType m_projectionType
 Type of projection; e.g continuous or discontinuous. More...
 
Array< OneD, Array< OneD,
NekDouble > > 
m_traceNormals
 Array holding trace normals for DG simulations in the forwards direction. More...
 
Array< OneD, Array< OneD,
Array< OneD, NekDouble > > > 
m_gradtan
 1 x nvariable x nq More...
 
Array< OneD, Array< OneD,
Array< OneD, NekDouble > > > 
m_tanbasis
 2 x m_spacedim x nq More...
 
Array< OneD, bool > m_checkIfSystemSingular
 Flag to indicate if the fields should be checked for singularity. More...
 
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
 Map to identify relevant solver info to dump in output fields. More...
 
int m_NumQuadPointsError
 Number of Quadrature points used to work out the error. More...
 
enum HomogeneousType m_HomogeneousType
 
NekDouble m_LhomX
 physical length in X direction (if homogeneous) More...
 
NekDouble m_LhomY
 physical length in Y direction (if homogeneous) More...
 
NekDouble m_LhomZ
 physical length in Z direction (if homogeneous) More...
 
int m_npointsX
 number of points in X direction (if homogeneous) More...
 
int m_npointsY
 number of points in Y direction (if homogeneous) More...
 
int m_npointsZ
 number of points in Z direction (if homogeneous) More...
 
int m_HomoDirec
 number of homogenous directions More...
 

Detailed Description

Definition at line 58 of file EulerCFE.h.

Constructor & Destructor Documentation

Nektar::EulerCFE::~EulerCFE ( )
virtual

problem type selector

Destructor for EulerCFE class.

Definition at line 97 of file EulerCFE.cpp.

98  {
99  }
Nektar::EulerCFE::EulerCFE ( const LibUtilities::SessionReaderSharedPtr pSession)
protected

Definition at line 54 of file EulerCFE.cpp.

56  : CompressibleFlowSystem(pSession)
57  {
58  }
CompressibleFlowSystem(const LibUtilities::SessionReaderSharedPtr &pSession)

Member Function Documentation

static SolverUtils::EquationSystemSharedPtr Nektar::EulerCFE::create ( const LibUtilities::SessionReaderSharedPtr pSession)
inlinestatic

Creates an instance of this class.

Definition at line 64 of file EulerCFE.h.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

66  {
68  p->InitObject();
69  return p;
70  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
boost::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
void Nektar::EulerCFE::DoOdeProjection ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray,
const NekDouble  time 
)
protected

Compute the projection and call the method for imposing the boundary conditions in case of discontinuous projection.

Definition at line 175 of file EulerCFE.cpp.

References ASSERTL0, Nektar::MultiRegions::eDiscontinuous, Nektar::MultiRegions::eGalerkin, Nektar::MultiRegions::eMixed_CG_Discontinuous, Nektar::SolverUtils::EquationSystem::GetNpoints(), Nektar::SolverUtils::EquationSystem::m_projectionType, SetBoundaryConditions(), and Vmath::Vcopy().

Referenced by v_InitObject().

179  {
180  int i;
181  int nvariables = inarray.num_elements();
182 
183  switch (m_projectionType)
184  {
186  {
187  // Just copy over array
188  int npoints = GetNpoints();
189 
190  for(i = 0; i < nvariables; ++i)
191  {
192  Vmath::Vcopy(npoints, inarray[i], 1, outarray[i], 1);
193  }
194  SetBoundaryConditions(outarray, time);
195  break;
196  }
199  {
200  ASSERTL0(false, "No Continuous Galerkin for Euler equations");
201  break;
202  }
203  default:
204  ASSERTL0(false, "Unknown projection scheme");
205  break;
206  }
207  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
SOLVER_UTILS_EXPORT int GetNpoints()
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
void SetBoundaryConditions(Array< OneD, Array< OneD, NekDouble > > &physarray, NekDouble time)
Set boundary conditions which can be: a) Wall and Symmerty BCs implemented at CompressibleFlowSystem ...
Definition: EulerCFE.cpp:220
void Nektar::EulerCFE::DoOdeRhs ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray,
const NekDouble  time 
)
protected

Compute the right-hand side.

Definition at line 144 of file EulerCFE.cpp.

References Nektar::SolverUtils::EquationSystem::GetNpoints(), Nektar::CompressibleFlowSystem::m_advection, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::CompressibleFlowSystem::m_forcing, Nektar::SolverUtils::EquationSystem::m_spacedim, and Vmath::Neg().

Referenced by v_InitObject().

148  {
149  int i;
150  int nvariables = inarray.num_elements();
151  int npoints = GetNpoints();
152 
153  Array<OneD, Array<OneD, NekDouble> > advVel(m_spacedim);
154 
155  m_advection->Advect(nvariables, m_fields, advVel, inarray,
156  outarray, time);
157 
158  for (i = 0; i < nvariables; ++i)
159  {
160  Vmath::Neg(npoints, outarray[i], 1);
161  }
162 
163  // Add sponge layer if defined in the session file
164  std::vector<SolverUtils::ForcingSharedPtr>::const_iterator x;
165  for (x = m_forcing.begin(); x != m_forcing.end(); ++x)
166  {
167  (*x)->Apply(m_fields, inarray, outarray, time);
168  }
169  }
int m_spacedim
Spatial dimension (>= expansion dim).
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:382
SolverUtils::AdvectionSharedPtr m_advection
SOLVER_UTILS_EXPORT int GetNpoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
void Nektar::EulerCFE::EvaluateIsentropicVortex ( const Array< OneD, NekDouble > &  x,
const Array< OneD, NekDouble > &  y,
const Array< OneD, NekDouble > &  z,
Array< OneD, Array< OneD, NekDouble > > &  u,
NekDouble  time,
const int  o = 0 
)
private

Isentropic Vortex Test Case.

Definition at line 299 of file EulerCFE.cpp.

References Nektar::CompressibleFlowSystem::m_gamma, Nektar::SolverUtils::EquationSystem::m_spacedim, and Vmath::Zero().

Referenced by GetExactIsentropicVortex(), SetBoundaryIsentropicVortex(), and SetInitialIsentropicVortex().

306  {
307  int nq = x.num_elements();
308 
309  // Flow parameters
310  const NekDouble x0 = 5.0;
311  const NekDouble y0 = 0.0;
312  const NekDouble beta = 5.0;
313  const NekDouble u0 = 1.0;
314  const NekDouble v0 = 0.5;
315  const NekDouble gamma = m_gamma;
316  NekDouble r, xbar, ybar, tmp;
317  NekDouble fac = 1.0/(16.0*gamma*M_PI*M_PI);
318 
319  // In 3D zero rhow field.
320  if (m_spacedim == 3)
321  {
322  Vmath::Zero(nq, &u[3][o], 1);
323  }
324 
325  // Fill storage
326  for (int i = 0; i < nq; ++i)
327  {
328  xbar = x[i] - u0*time - x0;
329  ybar = y[i] - v0*time - y0;
330  r = sqrt(xbar*xbar + ybar*ybar);
331  tmp = beta*exp(1-r*r);
332  u[0][i+o] = pow(1.0 - (gamma-1.0)*tmp*tmp*fac, 1.0/(gamma-1.0));
333  u[1][i+o] = u[0][i+o]*(u0 - tmp*ybar/(2*M_PI));
334  u[2][i+o] = u[0][i+o]*(v0 + tmp*xbar/(2*M_PI));
335  u[m_spacedim+1][i+o] = pow(u[0][i+o], gamma)/(gamma-1.0) +
336  0.5*(u[1][i+o]*u[1][i+o] + u[2][i+o]*u[2][i+o]) / u[0][i+o];
337  }
338  }
int m_spacedim
Spatial dimension (>= expansion dim).
double NekDouble
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:359
void Nektar::EulerCFE::GetExactIsentropicVortex ( int  field,
Array< OneD, NekDouble > &  outarray,
NekDouble  time 
)
private

Compute the exact solution for the isentropic vortex problem.

Definition at line 343 of file EulerCFE.cpp.

References EvaluateIsentropicVortex(), Nektar::SolverUtils::EquationSystem::GetTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::EquationSystem::m_spacedim, and Vmath::Vcopy().

Referenced by v_EvaluateExactSolution().

347  {
348  int nTotQuadPoints = GetTotPoints();
349  Array<OneD, NekDouble> x(nTotQuadPoints);
350  Array<OneD, NekDouble> y(nTotQuadPoints);
351  Array<OneD, NekDouble> z(nTotQuadPoints);
352  Array<OneD, Array<OneD, NekDouble> > u(m_spacedim+2);
353 
354  m_fields[0]->GetCoords(x, y, z);
355 
356  for (int i = 0; i < m_spacedim + 2; ++i)
357  {
358  u[i] = Array<OneD, NekDouble>(nTotQuadPoints);
359  }
360 
361  EvaluateIsentropicVortex(x, y, z, u, time);
362 
363  Vmath::Vcopy(nTotQuadPoints, u[field], 1, outarray, 1);
364  }
void EvaluateIsentropicVortex(const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &y, const Array< OneD, NekDouble > &z, Array< OneD, Array< OneD, NekDouble > > &u, NekDouble time, const int o=0)
Isentropic Vortex Test Case.
Definition: EulerCFE.cpp:299
SOLVER_UTILS_EXPORT int GetTotPoints()
int m_spacedim
Spatial dimension (>= expansion dim).
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
void Nektar::EulerCFE::GetExactRinglebFlow ( int  field,
Array< OneD, NekDouble > &  outarray 
)
private

Ringleb Flow Test Case.

Compute the exact solution for the Ringleb flow problem.

Definition at line 441 of file EulerCFE.cpp.

References ASSERTL0, Nektar::SolverUtils::EquationSystem::GetTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, and Nektar::CompressibleFlowSystem::m_gamma.

Referenced by v_EvaluateExactSolution().

444  {
445  int nTotQuadPoints = GetTotPoints();
446 
447  Array<OneD, NekDouble> rho(nTotQuadPoints, 100.0);
448  Array<OneD, NekDouble> rhou(nTotQuadPoints);
449  Array<OneD, NekDouble> rhov(nTotQuadPoints);
450  Array<OneD, NekDouble> E(nTotQuadPoints);
451  Array<OneD, NekDouble> x(nTotQuadPoints);
452  Array<OneD, NekDouble> y(nTotQuadPoints);
453  Array<OneD, NekDouble> z(nTotQuadPoints);
454 
455  m_fields[0]->GetCoords(x, y, z);
456 
457  // Flow parameters
458  NekDouble c, k, phi, r, J, VV, pp, sint, P, ss;
459  NekDouble J11, J12, J21, J22, det;
460  NekDouble Fx, Fy;
461  NekDouble xi, yi;
462  NekDouble dV;
463  NekDouble dtheta;
464  NekDouble par1;
465  NekDouble theta = M_PI / 4.0;
466  NekDouble kExt = 0.7;
467  NekDouble V = kExt * sin(theta);
468  NekDouble toll = 1.0e-8;
469  NekDouble errV = 1.0;
470  NekDouble errTheta = 1.0;
471  NekDouble gamma = m_gamma;
472  NekDouble gamma_1_2 = (gamma - 1.0) / 2.0;
473 
474  for (int i = 0; i < nTotQuadPoints; ++i)
475  {
476  while ((abs(errV) > toll) || (abs(errTheta) > toll))
477  {
478  VV = V * V;
479  sint = sin(theta);
480  c = sqrt(1.0 - gamma_1_2 * VV);
481  k = V / sint;
482  phi = 1.0 / k;
483  pp = phi * phi;
484  J = 1.0 / c + 1.0 / (3.0 * c * c * c) +
485  1.0 / (5.0 * c * c * c * c * c) -
486  0.5 * log((1.0 + c) / (1.0 - c));
487 
488  r = pow(c, 1.0 / gamma_1_2);
489  xi = 1.0 / (2.0 * r) * (1.0 / VV - 2.0 * pp) + J / 2.0;
490  yi = phi / (r * V) * sqrt(1.0 - VV * pp);
491  par1 = 25.0 - 5.0 * VV;
492  ss = sint * sint;
493 
494  Fx = xi - x[i];
495  Fy = yi - y[i];
496 
497  J11 = 39062.5 / pow(par1, 3.5) * (1.0 / VV - 2.0 / VV * ss) *
498  V + 1562.5 / pow(par1, 2.5) * (-2.0 / (VV * V) + 4.0 /
499  (VV * V) * ss) + 12.5 / pow(par1, 1.5) * V + 312.5 /
500  pow(par1, 2.5) * V + 7812.5 / pow(par1, 3.5) * V -
501  0.25 * (-1.0 / pow(par1, 0.5) * V/(1.0 - 0.2 *
502  pow(par1, 0.5)) - (1.0 + 0.2 * pow(par1, 0.5)) /
503  pow((1.0 - 0.2 * pow(par1, 0.5)), 2.0) /
504  pow(par1, 0.5) * V) / (1.0 + 0.2 * pow(par1, 0.5)) *
505  (1.0 - 0.2 * pow(par1, 0.5));
506 
507  J12 = -6250.0 / pow(par1, 2.5) / VV * sint * cos(theta);
508  J21 = -6250.0 / (VV * V) * sint /
509  pow(par1, 2.5) * pow((1.0 - ss), 0.5) +
510  78125.0 / V * sint / pow(par1, 3.5) *
511  pow((1.0 - ss), 0.5);
512 
513  // the matrix is singular when theta = pi/2
514  if(abs(y[i])<toll && abs(cos(theta))<toll)
515  {
516  J22 = -39062.5 / pow(par1, 3.5) / V + 3125 /
517  pow(par1, 2.5) / (VV * V) + 12.5 / pow(par1, 1.5) *
518  V + 312.5 / pow(par1, 2.5) * V + 7812.5 /
519  pow(par1, 3.5) * V - 0.25 * (-1.0 / pow(par1, 0.5) *
520  V / (1.0 - 0.2 * pow(par1, 0.5)) - (1.0 + 0.2 *
521  pow(par1, 0.5)) / pow((1.0 - 0.2 *
522  pow(par1, 0.5)), 2.0) / pow(par1, 0.5) * V) /
523  (1.0 + 0.2 * pow(par1, 0.5)) * (1.0 - 0.2 *
524  pow(par1,0.5));
525 
526  // dV = -dV/dx * Fx
527  dV = -1.0 / J22 * Fx;
528  dtheta = 0.0;
529  theta = M_PI / 2.0;
530  }
531  else
532  {
533  J22 = 3125.0 / VV * cos(theta) / pow(par1, 2.5) *
534  pow((1.0 - ss), 0.5) - 3125.0 / VV * ss /
535  pow(par1, 2.5) / pow((1.0 - ss), 0.5) * cos(theta);
536 
537  det = -1.0 / (J11 * J22 - J12 * J21);
538 
539  // [dV dtheta]' = -[invJ]*[Fx Fy]'
540  dV = det * ( J22 * Fx - J12 * Fy);
541  dtheta = det * (-J21 * Fx + J11 * Fy);
542  }
543 
544  V = V + dV;
545  theta = theta + dtheta;
546 
547  errV = abs(dV);
548  errTheta = abs(dtheta);
549 
550  }
551 
552  c = sqrt(1.0 - gamma_1_2 * VV);
553  r = pow(c, 1.0 / gamma_1_2);
554 
555  rho[i] = r;
556  rhou[i] = rho[i] * V * cos(theta);
557  rhov[i] = rho[i] * V * sin(theta);
558  P = (c * c) * rho[i] / gamma;
559  E[i] = P / (gamma - 1.0) + 0.5 *
560  (rhou[i] * rhou[i] / rho[i] + rhov[i] * rhov[i] / rho[i]);
561 
562  // Resetting the guess value
563  errV = 1.0;
564  errTheta = 1.0;
565  theta = M_PI/4.0;
566  V = kExt*sin(theta);
567  }
568 
569  switch (field)
570  {
571  case 0:
572  outarray = rho;
573  break;
574  case 1:
575  outarray = rhou;
576  break;
577  case 2:
578  outarray = rhov;
579  break;
580  case 3:
581  outarray = E;
582  break;
583  default:
584  ASSERTL0(false, "Error in variable number!");
585  break;
586  }
587  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
SOLVER_UTILS_EXPORT int GetTotPoints()
double NekDouble
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void Nektar::EulerCFE::SetBoundaryConditions ( Array< OneD, Array< OneD, NekDouble > > &  inarray,
NekDouble  time 
)
private

Set boundary conditions which can be: a) Wall and Symmerty BCs implemented at CompressibleFlowSystem level since they are compressible solver specific; b) Isentropic vortex and Ringleb flow BCs implemented at EulerCFE level since they are Euler solver specific; c) Time dependent BCs.

Parameters
inarrayfields array.
timetime.

Definition at line 220 of file EulerCFE.cpp.

References ASSERTL0, Nektar::SolverUtils::EquationSystem::GetTraceTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, SetBoundaryIsentropicVortex(), SetBoundaryRinglebFlow(), and Nektar::CompressibleFlowSystem::SetCommonBC().

Referenced by DoOdeProjection().

223  {
224  std::string varName;
225  int cnt = 0;
226  int nvariables = inarray.num_elements();
227  int nTracePts = GetTraceTotPoints();
228 
229  Array<OneD, Array<OneD, NekDouble> > Fwd(nvariables);
230  for (int i = 0; i < nvariables; ++i)
231  {
232  Fwd[i] = Array<OneD, NekDouble>(nTracePts);
233  m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
234  }
235 
236  std::string userDefStr;
237  int nreg = m_fields[0]->GetBndConditions().num_elements();
238  // Loop over Boundary Regions
239  for (int n = 0; n < nreg; ++n)
240  {
241  userDefStr = m_fields[0]->GetBndConditions()[n]->GetUserDefined();
242  if(!userDefStr.empty())
243  {
244  if(boost::iequals(userDefStr,"WallViscous"))
245  {
246  ASSERTL0(false, "WallViscous is a wrong bc for the "
247  "Euler equations");
248  }
249  else if(boost::iequals(userDefStr, "IsentropicVortex"))
250  {
251  // Isentropic Vortex Boundary Condition
252  SetBoundaryIsentropicVortex(n, time, cnt, Fwd, inarray);
253  }
254  else if (boost::iequals(userDefStr,"RinglebFlow"))
255  {
256  SetBoundaryRinglebFlow(n, time, cnt, Fwd, inarray);
257  }
258  else
259  {
260  // set up userdefined BC common to all solvers
261  SetCommonBC(userDefStr, n, time, cnt, Fwd, inarray);
262  }
263  }
264 
265  // no User Defined conditions provided so skip cnt
266  cnt += m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
267  }
268  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
void SetBoundaryIsentropicVortex(int bcRegion, NekDouble time, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
Set the boundary conditions for the isentropic vortex problem.
Definition: EulerCFE.cpp:399
void SetBoundaryRinglebFlow(int bcRegion, NekDouble time, int cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &physarray)
Set the boundary conditions for the Ringleb flow problem.
Definition: EulerCFE.cpp:836
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void SetCommonBC(const std::string &userDefStr, const int n, const NekDouble time, int &cnt, Array< OneD, Array< OneD, NekDouble > > &Fwd, Array< OneD, Array< OneD, NekDouble > > &inarray)
Set boundary conditions which can be: a) Wall and Symmerty BCs implemented at CompressibleFlowSystem ...
void Nektar::EulerCFE::SetBoundaryIsentropicVortex ( int  bcRegion,
NekDouble  time,
int  cnt,
Array< OneD, Array< OneD, NekDouble > > &  Fwd,
Array< OneD, Array< OneD, NekDouble > > &  physarray 
)
private

Set the boundary conditions for the isentropic vortex problem.

Definition at line 399 of file EulerCFE.cpp.

References EvaluateIsentropicVortex(), Nektar::SolverUtils::EquationSystem::m_fields, and Vmath::Vcopy().

Referenced by SetBoundaryConditions().

405  {
406  int nvariables = physarray.num_elements();
407  const Array<OneD, const int> &bndTraceMap = m_fields[0]->GetTraceBndMap();
408 
409  int id2, e_max;
410  e_max = m_fields[0]->GetBndCondExpansions()[bcRegion]->GetExpSize();
411 
412  for(int e = 0; e < e_max; ++e)
413  {
414  int npoints = m_fields[0]->
415  GetBndCondExpansions()[bcRegion]->GetExp(e)->GetTotPoints();
416  int id1 = m_fields[0]->
417  GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
418  id2 = m_fields[0]->GetTrace()->GetPhys_Offset(bndTraceMap[cnt++]);
419 
420  Array<OneD,NekDouble> x(npoints, 0.0);
421  Array<OneD,NekDouble> y(npoints, 0.0);
422  Array<OneD,NekDouble> z(npoints, 0.0);
423 
424  m_fields[0]->GetBndCondExpansions()[bcRegion]->
425  GetExp(e)->GetCoords(x, y, z);
426 
427  EvaluateIsentropicVortex(x, y, z, Fwd, time, id2);
428 
429  for (int i = 0; i < nvariables; ++i)
430  {
431  Vmath::Vcopy(npoints, &Fwd[i][id2], 1,
432  &(m_fields[i]->GetBndCondExpansions()[bcRegion]->
433  UpdatePhys())[id1], 1);
434  }
435  }
436  }
void EvaluateIsentropicVortex(const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &y, const Array< OneD, NekDouble > &z, Array< OneD, Array< OneD, NekDouble > > &u, NekDouble time, const int o=0)
Isentropic Vortex Test Case.
Definition: EulerCFE.cpp:299
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
void Nektar::EulerCFE::SetBoundaryRinglebFlow ( int  bcRegion,
NekDouble  time,
int  cnt,
Array< OneD, Array< OneD, NekDouble > > &  Fwd,
Array< OneD, Array< OneD, NekDouble > > &  physarray 
)
private

Set the boundary conditions for the Ringleb flow problem.

Definition at line 836 of file EulerCFE.cpp.

References Nektar::LibUtilities::eFunctionTypeFile, Nektar::SolverUtils::EquationSystem::eHomogeneous1D, Nektar::SolverUtils::EquationSystem::GetTraceTotPoints(), Nektar::SolverUtils::EquationSystem::m_expdim, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::CompressibleFlowSystem::m_gamma, Nektar::SolverUtils::EquationSystem::m_HomogeneousType, Nektar::SolverUtils::EquationSystem::m_session, and Vmath::Vcopy().

Referenced by SetBoundaryConditions().

842  {
843  int nvariables = physarray.num_elements();
844 
845  // For 3DHomogenoeus1D
846  int n_planes = 1;
848  {
849  int nPointsTot = m_fields[0]->GetTotPoints();
850  int nPointsTot_plane = m_fields[0]->GetPlane(0)->GetTotPoints();
851  n_planes = nPointsTot/nPointsTot_plane;
852  }
853 
854  int id2, id2_plane, e_max;
855 
856  e_max = m_fields[0]->GetBndCondExpansions()[bcRegion]->GetExpSize();
857 
858  for(int e = 0; e < e_max; ++e)
859  {
860  int npoints = m_fields[0]->
861  GetBndCondExpansions()[bcRegion]->GetExp(e)->GetTotPoints();
862  int id1 = m_fields[0]->
863  GetBndCondExpansions()[bcRegion]->GetPhys_Offset(e);
864 
865  // For 3DHomogenoeus1D
867  {
868  int cnt_plane = cnt/n_planes;
869  int e_plane;
870  int e_max_plane = e_max/n_planes;
871  int nTracePts_plane = GetTraceTotPoints();
872 
873  int planeID = floor((e + 0.5 )/ e_max_plane );
874  e_plane = e - e_max_plane*planeID;
875 
876  id2_plane = m_fields[0]->GetTrace()->GetPhys_Offset(
877  m_fields[0]->GetTraceMap()->
878  GetBndCondCoeffsToGlobalCoeffsMap(
879  cnt_plane + e_plane));
880  id2 = id2_plane + planeID*nTracePts_plane;
881  }
882  else // For general case
883  {
884  id2 = m_fields[0]->
885  GetTrace()->GetPhys_Offset(m_fields[0]->GetTraceMap()->
886  GetBndCondTraceToGlobalTraceMap(cnt++));
887  }
888 
889  Array<OneD,NekDouble> x0(npoints, 0.0);
890  Array<OneD,NekDouble> x1(npoints, 0.0);
891  Array<OneD,NekDouble> x2(npoints, 0.0);
892 
893  m_fields[0]->GetBndCondExpansions()[bcRegion]->
894  GetExp(e)->GetCoords(x0, x1, x2);
895 
896  // Flow parameters
897  NekDouble c, k, phi, r, J, VV, pp, sint, P, ss;
898  NekDouble J11, J12, J21, J22, det;
899  NekDouble Fx, Fy;
900  NekDouble xi, yi;
901  NekDouble dV;
902  NekDouble dtheta;
903  NekDouble par1;
904  NekDouble theta = M_PI / 4.0;
905  NekDouble kExt = 0.7;
906  NekDouble V = kExt * sin(theta);
907  NekDouble toll = 1.0e-8;
908  NekDouble errV = 1.0;
909  NekDouble errTheta = 1.0;
910  NekDouble gamma = m_gamma;
911  NekDouble gamma_1_2 = (gamma - 1.0) / 2.0;
912 
913  // Loop on all the points of that edge
914  for (int j = 0; j < npoints; j++)
915  {
916 
917  while ((abs(errV) > toll) || (abs(errTheta) > toll))
918  {
919  VV = V * V;
920  sint = sin(theta);
921  c = sqrt(1.0 - gamma_1_2 * VV);
922  k = V / sint;
923  phi = 1.0 / k;
924  pp = phi * phi;
925  J = 1.0 / c + 1.0 / (3.0 * c * c * c) +
926  1.0 / (5.0 * c * c * c * c * c) -
927  0.5 * log((1.0 + c) / (1.0 - c));
928 
929  r = pow(c, 1.0 / gamma_1_2);
930  xi = 1.0 / (2.0 * r) * (1.0 / VV - 2.0 * pp) + J / 2.0;
931  yi = phi / (r * V) * sqrt(1.0 - VV * pp);
932  par1 = 25.0 - 5.0 * VV;
933  ss = sint * sint;
934 
935  Fx = xi - x0[j];
936  Fy = yi - x1[j];
937 
938  J11 = 39062.5 / pow(par1, 3.5) *
939  (1.0 / VV - 2.0 / VV * ss) * V + 1562.5 /
940  pow(par1, 2.5) * (-2.0 / (VV * V) + 4.0 /
941  (VV * V) * ss) + 12.5 / pow(par1, 1.5) * V +
942  312.5 / pow(par1, 2.5) * V + 7812.5 /
943  pow(par1, 3.5) * V - 0.25 *
944  (-1.0 / pow(par1, 0.5) * V / (1.0 - 0.2 *
945  pow(par1, 0.5)) - (1.0 + 0.2 * pow(par1, 0.5)) /
946  pow((1.0 - 0.2 * pow(par1, 0.5)), 2.0) /
947  pow(par1, 0.5) * V) / (1.0 + 0.2 * pow(par1, 0.5)) *
948  (1.0 - 0.2 * pow(par1, 0.5));
949 
950  J12 = -6250.0 / pow(par1, 2.5) / VV * sint * cos(theta);
951  J21 = -6250.0 / (VV * V) * sint / pow(par1, 2.5) *
952  pow((1.0 - ss), 0.5) + 78125.0 / V * sint /
953  pow(par1, 3.5) * pow((1.0 - ss), 0.5);
954 
955  // the matrix is singular when theta = pi/2
956  if (abs(x1[j]) < toll && abs(cos(theta)) < toll)
957  {
958  J22 = -39062.5 / pow(par1, 3.5) / V + 3125 /
959  pow(par1, 2.5) / (VV * V) + 12.5 /
960  pow(par1, 1.5) * V + 312.5 / pow(par1, 2.5) *
961  V + 7812.5 / pow(par1, 3.5) * V - 0.25 *
962  (-1.0 / pow(par1, 0.5) * V / (1.0 - 0.2 *
963  pow(par1, 0.5)) - (1.0 + 0.2 * pow(par1, 0.5)) /
964  pow((1.0 - 0.2 * pow(par1, 0.5)), 2.0) /
965  pow(par1, 0.5) * V) / (1.0 + 0.2 *
966  pow(par1, 0.5)) * (1.0 - 0.2 * pow(par1, 0.5));
967 
968  // dV = -dV/dx * Fx
969  dV = -1.0 / J22 * Fx;
970  dtheta = 0.0;
971  theta = M_PI / 2.0;
972  }
973  else
974  {
975  J22 = 3125.0 / VV * cos(theta) / pow(par1, 2.5) *
976  pow((1.0 - ss), 0.5) - 3125.0 / VV * ss /
977  pow(par1, 2.5) / pow((1.0 - ss), 0.5) *
978  cos(theta);
979 
980  det = -1.0 / (J11 * J22 - J12 * J21);
981 
982  // [dV dtheta]' = -[invJ]*[Fx Fy]'
983  dV = det * ( J22 * Fx - J12 * Fy);
984  dtheta = det * (-J21 * Fx + J11 * Fy);
985  }
986 
987  V = V + dV;
988  theta = theta + dtheta;
989 
990  errV = abs(dV);
991  errTheta = abs(dtheta);
992  }
993 
994  c = sqrt(1.0 - gamma_1_2 * VV);
995  int kk = id2 + j;
996  NekDouble timeramp = 200.0;
997  std::string restartstr = "RESTART";
998  if (time<timeramp &&
999  !(m_session->DefinesFunction("InitialConditions") &&
1000  m_session->GetFunctionType("InitialConditions", 0) ==
1002  {
1003  Fwd[0][kk] = pow(c, 1.0 / gamma_1_2) *
1004  exp(-1.0 + time /timeramp);
1005 
1006  Fwd[1][kk] = Fwd[0][kk] * V * cos(theta) *
1007  exp(-1 + time / timeramp);
1008 
1009  Fwd[2][kk] = Fwd[0][kk] * V * sin(theta) *
1010  exp(-1 + time / timeramp);
1011  }
1012  else
1013  {
1014  Fwd[0][kk] = pow(c, 1.0 / gamma_1_2);
1015  Fwd[1][kk] = Fwd[0][kk] * V * cos(theta);
1016  Fwd[2][kk] = Fwd[0][kk] * V * sin(theta);
1017  }
1018 
1019  P = (c * c) * Fwd[0][kk] / gamma;
1020  Fwd[3][kk] = P / (gamma - 1.0) + 0.5 *
1021  (Fwd[1][kk] * Fwd[1][kk] / Fwd[0][kk] +
1022  Fwd[2][kk] * Fwd[2][kk] / Fwd[0][kk]);
1023 
1024  errV = 1.0;
1025  errTheta = 1.0;
1026  theta = M_PI / 4.0;
1027  V = kExt * sin(theta);
1028  }
1029 
1030  for (int i = 0; i < nvariables; ++i)
1031  {
1032  Vmath::Vcopy(npoints, &Fwd[i][id2], 1,
1033  &(m_fields[i]->GetBndCondExpansions()[bcRegion]->
1034  UpdatePhys())[id1],1);
1035  }
1036  }
1037  }
int m_expdim
Expansion dimension.
double NekDouble
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
enum HomogeneousType m_HomogeneousType
void Nektar::EulerCFE::SetInitialIsentropicVortex ( NekDouble  initialtime)
private

Set the initial condition for the isentropic vortex problem.

Definition at line 369 of file EulerCFE.cpp.

References EvaluateIsentropicVortex(), Nektar::SolverUtils::EquationSystem::GetTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::EquationSystem::m_spacedim, and Vmath::Vcopy().

Referenced by v_SetInitialConditions().

370  {
371  int nTotQuadPoints = GetTotPoints();
372  Array<OneD, NekDouble> x(nTotQuadPoints);
373  Array<OneD, NekDouble> y(nTotQuadPoints);
374  Array<OneD, NekDouble> z(nTotQuadPoints);
375  Array<OneD, Array<OneD, NekDouble> > u(m_spacedim+2);
376 
377  m_fields[0]->GetCoords(x, y, z);
378 
379  for (int i = 0; i < m_spacedim + 2; ++i)
380  {
381  u[i] = Array<OneD, NekDouble>(nTotQuadPoints);
382  }
383 
384  EvaluateIsentropicVortex(x, y, z, u, initialtime);
385 
386  // Forward transform to fill the coefficient space
387  for(int i = 0; i < m_fields.num_elements(); ++i)
388  {
389  Vmath::Vcopy(nTotQuadPoints, u[i], 1, m_fields[i]->UpdatePhys(), 1);
390  m_fields[i]->SetPhysState(true);
391  m_fields[i]->FwdTrans(m_fields[i]->GetPhys(),
392  m_fields[i]->UpdateCoeffs());
393  }
394  }
void EvaluateIsentropicVortex(const Array< OneD, NekDouble > &x, const Array< OneD, NekDouble > &y, const Array< OneD, NekDouble > &z, Array< OneD, Array< OneD, NekDouble > > &u, NekDouble time, const int o=0)
Isentropic Vortex Test Case.
Definition: EulerCFE.cpp:299
SOLVER_UTILS_EXPORT int GetTotPoints()
int m_spacedim
Spatial dimension (>= expansion dim).
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1047
void Nektar::EulerCFE::SetInitialRinglebFlow ( void  )
private

Set the initial condition for the Ringleb flow problem.

Definition at line 592 of file EulerCFE.cpp.

References Nektar::SolverUtils::EquationSystem::m_fields, Nektar::CompressibleFlowSystem::m_gamma, Nektar::SolverUtils::EquationSystem::m_sessionName, and Nektar::SolverUtils::EquationSystem::WriteFld().

593  {
594  // Get number of different boundaries in the input file
595  int nbnd = m_fields[0]->GetBndConditions().num_elements();
596 
597  // Loop on all the edges of the input file
598  for(int bcRegion=0; bcRegion < nbnd; ++bcRegion)
599  {
600 
601  int npoints = m_fields[0]->
602  GetBndCondExpansions()[bcRegion]->GetNpoints();
603 
604  Array<OneD,NekDouble> x0(npoints, 0.0);
605  Array<OneD,NekDouble> x1(npoints, 0.0);
606  Array<OneD,NekDouble> x2(npoints, 0.0);
607 
608  Array<OneD, NekDouble> rho(npoints, 0.0);
609  Array<OneD, NekDouble> rhou(npoints, 0.0);
610  Array<OneD, NekDouble> rhov(npoints, 0.0);
611  Array<OneD, NekDouble> E(npoints, 0.0);
612 
613  m_fields[0]->GetBndCondExpansions()[bcRegion]->
614  GetCoords(x0, x1, x2);
615 
616  // Flow parameters
617  NekDouble c, k, phi, r, J, VV, pp, sint, P, ss;
618  NekDouble J11, J12, J21, J22, det;
619  NekDouble Fx, Fy;
620  NekDouble xi, yi;
621  NekDouble dV;
622  NekDouble dtheta;
623  NekDouble par1;
624  NekDouble theta = M_PI / 4.0;
625  NekDouble kExt = 0.7;
626  NekDouble V = kExt * sin(theta);
627  NekDouble toll = 1.0e-8;
628  NekDouble errV = 1.0;
629  NekDouble errTheta = 1.0;
630  NekDouble gamma = m_gamma;
631  NekDouble gamma_1_2 = (gamma - 1.0) / 2.0;
632 
633  // Loop on all the points of that edge
634  for (int j = 0; j < npoints; j++)
635  {
636  while ((abs(errV) > toll) || (abs(errTheta) > toll))
637  {
638 
639  VV = V * V;
640  sint = sin(theta);
641  c = sqrt(1.0 - gamma_1_2 * VV);
642  k = V / sint;
643  phi = 1.0 / k;
644  pp = phi * phi;
645  J = 1.0 / c + 1.0 / (3.0 * c * c * c) +
646  1.0 / (5.0 * c * c * c * c * c) -
647  0.5 * log((1.0 + c) / (1.0 - c));
648 
649  r = pow(c, 1.0 / gamma_1_2);
650  xi = 1.0 / (2.0 * r) * (1.0 / VV - 2.0 * pp) + J / 2.0;
651  yi = phi / (r * V) * sqrt(1.0 - VV * pp);
652  par1 = 25.0 - 5.0 * VV;
653  ss = sint * sint;
654 
655  Fx = xi - x0[j];
656  Fy = yi - x1[j];
657 
658  J11 = 39062.5 / pow(par1, 3.5) *
659  (1.0 / VV - 2.0 / VV * ss) * V +
660  1562.5 / pow(par1, 2.5) * (-2.0 /
661  (VV * V) + 4.0 / (VV * V) * ss) +
662  12.5 / pow(par1, 1.5) * V +
663  312.5 / pow(par1, 2.5) * V +
664  7812.5 / pow(par1, 3.5) * V -
665  0.25 * (-1.0 / pow(par1, 0.5) * V /
666  (1.0 - 0.2 * pow(par1, 0.5)) - (1.0 + 0.2 *
667  pow(par1, 0.5)) / pow((1.0 - 0.2 *
668  pow(par1, 0.5)), 2.0) /
669  pow(par1, 0.5) * V) /
670  (1.0 + 0.2 * pow(par1, 0.5)) *
671  (1.0 - 0.2 * pow(par1, 0.5));
672 
673  J12 = -6250.0 / pow(par1, 2.5) / VV * sint * cos(theta);
674  J21 = -6250.0 / (VV * V) * sint / pow(par1, 2.5) *
675  pow((1.0 - ss), 0.5) + 78125.0 / V * sint /
676  pow(par1, 3.5) * pow((1.0 - ss), 0.5);
677 
678  // the matrix is singular when theta = pi/2
679  if (abs(x1[j]) < toll && abs(cos(theta)) < toll)
680  {
681 
682  J22 = -39062.5 / pow(par1, 3.5) / V +
683  3125 / pow(par1, 2.5) / (VV * V) + 12.5 /
684  pow(par1, 1.5) * V + 312.5 / pow(par1, 2.5) * V +
685  7812.5 / pow(par1, 3.5) * V -
686  0.25 * (-1.0 / pow(par1, 0.5) * V /
687  (1.0 - 0.2 * pow(par1, 0.5)) -
688  (1.0 + 0.2 * pow(par1, 0.5)) /
689  pow((1.0 - 0.2* pow(par1, 0.5)), 2.0) /
690  pow(par1, 0.5) *V) /
691  (1.0 + 0.2 * pow(par1, 0.5)) *
692  (1.0 - 0.2 * pow(par1, 0.5));
693 
694  // dV = -dV/dx * Fx
695  dV = -1.0 / J22 * Fx;
696  dtheta = 0.0;
697  theta = M_PI / 2.0;
698  }
699  else
700  {
701 
702  J22 = 3125.0 / VV * cos(theta) / pow(par1, 2.5) *
703  pow((1.0 - ss), 0.5) - 3125.0 / VV * ss /
704  pow(par1, 2.5) / pow((1.0 - ss), 0.5) *
705  cos(theta);
706 
707  det = -1.0 / (J11 * J22 - J12 * J21);
708 
709  // [dV dtheta]' = -[invJ]*[Fx Fy]'
710  dV = det * ( J22 * Fx - J12 * Fy);
711  dtheta = det * (-J21 * Fx + J11 * Fy);
712  }
713 
714  V = V + dV;
715  theta = theta + dtheta;
716 
717  errV = abs(dV);
718  errTheta = abs(dtheta);
719 
720  }
721 
722  c = sqrt(1.0 - gamma_1_2 * VV);
723  rho[j] = pow(c, 1.0 / gamma_1_2) * exp(-1.0);
724  rhou[j] = rho[j] * V * cos(theta) * exp(-1.0);
725  rhov[j] = rho[j] * V * sin(theta) * exp(-1.0);
726  P = (c * c) * rho[j] / gamma;
727  E[j] = P / (gamma - 1.0) + 0.5 *
728  (rhou[j] * rhou[j] /
729  rho[j] + rhov[j] * rhov[j] / rho[j]);
730  errV = 1.0;
731  errTheta = 1.0;
732  theta = M_PI / 4.0;
733  V = kExt * sin(theta);
734 
735  }
736 
737  // Fill the physical space
738  m_fields[0]->GetBndCondExpansions()[bcRegion]->SetPhys(rho);
739  m_fields[1]->GetBndCondExpansions()[bcRegion]->SetPhys(rhou);
740  m_fields[2]->GetBndCondExpansions()[bcRegion]->SetPhys(rhov);
741  m_fields[3]->GetBndCondExpansions()[bcRegion]->SetPhys(E);
742 
743  // Forward transform to fill the coefficients space
744  for(int i = 0; i < m_fields.num_elements(); ++i)
745  {
746  m_fields[i]->GetBndCondExpansions()[bcRegion]->
747  FwdTrans_BndConstrained(
748  m_fields[i]->GetBndCondExpansions()[bcRegion]->
749  GetPhys(),
750  m_fields[i]->GetBndCondExpansions()[bcRegion]->
751  UpdateCoeffs());
752  }
753 
754  }
755 
756  // Calculation of the initial internal values as a weighted average
757  // over the distance from the boundaries
758  int nq = m_fields[0]->GetNpoints();
759 
760  Array<OneD,NekDouble> x0(nq);
761  Array<OneD,NekDouble> x1(nq);
762  Array<OneD,NekDouble> x2(nq);
763 
764  // Get the coordinates
765  // (assuming all fields have the same discretisation)
766  m_fields[0]->GetCoords(x0, x1, x2);
767 
768  for(int j = 0; j < nq; j++)
769  {
770  NekDouble Dist = 0.0;
771  NekDouble rho = 0.0;
772  NekDouble rhou = 0.0;
773  NekDouble rhov = 0.0;
774  NekDouble E = 0.0;
775  NekDouble SumDist = 0.0;
776 
777  // Calculation of all the distances
778  // Loop on all the edges of the input file
779  for (int bcRegion = 0; bcRegion < nbnd; ++bcRegion)
780  {
781  // Get quadrature points on the edge
782  int npoints = m_fields[0]->
783  GetBndCondExpansions()[bcRegion]->GetNpoints();
784 
785  Array<OneD,NekDouble> xb0(npoints, 0.0);
786  Array<OneD,NekDouble> xb1(npoints, 0.0);
787  Array<OneD,NekDouble> xb2(npoints, 0.0);
788 
789  m_fields[0]->GetBndCondExpansions()[bcRegion]->
790  GetCoords(xb0, xb1, xb2);
791 
792  for (int k = 0; k < npoints; k++)
793  {
794  Dist = sqrt((xb0[k] - x0[j]) * (xb0[k] - x0[j]) +
795  (xb1[k] - x1[j]) * (xb1[k] - x1[j]));
796 
797  SumDist += Dist;
798  rho += Dist * (m_fields[0]->
799  GetBndCondExpansions()[bcRegion]->GetPhys())[k];
800  rhou += Dist * (m_fields[1]->
801  GetBndCondExpansions()[bcRegion]->GetPhys())[k];
802  rhov += Dist * (m_fields[2]->
803  GetBndCondExpansions()[bcRegion]->GetPhys())[k];
804  E += Dist * (m_fields[3]->
805  GetBndCondExpansions()[bcRegion]->GetPhys())[k];
806  }
807  }
808 
809  rho = rho / SumDist;
810  rhou = rhou / SumDist;
811  rhov = rhov / SumDist;
812  E = E / SumDist;
813 
814  (m_fields[0]->UpdatePhys())[j] = rho;
815  (m_fields[1]->UpdatePhys())[j] = rhou;
816  (m_fields[2]->UpdatePhys())[j] = rhov;
817  (m_fields[3]->UpdatePhys())[j] = E;
818 
819  }
820 
821  for (int i = 0 ; i < m_fields.num_elements(); i++)
822  {
823  m_fields[i]->SetPhysState(true);
824  m_fields[i]->FwdTrans(m_fields[i]->GetPhys(),
825  m_fields[i]->UpdateCoeffs());
826  }
827 
828  // Dump initial conditions to file
829  std::string outname = m_sessionName + "_initialRingleb.chk";
830  WriteFld(outname);
831  }
std::string m_sessionName
Name of the session.
double NekDouble
SOLVER_UTILS_EXPORT void WriteFld(const std::string &outname)
Write field data to the given filename.
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
void Nektar::EulerCFE::v_EvaluateExactSolution ( unsigned int  field,
Array< OneD, NekDouble > &  outfield,
const NekDouble  time = 0.0 
)
protectedvirtual

Get the exact solutions for isentropic vortex and Ringleb flow problems.

Reimplemented from Nektar::SolverUtils::EquationSystem.

Definition at line 274 of file EulerCFE.cpp.

References Nektar::eIsentropicVortex, Nektar::eRinglebFlow, GetExactIsentropicVortex(), GetExactRinglebFlow(), m_problemType, and Nektar::SolverUtils::EquationSystem::v_EvaluateExactSolution().

278  {
279  switch(m_problemType)
280  {
281  case eIsentropicVortex:
282  {
283  GetExactIsentropicVortex(field, outfield, time);
284  break;
285  }
286  case eRinglebFlow:
287  {
288  GetExactRinglebFlow(field, outfield);
289  break;
290  }
291  default:
292  {
293  EquationSystem::v_EvaluateExactSolution(field, outfield, time);
294  break;
295  }
296  }
297  }
Ringleb Flow.
Definition: EulerCFE.h:47
void GetExactIsentropicVortex(int field, Array< OneD, NekDouble > &outarray, NekDouble time)
Compute the exact solution for the isentropic vortex problem.
Definition: EulerCFE.cpp:343
void GetExactRinglebFlow(int field, Array< OneD, NekDouble > &outarray)
Ringleb Flow Test Case.
Definition: EulerCFE.cpp:441
Isentropic Vortex.
Definition: EulerCFE.h:46
ProblemType m_problemType
Definition: EulerCFE.h:77
virtual SOLVER_UTILS_EXPORT void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
void Nektar::EulerCFE::v_GenerateSummary ( SolverUtils::SummaryList s)
protectedvirtual

Print a summary of time stepping parameters.

Print out a summary with some relevant information.

Reimplemented from Nektar::CompressibleFlowSystem.

Definition at line 104 of file EulerCFE.cpp.

References Nektar::SolverUtils::AddSummaryItem(), m_problemType, Nektar::ProblemTypeMap, and Nektar::CompressibleFlowSystem::v_GenerateSummary().

105  {
108  }
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Print a summary of time stepping parameters.
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
Definition: Misc.cpp:50
ProblemType m_problemType
Definition: EulerCFE.h:77
const char *const ProblemTypeMap[]
Definition: EulerADCFE.h:50
void Nektar::EulerCFE::v_InitObject ( )
protectedvirtual

Initialization object for CompressibleFlowSystem class.

Reimplemented from Nektar::CompressibleFlowSystem.

Definition at line 60 of file EulerCFE.cpp.

References ASSERTL0, Nektar::LibUtilities::TimeIntegrationSchemeOperators::DefineOdeRhs(), Nektar::LibUtilities::TimeIntegrationSchemeOperators::DefineProjection(), DoOdeProjection(), DoOdeRhs(), Nektar::SolverUtils::UnsteadySystem::m_explicitAdvection, Nektar::SolverUtils::UnsteadySystem::m_ode, m_problemType, Nektar::SolverUtils::EquationSystem::m_session, Nektar::ProblemTypeMap, Nektar::SIZE_ProblemType, and Nektar::CompressibleFlowSystem::v_InitObject().

61  {
63 
64  if(m_session->DefinesSolverInfo("PROBLEMTYPE"))
65  {
66  int i;
67  std::string ProblemTypeStr =
68  m_session->GetSolverInfo("PROBLEMTYPE");
69  for (i = 0; i < (int) SIZE_ProblemType; ++i)
70  {
71  if (boost::iequals(ProblemTypeMap[i], ProblemTypeStr))
72  {
74  break;
75  }
76  }
77  }
78  else
79  {
81  }
82 
84  {
87  }
88  else
89  {
90  ASSERTL0(false, "Implicit CFE not set up.");
91  }
92  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:188
virtual void v_InitObject()
Initialization object for CompressibleFlowSystem class.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the projection and call the method for imposing the boundary conditions in case of discontinu...
Definition: EulerCFE.cpp:175
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
Length of enum list.
Definition: EulerADCFE.h:47
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the right-hand side.
Definition: EulerCFE.cpp:144
ProblemType m_problemType
Definition: EulerCFE.h:77
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
ProblemType
Definition: EulerADCFE.h:44
const char *const ProblemTypeMap[]
Definition: EulerADCFE.h:50
void Nektar::EulerCFE::v_SetInitialConditions ( NekDouble  initialtime = 0.0,
bool  dumpInitialConditions = true,
const int  domain = 0 
)
protectedvirtual

Set the initial conditions.

Reimplemented from Nektar::CompressibleFlowSystem.

Definition at line 113 of file EulerCFE.cpp.

References Nektar::SolverUtils::EquationSystem::Checkpoint_Output(), Nektar::eIsentropicVortex, Nektar::SolverUtils::EquationSystem::m_checksteps, m_problemType, SetInitialIsentropicVortex(), Nektar::CompressibleFlowSystem::v_SetInitialConditions(), and Nektar::SolverUtils::EquationSystem::v_SetInitialConditions().

117  {
118  switch (m_problemType)
119  {
120  case eIsentropicVortex:
121  {
122  SetInitialIsentropicVortex(initialtime);
123  break;
124  }
125  default:
126  {
127  EquationSystem::v_SetInitialConditions(initialtime, false);
128  break;
129  }
130  }
131 
133 
134  if (dumpInitialConditions && m_checksteps)
135  {
136  // Dump initial conditions to file
138  }
139  }
void SetInitialIsentropicVortex(NekDouble initialtime)
Set the initial condition for the isentropic vortex problem.
Definition: EulerCFE.cpp:369
SOLVER_UTILS_EXPORT void Checkpoint_Output(const int n)
Write checkpoint file of m_fields.
int m_checksteps
Number of steps between checkpoints.
virtual SOLVER_UTILS_EXPORT void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
Isentropic Vortex.
Definition: EulerCFE.h:46
ProblemType m_problemType
Definition: EulerCFE.h:77
virtual void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)

Friends And Related Function Documentation

friend class MemoryManager< EulerCFE >
friend

Definition at line 61 of file EulerCFE.h.

Member Data Documentation

string Nektar::EulerCFE::className
static
Initial value:
=
"EulerCFE", EulerCFE::create,
"Euler equations in conservative variables without "
"artificial diffusion.")

Name of class.

Definition at line 72 of file EulerCFE.h.

ProblemType Nektar::EulerCFE::m_problemType