38#include <boost/algorithm/string.hpp>
66 int shapedim =
m_fields[0]->GetShapeDimension();
68 for (
int j = 0; j < shapedim; ++j)
77 "No TESTTYPE defined in session.");
78 std::string TestTypeStr =
m_session->GetSolverInfo(
"TESTTYPE");
97 std::vector<std::string> vel;
146 std::string riemName;
147 m_session->LoadSolverInfo(
"AdvectionType", advName,
"WeakDG");
151 m_session->LoadSolverInfo(
"UpwindType", riemName,
"Upwind");
164 std::cout <<
"m_vellc is generated with mag = " <<
AvgInt(
m_vellc)
192 ASSERTL0(
false,
"Implicit unsteady Advection not set up.");
207 for (i = 0; i < nfields; ++i)
211 nvariables = nfields;
223 for (i = 0; i < nvariables; ++i)
236 "Only one of IO_CheckTime and IO_CheckSteps "
240 bool doCheckTime =
false;
254 for (
int i = 0; i < nvariables; ++i)
274 std::cout <<
"Steps: " << std::setw(8) << std::left << step + 1
276 <<
"Time: " << std::setw(12) << std::left <<
m_time;
278 std::stringstream ss;
279 ss << cpuTime <<
"s";
280 std::cout <<
" CPU Time: " << std::setw(8) << std::left << ss.str()
288 std::cout <<
"dMass = " << std::setw(8) << std::left << dMass[indx]
295 for (i = 0; i < nvariables; ++i)
315 std::cout <<
"dMass = ";
316 for (i = 0; i < Ntot; ++i)
318 std::cout << dMass[i] <<
" , ";
320 std::cout << std::endl << std::endl;
323 if (
m_session->GetComm()->GetRank() == 0)
329 <<
"CFL time-step : " <<
m_timestep << std::endl;
332 if (
m_session->GetSolverInfo(
"Driver") !=
"SteadyState")
334 std::cout <<
"Time-integration : " << intTime <<
"s" << std::endl;
338 for (i = 0; i < nvariables; ++i)
344 for (i = 0; i < nvariables; ++i)
390 int nvariables = inarray.size();
397 int ncoeffs = inarray[0].size();
404 for (i = 1; i < nvariables; ++i)
406 WeakAdv[i] = WeakAdv[i - 1] + ncoeffs;
412 for (i = 0; i < nvariables; ++i)
414 m_fields[i]->MultiplyByElmtInvMass(WeakAdv[i], WeakAdv[i]);
415 m_fields[i]->BwdTrans(WeakAdv[i], outarray[i]);
424 for (i = 0; i < nvariables; ++i)
434 ASSERTL0(
false,
"Unknown projection scheme");
455 int nVariables = inarray.size();
470 if (inarray != outarray)
472 for (i = 0; i < nVariables; ++i)
474 Vmath::Vcopy(nQuadraturePts, inarray[i], 1, outarray[i], 1);
485 for (i = 0; i < nVariables; ++i)
487 m_fields[i]->FwdTrans(inarray[i], coeffs);
488 m_fields[i]->BwdTrans(coeffs, outarray[i]);
494 ASSERTL0(
false,
"Unknown projection scheme");
511 "Dimension of flux array and velocity array do not match");
514 int nq = physfield[0].size();
516 for (i = 0; i < flux.size(); ++i)
518 for (j = 0; j < flux[0].size(); ++j)
538 for (i = 0; i < nvariables; ++i)
540 physfield[i] = InField[i];
544 for (i = 0; i < nvariables; ++i)
553 m_fields[0]->IProductWRTDirectionalDerivBase(
570 m_fields[i]->GetFwdBwdTracePhys(physfield[i], Fwd, Bwd);
587 m_fields[i]->AddFwdBwdTraceIntegral(fluxFwd, fluxBwd, WeakDeriv[j]);
590 Vmath::Vadd(ncoeffs, &WeakDeriv[j][0], 1, &OutField[i][0], 1,
601 NekDouble vel_phi, vel_theta, sin_varphi, cos_varphi, sin_theta, cos_theta;
611 for (
int j = 0; j < nq; j++)
625 -1.0 * vel_phi * sin_varphi - vel_theta * sin_theta * cos_varphi;
627 vel_phi * cos_varphi - vel_theta * sin_theta * sin_varphi;
628 velocity[2][j] = vel_theta * cos_theta;
663 Vmath::Vmul(nq, &tmp[0], 1, &tmp[0], 1, &tmp[0], 1);
668 <<
"Velocity vector is projected onto the tangent plane: Diff = "
682 NekDouble Tol = 0.0001, Maxiter = 1000, N = 100;
683 NekDouble newy, F = 0.0, dF = 1.0, y0, tmp;
694 intval =
sqrt(Rhs - zlevel * zlevel);
700 intval =
sqrt(0.5 * (Rhs - zlevel * zlevel * zlevel * zlevel -
708 (Rhs - zlevel * zlevel * zlevel * zlevel - zlevel * zlevel);
709 intval =
sqrt(0.5 * (1.0 +
sqrt(1.0 + 4.0 * tmp)));
724 for (
int j = 0; j < N + 1; ++j)
726 xp[j] = j * 2.0 * intval / N - intval;
729 for (
int i = 0; i < Maxiter; ++i)
737 F = xp[j] * xp[j] + y0 * y0 + zlevel * zlevel - Rhs;
744 F = 2.0 * xp[j] * xp[j] + y0 * y0 * y0 * y0 +
745 y0 * y0 + zlevel * zlevel * zlevel * zlevel +
746 zlevel * zlevel - Rhs;
747 dF = 4.0 * y0 * y0 * y0 + 2.0 * y0;
757 if (fabs(F / dF) < Tol)
769 "Advection Velocity convergence fails");
778 for (
int j = 0; j < N + 1; ++j)
780 xp[j] = j * 2.0 * intval / N - intval;
782 0.5 * (zlevel * zlevel * zlevel * zlevel +
784 (xp[j] * xp[j] * xp[j] * xp[j] - xp[j] * xp[j]);
801 for (
int j = 0; j < N; ++j)
804 arclength +
sqrt((yp[j + 1] - yp[j]) * (yp[j + 1] - yp[j]) +
805 (xp[j + 1] - xp[j]) * (xp[j + 1] - xp[j])) /
813 bool dumpInitialConditions,
814 [[maybe_unused]]
const int domain)
830 for (
int i = 0; i <
m_fields.size(); ++i)
847 for (
int i = 0; i <
m_fields.size(); ++i)
862 std::cout <<
"m_Mass0 = " <<
m_Mass0 << std::endl;
865 for (
int i = 0; i <
m_fields.size(); ++i)
880 for (
int i = 0; i <
m_fields.size(); ++i)
893 if (dumpInitialConditions)
914 m_radius_limit = 0.5;
918 for (
int j = 0; j < nq; ++j)
923 dist =
sqrt(x0j * x0j + x1j * x1j);
925 if (dist < m_radius_limit)
927 outfield[j] = 0.5 * (1.0 + cos(
m_pi * dist / m_radius_limit));
940 NekDouble dist, radius, cosdiff, sin_theta, cos_theta, sin_varphi,
942 NekDouble m_theta_c, m_varphi_c, m_radius_limit, m_c0;
952 m_varphi_c = 3.0 *
m_pi / 2.0;
953 m_radius_limit = 7.0 *
m_pi / 64.0;
958 for (
int j = 0; j < nq; ++j)
964 radius =
sqrt(x0j * x0j + x1j * x1j + x2j * x2j);
966 sin_varphi = x1j /
sqrt(x0j * x0j + x1j * x1j);
967 cos_varphi = x0j /
sqrt(x0j * x0j + x1j * x1j);
969 sin_theta = x2j / radius;
970 cos_theta =
sqrt(x0j * x0j + x1j * x1j) / radius;
972 cosdiff = cos_varphi * cos(m_varphi_c) + sin_varphi * sin(m_varphi_c);
973 dist = radius * acos(sin(m_theta_c) * sin_theta +
974 cos(m_theta_c) * cos_theta * cosdiff);
976 if (dist < m_radius_limit)
979 0.5 * (1.0 + cos(
m_pi * dist / m_radius_limit)) + m_c0;
1001 for (
int i = 0; i < nq; ++i)
1013 int nq =
m_fields[0]->GetNpoints();
1019 m_fields[0]->GetCoords(x0, x1, x2);
1023 for (
int i = 0; i < nq; ++i)
1035 int nq =
m_fields[0]->GetNpoints();
1057 1, &velcoeff[0], 1, &velcoeff[0], 1);
1061 m_fields[0]->PhysDeriv(velcoeff, Dtmp0, Dtmp1, Dtmp2);
1071 1, &vellc[0], 1, &vellc[0], 1);
1078 1, &vellc[0], 1, &vellc[0], 1);
1085 1, &vellc[0], 1, &vellc[0], 1);
1096 int nq =
m_fields[0]->GetNpoints();
1108 1, &veldotMF[j][0], 1, &veldotMF[j][0], 1);
#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.
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)
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.
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print Summary.
void v_InitObject(bool DeclareFields=true) override
Initialise the object.
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
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.
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.
SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s) override
Virtual function for generating summary information.
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
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)
@ 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)