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" 37 #include <boost/foreach.hpp> 38 #include <boost/shared_ptr.hpp> 44 typedef boost::shared_ptr<DependencyMap> pDependencyMap;
46 typedef boost::shared_ptr<Parameter> pParameter;
51 typedef std::set<long> ParameterSet;
52 ParameterSet parameters;
54 void add(pParameter p);
55 void add(pVariable v);
56 bool isElement(pParameter p);
57 bool isElement(pVariable v);
59 template<
int rank,
template<
int>
class CheckingPolicy>
62 for (
int i=0; i<rank; ++i) add(pa[i]);
68 bool hasElements(std::set<long> &ids);
71 typedef boost::shared_ptr<ParametersGroup> pParametersGroup;
79 pParametersGroup allowedDeps;
81 Parameter(std::string varName_, pVariable variable_, pParametersGroup allowedDeps_)
82 : varName(varName_), variable(variable_), allowedDeps(allowedDeps_)
86 bool canEvaluate() {
return (variable) && (variable->isInitialised()); }
87 pVariable getVariable() {
return variable; }
88 pParametersGroup getAllowedDeps() {
return allowedDeps; }
92 virtual void evaluate() = 0;
93 virtual void update() = 0;
102 ConcreteParameter(std::string varName_, pVariable variable_, T *value_, pParametersGroup allowedDeps_)
103 :
Parameter(varName_, variable_, allowedDeps_), value(value_) {}
108 if (! variable->isInitialised())
111 if (variable->isReadOnly())
117 if (variable->isConstant())
118 *value = boost::get<T>(variable->getValue());
120 *value = boost::get<T>(variable->evaluateExpression());
125 if (variable->isReadOnly())
return;
126 *value = boost::get<T>(variable->getValue());
153 pBlockVariables block;
154 std::map<std::string, pParameter> parameterMap;
156 typedef enum {readwrite, readonly} Permissions;
157 void setContext(pBlockVariables context)
162 pBlockVariables getContext()
169 pParameter addParameter(std::string varName,
171 pParametersGroup allowedDeps,
172 bool hasDefault =
false,
173 const T &defaultValue = T(),
174 Permissions perm=readwrite)
178 variable = pVariable(
new Variable(defaultValue, hasDefault,
false));
181 typedef boost::shared_ptr<Expression<T> > ParExpression;
183 if (hasDefault) *var = defaultValue;
184 variable = pVariable(
new Variable(pexp,
true,
true));
186 block->addVariable(varName, variable);
188 if (varName==
"test4") std::cerr <<
"test4: ID = " << variable->getId();
191 parameterMap[varName] = par;
196 pParameter addParameter(std::string varName, T* var, Permissions perm=readwrite)
199 return addParameter(varName, var, empty,
false, T(), perm);
203 pParameter addParameter(std::string varName, T* var,
const T &defaultValue, Permissions perm=readwrite)
206 return addParameter(varName, var, empty,
true, defaultValue, perm);
210 pParameter addConstant(std::string varName,
const T &value)
212 pVariable variable(
new Variable(value,
true,
true));
213 block->addVariable(varName, variable);
216 parameterMap[varName] = par;
223 template<
int>
class CheckingPolicy
228 Permissions perm=readwrite,
229 std::string extension =
"xyzuvw")
231 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 232 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
233 +
" (\"" +extension+
"\")");
235 for (
int i=0; i<rank; ++i)
236 result[i] = addParameter(varName+extension[i], &(var[i]), perm);
243 template<
int>
class CheckingPolicy
249 Permissions perm=readwrite,
250 std::string extension =
"xyzuvw")
252 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 253 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
254 +
" (\"" +extension+
"\")");
256 for (
int i=0; i<rank; ++i)
257 result[i] = addParameter(varName+extension[i], &(var[i]), default_values[i], perm);
264 template<
int>
class CheckingPolicy
270 Permissions perm=readwrite,
271 std::string extension =
"xyzuvw")
273 SCHNEK_REQUIRE(rank<=extension.length(),
"addArrayParameter: extension string not long enough! Rank = " 274 + boost::lexical_cast<std::string>(rank) +
", extension.length = "+ boost::lexical_cast<std::string>(extension.length())
275 +
" (\"" +extension+
"\")");
277 for (
int i=0; i<rank; ++i)
278 result[i] = addParameter(varName+extension[i], &(var[i]), default_value, perm);
284 typedef std::pair<std::string, pParameter> ParameterPair;
285 BOOST_FOREACH(ParameterPair par, parameterMap)
287 par.second->evaluate();
294 #endif // SCHNEK_BLOCKPARAMETERS_HPP_
Definition: blockparameters.hpp:132
Definition: expression.hpp:184
Definition: blockparameters.hpp:150
Definition: blockparameters.hpp:97
Definition: variables.hpp:53
Definition: blockparameters.hpp:48
Definition: blockparameters.hpp:74