Nektar++
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
Nektar::CFSImplicit Class Reference

#include <CompressibleFlowSystemImplicit.h>

Inheritance diagram for Nektar::CFSImplicit:
[legend]

Public Member Functions

 CFSImplicit (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 
virtual ~CFSImplicit ()
 Destructor for CFSImplicit class. More...
 
virtual void v_InitObject (bool DeclareFields=true) override
 Initialization object for CFSImplicit class. More...
 
void InitialiseNonlinSysSolver ()
 
void NonlinSysEvaluatorCoeff1D (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag)
 
void NonlinSysEvaluatorCoeff (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=true, const Array< OneD, const NekDouble > &source=NullNekDouble1DArray)
 
void NonlinSysEvaluatorCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &out, const Array< OneD, const Array< OneD, NekDouble >> &source=NullNekDoubleArrayOfArray)
 
void DoOdeRhsCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
 Compute the right-hand side. More...
 
void DoAdvectionCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
 Compute the advection terms for the right-hand side. More...
 
void DoImplicitSolve (const Array< OneD, const Array< OneD, NekDouble >> &inpnts, Array< OneD, Array< OneD, NekDouble >> &outpnt, const NekDouble time, const NekDouble lambda)
 
void DoImplicitSolveCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inpnts, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const NekDouble time, const NekDouble lambda)
 
void CalcRefValues (const Array< OneD, const NekDouble > &inarray)
 
- 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...
 
virtual void v_GetPressure (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, NekDouble > &pressure) override
 
virtual void v_GetDensity (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, NekDouble > &density) override
 
virtual bool v_HasConstantDensity () override
 
virtual void v_GetVelocity (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &velocity) override
 
- Public Member Functions inherited from Nektar::SolverUtils::AdvectionSystem
SOLVER_UTILS_EXPORT AdvectionSystem (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 
virtual SOLVER_UTILS_EXPORT ~AdvectionSystem ()
 
SOLVER_UTILS_EXPORT AdvectionSharedPtr GetAdvObject ()
 Returns the advection object held by this instance. More...
 
SOLVER_UTILS_EXPORT Array< OneD, NekDoubleGetElmtCFLVals (const bool FlagAcousticCFL=true)
 
SOLVER_UTILS_EXPORT NekDouble GetCFLEstimate (int &elmtid)
 
- 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...
 
SOLVER_UTILS_EXPORT void SteadyStateResidual (int step, Array< OneD, NekDouble > &L2)
 
- 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 (bool DeclareField=true)
 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 >
std::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 ExtraFldOutput (std::vector< Array< OneD, NekDouble >> &fieldcoeffs, std::vector< std::string > &variables)
 
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 SessionFunctionSharedPtr GetFunction (std::string name, const MultiRegions::ExpListSharedPtr &field=MultiRegions::NullExpListSharedPtr, bool cache=false)
 Get a SessionFunction by name. 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, NekDoubleErrorExtraPoints (unsigned int field)
 Compute error (L2 and L_inf) over an larger set of quadrature points return [L2 Linf]. 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 SessionSummary (SummaryList &vSummary)
 Write out a session summary. More...
 
SOLVER_UTILS_EXPORT Array< OneD, MultiRegions::ExpListSharedPtr > & UpdateFields ()
 
SOLVER_UTILS_EXPORT LibUtilities::FieldMetaDataMapUpdateFieldMetaDataMap ()
 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 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, const Array< OneD, const NekDouble > &input)
 
SOLVER_UTILS_EXPORT void SetSteps (const int steps)
 
SOLVER_UTILS_EXPORT void ZeroPhysFields ()
 
SOLVER_UTILS_EXPORT void FwdTransFields ()
 
SOLVER_UTILS_EXPORT void SetModifiedBasis (const bool modbasis)
 
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 int GetInfoSteps ()
 
SOLVER_UTILS_EXPORT void SetInfoSteps (int num)
 
SOLVER_UTILS_EXPORT int GetPararealIterationNumber ()
 
SOLVER_UTILS_EXPORT void SetPararealIterationNumber (int num)
 
SOLVER_UTILS_EXPORT bool GetUseInitialCondition ()
 
SOLVER_UTILS_EXPORT void SetUseInitialCondition (bool num)
 
SOLVER_UTILS_EXPORT Array< OneD, const Array< OneD, NekDouble > > GetTraceNormals ()
 
SOLVER_UTILS_EXPORT void SetTime (const NekDouble time)
 
SOLVER_UTILS_EXPORT void SetTimeStep (const NekDouble timestep)
 
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...
 
SOLVER_UTILS_EXPORT bool ParallelInTime ()
 Check if solver use Parallel-in-Time. More...
 
- Public Member Functions inherited from Nektar::SolverUtils::FluidInterface
virtual ~FluidInterface ()=default
 
SOLVER_UTILS_EXPORT void GetVelocity (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, Array< OneD, NekDouble >> &velocity)
 Extract array with velocity from physfield. More...
 
SOLVER_UTILS_EXPORT bool HasConstantDensity ()
 
SOLVER_UTILS_EXPORT void GetDensity (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, NekDouble > &density)
 Extract array with density from physfield. More...
 
SOLVER_UTILS_EXPORT void GetPressure (const Array< OneD, const Array< OneD, NekDouble >> &physfield, Array< OneD, NekDouble > &pressure)
 Extract array with pressure from physfield. More...
 
SOLVER_UTILS_EXPORT void SetMovingFrameVelocities (const Array< OneD, NekDouble > &vFrameVels)
 
SOLVER_UTILS_EXPORT void GetMovingFrameVelocities (Array< OneD, NekDouble > &vFrameVels)
 
SOLVER_UTILS_EXPORT void SetMovingFrameProjectionMat (const boost::numeric::ublas::matrix< NekDouble > &vProjMat)
 
SOLVER_UTILS_EXPORT void GetMovingFrameProjectionMat (boost::numeric::ublas::matrix< NekDouble > &vProjMat)
 
SOLVER_UTILS_EXPORT void SetMovingFrameAngles (const Array< OneD, NekDouble > &vFrameTheta)
 
SOLVER_UTILS_EXPORT void GetMovingFrameAngles (Array< OneD, NekDouble > &vFrameTheta)
 

Protected Member Functions

