41 #include <boost/format.hpp> 
   58 SessionFunction::SessionFunction(
 
   62     : m_session(session), m_field(field), m_name(functionName),
 
   66              "Function '" + 
m_name + 
"' does not exist.");
 
   80     std::vector<std::string> vFieldNames = 
m_session->GetVariables();
 
   82     for (
int i = 0; i < vFieldNames.size(); i++)
 
   84         Evaluate(vFieldNames[i], pArray[i], pTime, domain);
 
  101     ASSERTL1(pFieldNames.size() == pArray.size(),
 
  103                  "' variable list size mismatch with array storage.");
 
  105     for (
int i = 0; i < pFieldNames.size(); i++)
 
  107         Evaluate(pFieldNames[i], pArray[i], pTime, domain);
 
  121     std::vector<std::string> pFieldNames,
 
  123     const NekDouble &pTime, 
const int domain)
 
  125     ASSERTL0(pFieldNames.size() == pFields.size(),
 
  126              "Field list / name list size mismatch.");
 
  128     for (
int i = 0; i < pFieldNames.size(); i++)
 
  130         Evaluate(pFieldNames[i], pFields[i]->UpdatePhys(), pTime, domain);
 
  131         if (pFields[i]->GetWaveSpace())
 
  133             pFields[i]->HomogeneousFwdTrans(pFields[i]->GetTotPoints(),
 
  134                                             pFields[i]->GetPhys(),
 
  135                                             pFields[i]->UpdatePhys());
 
  137         pFields[i]->FwdTransLocalElmt(pFields[i]->GetPhys(),
 
  138                                       pFields[i]->UpdateCoeffs());
 
  153                                const NekDouble &pTime, 
const int domain)
 
  158     unsigned int nq = 
m_field->GetNpoints();
 
  160     std::pair<std::string, int> key(pFieldName, domain);
 
  168         if (pArray.size() < nq)
 
  184         std::string filename =
 
  187         if (boost::filesystem::path(filename).extension() == 
".pts" ||
 
  188             boost::filesystem::path(filename).extension() == 
".csv")
 
  199         ASSERTL0(
false, 
"unknown eFunctionType");
 
  227         retVal = ffunc->GetExpression();
 
  232         std::string filename =
 
  234         retVal = 
"from file " + filename;
 
  238         ASSERTL0(
false, 
"unknown eFunctionType");
 
  254                                   const NekDouble &pTime, 
const int domain)
 
  256     unsigned int nq = 
m_field->GetNpoints();
 
  257     if (pArray.size() < nq)
 
  268     m_field->GetCoords(x0, x1, x2);
 
  272     ffunc->Evaluate(x0, x1, x2, pTime, pArray);
 
  285                                   const NekDouble &pTime, 
const int domain)
 
  287     unsigned int nq = 
m_field->GetNpoints();
 
  288     if (pArray.size() < nq)
 
  293     std::string filename =
 
  295     std::string fileVar =
 
  298     if (fileVar.length() == 0)
 
  300         fileVar = pFieldName;
 
  311 #if (defined _WIN32 && _MSC_VER < 1900) 
  314             unsigned int old_exponent_format;
 
  315             old_exponent_format = _set_output_format(_TWO_DIGIT_EXPONENT);
 
  317             _set_output_format(old_exponent_format);
 
  325                                 "\", variable \"" + fileVar + 
"\"")
 
  330     int numexp = 
m_field->GetExpSize();
 
  332     for (
int i = 0; i < numexp; ++i)
 
  334         ElementGIDs[i] = 
m_field->GetExp(i)->GetGeom()->GetGlobalID();
 
  337     std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef;
 
  338     std::vector<std::vector<NekDouble>> FieldData;
 
  341     fldIO->Import(filename, FieldDef, FieldData,
 
  347     for (
int i = 0; i < FieldDef.size(); ++i)
 
  351         for (
int j = 0; j < FieldDef[i]->m_fields.size(); ++j)
 
  353             if (FieldDef[i]->m_fields[j] == fileVar)
 
  361             m_field->ExtractDataToCoeffs(FieldDef[i], FieldData[i],
 
  362                                          FieldDef[i]->m_fields[idx], vCoeffs);
 
  366             cout << 
"Field " + fileVar + 
" not found." << endl;
 
  370     bool wavespace = 
m_field->GetWaveSpace();
 
  372     m_field->BwdTrans(vCoeffs, pArray);
 
  373     m_field->SetWaveSpace(wavespace);
 
  386                                   const NekDouble &pTime, 
const int domain)
 
  388     unsigned int nq = 
m_field->GetNpoints();
 
  389     if (pArray.size() < nq)
 
  394     std::string filename =
 
  396     std::string fileVar =
 
  399     if (fileVar.length() == 0)
 
  401         fileVar = pFieldName;
 
  412 #if (defined _WIN32 && _MSC_VER < 1900) 
  415             unsigned int old_exponent_format;
 
  416             old_exponent_format = _set_output_format(_TWO_DIGIT_EXPONENT);
 
  418             _set_output_format(old_exponent_format);
 
  426                                 "\", variable \"" + fileVar + 
