Nektar++
ProcessVorticity.cpp
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // File: ProcessVorticity.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: Computes vorticity field.
32 //
33 ////////////////////////////////////////////////////////////////////////////////
34 
35 #include <iostream>
36 #include <string>
37 using namespace std;
38 
39 #include <boost/core/ignore_unused.hpp>
40 
41 #include <GlobalMapping/Mapping.h>
43 
44 #include "ProcessMapping.h"
45 #include "ProcessVorticity.h"
46 
47 namespace Nektar
48 {
49 namespace FieldUtils
50 {
51 
52 ModuleKey ProcessVorticity::className =
54  ModuleKey(eProcessModule, "vorticity"),
55  ProcessVorticity::create,
56  "Computes vorticity field.");
57 
58 ProcessVorticity::ProcessVorticity(FieldSharedPtr f) : ProcessModule(f)
59 {
60 }
61 
63 {
64 }
65 
66 void ProcessVorticity::Process(po::variables_map &vm)
67 {
68  m_f->SetUpExp(vm);
69 
70  int i, s;
71  int expdim = m_f->m_graph->GetMeshDimension();
72  m_spacedim = expdim;
73  if ((m_f->m_numHomogeneousDir) == 1 || (m_f->m_numHomogeneousDir) == 2)
74  {
75  m_spacedim = 3;
76  }
77  int nfields = m_f->m_variables.size();
78  ASSERTL0(m_spacedim != 1,
79  "Error: Vorticity for a 1D problem cannot be computed");
80  int addfields = (m_spacedim == 2) ? 1 : 3;
81 
82  // Append field names
83  if (addfields == 1)
84  {
85  m_f->m_variables.push_back("W_z");
86  }
87  else
88  {
89  m_f->m_variables.push_back("W_x");
90  m_f->m_variables.push_back("W_y");
91  m_f->m_variables.push_back("W_z");
92  }
93 
94  // Skip in case of empty partition
95  if (m_f->m_exp[0]->GetNumElmts() == 0)
96  {
97  return;
98  }
99  int npoints = m_f->m_exp[0]->GetNpoints();
101  Array<OneD, Array<OneD, NekDouble> > outfield(addfields);
102 
103  int nstrips;
104 
105  m_f->m_session->LoadParameter("Strip_Z", nstrips, 1);
106 
107  for (i = 0; i < m_spacedim * m_spacedim; ++i)
108  {
109  grad[i] = Array<OneD, NekDouble>(npoints);
110  }
111 
112  for (i = 0; i < addfields; ++i)
113  {
114  outfield[i] = Array<OneD, NekDouble>(npoints);
115  }
116 
118  for (int i = 0; i < m_spacedim; i++)
119  {
120  tmp[i] = Array<OneD, NekDouble>(npoints);
121  }
122 
123  vector<MultiRegions::ExpListSharedPtr> Exp(nstrips * addfields);
124 
125  // Get mapping
127 
128  for (s = 0; s < nstrips; ++s) // homogeneous strip varient
129  {
130  // Get velocity and convert to Cartesian system,
131  // if it is still in transformed system
133  GetVelocity(vel, s);
134  if (m_f->m_fieldMetaDataMap.count("MappingCartesianVel"))
135  {
136  if (m_f->m_fieldMetaDataMap["MappingCartesianVel"] == "False")
137  {
138  // Initialize arrays and copy velocity
139  if (m_f->m_exp[0]->GetWaveSpace())
140  {
141  for (int i = 0; i < m_spacedim; ++i)
142  {
143  m_f->m_exp[0]->HomogeneousBwdTrans(vel[i], vel[i]);
144  }
145  }
146  // Convert velocity to cartesian system
147  mapping->ContravarToCartesian(vel, vel);
148  // Convert back to wavespace if necessary
149  if (m_f->m_exp[0]->GetWaveSpace())
150  {
151  for (int i = 0; i < m_spacedim; ++i)
152  {
153  m_f->m_exp[0]->HomogeneousFwdTrans(vel[i], vel[i]);
154  }
155  }
156  }
157  }
158 
159  // Calculate Gradient & Vorticity
160  if (m_spacedim == 2)
161  {
162  for (i = 0; i < m_spacedim; ++i)
163  {
164  m_f->m_exp[s * nfields + i]->PhysDeriv(vel[i], tmp[0], tmp[1]);
165  mapping->CovarToCartesian(tmp, tmp);
166  for (int j = 0; j < m_spacedim; j++)
167  {
168  Vmath::Vcopy(npoints, tmp[j], 1, grad[i * m_spacedim + j], 1);
169  }
170  }
171  // W_z = Vx - Uy
172  Vmath::Vsub(npoints, grad[1 * m_spacedim + 0], 1,
173  grad[0 * m_spacedim + 1], 1, outfield[0], 1);
174  }
175  else
176  {
177  for (i = 0; i < m_spacedim; ++i)
178  {
179  m_f->m_exp[s * nfields + i]->PhysDeriv(vel[i], tmp[0], tmp[1],
180  tmp[2]);
181  mapping->CovarToCartesian(tmp, tmp);
182  for (int j = 0; j < m_spacedim; j++)
183  {
184  Vmath::Vcopy(npoints, tmp[j], 1, grad[i * m_spacedim + j], 1);
185  }
186  }
187 
188  // W_x = Wy - Vz
189  Vmath::Vsub(npoints, grad[2 * m_spacedim + 1], 1,
190  grad[1 * m_spacedim + 2], 1, outfield[0], 1);
191  // W_y = Uz - Wx
192  Vmath::Vsub(npoints, grad[0 * m_spacedim + 2], 1,
193  grad[2 * m_spacedim + 0], 1, outfield[1], 1);
194  // W_z = Vx - Uy
195  Vmath::Vsub(npoints, grad[1 * m_spacedim + 0], 1,
196  grad[0 * m_spacedim + 1], 1, outfield[2], 1);
197  }
198 
199  for (i = 0; i < addfields; ++i)
200  {
201  int n = s * addfields + i;
202  Exp[n] =
203  m_f->AppendExpList(m_f->m_numHomogeneousDir);
204  Vmath::Vcopy(npoints, outfield[i], 1, Exp[n]->UpdatePhys(), 1);
205  Exp[n]->FwdTrans_IterPerExp(outfield[i], Exp[n]->UpdateCoeffs());
206  }
207  }
208 
209  for (s = 0; s < nstrips; ++s)
210  {
211  for (i = 0; i < addfields; ++i)
212  {
213  m_f->m_exp.insert(
214  m_f->m_exp.begin() + s * (nfields + addfields) + nfields + i,
215  Exp[s * addfields + i]);
216  }
217  }
218 }
219 
221  int strip)
222 {
223  int nfields = m_f->m_variables.size();
224  int npoints = m_f->m_exp[0]->GetNpoints();
225  if(boost::iequals(m_f->m_variables[0], "u"))
226  {
227  // IncNavierStokesSolver
228  for (int i = 0; i < m_spacedim; ++i)
229  {
230  vel[i] = Array<OneD, NekDouble>(npoints);
231  Vmath::Vcopy(npoints,
232  m_f->m_exp[strip * nfields + i]->GetPhys(), 1,
233  vel[i], 1);
234  }
235  }
236  else if(boost::iequals(m_f->m_variables[0], "rho") &&
237  boost::iequals(m_f->m_variables[1], "rhou"))
238  {
239  // CompressibleFlowSolver
240  for (int i = 0; i < m_spacedim; ++i)
241  {
242  vel[i] = Array<OneD, NekDouble>(npoints);
243  Vmath::Vdiv(npoints,
244  m_f->m_exp[strip * nfields + i + 1]->GetPhys(), 1,
245  m_f->m_exp[strip * nfields + 0 ]->GetPhys(), 1,
246  vel[i], 1);
247  }
248  }
249  else
250  {
251  // Unknown
252  ASSERTL0(false, "Could not identify velocity for ProcessVorticity");
253  }
254 }
255 
256 }
257 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
FieldSharedPtr m_f
Field object.
Definition: Module.h:230
static GlobalMapping::MappingSharedPtr GetMapping(FieldSharedPtr f)
Abstract base class for processing modules.
Definition: Module.h:265
void GetVelocity(Array< OneD, Array< OneD, NekDouble > > &vel, int strip=0)
virtual void Process(po::variables_map &vm)
Write mesh to output file.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:200
std::shared_ptr< Field > FieldSharedPtr
Definition: Field.hpp:989
std::pair< ModuleType, std::string > ModuleKey
Definition: Module.h:290
ModuleFactory & GetModuleFactory()
Definition: Module.cpp:49
GLOBAL_MAPPING_EXPORT typedef std::shared_ptr< Mapping > MappingSharedPtr
A shared pointer to a Mapping object.
Definition: Mapping.h:50
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1
void Vdiv(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.cpp:257
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1199
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.
Definition: Vmath.cpp:372