38#include <boost/algorithm/string.hpp>
39#include <boost/core/ignore_unused.hpp>
68 int shapedim =
m_fields[0]->GetShapeDimension();
70 for (
int j = 0; j < shapedim; ++j)
79 "No TESTTYPE defined in session.");
80 std::string TestTypeStr =
m_session->GetSolverInfo(
"TESTTYPE");
99 std::vector<std::string> vel;
148 std::string riemName;
149 m_session->LoadSolverInfo(
"AdvectionType", advName,
"WeakDG");
153 m_session->LoadSolverInfo(
"UpwindType", riemName,
"Upwind");
166 std::cout <<
"m_vellc is generated with mag = " <<
AvgInt(
m_vellc)
194 ASSERTL0(
false,
"Implicit unsteady Advection not set up.");
216 for (i = 0; i < nfields; ++i)
220 nvariables = nfields;
232 for (i = 0; i < nvariables; ++i)
245 "Only one of IO_CheckTime and IO_CheckSteps "
249 bool doCheckTime =
false;
263 for (
int i = 0; i < nvariables; ++i)
283 std::cout <<
"Steps: " << std::setw(8) << std::left << step + 1
285 <<
"Time: " << std::setw(12) << std::left <<
m_time;
287 std::stringstream ss;
288 ss << cpuTime <<
"s";
289 std::cout <<
" CPU Time: " << std::setw(8) << std::left << ss.str()
297 std::cout <<
"dMass = " << std::setw(8) << std::left << dMass[indx]
304 for (i = 0; i < nvariables; ++i)
324 std::cout <<
"dMass = ";
325 for (i = 0; i < Ntot; ++i)
327 std::cout << dMass[i] <<
" , ";
329 std::cout << std::endl << std::endl;
332 if (
m_session->GetComm()->GetRank() == 0)
338 <<
"CFL time-step : " <<
m_timestep << std::endl;
341 if (
m_session->GetSolverInfo(
"Driver") !=
"SteadyState")
343 std::cout <<
"Time-integration : " << intTime <<
"s" << std::endl;
347 for (i = 0; i < nvariables; ++i)
353 for (i = 0; i < nvariables; ++i)
397 boost::ignore_unused(time);
400 int nvariables = inarray.size();
407 int ncoeffs = inarray[0].size();
414 for (i = 1; i < nvariables; ++i)
416 WeakAdv[i] = WeakAdv[i - 1] + ncoeffs;
422 for (i = 0; i < nvariables; ++i)
424 m_fields[i]->MultiplyByElmtInvMass(WeakAdv[i], WeakAdv[i]);
425 m_fields[i]->BwdTrans(WeakAdv[i], outarray[i]);
434 for (i = 0; i < nvariables; ++i)
444 ASSERTL0(
false,
"Unknown projection scheme");
465 int nVariables = inarray.size();
480 if (inarray != outarray)
482 for (i = 0; i < nVariables; ++i)
484 Vmath::Vcopy(nQuadraturePts, inarray[i], 1, outarray[i], 1);
495 for (i = 0; i < nVariables; ++i)
497 m_fields[i]->FwdTrans(inarray[i], coeffs);
498 m_fields[i]->BwdTrans(coeffs, outarray[i]);
504 ASSERTL0(
false,
"Unknown projection scheme");
521 "Dimension of flux array and velocity array do not match");
524 int nq = physfield[0].size();
526 for (i = 0; i < flux.size(); ++i)
528 for (j = 0; j < flux[0].size(); ++j)
548 for (i = 0; i < nvariables; ++i)
550 physfield[i] = InField[i];
554 for (i = 0; i < nvariables; ++i)
563 m_fields[0]->IProductWRTDirectionalDerivBase(
580 m_fields[i]->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd);
597 m_fields[i]->AddFwdBwdTraceIntegral(fluxFwd, fluxBwd, WeakDeriv[j]);
600 Vmath::Vadd(ncoeffs, &WeakDeriv[j][0], 1, &OutField[i][0], 1,
611 NekDouble vel_phi, vel_theta, sin_varphi, cos_varphi, sin_theta, cos_theta;
621 for (
int j = 0; j < nq; j++)
635 -1.0 * vel_phi * sin_varphi - vel_theta * sin_theta * cos_varphi;
637 vel_phi * cos_varphi - vel_theta * sin_theta * sin_varphi;
638 velocity[2][j] = vel_theta * cos_theta;
673 Vmath::Vmul(nq, &tmp[0], 1, &tmp[0], 1, &tmp[0], 1);
678 <<
"Velocity vector is projected onto the tangent plane: Diff = "
692 NekDouble Tol = 0.0001, Maxiter = 1000, N = 100;
693 NekDouble newy, F = 0.0, dF = 1.0, y0, tmp;
704 intval =
sqrt(Rhs - zlevel * zlevel);
710 intval =
sqrt(0.5 * (Rhs - zlevel * zlevel * zlevel * zlevel -
718 (Rhs - zlevel * zlevel * zlevel * zlevel - zlevel * zlevel);
719 intval =
sqrt(0.5 * (1.0 +
sqrt(1.0 + 4.0 * tmp)));
734 for (
int j = 0; j < N + 1; ++j)
736 xp[j] = j * 2.0 * intval / N - intval;
739 for (
int i = 0; i < Maxiter; ++i)
747 F = xp[j] * xp[j] + y0 * y0 + zlevel * zlevel - Rhs;
754 F = 2.0 * xp[j] * xp[j] + y0 * y0 * y0 * y0 +
755 y0 * y0 + zlevel * zlevel * zlevel * zlevel +
756 zlevel * zlevel - Rhs;
757 dF = 4.0 * y0 * y0 * y0 + 2.0 * y0;
767 if (fabs(F / dF) < Tol)
779 "Advection Velocity convergence fails");
788 for (
int j = 0; j < N + 1; ++j)
790 xp[j] = j * 2.0 * intval / N - intval;
792 0.5 * (zlevel * zlevel * zlevel * zlevel +
794 (xp[j] * xp[j] * xp[j] * xp[j] - xp[j] * xp[j]);
811 for (
int j = 0; j < N; ++j)
814 arclength +
sqrt((yp[j + 1] - yp[j]) * (yp[j + 1] - yp[j]) +
815 (xp[j + 1] - xp[j]) * (xp[j + 1] - xp[j])) /
823 bool dumpInitialConditions,
826 boost::ignore_unused(domain);
842 for (
int i = 0; i <
m_fields.size(); ++i)
859 for (
int i = 0; i <
m_fields.size(); ++i)
874 std::cout <<
"m_Mass0 = " <<
m_Mass0 << std::endl;
877 for (
int i = 0; i <
m_fields.size(); ++i)
892 for (
int i = 0; i <
m_fields.size(); ++i)
905 if (dumpInitialConditions)
926 m_radius_limit = 0.5;
930 for (
int j = 0; j < nq; ++j)
935 dist =
sqrt(x0j * x0j + x1j * x1j);
937 if (dist < m_radius_limit)
939 outfield[j] = 0.5 * (1.0 + cos(
m_pi * dist / m_radius_limit));
952 NekDouble dist, radius, cosdiff, sin_theta, cos_theta, sin_varphi,
954 NekDouble m_theta_c, m_varphi_c, m_radius_limit, m_c0;
964 m_varphi_c = 3.0 *
m_pi / 2.0;
965 m_radius_limit = 7.0 *
m_pi / 64.0;
970 for (
int j = 0; j < nq; ++j)
976 radius =
sqrt(x0j * x0j + x1j * x1j + x2j * x2j);
978 sin_varphi = x1j /
sqrt(x0j * x0j + x1j * x1j);
979 cos_varphi = x0j /
sqrt(x0j * x0j + x1j * x1j);
981 sin_theta = x2j / radius;
982 cos_theta =
sqrt(x0j * x0j + x1j * x1j) / radius;
984 cosdiff = cos_varphi * cos(m_varphi_c) + sin_varphi * sin(m_varphi_c);
985 dist = radius * acos(sin(m_theta_c) * sin_theta +
986 cos(m_theta_c) * cos_theta * cosdiff);
988 if (dist < m_radius_limit)
991 0.5 * (1.0 + cos(
m_pi * dist / m_radius_limit)) + m_c0;
1003 int nq =
m_fields[0]->GetNpoints();
1009 m_fields[0]->GetCoords(x0, x1, x2);
1013 for (
int i = 0; i < nq; ++i)
1025 int nq =
m_fields[0]->GetNpoints();
1031 m_fields[0]->GetCoords(x0, x1, x2);
1035 for (
int i = 0; i < nq; ++i)
1047 int nq =
m_fields[0]->GetNpoints();
1069 1, &velcoeff[0], 1, &velcoeff[0], 1);
1073 m_fields[0]->PhysDeriv(velcoeff, Dtmp0, Dtmp1, Dtmp2);
1083 1, &vellc[0], 1, &vellc[0], 1);
1090 1, &vellc[0], 1, &vellc[0], 1);
1097 1, &vellc[0], 1, &vellc[0], 1);
1108 int nq =
m_fields[0]->GetNpoints();
1120 1, &veldotMF[j][0], 1, &veldotMF[j][0], 1);
1129 boost::ignore_unused(field);
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
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 DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
NekDouble TimePerTest(unsigned int n)
Returns amount of seconds per iteration in a test with n iterations.
void Test2Dproblem(const NekDouble time, Array< OneD, NekDouble > &outfield)
void GetFluxVector(const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
Evaluate the flux at each solution point.
virtual ~MMFAdvection()
Destructor.
Array< OneD, Array< OneD, NekDouble > > m_veldotMF
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the projection.
void Test3Dproblem(const NekDouble time, Array< OneD, NekDouble > &outfield)
void AdvectionBellSphere(Array< OneD, NekDouble > &outfield)
NekDouble ComputeCirculatingArclength(const NekDouble zlevel, const NekDouble Rhs)
MMFAdvection(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Session reader.
void WeakDGDirectionalAdvection(const Array< OneD, Array< OneD, NekDouble > > &InField, Array< OneD, Array< OneD, NekDouble > > &OutField)
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Compute the RHS.
void ComputeNablaCdotVelocity(Array< OneD, NekDouble > &vellc)
void ComputeveldotMF(Array< OneD, Array< OneD, NekDouble > > &veldotMF)
virtual void v_SetInitialConditions(const NekDouble initialtime, bool dumpInitialConditions, const int domain) override
void EvaluateAdvectionVelocity(Array< OneD, Array< OneD, NekDouble > > &velocity)
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
virtual void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print Summary.
virtual void v_InitObject(bool DeclareFields=true) override
Initialise the object.
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
virtual void v_EvaluateExactSolution(unsigned int field, Array< OneD, NekDouble > &outfield, const NekDouble time) override
Array< OneD, Array< OneD, NekDouble > > m_velocity
Advection velocity.
Array< OneD, NekDouble > & GetNormalVelocity()
Get the normal velocity.
virtual void v_DoSolve() override
Solves an unsteady problem.
static std::string className
Name of class.
Array< OneD, NekDouble > m_vellc
void AdvectionBellPlane(Array< OneD, NekDouble > &outfield)
Array< OneD, NekDouble > m_traceVn
A base class for PDEs which include an advection component.
SolverUtils::AdvectionSharedPtr m_advObject
Advection term.
int m_spacedim
Spatial dimension (>= expansion dim).
SOLVER_UTILS_EXPORT int GetTraceNpoints()
NekDouble m_timestep
Time step size.
int m_infosteps
Number of time steps between outputting status information.
NekDouble m_time
Current time of simulation.
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
NekDouble m_fintime
Finish time of the simulation.
SOLVER_UTILS_EXPORT void Checkpoint_Output(const int n)
Write checkpoint file of m_fields.
NekDouble m_checktime
Time between checkpoints.
SOLVER_UTILS_EXPORT void WriteFld(const std::string &outname)
Write field data to the given filename.
std::string m_sessionName
Name of the session.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
Array holding trace normals for DG simulations in the forwards direction.
SOLVER_UTILS_EXPORT int GetNpoints()
SOLVER_UTILS_EXPORT int GetNcoeffs()
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
int m_steps
Number of steps to take.
SOLVER_UTILS_EXPORT void SetBoundaryConditions(NekDouble time)
Evaluates the boundary conditions at the given time.
int m_checksteps
Number of steps between checkpoints.
SOLVER_UTILS_EXPORT SessionFunctionSharedPtr GetFunction(std::string name, const MultiRegions::ExpListSharedPtr &field=MultiRegions::NullExpListSharedPtr, bool cache=false)
Get a SessionFunction by name.
A base class for PDEs which include an advection component.
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s) override
Print a summary of time stepping parameters.
SOLVER_UTILS_EXPORT void VectorCrossProd(const Array< OneD, const Array< OneD, NekDouble > > &v1, const Array< OneD, const Array< OneD, NekDouble > > &v2, Array< OneD, Array< OneD, NekDouble > > &v3)
SOLVER_UTILS_EXPORT NekDouble AvgInt(const Array< OneD, const NekDouble > &inarray)
Array< OneD, Array< OneD, NekDouble > > m_movingframes
SOLVER_UTILS_EXPORT void GramSchumitz(const Array< OneD, const Array< OneD, NekDouble > > &v1, const Array< OneD, const Array< OneD, NekDouble > > &v2, Array< OneD, Array< OneD, NekDouble > > &outarray, bool KeepTheMagnitude=true)
Array< OneD, Array< OneD, NekDouble > > m_ncdotMFBwd
SOLVER_UTILS_EXPORT void ComputencdotMF()
SOLVER_UTILS_EXPORT void CartesianToSpherical(const NekDouble x0j, const NekDouble x1j, const NekDouble x2j, NekDouble &sin_varphi, NekDouble &cos_varphi, NekDouble &sin_theta, NekDouble &cos_theta)
SOLVER_UTILS_EXPORT NekDouble RootMeanSquare(const Array< OneD, const NekDouble > &inarray)
SurfaceType m_surfaceType
Array< OneD, Array< OneD, NekDouble > > m_ncdotMFFwd
SOLVER_UTILS_EXPORT void MMFInitObject(const Array< OneD, const Array< OneD, NekDouble > > &Anisotropy, const int TangentXelem=-1)
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
NekDouble m_cflSafetyFactor
CFL safety factor (comprise between 0 to 1).
LibUtilities::TimeIntegrationSchemeSharedPtr m_intScheme
Wrapper to the time integration scheme.
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
std::vector< int > m_intVariables
virtual SOLVER_UTILS_EXPORT void v_InitObject(bool DeclareField=true) override
Init object for UnsteadySystem class.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ eMixed_CG_Discontinuous
static const NekDouble kNekZeroTol
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
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.
RiemannSolverFactory & GetRiemannSolverFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::vector< double > z(NPUPPER)
The above copyright notice and this permission notice shall be included.
@ SIZE_TestType
Length of enum list.
const char *const TestTypeMap[]
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 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.
scalarT< T > sqrt(scalarT< T > in)