"\"")
 
  434     std::string funcFilename =
 
  438     if (boost::filesystem::path(filename).extension() == 
".pts")
 
  441         ptsIO.
Import(filename, inPts);
 
  443     else if (boost::filesystem::path(filename).extension() == 
".csv")
 
  446         csvIO.
Import(filename, inPts);
 
  450         ASSERTL1(
false, 
"Unsupported file type");
 
  454                                             inPts->GetNFields());
 
  455     for (
int i = 0; i < inPts->GetDim() + inPts->GetNFields(); ++i)
 
  459     if (inPts->GetDim() == 1)
 
  463     else if (inPts->GetDim() == 2)
 
  465         m_field->GetCoords(pts[0], pts[1]);
 
  467     else if (inPts->GetDim() == 3)
 
  469         m_field->GetCoords(pts[0], pts[1], pts[2]);
 
  472         inPts->GetDim(), inPts->GetFieldNames(), pts);
 
  483             std::vector<MultiRegions::ExpListSharedPtr>>(
 
  485         if (
m_session->GetComm()->GetRank() == 0)
 
  491         if (
m_session->GetComm()->GetRank() == 0)
 
  494             if (
m_session->DefinesCmdLineArgument(
"verbose"))
 
  510     vector<string> fieldNames = outPts->GetFieldNames();
 
  511     for (fieldInd = 0; fieldInd < fieldNames.size(); ++fieldInd)
 
  513         if (outPts->GetFieldName(fieldInd) == fileVar)
 
  518     ASSERTL0(fieldInd != fieldNames.size(), 
"field not found");
 
  520     pArray = outPts->GetPts(fieldInd + outPts->GetDim());
 
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
A class that contains algorithms for interpolation between pts fields, expansions and different meshe...
FIELD_UTILS_EXPORT void Interpolate(const T expInField, T &expOutField, NekDouble def_value=0.0)
Interpolate from an expansion to an expansion.
static std::shared_ptr< FieldIO > CreateForFile(const LibUtilities::SessionReaderSharedPtr session, const std::string &filename)
Construct a FieldIO object for a given input filename.
void PrintStatistics()
Returns if the weights have already been computed.
void SetProgressCallback(FuncPointerT func, ObjectPointerT obj)
sets a callback funtion which gets called every time the interpolation progresses
void CalcWeights(const LibUtilities::PtsFieldSharedPtr ptsInField, LibUtilities::PtsFieldSharedPtr &ptsOutField, bool reuseTree=false)
Compute interpolation weights without doing any interpolation.
void Import(const std::string &inFile, PtsFieldSharedPtr &ptsField, FieldMetaDataMap &fieldmetadatamap=NullFieldMetaDataMap, DomainRangeShPtr &Range=NullDomainRangeShPtr)
Import a pts field from file.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::map< std::string, FieldUtils::Interpolator< std::vector< MultiRegions::ExpListSharedPtr > > > m_interpolators
Interpolator for pts file input for a variable & domain combination.
MultiRegions::ExpListSharedPtr m_field
The expansion we want to evaluate this function for.
bool m_toCache
Store resulting arrays (and interpolators)
std::map< std::pair< std::string, int >, Array< OneD, NekDouble > > m_arrays
Cached result arrays.
SOLVER_UTILS_EXPORT void EvaluateFld(std::string pFieldName, Array< OneD, NekDouble > &pArray, const NekDouble &pTime=0.0, const int domain=0)
SOLVER_UTILS_EXPORT void EvaluatePts(std::string pFieldName, Array< OneD, NekDouble > &pArray, const NekDouble &pTime=0.0, const int domain=0)
Evaluates a function from pts file.
SOLVER_UTILS_EXPORT void Evaluate(Array< OneD, Array< OneD, NekDouble >> &pArray, const NekDouble pTime=0.0, const int domain=0)
Evaluates a function defined in the xml session file at each quadrature point.
SOLVER_UTILS_EXPORT void PrintProgressbar(const int position, const int goal) const
std::map< std::pair< std::string, int >, NekDouble > m_lastCached
Last time the cache for this variable & domain combo was updated.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
SOLVER_UTILS_EXPORT std::string Describe(std::string pFieldName, const int domain=0)
Provide a description of a function for a given field name.
SOLVER_UTILS_EXPORT void EvaluateExp(std::string pFieldName, Array< OneD, NekDouble > &pArray, const NekDouble &pTime=0.0, const int domain=0)
std::shared_ptr< FieldIO > FieldIOSharedPtr
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Equation > EquationSharedPtr
static FieldMetaDataMap NullFieldMetaDataMap
std::shared_ptr< PtsField > PtsFieldSharedPtr
@ eFunctionTypeExpression
@ eFunctionTypeTransientFile
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
static const NekDouble kNekZeroTol
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)