void PreconCoeff (const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const bool &flag)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void AddMatNSBlkDiagVol (const Array< OneD, const Array< OneD, NekDouble >> &inarray, const Array< OneD, const TensorOfArray2D< NekDouble >> &qfield, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
 
template<typename DataType >
void CalcVolJacStdMat (TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void AddMatNSBlkDiagBnd (const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray2D< TypeNekBlkMatSharedPtr > &gmtxarray, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void ElmtVarInvMtrx (Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TypeNekBlkMatSharedPtr &gmtVar, const DataType &tmpDatatype)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void GetTraceJac (const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void NumCalcRiemFluxJac (const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, const NekDouble &time, const Array< OneD, const Array< OneD, NekDouble >> &Fwd, const Array< OneD, const Array< OneD, NekDouble >> &Bwd, TypeNekBlkMatSharedPtr &FJac, TypeNekBlkMatSharedPtr &BJac, TensorOfArray5D< DataType > &TraceIPSymJacArray)
 
void PointFluxJacobianPoint (const Array< OneD, NekDouble > &Fwd, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &FJac, const NekDouble efix, const NekDouble fsw)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void TranSamesizeBlkDiagMatIntoArray (const TypeNekBlkMatSharedPtr &BlkMat, TensorOfArray3D< DataType > &MatArray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void TransTraceJacMatToArray (const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, TensorOfArray4D< DataType > &TraceJacArray, TensorOfArray4D< DataType > &TraceJacDerivArray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Fill2DArrayOfBlkDiagonalMat (Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const DataType valu)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Fill1DArrayOfBlkDiagonalMat (Array< OneD, TypeNekBlkMatSharedPtr > &gmtxarray, const DataType valu)
 
void AllocateNekBlkMatDig (SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)
 
void CalcPreconMatBRJCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray, SNekBlkMatSharedPtr &gmtVar, Array< OneD, SNekBlkMatSharedPtr > &TraceJac, Array< OneD, SNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, NekSingle >> &TraceJacDerivSign, TensorOfArray4D< NekSingle > &TraceJacArray, TensorOfArray4D< NekSingle > &TraceJacDerivArray, TensorOfArray5D< NekSingle > &TraceIPSymJacArray)
 
template<typename DataType , typename TypeNekBlkMatSharedPtr >
void MultiplyElmtInvMassPlusSource (Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const NekDouble dtlamda, const DataType tmpDataType)
 
void GetFluxVectorJacDirElmt (const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
 
void GetFluxVectorJacPoint (const int nConvectiveFields, const Array< OneD, NekDouble > &conservVar, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &fluxJac)
 
void CalcTraceNumericalFlux (const int nConvectiveFields, const int nDim, const int nPts, const int nTracePts, const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, const NekDouble time, TensorOfArray3D< NekDouble > &qfield, const Array< OneD, const Array< OneD, NekDouble >> &vFwd, const Array< OneD, const Array< OneD, NekDouble >> &vBwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qFwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qBwd, const Array< OneD, NekDouble > &MuVarTrace, Array< OneD, int > &nonZeroIndex, Array< OneD, Array< OneD, NekDouble >> &traceflux)
 
void MinusDiffusionFluxJacPoint (const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
 
void GetFluxDerivJacDirctn (const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir)
 
void GetFluxDerivJacDirctnElmt (const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
 
void GetFluxDerivJacDirctn (const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, DNekMatSharedPtr >> &ElmtJac)
 
void CalcPhysDeriv (const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)
 
void DoDiffusionCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
 Add the diffusions terms to the right-hand side Similar to DoDiffusion() but with outarray in coefficient space. More...
 
void MatrixMultiplyMatrixFreeCoeff (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=false)
 
void CalcMuDmuDT (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)
 
virtual void v_DoDiffusionCoeff (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
 
virtual void v_CalcMuDmuDT (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)
 
virtual void v_CalcPhysDeriv (const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)
 
virtual void v_MinusDiffusionFluxJacPoint (const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
 
virtual void v_GetFluxDerivJacDirctn (const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir)
 
virtual void v_GetFluxDerivJacDirctnElmt (const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
 
virtual void v_GetFluxDerivJacDirctn (const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, DNekMatSharedPtr >> &ElmtJac)
 
virtual bool v_UpdateTimeStepCheck () override
 
- Protected Member Functions inherited from Nektar::CompressibleFlowSystem
 CompressibleFlowSystem (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 
void InitialiseParameters ()
 Load CFS parameters from the session file. More...
 
void InitAdvection ()
 Create advection and diffusion objects for CFS. 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...
 
void DoAdvection (const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
 Compute the advection terms for the right-hand side. More...
 
void DoDiffusion (const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)
 Add the diffusions terms to the right-hand side. More...
 
void GetFluxVector (const Array< OneD, const Array< OneD, NekDouble >> &physfield, TensorOfArray3D< NekDouble > &flux)
 Return the flux vector for the compressible Euler equations. More...
 
void GetFluxVectorDeAlias (const Array< OneD, const Array< OneD, NekDouble >> &physfield, TensorOfArray3D< NekDouble > &flux)
 Return the flux vector for the compressible Euler equations by using the de-aliasing technique. More...
 
void SetBoundaryConditions (Array< OneD, Array< OneD, NekDouble >> &physarray, NekDouble time)
 
void SetBoundaryConditionsBwdWeight ()
 Set up a weight on physical boundaries for boundary condition applications. More...
 
void GetElmtTimeStep (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &tstep)
 Calculate the maximum timestep on each element subject to CFL restrictions. More...
 
virtual NekDouble v_GetTimeStep (const Array< OneD, const Array< OneD, NekDouble >> &inarray) override
 Calculate the maximum timestep subject to CFL restrictions. More...
 
virtual void v_SetInitialConditions (NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
 Set up logic for residual calculation. More...
 
NekDouble GetGamma ()
 
const Array< OneD, const Array< OneD, NekDouble > > & GetVecLocs ()
 
const Array< OneD, const Array< OneD, NekDouble > > & GetNormals ()
 
virtual MultiRegions::ExpListSharedPtr v_GetPressure () override
 
virtual void v_ExtraFldOutput (std::vector< Array< OneD, NekDouble >> &fieldcoeffs, std::vector< std::string > &variables) override
 
virtual void v_DoDiffusion (const Array< OneD, Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, Array< OneD, NekDouble >> &pFwd, const Array< OneD, Array< OneD, NekDouble >> &pBwd)=0
 
virtual Array< OneD, NekDoublev_GetMaxStdVelocity (const NekDouble SpeedSoundFactor) override
 Compute the advection velocity in the standard space for each element of the expansion. More...
 
virtual void v_SteadyStateResidual (int step, Array< OneD, NekDouble > &L2) override
 
virtual bool v_SupportsShockCaptType (const std::string type) const =0
 
- Protected Member Functions inherited from Nektar::SolverUtils::AdvectionSystem
virtual SOLVER_UTILS_EXPORT bool v_PostIntegrate (int step) override
 
- Protected Member Functions inherited from Nektar::SolverUtils::UnsteadySystem
SOLVER_UTILS_EXPORT UnsteadySystem (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 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 () override
 Solves an unsteady problem. More...
 
virtual SOLVER_UTILS_EXPORT void v_DoInitialise () override
 Sets up initial conditions. More...
 
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary (SummaryList &s) override
 Print a summary of time stepping parameters. More...
 
virtual SOLVER_UTILS_EXPORT bool v_PreIntegrate (int step)
 
virtual SOLVER_UTILS_EXPORT bool v_RequireFwdTrans ()
 
SOLVER_UTILS_EXPORT void CheckForRestartTime (NekDouble &time, int &nchk)
 
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...
 
SOLVER_UTILS_EXPORT void DoDummyProjection (const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
 Perform dummy projection. More...
 
- Protected Member Functions inherited from Nektar::SolverUtils::EquationSystem
SOLVER_UTILS_EXPORT EquationSystem (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 Initialises EquationSystem class members. More...
 
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...
 
virtual SOLVER_UTILS_EXPORT void v_EvaluateExactSolution (unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time)
 
virtual SOLVER_UTILS_EXPORT void v_Output (void)
 
- Protected Member Functions inherited from Nektar::SolverUtils::FluidInterface
virtual SOLVER_UTILS_EXPORT void v_SetMovingFrameVelocities (const Array< OneD, NekDouble > &vFrameVels)
 
virtual SOLVER_UTILS_EXPORT void v_GetMovingFrameVelocities (Array< OneD, NekDouble > &vFrameVels)
 
virtual SOLVER_UTILS_EXPORT void v_SetMovingFrameProjectionMat (const boost::numeric::ublas::matrix< NekDouble > &vProjMat)
 
virtual SOLVER_UTILS_EXPORT void v_GetMovingFrameProjectionMat (boost::numeric::ublas::matrix< NekDouble > &vProjMat)
 
virtual SOLVER_UTILS_EXPORT void v_SetMovingFrameAngles (const Array< OneD, NekDouble > &vFrameTheta)
 
virtual SOLVER_UTILS_EXPORT void v_GetMovingFrameAngles (Array< OneD, NekDouble > &vFrameTheta)
 

Protected Attributes

bool m_viscousJacFlag
 
bool m_advectionJacFlag
 
int m_nPadding = 1
 
Array< OneD, Array< OneD, NekDouble > > m_solutionPhys
 
NekDouble m_jacobiFreeEps
 
NekDouble m_newtonAbsoluteIteTol
 
TensorOfArray4D< NekSinglem_stdSMatDataDBB
 
TensorOfArray5D< NekSinglem_stdSMatDataDBDB
 
LibUtilities::NekNonlinSysSharedPtr m_nonlinsol
 
PreconCfsOpSharedPtr m_preconCfs
 
bool m_updateShockCaptPhys {true}
 
- Protected Attributes inherited from Nektar::CompressibleFlowSystem
SolverUtils::DiffusionSharedPtr m_diffusion
 
ArtificialDiffusionSharedPtr m_artificialDiffusion
 
Array< OneD, Array< OneD, NekDouble > > m_vecLocs
 
NekDouble m_gamma
 
std::string m_shockCaptureType
 
NekDouble m_filterAlpha
 
NekDouble m_filterExponent
 
NekDouble m_filterCutoff
 
bool m_useFiltering
 
bool m_useLocalTimeStep
 
Array< OneD, NekDoublem_muav
 
Array< OneD, NekDoublem_muavTrace
 
VariableConverterSharedPtr m_varConv
 
std::vector< CFSBndCondSharedPtrm_bndConds
 
NekDouble m_bndEvaluateTime
 
std::vector< SolverUtils::ForcingSharedPtrm_forcing
 
- Protected Attributes inherited from Nektar::SolverUtils::AdvectionSystem
SolverUtils::AdvectionSharedPtr m_advObject
 Advection term. More...
 
- Protected Attributes inherited from Nektar::SolverUtils::UnsteadySystem
int m_abortSteps
 Number of steps between checks for abort conditions. More...
 
int m_filtersInfosteps
 Number of time steps between outputting filters information. More...
 
int m_nanSteps
 
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
 Wrapper to the time integration scheme. More...
 
LibUtilities::TimeIntegrationSchemeOperators m_ode
 The time integration scheme operators to use. More...
 
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...
 
NekDouble m_steadyStateTol
 Tolerance to which steady state should be evaluated at. More...
 
int m_steadyStateSteps
 Check for steady state at step interval. More...
 
NekDouble m_steadyStateRes = 1.0
 
NekDouble m_steadyStateRes0 = 1.0
 
Array< OneD, Array< OneD, NekDouble > > m_previousSolution
 Storage for previous solution for steady-state check. More...
 
std::ofstream m_errFile
 
std::vector< int > m_intVariables
 
std::vector< std::pair< std::string, FilterSharedPtr > > m_filters
 
NekDouble m_filterTimeWarning
 Number of time steps between outputting status information. More...
 
NekDouble m_TimeIntegLambda = 0.0
 coefff of spacial derivatives(rhs or m_F in GLM) in calculating the residual of the whole equation(used in unsteady time integrations) More...
 
bool m_flagImplicitItsStatistics
 
bool m_flagImplicitSolver = false
 
Array< OneD, NekDoublem_magnitdEstimat
 estimate the magnitude of each conserved varibles More...
 
Array< OneD, NekDoublem_locTimeStep
 local time step(notice only for jfnk other see m_cflSafetyFactor) More...
 
NekDouble m_inArrayNorm = -1.0
 
int m_TotLinItePerStep = 0
 
int m_StagesPerStep = 1
 
bool m_flagUpdatePreconMat
 
int m_maxLinItePerNewton
 
int m_TotNewtonIts = 0
 
int m_TotLinIts = 0
 
int m_TotImpStages = 0
 
bool m_CalcPhysicalAV = true
 flag to update artificial viscosity More...
 
- Protected Attributes inherited from Nektar::SolverUtils::EquationSystem
LibUtilities::CommSharedPtr m_comm
 Communicator. More...
 
bool m_verbose
 
LibUtilities::SessionReaderSharedPtr m_session
 The session reader. More...
 
std::map< std::string, SolverUtils::SessionFunctionSharedPtrm_sessionFunctions
 Map of known SessionFunctions. More...
 
LibUtilities::FieldIOSharedPtr m_fld
 Field input/output. More...
 
Array< OneD, MultiRegions::ExpListSharedPtrm_fields
 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_timestepMax = -1.0
 Time step size. More...
 
NekDouble m_lambda
 Lambda constant in real system if one required. More...
 
NekDouble m_checktime
 Time between checkpoints. More...
 
NekDouble m_lastCheckTime
 
NekDouble m_TimeIncrementFactor
 
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_infosteps
 Number of time steps between outputting status information. More...
 
int m_pararealIter
 Number of parareal time iteration. 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_useInitialCondition
 Flag to determine if IC are used. 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, 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...
 
Array< OneD, NekDoublem_movingFrameVelsxyz
 Moving frame of reference velocities. More...
 
Array< OneD, NekDoublem_movingFrameTheta
 Moving frame of reference angles with respect to the. More...
 
boost::numeric::ublas::matrix< NekDoublem_movingFrameProjMat
 Projection matrix for transformation between inertial and moving. 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...
 

Additional Inherited Members

- Public Attributes inherited from Nektar::SolverUtils::UnsteadySystem
NekDouble m_cflSafetyFactor
 CFL safety factor (comprise between 0 to 1). More...
 
NekDouble m_cflNonAcoustic
 
NekDouble m_CFLGrowth
 CFL growth rate. More...
 
NekDouble m_CFLEnd
 maximun cfl in cfl growth More...
 
- Static Public Attributes inherited from Nektar::SolverUtils::UnsteadySystem
static std::string cmdSetStartTime
 
static std::string cmdSetStartChkNum
 
- Protected Types inherited from Nektar::SolverUtils::EquationSystem
enum  HomogeneousType { eHomogeneous1D , eHomogeneous2D , eHomogeneous3D , eNotHomogeneous }
 Parameter for homogeneous expansions. More...
 
- Static Protected Attributes inherited from Nektar::SolverUtils::EquationSystem
static std::string equationSystemTypeLookupIds []
 

Detailed Description

Definition at line 47 of file CompressibleFlowSystemImplicit.h.

Constructor & Destructor Documentation

◆ CFSImplicit()

Nektar::CFSImplicit::CFSImplicit ( const LibUtilities::SessionReaderSharedPtr pSession,
const SpatialDomains::MeshGraphSharedPtr pGraph 
)

Definition at line 45 of file CompressibleFlowSystemImplicit.cpp.

47  : UnsteadySystem(pSession, pGraph), CompressibleFlowSystem(pSession, pGraph)
48 {
49 }
CompressibleFlowSystem(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
SOLVER_UTILS_EXPORT UnsteadySystem(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Initialises UnsteadySystem class members.

◆ ~CFSImplicit()

Nektar::CFSImplicit::~CFSImplicit ( )
virtual

Destructor for CFSImplicit class.

Definition at line 136 of file CompressibleFlowSystemImplicit.cpp.

137 {
138 }

Member Function Documentation

◆ AddMatNSBlkDiagBnd()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::AddMatNSBlkDiagBnd ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray3D< NekDouble > &  qfield,
TensorOfArray2D< TypeNekBlkMatSharedPtr > &  gmtxarray,
Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJac,
Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJacDeriv,
Array< OneD, Array< OneD, DataType >> &  TraceJacDerivSign,
TensorOfArray5D< DataType > &  TraceIPSymJacArray 
)
protected

Definition at line 943 of file CompressibleFlowSystemImplicit.cpp.

951 {
952  int nvariables = inarray.size();
953 
954  LibUtilities::Timer timer;
955  timer.Start();
956  GetTraceJac(inarray, qfield, TraceJac, TraceJacDeriv, TraceJacDerivSign,
957  TraceIPSymJacArray);
958  timer.Stop();
959  timer.AccumulateRegion("CFSImplicit::GetTraceJac", 10);
960 
961  Array<OneD, TypeNekBlkMatSharedPtr> tmpJac;
962  Array<OneD, Array<OneD, DataType>> tmpSign;
963 
964  timer.Start();
965  m_advObject->AddTraceJacToMat(nvariables, m_spacedim, m_fields, TraceJac,
966  gmtxarray, tmpJac, tmpSign);
967  timer.Stop();
968  timer.AccumulateRegion("Advection::AddTraceJacToMap", 10);
969 }
void GetTraceJac(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
int m_spacedim
Spatial dimension (>= expansion dim).
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.

References Nektar::LibUtilities::Timer::AccumulateRegion(), GetTraceJac(), Nektar::SolverUtils::AdvectionSystem::m_advObject, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::EquationSystem::m_spacedim, Nektar::LibUtilities::Timer::Start(), and Nektar::LibUtilities::Timer::Stop().

Referenced by CalcPreconMatBRJCoeff().

◆ AddMatNSBlkDiagVol()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::AddMatNSBlkDiagVol ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
const Array< OneD, const TensorOfArray2D< NekDouble >> &  qfield,
Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &  gmtxarray,
TensorOfArray4D< DataType > &  StdMatDataDBB,
TensorOfArray5D< DataType > &  StdMatDataDBDB 
)
protected

Definition at line 471 of file CompressibleFlowSystemImplicit.cpp.

477 {
478  if (StdMatDataDBB.size() == 0)
479  {
480  CalcVolJacStdMat(StdMatDataDBB, StdMatDataDBDB);
481  }
482 
483  int nSpaceDim = m_graph->GetSpaceDimension();
484  int nvariable = inarray.size();
485  int npoints = m_fields[0]->GetTotPoints();
486  int nVar2 = nvariable * nvariable;
487  std::shared_ptr<LocalRegions::ExpansionVector> expvect =
488  m_fields[0]->GetExp();
489  int nTotElmt = (*expvect).size();
490 
491  Array<OneD, NekDouble> mu(npoints, 0.0);
492  Array<OneD, NekDouble> DmuDT(npoints, 0.0);
493  if (m_viscousJacFlag)
494  {
495  CalcMuDmuDT(inarray, mu, DmuDT);
496  }
497 
498  Array<OneD, NekDouble> normals;
499  Array<OneD, Array<OneD, NekDouble>> normal3D(3);
500  for (int i = 0; i < 3; i++)
501  {
502  normal3D[i] = Array<OneD, NekDouble>(3, 0.0);
503  }
504  normal3D[0][0] = 1.0;
505  normal3D[1][1] = 1.0;
506  normal3D[2][2] = 1.0;
507  Array<OneD, Array<OneD, NekDouble>> normalPnt(3);
508 
509  DNekMatSharedPtr wspMat =
510  MemoryManager<DNekMat>::AllocateSharedPtr(nvariable, nvariable, 0.0);
512  nvariable - 1, nvariable, 0.0);
513 
514  Array<OneD, DataType> GmatxData;
515  Array<OneD, DataType> MatData;
516 
517  Array<OneD, NekDouble> tmppnts;
518  TensorOfArray3D<NekDouble> PntJacCons(
519  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
520  TensorOfArray3D<DataType> PntJacConsStd(
521  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
522  Array<OneD, Array<OneD, NekDouble>> ConsStdd(m_spacedim);
523  Array<OneD, Array<OneD, NekDouble>> ConsCurv(m_spacedim);
524  TensorOfArray4D<NekDouble> PntJacDerv(
525  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
526  TensorOfArray4D<DataType> PntJacDervStd(
527  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
528  TensorOfArray3D<NekDouble> DervStdd(
529  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
530  TensorOfArray3D<NekDouble> DervCurv(
531  m_spacedim); // Nvar*Nvar*Ndir*Nelmt*Npnt
532  for (int ndir = 0; ndir < m_spacedim; ndir++)
533  {
534  PntJacDerv[ndir] = TensorOfArray3D<NekDouble>(m_spacedim);
535  PntJacDervStd[ndir] = TensorOfArray3D<DataType>(m_spacedim);
536  DervStdd[ndir] = Array<OneD, Array<OneD, NekDouble>>(m_spacedim);
537  DervCurv[ndir] = Array<OneD, Array<OneD, NekDouble>>(m_spacedim);
538  }
539 
540  Array<OneD, NekDouble> locmu;
541  Array<OneD, NekDouble> locDmuDT;
542  Array<OneD, Array<OneD, NekDouble>> locVars(nvariable);
543  TensorOfArray3D<NekDouble> locDerv(m_spacedim);
544  for (int ndir = 0; ndir < m_spacedim; ndir++)
545  {
546  locDerv[ndir] = Array<OneD, Array<OneD, NekDouble>>(nvariable);
547  }
548 
549  int nElmtCoefOld = -1;
550  for (int ne = 0; ne < nTotElmt; ne++)
551  {
552  int nElmtCoef = (*expvect)[ne]->GetNcoeffs();
553  int nElmtCoef2 = nElmtCoef * nElmtCoef;
554  int nElmtPnt = (*expvect)[ne]->GetTotPoints();
555 
556  int nQuot = nElmtCoef2 / m_nPadding;
557  int nRemd = nElmtCoef2 - nQuot * m_nPadding;
558  int nQuotPlus = nQuot;
559  if (nRemd > 0)
560  {
561  nQuotPlus++;
562  }
563  int nElmtCoef2Paded = nQuotPlus * m_nPadding;
564 
565  if (nElmtPnt > PntJacCons[0].size() || nElmtCoef > nElmtCoefOld)
566  {
567  nElmtCoefOld = nElmtCoef;
568  for (int ndir = 0; ndir < 3; ndir++)
569  {
570  normalPnt[ndir] = Array<OneD, NekDouble>(npoints, 0.0);
571  }
572  tmppnts = Array<OneD, NekDouble>(nElmtPnt);
573  MatData = Array<OneD, DataType>(nElmtCoef2Paded * nVar2);
574  for (int ndir = 0; ndir < m_spacedim; ndir++)
575  {
576  ConsCurv[ndir] = Array<OneD, NekDouble>(nElmtPnt);
577  ConsStdd[ndir] = Array<OneD, NekDouble>(nElmtPnt);
578  PntJacCons[ndir] =
579  Array<OneD, Array<OneD, NekDouble>>(nElmtPnt);
580  PntJacConsStd[ndir] =
581  Array<OneD, Array<OneD, DataType>>(nElmtPnt);
582  for (int i = 0; i < nElmtPnt; i++)
583  {
584  PntJacCons[ndir][i] = Array<OneD, NekDouble>(nVar2);
585  PntJacConsStd[ndir][i] = Array<OneD, DataType>(nVar2);
586  }
587 
588  for (int ndir1 = 0; ndir1 < m_spacedim; ndir1++)
589  {
590  PntJacDerv[ndir][ndir1] =
591  Array<OneD, Array<OneD, NekDouble>>(nElmtPnt);
592  PntJacDervStd[ndir][ndir1] =
593  Array<OneD, Array<OneD, DataType>>(nElmtPnt);
594  DervStdd[ndir][ndir1] = Array<OneD, NekDouble>(nElmtPnt);
595  DervCurv[ndir][ndir1] = Array<OneD, NekDouble>(nElmtPnt);
596  for (int i = 0; i < nElmtPnt; i++)
597  {
598  PntJacDerv[ndir][ndir1][i] =
599  Array<OneD, NekDouble>(nVar2);
600  PntJacDervStd[ndir][ndir1][i] =
601  Array<OneD, DataType>(nVar2);
602  }
603  }
604  }
605  }
606 
607  int noffset = GetPhys_Offset(ne);
608  for (int j = 0; j < nvariable; j++)
609  {
610  locVars[j] = inarray[j] + noffset;
611  }
612 
613  if (m_advectionJacFlag)
614  {
615  for (int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
616  {
617  normals = normal3D[nFluxDir];
618  GetFluxVectorJacDirElmt(nvariable, nElmtPnt, locVars, normals,
619  wspMat, PntJacCons[nFluxDir]);
620  }
621  }
622 
623  if (m_viscousJacFlag)
624  {
625  for (int j = 0; j < nSpaceDim; j++)
626  {
627  for (int k = 0; k < nvariable; k++)
628  {
629  locDerv[j][k] = qfield[j][k] + noffset;
630  }
631  }
632  locmu = mu + noffset;
633  locDmuDT = DmuDT + noffset;
634  for (int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
635  {
636  normals = normal3D[nFluxDir];
637  MinusDiffusionFluxJacPoint(nvariable, nElmtPnt, locVars,
638  locDerv, locmu, locDmuDT, normals,
639  wspMatDrv, PntJacCons[nFluxDir]);
640  }
641  }
642 
643  if (m_viscousJacFlag)
644  {
645  locmu = mu + noffset;
646  for (int nFluxDir = 0; nFluxDir < nSpaceDim; nFluxDir++)
647  {
648  Vmath::Fill(npoints, 1.0, normalPnt[nFluxDir], 1);
649  for (int nDervDir = 0; nDervDir < nSpaceDim; nDervDir++)
650  {
652  nvariable, nElmtPnt, nDervDir, locVars, locmu,
653  normalPnt, wspMatDrv, PntJacDerv[nFluxDir][nDervDir]);
654  }
655  Vmath::Fill(npoints, 0.0, normalPnt[nFluxDir], 1);
656  }
657  }
658 
659  for (int n = 0; n < nvariable; n++)
660  {
661  for (int m = 0; m < nvariable; m++)
662  {
663  int nVarOffset = m + n * nvariable;
664  GmatxData = gmtxarray[m][n]->GetBlock(ne, ne)->GetPtr();
665 
666  for (int ndStd0 = 0; ndStd0 < m_spacedim; ndStd0++)
667  {
668  Vmath::Zero(nElmtPnt, ConsStdd[ndStd0], 1);
669  }
670  for (int ndir = 0; ndir < m_spacedim; ndir++)
671  {
672  for (int i = 0; i < nElmtPnt; i++)
673  {
674  tmppnts[i] = PntJacCons[ndir][i][nVarOffset];
675  }
676  (*expvect)[ne]->AlignVectorToCollapsedDir(ndir, tmppnts,
677  ConsCurv);
678  for (int nd = 0; nd < m_spacedim; nd++)
679  {
680  Vmath::Vadd(nElmtPnt, ConsCurv[nd], 1, ConsStdd[nd], 1,
681  ConsStdd[nd], 1);
682  }
683  }
684 
685  for (int ndir = 0; ndir < m_spacedim; ndir++)
686  {
687  (*expvect)[ne]->MultiplyByQuadratureMetric(
688  ConsStdd[ndir], ConsStdd[ndir]); // weight with metric
689  for (int i = 0; i < nElmtPnt; i++)
690  {
691  PntJacConsStd[ndir][i][nVarOffset] =
692  DataType(ConsStdd[ndir][i]);
693  }
694  }
695  }
696  }
697 
698  if (m_viscousJacFlag)
699  {
700  for (int m = 0; m < nvariable; m++)
701  {
702  for (int n = 0; n < nvariable; n++)
703  {
704  int nVarOffset = m + n * nvariable;
705  for (int ndStd0 = 0; ndStd0 < m_spacedim; ndStd0++)
706  {
707  for (int ndStd1 = 0; ndStd1 < m_spacedim; ndStd1++)
708  {
709  Vmath::Zero(nElmtPnt, DervStdd[ndStd0][ndStd1], 1);
710  }
711  }
712  for (int nd0 = 0; nd0 < m_spacedim; nd0++)
713  {
714  for (int nd1 = 0; nd1 < m_spacedim; nd1++)
715  {
716  for (int i = 0; i < nElmtPnt; i++)
717  {
718  tmppnts[i] =
719  PntJacDerv[nd0][nd1][i][nVarOffset];
720  }
721 
722  (*expvect)[ne]->AlignVectorToCollapsedDir(
723  nd0, tmppnts, ConsCurv);
724  for (int nd = 0; nd < m_spacedim; nd++)
725  {
726  (*expvect)[ne]->AlignVectorToCollapsedDir(
727  nd1, ConsCurv[nd], DervCurv[nd]);
728  }
729 
730  for (int ndStd0 = 0; ndStd0 < m_spacedim; ndStd0++)
731  {
732  for (int ndStd1 = 0; ndStd1 < m_spacedim;
733  ndStd1++)
734  {
735  Vmath::Vadd(nElmtPnt,
736  DervCurv[ndStd0][ndStd1], 1,
737  DervStdd[ndStd0][ndStd1], 1,
738  DervStdd[ndStd0][ndStd1], 1);
739  }
740  }
741  }
742  }
743  for (int nd0 = 0; nd0 < m_spacedim; nd0++)
744  {
745  for (int nd1 = 0; nd1 < m_spacedim; nd1++)
746  {
747  (*expvect)[ne]->MultiplyByQuadratureMetric(
748  DervStdd[nd0][nd1],
749  DervStdd[nd0][nd1]); // weight with metric
750  for (int i = 0; i < nElmtPnt; i++)
751  {
752  PntJacDervStd[nd0][nd1][i][nVarOffset] =
753  -DataType(DervStdd[nd0][nd1][i]);
754  }
755  }
756  }
757  }
758  }
759  }
760 
761  Vmath::Zero(nElmtCoef2Paded * nVar2, MatData, 1);
762  DataType one = 1.0;
763  for (int ndir = 0; ndir < m_spacedim; ndir++)
764  {
765  for (int i = 0; i < nElmtPnt; i++)
766  {
767  Blas::Ger(nElmtCoef2Paded, nVar2, one,
768  &StdMatDataDBB[ne][ndir][i][0], 1,
769  &PntJacConsStd[ndir][i][0], 1, &MatData[0],
770  nElmtCoef2Paded);
771  }
772  }
773 
774  if (m_viscousJacFlag)
775  {
776  for (int nd0 = 0; nd0 < m_spacedim; nd0++)
777  {
778  for (int nd1 = 0; nd1 < m_spacedim; nd1++)
779  {
780  for (int i = 0; i < nElmtPnt; i++)
781  {
782  Blas::Ger(nElmtCoef2Paded, nVar2, one,
783  &StdMatDataDBDB[ne][nd0][nd1][i][0], 1,
784  &PntJacDervStd[nd0][nd1][i][0], 1,
785  &MatData[0], nElmtCoef2Paded);
786  }
787  }
788  }
789  }
790 
791  Array<OneD, DataType> tmpA;
792 
793  for (int n = 0; n < nvariable; n++)
794  {
795  for (int m = 0; m < nvariable; m++)
796  {
797  int nVarOffset = m + n * nvariable;
798  GmatxData = gmtxarray[m][n]->GetBlock(ne, ne)->GetPtr();
799  Vmath::Vcopy(nElmtCoef2,
800  tmpA = MatData + nVarOffset * nElmtCoef2Paded, 1,
801  GmatxData, 1);
802  }
803  }
804  }
805 }
void CalcVolJacStdMat(TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
void GetFluxVectorJacDirElmt(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)
void CalcMuDmuDT(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
SpatialDomains::MeshGraphSharedPtr m_graph
Pointer to graph defining mesh.
SOLVER_UTILS_EXPORT int GetPhys_Offset(int n)
static void Ger(const int &m, const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy, double *a, const int &lda)
BLAS level 2: Matrix vector multiply A = alpha*x*y**T + A where A[m x n].
Definition: Blas.hpp:211
std::shared_ptr< DNekMat > DNekMatSharedPtr
Definition: NekTypeDefs.hpp:75
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:359
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:492
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:45
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1255

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), CalcMuDmuDT(), CalcVolJacStdMat(), Vmath::Fill(), Blas::Ger(), GetFluxDerivJacDirctnElmt(), GetFluxVectorJacDirElmt(), Nektar::SolverUtils::EquationSystem::GetPhys_Offset(), m_advectionJacFlag, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::EquationSystem::m_graph, m_nPadding, Nektar::SolverUtils::EquationSystem::m_spacedim, m_viscousJacFlag, MinusDiffusionFluxJacPoint(), Vmath::Vadd(), Vmath::Vcopy(), and Vmath::Zero().

Referenced by CalcPreconMatBRJCoeff().

◆ AllocateNekBlkMatDig()

void Nektar::CFSImplicit::AllocateNekBlkMatDig ( SNekBlkMatSharedPtr mat,
const Array< OneD, unsigned int >  nrow,
const Array< OneD, unsigned int >  ncol 
)
inlineprotected

Definition at line 196 of file CompressibleFlowSystemImplicit.h.

199  {
200  mat =
202  SNekMatSharedPtr loc_matNvar;
203  for (int nelm = 0; nelm < nrow.size(); ++nelm)
204  {
205  int nrowsVars = nrow[nelm];
206  int ncolsVars = ncol[nelm];
207 
209  nrowsVars, ncolsVars, 0.0);
210  mat->SetBlock(nelm, nelm, loc_matNvar);
211  }
212  }
std::shared_ptr< SNekMat > SNekMatSharedPtr

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and Nektar::eDIAGONAL.

Referenced by ElmtVarInvMtrx(), and GetTraceJac().

◆ CalcMuDmuDT()

void Nektar::CFSImplicit::CalcMuDmuDT ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, NekDouble > &  mu,
Array< OneD, NekDouble > &  DmuDT 
)
inlineprotected

Definition at line 318 of file CompressibleFlowSystemImplicit.h.

320  {
321  v_CalcMuDmuDT(inarray, mu, DmuDT);
322  }
virtual void v_CalcMuDmuDT(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT)

References v_CalcMuDmuDT().

Referenced by AddMatNSBlkDiagVol().

◆ CalcPhysDeriv()

void Nektar::CFSImplicit::CalcPhysDeriv ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray3D< NekDouble > &  qfield 
)
inlineprotected

Definition at line 303 of file CompressibleFlowSystemImplicit.h.

305  {
306  v_CalcPhysDeriv(inarray, qfield);
307  }
virtual void v_CalcPhysDeriv(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)

References v_CalcPhysDeriv().

Referenced by CalcPreconMatBRJCoeff().

◆ CalcPreconMatBRJCoeff()

void Nektar::CFSImplicit::CalcPreconMatBRJCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &  gmtxarray,
SNekBlkMatSharedPtr gmtVar,
Array< OneD, SNekBlkMatSharedPtr > &  TraceJac,
Array< OneD, SNekBlkMatSharedPtr > &  TraceJacDeriv,
Array< OneD, Array< OneD, NekSingle >> &  TraceJacDerivSign,
TensorOfArray4D< NekSingle > &  TraceJacArray,
TensorOfArray4D< NekSingle > &  TraceJacDerivArray,
TensorOfArray5D< NekSingle > &  TraceIPSymJacArray 
)
protected

Definition at line 1366 of file CompressibleFlowSystemImplicit.cpp.

1375 {
1376  TensorOfArray3D<NekDouble> qfield;
1377 
1378  if (m_viscousJacFlag)
1379  {
1380  CalcPhysDeriv(inarray, qfield);
1381  }
1382 
1383  NekSingle zero = 0.0;
1384  Fill2DArrayOfBlkDiagonalMat(gmtxarray, zero);
1385 
1386  LibUtilities::Timer timer;
1387  timer.Start();
1388  AddMatNSBlkDiagVol(inarray, qfield, gmtxarray, m_stdSMatDataDBB,
1390  timer.Stop();
1391  timer.AccumulateRegion("CFSImplicit::AddMatNSBlkDiagVol", 2);
1392 
1393  timer.Start();
1394  AddMatNSBlkDiagBnd(inarray, qfield, gmtxarray, TraceJac, TraceJacDeriv,
1395  TraceJacDerivSign, TraceIPSymJacArray);
1396  timer.Stop();
1397  timer.AccumulateRegion("CFSImplicit::AddMatNSBlkDiagBnd", 2);
1398 
1400 
1401  timer.Start();
1402  ElmtVarInvMtrx(gmtxarray, gmtVar, zero);
1403  timer.Stop();
1404  timer.AccumulateRegion("CFSImplicit::ElmtVarInvMtrx", 2);
1405 
1406  TransTraceJacMatToArray(TraceJac, TraceJacDeriv, TraceJacArray,
1407  TraceJacDerivArray);
1408 }
void ElmtVarInvMtrx(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TypeNekBlkMatSharedPtr &gmtVar, const DataType &tmpDatatype)
void AddMatNSBlkDiagVol(const Array< OneD, const Array< OneD, NekDouble >> &inarray, const Array< OneD, const TensorOfArray2D< NekDouble >> &qfield, Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, TensorOfArray4D< DataType > &StdMatDataDBB, TensorOfArray5D< DataType > &StdMatDataDBDB)
void MultiplyElmtInvMassPlusSource(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const NekDouble dtlamda, const DataType tmpDataType)
void Fill2DArrayOfBlkDiagonalMat(Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &gmtxarray, const DataType valu)
TensorOfArray4D< NekSingle > m_stdSMatDataDBB
TensorOfArray5D< NekSingle > m_stdSMatDataDBDB
void TransTraceJacMatToArray(const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, const Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, TensorOfArray4D< DataType > &TraceJacArray, TensorOfArray4D< DataType > &TraceJacDerivArray)
void AddMatNSBlkDiagBnd(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, TensorOfArray2D< TypeNekBlkMatSharedPtr > &gmtxarray, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJac, Array< OneD, TypeNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, DataType >> &TraceJacDerivSign, TensorOfArray5D< DataType > &TraceIPSymJacArray)
void CalcPhysDeriv(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield)
NekDouble m_TimeIntegLambda
coefff of spacial derivatives(rhs or m_F in GLM) in calculating the residual of the whole equation(us...

References Nektar::LibUtilities::Timer::AccumulateRegion(), AddMatNSBlkDiagBnd(), AddMatNSBlkDiagVol(), CalcPhysDeriv(), ElmtVarInvMtrx(), Fill2DArrayOfBlkDiagonalMat(), m_stdSMatDataDBB, m_stdSMatDataDBDB, Nektar::SolverUtils::UnsteadySystem::m_TimeIntegLambda, m_viscousJacFlag, MultiplyElmtInvMassPlusSource(), Nektar::LibUtilities::Timer::Start(), Nektar::LibUtilities::Timer::Stop(), and TransTraceJacMatToArray().

Referenced by InitialiseNonlinSysSolver().

◆ CalcRefValues()

void Nektar::CFSImplicit::CalcRefValues ( const Array< OneD, const NekDouble > &  inarray)

Definition at line 376 of file CompressibleFlowSystemImplicit.cpp.

377 {
378  unsigned int nvariables = m_fields.size();
379  unsigned int ntotal = inarray.size();
380  unsigned int npoints = ntotal / nvariables;
381 
382  unsigned int nTotalGlobal = ntotal;
383  m_comm->AllReduce(nTotalGlobal, Nektar::LibUtilities::ReduceSum);
384  unsigned int nTotalDOF = nTotalGlobal / nvariables;
385  NekDouble invTotalDOF = 1.0 / nTotalDOF;
386 
387  m_inArrayNorm = 0.0;
388  m_magnitdEstimat = Array<OneD, NekDouble>(nvariables, 0.0);
389 
390  for (int i = 0; i < nvariables; ++i)
391  {
392  int offset = i * npoints;
393  m_magnitdEstimat[i] =
394  Vmath::Dot(npoints, inarray + offset, inarray + offset);
395  }
397 
398  for (int i = 0; i < nvariables; ++i)
399  {
401  }
402 
403  for (int i = 2; i < nvariables - 1; ++i)
404  {
406  }
407  for (int i = 2; i < nvariables - 1; ++i)
408  {
410  }
411 
412  for (int i = 0; i < nvariables; ++i)
413  {
414  m_magnitdEstimat[i] = sqrt(m_magnitdEstimat[i] * invTotalDOF);
415  }
416  if (m_comm->GetRank() == 0 && m_verbose)
417  {
418  for (int i = 0; i < nvariables; ++i)
419  {
420  cout << "m_magnitdEstimat[" << i << "] = " << m_magnitdEstimat[i]
421  << endl;
422  }
423  cout << "m_inArrayNorm = " << m_inArrayNorm << endl;
424  }
425 }
LibUtilities::CommSharedPtr m_comm
Communicator.
Array< OneD, NekDouble > m_magnitdEstimat
estimate the magnitude of each conserved varibles
double NekDouble
T Dot(int n, const T *w, const T *x)
dot (vector times vector): z = w*x
Definition: Vmath.cpp:1100
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294

References Vmath::Dot(), Nektar::SolverUtils::EquationSystem::m_comm, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::UnsteadySystem::m_inArrayNorm, Nektar::SolverUtils::UnsteadySystem::m_magnitdEstimat, Nektar::SolverUtils::EquationSystem::m_verbose, Nektar::LibUtilities::ReduceSum, and tinysimd::sqrt().

Referenced by DoImplicitSolveCoeff().

◆ CalcTraceNumericalFlux()

void Nektar::CFSImplicit::CalcTraceNumericalFlux ( const int  nConvectiveFields,
const int  nDim,
const int  nPts,
const int  nTracePts,
const NekDouble  PenaltyFactor2,
const Array< OneD, MultiRegions::ExpListSharedPtr > &  fields,
const Array< OneD, const Array< OneD, NekDouble >> &  AdvVel,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
const NekDouble  time,
TensorOfArray3D< NekDouble > &  qfield,
const Array< OneD, const Array< OneD, NekDouble >> &  vFwd,
const Array< OneD, const Array< OneD, NekDouble >> &  vBwd,
const Array< OneD, const TensorOfArray2D< NekDouble >> &  qFwd,
const Array< OneD, const TensorOfArray2D< NekDouble >> &  qBwd,
const Array< OneD, NekDouble > &  MuVarTrace,
Array< OneD, int > &  nonZeroIndex,
Array< OneD, Array< OneD, NekDouble >> &  traceflux 
)
protected

Definition at line 1316 of file CompressibleFlowSystemImplicit.cpp.

1329 {
1330  boost::ignore_unused(nDim, nPts, PenaltyFactor2, time, qFwd, qBwd,
1331  MuVarTrace);
1332 
1333  if (m_advectionJacFlag)
1334  {
1335  m_advObject->AdvectTraceFlux(nConvectiveFields, m_fields, AdvVel,
1336  inarray, traceflux, m_bndEvaluateTime,
1337  vFwd, vBwd);
1338  }
1339  else
1340  {
1341  for (int i = 0; i < nConvectiveFields; i++)
1342  {
1343  traceflux[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1344  }
1345  }
1346 
1347  if (m_viscousJacFlag)
1348  {
1349  Array<OneD, Array<OneD, NekDouble>> visflux(nConvectiveFields);
1350  for (int i = 0; i < nConvectiveFields; i++)
1351  {
1352  visflux[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1353  }
1354 
1355  m_diffusion->DiffuseTraceFlux(fields, inarray, qfield,
1357  vFwd, vBwd, nonZeroIndex);
1358  for (int i = 0; i < nConvectiveFields; i++)
1359  {
1360  Vmath::Vsub(nTracePts, traceflux[i], 1, visflux[i], 1, traceflux[i],
1361  1);
1362  }
1363  }
1364 }
SolverUtils::DiffusionSharedPtr m_diffusion
static Array< OneD, Array< OneD, Array< OneD, NekDouble > > > NullNekDoubleTensorOfArray3D
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:419

References m_advectionJacFlag, Nektar::SolverUtils::AdvectionSystem::m_advObject, Nektar::CompressibleFlowSystem::m_bndEvaluateTime, Nektar::CompressibleFlowSystem::m_diffusion, Nektar::SolverUtils::EquationSystem::m_fields, m_viscousJacFlag, Nektar::NullNekDoubleTensorOfArray3D, and Vmath::Vsub().

Referenced by NumCalcRiemFluxJac().

◆ CalcVolJacStdMat()

template<typename DataType >
void Nektar::CFSImplicit::CalcVolJacStdMat ( TensorOfArray4D< DataType > &  StdMatDataDBB,
TensorOfArray5D< DataType > &  StdMatDataDBDB 
)
protected

Definition at line 808 of file CompressibleFlowSystemImplicit.cpp.

810 {
811  std::shared_ptr<LocalRegions::ExpansionVector> expvect =
812  m_fields[0]->GetExp();
813  int nTotElmt = (*expvect).size();
814 
815  StdMatDataDBB = TensorOfArray4D<DataType>(nTotElmt);
816  StdMatDataDBDB = TensorOfArray5D<DataType>(nTotElmt);
817 
818  vector<DNekMatSharedPtr> VectStdDerivBase0;
819  vector<TensorOfArray3D<DataType>> VectStdDerivBase_Base;
820  vector<TensorOfArray4D<DataType>> VectStdDervBase_DervBase;
821  DNekMatSharedPtr MatStdDerivBase0;
822  Array<OneD, DNekMatSharedPtr> ArrayStdMat(m_spacedim);
823  Array<OneD, Array<OneD, NekDouble>> ArrayStdMatData(m_spacedim);
824  for (int ne = 0; ne < nTotElmt; ne++)
825  {
827  stdExp = (*expvect)[ne]->GetStdExp();
828  StdRegions::StdMatrixKey matkey(StdRegions::eDerivBase0,
829  stdExp->DetShapeType(), *stdExp);
830  MatStdDerivBase0 = stdExp->GetStdMatrix(matkey);
831 
832  int nTotStdExp = VectStdDerivBase0.size();
833  int nFoundStdExp = -1;
834  for (int i = 0; i < nTotStdExp; i++)
835  {
836  if ((*VectStdDerivBase0[i]) == (*MatStdDerivBase0))
837  {
838  nFoundStdExp = i;
839  }
840  }
841  if (nFoundStdExp >= 0)
842  {
843  StdMatDataDBB[ne] = VectStdDerivBase_Base[nFoundStdExp];
844  StdMatDataDBDB[ne] = VectStdDervBase_DervBase[nFoundStdExp];
845  }
846  else
847  {
848  int nElmtCoef = (*expvect)[ne]->GetNcoeffs();
849  int nElmtCoef2 = nElmtCoef * nElmtCoef;
850  int nElmtPnt = (*expvect)[ne]->GetTotPoints();
851 
852  int nQuot = nElmtCoef2 / m_nPadding;
853  int nRemd = nElmtCoef2 - nQuot * m_nPadding;
854  int nQuotPlus = nQuot;
855  if (nRemd > 0)
856  {
857  nQuotPlus++;
858  }
859  int nPaded = nQuotPlus * m_nPadding;
860 
861  ArrayStdMat[0] = MatStdDerivBase0;
862  if (m_spacedim > 1)
863  {
864  StdRegions::StdMatrixKey matkey(
865  StdRegions::eDerivBase1, stdExp->DetShapeType(), *stdExp);
866  ArrayStdMat[1] = stdExp->GetStdMatrix(matkey);
867 
868  if (m_spacedim > 2)
869  {
870  StdRegions::StdMatrixKey matkey(StdRegions::eDerivBase2,
871  stdExp->DetShapeType(),
872  *stdExp);
873  ArrayStdMat[2] = stdExp->GetStdMatrix(matkey);
874  }
875  }
876  for (int nd0 = 0; nd0 < m_spacedim; nd0++)
877  {
878  ArrayStdMatData[nd0] = ArrayStdMat[nd0]->GetPtr();
879  }
880 
881  StdRegions::StdMatrixKey matkey(StdRegions::eBwdMat,
882  stdExp->DetShapeType(), *stdExp);
883  DNekMatSharedPtr BwdMat = stdExp->GetStdMatrix(matkey);
884  Array<OneD, NekDouble> BwdMatData = BwdMat->GetPtr();
885 
886  TensorOfArray3D<DataType> tmpStdDBB(m_spacedim);
887  TensorOfArray4D<DataType> tmpStdDBDB(m_spacedim);
888 
889  for (int nd0 = 0; nd0 < m_spacedim; nd0++)
890  {
891  tmpStdDBB[nd0] = Array<OneD, Array<OneD, DataType>>(nElmtPnt);
892  for (int i = 0; i < nElmtPnt; i++)
893  {
894  tmpStdDBB[nd0][i] = Array<OneD, DataType>(nPaded, 0.0);
895  for (int nc1 = 0; nc1 < nElmtCoef; nc1++)
896  {
897  int noffset = nc1 * nElmtCoef;
898  for (int nc0 = 0; nc0 < nElmtCoef; nc0++)
899  {
900  tmpStdDBB[nd0][i][nc0 + noffset] = DataType(
901  ArrayStdMatData[nd0][i * nElmtCoef + nc0] *
902  BwdMatData[i * nElmtCoef + nc1]);
903  }
904  }
905  }
906 
907  tmpStdDBDB[nd0] = TensorOfArray3D<DataType>(m_spacedim);
908  for (int nd1 = 0; nd1 < m_spacedim; nd1++)
909  {
910  tmpStdDBDB[nd0][nd1] =
911  Array<OneD, Array<OneD, DataType>>(nElmtPnt);
912  for (int i = 0; i < nElmtPnt; i++)
913  {
914  tmpStdDBDB[nd0][nd1][i] =
915  Array<OneD, DataType>(nPaded, 0.0);
916  for (int nc1 = 0; nc1 < nElmtCoef; nc1++)
917  {
918  int noffset = nc1 * nElmtCoef;
919  for (int nc0 = 0; nc0 < nElmtCoef; nc0++)
920  {
921  tmpStdDBDB[nd0][nd1][i][nc0 + noffset] =
922  DataType(
923  ArrayStdMatData[nd0]
924  [i * nElmtCoef + nc0] *
925  ArrayStdMatData[nd1]
926  [i * nElmtCoef + nc1]);
927  }
928  }
929  }
930  }
931  }
932  VectStdDerivBase0.push_back(MatStdDerivBase0);
933  VectStdDerivBase_Base.push_back(tmpStdDBB);
934  VectStdDervBase_DervBase.push_back(tmpStdDBDB);
935 
936  StdMatDataDBB[ne] = tmpStdDBB;
937  StdMatDataDBDB[ne] = tmpStdDBDB;
938  }
939  }
940 }
std::shared_ptr< StdExpansion > StdExpansionSharedPtr

References Nektar::StdRegions::eBwdMat, Nektar::StdRegions::eDerivBase0, Nektar::StdRegions::eDerivBase1, Nektar::StdRegions::eDerivBase2, Nektar::SolverUtils::EquationSystem::m_fields, m_nPadding, and Nektar::SolverUtils::EquationSystem::m_spacedim.

Referenced by AddMatNSBlkDiagVol().

◆ DoAdvectionCoeff()

void Nektar::CFSImplicit::DoAdvectionCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const NekDouble  time,
const Array< OneD, const Array< OneD, NekDouble >> &  pFwd,
const Array< OneD, const Array< OneD, NekDouble >> &  pBwd 
)

Compute the advection terms for the right-hand side.

Definition at line 300 of file CompressibleFlowSystemImplicit.cpp.

305 {
306  int nvariables = inarray.size();
307  Array<OneD, Array<OneD, NekDouble>> advVel(m_spacedim);
308 
309  m_advObject->AdvectCoeffs(nvariables, m_fields, advVel, inarray, outarray,
310  time, pFwd, pBwd);
311 }

References Nektar::SolverUtils::AdvectionSystem::m_advObject, Nektar::SolverUtils::EquationSystem::m_fields, and Nektar::SolverUtils::EquationSystem::m_spacedim.

Referenced by DoOdeRhsCoeff().

◆ DoDiffusionCoeff()

void Nektar::CFSImplicit::DoDiffusionCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const Array< OneD, const Array< OneD, NekDouble >> &  pFwd,
const Array< OneD, const Array< OneD, NekDouble >> &  pBwd 
)
protected

Add the diffusions terms to the right-hand side Similar to DoDiffusion() but with outarray in coefficient space.

Definition at line 1692 of file CompressibleFlowSystemImplicit.cpp.

1697 {
1698  v_DoDiffusionCoeff(inarray, outarray, pFwd, pBwd);
1699 }
virtual void v_DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)

References v_DoDiffusionCoeff().

Referenced by DoOdeRhsCoeff().

◆ DoImplicitSolve()

void Nektar::CFSImplicit::DoImplicitSolve ( const Array< OneD, const Array< OneD, NekDouble >> &  inpnts,
Array< OneD, Array< OneD, NekDouble >> &  outpnt,
const NekDouble  time,
const NekDouble  lambda 
)

Definition at line 313 of file CompressibleFlowSystemImplicit.cpp.

317 {
318  unsigned int nvariables = inpnts.size();
319  unsigned int ncoeffs = m_fields[0]->GetNcoeffs();
320  unsigned int ntotal = nvariables * ncoeffs;
321 
322  Array<OneD, NekDouble> inarray(ntotal);
323  Array<OneD, NekDouble> out(ntotal);
324  Array<OneD, NekDouble> tmpArray;
325 
326  // Switch flag to make sure the physical shock capturing AV is updated
327  m_updateShockCaptPhys = true;
328 
329  for (int i = 0; i < nvariables; ++i)
330  {
331  int noffset = i * ncoeffs;
332  tmpArray = inarray + noffset;
333  m_fields[i]->FwdTrans(inpnts[i], tmpArray);
334  }
335 
336  DoImplicitSolveCoeff(inpnts, inarray, out, time, lambda);
337 
338  for (int i = 0; i < nvariables; ++i)
339  {
340  int noffset = i * ncoeffs;
341  tmpArray = out + noffset;
342  m_fields[i]->BwdTrans(tmpArray, outpnt[i]);
343  }
344 }
void DoImplicitSolveCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inpnts, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const NekDouble time, const NekDouble lambda)

References DoImplicitSolveCoeff(), Nektar::SolverUtils::EquationSystem::m_fields, and m_updateShockCaptPhys.

Referenced by v_InitObject().

◆ DoImplicitSolveCoeff()

void Nektar::CFSImplicit::DoImplicitSolveCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inpnts,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out,
const NekDouble  time,
const NekDouble  lambda 
)

Definition at line 346 of file CompressibleFlowSystemImplicit.cpp.

350 {
351  boost::ignore_unused(inpnts);
352 
353  m_TimeIntegLambda = lambda;
354  m_bndEvaluateTime = time;
355  m_solutionPhys = inpnts;
356  unsigned int ntotal = inarray.size();
357 
358  if (m_inArrayNorm < 0.0)
359  {
360  CalcRefValues(inarray);
361  }
362 
363  NekDouble tol2 =
365 
366  m_nonlinsol->SetupNekNonlinSystem(ntotal, inarray, inarray, 0);
367 
368  m_TotNewtonIts += m_nonlinsol->SolveSystem(ntotal, inarray, out, 0, tol2);
369 
370  m_TotLinIts += m_nonlinsol->GetNtotLinSysIts();
371 
372  m_TotImpStages++;
373  m_StagesPerStep++;
374 }
LibUtilities::NekNonlinSysSharedPtr m_nonlinsol
void CalcRefValues(const Array< OneD, const NekDouble > &inarray)
Array< OneD, Array< OneD, NekDouble > > m_solutionPhys

References CalcRefValues(), Nektar::CompressibleFlowSystem::m_bndEvaluateTime, Nektar::SolverUtils::UnsteadySystem::m_inArrayNorm, m_newtonAbsoluteIteTol, m_nonlinsol, m_solutionPhys, Nektar::SolverUtils::UnsteadySystem::m_StagesPerStep, Nektar::SolverUtils::UnsteadySystem::m_TimeIntegLambda, Nektar::SolverUtils::UnsteadySystem::m_TotImpStages, Nektar::SolverUtils::UnsteadySystem::m_TotLinIts, and Nektar::SolverUtils::UnsteadySystem::m_TotNewtonIts.

Referenced by DoImplicitSolve().

◆ DoOdeRhsCoeff()

void Nektar::CFSImplicit::DoOdeRhsCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const NekDouble  time 
)

Compute the right-hand side.

Definition at line 221 of file CompressibleFlowSystemImplicit.cpp.

224 {
225  LibUtilities::Timer timer;
226 
227  int nvariables = inarray.size();
228  int nTracePts = GetTraceTotPoints();
229  int ncoeffs = GetNcoeffs();
230  // Store forwards/backwards space along trace space
231  Array<OneD, Array<OneD, NekDouble>> Fwd(nvariables);
232  Array<OneD, Array<OneD, NekDouble>> Bwd(nvariables);
233 
235  {
238  }
239  else
240  {
241  for (int i = 0; i < nvariables; ++i)
242  {
243  Fwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
244  Bwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
245  m_fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
246  }
247  }
248 
249  // Calculate advection
250  timer.Start();
251  DoAdvectionCoeff(inarray, outarray, time, Fwd, Bwd);
252  timer.Stop();
253  timer.AccumulateRegion("CFSImplicit::DoAdvectionCoeff", 2);
254 
255  // Negate results
256  for (int i = 0; i < nvariables; ++i)
257  {
258  Vmath::Neg(ncoeffs, outarray[i], 1);
259  }
260 
261  timer.Start();
262  DoDiffusionCoeff(inarray, outarray, Fwd, Bwd);
263  timer.Stop();
264  timer.AccumulateRegion("CFSImplicit::DoDiffusionCoeff", 2);
265 
266  // Add forcing terms
267  for (auto &x : m_forcing)
268  {
269  x->ApplyCoeff(m_fields, inarray, outarray, time);
270  }
271 
272  if (m_useLocalTimeStep)
273  {
274  int nElements = m_fields[0]->GetExpSize();
275  int nq, offset;
276  NekDouble fac;
277  Array<OneD, NekDouble> tmp;
278 
279  Array<OneD, NekDouble> tstep(nElements, 0.0);
280  GetElmtTimeStep(inarray, tstep);
281 
282  // Loop over elements
283  for (int n = 0; n < nElements; ++n)
284  {
285  nq = m_fields[0]->GetExp(n)->GetNcoeffs();
286  offset = m_fields[0]->GetCoeff_Offset(n);
287  fac = tstep[n] / m_timestep;
288  for (int i = 0; i < nvariables; ++i)
289  {
290  Vmath::Smul(nq, fac, outarray[i] + offset, 1,
291  tmp = outarray[i] + offset, 1);
292  }
293  }
294  }
295 }
void DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
Add the diffusions terms to the right-hand side Similar to DoDiffusion() but with outarray in coeffic...
void DoAdvectionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd)
Compute the advection terms for the right-hand side.
void GetElmtTimeStep(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &tstep)
Calculate the maximum timestep on each element subject to CFL restrictions.
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
NekDouble m_timestep
Time step size.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
enum HomogeneousType m_HomogeneousType
SOLVER_UTILS_EXPORT int GetNcoeffs()
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:518
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.cpp:248

References Nektar::LibUtilities::Timer::AccumulateRegion(), DoAdvectionCoeff(), DoDiffusionCoeff(), Nektar::SolverUtils::EquationSystem::eHomogeneous1D, Nektar::CompressibleFlowSystem::GetElmtTimeStep(), Nektar::SolverUtils::EquationSystem::GetNcoeffs(), Nektar::SolverUtils::EquationSystem::GetTraceTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, Nektar::CompressibleFlowSystem::m_forcing, Nektar::SolverUtils::EquationSystem::m_HomogeneousType, Nektar::SolverUtils::EquationSystem::m_timestep, Nektar::CompressibleFlowSystem::m_useLocalTimeStep, Vmath::Neg(), Nektar::NullNekDoubleArrayOfArray, Vmath::Smul(), Nektar::LibUtilities::Timer::Start(), and Nektar::LibUtilities::Timer::Stop().

Referenced by NonlinSysEvaluatorCoeff().

◆ ElmtVarInvMtrx()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::ElmtVarInvMtrx ( Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &  gmtxarray,
TypeNekBlkMatSharedPtr &  gmtVar,
const DataType &  tmpDatatype 
)
protected

Definition at line 972 of file CompressibleFlowSystemImplicit.cpp.

975 {
976  boost::ignore_unused(tmpDataType);
977 
978  int n1d = gmtxarray.size();
979  int n2d = gmtxarray[0].size();
980  int nConvectiveFields = n1d;
981 
982  ASSERTL0(n1d == n2d, "ElmtVarInvMtrx requires n1d==n2d");
983 
984  Array<OneD, unsigned int> rowSizes;
985  Array<OneD, unsigned int> colSizes;
986 
987  gmtxarray[0][0]->GetBlockSizes(rowSizes, colSizes);
988  int nTotElmt = rowSizes.size();
989  int nElmtCoef = rowSizes[0] - 1;
990  int nElmtCoef0 = -1;
991  int blocksize = -1;
992 
993  Array<OneD, unsigned int> tmprow(1);
994  TypeNekBlkMatSharedPtr tmpGmtx;
995 
996  Array<OneD, DataType> GMatData, ElmtMatData;
997  Array<OneD, DataType> tmpArray1, tmpArray2;
998 
999  for (int nelmt = 0; nelmt < nTotElmt; nelmt++)
1000  {
1001  int nrows = gmtxarray[0][0]->GetBlock(nelmt, nelmt)->GetRows();
1002  int ncols = gmtxarray[0][0]->GetBlock(nelmt, nelmt)->GetColumns();
1003  ASSERTL0(nrows == ncols, "ElmtVarInvMtrx requires nrows==ncols");
1004 
1005  nElmtCoef = nrows;
1006 
1007  if (nElmtCoef0 != nElmtCoef)
1008  {
1009  nElmtCoef0 = nElmtCoef;
1010  int nElmtCoefVar = nElmtCoef0 * nConvectiveFields;
1011  blocksize = nElmtCoefVar * nElmtCoefVar;
1012  tmprow[0] = nElmtCoefVar;
1013  AllocateNekBlkMatDig(tmpGmtx, tmprow, tmprow);
1014  GMatData = tmpGmtx->GetBlock(0, 0)->GetPtr();
1015  }
1016 
1017  for (int n = 0; n < nConvectiveFields; n++)
1018  {
1019  for (int m = 0; m < nConvectiveFields; m++)
1020  {
1021  ElmtMatData = gmtxarray[m][n]->GetBlock(nelmt, nelmt)->GetPtr();
1022 
1023  for (int ncl = 0; ncl < nElmtCoef; ncl++)
1024  {
1025  int Goffset =
1026  (n * nElmtCoef + ncl) * nConvectiveFields * nElmtCoef +
1027  m * nElmtCoef;
1028  int Eoffset = ncl * nElmtCoef;
1029 
1030  Vmath::Vcopy(nElmtCoef, tmpArray1 = ElmtMatData + Eoffset,
1031  1, tmpArray2 = GMatData + Goffset, 1);
1032  }
1033  }
1034  }
1035 
1036  tmpGmtx->GetBlock(0, 0)->Invert();
1037 
1038  for (int m = 0; m < nConvectiveFields; m++)
1039  {
1040  for (int n = 0; n < nConvectiveFields; n++)
1041  {
1042  ElmtMatData = gmtxarray[m][n]->GetBlock(nelmt, nelmt)->GetPtr();
1043 
1044  for (int ncl = 0; ncl < nElmtCoef; ncl++)
1045  {
1046  int Goffset =
1047  (n * nElmtCoef + ncl) * nConvectiveFields * nElmtCoef +
1048  m * nElmtCoef;
1049  int Eoffset = ncl * nElmtCoef;
1050 
1051  Vmath::Vcopy(nElmtCoef, tmpArray1 = GMatData + Goffset, 1,
1052  tmpArray2 = ElmtMatData + Eoffset, 1);
1053  }
1054  }
1055  }
1056  ElmtMatData = gmtVar->GetBlock(nelmt, nelmt)->GetPtr();
1057  Vmath::Vcopy(blocksize, GMatData, 1, ElmtMatData, 1);
1058  }
1059  return;
1060 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
void AllocateNekBlkMatDig(SNekBlkMatSharedPtr &mat, const Array< OneD, unsigned int > nrow, const Array< OneD, unsigned int > ncol)

References AllocateNekBlkMatDig(), ASSERTL0, and Vmath::Vcopy().

Referenced by CalcPreconMatBRJCoeff().

◆ Fill1DArrayOfBlkDiagonalMat()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::Fill1DArrayOfBlkDiagonalMat ( Array< OneD, TypeNekBlkMatSharedPtr > &  gmtxarray,
const DataType  valu 
)
protected

Definition at line 1774 of file CompressibleFlowSystemImplicit.cpp.

1776 {
1777  int n1d = gmtxarray.size();
1778 
1779  Array<OneD, unsigned int> rowSizes;
1780  Array<OneD, unsigned int> colSizes;
1781 
1782  Array<OneD, DataType> loc_mat_arr;
1783 
1784  for (int n1 = 0; n1 < n1d; ++n1)
1785  {
1786  gmtxarray[n1]->GetBlockSizes(rowSizes, colSizes);
1787  int nelmts = rowSizes.size();
1788 
1789  for (int i = 0; i < nelmts; ++i)
1790  {
1791  loc_mat_arr = gmtxarray[n1]->GetBlock(i, i)->GetPtr();
1792 
1793  int nrows = gmtxarray[n1]->GetBlock(i, i)->GetRows();
1794  int ncols = gmtxarray[n1]->GetBlock(i, i)->GetColumns();
1795 
1796  Vmath::Fill(nrows * ncols, valu, loc_mat_arr, 1);
1797  }
1798  }
1799 }

References Vmath::Fill().

Referenced by Fill2DArrayOfBlkDiagonalMat().

◆ Fill2DArrayOfBlkDiagonalMat()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::Fill2DArrayOfBlkDiagonalMat ( Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &  gmtxarray,
const DataType  valu 
)
protected

Definition at line 1760 of file CompressibleFlowSystemImplicit.cpp.

1763 {
1764 
1765  int n1d = gmtxarray.size();
1766 
1767  for (int n1 = 0; n1 < n1d; ++n1)
1768  {
1769  Fill1DArrayOfBlkDiagonalMat(gmtxarray[n1], valu);
1770  }
1771 }
void Fill1DArrayOfBlkDiagonalMat(Array< OneD, TypeNekBlkMatSharedPtr > &gmtxarray, const DataType valu)

References Fill1DArrayOfBlkDiagonalMat().

Referenced by CalcPreconMatBRJCoeff().

◆ GetFluxDerivJacDirctn() [1/2]

void Nektar::CFSImplicit::GetFluxDerivJacDirctn ( const MultiRegions::ExpListSharedPtr explist,
const Array< OneD, const Array< OneD, NekDouble >> &  normals,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, DNekMatSharedPtr >> &  ElmtJac 
)
inlineprotected

Definition at line 293 of file CompressibleFlowSystemImplicit.h.

299  {
300  v_GetFluxDerivJacDirctn(explist, normals, nDervDir, inarray, ElmtJac);
301  }
virtual void v_GetFluxDerivJacDirctn(const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir)

References v_GetFluxDerivJacDirctn().

◆ GetFluxDerivJacDirctn() [2/2]

void Nektar::CFSImplicit::GetFluxDerivJacDirctn ( const MultiRegions::ExpListSharedPtr explist,
const Array< OneD, const Array< OneD, NekDouble >> &  normals,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray5D< NekDouble > &  ElmtJacArray,
const int  nFluxDir 
)
inlineprotected

Definition at line 269 of file CompressibleFlowSystemImplicit.h.

275  {
276  v_GetFluxDerivJacDirctn(explist, normals, nDervDir, inarray,
277  ElmtJacArray, nFluxDir);
278  }

References v_GetFluxDerivJacDirctn().

◆ GetFluxDerivJacDirctnElmt()

void Nektar::CFSImplicit::GetFluxDerivJacDirctnElmt ( const int  nConvectiveFields,
const int  nElmtPnt,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  locVars,
const Array< OneD, NekDouble > &  locmu,
const Array< OneD, const Array< OneD, NekDouble >> &  locnormal,
DNekMatSharedPtr wspMat,
Array< OneD, Array< OneD, NekDouble >> &  PntJacArray 
)
inlineprotected

Definition at line 280 of file CompressibleFlowSystemImplicit.h.

287  {
288  v_GetFluxDerivJacDirctnElmt(nConvectiveFields, nElmtPnt, nDervDir,
289  locVars, locmu, locnormal, wspMat,
290  PntJacArray);
291  }
virtual void v_GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)

References v_GetFluxDerivJacDirctnElmt().

Referenced by AddMatNSBlkDiagVol().

◆ GetFluxVectorJacDirElmt()

void Nektar::CFSImplicit::GetFluxVectorJacDirElmt ( const int  nConvectiveFields,
const int  nElmtPnt,
const Array< OneD, const Array< OneD, NekDouble >> &  locVars,
const Array< OneD, NekDouble > &  normals,
DNekMatSharedPtr wspMat,
Array< OneD, Array< OneD, NekDouble >> &  PntJacArray 
)
protected

Definition at line 1594 of file CompressibleFlowSystemImplicit.cpp.

1599 {
1600  Array<OneD, NekDouble> wspMatData = wspMat->GetPtr();
1601 
1602  int matsize = nConvectiveFields * nConvectiveFields;
1603 
1604  Array<OneD, NekDouble> pointVar(nConvectiveFields);
1605 
1606  for (int npnt = 0; npnt < nElmtPnt; npnt++)
1607  {
1608  for (int j = 0; j < nConvectiveFields; j++)
1609  {
1610  pointVar[j] = locVars[j][npnt];
1611  }
1612 
1613  GetFluxVectorJacPoint(nConvectiveFields, pointVar, normals, wspMat);
1614 
1615  Vmath::Vcopy(matsize, wspMatData, 1, PntJacArray[npnt], 1);
1616  }
1617  return;
1618 }
void GetFluxVectorJacPoint(const int nConvectiveFields, const Array< OneD, NekDouble > &conservVar, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &fluxJac)

References GetFluxVectorJacPoint(), and Vmath::Vcopy().

Referenced by AddMatNSBlkDiagVol().

◆ GetFluxVectorJacPoint()

void Nektar::CFSImplicit::GetFluxVectorJacPoint ( const int  nConvectiveFields,
const Array< OneD, NekDouble > &  conservVar,
const Array< OneD, NekDouble > &  normals,
DNekMatSharedPtr fluxJac 
)
protected

Definition at line 1620 of file CompressibleFlowSystemImplicit.cpp.

1623 {
1624  int nvariables = conservVar.size();
1625  const int nvariables3D = 5;
1626  int expDim = m_spacedim;
1627 
1628  NekDouble fsw, efix_StegerWarming;
1629  efix_StegerWarming = 0.0;
1630  fsw = 0.0; // exact flux Jacobian if fsw=0.0
1631  if (nvariables > expDim + 2)
1632  {
1633  NEKERROR(ErrorUtil::efatal, "nvariables > expDim+2 case not coded")
1634  }
1635 
1636  Array<OneD, NekDouble> fluxJacData;
1637  ;
1638  fluxJacData = fluxJac->GetPtr();
1639 
1640  if (nConvectiveFields == nvariables3D)
1641  {
1642  PointFluxJacobianPoint(conservVar, normals, fluxJac, efix_StegerWarming,
1643  fsw);
1644  }
1645  else
1646  {
1647  DNekMatSharedPtr PointFJac3D =
1649  nvariables3D, 0.0);
1650 
1651  Array<OneD, NekDouble> PointFJac3DData;
1652  PointFJac3DData = PointFJac3D->GetPtr();
1653 
1654  Array<OneD, NekDouble> PointFwd(nvariables3D, 0.0);
1655 
1656  Array<OneD, unsigned int> index(nvariables);
1657 
1658  index[nvariables - 1] = 4;
1659  for (int i = 0; i < nvariables - 1; i++)
1660  {
1661  index[i] = i;
1662  }
1663 
1664  int nj = 0;
1665  int nk = 0;
1666  for (int j = 0; j < nvariables; j++)
1667  {
1668  nj = index[j];
1669  PointFwd[nj] = conservVar[j];
1670  }
1671 
1672  PointFluxJacobianPoint(PointFwd, normals, PointFJac3D,
1673  efix_StegerWarming, fsw);
1674 
1675  for (int j = 0; j < nvariables; j++)
1676  {
1677  nj = index[j];
1678  for (int k = 0; k < nvariables; k++)
1679  {
1680  nk = index[k];
1681  fluxJacData[j + k * nConvectiveFields] =
1682  PointFJac3DData[nj + nk * nvariables3D];
1683  }
1684  }
1685  }
1686 }
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:209
void PointFluxJacobianPoint(const Array< OneD, NekDouble > &Fwd, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &FJac, const NekDouble efix, const NekDouble fsw)

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::ErrorUtil::efatal, Nektar::SolverUtils::EquationSystem::m_spacedim, NEKERROR, and PointFluxJacobianPoint().

Referenced by GetFluxVectorJacDirElmt().

◆ GetTraceJac()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::GetTraceJac ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray3D< NekDouble > &  qfield,
Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJac,
Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJacDeriv,
Array< OneD, Array< OneD, DataType >> &  TraceJacDerivSign,
TensorOfArray5D< DataType > &  TraceIPSymJacArray 
)
protected

Definition at line 1063 of file CompressibleFlowSystemImplicit.cpp.

1070 {
1071  boost::ignore_unused(TraceJacDeriv, TraceJacDerivSign);
1072 
1073  int nvariables = inarray.size();
1074  int nTracePts = GetTraceTotPoints();
1075 
1076  // Store forwards/backwards space along trace space
1077  Array<OneD, Array<OneD, NekDouble>> Fwd(nvariables);
1078  Array<OneD, Array<OneD, NekDouble>> Bwd(nvariables);
1079 
1080  TypeNekBlkMatSharedPtr FJac, BJac;
1081  Array<OneD, unsigned int> n_blks1(nTracePts, nvariables);
1082 
1083  if (TraceJac.size() > 0)
1084  {
1085  FJac = TraceJac[0];
1086  BJac = TraceJac[1];
1087  }
1088  else
1089  {
1090  TraceJac = Array<OneD, TypeNekBlkMatSharedPtr>(2);
1091 
1092  AllocateNekBlkMatDig(FJac, n_blks1, n_blks1);
1093  AllocateNekBlkMatDig(BJac, n_blks1, n_blks1);
1094  }
1095 
1097  {
1100  }
1101  else
1102  {
1103  for (int i = 0; i < nvariables; ++i)
1104  {
1105  Fwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1106  Bwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1107  m_fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
1108  }
1109  }
1110 
1111  Array<OneD, Array<OneD, NekDouble>> AdvVel(m_spacedim);
1112 
1113  NumCalcRiemFluxJac(nvariables, m_fields, AdvVel, inarray, qfield,
1114  m_bndEvaluateTime, Fwd, Bwd, FJac, BJac,
1115  TraceIPSymJacArray);
1116 
1117  TraceJac[0] = FJac;
1118  TraceJac[1] = BJac;
1119 }
void NumCalcRiemFluxJac(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield, const NekDouble &time, const Array< OneD, const Array< OneD, NekDouble >> &Fwd, const Array< OneD, const Array< OneD, NekDouble >> &Bwd, TypeNekBlkMatSharedPtr &FJac, TypeNekBlkMatSharedPtr &BJac, TensorOfArray5D< DataType > &TraceIPSymJacArray)

References AllocateNekBlkMatDig(), Nektar::SolverUtils::EquationSystem::eHomogeneous1D, Nektar::SolverUtils::EquationSystem::GetTraceTotPoints(), Nektar::CompressibleFlowSystem::m_bndEvaluateTime, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::EquationSystem::m_HomogeneousType, Nektar::SolverUtils::EquationSystem::m_spacedim, Nektar::NullNekDoubleArrayOfArray, and NumCalcRiemFluxJac().

Referenced by AddMatNSBlkDiagBnd().

◆ InitialiseNonlinSysSolver()

void Nektar::CFSImplicit::InitialiseNonlinSysSolver ( )

Definition at line 78 of file CompressibleFlowSystemImplicit.cpp.

79 {
80  std::string SolverType = "Newton";
81  if (m_session->DefinesSolverInfo("NonlinSysIterSolver"))
82  {
83  SolverType = m_session->GetSolverInfo("NonlinSysIterSolver");
84  }
85  ASSERTL0(LibUtilities::GetNekNonlinSysFactory().ModuleExists(SolverType),
86  "NekNonlinSys '" + SolverType + "' is not defined.\n");
87  int ntotal = m_fields[0]->GetNcoeffs() * m_fields.size();
88 
89  LibUtilities::NekSysKey key = LibUtilities::NekSysKey();
90 
91  key.m_NonlinIterTolRelativeL2 = 1.0E-3;
92  key.m_LinSysRelativeTolInNonlin = 5.0E-2;
93  key.m_NekNonlinSysMaxIterations = 10;
94  key.m_NekLinSysMaxIterations = 30;
95  key.m_LinSysMaxStorage = 30;
96 
98  SolverType, m_session, m_comm, ntotal, key);
99 
100  LibUtilities::NekSysOperators nekSysOp;
101  nekSysOp.DefineNekSysResEval(&CFSImplicit::NonlinSysEvaluatorCoeff1D, this);
102  nekSysOp.DefineNekSysLhsEval(&CFSImplicit::MatrixMultiplyMatrixFreeCoeff,
103  this);
104  nekSysOp.DefineNekSysPrecon(&CFSImplicit::PreconCoeff, this);
105 
106  int nvariables = m_fields.size();
107  const MultiRegions::LocTraceToTraceMapSharedPtr locTraceToTraceMap =
108  m_fields[0]->GetLocTraceToTraceMap();
109 
110  locTraceToTraceMap->CalcLocTracePhysToTraceIDMap(m_fields[0]->GetTrace(),
111  m_spacedim);
112  for (int i = 1; i < nvariables; i++)
113  {
114  m_fields[i]->GetLocTraceToTraceMap()->SetLocTracePhysToTraceIDMap(
115  locTraceToTraceMap->GetLocTracephysToTraceIDMap());
116  }
117 
119  "PreconCfsBRJ", m_fields, m_session, m_comm);
120  NekPreconCfsOperators tmpPreconOp;
121  tmpPreconOp.DefineCalcPreconMatBRJCoeff(&CFSImplicit::CalcPreconMatBRJCoeff,
122  this);
123  m_preconCfs->SetOperators(tmpPreconOp);
124 
125  m_session->LoadParameter("NewtonAbsoluteIteTol", m_newtonAbsoluteIteTol,
126  1.0E-12);
127 
128  m_session->LoadParameter("nPadding", m_nPadding, 4);
129 
130  m_nonlinsol->SetSysOperators(nekSysOp);
131 }
void PreconCoeff(const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const bool &flag)
void NonlinSysEvaluatorCoeff1D(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag)
void MatrixMultiplyMatrixFreeCoeff(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=false)
void CalcPreconMatBRJCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, SNekBlkMatSharedPtr >> &gmtxarray, SNekBlkMatSharedPtr &gmtVar, Array< OneD, SNekBlkMatSharedPtr > &TraceJac, Array< OneD, SNekBlkMatSharedPtr > &TraceJacDeriv, Array< OneD, Array< OneD, NekSingle >> &TraceJacDerivSign, TensorOfArray4D< NekSingle > &TraceJacArray, TensorOfArray4D< NekSingle > &TraceJacDerivArray, TensorOfArray5D< NekSingle > &TraceIPSymJacArray)
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
Definition: NekFactory.hpp:144
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
NekNonlinSysFactory & GetNekNonlinSysFactory()
std::shared_ptr< LocTraceToTraceMap > LocTraceToTraceMapSharedPtr
PreconCfsOpFactory & GetPreconCfsOpFactory()
Declaration of the boundary condition factory singleton.
Definition: PreconCfsOp.cpp:42

References ASSERTL0, CalcPreconMatBRJCoeff(), Nektar::LibUtilities::NekFactory< tKey, tBase, tParam >::CreateInstance(), Nektar::NekPreconCfsOperators::DefineCalcPreconMatBRJCoeff(), Nektar::LibUtilities::NekSysOperators::DefineNekSysLhsEval(), Nektar::LibUtilities::NekSysOperators::DefineNekSysPrecon(), Nektar::LibUtilities::NekSysOperators::DefineNekSysResEval(), Nektar::LibUtilities::GetNekNonlinSysFactory(), Nektar::GetPreconCfsOpFactory(), Nektar::SolverUtils::EquationSystem::m_comm, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::LibUtilities::NekSysKey::m_LinSysMaxStorage, Nektar::LibUtilities::NekSysKey::m_LinSysRelativeTolInNonlin, Nektar::LibUtilities::NekSysKey::m_NekLinSysMaxIterations, Nektar::LibUtilities::NekSysKey::m_NekNonlinSysMaxIterations, m_newtonAbsoluteIteTol, Nektar::LibUtilities::NekSysKey::m_NonlinIterTolRelativeL2, m_nonlinsol, m_nPadding, m_preconCfs, Nektar::SolverUtils::EquationSystem::m_session, Nektar::SolverUtils::EquationSystem::m_spacedim, MatrixMultiplyMatrixFreeCoeff(), NonlinSysEvaluatorCoeff1D(), and PreconCoeff().

Referenced by v_InitObject().

◆ MatrixMultiplyMatrixFreeCoeff()

void Nektar::CFSImplicit::MatrixMultiplyMatrixFreeCoeff ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out,
const bool &  flag = false 
)
protected

Definition at line 1701 of file CompressibleFlowSystemImplicit.cpp.

1704 {
1705  boost::ignore_unused(flag);
1706  const Array<OneD, const NekDouble> refsol = m_nonlinsol->GetRefSolution();
1707  const Array<OneD, const NekDouble> refres = m_nonlinsol->GetRefResidual();
1708  const Array<OneD, const NekDouble> refsource =
1709  m_nonlinsol->GetRefSourceVec();
1710 
1711  NekDouble eps = m_jacobiFreeEps;
1712  unsigned int nTotalGlobal = inarray.size();
1713  NekDouble magninarray = Vmath::Dot(nTotalGlobal, inarray, inarray);
1714  m_comm->AllReduce(magninarray, Nektar::LibUtilities::ReduceSum);
1715  eps *= sqrt((sqrt(m_inArrayNorm) + 1.0) / magninarray);
1716 
1717  NekDouble oeps = 1.0 / eps;
1718  unsigned int ntotal = inarray.size();
1719  Array<OneD, NekDouble> solplus{ntotal, 0.0};
1720  Array<OneD, NekDouble> resplus{ntotal, 0.0};
1721 
1722  Vmath::Svtvp(ntotal, eps, inarray, 1, refsol, 1, solplus, 1);
1723 
1724  NonlinSysEvaluatorCoeff(solplus, resplus, flag, refsource);
1725 
1726  Vmath::Vsub(ntotal, resplus, 1, refres, 1, out, 1);
1727  Vmath::Smul(ntotal, oeps, out, 1, out, 1);
1728 
1729  return;
1730 }
void NonlinSysEvaluatorCoeff(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out, const bool &flag=true, const Array< OneD, const NekDouble > &source=NullNekDouble1DArray)
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
Definition: Vmath.cpp:622

References Vmath::Dot(), Nektar::SolverUtils::EquationSystem::m_comm, Nektar::SolverUtils::UnsteadySystem::m_inArrayNorm, m_jacobiFreeEps, m_nonlinsol, NonlinSysEvaluatorCoeff(), Nektar::LibUtilities::ReduceSum, Vmath::Smul(), tinysimd::sqrt(), Vmath::Svtvp(), and Vmath::Vsub().

Referenced by InitialiseNonlinSysSolver().

◆ MinusDiffusionFluxJacPoint()

void Nektar::CFSImplicit::MinusDiffusionFluxJacPoint ( const int  nConvectiveFields,
const int  nElmtPnt,
const Array< OneD, const Array< OneD, NekDouble >> &  locVars,
const TensorOfArray3D< NekDouble > &  locDerv,
const Array< OneD, NekDouble > &  locmu,
const Array< OneD, NekDouble > &  locDmuDT,
const Array< OneD, NekDouble > &  normals,
DNekMatSharedPtr wspMat,
Array< OneD, Array< OneD, NekDouble >> &  PntJacArray 
)
inlineprotected

Definition at line 255 of file CompressibleFlowSystemImplicit.h.

263  {
264  v_MinusDiffusionFluxJacPoint(nConvectiveFields, nElmtPnt, locVars,
265  locDerv, locmu, locDmuDT, normals, wspMat,
266  PntJacArray);
267  }
virtual void v_MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray)

References v_MinusDiffusionFluxJacPoint().

Referenced by AddMatNSBlkDiagVol().

◆ MultiplyElmtInvMassPlusSource()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::MultiplyElmtInvMassPlusSource ( Array< OneD, Array< OneD, TypeNekBlkMatSharedPtr >> &  gmtxarray,
const NekDouble  dtlamda,
const DataType  tmpDataType 
)
protected

Definition at line 1424 of file CompressibleFlowSystemImplicit.cpp.

1427 {
1428  boost::ignore_unused(tmpDataType);
1429 
1431  std::shared_ptr<LocalRegions::ExpansionVector> pexp = explist->GetExp();
1432  int nTotElmt = (*pexp).size();
1433  int nConvectiveFields = m_fields.size();
1434 
1435  NekDouble Negdtlamda = -dtlamda;
1436 
1437  Array<OneD, NekDouble> pseudotimefactor(nTotElmt, 0.0);
1438  Vmath::Fill(nTotElmt, Negdtlamda, pseudotimefactor, 1);
1439 
1440  Array<OneD, DataType> GMatData;
1441  for (int m = 0; m < nConvectiveFields; m++)
1442  {
1443  for (int n = 0; n < nConvectiveFields; n++)
1444  {
1445  for (int nelmt = 0; nelmt < nTotElmt; nelmt++)
1446  {
1447  GMatData = gmtxarray[m][n]->GetBlock(nelmt, nelmt)->GetPtr();
1448  DataType factor = DataType(pseudotimefactor[nelmt]);
1449 
1450  Vmath::Smul(GMatData.size(), factor, GMatData, 1, GMatData, 1);
1451  }
1452  }
1453  }
1454 
1455  DNekMatSharedPtr MassMat;
1456  Array<OneD, NekDouble> BwdMatData, MassMatData, tmp;
1457  Array<OneD, NekDouble> tmp2;
1458  Array<OneD, DataType> MassMatDataDataType;
1460 
1461  for (int nelmt = 0; nelmt < nTotElmt; nelmt++)
1462  {
1463  int nelmtcoef = GetNcoeffs(nelmt);
1464  int nelmtpnts = GetTotPoints(nelmt);
1465  LibUtilities::ShapeType ElmtTypeNow =
1466  explist->GetExp(nelmt)->DetShapeType();
1467 
1468  if (tmp.size() != nelmtcoef || (ElmtTypeNow != ElmtTypePrevious))
1469  {
1471  stdExp = explist->GetExp(nelmt)->GetStdExp();
1472  StdRegions::StdMatrixKey matkey(StdRegions::eBwdTrans,
1473  stdExp->DetShapeType(), *stdExp);
1474 
1475  DNekMatSharedPtr BwdMat = stdExp->GetStdMatrix(matkey);
1476  BwdMatData = BwdMat->GetPtr();
1477 
1478  if (nelmtcoef != tmp.size())
1479  {
1480  tmp = Array<OneD, NekDouble>(nelmtcoef, 0.0);
1482  nelmtcoef, nelmtcoef, 0.0);
1483  MassMatData = MassMat->GetPtr();
1484  MassMatDataDataType =
1485  Array<OneD, DataType>(nelmtcoef * nelmtcoef);
1486  }
1487 
1488  ElmtTypePrevious = ElmtTypeNow;
1489  }
1490 
1491  for (int np = 0; np < nelmtcoef; np++)
1492  {
1493  explist->GetExp(nelmt)->IProductWRTBase(BwdMatData + np * nelmtpnts,
1494  tmp);
1495  Vmath::Vcopy(nelmtcoef, tmp, 1, tmp2 = MassMatData + np * nelmtcoef,
1496  1);
1497  }
1498  for (int i = 0; i < MassMatData.size(); i++)
1499  {
1500  MassMatDataDataType[i] = DataType(MassMatData[i]);
1501  }
1502 
1503  for (int m = 0; m < nConvectiveFields; m++)
1504  {
1505  GMatData = gmtxarray[m][m]->GetBlock(nelmt, nelmt)->GetPtr();
1506  Vmath::Vadd(MassMatData.size(), MassMatDataDataType, 1, GMatData, 1,
1507  GMatData, 1);
1508  }
1509  }
1510  return;
1511 }
SOLVER_UTILS_EXPORT int GetTotPoints()
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::StdRegions::eBwdTrans, Nektar::LibUtilities::eNoShapeType, Vmath::Fill(), Nektar::SolverUtils::EquationSystem::GetNcoeffs(), Nektar::SolverUtils::EquationSystem::GetTotPoints(), Nektar::SolverUtils::EquationSystem::m_fields, Nektar::Array< OneD, const DataType >::size(), Vmath::Smul(), Vmath::Vadd(), and Vmath::Vcopy().

Referenced by CalcPreconMatBRJCoeff().

◆ NonlinSysEvaluatorCoeff() [1/2]

void Nektar::CFSImplicit::NonlinSysEvaluatorCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  out,
const Array< OneD, const Array< OneD, NekDouble >> &  source = NullNekDoubleArrayOfArray 
)

Definition at line 174 of file CompressibleFlowSystemImplicit.cpp.

178 {
179  LibUtilities::Timer timer;
180  unsigned int nvariable = inarray.size();
181  unsigned int ncoeffs = inarray[nvariable - 1].size();
182  unsigned int npoints = m_fields[0]->GetNpoints();
183 
184  Array<OneD, Array<OneD, NekDouble>> inpnts(nvariable);
185 
186  for (int i = 0; i < nvariable; ++i)
187  {
188  inpnts[i] = Array<OneD, NekDouble>(npoints, 0.0);
189  m_fields[i]->BwdTrans(inarray[i], inpnts[i]);
190  }
191 
192  timer.Start();
193  DoOdeProjection(inpnts, inpnts, m_bndEvaluateTime);
194  timer.Stop();
195  timer.AccumulateRegion("CompressibleFlowSystem::DoOdeProjection", 1);
196 
197  timer.Start();
198  DoOdeRhsCoeff(inpnts, out, m_bndEvaluateTime);
199  timer.Stop();
200  timer.AccumulateRegion("CFSImplicit::DoOdeRhsCoeff", 1);
201 
202  for (int i = 0; i < nvariable; ++i)
203  {
204  Vmath::Svtvp(ncoeffs, -m_TimeIntegLambda, out[i], 1, inarray[i], 1,
205  out[i], 1);
206  }
207 
208  if (NullNekDoubleArrayOfArray != source)
209  {
210  for (int i = 0; i < nvariable; ++i)
211  {
212  Vmath::Vsub(ncoeffs, out[i], 1, source[i], 1, out[i], 1);
213  }
214  }
215  return;
216 }
void DoOdeRhsCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
Compute the right-hand side.
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...

References Nektar::LibUtilities::Timer::AccumulateRegion(), Nektar::CompressibleFlowSystem::DoOdeProjection(), DoOdeRhsCoeff(), Nektar::CompressibleFlowSystem::m_bndEvaluateTime, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::UnsteadySystem::m_TimeIntegLambda, Nektar::NullNekDoubleArrayOfArray, Nektar::LibUtilities::Timer::Start(), Nektar::LibUtilities::Timer::Stop(), Vmath::Svtvp(), and Vmath::Vsub().

◆ NonlinSysEvaluatorCoeff() [2/2]

void Nektar::CFSImplicit::NonlinSysEvaluatorCoeff ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out,
const bool &  flag = true,
const Array< OneD, const NekDouble > &  source = NullNekDouble1DArray 
)

Definition at line 149 of file CompressibleFlowSystemImplicit.cpp.

152 {
153  LibUtilities::Timer timer;
154  boost::ignore_unused(flag);
155  unsigned int nvariables = m_fields.size();
156  unsigned int npoints = m_fields[0]->GetNcoeffs();
157  Array<OneD, Array<OneD, NekDouble>> in2D(nvariables);
158  Array<OneD, Array<OneD, NekDouble>> out2D(nvariables);
159  Array<OneD, Array<OneD, NekDouble>> source2D(nvariables);
160  for (int i = 0; i < nvariables; ++i)
161  {
162  int offset = i * npoints;
163  in2D[i] = inarray + offset;
164  out2D[i] = out + offset;
165  source2D[i] = source + offset;
166  }
167 
168  timer.Start();
169  NonlinSysEvaluatorCoeff(in2D, out2D, source2D);
170  timer.Stop();
171  timer.AccumulateRegion("CFSImplicit::NonlinSysEvaluatorCoeff");
172 }

References Nektar::LibUtilities::Timer::AccumulateRegion(), Nektar::SolverUtils::EquationSystem::m_fields, Nektar::LibUtilities::Timer::Start(), and Nektar::LibUtilities::Timer::Stop().

Referenced by MatrixMultiplyMatrixFreeCoeff(), and NonlinSysEvaluatorCoeff1D().

◆ NonlinSysEvaluatorCoeff1D()

void Nektar::CFSImplicit::NonlinSysEvaluatorCoeff1D ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  out,
const bool &  flag 
)

Definition at line 140 of file CompressibleFlowSystemImplicit.cpp.

143 {
144  const Array<OneD, const NekDouble> refsource =
145  m_nonlinsol->GetRefSourceVec();
146  NonlinSysEvaluatorCoeff(inarray, out, flag, refsource);
147 }

References m_nonlinsol, and NonlinSysEvaluatorCoeff().

Referenced by InitialiseNonlinSysSolver().

◆ NumCalcRiemFluxJac()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::NumCalcRiemFluxJac ( const int  nConvectiveFields,
const Array< OneD, MultiRegions::ExpListSharedPtr > &  fields,
const Array< OneD, const Array< OneD, NekDouble >> &  AdvVel,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray3D< NekDouble > &  qfield,
const NekDouble time,
const Array< OneD, const Array< OneD, NekDouble >> &  Fwd,
const Array< OneD, const Array< OneD, NekDouble >> &  Bwd,
TypeNekBlkMatSharedPtr &  FJac,
TypeNekBlkMatSharedPtr &  BJac,
TensorOfArray5D< DataType > &  TraceIPSymJacArray 
)
protected

Definition at line 1122 of file CompressibleFlowSystemImplicit.cpp.

1132 {
1133  boost::ignore_unused(TraceIPSymJacArray);
1134 
1135  const NekDouble PenaltyFactor2 = 0.0;
1136  int nvariables = nConvectiveFields;
1137  int npoints = GetNpoints();
1138  // int nPts = npoints;
1139  int nTracePts = GetTraceTotPoints();
1140  int nDim = m_spacedim;
1141 
1142  Array<OneD, int> nonZeroIndex;
1143 
1144  Array<OneD, Array<OneD, NekDouble>> tmpinarry(nvariables);
1145  for (int i = 0; i < nvariables; i++)
1146  {
1147  tmpinarry[i] = Array<OneD, NekDouble>(npoints, 0.0);
1148  Vmath::Vcopy(npoints, inarray[i], 1, tmpinarry[i], 1);
1149  }
1150 
1151  // DmuDT of artificial diffusion is neglected
1152  // TODO: to consider the Jacobian of AV seperately
1153  Array<OneD, NekDouble> muvar = NullNekDouble1DArray;
1154  Array<OneD, NekDouble> MuVarTrace = NullNekDouble1DArray;
1155 
1156  Array<OneD, Array<OneD, NekDouble>> numflux(nvariables);
1157  for (int i = 0; i < nvariables; ++i)
1158  {
1159  numflux[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1160  }
1161 
1162  const MultiRegions::AssemblyMapDGSharedPtr TraceMap =
1163  fields[0]->GetTraceMap();
1164  TensorOfArray3D<NekDouble> qBwd(nDim);
1165  TensorOfArray3D<NekDouble> qFwd(nDim);
1166  if (m_viscousJacFlag)
1167  {
1168  for (int nd = 0; nd < nDim; ++nd)
1169  {
1170  qBwd[nd] = Array<OneD, Array<OneD, NekDouble>>(nConvectiveFields);
1171  qFwd[nd] = Array<OneD, Array<OneD, NekDouble>>(nConvectiveFields);
1172  for (int i = 0; i < nConvectiveFields; ++i)
1173  {
1174  qBwd[nd][i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1175  qFwd[nd][i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1176 
1177  fields[i]->GetFwdBwdTracePhys(qfield[nd][i], qFwd[nd][i],
1178  qBwd[nd][i], true, true, false);
1179  TraceMap->GetAssemblyCommDG()->PerformExchange(qFwd[nd][i],
1180  qBwd[nd][i]);
1181  }
1182  }
1183  }
1184 
1185  CalcTraceNumericalFlux(nConvectiveFields, nDim, npoints, nTracePts,
1186  PenaltyFactor2, fields, AdvVel, inarray, time,
1187  qfield, Fwd, Bwd, qFwd, qBwd, MuVarTrace,
1188  nonZeroIndex, numflux);
1189 
1190  int nFields = nvariables;
1191  Array<OneD, Array<OneD, NekDouble>> plusFwd(nFields), plusBwd(nFields);
1192  Array<OneD, Array<OneD, NekDouble>> Jacvect(nFields);
1193  Array<OneD, Array<OneD, NekDouble>> FwdBnd(nFields);
1194  Array<OneD, Array<OneD, NekDouble>> plusflux(nFields);
1195  for (int i = 0; i < nFields; i++)
1196  {
1197  Jacvect[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1198  plusFwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1199  plusBwd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1200  plusflux[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1201  FwdBnd[i] = Array<OneD, NekDouble>(nTracePts, 0.0);
1202  }
1203 
1204  for (int i = 0; i < nFields; i++)
1205  {
1206  Vmath::Vcopy(nTracePts, Fwd[i], 1, plusFwd[i], 1);
1207  Vmath::Vcopy(nTracePts, Bwd[i], 1, plusBwd[i], 1);
1208  }
1209 
1210  NekDouble eps = 1.0E-6;
1211 
1212  Array<OneD, DataType> tmpMatData;
1213  // Fwd Jacobian
1214  for (int i = 0; i < nFields; i++)
1215  {
1216  NekDouble epsvar = eps * m_magnitdEstimat[i];
1217  NekDouble oepsvar = 1.0 / epsvar;
1218  Vmath::Sadd(nTracePts, epsvar, Fwd[i], 1, plusFwd[i], 1);
1219 
1220  if (m_bndConds.size())
1221  {
1222  for (int i = 0; i < nFields; i++)
1223  {
1224  Vmath::Vcopy(nTracePts, plusFwd[i], 1, FwdBnd[i], 1);
1225  }
1226  // Loop over user-defined boundary conditions
1227  for (auto &x : m_bndConds)
1228  {
1229  x->Apply(FwdBnd, tmpinarry, time);
1230  }
1231  }
1232 
1233  for (int j = 0; j < nFields; j++)
1234  {
1235  m_fields[j]->FillBwdWithBoundCond(plusFwd[j], plusBwd[j]);
1236  }
1237 
1238  CalcTraceNumericalFlux(nConvectiveFields, nDim, npoints, nTracePts,
1239  PenaltyFactor2, fields, AdvVel, inarray, time,
1240  qfield, plusFwd, plusBwd, qFwd, qBwd, MuVarTrace,
1241  nonZeroIndex, plusflux);
1242 
1243  for (int n = 0; n < nFields; n++)
1244  {
1245  Vmath::Vsub(nTracePts, plusflux[n], 1, numflux[n], 1, Jacvect[n],
1246  1);
1247  Vmath::Smul(nTracePts, oepsvar, Jacvect[n], 1, Jacvect[n], 1);
1248  }
1249  for (int j = 0; j < nTracePts; j++)
1250  {
1251  tmpMatData = FJac->GetBlock(j, j)->GetPtr();
1252  for (int n = 0; n < nFields; n++)
1253  {
1254  tmpMatData[n + i * nFields] = DataType(Jacvect[n][j]);
1255  }
1256  }
1257 
1258  Vmath::Vcopy(nTracePts, Fwd[i], 1, plusFwd[i], 1);
1259  }
1260 
1261  // Reset the boundary conditions
1262  if (m_bndConds.size())
1263  {
1264  for (int i = 0; i < nFields; i++)
1265  {
1266  Vmath::Vcopy(nTracePts, Fwd[i], 1, FwdBnd[i], 1);
1267  }
1268  // Loop over user-defined boundary conditions
1269  for (auto &x : m_bndConds)
1270  {
1271  x->Apply(FwdBnd, tmpinarry, time);
1272  }
1273  }
1274 
1275  for (int i = 0; i < nFields; i++)
1276  {
1277  Vmath::Vcopy(nTracePts, Bwd[i], 1, plusBwd[i], 1);
1278  }
1279 
1280  for (int i = 0; i < nFields; i++)
1281  {
1282  NekDouble epsvar = eps * m_magnitdEstimat[i];
1283  NekDouble oepsvar = 1.0 / epsvar;
1284 
1285  Vmath::Sadd(nTracePts, epsvar, Bwd[i], 1, plusBwd[i], 1);
1286 
1287  for (int j = 0; j < nFields; j++)
1288  {
1289  m_fields[j]->FillBwdWithBoundCond(Fwd[j], plusBwd[j]);
1290  }
1291 
1292  CalcTraceNumericalFlux(nConvectiveFields, nDim, npoints, nTracePts,
1293  PenaltyFactor2, fields, AdvVel, inarray, time,
1294  qfield, Fwd, plusBwd, qFwd, qBwd, MuVarTrace,
1295  nonZeroIndex, plusflux);
1296 
1297  for (int n = 0; n < nFields; n++)
1298  {
1299  Vmath::Vsub(nTracePts, plusflux[n], 1, numflux[n], 1, Jacvect[n],
1300  1);
1301  Vmath::Smul(nTracePts, oepsvar, Jacvect[n], 1, Jacvect[n], 1);
1302  }
1303  for (int j = 0; j < nTracePts; j++)
1304  {
1305  tmpMatData = BJac->GetBlock(j, j)->GetPtr();
1306  for (int n = 0; n < nFields; n++)
1307  {
1308  tmpMatData[n + i * nFields] = DataType(Jacvect[n][j]);
1309  }
1310  }
1311 
1312  Vmath::Vcopy(nTracePts, Bwd[i], 1, plusBwd[i], 1);
1313  }
1314 }
void CalcTraceNumericalFlux(const int nConvectiveFields, const int nDim, const int nPts, const int nTracePts, const NekDouble PenaltyFactor2, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const Array< OneD, NekDouble >> &AdvVel, const Array< OneD, const Array< OneD, NekDouble >> &inarray, const NekDouble time, TensorOfArray3D< NekDouble > &qfield, const Array< OneD, const Array< OneD, NekDouble >> &vFwd, const Array< OneD, const Array< OneD, NekDouble >> &vBwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qFwd, const Array< OneD, const TensorOfArray2D< NekDouble >> &qBwd, const Array< OneD, NekDouble > &MuVarTrace, Array< OneD, int > &nonZeroIndex, Array< OneD, Array< OneD, NekDouble >> &traceflux)
std::vector< CFSBndCondSharedPtr > m_bndConds
SOLVER_UTILS_EXPORT int GetNpoints()
std::shared_ptr< AssemblyMapDG > AssemblyMapDGSharedPtr
Definition: AssemblyMapDG.h:47
static Array< OneD, NekDouble > NullNekDouble1DArray
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add scalar y = alpha + x.
Definition: Vmath.cpp:384

References CalcTraceNumericalFlux(), Nektar::SolverUtils::EquationSystem::GetNpoints(), Nektar::SolverUtils::EquationSystem::GetTraceTotPoints(), Nektar::CompressibleFlowSystem::m_bndConds, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::UnsteadySystem::m_magnitdEstimat, Nektar::SolverUtils::EquationSystem::m_spacedim, m_viscousJacFlag, Nektar::NullNekDouble1DArray, Vmath::Sadd(), Vmath::Smul(), Vmath::Vcopy(), and Vmath::Vsub().

Referenced by GetTraceJac().

◆ PointFluxJacobianPoint()

void Nektar::CFSImplicit::PointFluxJacobianPoint ( const Array< OneD, NekDouble > &  Fwd,
const Array< OneD, NekDouble > &  normals,
DNekMatSharedPtr FJac,
const NekDouble  efix,
const NekDouble  fsw 
)
protected

Definition at line 1805 of file CompressibleFlowSystemImplicit.cpp.

1810 {
1811  Array<OneD, NekDouble> FJacData = FJac->GetPtr();
1812  const int nvariables3D = 5;
1813 
1814  NekDouble ro, vx, vy, vz, ps, gama, ae;
1815  NekDouble a, a2, h, h0, v2, vn, eps, eps2;
1816  NekDouble nx, ny, nz;
1817  NekDouble sn, osn, nxa, nya, nza, vna;
1818  NekDouble l1, l4, l5, al1, al4, al5, x1, x2, x3, y1;
1819  NekDouble c1, d1, c2, d2, c3, d3, c4, d4, c5, d5;
1820  NekDouble sml_ssf = 1.0E-12;
1821 
1822  NekDouble fExactorSplt = 2.0 - abs(fsw); // if fsw=+-1 calculate
1823 
1824  NekDouble rhoL = Fwd[0];
1825  NekDouble rhouL = Fwd[1];
1826  NekDouble rhovL = Fwd[2];
1827  NekDouble rhowL = Fwd[3];
1828  NekDouble EL = Fwd[4];
1829 
1830  ro = rhoL;
1831  vx = rhouL / rhoL;
1832  vy = rhovL / rhoL;
1833  vz = rhowL / rhoL;
1834 
1835  // Internal energy (per unit mass)
1836  NekDouble eL = (EL - 0.5 * (rhouL * vx + rhovL * vy + rhowL * vz)) / rhoL;
1837 
1838  ps = m_varConv->Geteos()->GetPressure(rhoL, eL);
1839  gama = m_gamma;
1840 
1841  ae = gama - 1.0;
1842  v2 = vx * vx + vy * vy + vz * vz;
1843  a2 = gama * ps / ro;
1844  h = a2 / ae;
1845 
1846  h0 = h + 0.5 * v2;
1847  a = sqrt(a2);
1848 
1849  nx = normals[0];
1850  ny = normals[1];
1851  nz = normals[2];
1852  vn = nx * vx + ny * vy + nz * vz;
1853  sn = std::max(sqrt(nx * nx + ny * ny + nz * nz), sml_ssf);
1854  osn = 1.0 / sn;
1855 
1856  nxa = nx * osn;
1857  nya = ny * osn;
1858  nza = nz * osn;
1859  vna = vn * osn;
1860  l1 = vn;
1861  l4 = vn + sn * a;
1862  l5 = vn - sn * a;
1863 
1864  eps = efix * sn;
1865  eps2 = eps * eps;
1866 
1867  al1 = sqrt(l1 * l1 + eps2);
1868  al4 = sqrt(l4 * l4 + eps2);
1869  al5 = sqrt(l5 * l5 + eps2);
1870 
1871  l1 = 0.5 * (fExactorSplt * l1 + fsw * al1);
1872  l4 = 0.5 * (fExactorSplt * l4 + fsw * al4);
1873  l5 = 0.5 * (fExactorSplt * l5 + fsw * al5);
1874 
1875  x1 = 0.5 * (l4 + l5);
1876  x2 = 0.5 * (l4 - l5);
1877  x3 = x1 - l1;
1878  y1 = 0.5 * v2;
1879  c1 = ae * x3 / a2;
1880  d1 = x2 / a;
1881 
1882  int nVar0 = 0;
1883  int nVar1 = nvariables3D;
1884  int nVar2 = 2 * nvariables3D;
1885  int nVar3 = 3 * nvariables3D;
1886  int nVar4 = 4 * nvariables3D;
1887  FJacData[nVar0] = c1 * y1 - d1 * vna + l1;
1888  FJacData[nVar1] = -c1 * vx + d1 * nxa;
1889  FJacData[nVar2] = -c1 * vy + d1 * nya;
1890  FJacData[nVar3] = -c1 * vz + d1 * nza;
1891  FJacData[nVar4] = c1;
1892  c2 = c1 * vx + d1 * nxa * ae;
1893  d2 = x3 * nxa + d1 * vx;
1894  FJacData[1 + nVar0] = c2 * y1 - d2 * vna;
1895  FJacData[1 + nVar1] = -c2 * vx + d2 * nxa + l1;
1896  FJacData[1 + nVar2] = -c2 * vy + d2 * nya;
1897  FJacData[1 + nVar3] = -c2 * vz + d2 * nza;
1898  FJacData[1 + nVar4] = c2;
1899  c3 = c1 * vy + d1 * nya * ae;
1900  d3 = x3 * nya + d1 * vy;
1901  FJacData[2 + nVar0] = c3 * y1 - d3 * vna;
1902  FJacData[2 + nVar1] = -c3 * vx + d3 * nxa;
1903  FJacData[2 + nVar2] = -c3 * vy + d3 * nya + l1;
1904  FJacData[2 + nVar3] = -c3 * vz + d3 * nza;
1905  FJacData[2 + nVar4] = c3;
1906  c4 = c1 * vz + d1 * nza * ae;
1907  d4 = x3 * nza + d1 * vz;
1908  FJacData[3 + nVar0] = c4 * y1 - d4 * vna;
1909  FJacData[3 + nVar1] = -c4 * vx + d4 * nxa;
1910  FJacData[3 + nVar2] = -c4 * vy + d4 * nya;
1911  FJacData[3 + nVar3] = -c4 * vz + d4 * nza + l1;
1912  FJacData[3 + nVar4] = c4;
1913  c5 = c1 * h0 + d1 * vna * ae;
1914  d5 = x3 * vna + d1 * h0;
1915  FJacData[4 + nVar0] = c5 * y1 - d5 * vna;
1916  FJacData[4 + nVar1] = -c5 * vx + d5 * nxa;
1917  FJacData[4 + nVar2] = -c5 * vy + d5 * nya;
1918  FJacData[4 + nVar3] = -c5 * vz + d5 * nza;
1919  FJacData[4 + nVar4] = c5 + l1;
1920 }
VariableConverterSharedPtr m_varConv
scalarT< T > abs(scalarT< T > in)
Definition: scalar.hpp:298

References tinysimd::abs(), Nektar::CompressibleFlowSystem::m_gamma, Nektar::CompressibleFlowSystem::m_varConv, and tinysimd::sqrt().

Referenced by GetFluxVectorJacPoint().

◆ PreconCoeff()

void Nektar::CFSImplicit::PreconCoeff ( const Array< OneD, NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const bool &  flag 
)
protected

Definition at line 427 of file CompressibleFlowSystemImplicit.cpp.

430 {
431  LibUtilities::Timer timer, Gtimer;
432 
433  Gtimer.Start();
434  if (m_preconCfs->UpdatePreconMatCheck(NullNekDouble1DArray,
437  {
438  int nvariables = m_solutionPhys.size();
439 
440  int nphspnt = m_solutionPhys[nvariables - 1].size();
441  Array<OneD, Array<OneD, NekDouble>> intmp(nvariables);
442  for (int i = 0; i < nvariables; i++)
443  {
444  intmp[i] = Array<OneD, NekDouble>(nphspnt, 0.0);
445  }
446 
447  timer.Start();
449  timer.Stop();
450  timer.AccumulateRegion("CompressibleFlowSystem::DoOdeProjection", 1);
451 
452  timer.Start();
453  m_preconCfs->BuildPreconCfs(m_fields, intmp, m_bndEvaluateTime,
455  timer.Stop();
456  timer.AccumulateRegion("PreconCfsOp::BuildPreconCfs", 1);
457  }
458 
459  m_flagUpdatePreconMat = false;
460 
461  timer.Start();
462  m_preconCfs->DoPreconCfs(m_fields, inarray, outarray, flag);
463  timer.Stop();
464  timer.AccumulateRegion("PreconCfsOp::DoPreconCfs", 1);
465 
466  Gtimer.Stop();
467  Gtimer.AccumulateRegion("CFSImplicit::PreconCoeff");
468 }

References Nektar::LibUtilities::Timer::AccumulateRegion(), Nektar::CompressibleFlowSystem::DoOdeProjection(), Nektar::CompressibleFlowSystem::m_bndEvaluateTime, Nektar::SolverUtils::EquationSystem::m_fields, Nektar::SolverUtils::UnsteadySystem::m_flagUpdatePreconMat, m_preconCfs, m_solutionPhys, Nektar::SolverUtils::UnsteadySystem::m_TimeIntegLambda, Nektar::NullNekDouble1DArray, Nektar::LibUtilities::Timer::Start(), and Nektar::LibUtilities::Timer::Stop().

Referenced by InitialiseNonlinSysSolver().

◆ TranSamesizeBlkDiagMatIntoArray()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::TranSamesizeBlkDiagMatIntoArray ( const TypeNekBlkMatSharedPtr &  BlkMat,
TensorOfArray3D< DataType > &  MatArray 
)
protected

Definition at line 1733 of file CompressibleFlowSystemImplicit.cpp.

1735 {
1736  Array<OneD, unsigned int> rowSizes;
1737  Array<OneD, unsigned int> colSizes;
1738  BlkMat->GetBlockSizes(rowSizes, colSizes);
1739  int nDiagBlks = rowSizes.size();
1740  int nvar0 = rowSizes[1] - rowSizes[0];
1741  int nvar1 = colSizes[1] - colSizes[0];
1742 
1743  Array<OneD, DataType> ElmtMatData;
1744 
1745  for (int i = 0; i < nDiagBlks; i++)
1746  {
1747  ElmtMatData = BlkMat->GetBlock(i, i)->GetPtr();
1748  for (int n = 0; n < nvar1; n++)
1749  {
1750  int noffset = n * nvar0;
1751  for (int m = 0; m < nvar0; m++)
1752  {
1753  MatArray[m][n][i] = ElmtMatData[m + noffset];
1754  }
1755  }
1756  }
1757 }

Referenced by TransTraceJacMatToArray().

◆ TransTraceJacMatToArray()

template<typename DataType , typename TypeNekBlkMatSharedPtr >
void Nektar::CFSImplicit::TransTraceJacMatToArray ( const Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJac,
const Array< OneD, TypeNekBlkMatSharedPtr > &  TraceJacDeriv,
TensorOfArray4D< DataType > &  TraceJacArray,
TensorOfArray4D< DataType > &  TraceJacDerivArray 
)
protected

Definition at line 1514 of file CompressibleFlowSystemImplicit.cpp.

1519 {
1520  boost::ignore_unused(TraceJacArray, TraceJacDeriv, TraceJacDerivArray);
1521 
1522  int nFwdBwd, nDiagBlks, nvar0Jac, nvar1Jac;
1523 
1524  Array<OneD, unsigned int> rowSizes;
1525  Array<OneD, unsigned int> colSizes;
1526  nFwdBwd = TraceJac.size();
1527  TraceJac[0]->GetBlockSizes(rowSizes, colSizes);
1528  nDiagBlks = rowSizes.size();
1529  nvar0Jac = rowSizes[1] - rowSizes[0];
1530  nvar1Jac = colSizes[1] - colSizes[0];
1531 
1532  if (0 == TraceJacArray.size())
1533  {
1534  TraceJacArray = TensorOfArray4D<DataType>(nFwdBwd);
1535  for (int nlr = 0; nlr < nFwdBwd; nlr++)
1536  {
1537  TraceJacArray[nlr] = TensorOfArray3D<DataType>(nvar0Jac);
1538  for (int m = 0; m < nvar0Jac; m++)
1539  {
1540  TraceJacArray[nlr][m] =
1541  Array<OneD, Array<OneD, DataType>>(nvar1Jac);
1542  for (int n = 0; n < nvar1Jac; n++)
1543  {
1544  TraceJacArray[nlr][m][n] = Array<OneD, DataType>(nDiagBlks);
1545  }
1546  }
1547  }
1548  }
1549 
1550  for (int nlr = 0; nlr < nFwdBwd; nlr++)
1551  {
1552  const TypeNekBlkMatSharedPtr tmpMat = TraceJac[nlr];
1553  TensorOfArray3D<DataType> tmpaa = TraceJacArray[nlr];
1554  TranSamesizeBlkDiagMatIntoArray(tmpMat, tmpaa);
1555  }
1556 
1557  return;
1558 }
void TranSamesizeBlkDiagMatIntoArray(const TypeNekBlkMatSharedPtr &BlkMat, TensorOfArray3D< DataType > &MatArray)

References TranSamesizeBlkDiagMatIntoArray().

Referenced by CalcPreconMatBRJCoeff().

◆ v_CalcMuDmuDT()

virtual void Nektar::CFSImplicit::v_CalcMuDmuDT ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, NekDouble > &  mu,
Array< OneD, NekDouble > &  DmuDT 
)
inlineprotectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 333 of file CompressibleFlowSystemImplicit.h.

336  {
337  boost::ignore_unused(inarray, mu, DmuDT);
338  }

Referenced by CalcMuDmuDT().

◆ v_CalcPhysDeriv()

virtual void Nektar::CFSImplicit::v_CalcPhysDeriv ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray3D< NekDouble > &  qfield 
)
inlineprotectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 340 of file CompressibleFlowSystemImplicit.h.

343  {
344  boost::ignore_unused(inarray, qfield);
345  }

Referenced by CalcPhysDeriv().

◆ v_DoDiffusionCoeff()

virtual void Nektar::CFSImplicit::v_DoDiffusionCoeff ( const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, NekDouble >> &  outarray,
const Array< OneD, const Array< OneD, NekDouble >> &  pFwd,
const Array< OneD, const Array< OneD, NekDouble >> &  pBwd 
)
inlineprotectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 324 of file CompressibleFlowSystemImplicit.h.

329  {
330  boost::ignore_unused(inarray, outarray, pFwd, pBwd);
331  }

Referenced by DoDiffusionCoeff().

◆ v_GetFluxDerivJacDirctn() [1/2]

virtual void Nektar::CFSImplicit::v_GetFluxDerivJacDirctn ( const MultiRegions::ExpListSharedPtr explist,
const Array< OneD, const Array< OneD, NekDouble >> &  normals,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
Array< OneD, Array< OneD, DNekMatSharedPtr >> &  ElmtJac 
)
protectedvirtual

◆ v_GetFluxDerivJacDirctn() [2/2]

void Nektar::CFSImplicit::v_GetFluxDerivJacDirctn ( const MultiRegions::ExpListSharedPtr explist,
const Array< OneD, const Array< OneD, NekDouble >> &  normals,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  inarray,
TensorOfArray5D< NekDouble > &  ElmtJacArray,
const int  nFluxDir 
)
protectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 1560 of file CompressibleFlowSystemImplicit.cpp.

1566 {
1567  boost::ignore_unused(explist, normals, nDervDir, inarray, ElmtJacArray,
1568  nFluxDir);
1569  NEKERROR(ErrorUtil::efatal, "v_GetFluxDerivJacDirctn not coded");
1570 }

References Nektar::ErrorUtil::efatal, and NEKERROR.

Referenced by GetFluxDerivJacDirctn().

◆ v_GetFluxDerivJacDirctnElmt()

void Nektar::CFSImplicit::v_GetFluxDerivJacDirctnElmt ( const int  nConvectiveFields,
const int  nElmtPnt,
const int  nDervDir,
const Array< OneD, const Array< OneD, NekDouble >> &  locVars,
const Array< OneD, NekDouble > &  locmu,
const Array< OneD, const Array< OneD, NekDouble >> &  locnormal,
DNekMatSharedPtr wspMat,
Array< OneD, Array< OneD, NekDouble >> &  PntJacArray 
)
protectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 1572 of file CompressibleFlowSystemImplicit.cpp.

1578 {
1579  boost::ignore_unused(nConvectiveFields, nElmtPnt, nDervDir, locVars, locmu,
1580  locnormal, wspMat, PntJacArray);
1581  NEKERROR(ErrorUtil::efatal, "v_GetFluxDerivJacDirctn not coded");
1582 }

References Nektar::ErrorUtil::efatal, and NEKERROR.

Referenced by GetFluxDerivJacDirctnElmt().

◆ v_InitObject()

void Nektar::CFSImplicit::v_InitObject ( bool  DeclareFields = true)
overridevirtual

Initialization object for CFSImplicit class.

Reimplemented from Nektar::CompressibleFlowSystem.

Reimplemented in Nektar::NavierStokesImplicitCFE, and Nektar::EulerImplicitCFE.

Definition at line 54 of file CompressibleFlowSystemImplicit.cpp.

55 {
57  m_explicitAdvection = false;
58  m_explicitDiffusion = false;
59 
60  // initialise implicit parameters
61  m_session->LoadParameter("JacobiFreeEps", m_jacobiFreeEps, 5.0E-8);
62 
63  int ntmp;
64  m_session->LoadParameter("AdvectionJacFlag", ntmp, 1);
65  m_advectionJacFlag = (0 == ntmp) ? false : true;
66 
67  m_session->LoadParameter("ViscousJacFlag", ntmp, 1);
68  m_viscousJacFlag = (0 == ntmp) ? false : true;
69 
70  // initialise implicit functors
72 
74 
75  m_flagImplicitSolver = true;
76 }
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble >> &inpnts, Array< OneD, Array< OneD, NekDouble >> &outpnt, const NekDouble time, const NekDouble lambda)
virtual void v_InitObject(bool DeclareFields=true) override
Initialization object for CompressibleFlowSystem class.
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.

References Nektar::LibUtilities::TimeIntegrationSchemeOperators::DefineImplicitSolve(), DoImplicitSolve(), InitialiseNonlinSysSolver(), m_advectionJacFlag, Nektar::SolverUtils::UnsteadySystem::m_explicitAdvection, Nektar::SolverUtils::UnsteadySystem::m_explicitDiffusion, Nektar::SolverUtils::UnsteadySystem::m_flagImplicitSolver, m_jacobiFreeEps, Nektar::SolverUtils::UnsteadySystem::m_ode, Nektar::SolverUtils::EquationSystem::m_session, m_viscousJacFlag, and Nektar::CompressibleFlowSystem::v_InitObject().

Referenced by Nektar::EulerImplicitCFE::v_InitObject(), and Nektar::NavierStokesImplicitCFE::v_InitObject().

◆ v_MinusDiffusionFluxJacPoint()

void Nektar::CFSImplicit::v_MinusDiffusionFluxJacPoint ( const int  nConvectiveFields,
const int  nElmtPnt,
const Array< OneD, const Array< OneD, NekDouble >> &  locVars,
const TensorOfArray3D< NekDouble > &  locDerv,
const Array< OneD, NekDouble > &  locmu,
const Array< OneD, NekDouble > &  locDmuDT,
const Array< OneD, NekDouble > &  normals,
DNekMatSharedPtr wspMat,
Array< OneD, Array< OneD, NekDouble >> &  PntJacArray 
)
protectedvirtual

Reimplemented in Nektar::NavierStokesImplicitCFE.

Definition at line 1410 of file CompressibleFlowSystemImplicit.cpp.

1417 {
1418  boost::ignore_unused(nConvectiveFields, nElmtPnt, locVars, locDerv, locmu,
1419  locDmuDT, normals, wspMat, PntJacArray);
1420  // Do nothing by default
1421 }

Referenced by MinusDiffusionFluxJacPoint().

◆ v_UpdateTimeStepCheck()

bool Nektar::CFSImplicit::v_UpdateTimeStepCheck ( )
overrideprotectedvirtual

Member Data Documentation

◆ m_advectionJacFlag

bool Nektar::CFSImplicit::m_advectionJacFlag
protected

◆ m_jacobiFreeEps

NekDouble Nektar::CFSImplicit::m_jacobiFreeEps
protected

◆ m_newtonAbsoluteIteTol

NekDouble Nektar::CFSImplicit::m_newtonAbsoluteIteTol
protected

◆ m_nonlinsol

LibUtilities::NekNonlinSysSharedPtr Nektar::CFSImplicit::m_nonlinsol
protected

◆ m_nPadding

int Nektar::CFSImplicit::m_nPadding = 1
protected

◆ m_preconCfs

PreconCfsOpSharedPtr Nektar::CFSImplicit::m_preconCfs
protected

◆ m_solutionPhys

Array<OneD, Array<OneD, NekDouble> > Nektar::CFSImplicit::m_solutionPhys
protected

Definition at line 104 of file CompressibleFlowSystemImplicit.h.

Referenced by DoImplicitSolveCoeff(), and PreconCoeff().

◆ m_stdSMatDataDBB

TensorOfArray4D<NekSingle> Nektar::CFSImplicit::m_stdSMatDataDBB
protected

Definition at line 109 of file CompressibleFlowSystemImplicit.h.

Referenced by CalcPreconMatBRJCoeff().

◆ m_stdSMatDataDBDB

TensorOfArray5D<NekSingle> Nektar::CFSImplicit::m_stdSMatDataDBDB
protected

Definition at line 110 of file CompressibleFlowSystemImplicit.h.

Referenced by CalcPreconMatBRJCoeff().

◆ m_updateShockCaptPhys

bool Nektar::CFSImplicit::m_updateShockCaptPhys {true}
protected

◆ m_viscousJacFlag

bool Nektar::CFSImplicit::m_viscousJacFlag
protected