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"));
146 m_extrapolation->SubSteppingTimeIntegration(
148 m_extrapolation->GenerateHOPBCMap(
m_session);
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.num_elements(); ++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.num_elements(); ++i)
285 ASSERTL1(tmpId <= 0,
"Should be either at location 0 or -1 if not " 316 for (
int i = 0; i < zIDs.num_elements(); ++i)
339 int nqTot =
m_fields[0]->GetNpoints();
346 nqTot, flowrateForce[i] * aii_dt);
352 m_fields[i]->HomogeneousFwdTrans(inTmp[i], inTmp2);
381 std::string filename =
m_session->GetSessionName();
386 <<
"# -------------------------------------------" 469 << setw(16) <<
m_alpha << endl;
491 "Splitting Scheme",
"Velocity correction (strong press. form)");
504 dealias += (dealias ==
"" ?
"" :
" + ") +
string(
"spectral/hp");
518 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
519 " Exp Kernel(cut-off = " 529 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
530 " Power Kernel (Power ratio =" 538 s,
"Smoothing-SpecHP",
"SVV (" + smoothing +
539 " DG Kernel (diff coeff = " 550 s,
"Smoothing-Homo1D",
"SVV (Homogeneous1D - Exp Kernel(cut-off = " 576 boost::lexical_cast<std::string>(
m_kinvis);
601 int nfields =
m_fields.num_elements() - 1;
602 for (
int k=0 ; k < nfields; ++k)
616 int nfields =
m_fields.num_elements() - 1;
617 for (
int k=0 ; k < nfields; ++k)
630 int vVar =
m_session->GetVariables().size();
632 vChecks[vVar-1] =
true;
641 return m_session->GetVariables().size() - 1;
666 x->Apply(
m_fields, inarray, outarray, time);
689 int physTot =
m_fields[0]->GetTotPoints();
715 outarray[i], 1, outarray[i], 1);
729 int physTot =
m_fields[0]->GetTotPoints();
734 for(i = 1; i < nvel; ++i)
753 int phystot =
m_fields[0]->GetTotPoints();
837 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
846 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
856 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"DGKernel",
864 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
878 if(
m_session->DefinesFunction(
"SVVVelocityMagnitude"))
880 if (
m_comm->GetRank() == 0)
882 cout <<
"Seting up SVV velocity from " 883 "SVVVelocityMagnitude section in session file" << endl;
886 int phystot =
m_fields[0]->GetTotPoints();
889 for(
int i = 0; i < nvel; ++i)
897 ->Evaluate(vars,SVVVelFields);
913 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"True",
917 m_session->MatchSolverInfo(
"SpectralVanishingViscosity",
"ExpKernel",
924 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
"True",
928 m_session->MatchSolverInfo(
"SpectralVanishingViscositySpectralHP",
"ExpKernel",
936 if(
m_session->DefinesSolverInfo(
"SpectralVanishingViscosityHomo1D"))
938 m_session->MatchSolverInfo(
"SpectralVanishingViscosityHomo1D",
942 m_session->MatchSolverInfo(
"SpectralVanishingViscosityHomo1D",
954 "Expect to have three velocity fields with homogenous expansion");
961 int num_planes = planes.num_elements();
964 int kmodes =
m_fields[0]->GetHomogeneousBasis()->GetNumModes();
969 for(
int n = 0; n < num_planes; ++n)
971 if(planes[n] > pstart)
973 fac = (
NekDouble)((planes[n] - kmodes)*(planes[n] - kmodes))/
974 ((
NekDouble)((planes[n] - pstart)*(planes[n] - pstart)));
979 for(
int i = 0; i <
m_velocity.num_elements(); ++i)
993 int phystot =
m_fields[0]->GetTotPoints();
994 int nel =
m_fields[0]->GetNumElmts();
1004 nvel = vel.num_elements();
1007 for(
int n = 1; n < nvel; ++n)
1018 for(
int i = 0; i < nel; ++i)
1020 int nq =
m_fields[0]->GetExp(i)->GetTotPoints();
1022 diffcoeff[i] =
m_fields[0]->GetExp(i)->Integral(tmp);
1025 diffcoeff[i] = diffcoeff[i]/area;
1037 for (
int e = 0; e < nel; e++)
1041 for(
int i = 0; i < exp3D->GetNedges(); ++i)
1044 h = max(h, exp3D->GetGeom3D()->GetEdge(i)->GetVertex(0)->dist(
1045 *(exp3D->GetGeom3D()->GetEdge(i)->GetVertex(1))));
1049 for(
int i = 0; i < 3; ++i)
1051 p = max(p,exp3D->GetBasisNumModes(i)-1);
1054 diffcoeff[e] *= h/
p;
1060 for (
int e = 0; e < nel; e++)
1064 for(
int i = 0; i < exp2D->GetNedges(); ++i)
1067 h = max(h, exp2D->GetGeom2D()->GetEdge(i)->GetVertex(0)->dist(
1068 *(exp2D->GetGeom2D()->GetEdge(i)->GetVertex(1))));
1072 for(
int i = 0; i < 2; ++i)
1074 p = max(p,exp2D->GetBasisNumModes(i)-1);
1077 diffcoeff[e] *= h/
p;
void SetupFlowrate(NekDouble aii_dt)
Set up the Stokes solution used to impose constant flowrate through a boundary.
NekDouble MeasureFlowrate(const Array< OneD, Array< OneD, NekDouble > > &inarray)
Measure the volumetric flow rate through the volumetric flow rate reference surface.
EquationType m_equationType
equation type;
virtual Array< OneD, bool > v_GetSystemSingularChecks()
virtual void v_DoInitialise(void)
Sets up initial conditions.
#define ASSERTL0(condition, msg)
virtual ~VelocityCorrectionScheme()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
static VarFactorsMap NullVarFactorsMap
void SetBoundaryConditions(NekDouble time)
time dependent boundary conditions updating
Array< OneD, Array< OneD, NekDouble > > m_flowrateStokes
Stokes solution used to impose flowrate.
void EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
static Array< OneD, NekDouble > NullNekDouble1DArray
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_time
Current time of simulation.
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
NekDouble m_kinvis
Kinematic viscosity.
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
void SolvePressure(const Array< OneD, NekDouble > &Forcing)
ExtrapolateFactory & GetExtrapolateFactory()
NekDouble m_flowrate
Desired volumetric flowrate.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
NekDouble m_timestep
Time step size.
std::vector< std::pair< std::string, std::string > > SummaryList
virtual void v_GenerateSummary(SolverUtils::SummaryList &s)
Print a summary of time stepping parameters.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
std::shared_ptr< Extrapolate > ExtrapolateSharedPtr
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
bool m_useHomo1DSpecVanVisc
bool to identify if spectral vanishing viscosity is active.
int m_expdim
Expansion dimension.
NekDouble m_sVVDiffCoeff
Diffusion coefficient of SVV modes.
bool m_IsSVVPowerKernel
Identifier for Power Kernel otherwise DG kernel.
ExtrapolateSharedPtr m_extrapolation
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
virtual std::string v_GetSubSteppingExtrapolateStr(const std::string &instr)
virtual std::string v_GetExtrapolateStr(void)
void EvaluateAdvectionTerms(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
bool m_specHP_dealiasing
Flag to determine if dealisising is usde for the Spectral/hp element discretisation.
std::map< ConstFactorType, NekDouble > ConstFactorMap
const char *const TimeIntegrationMethodMap[]
int m_nConvectiveFields
Number of fields to be convected;.
LibUtilities::CommSharedPtr m_comm
Communicator.
virtual int v_GetForceDimension()
void SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
void SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
NekDouble m_sVVCutoffRatioHomo1D
MultiRegions::ExpListSharedPtr m_flowrateBnd
Flowrate reference surface.
NekDouble m_flowrateAiidt
Value of aii_dt used to compute Stokes flowrate solution.
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s)
Print a summary of time stepping parameters.
std::ofstream m_flowrateStream
Output stream to record flowrate.
std::shared_ptr< Expansion3D > Expansion3DSharedPtr
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
virtual SOLVER_UTILS_EXPORT bool v_PostIntegrate(int step)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
NekDouble m_flowrateArea
Area of the boundary through which we are measuring the flowrate.
std::map< StdRegions::VarCoeffType, Array< OneD, NekDouble > > VarCoeffMap
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Forcing terms.
Base class for unsteady solvers.
virtual void v_SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
void SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
bool m_SmoothAdvection
bool to identify if advection term smoothing is requested
void AddSummaryItem(SummaryList &l, const std::string &name, const std::string &value)
Adds a summary item to the summary info list.
int m_spacedim
Spatial dimension (>= expansion dim).
virtual void v_TransCoeffToPhys(void)
Virtual function for transformation to physical space.
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
Map to identify relevant solver info to dump in output fields.
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
Array< OneD, NekDouble > m_svvVarDiffCoeff
Array of coefficient if power kernel is used in SVV.
bool m_homogen_dealiasing
Flag to determine if dealiasing is used for homogeneous simulations.
virtual bool v_PostIntegrate(int step)
EquationSystemFactory & GetEquationSystemFactory()
Array< OneD, Array< OneD, NekDouble > > m_F
void SVVVarDiffCoeff(const NekDouble velmag, Array< OneD, NekDouble > &diffcoeff, const Array< OneD, Array< OneD, NekDouble > > &vel=NullNekDoubleArrayofArray)
std::shared_ptr< Equation > EquationSharedPtr
SOLVER_UTILS_EXPORT SessionFunctionSharedPtr GetFunction(std::string name, const MultiRegions::ExpListSharedPtr &field=MultiRegions::NullExpListSharedPtr, bool cache=false)
Get a SessionFunction by name.
MultiRegions::Direction const DirCartesianMap[]
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
NekDouble m_sVVCutoffRatio
cutt off ratio from which to start decayhing modes
void SetUpExtrapolation(void)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
bool m_useSpecVanVisc
bool to identify if spectral vanishing viscosity is active.
std::shared_ptr< Expansion2D > Expansion2DSharedPtr
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
Array< OneD, NekDouble > m_diffCoeff
Diffusion coefficients (will be kinvis for velocities)
SOLVER_UTILS_EXPORT int GetNcoeffs()
int m_flowrateSteps
Interval at which to record flowrate data.
NekDouble m_sVVDiffCoeffHomo1D
Diffusion coefficient of SVV modes in homogeneous 1D Direction.
virtual void v_TransPhysToCoeff(void)
Virtual function for transformation to coefficient space.
LibUtilities::TimeIntegrationWrapperSharedPtr m_intScheme
Wrapper to the time integration scheme.
This class is the base class for Navier Stokes problems.
NekDouble m_alpha
Current flowrate correction.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
virtual void v_InitObject()
Init object for UnsteadySystem class.
MultiRegions::ExpListSharedPtr m_pressure
Pointer to field holding pressure field.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayofArray
NekDouble m_greenFlux
Flux of the Stokes function solution.
Defines a forcing term to be explicitly applied.
void Zero(int n, T *x, const int incx)
Zero vector.
virtual void v_SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
void AppendSVVFactors(StdRegions::ConstFactorMap &factors, MultiRegions::VarFactorsMap &varFactorsMap)
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.
virtual void v_InitObject()
Init object for UnsteadySystem class.
virtual void v_EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
int m_flowrateBndID
Boundary ID of the flowrate reference surface.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
virtual SOLVER_UTILS_EXPORT void v_DoInitialise()
Sets up initial conditions.
int m_planeID
Plane ID for cases with homogeneous expansion.
enum HomogeneousType m_HomogeneousType
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 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.
static FlagList NullFlagList
An empty flag list.
std::vector< int > m_intVariables
static VarCoeffMap NullVarCoeffMap
std::map< StdRegions::ConstFactorType, Array< OneD, NekDouble > > VarFactorsMap