freepooma-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add relation like constructor to ScalarCode


From: Jeffrey D. Oldham
Subject: Re: [PATCH] Add relation like constructor to ScalarCode
Date: Tue, 06 Apr 2004 15:05:49 -0700
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031107 Debian/1.5-3

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 <address@hidden>

        * 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
address@hidden


reply via email to

[Prev in Thread] Current Thread [Next in Thread]