39#include <boost/core/ignore_unused.hpp>
52 "Add mapping coordinates to output file.");
67 int npoints =
m_f->m_exp[0]->GetNpoints();
68 int expdim =
m_f->m_graph->GetMeshDimension();
69 int spacedim = expdim;
70 if ((
m_f->m_numHomogeneousDir) == 1 || (
m_f->m_numHomogeneousDir) == 2)
74 int nfields =
m_f->m_variables.size();
75 int addfields = expdim;
77 string fieldNames[3] = {
"xCoord",
"yCoord",
"zCoord"};
78 for (
int i = 0; i < addfields; ++i)
80 m_f->m_variables.push_back(fieldNames[i]);
84 if (
m_f->m_exp[0]->GetNumElmts() == 0)
89 m_f->m_exp.resize(nfields + addfields);
95 if (
m_f->m_fieldMetaDataMap.count(
"MappingCartesianVel"))
97 if (
m_f->m_fieldMetaDataMap[
"MappingCartesianVel"] ==
"False")
99 m_f->m_fieldMetaDataMap[
"MappingCartesianVel"] =
"True";
103 for (
int i = 0; i < spacedim; ++i)
106 if (
m_f->m_exp[0]->GetWaveSpace())
108 m_f->m_exp[0]->HomogeneousBwdTrans(
109 npoints,
m_f->m_exp[i]->GetPhys(), vel[i]);
118 mapping->ContravarToCartesian(vel, vel);
120 for (
int i = 0; i < spacedim; ++i)
122 if (
m_f->m_exp[0]->GetWaveSpace())
124 m_f->m_exp[0]->HomogeneousFwdTrans(
125 npoints, vel[i],
m_f->m_exp[i]->UpdatePhys());
130 m_f->m_exp[i]->UpdatePhys(), 1);
132 m_f->m_exp[i]->FwdTransLocalElmt(
m_f->m_exp[i]->GetPhys(),
133 m_f->m_exp[i]->UpdateCoeffs());
140 mapping->GetCartesianCoordinates(coords[0], coords[1], coords[2]);
143 for (
int i = 0; i < addfields; ++i)
145 m_f->m_exp[nfields + i] =
m_f->AppendExpList(
m_f->m_numHomogeneousDir);
147 m_f->m_exp[nfields + i]->UpdatePhys(), 1);
148 m_f->m_exp[nfields + i]->FwdTransLocalElmt(
149 coords[i],
m_f->m_exp[nfields + i]->UpdateCoeffs());
157 field[0] = f->m_exp[0];
163 if (f->m_fieldMetaDataMap.count(
"Time"))
165 string s_time = f->m_fieldMetaDataMap[
"Time"];
166 time = atof(s_time.c_str());
174 int npoints = f->m_exp[0]->GetNpoints();
175 int expdim = f->m_graph->GetMeshDimension();
176 int spacedim = expdim + f->m_numHomogeneousDir;
181 for (
int i = 0; i < 3; i++)
187 string fieldNames[3] = {
"x",
"y",
"z"};
188 string velFieldNames[3] = {
"vx",
"vy",
"vz"};
191 if (f->m_fieldMetaDataMap.count(
"MappingType"))
193 if (f->m_fieldMetaDataMap[
"MappingType"] ==
"Expression")
198 if (f->m_fieldMetaDataMap.count(
"MappingExpression"))
200 funcName = f->m_fieldMetaDataMap[
"MappingExpression"];
206 if (f->m_fieldMetaDataMap.count(
"MappingVelExpression"))
208 velFuncName = f->m_fieldMetaDataMap[
"MappingVelExpression"];
217 for (
int i = 0; i < 3; i++)
221 f->m_exp[0]->GetCoords(coords[0], coords[1], coords[2]);
224 std::string s_FieldStr;
225 for (
int i = 0; i < 3; i++)
227 s_FieldStr = fieldNames[i];
228 if (f->m_session->DefinesFunction(funcName, s_FieldStr))
231 f->m_session->GetFunction(funcName, s_FieldStr);
232 ffunc->Evaluate(coords[0], coords[1], coords[2], time,
242 if (f->m_session->DefinesFunction(velFuncName))
244 for (
int i = 0; i < 3; i++)
246 s_FieldStr = velFieldNames[i];
247 if (f->m_session->DefinesFunction(velFuncName, s_FieldStr))
250 f->m_session->GetFunction(velFuncName, s_FieldStr);
251 ffunc->Evaluate(coords[0], coords[1], coords[2], time,
258 mapping->SetFromFunction(
false);
259 mapping->UpdateMapping(time, coords_new, coords_vel);
261 else if (f->m_fieldMetaDataMap[
"MappingType"] ==
"File")
263 ASSERTL0(f->m_fieldMetaDataMap.count(
"FileName"),
264 "FileName parameter for Mapping missing in field file.");
265 string fileName = f->m_fieldMetaDataMap[
"FileName"];
266 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
267 std::vector<std::vector<NekDouble>> FieldData;
269 f->FieldIOForFile(fileName)->Import(fileName, FieldDef, FieldData);
271 for (
int j = 0; j < spacedim; ++j)
273 int ncoeffs = f->m_exp[0]->GetNcoeffs();
275 for (
int i = 0; i < FieldData.size(); ++i)
277 f->m_exp[j]->ExtractDataToCoeffs(
278 FieldDef[i], FieldData[i], fieldNames[j], fieldcoeffs);
280 bool wavespace = f->m_exp[0]->GetWaveSpace();
281 f->m_exp[0]->SetWaveSpace(
false);
283 f->m_exp[0]->BwdTrans(fieldcoeffs, coords_new[j]);
286 if (
std::find(FieldDef[0]->m_fields.begin(),
287 FieldDef[0]->m_fields.end(),
288 velFieldNames[j]) != FieldDef[0]->m_fields.end())
290 for (
int i = 0; i < FieldData.size(); ++i)
292 f->m_exp[j]->ExtractDataToCoeffs(
293 FieldDef[i], FieldData[i], velFieldNames[j],
296 f->m_exp[0]->BwdTrans(fieldcoeffs, coords_vel[j]);
298 f->m_exp[0]->SetWaveSpace(wavespace);
301 mapping->SetFromFunction(
false);
302 mapping->UpdateMapping(time, coords_new, coords_vel);
310 for (
int i = 0; i < 3; i++)
315 f->m_exp[0]->GetCoords(coords[0], coords[1], coords[2]);
316 mapping->SetFromFunction(
false);
317 mapping->UpdateMapping(time, coords, coords_vel);
#define ASSERTL0(condition, msg)
FieldSharedPtr m_f
Field object.
virtual ~ProcessMapping()
virtual void v_Process(po::variables_map &vm) override
Write mesh to output file.
static ModuleKey className
ProcessMapping(FieldSharedPtr f)
static GlobalMapping::MappingSharedPtr GetMapping(FieldSharedPtr f)
static std::shared_ptr< Module > create(FieldSharedPtr f)
Creates an instance of this class.
Abstract base class for processing modules.
static GLOBAL_MAPPING_EXPORT MappingSharedPtr Load(const LibUtilities::SessionReaderSharedPtr &pSession, const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
Return a pointer to the mapping, creating it on first call.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
std::shared_ptr< Field > FieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
ModuleFactory & GetModuleFactory()
GLOBAL_MAPPING_EXPORT typedef std::shared_ptr< Mapping > MappingSharedPtr
A shared pointer to a Mapping object.
std::shared_ptr< Equation > EquationSharedPtr
InputIterator find(InputIterator first, InputIterator last, InputIterator startingpoint, const EqualityComparable &value)
The above copyright notice and this permission notice shall be included.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)