[PATCH] Fix/improve PETSc wrapper

Jeffrey D. Oldham oldham at codesourcery.com
Mon Aug 23 15:39:38 UTC 2004


Richard Guenther wrote:

>
> Found in one of my repositories.
>
> Ok?
>
> Richard.
>
>
> 2004Aug21  Richard Guenther <richard.guenther at uni-tuebingen.de>
>
>     * src/Transform/PETSc.h: handle expression engines for
>     initialization, support periodic setup, fix MP patch        
>     computation.


Yes, this looks fine to commit.  Does changing from e(I) to e.read(I) 
yield measurable changes?

>------------------------------------------------------------------------
>
>Index: src/Transform/PETSc.h
>===================================================================
>RCS file: /home/pooma/Repository/r2/src/Transform/PETSc.h,v
>retrieving revision 1.1
>diff -u -u -r1.1 PETSc.h
>--- src/Transform/PETSc.h	24 Mar 2004 18:26:32 -0000	1.1
>+++ src/Transform/PETSc.h	21 Aug 2004 19:13:58 -0000
>@@ -109,7 +109,7 @@
>     int idx=0;
>     Interval<1> d(e.domain());
>     for (int I=d.first(); I<=d.last(); ++I)
>-      pa[idx++] = e(I);
>+      pa[idx++] = e.read(I);
>     VecRestoreArray(v, &pa);
>   }
>   template <class T>
>@@ -138,7 +138,7 @@
>     Interval<2> d(e.domain());
>     for (int J=d[1].first(); J<=d[1].last(); ++J)
>       for (int I=d[0].first(); I<=d[0].last(); ++I)
>-	pa[idx++] = e(I, J);
>+	pa[idx++] = e.read(I, J);
>     VecRestoreArray(v, &pa);
>   }
>   template <class T>
>@@ -169,7 +169,7 @@
>     for (int K=d[2].first(); K<=d[2].last(); ++K)
>       for (int J=d[1].first(); J<=d[1].last(); ++J)
> 	for (int I=d[0].first(); I<=d[0].last(); ++I)
>-	  pa[idx++] = e(I, J, K);
>+	  pa[idx++] = e.read(I, J, K);
>     VecRestoreArray(v, &pa);
>   }
>   template <class T>
>@@ -197,12 +197,27 @@
> template <int Dim>
> struct PoomaDA {
> 
>-  /// Creates a PETSc DA from the specified layout.
>+  /// Creates a PETSc DA from the specified array/field/layout.
>   /// Extra arguments are like DACreateNd, namely the periodicity
>   /// and stencil type and the stencil width.
> 
>+  template <class T, class EngineTag>
>+  PoomaDA(const Array<Dim, T, EngineTag> &a, DAPeriodicType pt, DAStencilType st, int sw)
>+  {
>+    initialize(a.physicalDomain(), pt, st, sw);
>+  }
>+
>+  template <class MeshTag, class T, class EngineTag>
>+  PoomaDA(const Field<MeshTag, T, EngineTag> &f, DAPeriodicType pt, DAStencilType st, int sw)
>+  {
>+    initialize(f.physicalDomain(), pt, st, sw);
>+  }
>+
>   template <class Layout>
>-  PoomaDA(const Layout &l, DAPeriodicType pt, DAStencilType st, int sw);
>+  PoomaDA(const Layout &l, DAPeriodicType pt, DAStencilType st, int sw)
>+  {
>+    initialize(l.innerDomain(), pt, st, sw);
>+  }
> 
>   ~PoomaDA()
>   {
>@@ -216,6 +231,15 @@
>   operator DA() const { return da; }
> 
> 
>+  /// Access PeriodicType.
>+
>+  DAPeriodicType periodicType() const { return info[0].pt; }
>+
>+  /// Access StencilType.
>+
>+  DAStencilType stencilType() const { return info[0].st; }
>+
>+
>   /// Assign from POOMA engine to PETSc vector.
> 
>   template <class T, class EngineTag>
>@@ -234,6 +258,7 @@
>   template <class MeshTag, class T, class EngineTag>
>   void assign(Vec v, const Field<MeshTag, T, EngineTag> &f)
>   {
>+    forEach(f, PerformUpdateTag(), NullCombine());
>     this->assign(v, f.fieldEngine().engine());
>   }
> 
>@@ -257,8 +282,12 @@
>   void assign(const Field<MeshTag, T, EngineTag> &f, Vec v)
>   {
>     this->assign(f.fieldEngine().engine(), v);
>+    f.notifyPostWrite();
>   }
> 
>+protected:
>+  void initialize(const Interval<Dim> &d, DAPeriodicType pt, DAStencilType st, int sw);
>+
> 
> private:
>   DA da;
>@@ -270,11 +299,10 @@
> 
> 
> template <int Dim>
>-template <class Layout>
>-PoomaDA<Dim>::PoomaDA(const Layout &l, DAPeriodicType pt, DAStencilType st, int sw)
>-  : offset(Loc<Dim>(0))
>+void PoomaDA<Dim>::initialize(const Interval<Dim> &d, DAPeriodicType pt, DAStencilType st, int sw)
> {
>-  Interval<Dim> domain = l.innerDomain();
>+  offset = Loc<Dim>(0);
>+  Interval<Dim> domain = d;
>   if (pt != DA_XPERIODIC
>       && pt != DA_XYPERIODIC
>       && pt != DA_XYZPERIODIC
>@@ -370,7 +398,7 @@
>         Interval<Dim> lPatch(PoomaDAGetDomain<Dim>::innerDomain(this->info[i]));
> 	Array<Dim, T, Remote<Brick> > a;
> 	a.engine() = Engine<Dim, T, Remote<Brick> >(i, lPatch);
>-	Array<Dim, T, typename ViewEngine_t::Tag_t> e_array(ViewEngine_t(e, lPatch - this->offset));
>+	Array<Dim, T, typename ViewEngine_t::Tag_t> e_array(ViewEngine_t(e, lPatch + this->offset));
> 	a = e_array;
> 
> 	// remember local engine
>@@ -414,7 +442,7 @@
> 
> 	// distribute the copy
> 	Array<Dim, T, typename ViewEngine_t::Tag_t> e_array;
>-	e_array.engine() = ViewEngine_t(e, lPatch - this->offset);
>+	e_array.engine() = ViewEngine_t(e, lPatch + this->offset);
> 	e_array = a;
>   }
> }
>  
>


-- 
Jeffrey D. Oldham
oldham at codesourcery.com




More information about the pooma-dev mailing list