/** * Writes out the crossings to file. * @param pFields Field storage expansion list. * @param time Current time. */ void FilterBenchmark::v_Finalise( const Array<OneD, const MultiRegions::ExpListSharedPtr> &pFields, const NekDouble &time) { for (int i = 0; i < m_threshold.size() - 1; ++i) { std::stringstream vOutputFilename; vOutputFilename << m_outputFile << "_" << i << ".fld"; std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef = pFields[0]->GetFieldDefinitions(); std::vector<std::vector<NekDouble> > FieldData(FieldDef.size()); Array<OneD, NekDouble> vCoeffs(pFields[0]->GetNcoeffs()); pFields[0]->FwdTrans_IterPerExp(m_threshold[i], vCoeffs); // copy Data into FieldData and set variable for(int i = 0; i < FieldDef.size(); ++i) { // Could do a search here to find correct variable FieldDef[i]->m_fields.push_back("m"); pFields[0]->AppendFieldData(FieldDef[i], FieldData[i], vCoeffs); } m_fld->Write(vOutputFilename.str(),FieldDef,FieldData); } }
void Forcing::EvaluateFunction( Array<OneD, MultiRegions::ExpListSharedPtr> pFields, LibUtilities::SessionReaderSharedPtr pSession, std::string pFieldName, Array<OneD, NekDouble>& pArray, const std::string& pFunctionName, NekDouble pTime) { ASSERTL0(pSession->DefinesFunction(pFunctionName), "Function '" + pFunctionName + "' does not exist."); unsigned int nq = pFields[0]->GetNpoints(); if (pArray.num_elements() != nq) { pArray = Array<OneD, NekDouble> (nq); } LibUtilities::FunctionType vType; vType = pSession->GetFunctionType(pFunctionName, pFieldName); if (vType == LibUtilities::eFunctionTypeExpression) { Array<OneD, NekDouble> x0(nq); Array<OneD, NekDouble> x1(nq); Array<OneD, NekDouble> x2(nq); pFields[0]->GetCoords(x0, x1, x2); LibUtilities::EquationSharedPtr ffunc = pSession->GetFunction(pFunctionName, pFieldName); ffunc->Evaluate(x0, x1, x2, pTime, pArray); } else if (vType == LibUtilities::eFunctionTypeFile) { std::string filename = pSession->GetFunctionFilename( pFunctionName, pFieldName); std::vector<LibUtilities::FieldDefinitionsSharedPtr> FieldDef; std::vector<std::vector<NekDouble> > FieldData; Array<OneD, NekDouble> vCoeffs(pFields[0]->GetNcoeffs()); Vmath::Zero(vCoeffs.num_elements(), vCoeffs, 1); LibUtilities::FieldIOSharedPtr fld = MemoryManager<LibUtilities::FieldIO>::AllocateSharedPtr(m_session->GetComm()); fld->Import(filename, FieldDef, FieldData); int idx = -1; for (int i = 0; i < FieldDef.size(); ++i) { for (int j = 0; j < FieldDef[i]->m_fields.size(); ++j) { if (FieldDef[i]->m_fields[j] == pFieldName) { idx = j; } } if (idx >= 0) { pFields[0]->ExtractDataToCoeffs( FieldDef[i], FieldData[i], FieldDef[i]->m_fields[idx], vCoeffs); } else { cout << "Field " + pFieldName + " not found." << endl; } } pFields[0]->BwdTrans_IterPerExp(vCoeffs, pArray); } }