Nektar++
Loading...
Searching...
No Matches
CFLStep.cpp
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: CFLStep.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:
32//
33///////////////////////////////////////////////////////////////////////////////
34
35#include <cstdio>
36#include <cstdlib>
37
39#include <SolverUtils/Driver.h>
41
43
44using namespace std;
45using namespace Nektar;
46using namespace Nektar::SolverUtils;
47
48int main(int argc, char *argv[])
49{
50 if (argc != 2)
51 {
52 fprintf(stderr, "Usage: ./CflStep file.xml \n");
53 fprintf(stderr, "\t Method will read initial conditions section of "
54 ".xml file for input \n");
55 exit(1);
56 }
57
60
61 string vDriverModule;
63 try
64 {
65 // Create session reader.
67
68 // Create MeshGraph.
69 graph = SpatialDomains::MeshGraphIO::Read(session);
70
71 // Create driver
72 session->LoadSolverInfo("Driver", vDriverModule, "Standard");
73 drv = GetDriverFactory().CreateInstance(vDriverModule, session, graph);
74
75 EquationSystemSharedPtr EqSys = drv->GetEqu()[0];
76 IncNavierStokesSharedPtr IncNav = EqSys->as<IncNavierStokes>();
77
78 IncNav->SetInitialConditions(0.0, false);
79 Array<OneD, NekDouble> cfl = IncNav->GetElmtCFLVals();
80
81 // Reset Pressure field with CFL values
83 IncNav->UpdateFields();
84 int i, n, nquad, cnt;
85 int nfields = fields.size();
86 int nexp = fields[0]->GetExpSize();
87
88 int elmtid = Vmath::Imax(nexp, cfl, 1);
89
90 cout << "Max CFL: " << cfl[elmtid] << " In element " << elmtid << endl;
91
92 for (n = 0; n < nfields; ++n)
93 {
94 if (session->GetVariable(n) == "p")
95 {
96 break;
97 }
98 }
99
100 ASSERTL0(n != nfields, "Could not find field named p in m_fields");
101
102 Array<OneD, NekDouble> phys = fields[n]->UpdatePhys();
103
104 cnt = 0;
105 for (i = 0; i < fields[n]->GetExpSize(); ++i)
106 {
107 nquad = fields[n]->GetExp(i)->GetTotPoints();
108 Vmath::Fill(nquad, cfl[i], &phys[cnt], 1);
109 cnt += nquad;
110 }
111
112 fields[n]->FwdTransLocalElmt(fields[n]->GetPhys(),
113 fields[n]->UpdateCoeffs());
114
115 // Need to reset varibale name for output
116 session->SetVariable(n, "CFL");
117
118 // Reset session name for output file
119 std::string outname = IncNav->GetSessionName();
120
121 outname += "_CFLStep";
122 IncNav->ResetSessionName(outname);
123 IncNav->Output();
124 }
125 catch (const std::runtime_error &)
126 {
127 return 1;
128 }
129 catch (const std::string &eStr)
130 {
131 cout << "Error: " << eStr << endl;
132 }
133
134 return 0;
135}
#define ASSERTL0(condition, msg)
This class is the base class for Navier Stokes problems.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
static SessionReaderSharedPtr CreateInstance(int argc, char *argv[])
Creates an instance of the SessionReader class.
SOLVER_UTILS_EXPORT void SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
Initialise the data in the dependent fields.
static MeshGraphSharedPtr Read(const LibUtilities::SessionReaderSharedPtr pSession, LibUtilities::DomainRangeShPtr rng=LibUtilities::NullDomainRangeShPtr, bool fillGraph=true, SpatialDomains::MeshGraphSharedPtr partitionedGraph=nullptr)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Driver > DriverSharedPtr
A shared pointer to a Driver object.
Definition Driver.h:52
DriverFactory & GetDriverFactory()
Definition Driver.cpp:64
std::shared_ptr< EquationSystem > EquationSystemSharedPtr
A shared pointer to an EquationSystem object.
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
Definition MeshGraph.h:217
std::shared_ptr< IncNavierStokes > IncNavierStokesSharedPtr
int Imax(int n, const T *x, const int incx)
Return the index of the maximum element in x.
Definition Vmath.hpp:623
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition Vmath.hpp:54
Definition main.py:1
STL namespace.