39 #include <boost/algorithm/string.hpp>
45 string VCSMapping::className =
56 VCSMapping::VCSMapping(
71 "Could not create mapping in VCSMapping.");
73 std::string vExtrapolation =
"Mapping";
85 int physTot =
m_fields[0]->GetTotPoints();
96 "Options include IMEXGear or IMEXOrder{1,2,3,4}");
108 m_session->MatchSolverInfo(
"MappingImplicitPressure",
"True",
110 m_session->MatchSolverInfo(
"MappingImplicitViscous",
"True",
112 m_session->MatchSolverInfo(
"MappingNeglectViscous",
"True",
121 m_session->LoadParameter(
"MappingPressureTolerance",
123 m_session->LoadParameter(
"MappingViscousTolerance",
125 m_session->LoadParameter(
"MappingPressureRelaxation",
127 m_session->LoadParameter(
"MappingViscousRelaxation",
145 boost::lexical_cast<std::string>(
m_kinvis);
162 int physTot =
m_fields[0]->GetTotPoints();
199 x->Apply(
m_fields, inarray, outarray, time);
237 int physTot =
m_fields[0]->GetTotPoints();
246 for(
int i = 0; i < nvel; ++i)
250 m_fields[i]->HomogeneousBwdTrans(fields[i],wk);
259 m_fields[i]->HomogeneousFwdTrans(wk,wk);
271 bool wavespace =
m_fields[0]->GetWaveSpace();
278 for(
int i = 0; i < tmp.size(); i++)
294 m_mapping->DotGradJacobian(velocity, wk);
298 for(
int i = 0; i < nvel; ++i)
302 Vmath::Vmul(physTot, Jac, 1, tmp[i], 1, tmp[i], 1);
306 for(
int i = 0; i < nvel; ++i)
316 m_mapping->DotGradJacobian(tmp, velocity[0]);
319 Vmath::Vadd(physTot, velocity[0], 1, wk, 1, wk, 1);
343 m_fields[0]->SetWaveSpace(wavespace);
357 int physTot =
m_fields[0]->GetTotPoints();
376 for (
int i=0; i<nvel; i++)
383 for (
int i=0; i<nvel; i++)
401 for (
int i=0; i<nvel; i++)
409 for (
int i=0; i<nvel; i++)
418 for(
int i = 0; i < nvel; ++i)
437 int physTot =
m_fields[0]->GetTotPoints();
439 bool converged =
false;
445 m_session->LoadParameter(
"MappingMaxIter",maxIter,5000);
455 for(
int i = 0; i < nvel; ++i)
479 "VCSMapping exceeded maximum number of iterations.");
490 for(
int i = 0; i < nvel; ++i)
493 previous_iter, gradP[i]);
496 m_pressure->HomogeneousBwdTrans(gradP[i], wk1[i]);
517 m_pressure->HomogeneousFwdTrans(F_corrected, F_corrected);
532 Vmath::Vadd(physTot, wk1[0], 1, F_corrected, 1, F_corrected, 1);
546 if ( forcing_L2 != 0)
563 std::cout <<
" Pressure system (mapping) converged in " << s <<
564 " iterations with error = " << error << std::endl;
583 int physTot =
m_fields[0]->GetTotPoints();
585 bool converged =
false;
590 m_session->LoadParameter(
"MappingMaxIter",maxIter,5000);
601 for(
int i = 0; i < nvel; ++i)
620 for(
int i = 0; i < nvel; ++i)
633 "VCSMapping exceeded maximum number of iterations.");
644 for (
int i = 0; i < nvel; ++i)
646 m_fields[0]->HomogeneousBwdTrans(previous_iter[i],
652 for (
int i = 0; i < nvel; ++i)
659 m_mapping->VelocityLaplacian(wk, F_corrected,
664 for (
int i = 0; i < nvel; ++i)
666 m_fields[0]->HomogeneousFwdTrans(F_corrected[i],
672 for (
int i = 0; i < nvel; ++i)
680 for (
int i = 0; i < nvel; ++i)
695 m_fields[i]->HelmSolve(F_corrected[i],
696 m_fields[i]->UpdateCoeffs(),factors);
702 error =
m_fields[i]->L2(outarray[i], previous_iter[i]);
704 if ( forcing_L2[i] != 0)
718 if (error > max_error)
724 Vmath::Vcopy(physTot, outarray[i], 1, previous_iter[i], 1);
729 std::cout <<
" Velocity system (mapping) converged in " << s <<
730 " iterations with error = " << max_error << std::endl;
742 int physTot =
m_fields[0]->GetTotPoints();
760 m_fields[0]->HomogeneousBwdTrans(vel[i],velPhys[i]);
825 int physTot =
m_fields[0]->GetTotPoints();
831 m_mapping->ApplyChristoffelContravar(velPhys, wk);
834 for (
int i = 0; i< nvel; i++)
837 for (
int j = 0; j< nvel; j++)
840 outarray[i],1,outarray[i],1);
851 int physTot =
m_fields[0]->GetTotPoints();
857 for (
int i = 0; i< nvel; i++)
864 m_mapping->ContravarFromCartesian(tmp, coordVel);
867 m_mapping->ApplyChristoffelContravar(velPhys, wk);
868 for (
int i=0; i< nvel; i++)
872 m_fields[0]->PhysDeriv(velPhys[i], tmp[0], tmp[1]);
873 for (
int j=0; j< nvel; j++)
881 m_fields[0]->HomogeneousBwdTrans(tmp[2],tmp[2]);
889 outarray[i], 1, outarray[i], 1);
894 bool wavespace =
m_fields[0]->GetWaveSpace();
898 m_mapping->ApplyChristoffelContravar(coordVel, wk);
899 for (
int i=0; i< nvel; i++)
903 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1]);
907 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1], tmp[2]);
910 for (
int j=0; j< nvel; j++)
917 outarray[i], 1, outarray[i], 1);
922 m_fields[0]->SetWaveSpace(wavespace);
928 int physTot =
m_fields[0]->GetTotPoints();
940 for(
int i = 0; i < nvel; ++i)
945 for(
int i = 0; i < nvel; ++i)
957 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.
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()
Sets up initial conditions.
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
Wrapper to the time integration scheme.
void MappingViscousCorrection(const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
NekDouble m_pressureTolerance
NekDouble m_viscousRelaxation
virtual void v_SetUpPressureForcing(const Array< OneD, const Array< OneD, NekDouble > > &fields, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
NekDouble m_pressureRelaxation
virtual void v_EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
NekDouble m_viscousTolerance
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
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)
virtual void v_InitObject()
Init object for UnsteadySystem class.
Array< OneD, Array< OneD, NekDouble > > m_presForcingCorrection
virtual void v_DoInitialise(void)
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)
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)
virtual void v_InitObject()
Init object for UnsteadySystem class.
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
NekDouble m_sVVCutoffRatio
cutt off ratio from which to start decayhing modes
NekDouble m_sVVDiffCoeff
Diffusion coefficient of SVV modes.
Array< OneD, Array< OneD, NekDouble > > m_F
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
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.
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
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.