27 #ifndef SCHNEK_BLOCKPARAMETERS_HPP_ 28 #define SCHNEK_BLOCKPARAMETERS_HPP_ 31 #include "variables.hpp" 32 #include "expression.hpp" 34 #include "../grid/array.hpp" 35 #include "../util/exceptions.hpp" 43 typedef std::shared_ptr<DependencyMap> pDependencyMap;
45 typedef std::shared_ptr<Parameter> pParameter;
50 typedef std::set<long> ParameterSet;
51 ParameterSet parameters;
53 void add(pParameter p);
54 void add(pVariable v);
55 bool isElement(pParameter p);
56 bool isElement(pVariable v);
58 template<
size_t rank,
template<
size_t>
class CheckingPolicy>
61 for (
size_t i=0; i<rank; ++i) add(pa[i]);
67 bool hasElements(std::set<long> &ids);
70 typedef std::shared_ptr<ParametersGroup> pParametersGroup;
78 pParametersGroup allowedDeps;
80 Parameter(std::string varName_, pVariable variable_, pParametersGroup allowedDeps_)
81 : varName(varName_), variable(variable_), allowedDeps(allowedDeps_)
85 bool canEvaluate() {
return (variable) && (variable->isInitialised()); }
86 pVariable getVariable() {
return variable; }
87 pParametersGroup getAllowedDeps() {
return allowedDeps; }
91 virtual void evaluate() = 0;
92 virtual void update() = 0;
101 ConcreteParameter(std::string varName_, pVariable variable_, T *value_, pParametersGroup allowedDeps_)
102 :
Parameter(varName_, variable_, allowedDeps_), value(value_) {}
107 if (! variable->isInitialised())
110 if (variable->isReadOnly())
116 if (variable->isConstant())
117 *value = boost::get<T>(variable->getValue());
119 *value = boost::get<T>(variable->evaluateExpression());
124 if (variable->isReadOnly())
return;
125 *value = boost::get<T>(variable->getValue());
152 pBlockVariables block;
153 std::map<std::string, pParameter> parameterMap;
155 typedef enum {readwrite, readonly} Permissions;
156 void setContext(pBlockVariables context)
161 pBlockVariables getContext()
168 pParameter addParameter(std::string varName,
170 pParametersGroup allowedDeps,
171 bool hasDefault =
false,
172 const T &defaultValue = T(),
173 Permissions perm=readwrite)
177 variable = pVariable(
new Variable(defaultValue, hasDefault,
false));
180 typedef std::shared_ptr<Expression<T> > ParExpression;
182 if (hasDefault) *var = defaultValue;
183 variable = pVariable(
new Variable(pexp,
true,
true));
185 block->addVariable(varName, variable);
187 if (varName==
"test4") std::cerr <<
"test4: ID = " << variable->getId();
190 parameterMap[varName] = par;
195 pParameter addParameter(std::string varName, T* var, Permissions perm=readwrite)
198 return addParameter(varName, var, empty,
false, T(), perm);
202 pParameter addParameter(std::string varName, T* var,
const T &defaultValue, Permissions perm=readwrite)
205 return addParameter(varName, var, empty,
true, defaultValue, perm);
209 pParameter addConstant(std::string varName,
const T &value)
211 pVariable variable(
new Variable(value,
true,
true));
212 block->addVariable(varName, variable);
215 parameterMap[varName] = par;
222 template<
size_t>
class CheckingPolicy
227 Permissions perm=readwrite,
228 std::string extension =
"xyzuvw")
230 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 231 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
232 +
" (\"" +extension+
"\")");
234 for (
int i=0; i<rank; ++i)
235 result[i] = addParameter(varName+extension[i], &(var[i]), perm);
242 template<
size_t>
class CheckingPolicy
248 Permissions perm=readwrite,
249 std::string extension =
"xyzuvw")
251 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 252 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
253 +
" (\"" +extension+
"\")");
255 for (
int i=0; i<rank; ++i)
256 result[i] = addParameter(varName+extension[i], &(var[i]), default_values[i], perm);
263 template<
size_t>
class CheckingPolicy
269 Permissions perm=readwrite,
270 std::string extension =
"xyzuvw")
272 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 273 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
274 +
" (\"" +extension+
"\")");
276 for (
int i=0; i<rank; ++i)
277 result[i] = addParameter(varName+extension[i], &(var[i]), default_value, perm);
283 typedef std::pair<std::string, pParameter> ParameterPair;
284 for(ParameterPair par: parameterMap)
286 par.second->evaluate();
293 #endif // SCHNEK_BLOCKPARAMETERS_HPP_
Definition: blockparameters.hpp:131
Definition: expression.hpp:189
Definition: blockparameters.hpp:149
Definition: blockparameters.hpp:96
Definition: variables.hpp:58
Definition: blockparameters.hpp:47
Definition: blockparameters.hpp:73