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";
86 int physTot =
m_fields[0]->GetTotPoints();
88 int intMethod =
m_intScheme->GetIntegrationMethod();
122 m_session->MatchSolverInfo(
"MappingImplicitPressure",
"True",
124 m_session->MatchSolverInfo(
"MappingImplicitViscous",
"True",
126 m_session->MatchSolverInfo(
"MappingNeglectViscous",
"True",
135 m_session->LoadParameter(
"MappingPressureTolerance",
137 m_session->LoadParameter(
"MappingViscousTolerance",
139 m_session->LoadParameter(
"MappingPressureRelaxation",
141 m_session->LoadParameter(
"MappingViscousRelaxation",
159 boost::lexical_cast<std::string>(
m_kinvis);
178 int physTot =
m_fields[0]->GetTotPoints();
215 x->Apply(
m_fields, inarray, outarray, time);
253 int physTot =
m_fields[0]->GetTotPoints();
262 for(
int i = 0; i < nvel; ++i)
266 m_fields[i]->HomogeneousBwdTrans(fields[i],wk);
275 m_fields[i]->HomogeneousFwdTrans(wk,wk);
287 bool wavespace =
m_fields[0]->GetWaveSpace();
294 for(
int i = 0; i < tmp.num_elements(); i++)
310 m_mapping->DotGradJacobian(velocity, wk);
314 for(
int i = 0; i < nvel; ++i)
318 Vmath::Vmul(physTot, Jac, 1, tmp[i], 1, tmp[i], 1);
322 for(
int i = 0; i < nvel; ++i)
332 m_mapping->DotGradJacobian(tmp, velocity[0]);
335 Vmath::Vadd(physTot, velocity[0], 1, wk, 1, wk, 1);
359 m_fields[0]->SetWaveSpace(wavespace);
373 int physTot =
m_fields[0]->GetTotPoints();
392 for (
int i=0; i<nvel; i++)
399 for (
int i=0; i<nvel; i++)
417 for (
int i=0; i<nvel; i++)
425 for (
int i=0; i<nvel; i++)
434 for(
int i = 0; i < nvel; ++i)
453 int physTot =
m_fields[0]->GetTotPoints();
455 bool converged =
false;
461 m_session->LoadParameter(
"MappingMaxIter",maxIter,5000);
471 for(
int i = 0; i < nvel; ++i)
495 "VCSMapping exceeded maximum number of iterations.");
506 for(
int i = 0; i < nvel; ++i)
509 previous_iter, gradP[i]);
512 m_pressure->HomogeneousBwdTrans(gradP[i], wk1[i]);
533 m_pressure->HomogeneousFwdTrans(F_corrected, F_corrected);
548 Vmath::Vadd(physTot, wk1[0], 1, F_corrected, 1, F_corrected, 1);
562 if ( forcing_L2 != 0)
579 std::cout <<
" Pressure system (mapping) converged in " << s <<
580 " iterations with error = " << error << std::endl;
599 int physTot =
m_fields[0]->GetTotPoints();
601 bool converged =
false;
606 m_session->LoadParameter(
"MappingMaxIter",maxIter,5000);
617 for(
int i = 0; i < nvel; ++i)
636 for(
int i = 0; i < nvel; ++i)
649 "VCSMapping exceeded maximum number of iterations.");
660 for (
int i = 0; i < nvel; ++i)
662 m_fields[0]->HomogeneousBwdTrans(previous_iter[i],
668 for (
int i = 0; i < nvel; ++i)
675 m_mapping->VelocityLaplacian(wk, F_corrected,
680 for (
int i = 0; i < nvel; ++i)
682 m_fields[0]->HomogeneousFwdTrans(F_corrected[i],
688 for (
int i = 0; i < nvel; ++i)
696 for (
int i = 0; i < nvel; ++i)
711 m_fields[i]->HelmSolve(F_corrected[i],
719 error =
m_fields[i]->L2(outarray[i], previous_iter[i]);
721 if ( forcing_L2[i] != 0)
735 if (error > max_error)
741 Vmath::Vcopy(physTot, outarray[i], 1, previous_iter[i], 1);
746 std::cout <<
" Velocity system (mapping) converged in " << s <<
747 " iterations with error = " << max_error << std::endl;
759 int physTot =
m_fields[0]->GetTotPoints();
777 m_fields[0]->HomogeneousBwdTrans(vel[i],velPhys[i]);
798 Vmath::Vadd(physTot, tmp[i], 1, Forcing[i], 1, Forcing[i], 1);
808 Vmath::Vadd(physTot, tmp[i], 1, Forcing[i], 1, Forcing[i], 1);
818 Vmath::Vadd(physTot, tmp[i], 1, Forcing[i], 1, Forcing[i], 1);
827 m_fields[0]->HomogeneousFwdTrans(Forcing[i],Forcing[i]);
834 Vmath::Vadd(physTot, outarray[i], 1, Forcing[i], 1, outarray[i], 1);
842 int physTot =
m_fields[0]->GetTotPoints();
848 m_mapping->ApplyChristoffelContravar(velPhys, wk);
851 for (
int i = 0; i< nvel; i++)
854 for (
int j = 0; j< nvel; j++)
857 outarray[i],1,outarray[i],1);
868 int physTot =
m_fields[0]->GetTotPoints();
874 for (
int i = 0; i< nvel; i++)
881 m_mapping->ContravarFromCartesian(tmp, coordVel);
884 m_mapping->ApplyChristoffelContravar(velPhys, wk);
885 for (
int i=0; i< nvel; i++)
889 m_fields[0]->PhysDeriv(velPhys[i], tmp[0], tmp[1]);
890 for (
int j=0; j< nvel; j++)
898 m_fields[0]->HomogeneousBwdTrans(tmp[2],tmp[2]);
906 outarray[i], 1, outarray[i], 1);
911 bool wavespace =
m_fields[0]->GetWaveSpace();
915 m_mapping->ApplyChristoffelContravar(coordVel, wk);
916 for (
int i=0; i< nvel; i++)
920 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1]);
924 m_fields[0]->PhysDeriv(coordVel[i], tmp[0], tmp[1], tmp[2]);
927 for (
int j=0; j< nvel; j++)
934 outarray[i], 1, outarray[i], 1);
939 m_fields[0]->SetWaveSpace(wavespace);
945 int physTot =
m_fields[0]->GetTotPoints();
957 for(
int i = 0; i < nvel; ++i)
962 for(
int i = 0; i < nvel; ++i)
974 m_mapping->VelocityLaplacian(velPhys, outarray, 1.0);
#define ASSERTL0(condition, msg)
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
virtual void v_InitObject()
Init object for UnsteadySystem class.
NekDouble m_pressureTolerance
virtual void v_DoInitialise(void)
Sets up initial conditions.
void ApplyIncNSMappingForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void MappingAccelerationCorrection(const Array< OneD, const Array< OneD, NekDouble > > &vel, const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
NekDouble m_kinvis
Kinematic viscosity.
ExtrapolateFactory & GetExtrapolateFactory()
NekDouble m_timestep
Time step size.
virtual void v_SolveViscous(const Array< OneD, const Array< OneD, NekDouble > > &Forcing, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble aii_Dt)
Array< OneD, int > m_velocity
int which identifies which components of m_fields contains the velocity (u,v,w);
NekDouble m_sVVDiffCoeff
Diffusion coefficient of SVV modes.
void MappingAdvectionCorrection(const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
ExtrapolateSharedPtr m_extrapolation
GlobalMapping::MappingSharedPtr m_mapping
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 void v_SetUpViscousForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &Forcing, const NekDouble aii_Dt)
void EvaluateAdvectionTerms(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
std::map< ConstFactorType, NekDouble > ConstFactorMap
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.
int m_nConvectiveFields
Number of fields to be convected;.
NekDouble m_viscousRelaxation
Array< OneD, Array< OneD, NekDouble > > m_gradP
void MappingViscousCorrection(const Array< OneD, const Array< OneD, NekDouble > > &velPhys, Array< OneD, Array< OneD, NekDouble > > &outarray)
IMEX 2nd order scheme using Backward Different Formula & Extrapolation.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
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)
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
std::vector< SolverUtils::ForcingSharedPtr > m_forcing
Forcing terms.
Base class for unsteady solvers.
bool m_SmoothAdvection
bool to identify if advection term smoothing is requested
LibUtilities::FieldMetaDataMap m_fieldMetaDataMap
Map to identify relevant solver info to dump in output fields.
void Neg(int n, T *x, const int incx)
Negate x = -x.
virtual void v_SolvePressure(const Array< OneD, NekDouble > &Forcing)
Array< OneD, Array< OneD, NekDouble > > m_presForcingCorrection
EquationSystemFactory & GetEquationSystemFactory()
Array< OneD, Array< OneD, NekDouble > > m_F
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.
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.
void MappingPressureCorrection(Array< OneD, Array< OneD, NekDouble > > &outarray)
NekDouble m_sVVCutoffRatio
cutt off ratio from which to start decayhing modes
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
bool m_useSpecVanVisc
bool to identify if spectral vanishing viscosity is active.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
IMEX 3rd order scheme using Backward Different Formula & Extrapolation.
LibUtilities::TimeIntegrationWrapperSharedPtr m_intScheme
Wrapper to the time integration scheme.
NekDouble m_viscousTolerance
IMEX 4th order scheme using Backward Different Formula & Extrapolation.
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.
IMEX 1st order scheme using Euler Backwards/Euler Forwards.
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)
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.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
virtual SOLVER_UTILS_EXPORT void v_DoInitialise()
Sets up initial conditions.
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.
virtual void v_EvaluateAdvection_SetPressureBCs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
NekDouble m_pressureRelaxation
static FlagList NullFlagList
An empty flag list.