Nektar++
Functions
AddModeTo2DFld.cpp File Reference
#include <cstdio>
#include <cstdlib>
#include <SpatialDomains/MeshGraph.h>
#include <StdRegions/StdTriExp.h>

Go to the source code of this file.

Functions

int main (int argc, char *argv[])
 

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 9 of file AddModeTo2DFld.cpp.

10 {
11  NekDouble scal1,scal2;
12 
13  if(argc != 6)
14  {
15  fprintf(stderr,"Usage: AddModeTo2DFld scal1 scal2 2Dfieldfile1 fieldfile2 outfield\n"
16  "\t produces scal1*2Dfieldfiel1 + scal2*fieldfile2 in outfield\n" );
17  exit(1);
18  }
19 
20  scal1 = boost::lexical_cast<double>(argv[argc-5]);
21  scal2 = boost::lexical_cast<double>(argv[argc-4]);
22 
23  //----------------------------------------------
24  // Import fieldfile1.
25  string fieldfile1(argv[argc-3]);
26  vector<LibUtilities::FieldDefinitionsSharedPtr> fielddef1;
27  vector<vector<NekDouble> > fielddata1;
28  LibUtilities::Import(fieldfile1,fielddef1,fielddata1);
29  //----------------------------------------------
30 
31  //----------------------------------------------
32  // Import fieldfile2.
33  string fieldfile2(argv[argc-2]);
34  vector<LibUtilities::FieldDefinitionsSharedPtr> fielddef2;
35  vector<vector<NekDouble> > fielddata2;
36  LibUtilities::Import(fieldfile2,fielddef2,fielddata2);
37  //----------------------------------------------
38 
39  vector<vector<NekDouble> > combineddata;
40 
41  ASSERTL0(fielddata1.size() == fielddata2.size(),"Inner has different size");
42  //----------------------------------------------
43  // Add fielddata2 to fielddata1 using m_fields definition to align data.
44 
45  int i = 0;
46  int j = 0;
47  int k = 0;
48  int n = 0;
49 
50  for(i = 0; i < fielddata2.size(); ++i)
51  {
52  ASSERTL0(fielddef2[i]->m_numHomogeneousDir == 1,"Expected second fld to have one homogeneous direction");
53  ASSERTL0(fielddef2[i]->m_numModes[2] == 2,"Expected Fourier field to have 2 modes");
54 
55  int datalen1 = fielddata1[i].size()/fielddef1[i]->m_fields.size();
56  int datalen2 = fielddata2[i].size()/fielddef2[i]->m_fields.size();
57 
58  ASSERTL0(datalen1*2 == datalen2,"Data per fields is note compatible");
59 
60  // Determine the number of coefficients per element
61  int ncoeffs = 0;
62  switch(fielddef2[i]->m_shapeType)
63  {
65  ncoeffs = LibUtilities::StdTriData::getNumberOfCoefficients(fielddef2[i]->m_numModes[0], fielddef2[i]->m_numModes[1]);
66  break;
68  ncoeffs = fielddef2[i]->m_numModes[0]*fielddef2[i]->m_numModes[1];
69  break;
70  default:
71  ASSERTL0(false,"Shape not recognised");
72  break;
73  }
74 
75  // array for zero packing
76  Array<OneD,NekDouble> Zero(ncoeffs,0.0);
77 
78  // scale first and second fields
79  Vmath::Smul(fielddata1[i].size(), scal1, &fielddata1[i][0], 1,
80  &fielddata1[i][0], 1);
81  Vmath::Smul(fielddata2[i].size(), scal2, &fielddata2[i][0], 1,
82  &fielddata2[i][0], 1);
83 
84  vector<NekDouble> newdata;
85  auto vec_iter = fielddata2[i].begin();
86 
87  for(k = 0; k < fielddef2[i]->m_fields.size(); ++k)
88  {
89  // get location of 2D field information in order of field2 ordering
90  int offset = 0;
91  for(j = 0; j < fielddef1[i]->m_fields.size(); ++j)
92  {
93  if(fielddef1[i]->m_fields[j] == fielddef2[i]->m_fields[k])
94  {
95  break;
96  }
97  offset += datalen1;
98  }
99 
100  if(j != fielddef1[i]->m_fields.size())
101  {
102  for(n = 0; n < fielddef2[i]->m_elementIDs.size(); ++n)
103  {
104  // Real zero component
105  newdata.insert(newdata.end(),
106  &(fielddata1[i][offset+n*ncoeffs]),
107  &(fielddata1[i][offset+n*ncoeffs])
108  + ncoeffs);
109 
110  // Imaginary zero component;
111  newdata.insert(newdata.end(),&Zero[0],&Zero[0] + ncoeffs);
112 
113  // Put orginal mode in here.
114  newdata.insert(newdata.end(),vec_iter, vec_iter+2*ncoeffs);
115  vec_iter += 2*ncoeffs;
116  }
117  }
118  else
119  {
120 
121  for(n = 0; n < fielddef2[i]->m_elementIDs.size(); ++n)
122  {
123  // Real & Imag zero component
124  newdata.insert(newdata.end(),&Zero[0],&Zero[0] + ncoeffs);
125  newdata.insert(newdata.end(),&Zero[0],&Zero[0] + ncoeffs);
126 
127  // Put orginal mode in here.
128  newdata.insert(newdata.end(),vec_iter, vec_iter+2*ncoeffs);
129  vec_iter += 2*ncoeffs;
130  }
131  }
132  }
133  combineddata.push_back(newdata);
134  fielddef2[i]->m_numModes[2] += 2;
135  fielddef2[i]->m_homogeneousZIDs.push_back(2);
136  fielddef2[i]->m_homogeneousZIDs.push_back(3);
137 
138  // check to see if any field in fielddef1[i]->m_fields is
139  // not defined in fielddef2[i]->m_fields
140  for(k = 0; k < fielddef1[i]->m_fields.size(); ++k)
141  {
142  for(j = 0; j < fielddef2[i]->m_fields.size(); ++j)
143  {
144  if(fielddef1[i]->m_fields[k] == fielddef2[i]->m_fields[j])
145  {
146  break;
147  }
148  }
149 
150  if(j == fielddef2[i]->m_fields.size())
151  {
152  cout << "Warning: Field \'" << fielddef1[i]->m_fields[k]
153  << "\' was not included in output " << endl;
154  }
155 
156  }
157 
158  }
159  //----------------------------------------------
160 
161  //-----------------------------------------------
162  // Write out datafile.
163  LibUtilities::Write(argv[argc-1], fielddef2, combineddata);
164  //-----------------------------------------------
165 
166  return 0;
167 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:216
void Import(const std::string &infilename, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, FieldMetaDataMap &fieldinfomap, const Array< OneD, int > &ElementIDs)
This function allows for data to be imported from an FLD file when a session and/or communicator is n...
Definition: FieldIO.cpp:293
void Write(const std::string &outFile, std::vector< FieldDefinitionsSharedPtr > &fielddefs, std::vector< std::vector< NekDouble > > &fielddata, const FieldMetaDataMap &fieldinfomap, const bool backup)
This function allows for data to be written to an FLD file when a session and/or communicator is not ...
Definition: FieldIO.cpp:249
double NekDouble
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.cpp:225
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:436

References ASSERTL0, Nektar::LibUtilities::eQuadrilateral, Nektar::LibUtilities::eTriangle, Nektar::LibUtilities::StdSegData::getNumberOfCoefficients(), Nektar::LibUtilities::Import(), Vmath::Smul(), Nektar::LibUtilities::Write(), and Vmath::Zero().