41 #include <boost/algorithm/string.hpp>
47 using namespace MultiRegions;
49 string VelocityCorrectionScheme::className =
51 "VelocityCorrectionScheme",
52 VelocityCorrectionScheme::create);
60 VelocityCorrectionScheme::VelocityCorrectionScheme(
85 ASSERTL0(
false,
"Need to set up pressure field definition");
92 std::string varName =
m_session->GetVariable(n);
93 if (
m_session->DefinesFunction(
"DiffusionCoefficient", varName))
96 =
m_session->GetFunction(
"DiffusionCoefficient", varName);
110 m_session->MatchSolverInfo(
"SmoothAdvection",
"True",
133 if (
m_session->DefinesSolverInfo(
"Extrapolation"))
136 m_session->GetSolverInfo(
"Extrapolation"));
208 std::string forces[] = {
"X",
"Y",
"Z" };
215 std::string varName = std::string(
"Force") + forces[i];
216 defined =
m_session->DefinesFunction(
"FlowrateForce", varName);
224 "A 'FlowrateForce' function must defined with components "
225 "[ForceX, ...] to define direction of flowrate forcing");
228 =
m_session->GetFunction(
"FlowrateForce", varName);
229 flowrateForce[i] = ffunc->Evaluate();
244 flowrateForce[2] = 1.0;
248 for (
int i = 0; i < bcs.size(); ++i)
250 if (boost::iequals(bcs[i]->GetUserDefined(),
"Flowrate"))
260 "One boundary region must be marked using the 'Flowrate' "
261 "user-defined type to monitor the volumetric flowrate.");
276 for (
int i = 0; i < zIDs.size(); ++i)
285 ASSERTL1(tmpId <= 0,
"Should be either at location 0 or -1 if not "
317 for (
int i = 0; i < zIDs.size(); ++i)
340 int nqTot =
m_fields[0]->GetNpoints();
347 nqTot, flowrateForce[i] * aii_dt);
353 m_fields[i]->HomogeneousFwdTrans(inTmp[i], inTmp2);
370 for(
int n = 0; n < PBndConds.size(); ++n)
372 if(PBndConds[n]->GetBoundaryConditionType() ==
376 PBndExp[n]->UpdateCoeffs(),1);
399 std::string filename =
m_session->GetSessionName();
404 <<
"# -------------------------------------------"
488 << setw(16) <<
m_alpha << endl;
510 "Splitting Scheme",
"Velocity correction (strong press. form)");
521 dealias += (dealias ==
"" ?
"" :
" + ") +
string(
"spectral/hp");
535 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
536 " Exp Kernel(cut-off = "
546 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
547 " Power Kernel (Power ratio ="
555 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
556 " DG Kernel (diff coeff = "
567 s,
"Smoothing-Homo1D",
"SVV (Homogeneous1D - Exp Kernel(cut-off = "
593 boost::lexical_cast<std::string>(
m_kinvis);
603 for(
int i = 0; i <
m_fields.size(); ++i)
620 for (
int k=0 ; k < nfields; ++k)
635 for (
int k=0 ; k < nfields; ++k)
648 int vVar =
m_session->GetVariables().size();
650 vChecks[vVar-1] =
true;
659 return m_session->GetVariables().size() - 1;
688 x->Apply(
m_fields, inarray, outarray, time);
714 int physTot =
m_fields[0]->GetTotPoints();
753 outarray[i], 1, outarray[i], 1);
755 m_fields[i]->FwdTrans_IterPerExp(outarray[i],
773 int physTot =
m_fields[0]->GetTotPoints();
778 for(i = 1; i < nvel; ++i)
797 int phystot =
m_fields[0]->GetTotPoints();
871 factors, varCoeffMap,
880 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
889 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
899 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"DGKernel",
907 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
921 if(
m_session->DefinesFunction(
"SVVVelocityMagnitude"))
923 if (
m_comm->GetRank() == 0)
925 cout <<
"Seting up SVV velocity from "
926 "SVVVelocityMagnitude section in session file" << endl;
929 int phystot =
m_fields[0]->GetTotPoints();
932 for(
int i = 0; i < nvel; ++i)
940 ->Evaluate(vars,SVVVelFields);
956 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"True",
960 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"ExpKernel",
967 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
"True",
971 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
"ExpKernel",
979 if(
m_session->DefinesSolverInfo(
"SpectralVanishingViscosityHomo1D"))
981 m_session->MatchSolverInfo(
"SpectralVanishingViscosityHomo1D",
985 m_session->MatchSolverInfo(
"SpectralVanishingViscosityHomo1D",
997 "Expect to have three velocity fields with homogenous expansion");
1004 int num_planes = planes.size();
1007 int kmodes =
m_fields[0]->GetHomogeneousBasis()->GetNumModes();
1012 for(
int n = 0; n < num_planes; ++n)
1014 if(planes[n] > pstart)
1016 fac = (
NekDouble)((planes[n] - kmodes)*(planes[n] - kmodes))/
1017 ((
NekDouble)((planes[n] - pstart)*(planes[n] - pstart)));
1036 int phystot =
m_fields[0]->GetTotPoints();
1037 int nel =
m_fields[0]->GetNumElmts();
1050 for(
int n = 1; n < nvel; ++n)
1061 for(
int i = 0; i < nel; ++i)
1063 int nq =
m_fields[0]->GetExp(i)->GetTotPoints();
1065 diffcoeff[i] =
m_fields[0]->GetExp(i)->Integral(tmp);
1068 diffcoeff[i] = diffcoeff[i]/area;
1078 for (
int e = 0; e < nel; e++)
1084 for(
int i = 0; i < exp->GetGeom()->GetNumEdges(); ++i)
1086 h = max(h, exp->GetGeom()->GetEdge(i)->GetVertex(0)->dist
1087 (*(exp->GetGeom()->GetEdge(i)->GetVertex(1))));
1093 p = max(
p,exp->GetBasisNumModes(i)-1);
1096 diffcoeff[e] *= h/
p;
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
This class is the base class for Navier Stokes problems.
virtual void v_InitObject()
Init object for UnsteadySystem class.
void SetBoundaryConditions(NekDouble time)
time dependent boundary conditions updating
MultiRegions::ExpListSharedPtr m_pressure
Pointer to field holding pressure field.
NekDouble m_kinvis
Kinematic viscosity.
bool m_SmoothAdvection
bool to identify if advection term smoothing is requested
ExtrapolateSharedPtr m_extrapolation
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
EquationType m_equationType
equation type;
int m_nConvectiveFields
Number of fields to be convected;.
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Forcing terms.
void EvaluateAdvectionTerms(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
virtual SOLVER_UTILS_EXPORT bool v_PostIntegrate(int step)
int m_spacedim
Spatial dimension (>= expansion dim).
int m_expdim
Expansion dimension.
LibUtilities::CommSharedPtr m_comm
Communicator.
NekDouble m_timestep
Time step size.
NekDouble m_time
Current time of simulation.
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
bool m_specHP_dealiasing
Flag to determine if dealisising is usde for the Spectral/hp element discretisation.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
enum HomogeneousType m_HomogeneousType
bool m_homogen_dealiasing
Flag to determine if dealiasing is used for homogeneous simulations.
SOLVER_UTILS_EXPORT int GetNcoeffs()
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
Map to identify relevant solver info to dump in output fields.
SOLVER_UTILS_EXPORT SessionFunctionSharedPtr GetFunction(std::string name, const MultiRegions::ExpListSharedPtr &field=MultiRegions::NullExpListSharedPtr, bool cache=false)
Get a SessionFunction by name.
SOLVER_UTILS_EXPORT int GetTotPoints()
Defines a forcing term to be explicitly applied.
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
virtual SOLVER_UTILS_EXPORT void v_DoInitialise()
Sets up initial conditions.
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
Wrapper to the time integration scheme.
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s)
Print a summary of time stepping parameters.
std::vector< int > m_intVariables
NekDouble m_sVVCutoffRatioHomo1D
NekDouble m_greenFlux
Flux of the Stokes function solution.
virtual std::string v_GetExtrapolateStr(void)
virtual ~VelocityCorrectionScheme()
MultiRegions::ExpListSharedPtr m_flowrateBnd
Flowrate reference surface.
Array< OneD, NekDouble > m_svvVarDiffCoeff
Array of coefficient if power kernel is used in SVV.
NekDouble MeasureFlowrate(const Array< OneD, Array< OneD, NekDouble > > &inarray)
Measure the volumetric flow rate through the volumetric flow rate reference surface.
NekDouble m_sVVDiffCoeffHomo1D
Diffusion coefficient of SVV modes in homogeneous 1D Direction.
virtual void v_InitObject()
Init object for UnsteadySystem class.
NekDouble m_flowrate
Desired volumetric flowrate.
bool m_IsSVVPowerKernel
Identifier for Power Kernel otherwise DG kernel.
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Print a summary of time stepping parameters.
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
virtual void v_DoInitialise(void)
Sets up initial conditions.
NekDouble m_sVVCutoffRatio
cutt off ratio from which to start decayhing modes
NekDouble m_sVVDiffCoeff
Diffusion coefficient of SVV modes.
void EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Array< OneD, Array< OneD, NekDouble > > m_flowrateStokes
Stokes solution used to impose flowrate.
void SolveUnsteadyStokesSystem(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time, const NekDouble a_iixDt)
NekDouble m_alpha
Current flowrate correction.
virtual Array< OneD, bool > v_GetSystemSingularChecks()
virtual void v_TransPhysToCoeff(void)
Virtual function for transformation to coefficient space.
Array< OneD, Array< OneD, NekDouble > > m_F
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
virtual bool v_PostIntegrate(int step)
virtual void v_TransCoeffToPhys(void)
Virtual function for transformation to physical space.
void SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
void SetupFlowrate(NekDouble aii_dt)
Set up the Stokes solution used to impose constant flowrate through a boundary.
void SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
virtual void v_SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
bool m_useSpecVanVisc
bool to identify if spectral vanishing viscosity is active.
void SetUpExtrapolation(void)
void SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
Array< OneD, NekDouble > m_diffCoeff
Diffusion coefficients (will be kinvis for velocities)
int m_flowrateSteps
Interval at which to record flowrate data.
void SVVVarDiffCoeff(const NekDouble velmag, Array< OneD, NekDouble > &diffcoeff, const Array< OneD, Array< OneD, NekDouble > > &vel=NullNekDoubleArrayOfArray)
NekDouble m_flowrateArea
Area of the boundary through which we are measuring the flowrate.
std::ofstream m_flowrateStream
Output stream to record flowrate.
virtual void v_SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
virtual int v_GetForceDimension()
virtual void v_EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
void AppendSVVFactors(StdRegions::ConstFactorMap &factors, MultiRegions::VarFactorsMap &varFactorsMap)
NekDouble m_flowrateAiidt
Value of aii_dt used to compute Stokes flowrate solution.
void SolvePressure(const Array< OneD, NekDouble > &Forcing)
int m_planeID
Plane ID for cases with homogeneous expansion.
bool m_useHomo1DSpecVanVisc
bool to identify if spectral vanishing viscosity is active.
int m_flowrateBndID
Boundary ID of the flowrate reference surface.
virtual std::string v_GetSubSteppingExtrapolateStr(const std::string &instr)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Equation > EquationSharedPtr
std::shared_ptr< Expansion > ExpansionSharedPtr
MultiRegions::Direction const DirCartesianMap[]
static VarFactorsMap NullVarFactorsMap
std::map< StdRegions::ConstFactorType, Array< OneD, NekDouble > > VarFactorsMap
std::vector< std::pair< std::string, std::string > > SummaryList
EquationSystemFactory & GetEquationSystemFactory()
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
std::map< StdRegions::VarCoeffType, Array< OneD, NekDouble > > VarCoeffMap
std::map< ConstFactorType, NekDouble > ConstFactorMap
static VarCoeffMap NullVarCoeffMap
The above copyright notice and this permission notice shall be included.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
ExtrapolateFactory & GetExtrapolateFactory()
static Array< OneD, NekDouble > NullNekDouble1DArray
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
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
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.