Virtual function for solve implementation.
86 time_t starttime, endtime;
89 m_equ[0]->PrintSummary(out);
93 m_equ[0]->DoInitialise();
100 bool isHomogeneous1D;
101 int nRuns, minP, maxP, sensorVar;
103 m_session->LoadParameter(
"NumRuns", nRuns, 1);
104 m_session->LoadParameter(
"AdaptiveMinModes", minP, 4);
105 m_session->LoadParameter(
"AdaptiveMaxModes", maxP, 12);
106 m_session->LoadParameter(
"AdaptiveLowerTolerance", lowerTol, 1e-8);
107 m_session->LoadParameter(
"AdaptiveUpperTolerance", upperTol, 1e-6);
108 m_session->LoadParameter(
"AdaptiveSensorVariable", sensorVar, 0);
109 m_session->MatchSolverInfo(
"Homogeneous",
"1D", isHomogeneous1D,
false);
115 nExp =
m_equ[0]->UpdateFields()[0]->GetPlane(0)->GetExpSize();
116 nPlanes =
m_equ[0]->UpdateFields()[0]->GetZIDs().size();
120 nExp =
m_equ[0]->UpdateFields()[0]->GetExpSize();
123 int expdim =
m_equ[0]->UpdateFields()[0]->GetGraph()->GetMeshDimension();
125 int nFields =
m_equ[0]->UpdateFields().size();
126 int numSteps =
m_session->GetParameter(
"NumSteps");
129 Array<OneD, NekDouble> coeffs, phys, physReduced, tmpArray;
136 Array<OneD, int>
P(expdim);
137 Array<OneD, int> numPoints(expdim);
138 Array<OneD, LibUtilities::PointsKey> ptsKey(expdim);
140 for (
int i = 1; i < nRuns; i++)
143 Array<OneD, MultiRegions::ExpListSharedPtr> fields =
144 m_equ[0]->UpdateFields();
147 map<int, int> deltaP;
149 for (
int n = 0; n < nExp; n++)
151 offset = fields[sensorVar]->GetPhys_Offset(n);
152 Exp = fields[sensorVar]->GetExp(n);
154 for (
int k = 0; k < expdim; ++k)
156 P[k] = Exp->GetBasis(k)->GetNumModes();
157 numPoints[k] = Exp->GetBasis(k)->GetNumPoints();
158 ptsKey[k] = LibUtilities::PointsKey(
159 numPoints[k], Exp->GetBasis(k)->GetPointsType());
164 switch (Exp->GetGeom()->GetShapeType())
172 OrthoExp = MemoryManager<
173 StdRegions::StdQuadExp>::AllocateSharedPtr(Ba, Bb);
221 OrthoExp = MemoryManager<
222 StdRegions::StdPrismExp>::AllocateSharedPtr(Ba, Bb, Bc);
239 ASSERTL0(
false,
"Shape not supported.");
243 int nq = OrthoExp->GetTotPoints();
249 coeffs = Array<OneD, NekDouble>(OrthoExp->GetNcoeffs());
250 physReduced = Array<OneD, NekDouble>(OrthoExp->GetTotPoints());
251 tmpArray = Array<OneD, NekDouble>(OrthoExp->GetTotPoints(), 0.0);
254 for (
int plane = 0; plane < nPlanes; plane++)
259 fields[sensorVar]->GetPlane(plane)->GetPhys() + offset;
263 phys = fields[sensorVar]->GetPhys() + offset;
267 OrthoExp->FwdTrans(phys, coeffs);
268 OrthoExp->BwdTrans(coeffs, physReduced);
271 Vmath::Vsub(nq, phys, 1, physReduced, 1, tmpArray, 1);
272 Vmath::Vmul(nq, tmpArray, 1, tmpArray, 1, tmpArray, 1);
273 tmp = Exp->Integral(tmpArray);
276 fac = Exp->Integral(tmpArray);
278 tmp =
abs(tmp / fac);
283 "Adaptive procedure encountered NaN value.");
287 error = (tmp > error) ? tmp : error;
291 m_session->GetComm()->GetColumnComm()->AllReduce(
295 if (
m_session->DefinesFunction(
"AdaptiveLowerTolerance"))
297 int nq = Exp->GetTotPoints();
300 Array<OneD, NekDouble> xc0, xc1, xc2;
301 xc0 = Array<OneD, NekDouble>(nq, 0.0);
302 xc1 = Array<OneD, NekDouble>(nq, 0.0);
303 xc2 = Array<OneD, NekDouble>(nq, 0.0);
304 Exp->GetCoords(xc0, xc1, xc2);
307 Array<OneD, NekDouble> tolerance(nq, 0.0);
309 m_session->GetFunction(
"AdaptiveLowerTolerance", 0);
310 ffunc->Evaluate(xc0, xc1, xc2, tolerance);
314 if (
m_session->DefinesFunction(
"AdaptiveUpperTolerance"))
316 int nq = Exp->GetTotPoints();
319 Array<OneD, NekDouble> xc0, xc1, xc2;
320 xc0 = Array<OneD, NekDouble>(nq, 0.0);
321 xc1 = Array<OneD, NekDouble>(nq, 0.0);
322 xc2 = Array<OneD, NekDouble>(nq, 0.0);
323 Exp->GetCoords(xc0, xc1, xc2);
326 Array<OneD, NekDouble> tolerance(nq, 0.0);
328 m_session->GetFunction(
"AdaptiveUpperTolerance", 0);
329 ffunc->Evaluate(xc0, xc1, xc2, tolerance);
334 if ((error > upperTol) && (
P[0] < maxP))
336 deltaP[Exp->GetGeom()->GetGlobalID()] = 1;
338 else if ((error < lowerTol) &&
P[0] > minP)
340 deltaP[Exp->GetGeom()->GetGlobalID()] = -1;
344 deltaP[Exp->GetGeom()->GetGlobalID()] = 0;
356 if (LibUtilities::NekManager<MultiRegions::GlobalLinSysKey,
357 MultiRegions::GlobalLinSys>::
358 PoolCreated(std::string(
"GlobalLinSys")))
360 LibUtilities::NekManager<MultiRegions::GlobalLinSysKey,
361 MultiRegions::GlobalLinSys>::
362 ClearManager(std::string(
"GlobalLinSys"));
365 int chkNumber =
m_equ[0]->GetCheckpointNumber();
366 int chkSteps =
m_equ[0]->GetCheckpointSteps();
372 mapping->ReplaceField(
m_equ[0]->UpdateFields());
375 m_equ[0]->SetCheckpointSteps(0);
378 m_equ[0]->DoInitialise();
379 m_equ[0]->SetInitialStep(i * numSteps);
380 m_equ[0]->SetSteps(i * numSteps + numSteps);
381 m_equ[0]->SetTime(startTime + i * period);
382 m_equ[0]->SetBoundaryConditions(startTime + i * period);
383 m_equ[0]->SetCheckpointNumber(chkNumber);
384 m_equ[0]->SetCheckpointSteps(chkSteps);
387 for (
int n = 0; n < nFields; n++)
389 m_equ[0]->UpdateFields()[n]->ExtractCoeffsToCoeffs(
390 fields[n], fields[n]->GetCoeffs(),
391 m_equ[0]->UpdateFields()[n]->UpdateCoeffs());
392 m_equ[0]->UpdateFields()[n]->BwdTrans(
393 m_equ[0]->UpdateFields()[n]->GetCoeffs(),
394 m_equ[0]->UpdateFields()[n]->UpdatePhys());
405 if (
m_comm->GetRank() == 0)
407 CPUtime = difftime(endtime, starttime);
408 cout <<
"-------------------------------------------" << endl;
409 cout <<
"Total Computation Time = " << CPUtime <<
"s" << endl;
410 cout <<
"-------------------------------------------" << endl;
418 for (
int i = 0; i <
m_equ[0]->GetNvariables(); ++i)
420 Array<OneD, NekDouble> exactsoln(
m_equ[0]->GetTotPoints(), 0.0);
423 m_equ[0]->EvaluateExactSolution(i, exactsoln,
m_equ[0]->GetFinalTime());
428 if (
m_comm->GetRank() == 0)
430 out <<
"L 2 error (variable " <<
m_equ[0]->GetVariable(i)
431 <<
") : " << vL2Error << endl;
432 out <<
"L inf error (variable " <<
m_equ[0]->GetVariable(i)
433 <<
") : " << vLinfError << endl;
#define ASSERTL0(condition, msg)
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.
SOLVER_UTILS_EXPORT void ReplaceExpansion(Array< OneD, MultiRegions::ExpListSharedPtr > &fields, std::map< int, int > deltaP)
Update EXPANSIONS tag inside XML schema to reflect new polynomial order distribution.
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout)
LibUtilities::CommSharedPtr m_comm
Communication object.
SpatialDomains::MeshGraphSharedPtr m_graph
MeshGraph object.
GLOBAL_MAPPING_EXPORT typedef std::shared_ptr< Mapping > MappingSharedPtr
A shared pointer to a Mapping object.
std::shared_ptr< Equation > EquationSharedPtr
@ eOrtho_A
Principle Orthogonal Functions .
@ eOrtho_C
Principle Orthogonal Functions .
@ eOrtho_B
Principle Orthogonal Functions .
std::shared_ptr< Expansion > ExpansionSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
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.
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
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 > abs(scalarT< T > in)