39#include <boost/algorithm/string.hpp>
73 std::string vExtrapolation =
"Mapping";
81 size_t physTot =
m_fields[0]->GetTotPoints();
92 "Integration method not suitable: "
93 "Options include IMEXGear or IMEXOrder{1,2,3,4}");
105 m_session->MatchSolverInfo(
"MappingImplicitPressure",
"True",
107 m_session->MatchSolverInfo(
"MappingImplicitViscous",
"True",
109 m_session->MatchSolverInfo(
"MappingNeglectViscous",
"True",
157 size_t physTot =
m_fields[0]->GetTotPoints();
192 x->Apply(
m_fields, inarray, outarray, time);
228 size_t physTot =
m_fields[0]->GetTotPoints();
237 for (
size_t i = 0; i < nvel; ++i)
241 m_fields[i]->HomogeneousBwdTrans(physTot, fields[i], wk);
250 m_fields[i]->HomogeneousFwdTrans(physTot, wk, wk);
262 bool wavespace =
m_fields[0]->GetWaveSpace();
269 for (
size_t i = 0; i < tmp.size(); i++)
276 physTot,
m_fields[i]->GetPhys(), velocity[i]);
285 m_mapping->DotGradJacobian(velocity, wk);
289 for (
size_t i = 0; i < nvel; ++i)
293 Vmath::Vmul(physTot, Jac, 1, tmp[i], 1, tmp[i], 1);
297 for (
size_t i = 0; i < nvel; ++i)
307 m_mapping->DotGradJacobian(tmp, velocity[0]);
310 Vmath::Vadd(physTot, velocity[0], 1, wk, 1, wk, 1);
334 m_fields[0]->SetWaveSpace(wavespace);
347 size_t physTot =
m_fields[0]->GetTotPoints();
366 for (
size_t i = 0; i < nvel; i++)
373 for (
size_t i = 0; i < nvel; i++)
391 for (
size_t i = 0; i < nvel; i++)
399 for (
size_t i = 0; i < nvel; i++)
409 for (
size_t i = 0; i < nvel; ++i)
427 size_t physTot =
m_fields[0]->GetTotPoints();
429 bool converged =
false;
435 m_session->LoadParameter(
"MappingMaxIter", maxIter, 5000);
445 for (
size_t i = 0; i < nvel; ++i)
468 "VCSMapping exceeded maximum number of iterations.");
478 for (
size_t i = 0; i < nvel; ++i)
481 previous_iter, gradP[i]);
484 m_pressure->HomogeneousBwdTrans(physTot, gradP[i], wk1[i]);
496 Vmath::Vmul(physTot, F_corrected, 1, Jac, 1, F_corrected, 1);
503 m_pressure->HomogeneousFwdTrans(physTot, F_corrected,
511 Vmath::Vsub(physTot, F_corrected, 1, wk1[0], 1, F_corrected, 1);
517 Vmath::Vadd(physTot, wk1[0], 1, F_corrected, 1, F_corrected, 1);
548 std::cout <<
" Pressure system (mapping) converged in " << s
549 <<
" iterations with error = " << error << std::endl;
562 boost::ignore_unused(inarray);
571 size_t physTot =
m_fields[0]->GetTotPoints();
573 bool converged =
false;
578 m_session->LoadParameter(
"MappingMaxIter", maxIter, 5000);
589 for (
size_t i = 0; i < nvel; ++i)
608 for (
size_t i = 0; i < nvel; ++i)
620 "VCSMapping exceeded maximum number of iterations.");
631 for (
size_t i = 0; i < nvel; ++i)
633 m_fields[0]->HomogeneousBwdTrans(physTot, previous_iter[i],
639 for (
size_t i = 0; i < nvel; ++i)
646 m_mapping->VelocityLaplacian(wk, F_corrected,
651 for (
size_t i = 0; i < nvel; ++i)
653 m_fields[0]->HomogeneousFwdTrans(physTot, F_corrected[i],
659 for (
size_t i = 0; i < nvel; ++i)
661 Vmath::Vcopy(physTot, F_corrected[i], 1, F_corrected[i], 1);
666 for (
size_t i = 0; i < nvel; ++i)
670 1, F_corrected[i], 1);
680 m_fields[i]->HelmSolve(F_corrected[i],
687 error =
m_fields[i]->L2(outarray[i], previous_iter[i]);
689 if (forcing_L2[i] != 0)
703 if (error > max_error)
709 Vmath::Vcopy(physTot, outarray[i], 1, previous_iter[i], 1);
714 std::cout <<
" Velocity system (mapping) converged in " << s
715 <<
" iterations with error = " << max_error << std::endl;
727 size_t physTot =
m_fields[0]->GetTotPoints();
745 m_fields[0]->HomogeneousBwdTrans(physTot, vel[i], velPhys[i]);
810 size_t physTot =
m_fields[0]->GetTotPoints();
816 m_mapping->ApplyChristoffelContravar(velPhys, wk);
819 for (
size_t i = 0; i < nvel; i++)
822 for (
size_t j = 0; j < nvel; j++)
824 Vmath::Vvtvp(physTot, wk[i * nvel + j], 1, velPhys[j], 1,
825 outarray[i], 1, outarray[i], 1);
836 size_t physTot =
m_fields[0]->GetTotPoints();
842 for (
size_t i = 0; i < nvel; i++)
849 m_mapping->ContravarFromCartesian(tmp, coordVel);
852 m_mapping->ApplyChristoffelContravar(velPhys, wk);
853 for (
size_t i = 0; i < nvel; i++)
857 m_fields[0]->PhysDeriv(velPhys[i], tmp[0], tmp[1]);
858 for (
size_t j = 0; j < nvel; j++)
866 m_fields[0]->HomogeneousBwdTrans(physTot, tmp[2], tmp[2]);
870 Vmath::Vadd(physTot, wk[i * nvel + j], 1, tmp[j], 1,
871 wk[i * nvel + j], 1);
873 Vmath::Vvtvp(physTot, coordVel[j], 1, wk[i * nvel + j], 1,
874 outarray[i], 1, outarray[i], 1);
879 bool wavespace =
m_fields[0]->GetWaveSpace();
883 m_mapping->ApplyChristoffelContravar(coordVel, wk);
884 for (
size_t i = 0; i < nvel; i++)
888 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1]);
892 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1], tmp[2]);
895 for (
size_t j = 0; j < nvel; j++)
897 Vmath::Vadd(physTot, wk[i * nvel + j], 1, tmp[j], 1,
898 wk[i * nvel + j], 1);
901 Vmath::Vvtvp(physTot, velPhys[j], 1, wk[i * nvel + j], 1,
902 outarray[i], 1, outarray[i], 1);
907 m_fields[0]->SetWaveSpace(wavespace);
913 size_t physTot =
m_fields[0]->GetTotPoints();
925 for (
size_t i = 0; i < nvel; ++i)
930 for (
size_t i = 0; i < nvel; ++i)
941 m_mapping->VelocityLaplacian(velPhys, outarray, 1.0);
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
static GLOBAL_MAPPING_EXPORT MappingSharedPtr Load(const LibUtilities::SessionReaderSharedPtr &pSession, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
Return a pointer to the mapping, creating it on first call.
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);
int m_intSteps
Number of time integration steps AND Order of extrapolation for pressure boundary conditions.
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.
static std::string RegisterEnumValue(std::string pEnum, std::string pString, int pEnumValue)
Registers an enumeration value.
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
NekDouble m_timestep
Time step size.
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
Map to identify relevant solver info to dump in output fields.
SOLVER_UTILS_EXPORT int GetTotPoints()
Defines a forcing term to be explicitly applied.
Base class for unsteady solvers.
virtual SOLVER_UTILS_EXPORT void v_DoInitialise(bool dumpInitialConditions=true) override
Sets up initial conditions.
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
Wrapper to the time integration scheme.
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing) override
virtual void v_SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt) override
void MappingViscousCorrection(const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual void v_DoInitialise(bool dumpInitialConditions=true) override
Sets up initial conditions.
virtual void v_SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt) override
NekDouble m_pressureTolerance
NekDouble m_viscousRelaxation
static std::string className
Name of class.
NekDouble m_pressureRelaxation
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
NekDouble m_viscousTolerance
virtual void v_EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time) override
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt) override
static std::string solverTypeLookupId
GlobalMapping::MappingSharedPtr m_mapping
void MappingPressureCorrection(Array< OneD, Array< OneD, NekDouble > > &outarray)
void ApplyIncNSMappingForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Array< OneD, Array< OneD, NekDouble > > m_presForcingCorrection
VCSMapping(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Constructor.
virtual void v_InitObject(bool DeclareField=true) override
Init object for UnsteadySystem class.
void MappingAccelerationCorrection(const Array< OneD, const Array< OneD, NekDouble > > &vel, const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
Array< OneD, Array< OneD, NekDouble > > m_gradP
void MappingAdvectionCorrection(const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
NekDouble m_sVVCutoffRatio
cutt off ratio from which to start decayhing modes
NekDouble m_sVVDiffCoeff
Diffusion coefficient of SVV modes.
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
Array< OneD, Array< OneD, NekDouble > > m_F
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.
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
virtual void v_InitObject(bool DeclareField=true) override
Init object for UnsteadySystem class.
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
MultiRegions::Direction const DirCartesianMap[]
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
StdRegions::ConstFactorMap factors
The above copyright notice and this permission notice shall be included.
ExtrapolateFactory & GetExtrapolateFactory()
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 Neg(int n, T *x, const int incx)
Negate x = -x.
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 Vdiv(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 Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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.