39#include <boost/core/ignore_unused.hpp>
54 "Computes C0 projection.");
60 true,
"0",
"Just perform a local to global mapping and back");
63 "Use boundary conditions given in xml file. Requires all "
64 "projected fields to be defined in xml file");
67 "Use a Helmholtz smoother to remove high frequency "
68 "components above specified L");
70 f->m_declareExpansionAsContField =
true;
82 if (
m_f->m_exp[0]->GetNumElmts() == 0)
89 if (
m_f->m_graph->GetMeshDimension() == 3)
91 if (boost::iequals(
m_f->m_session->GetSolverInfo(
"GLOBALSYSSOLN"),
92 "IterativeStaticCond"))
94 if (boost::iequals(
m_f->m_session->GetSolverInfo(
"PRECONDITIONER"),
97 m_f->m_session->SetSolverInfo(
"PRECONDITIONER",
100 if (boost::iequals(
m_f->m_session->GetSolverInfo(
"PRECONDITIONER"),
101 "FullLinearSpaceWithDiagonal"))
103 m_f->m_session->SetSolverInfo(
104 "PRECONDITIONER",
"FullLinearSpaceWithLowEnergyBlock");
109 if (
m_f->m_comm->GetRank() == 0)
111 cout <<
"Resetting diagonal precondition to low energy "
118 bool JustPerformLocToGloMap =
m_config[
"localtoglobalmap"].as<
bool>();
120 (boost::iequals(
m_config[
"helmsmoothing"].as<string>(),
"Not Set"))
123 int nfields =
m_f->m_exp.size();
125 if (
m_config[
"usexmlbcs"].as<bool>())
127 for (
int i = 0; i < nfields; ++i)
129 C0ProjectExp[i] =
m_f->m_exp[i];
135 bool savedef =
m_f->m_declareExpansionAsContField;
136 bool savedef2 =
m_f->m_requireBoundaryExpansion;
137 m_f->m_declareExpansionAsContField =
true;
138 m_f->m_requireBoundaryExpansion =
false;
140 m_f->AppendExpList(
m_f->m_numHomogeneousDir,
"DefaultVar",
true);
141 m_f->m_declareExpansionAsContField = savedef;
142 m_f->m_requireBoundaryExpansion = savedef2;
143 for (
int i = 1; i < nfields; ++i)
145 C0ProjectExp[i] = C0ProjectExp[0];
149 string fields =
m_config[
"fields"].as<
string>();
150 vector<unsigned int> processFields;
153 if (fields.compare(
"All") == 0)
155 for (
int i = 0; i < nfields; ++i)
157 processFields.push_back(i);
163 "Failed to interpret field string in C0Projection");
166 for (
int i = 0; i < processFields.size(); ++i)
168 ASSERTL0(processFields[i] < nfields,
169 "Attempt to process field that is larger than then number of "
174 if (
m_f->m_comm->GetRank() == 0)
176 cout <<
"\t Processing field: " << processFields[i] << endl;
180 if (JustPerformLocToGloMap)
182 int ncoeffs =
m_f->m_exp[0]->GetNcoeffs();
186 C0ProjectExp[processFields[i]]->LocalToGlobal(Coeffs, Coeffs);
187 C0ProjectExp[processFields[i]]->GlobalToLocal(Coeffs, Coeffs);
190 tmp =
m_f->m_exp[processFields[i]]->UpdateCoeffs(), 1);
194 int ncoeffs =
m_f->m_exp[0]->GetNcoeffs();
197 int npoints =
m_f->m_exp[0]->GetNpoints();
199 lambda = 2 * M_PI / lambda;
200 lambda = lambda * lambda;
204 cout <<
"Setting up Helmholtz smoother with lambda = "
213 m_f->m_exp[processFields[i]]->GetPhys(), 1, forcing,
216 m_f->m_exp[processFields[i]]->UpdateCoeffs(), 1);
217 C0ProjectExp[processFields[i]]->HelmSolve(
218 forcing,
m_f->m_exp[processFields[i]]->UpdateCoeffs(),
224 m_f->m_exp[processFields[i]]->UpdateCoeffs(), 1);
225 C0ProjectExp[processFields[i]]->FwdTrans(
226 m_f->m_exp[processFields[i]]->GetPhys(),
227 m_f->m_exp[processFields[i]]->UpdateCoeffs());
230 C0ProjectExp[processFields[i]]->BwdTrans(
231 m_f->m_exp[processFields[i]]->GetCoeffs(),
232 tmp =
m_f->m_exp[processFields[i]]->UpdatePhys());
#define ASSERTL0(condition, msg)
FieldSharedPtr m_f
Field object.
std::map< std::string, ConfigOption > m_config
List of configuration values.
virtual ~ProcessC0Projection()
virtual void v_Process(po::variables_map &vm) override
Write mesh to output file.
static ModuleKey className
static std::shared_ptr< Module > create(FieldSharedPtr f)
Creates an instance of this class.
ProcessC0Projection(FieldSharedPtr f)
Abstract base class for processing modules.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static bool GenerateVector(const std::string &str, std::vector< T > &out)
Takes a comma-separated string and converts it to entries in a vector.
std::shared_ptr< Field > FieldSharedPtr
std::pair< ModuleType, std::string > ModuleKey
ModuleFactory & GetModuleFactory()
std::map< ConstFactorType, NekDouble > ConstFactorMap
StdRegions::ConstFactorMap factors
The above copyright notice and this permission notice shall be included.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Zero(int n, T *x, const int incx)
Zero vector.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Represents a command-line configuration option.