Virtual function for solve implementation.
81 time_t starttime, endtime;
84 m_equ[0]->PrintSummary(out);
88 m_equ[0]->DoInitialise();
96 int nRuns, minP, maxP, sensorVar;
98 m_session->LoadParameter (
"NumRuns", nRuns, 1);
99 m_session->LoadParameter (
"AdaptiveMinModes", minP, 4);
100 m_session->LoadParameter (
"AdaptiveMaxModes", maxP, 12);
101 m_session->LoadParameter (
"AdaptiveLowerTolerance", lowerTol, 1e-8);
102 m_session->LoadParameter (
"AdaptiveUpperTolerance", upperTol, 1e-6);
103 m_session->LoadParameter (
"AdaptiveSensorVariable", sensorVar, 0);
104 m_session->MatchSolverInfo(
"Homogeneous",
"1D", isHomogeneous1D,
false);
110 nExp =
m_equ[0]->UpdateFields()[0]->GetPlane(0)->GetExpSize();
111 nPlanes =
m_equ[0]->UpdateFields()[0]->GetZIDs().num_elements();
115 nExp =
m_equ[0]->UpdateFields()[0]->GetExpSize();
119 int nFields =
m_equ[0]->UpdateFields().num_elements();
120 int numSteps =
m_session->GetParameter(
"NumSteps");
123 Array<OneD, NekDouble> coeffs, phys, physReduced, tmpArray;
128 m_equ[0]->UpdateFields());
132 for (
int i = 1; i < nRuns; i++)
135 Array<OneD, MultiRegions::ExpListSharedPtr> fields =
136 m_equ[0]->UpdateFields();
139 map<int, int> deltaP;
141 for (
int n = 0; n < nExp; n++)
143 offset = fields[sensorVar]->GetPhys_Offset(n);
144 Exp = fields[sensorVar]->GetExp(n);
146 int P = Exp->GetBasis(0)->GetNumModes();
147 int Q = Exp->GetBasis(1)->GetNumModes();
148 int qa = Exp->GetBasis(0)->GetNumPoints();
149 int qb = Exp->GetBasis(1)->GetNumPoints();
152 LibUtilities::PointsKey pa(qa, Exp->GetBasis(0)->GetPointsType());
153 LibUtilities::PointsKey pb(qb, Exp->GetBasis(1)->GetPointsType());
156 switch (Exp->GetGeom()->GetShapeType())
164 OrthoExp = MemoryManager<
165 StdRegions::StdQuadExp>::AllocateSharedPtr(Ba, Bb);
180 ASSERTL0(
false,
"Shape not supported.");
184 int nq = OrthoExp->GetTotPoints();
190 coeffs = Array<OneD, NekDouble>(OrthoExp->GetNcoeffs());
191 physReduced = Array<OneD, NekDouble>(OrthoExp->GetTotPoints());
192 tmpArray = Array<OneD, NekDouble>(OrthoExp->GetTotPoints(), 0.0);
195 for (
int plane = 0; plane < nPlanes; plane++)
200 fields[sensorVar]->GetPlane(plane)->GetPhys() + offset;
204 phys = fields[sensorVar]->GetPhys() + offset;
208 OrthoExp->FwdTrans(phys, coeffs);
209 OrthoExp->BwdTrans(coeffs, physReduced);
212 Vmath::Vsub(nq, phys, 1, physReduced, 1, tmpArray, 1);
213 Vmath::Vmul(nq, tmpArray, 1, tmpArray, 1, tmpArray, 1);
214 tmp = Exp->Integral(tmpArray);
217 fac = Exp->Integral(tmpArray);
219 tmp = abs(tmp / fac);
224 "Adaptive procedure encountered NaN value.");
228 error = (tmp > error) ? tmp : error;
232 m_session->GetComm()->GetColumnComm()->AllReduce(
236 if (
m_session->DefinesFunction(
"AdaptiveLowerTolerance"))
238 int nq = Exp->GetTotPoints();
241 Array<OneD, NekDouble> xc0, xc1, xc2;
242 xc0 = Array<OneD, NekDouble>(nq, 0.0);
243 xc1 = Array<OneD, NekDouble>(nq, 0.0);
244 xc2 = Array<OneD, NekDouble>(nq, 0.0);
245 Exp->GetCoords(xc0, xc1, xc2);
248 Array<OneD, NekDouble> tolerance(nq, 0.0);
250 m_session->GetFunction(
"AdaptiveLowerTolerance", 0);
251 ffunc->Evaluate(xc0, xc1, xc2, tolerance);
255 if (
m_session->DefinesFunction(
"AdaptiveUpperTolerance"))
257 int nq = Exp->GetTotPoints();
260 Array<OneD, NekDouble> xc0, xc1, xc2;
261 xc0 = Array<OneD, NekDouble>(nq, 0.0);
262 xc1 = Array<OneD, NekDouble>(nq, 0.0);
263 xc2 = Array<OneD, NekDouble>(nq, 0.0);
264 Exp->GetCoords(xc0, xc1, xc2);
267 Array<OneD, NekDouble> tolerance(nq, 0.0);
269 m_session->GetFunction(
"AdaptiveUpperTolerance", 0);
270 ffunc->Evaluate(xc0, xc1, xc2, tolerance);
275 if ((error > upperTol) && (P < maxP))
277 deltaP[Exp->GetGeom()->GetGlobalID()] = 1;
279 else if ((error < lowerTol) && P > minP)
281 deltaP[Exp->GetGeom()->GetGlobalID()] = -1;
285 deltaP[Exp->GetGeom()->GetGlobalID()] = 0;
296 if (LibUtilities::NekManager<MultiRegions::GlobalLinSysKey,
297 MultiRegions::GlobalLinSys>::
298 PoolCreated(std::string(
"GlobalLinSys")))
300 LibUtilities::NekManager<MultiRegions::GlobalLinSysKey,
301 MultiRegions::GlobalLinSys>::
302 ClearManager(std::string(
"GlobalLinSys"));
305 int chkNumber =
m_equ[0]->GetCheckpointNumber();
306 int chkSteps =
m_equ[0]->GetCheckpointSteps();
312 mapping->ReplaceField(
m_equ[0]->UpdateFields());
315 m_equ[0]->SetCheckpointSteps(0);
318 m_equ[0]->DoInitialise();
319 m_equ[0]->SetInitialStep(i * numSteps);
320 m_equ[0]->SetSteps(i * numSteps + numSteps);
321 m_equ[0]->SetTime(startTime + i * period);
322 m_equ[0]->SetBoundaryConditions(startTime + i * period);
323 m_equ[0]->SetCheckpointNumber(chkNumber);
324 m_equ[0]->SetCheckpointSteps(chkSteps);
327 for (
int n = 0; n < nFields; n++)
329 m_equ[0]->UpdateFields()[n]->ExtractCoeffsToCoeffs(
330 fields[n], fields[n]->GetCoeffs(),
331 m_equ[0]->UpdateFields()[n]->UpdateCoeffs());
332 m_equ[0]->UpdateFields()[n]->BwdTrans_IterPerExp(
333 m_equ[0]->UpdateFields()[n]->GetCoeffs(),
334 m_equ[0]->UpdateFields()[n]->UpdatePhys());
345 if (
m_comm->GetRank() == 0)
347 CPUtime = difftime(endtime, starttime);
348 cout <<
"-------------------------------------------" << endl;
349 cout <<
"Total Computation Time = " << CPUtime <<
"s" << endl;
350 cout <<
"-------------------------------------------" << endl;
358 for (
int i = 0; i <
m_equ[0]->GetNvariables(); ++i)
360 Array<OneD, NekDouble> exactsoln(
m_equ[0]->GetTotPoints(), 0.0);
363 m_equ[0]->EvaluateExactSolution(i, exactsoln,
m_equ[0]->GetFinalTime());
368 if (
m_comm->GetRank() == 0)
370 out <<
"L 2 error (variable " <<
m_equ[0]->GetVariable(i)
371 <<
") : " << vL2Error << endl;
372 out <<
"L inf error (variable " <<
m_equ[0]->GetVariable(i)
373 <<
") : " << vLinfError << endl;
#define ASSERTL0(condition, msg)
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.
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
Principle Orthogonal Functions .
virtual SOLVER_UTILS_EXPORT void v_InitObject(std::ostream &out=std::cout)
Principle Orthogonal Functions .
boost::shared_ptr< Expansion > ExpansionSharedPtr
GLOBAL_MAPPING_EXPORT typedef boost::shared_ptr< Mapping > MappingSharedPtr
A shared pointer to a Mapping object.
boost::shared_ptr< Equation > EquationSharedPtr
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.
Array< OneD, EquationSystemSharedPtr > m_equ
Equation system to solve.
LibUtilities::CommSharedPtr m_comm
Communication object.
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
boost::shared_ptr< StdExpansion > StdExpansionSharedPtr
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.
LibUtilities::SessionReaderSharedPtr m_session
Session reader object.
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.