35 #include <boost/core/ignore_unused.hpp> 39 #include <boost/algorithm/string/predicate.hpp> 45 namespace GlobalMapping
49 bool Mapping::m_init =
false;
50 bool Mapping::m_isDefined =
false;
60 : m_session(pSession), m_fields(pFields)
85 ASSERTL0(0,
"Dimension not supported");
102 const TiXmlElement *pMapping)
104 boost::ignore_unused(pFields);
106 int phystot =
m_fields[0]->GetTotPoints();
112 for (
int i = 0; i < 3; i++)
120 const TiXmlElement* timeDep = pMapping->
121 FirstChildElement(
"TIMEDEPENDENT");
124 string sTimeDep = timeDep->GetText();
126 ( boost::iequals(sTimeDep,
"yes"));
134 string fieldNames[3] = {
"x",
"y",
"z"};
135 const TiXmlElement* funcNameElmt = pMapping->FirstChildElement(
"COORDS");
140 "Function '" +
m_funcName +
"' not defined.");
143 m_fields[0]->GetCoords(coords[0], coords[1], coords[2]);
145 std::string s_FieldStr;
148 for(
int i = 0; i < 3; i++)
150 s_FieldStr = fieldNames[i];
158 "3DH1D does not support mapping in the z-direction.");
170 m_fields[0]->GetCoords(coords[0], coords[1], coords[2]);
171 for(
int i = 0; i < 3; i++)
182 string velFieldNames[3] = {
"vx",
"vy",
"vz"};
183 const TiXmlElement* velFuncNameElmt = pMapping->FirstChildElement(
"VEL");
190 std::string s_FieldStr;
193 for(
int i = 0; i < 3; i++)
195 s_FieldStr = velFieldNames[i];
203 "3DH1D does not support mapping in the z-direction.");
215 for(
int i = 0; i < 3; i++)
226 for (
int i=0; i< nvel; i++)
229 for (
int j=0; j< nvel; j++)
250 TiXmlElement* vMapping = NULL;
252 if (
m_session->DefinesElement(
"Nektar/Mapping"))
254 vMapping =
m_session->GetElement(
"Nektar/Mapping");
274 TiXmlElement* vMapping = NULL;
276 if (pSession->DefinesElement(
"Nektar/Mapping"))
278 vMapping = pSession->GetElement(
"Nektar/Mapping");
279 vType = vMapping->Attribute(
"TYPE");
284 vType =
"Translation";
288 vType, pSession, pFields,
307 const std::string &outname)
312 fieldMetaDataMap[
"MappingCartesianVel"] = std::string(
"False");
316 fieldMetaDataMap[
"MappingType"] = std::string(
"Expression");
317 fieldMetaDataMap[
"MappingExpression"] =
m_funcName;
325 int expdim =
m_fields[0]->GetGraph()->GetMeshDimension();
326 string fieldNames[3] = {
"x",
"y",
"z"};
327 string velFieldNames[3] = {
"vx",
"vy",
"vz"};
329 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef
330 =
m_fields[0]->GetFieldDefinitions();
331 std::vector<std::vector<NekDouble> > FieldData(FieldDef.size());
333 int ncoeffs =
m_fields[0]->GetNcoeffs();
336 bool wavespace =
m_fields[0]->GetWaveSpace();
339 for(
int j = 0; j < expdim; ++j)
343 for(
int i = 0; i < FieldDef.size(); ++i)
346 FieldDef[i]->m_fields.push_back(fieldNames[j]);
347 m_fields[0]->AppendFieldData(FieldDef[i], FieldData[i],
354 for(
int j = 0; j < expdim; ++j)
359 for(
int i = 0; i < FieldDef.size(); ++i)
362 FieldDef[i]->m_fields.push_back(velFieldNames[j]);
363 m_fields[0]->AppendFieldData(FieldDef[i],
370 std::string outfile = outname;
371 outfile.erase(outfile.end()-4, outfile.end());
374 m_fld->Write(outfile,FieldDef,FieldData,fieldMetaDataMap);
377 fieldMetaDataMap[
"MappingType"] = std::string(
"File");
378 fieldMetaDataMap[
"FileName"] = outfile;
380 m_fields[0]->SetWaveSpace(wavespace);
387 std::string pFieldName,
389 const std::string& pFunctionName,
392 ASSERTL0(pSession->DefinesFunction(pFunctionName),
393 "Function '" + pFunctionName +
"' does not exist.");
396 pSession->GetFunction(pFunctionName, pFieldName);
402 ffunc->Evaluate(x0, x1, x2, pTime, pArray);
409 std::string pFieldName,
411 const std::string& pFunctionName,
414 ASSERTL0(pSession->DefinesFunction(pFunctionName),
415 "Function '" + pFunctionName +
"' does not exist.");
417 unsigned int nq = pFields[0]->GetNpoints();
418 if (pArray.num_elements() != nq)
424 vType = pSession->GetFunctionType(pFunctionName, pFieldName);
431 pFields[0]->GetCoords(x0, x1, x2);
433 pSession->GetFunction(pFunctionName, pFieldName);
435 ffunc->Evaluate(x0, x1, x2, pTime, pArray);
439 std::string filename = pSession->GetFunctionFilename(
443 std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
444 std::vector<std::vector<NekDouble> > FieldData;
450 fld->Import(filename, FieldDef, FieldData);
453 for (
int i = 0; i < FieldDef.size(); ++i)
455 for (
int j = 0; j < FieldDef[i]->m_fields.size(); ++j)
457 if (FieldDef[i]->
m_fields[j] == pFieldName)
465 pFields[0]->ExtractDataToCoeffs(
473 cout <<
"Field " + pFieldName +
" not found." << endl;
476 pFields[0]->BwdTrans_IterPerExp(vCoeffs, pArray);
493 if(inarray == outarray)
495 int physTot =
m_fields[0]->GetTotPoints();
498 for (
int i=0; i< nvel; i++)
523 if(inarray == outarray)
525 int physTot =
m_fields[0]->GetTotPoints();
528 for (
int i=0; i< nvel; i++)
553 if(inarray == outarray)
555 int physTot =
m_fields[0]->GetTotPoints();
558 for (
int i=0; i< nvel; i++)
583 if(inarray == outarray)
585 int physTot =
m_fields[0]->GetTotPoints();
588 for (
int i=0; i< nvel; i++)
614 if(inarray == outarray)
616 int physTot =
m_fields[0]->GetTotPoints();
619 for (
int i=0; i< nvel; i++)
645 if(inarray == outarray)
647 int physTot =
m_fields[0]->GetTotPoints();
650 for (
int i=0; i< nvel; i++)
667 int physTot =
m_fields[0]->GetTotPoints();
681 int physTot =
m_fields[0]->GetTotPoints();
694 int physTot =
m_fields[0]->GetTotPoints();
700 bool wavespace =
m_fields[0]->GetWaveSpace();
714 outarray, 1, outarray, 1);
716 m_fields[0]->SetWaveSpace(wavespace);
724 int physTot =
m_fields[0]->GetTotPoints();
731 for (
int i=0; i< nvel; i++)
734 for (
int j=0; j< nvel; j++)
747 int physTot =
m_fields[0]->GetTotPoints();
754 for (
int i=0; i< nvel; i++)
757 for (
int j=0; j< nvel; j++)
770 int physTot =
m_fields[0]->GetTotPoints();
776 bool wavespace =
m_fields[0]->GetWaveSpace();
788 Vmath::Vadd(physTot, wk, 1, outarray, 1, outarray, 1);
792 m_fields[0]->SetWaveSpace(wavespace);
800 int physTot =
m_fields[0]->GetTotPoints();
806 bool wavespace =
m_fields[0]->GetWaveSpace();
811 for (
int i=0; i< nvel; i++)
826 for (
int k=0; k< nvel; k++)
833 for (
int i=0; i< nvel; i++)
835 for (
int k=0; k< nvel; k++)
837 tmp[k] =
m_wk1[i*nvel+k];
840 for (
int j=0; j<nvel; j++)
851 for (
int i=0; i< nvel; i++)
854 for (
int j=0; j< nvel; j++)
869 for (
int i=0; i< nvel; i++)
871 for (
int p=0;
p< nvel;
p++)
876 for (
int j=0; j< nvel; j++)
884 for (
int j=0; j< nvel; j++)
886 for (
int p=0;
p< nvel;
p++)
891 for (
int i=0; i< nvel; i++)
899 m_fields[0]->SetWaveSpace(wavespace);
906 int physTot =
m_fields[0]->GetTotPoints();
912 for (
int i=0; i< nvel*nvel*nvel; i++)
918 bool wavespace =
m_fields[0]->GetWaveSpace();
923 for (
int i=0; i< nvel; i++)
938 for (
int j=0; j< nvel; j++)
950 for (
int i=0; i< nvel; i++)
952 for (
int j=0; j< nvel; j++)
957 outarray[i*nvel*nvel+j*nvel+0],
958 outarray[i*nvel*nvel+j*nvel+1]);
963 outarray[i*nvel*nvel+j*nvel+0],
964 outarray[i*nvel*nvel+j*nvel+1],
965 outarray[i*nvel*nvel+j*nvel+2]);
971 for (
int i=0; i< nvel; i++)
973 for (
int p=0;
p< nvel;
p++)
978 for (
int j=0; j< nvel; j++)
980 for (
int k=0; k< nvel; k++)
982 Vmath::Vsub(physTot,outarray[i*nvel*nvel+j*nvel+k],1,
984 outarray[i*nvel*nvel+j*nvel+k], 1);
990 for (
int j=0; j< nvel; j++)
992 for (
int p=0;
p< nvel;
p++)
997 for (
int i=0; i< nvel; i++)
999 for (
int k=0; k< nvel; k++)
1001 Vmath::Vadd(physTot,outarray[i*nvel*nvel+j*nvel+k],1,
1003 outarray[i*nvel*nvel+j*nvel+k], 1);
1009 m_fields[0]->SetWaveSpace(wavespace);
1015 const bool generalized)
1017 int physTot =
m_fields[0]->GetTotPoints();
1021 bool wavespace =
m_fields[0]->GetWaveSpace();
1034 for (
int i = 0; i < nvel; ++i)
1036 for (
int k = 0; k < nvel; ++k)
1039 for (
int j = 0; j < nvel; ++j)
1041 tmp[j] = ddU[i*nvel*nvel+j*nvel+k];
1044 for (
int p=0;
p<nvel; ++
p)
1047 ddU[i*nvel*nvel+p*nvel+k], 1);
1052 for (
int i = 0; i < nvel; ++i)
1055 for (
int k = 0; k < nvel; ++k)
1058 ddU[k*nvel*nvel+i*nvel+k], 1,
1061 ddU[i*nvel*nvel+k*nvel+k], 1,
1068 m_fields[0]->CurlCurl(inarray, outarray);
1072 m_fields[0]->SetWaveSpace(wavespace);
1077 int physTot =
m_fields[0]->GetTotPoints();
1079 int nfields =
m_fields.num_elements();
1080 int nbnds =
m_fields[0]->GetBndConditions().num_elements();
1089 for (
int i=0; i < nfields; i++)
1097 for (
int i = 0; i< nvel; i++)
1110 for (
int dir=0; dir < 3; dir++)
1117 for(
int n = 0 ; n < nbnds ; ++n)
1120 for (
int i = 0; i < nfields; ++i)
1122 BndConds =
m_fields[i]->GetBndConditions();
1123 BndExp =
m_fields[i]->GetBndCondExpansions();
1124 if ( BndConds[n]->GetBoundaryConditionType() ==
1127 isDirichlet[i] =
true;
1132 for (
int j = 0; j < nvel; ++j)
1135 GetBoundaryConditionType() ==
1137 "Mapping only supported when all velocity components have the same type of boundary conditions");
1142 "Time-dependent Dirichlet boundary conditions not supported with mapping yet.");
1146 std::static_pointer_cast<
1149 m_dirichletCondition;
1151 condition.
Evaluate(coords[0], coords[1], coords[2],
1156 isDirichlet[i] =
false;
1160 if ( isDirichlet[0])
1162 for (
int i = 0; i < nvel; ++i)
1167 for (
int i = 0; i < nvel; ++i)
1174 for (
int i = 0; i < nfields; ++i)
1176 BndConds =
m_fields[i]->GetBndConditions();
1177 BndExp =
m_fields[i]->GetBndCondExpansions();
1178 if( BndConds[n]->GetUserDefined() ==
"" ||
1179 BndConds[n]->GetUserDefined() ==
"MovingBody")
1182 values[i], BndExp[n]->UpdatePhys());
1186 BndConds[n]->GetUserDefined() ==
1191 m_fields[i]->ExtractPhysToBnd(n, coordVel[i], coordVelBnd);
1196 BndExp[n]->UpdatePhys(), 1,
1197 BndExp[n]->UpdatePhys(), 1);
1204 for (
int i = 0; i <
m_fields.num_elements(); ++i)
1207 BndConds =
m_fields[i]->GetBndConditions();
1208 BndExp =
m_fields[i]->GetBndCondExpansions();
1209 for(
int n = 0 ; n < BndConds.num_elements(); ++n)
1211 if ( BndConds[n]->GetBoundaryConditionType() ==
1214 if( BndConds[n]->GetUserDefined() ==
"" ||
1215 BndConds[n]->GetUserDefined() ==
"MovingBody")
1219 BndExp[n]->SetWaveSpace(
false);
1222 BndExp[n]->FwdTrans_BndConstrained(
1223 BndExp[n]->GetPhys(), BndExp[n]->UpdateCoeffs());
1237 std::string s_FieldStr;
1238 string fieldNames[3] = {
"x",
"y",
"z"};
1239 string velFieldNames[3] = {
"vx",
"vy",
"vz"};
1243 for(
int i = 0; i < 3; i++)
1245 s_FieldStr = fieldNames[i];
1253 "3DH1D does not support mapping in the z-direction.");
1256 s_FieldStr = velFieldNames[i];
1264 "3DH1D does not support mapping in the z-direction.");
1271 int physTot =
m_fields[0]->GetTotPoints();
1274 for(
int i = 0; i < 3; i++)
1279 for(
int i = 0; i < nvel; i++)
static MappingSharedPtr m_mappingPtr
std::string m_funcName
Name of the function containing the coordinates.
GLOBAL_MAPPING_EXPORT void InitObject(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const TiXmlElement *pMapping)
Initialise the mapping object.
virtual GLOBAL_MAPPING_EXPORT void v_CovarFromCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)=0
std::string m_velFuncName
Name of the function containing the velocity of the coordinates.
Array< OneD, Array< OneD, NekDouble > > m_coords
Array with the Cartesian coordinates.
#define ASSERTL0(condition, msg)
MappingFactory & GetMappingFactory()
Declaration of the mapping factory singleton.
virtual GLOBAL_MAPPING_EXPORT void v_VelocityLaplacian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble alpha)
GLOBAL_MAPPING_EXPORT void CovarFromCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Convert a covariant vector to the transformed system.
GLOBAL_MAPPING_EXPORT void GetMetricTensor(Array< OneD, Array< OneD, NekDouble > > &outarray)
Get the metric tensor .
virtual GLOBAL_MAPPING_EXPORT void v_GetCoordVelocity(Array< OneD, Array< OneD, NekDouble > > &outarray)
GLOBAL_MAPPING_EXPORT void ContravarToCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Convert a contravariant vector to the Cartesian system.
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Array< OneD, Array< OneD, NekDouble > > m_wk2
GLOBAL_MAPPING_EXPORT void GetCoordVelocity(Array< OneD, Array< OneD, NekDouble > > &outarray)
Obtain the velocity of the coordinates.
GLOBAL_MAPPING_EXPORT void GetCartesianCoordinates(Array< OneD, NekDouble > &out0, Array< OneD, NekDouble > &out1, Array< OneD, NekDouble > &out2)
Get the Cartesian coordinates in the field.
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.
GLOBAL_MAPPING_EXPORT void GetJacobian(Array< OneD, NekDouble > &outarray)
Get the Jacobian of the transformation.
int m_nConvectiveFields
Number of velocity components.
std::map< std::string, std::string > FieldMetaDataMap
GLOBAL_MAPPING_EXPORT void Output(LibUtilities::FieldMetaDataMap &fieldMetaDataMap, const std::string &outname)
Output function called when a chk or fld file is written.
GLOBAL_MAPPING_EXPORT void RaiseIndex(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Raise index of vector: .
virtual GLOBAL_MAPPING_EXPORT void v_DotGradJacobian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &outarray)
virtual GLOBAL_MAPPING_EXPORT void v_CovarToCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)=0
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
LibUtilities::SessionReaderSharedPtr m_session
Session reader.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
bool m_timeDependent
Flag defining if the Mapping is time-dependent.
virtual GLOBAL_MAPPING_EXPORT void v_GetCartesianCoordinates(Array< OneD, NekDouble > &out0, Array< OneD, NekDouble > &out1, Array< OneD, NekDouble > &out2)
GLOBAL_MAPPING_EXPORT void ApplyChristoffelContravar(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Apply the Christoffel symbols to a contravariant vector.
Array< OneD, Array< OneD, NekDouble > > m_coordsVel
Array with the velocity of the coordinates.
LibUtilities::FieldIOSharedPtr m_fld
GLOBAL_MAPPING_EXPORT bool HasConstantJacobian()
Get flag defining if mapping has constant Jacobian.
virtual GLOBAL_MAPPING_EXPORT void v_ContravarFromCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)=0
virtual GLOBAL_MAPPING_EXPORT void v_InitObject(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields, const TiXmlElement *pMapping)
NekDouble Evaluate() const
Array< OneD, Array< OneD, NekDouble > > m_tmp
virtual GLOBAL_MAPPING_EXPORT void v_gradgradU(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual GLOBAL_MAPPING_EXPORT void v_UpdateMapping(const NekDouble time, const Array< OneD, Array< OneD, NekDouble > > &coords=NullNekDoubleArrayofArray, const Array< OneD, Array< OneD, NekDouble > > &coordsVel=NullNekDoubleArrayofArray)
virtual GLOBAL_MAPPING_EXPORT void v_Divergence(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &outarray)
GLOBAL_MAPPING_EXPORT void gradgradU(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Second order covariant derivatives of a contravariant vector.
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.
std::shared_ptr< Equation > EquationSharedPtr
MultiRegions::Direction const DirCartesianMap[]
static std::shared_ptr< FieldIO > CreateDefault(const LibUtilities::SessionReaderSharedPtr session)
Returns an object for the default FieldIO method.
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
GLOBAL_MAPPING_EXPORT void EvaluateTimeFunction(LibUtilities::SessionReaderSharedPtr pSession, std::string pFieldName, Array< OneD, NekDouble > &pArray, const std::string &pFunctionName, NekDouble pTime=NekDouble(0))
virtual GLOBAL_MAPPING_EXPORT void v_CurlCurlField(Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const bool generalized)
GLOBAL_MAPPING_EXPORT void EvaluateFunction(Array< OneD, MultiRegions::ExpListSharedPtr > pFields, LibUtilities::SessionReaderSharedPtr pSession, std::string pFieldName, Array< OneD, NekDouble > &pArray, const std::string &pFunctionName, NekDouble pTime=NekDouble(0))
GLOBAL_MAPPING_EXPORT void LowerIndex(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Lower index of vector: .
GLOBAL_MAPPING_EXPORT void ApplyChristoffelCovar(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Apply the Christoffel symbols to a covariant vector.
GLOBAL_MAPPING_EXPORT void ContravarFromCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Convert a contravariant vector to the transformed system.
GLOBAL_MAPPING_EXPORT void CovarToCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Convert a covariant vector to the Cartesian system.
virtual GLOBAL_MAPPING_EXPORT void v_RaiseIndex(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
virtual GLOBAL_MAPPING_EXPORT void v_LowerIndex(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
GLOBAL_MAPPING_EXPORT void ReplaceField(const Array< OneD, MultiRegions::ExpListSharedPtr > &pFields)
Replace the Expansion List used by the mapping.
virtual GLOBAL_MAPPING_EXPORT void v_ContravarToCartesian(const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)=0
GLOBAL_MAPPING_EXPORT typedef std::shared_ptr< Mapping > MappingSharedPtr
A shared pointer to a Mapping object.
Array< OneD, Array< OneD, NekDouble > > m_wk1
void Zero(int n, T *x, const int incx)
Zero vector.
std::shared_ptr< FieldIO > FieldIOSharedPtr
bool m_fromFunction
Flag defining if the Mapping is defined by a function.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
GLOBAL_MAPPING_EXPORT bool IsTimeDependent()
Get flag defining if mapping is time-dependent.
Provides a generic Factory class.
GLOBAL_MAPPING_EXPORT void GetInvMetricTensor(Array< OneD, Array< OneD, NekDouble > > &outarray)
Get the inverse of metric tensor .
GLOBAL_MAPPING_EXPORT void UpdateGeomInfo()
Recompute the metric terms of the Mapping.
virtual GLOBAL_MAPPING_EXPORT void v_UpdateBCs(const NekDouble time)