[PATCH] Add relation like constructor to ScalarCode
Jeffrey D. Oldham
oldham at codesourcery.com
Tue Apr 6 22:05:49 UTC 2004
Richard Guenther wrote:
>Hi!
>
>This adds a relation functor required constructor to ScalarCode to be able
>to use ScalarCode objects as relation functors. It also updates
>TestBasicRelations check to excercise this and also adds actual checking
>to the test.
>
>Tested partly (relation and scalarcode tests) on ia32-linux, ok?
>
>Richard.
>
>
>2004Apr02 Richard Guenther <richard.guenther at uni-tuebingen.de>
>
> * src/Evaluator/ScalarCode.h: add copy constructor with
> extra LHS argument for relation functor compatibility.
> src/Field/tests/TestBasicRelations.cpp: check using
> ScalarCode object as relation functor.
>
>===== Evaluator/ScalarCode.h 1.5 vs edited =====
>--- 1.5/r2/src/Evaluator/ScalarCode.h Thu Oct 23 14:41:02 2003
>+++ edited/Evaluator/ScalarCode.h Fri Apr 2 13:29:26 2004
>@@ -403,6 +403,14 @@
> {
> }
>
>+ /// Constructor to allow ScalarCode being used as RelationFunctor
>+
>+ template <class LHS>
>+ ScalarCode(const ScalarCode<Function>& sc, const LHS&)
>+ : function_m(sc.function_m)
>+ {
>+ }
>+
> template<class F>
> static inline bool checkValidity(const F& f, WrappedInt<false>)
> {
>===== Field/tests/TestBasicRelations.cpp 1.1 vs edited =====
>--- 1.1/r2/src/Field/tests/TestBasicRelations.cpp Mon May 13 17:47:37 2002
>+++ edited/Field/tests/TestBasicRelations.cpp Fri Apr 2 13:37:14 2004
>@@ -54,10 +54,31 @@
> }
> };
>
>-void computePotentialEnergy(const Field_t &U, const Field_t &m, const Field_t &h)
>-{
>- U = m * g * h;
>-}
>+template<int Dim>
>+struct computePotentialEnergy {
>+ computePotentialEnergy() {}
>+ void scalarCodeInfo(ScalarCodeInfo& info) const
>+ {
>+ info.dimensions(Dim);
>+ info.arguments(3);
>+ info.write(0, true);
>+ info.write(1, false);
>+ info.write(2, false);
>+ info.useGuards(0, false);
>+ info.useGuards(1, false);
>+ info.useGuards(2, false);
>+ for (int i=0; i<Dim; ++i)
>+ {
>+ info.lowerExtent(i) = 0;
>+ info.upperExtent(i) = 0;
>+ }
>+ }
>+ template <class F1, class F2, class F3>
>+ void operator()(const F1& U, const F2& m, const F3& h, const Loc<Dim>& loc) const
>+ {
>+ U(loc) = m(loc) * g * h(loc);
>+ }
>+};
>
> struct ComputeVelocity
> {
>@@ -102,14 +123,16 @@
>
> Pooma::newRelation(Pooma::functionPtr(computeTotalEnergy), E, K, U);
> Pooma::newRelation(ComputeKineticEnergy(), K, m, v);
>- Pooma::newRelation(Pooma::functionPtr(computePotentialEnergy), U, m, h);
>+ Pooma::newRelation(ScalarCode<computePotentialEnergy<2> >(), U, m, h);
> Pooma::newRelation(Pooma::memberPtr(obj, &ComputeVelocity::doit), v, p, m);
>
> tester.out() << E << std::endl;
>+ tester.check("Total energy at h=4.0", all(E == 3.0*g*4.0 + 0.5*3.0*pow(2.0/3.0, 2)));
>
> h = 0;
>
> tester.out() << E << std::endl;
>+ tester.check("Total energy at h=0.0", all(E == 3.0*g*0.0 + 0.5*3.0*pow(2.0/3.0, 2)));
>
> int ret = tester.results("TestBasicRelations");
> Pooma::finalize();
>
>
If I understand correctly, this modifies the code to support computation
at a particular Loc (location). I had assumed that relations worked on
fields, not individual locations within fields. Thus, a field might be
lazily evaluated. If a value at a particular location is needed, the
field can be queried at that location. Why do we need the proposed
code changes?
--
Jeffrey D. Oldham
oldham at codesourcery.com
More information about the pooma-dev
mailing list