Nektar++
NonlinearPeregrine.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: NonlinearPeregrine.cpp
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// Permission is hereby granted, free of charge, to any person obtaining a
14// copy of this software and associated documentation files (the "Software"),
15// to deal in the Software without restriction, including without limitation
16// the rights to use, copy, modify, merge, publish, distribute, sublicense,
17// and/or sell copies of the Software, and to permit persons to whom the
18// Software is furnished to do so, subject to the following conditions:
19//
20// The above copyright notice and this permission notice shall be included
21// in all copies or substantial portions of the Software.
22//
23// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
29// DEALINGS IN THE SOFTWARE.
30//
31// Description: Nonlinear Boussinesq equations of Peregrine in
32// conservative variables (constant depth case)
33//
34///////////////////////////////////////////////////////////////////////////////
35
36#include <iomanip>
37#include <iostream>
38
41
42namespace Nektar
43{
44
47 "NonlinearPeregrine", NonlinearPeregrine::create,
48 "Nonlinear Peregrine equations in conservative variables.");
49
53 : NonlinearSWE(pSession, pGraph), m_factors()
54{
57 // note: eFactorTau = 1.0 becomes unstable...
58 // we need to investigate the behaviuor w.r.t. tau
59}
60
61void NonlinearPeregrine::v_InitObject(bool DeclareFields)
62{
63 NonlinearSWE::v_InitObject(DeclareFields);
64
65 if (m_session->DefinesSolverInfo("PROBLEMTYPE"))
66 {
67 std::string ProblemTypeStr = m_session->GetSolverInfo("PROBLEMTYPE");
68 for (int i = 0; i < (int)SIZE_ProblemType; ++i)
69 {
70 if (boost::iequals(ProblemTypeMap[i], ProblemTypeStr))
71 {
73 break;
74 }
75 }
76 }
77 else
78 {
80 }
81
82 // NB! At the moment only the constant depth case is
83 // supported for the Peregrine eq.
84 if (m_session->DefinesParameter("ConstDepth"))
85 {
86 m_const_depth = m_session->GetParameter("ConstDepth");
87 }
88 else
89 {
90 ASSERTL0(false, "Constant Depth not specified");
91 }
92
94 "Continuous projection type not supported for Peregrine.");
95
99}
100
101/**
102 * @brief Set the initial conditions.
103 */
105 NekDouble initialtime, bool dumpInitialConditions,
106 [[maybe_unused]] const int domain)
107{
108 switch (m_problemType)
109 {
110 case eSolitaryWave:
111 {
112 LaitoneSolitaryWave(0.1, m_const_depth, 0.0, 0.0);
113 break;
114 }
115 default:
116 {
117 EquationSystem::v_SetInitialConditions(initialtime, false);
118 m_nchk--; // Note: m_nchk has been incremented in EquationSystem.
119 break;
120 }
121 }
122
123 if (dumpInitialConditions && m_checksteps && m_nchk == 0 &&
124 !m_comm->IsParallelInTime())
125 {
127 }
128 else if (dumpInitialConditions && m_nchk == 0 && m_comm->IsParallelInTime())
129 {
130 std::string newdir = m_sessionName + ".pit";
131 if (!fs::is_directory(newdir))
132 {
133 fs::create_directory(newdir);
134 }
135 if (m_comm->GetTimeComm()->GetRank() == 0)
136 {
137 WriteFld(newdir + "/" + m_sessionName + "_0.fld");
138 }
139 }
140 m_nchk++;
141}
142
144 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
145 Array<OneD, Array<OneD, NekDouble>> &outarray, const NekDouble time)
146{
147 int nvariables = inarray.size() - 1;
148 int ncoeffs = GetNcoeffs();
149 int nq = GetTotPoints();
150
151 switch (m_projectionType)
152 {
154 {
155 //-------------------------------------------------------
156 // Compute the DG advection including the numerical flux
157 // by using SolverUtils/Advection
158 // Input and output in physical space
160 inarray, outarray, time);
161 //-------------------------------------------------------
162
163 //-------------------------------------------------------
164 // negate the outarray since moving terms to the rhs
165 for (int i = 0; i < nvariables; ++i)
166 {
167 Vmath::Neg(nq, outarray[i], 1);
168 }
169 //-------------------------------------------------------
170
171 //-------------------------------------------------
172 // Add "source terms"
173 // Input and output in physical space
174
175 // Coriolis forcing
176 if (m_coriolis.size() != 0)
177 {
178 AddCoriolis(inarray, outarray);
179 }
180
181 // Variable Depth
182 if (m_constantDepth != true)
183 {
184 ASSERTL0(false,
185 "Variable depth not supported for the Peregrine "
186 "equations");
187 }
188
189 //-------------------------------------------------
190
191 //---------------------------------------
192 // As no more terms is required for the
193 // continuity equation and we have aleady evaluated
194 // the values for h_t we are done for h
195 //---------------------------------------
196
197 //---------------------------------------------
198
199 //-------------------------------------------------
200 // create tmp fields to be used during
201 // the dispersive section
202
203 int nTraceNumPoints = GetTraceTotPoints();
204 Array<OneD, NekDouble> upwindX(nTraceNumPoints);
205 Array<OneD, NekDouble> upwindY(nTraceNumPoints);
206
209 for (int i = 0; i < 2; ++i)
210 {
211 coeffsfield[i] = Array<OneD, NekDouble>(ncoeffs);
212 physfield[i] = Array<OneD, NekDouble>(nq);
213 }
214
215 Vmath::Vcopy(nq, outarray[1], 1, physfield[0], 1);
216 Vmath::Vcopy(nq, outarray[2], 1, physfield[1], 1);
217
218 //---------------------------------------
219 // Start for solve of mixed dispersive terms using the 'WCE method'
220 // (Eskilsson & Sherwin, JCP 2006)
221
222 // constant depth case
223 // \nabla \cdot (\nabla z) - invgamma z
224 // = - invgamma (\nabla \cdot {\bf f}_(2,3)
225
226 NekDouble gamma = (m_const_depth * m_const_depth) / 3.0;
227 NekDouble invgamma = 1.0 / gamma;
228 //--------------------------------------------
229
230 //--------------------------------------------
231 // Compute the forcing function for the wave continuity equation (eq
232 // 26a)
233
234 // Set boundary condidtions for z
235 SetBoundaryConditionsForcing(physfield, time);
236
237 // \nabla \phi \cdot f_{2,3}
238 m_fields[0]->IProductWRTDerivBase(0, physfield[0], coeffsfield[0]);
239 m_fields[0]->IProductWRTDerivBase(1, physfield[1], coeffsfield[1]);
240 Vmath::Vadd(ncoeffs, coeffsfield[0], 1, coeffsfield[1], 1,
241 coeffsfield[0], 1);
242 Vmath::Neg(ncoeffs, coeffsfield[0], 1);
243
244 // Evaluate upwind numerical flux (physical space)
245 NumericalFluxForcing(physfield, upwindX, upwindY);
246 Array<OneD, NekDouble> normflux(nTraceNumPoints);
247 Vmath::Vvtvvtp(nTraceNumPoints, upwindX, 1, m_traceNormals[0], 1,
248 upwindY, 1, m_traceNormals[1], 1, normflux, 1);
249 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[0]);
250 m_fields[0]->MultiplyByElmtInvMass(coeffsfield[0], coeffsfield[0]);
251 m_fields[0]->BwdTrans(coeffsfield[0], physfield[0]);
252
253 Vmath::Smul(nq, -invgamma, physfield[0], 1, physfield[0], 1);
254
255 //--------------------------------------
256
257 //--------------------------------------
258 // Solve the Helmhotz-type equation for the wave continuity equation
259 // (eq. 26b)
260
261 WCESolve(physfield[0], invgamma);
262
263 Vmath::Vcopy(nq, physfield[0], 1, outarray[3], 1); // store z
264
265 //------------------------------------
266
267 //------------------------------------
268 // Return to the primary variables (eq. 26c)
269
270 // Compute gamma \nabla z
271 Vmath::Smul(nq, gamma, physfield[0], 1, physfield[0], 1);
272
273 m_fields[0]->IProductWRTDerivBase(0, physfield[0], coeffsfield[0]);
274 m_fields[0]->IProductWRTDerivBase(1, physfield[0], coeffsfield[1]);
275
276 Vmath::Neg(ncoeffs, coeffsfield[0], 1);
277 Vmath::Neg(ncoeffs, coeffsfield[1], 1);
278
279 // Set boundary conditions
280 SetBoundaryConditionsContVariables(physfield[0], time);
281
282 // Evaluate upwind numerical flux (physical space)
283 NumericalFluxConsVariables(physfield[0], upwindX, upwindY);
284
285 Vmath::Vmul(nTraceNumPoints, upwindX, 1, m_traceNormals[0], 1,
286 normflux, 1);
287 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[0]);
288 Vmath::Vmul(nTraceNumPoints, upwindY, 1, m_traceNormals[1], 1,
289 normflux, 1);
290 m_fields[0]->AddTraceIntegral(normflux, coeffsfield[1]);
291
292 // Solve the remaining block-diagonal systems
294 for (int i = 0; i < 2; ++i)
295 {
296 modarray[i] = Array<OneD, NekDouble>(ncoeffs);
297 }
298 m_fields[0]->IProductWRTBase(outarray[1], modarray[0]);
299 m_fields[0]->IProductWRTBase(outarray[2], modarray[1]);
300
301 Vmath::Vadd(ncoeffs, modarray[0], 1, coeffsfield[0], 1, modarray[0],
302 1);
303 Vmath::Vadd(ncoeffs, modarray[1], 1, coeffsfield[1], 1, modarray[1],
304 1);
305
306 m_fields[0]->MultiplyByElmtInvMass(modarray[0], modarray[0]);
307 m_fields[0]->MultiplyByElmtInvMass(modarray[1], modarray[1]);
308
309 m_fields[0]->BwdTrans(modarray[0], outarray[1]);
310 m_fields[0]->BwdTrans(modarray[1], outarray[2]);
311
312 //------------------------------------
313
314 break;
315 }
317 ASSERTL0(false, "Unknown projection scheme for the Peregrine");
318 break;
319 default:
320 ASSERTL0(false, "Unknown projection scheme for the NonlinearSWE");
321 break;
322 }
323}
324
326{
328}
329
330// initial condition Laitone's first order solitary wave
332 NekDouble time, NekDouble x_offset)
333{
334 int nq = GetTotPoints();
335
336 NekDouble A = 1.0;
337 NekDouble C = sqrt(m_g * d) * (1.0 + 0.5 * (amp / d));
338
341 Array<OneD, NekDouble> zeros(nq, 0.0);
342
343 // get the coordinates (assuming all fields have the same
344 // discretisation)
345 m_fields[0]->GetCoords(x0, x1);
346
347 for (int i = 0; i < nq; i++)
348 {
349 (m_fields[0]->UpdatePhys())[i] =
350 amp * pow((1.0 / cosh(sqrt(0.75 * (amp / (d * d * d))) *
351 (A * (x0[i] + x_offset) - C * time))),
352 2.0);
353 (m_fields[1]->UpdatePhys())[i] =
354 (amp / d) *
355 pow((1.0 / cosh(sqrt(0.75 * (amp / (d * d * d))) *
356 (A * (x0[i] + x_offset) - C * time))),
357 2.0) *
358 sqrt(m_g * d);
359 }
360
361 Vmath::Sadd(nq, d, m_fields[0]->GetPhys(), 1, m_fields[0]->UpdatePhys(), 1);
362 Vmath::Vmul(nq, m_fields[0]->GetPhys(), 1, m_fields[1]->GetPhys(), 1,
363 m_fields[1]->UpdatePhys(), 1);
364 Vmath::Vcopy(nq, zeros, 1, m_fields[2]->UpdatePhys(), 1);
365 Vmath::Vcopy(nq, zeros, 1, m_fields[3]->UpdatePhys(), 1);
366
367 // Forward transform to fill the coefficient space
368 for (int i = 0; i < 4; ++i)
369 {
370 m_fields[i]->SetPhysState(true);
371 m_fields[i]->FwdTrans(m_fields[i]->GetPhys(),
372 m_fields[i]->UpdateCoeffs());
373 }
374}
375
377{
378 // As of now we need not to specify any BC routine for the WCE: periodic
379 // and zero Neumann (for walls)
380
381 // Note: this is just valid for the constant depth case:
382
384
385 m_fields[3]->HelmSolve(fce, m_fields[3]->UpdateCoeffs(), m_factors);
386
387 m_fields[3]->BwdTrans(m_fields[3]->GetCoeffs(), m_fields[3]->UpdatePhys());
388
389 Vmath::Vcopy(fce.size(), m_fields[3]->GetPhys(), 1, fce, 1);
390}
391
394 [[maybe_unused]] NekDouble time)
395{
396 int cnt = 0;
397
398 // Loop over Boundary Regions
399 for (int n = 0; n < m_fields[0]->GetBndConditions().size(); ++n)
400 {
401 // Wall Boundary Condition
402 if (boost::iequals(m_fields[0]->GetBndConditions()[n]->GetUserDefined(),
403 "Wall"))
404 {
405 WallBoundaryForcing(n, cnt, inarray);
406 }
407
408 // Timedependent Boundary Condition
409 if (m_fields[0]->GetBndConditions()[n]->IsTimeDependent())
410 {
411 ASSERTL0(false, "time-dependent BC not implemented for Boussinesq");
412 }
413 cnt += m_fields[0]->GetBndCondExpansions()[n]->GetExpSize();
414 }
415}
416
418 int bcRegion, int cnt, Array<OneD, Array<OneD, NekDouble>> &inarray)
419{
420 int nTraceNumPoints = GetTraceTotPoints();
421
422 // Get physical values of f1 and f2 for the forward trace
424 for (int i = 0; i < 2; ++i)
425 {
426 Fwd[i] = Array<OneD, NekDouble>(nTraceNumPoints);
427 m_fields[i]->ExtractTracePhys(inarray[i], Fwd[i]);
428 }
429
430 // Adjust the physical values of the trace to take
431 // user defined boundaries into account
432 int id1, id2, npts;
434 m_fields[0]->GetBndCondExpansions()[bcRegion];
435
436 for (int e = 0; e < bcexp->GetExpSize(); ++e)
437 {
438 npts = bcexp->GetExp(e)->GetTotPoints();
439 id1 = bcexp->GetPhys_Offset(e);
440 id2 = m_fields[0]->GetTrace()->GetPhys_Offset(
441 m_fields[0]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
442
443 switch (m_expdim)
444 {
445 case 1:
446 {
447 ASSERTL0(false, "1D not yet implemented for Boussinesq");
448 break;
449 }
450 case 2:
451 {
452 Array<OneD, NekDouble> tmp_n(npts);
453 Array<OneD, NekDouble> tmp_t(npts);
454
455 Vmath::Vmul(npts, &Fwd[0][id2], 1, &m_traceNormals[0][id2], 1,
456 &tmp_n[0], 1);
457 Vmath::Vvtvp(npts, &Fwd[1][id2], 1, &m_traceNormals[1][id2], 1,
458 &tmp_n[0], 1, &tmp_n[0], 1);
459
460 Vmath::Vmul(npts, &Fwd[0][id2], 1, &m_traceNormals[1][id2], 1,
461 &tmp_t[0], 1);
462 Vmath::Vvtvm(npts, &Fwd[1][id2], 1, &m_traceNormals[0][id2], 1,
463 &tmp_t[0], 1, &tmp_t[0], 1);
464
465 // Negate the normal flux
466 Vmath::Neg(npts, tmp_n, 1);
467
468 // Rotate back to Cartesian
469 Vmath::Vmul(npts, &tmp_t[0], 1, &m_traceNormals[1][id2], 1,
470 &Fwd[0][id2], 1);
471 Vmath::Vvtvm(npts, &tmp_n[0], 1, &m_traceNormals[0][id2], 1,
472 &Fwd[0][id2], 1, &Fwd[0][id2], 1);
473
474 Vmath::Vmul(npts, &tmp_t[0], 1, &m_traceNormals[0][id2], 1,
475 &Fwd[1][id2], 1);
476 Vmath::Vvtvp(npts, &tmp_n[0], 1, &m_traceNormals[1][id2], 1,
477 &Fwd[1][id2], 1, &Fwd[1][id2], 1);
478 break;
479 }
480 case 3:
481 ASSERTL0(false, "3D not implemented for Boussinesq equations");
482 break;
483 default:
484 ASSERTL0(false, "Illegal expansion dimension");
485 }
486
487 // Copy boundary adjusted values into the boundary expansion
488 bcexp = m_fields[1]->GetBndCondExpansions()[bcRegion];
489 Vmath::Vcopy(npts, &Fwd[0][id2], 1, &(bcexp->UpdatePhys())[id1], 1);
490
491 bcexp = m_fields[2]->GetBndCondExpansions()[bcRegion];
492 Vmath::Vcopy(npts, &Fwd[1][id2], 1, &(bcexp->UpdatePhys())[id1], 1);
493 }
494}
495
497 const Array<OneD, const Array<OneD, NekDouble>> &inarray,
499{
500 int nTraceNumPoints = GetTraceTotPoints();
501
502 //-----------------------------------------------------
503 // get temporary arrays
506
507 for (int i = 0; i < 2; ++i)
508 {
509 Fwd[i] = Array<OneD, NekDouble>(nTraceNumPoints);
510 Bwd[i] = Array<OneD, NekDouble>(nTraceNumPoints);
511 }
512 //-----------------------------------------------------
513
514 //-----------------------------------------------------
515 // get the physical values at the trace
516 // (any time-dependent BC previously put in fields[1] and [2]
517
518 m_fields[1]->GetFwdBwdTracePhys(inarray[0], Fwd[0], Bwd[0]);
519 m_fields[2]->GetFwdBwdTracePhys(inarray[1], Fwd[1], Bwd[1]);
520 //-----------------------------------------------------
521
522 //-----------------------------------------------------
523 // use centred fluxes for the numerical flux
524 for (int i = 0; i < nTraceNumPoints; ++i)
525 {
526 numfluxX[i] = 0.5 * (Fwd[0][i] + Bwd[0][i]);
527 numfluxY[i] = 0.5 * (Fwd[1][i] + Bwd[1][i]);
528 }
529 //-----------------------------------------------------
530}
531
533 const Array<OneD, const NekDouble> &inarray,
534 [[maybe_unused]] NekDouble time)
535{
536 int cnt = 0;
537
538 // Loop over Boundary Regions
539 for (int n = 0; n < m_fields[3]->GetBndConditions().size(); ++n)
540 {
541 // Wall Boundary Condition
542 if (boost::iequals(m_fields[3]->GetBndConditions()[n]->GetUserDefined(),
543 "Wall") ||
544 m_fields[3]->GetBndConditions()[n]->IsTimeDependent())
545 {
546 WallBoundaryContVariables(n, cnt, inarray);
547 }
548
549 cnt += m_fields[3]->GetBndCondExpansions()[n]->GetExpSize();
550 }
551}
552
554 int bcRegion, int cnt, const Array<OneD, const NekDouble> &inarray)
555{
556 int nTraceNumPoints = GetTraceTotPoints();
557
558 // Get physical values of z for the forward trace
559 Array<OneD, NekDouble> z(nTraceNumPoints);
560 m_fields[3]->ExtractTracePhys(inarray, z);
561
562 // Adjust the physical values of the trace to take
563 // user defined boundaries into account
564 int id1, id2, npts;
566 m_fields[3]->GetBndCondExpansions()[bcRegion];
567
568 for (int e = 0; e < bcexp->GetExpSize(); ++e)
569 {
570 npts = bcexp->GetExp(e)->GetTotPoints();
571 id1 = bcexp->GetPhys_Offset(e);
572 id2 = m_fields[3]->GetTrace()->GetPhys_Offset(
573 m_fields[3]->GetTraceMap()->GetBndCondIDToGlobalTraceID(cnt + e));
574
575 // Copy boundary adjusted values into the boundary expansion
576 // field[3]
577 bcexp = m_fields[3]->GetBndCondExpansions()[bcRegion];
578 Vmath::Vcopy(npts, &z[id2], 1, &(bcexp->UpdatePhys())[id1], 1);
579 }
580}
581
585{
586 int nTraceNumPoints = GetTraceTotPoints();
587
588 //-----------------------------------------------------
589 // get temporary arrays
590 Array<OneD, NekDouble> Fwd(nTraceNumPoints);
591 Array<OneD, NekDouble> Bwd(nTraceNumPoints);
592 //-----------------------------------------------------
593
594 //-----------------------------------------------------
595 // get the physical values at the trace
596 // (we have put any time-dependent BC in field[3])
597
598 m_fields[3]->GetFwdBwdTracePhys(physfield, Fwd, Bwd);
599 //-----------------------------------------------------
600
601 //-----------------------------------------------------
602 // use centred fluxes for the numerical flux
603 for (int i = 0; i < nTraceNumPoints; ++i)
604 {
605 outX[i] = 0.5 * (Fwd[i] + Bwd[i]);
606 outY[i] = 0.5 * (Fwd[i] + Bwd[i]);
607 }
608 //-----------------------------------------------------
609}
610
611} // namespace Nektar
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0) override
Set the initial conditions.
static SolverUtils::EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
void SetBoundaryConditionsContVariables(const Array< OneD, const NekDouble > &inarray, NekDouble time)
void SetBoundaryConditionsForcing(Array< OneD, Array< OneD, NekDouble > > &inarray, NekDouble time)
void WallBoundaryForcing(int bcRegion, int cnt, Array< OneD, Array< OneD, NekDouble > > &inarray)
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
void LaitoneSolitaryWave(NekDouble amp, NekDouble d, NekDouble time, NekDouble x_offset)
static std::string className
Name of class.
void NumericalFluxForcing(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &numfluxX, Array< OneD, NekDouble > &numfluxY)
StdRegions::ConstFactorMap m_factors
void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
NonlinearPeregrine(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
void WallBoundaryContVariables(int bcRegion, int cnt, const Array< OneD, const NekDouble > &inarray)
void WCESolve(Array< OneD, NekDouble > &fce, NekDouble lambda)
void v_DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time) override
void NumericalFluxConsVariables(const Array< OneD, const NekDouble > &physfield, Array< OneD, NekDouble > &outX, Array< OneD, NekDouble > &outY)
void v_GenerateSummary(SolverUtils::SummaryList &s) override
Print a summary of time stepping parameters.
void v_InitObject(bool DeclareFields=true) override
Init object for UnsteadySystem class.
NekDouble m_g
Acceleration of gravity.
void AddCoriolis(const Array< OneD, const Array< OneD, NekDouble > > &physarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
SolverUtils::AdvectionSharedPtr m_advection
bool m_constantDepth
Indicates if constant depth case.
Array< OneD, NekDouble > m_coriolis
Coriolis force.
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble > > &inpnts, Array< OneD, Array< OneD, NekDouble > > &outpnt, const NekDouble time, const NekDouble lambda)
int m_expdim
Expansion dimension.
virtual SOLVER_UTILS_EXPORT void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
LibUtilities::CommSharedPtr m_comm
Communicator.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT void Checkpoint_Output(const int n)
Write checkpoint file of m_fields.
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 GetNcoeffs()
int m_nchk
Number of checkpoints written so far.
enum MultiRegions::ProjectionType m_projectionType
Type of projection; e.g continuous or discontinuous.
int m_checksteps
Number of steps between checkpoints.
SOLVER_UTILS_EXPORT int GetTotPoints()
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
std::vector< std::pair< std::string, std::string > > SummaryList
Definition: Misc.h:46
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition: MeshGraph.h:174
std::vector< double > z(NPUPPER)
std::vector< double > d(NPUPPER *NPUPPER)
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
const char *const ProblemTypeMap[]
@ SIZE_ProblemType
Length of enum list.
@ eSolitaryWave
First order Laitone solitary wave.
double NekDouble
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.
Definition: Vmath.hpp:72
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.hpp:292
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
Definition: Vmath.hpp:366
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.
Definition: Vmath.hpp:180
void Vvtvm(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)
vvtvm (vector times vector minus vector): z = w*x - y
Definition: Vmath.hpp:381
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.hpp:100
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
Definition: Vmath.hpp:194
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
Definition: Vmath.hpp:439
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294