Nektar++
Public Member Functions | Private Member Functions | Private Attributes | List of all members
Diffusion Class Reference

Public Member Functions

 Diffusion (int argc, char *argv[])
 
 ~Diffusion ()
 
void TimeIntegrate ()
 
void DoImplicitSolve (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time, const NekDouble lambda)
 

Private Member Functions

void WriteSolution ()
 
void ExactSolution ()
 

Private Attributes

LibUtilities::SessionReaderSharedPtr session
 
LibUtilities::FieldIOSharedPtr fld
 
string sessionName
 
SpatialDomains::MeshGraphSharedPtr graph
 
MultiRegions::ContField2DSharedPtr field
 
LibUtilities::TimeIntegrationWrapperSharedPtr IntScheme
 
LibUtilities::TimeIntegrationSolutionSharedPtr u
 
LibUtilities::TimeIntegrationSchemeOperators ode
 
Array< OneD, Array< OneD, NekDouble > > fields
 
string scheme
 
unsigned int nSteps
 
NekDouble delta_t
 
NekDouble epsilon
 
NekDouble lambda
 

Detailed Description

Definition at line 48 of file DiffusionSolverTimeInt.cpp.

Constructor & Destructor Documentation

◆ Diffusion()

Diffusion::Diffusion ( int  argc,
char *  argv[] 
)

Definition at line 85 of file DiffusionSolverTimeInt.cpp.

86 {
87  // Create session reader.
88  session = LibUtilities::SessionReader::CreateInstance(argc, argv);
89 
90  // Read the geometry and the expansion information
91  graph = SpatialDomains::MeshGraph::Read(session);
92 
93  // Create Field I/O object.
94  fld = LibUtilities::FieldIO::CreateDefault(session);
95 
96  // Get some information from the session
97  sessionName = session->GetSessionName();
98  scheme = session->GetSolverInfo("TimeIntegrationMethod");
99  nSteps = session->GetParameter("NumSteps");
100  delta_t = session->GetParameter("TimeStep");
101  epsilon = session->GetParameter("epsilon");
102  lambda = 1.0/delta_t/epsilon;
103 
104  // Set up the field
106  AllocateSharedPtr(session, graph, session->GetVariable(0));
107 
109  fields[0] = field->UpdatePhys();
110 
111  // Get coordinates of physical points
112  unsigned int nq = field->GetNpoints();
113  Array<OneD,NekDouble> x0(nq), x1(nq), x2(nq);
114  field->GetCoords(x0,x1,x2);
115 
116  // Evaluate initial condition
118  = session->GetFunction("InitialConditions", "u");
119  icond->Evaluate(x0,x1,x2,0.0,field->UpdatePhys());
120 }
MultiRegions::ContField2DSharedPtr field
General purpose memory allocation routines with the ability to allocate from thread specific memory p...
LibUtilities::FieldIOSharedPtr fld
Array< OneD, Array< OneD, NekDouble > > fields
LibUtilities::SessionReaderSharedPtr session
std::shared_ptr< Equation > EquationSharedPtr
Definition: Equation.h:131
SpatialDomains::MeshGraphSharedPtr graph
unsigned int nSteps

◆ ~Diffusion()

Diffusion::~Diffusion ( )

Definition at line 122 of file DiffusionSolverTimeInt.cpp.

123 {
124  session->Finalise();
125 }
LibUtilities::SessionReaderSharedPtr session

Member Function Documentation

◆ DoImplicitSolve()

void Diffusion::DoImplicitSolve ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  outarray,
const NekDouble  time,
const NekDouble  lambda 
)

Definition at line 152 of file DiffusionSolverTimeInt.cpp.

References Nektar::StdRegions::eFactorLambda, Nektar::NullFlagList, and Vmath::Smul().

Referenced by TimeIntegrate().

157 {
158  boost::ignore_unused(time);
159 
162 
163  for (int i = 0; i < inarray.num_elements(); ++i)
164  {
165  // Multiply RHS by 1.0/timestep/lambda
166  Vmath::Smul(field->GetNpoints(), -factors[StdRegions::eFactorLambda],
167  inarray [i], 1,
168  outarray[i], 1);
169 
170  // Solve a system of equations with Helmholtz solver
171  field->HelmSolve(outarray[i],
172  field->UpdateCoeffs(),
173  NullFlagList, factors);
174 
175  // Transform to physical space and store in solution vector
176  field->BwdTrans (field->GetCoeffs(), outarray[i]);
177  }
178 }
MultiRegions::ContField2DSharedPtr field
std::map< ConstFactorType, NekDouble > ConstFactorMap
Definition: StdRegions.hpp:294
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:216
static FlagList NullFlagList
An empty flag list.

◆ ExactSolution()

void Diffusion::ExactSolution ( )
private

Definition at line 196 of file DiffusionSolverTimeInt.cpp.

197 {
198  unsigned int nq = field->GetNpoints();
199  Array<OneD,NekDouble> x0(nq), x1(nq), x2(nq);
200  field->GetCoords(x0,x1,x2);
201 
203  session->GetFunction("ExactSolution",0);
204 
205  if(ex_sol)
206  {
207  // evaluate exact solution
208  Array<OneD, NekDouble> exact(nq);
209  ex_sol->Evaluate(x0, x1, x2, (nSteps)*delta_t, exact);
210 
211  // Calculate errors
212  cout << "L inf error: "
213  << field->Linf(field->GetPhys(), exact) << endl;
214  cout << "L 2 error: "
215  << field->L2(field->GetPhys(), exact) << endl;
216  cout << "H 1 error: "
217  << field->H1(field->GetPhys(), exact) << endl;
218  }
219 
220 }
MultiRegions::ContField2DSharedPtr field
LibUtilities::SessionReaderSharedPtr session
std::shared_ptr< Equation > EquationSharedPtr
Definition: Equation.h:131
unsigned int nSteps

◆ TimeIntegrate()

void Diffusion::TimeIntegrate ( )

Definition at line 127 of file DiffusionSolverTimeInt.cpp.

References DoImplicitSolve(), Nektar::LibUtilities::GetTimeIntegrationWrapperFactory(), Vmath::Vcopy(), and Vmath::Zero().

Referenced by main().

128 {
130  CreateInstance(scheme);
131 
133 
134  // Initialise the scheme for actual time integration scheme
135  u = IntScheme->InitializeScheme(delta_t, fields, 0.0, ode);
136 
137  // Zero field coefficients for initial guess for linear solver.
138  Vmath::Zero(field->GetNcoeffs(), field->UpdateCoeffs(), 1);
139 
140  for (int n = 0; n < nSteps; ++n)
141  {
142  fields = IntScheme->TimeIntegrate(n, delta_t, u, ode);
143  }
144  Vmath::Vcopy(field->GetNpoints(), fields[0], 1, field->UpdatePhys(), 1);
145 
146  WriteSolution();
147  ExactSolution();
148 
149 }
LibUtilities::TimeIntegrationWrapperSharedPtr IntScheme
MultiRegions::ContField2DSharedPtr field
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
LibUtilities::TimeIntegrationSolutionSharedPtr u
Array< OneD, Array< OneD, NekDouble > > fields
TimeIntegrationWrapperFactory & GetTimeIntegrationWrapperFactory()
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time, const NekDouble lambda)
LibUtilities::TimeIntegrationSchemeOperators ode
unsigned int nSteps
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:376
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1064

◆ WriteSolution()

void Diffusion::WriteSolution ( )
private

Definition at line 180 of file DiffusionSolverTimeInt.cpp.

181 {
182  // Write solution to file
183  std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef
184  = field->GetFieldDefinitions();
185  std::vector<std::vector<NekDouble> > FieldData(FieldDef.size());
186  for(int i = 0; i < FieldDef.size(); ++i)
187  {
188  FieldDef[i]->m_fields.push_back("u");
189  field->AppendFieldData(FieldDef[i], FieldData[i]);
190  }
191  fld->Write(session->GetSessionName() + ".fld", FieldDef, FieldData);
192 
193 }
MultiRegions::ContField2DSharedPtr field
LibUtilities::FieldIOSharedPtr fld
LibUtilities::SessionReaderSharedPtr session

Member Data Documentation

◆ delta_t

NekDouble Diffusion::delta_t
private

Definition at line 76 of file DiffusionSolverTimeInt.cpp.

◆ epsilon

NekDouble Diffusion::epsilon
private

Definition at line 77 of file DiffusionSolverTimeInt.cpp.

◆ field

MultiRegions::ContField2DSharedPtr Diffusion::field
private

Definition at line 67 of file DiffusionSolverTimeInt.cpp.

◆ fields

Array<OneD, Array<OneD, NekDouble> > Diffusion::fields
private

Definition at line 72 of file DiffusionSolverTimeInt.cpp.

◆ fld

LibUtilities::FieldIOSharedPtr Diffusion::fld
private

Definition at line 64 of file DiffusionSolverTimeInt.cpp.

◆ graph

SpatialDomains::MeshGraphSharedPtr Diffusion::graph
private

Definition at line 66 of file DiffusionSolverTimeInt.cpp.

◆ IntScheme

LibUtilities::TimeIntegrationWrapperSharedPtr Diffusion::IntScheme
private

Definition at line 69 of file DiffusionSolverTimeInt.cpp.

◆ lambda

NekDouble Diffusion::lambda
private

Definition at line 78 of file DiffusionSolverTimeInt.cpp.

◆ nSteps

unsigned int Diffusion::nSteps
private

Definition at line 75 of file DiffusionSolverTimeInt.cpp.

◆ ode

Definition at line 71 of file DiffusionSolverTimeInt.cpp.

◆ scheme

string Diffusion::scheme
private

Definition at line 74 of file DiffusionSolverTimeInt.cpp.

◆ session

LibUtilities::SessionReaderSharedPtr Diffusion::session
private

Definition at line 63 of file DiffusionSolverTimeInt.cpp.

◆ sessionName

string Diffusion::sessionName
private

Definition at line 65 of file DiffusionSolverTimeInt.cpp.

◆ u

Definition at line 70 of file DiffusionSolverTimeInt.cpp.