#include <sys/time.h>
#include <time.h>
#include <fenv.h>
#include <cstdarg>
#include <complex>
#include <algorithm>
#include <limits>
#include <math.h>
#include <cstring>

namespace Smarts {
template<class T>
class IterateScheduler;
template<class T>
class Iterate;
template<class T>
class DataObject;
}
namespace Smarts {
class Runnable
{
public:
  Runnable()
  {
    priority_m = 0;
  }
  Runnable(int)
  {
    priority_m = 0;
  }
  virtual ~Runnable() {}
  inline int
  priority() { return priority_m; }
  inline void
  priority(int _priority) { priority_m = _priority; }
  virtual void execute()
  {
    run();
  }
protected:
  virtual void run() {}
private:
  int priority_m;
};
typedef Runnable *RunnablePtr_t;
inline void add(RunnablePtr_t);
}
namespace Smarts {
class Stub
{
public:
  enum Action { Read, Write };
};
template<> class Iterate<Stub>;
template<> class IterateScheduler<Stub>;
template<> class DataObject<Stub>;
template<>
class Iterate<Stub> : public Runnable
{
public:
  inline Iterate(IterateScheduler<Stub> & scheduler, int affinity=-1);
  virtual ~Iterate() {}
  virtual void run() = 0;
  int affinity() { return 0; }
  int hintAffinity() { return 0; }
  void affinity(int) {}
  void hintAffinity(int) {}
  void generation(int gen) { generation_m=gen; }
  int generation() { return generation_m; }
protected:
  IterateScheduler<Stub> &scheduler_m;
private:
  int generation_m;
};
template<>
class IterateScheduler<Stub>
{
public:
  inline
  void beginGeneration() { generation_m++; }
  inline
  void endGeneration() {}
  inline
  void blockingEvaluate() {}
  inline
  void releaseIterates() { }
  inline
  IterateScheduler()
    : generation_m(0)
  { }
  inline
  ~IterateScheduler() {}
  inline int generation() const { return generation_m; }
  inline
  void handOff(Iterate<Stub>* it)
  {
    it->run();
    delete it;
  }
protected:
private:
  int generation_m;
};
inline Iterate<Stub>::Iterate(IterateScheduler<Stub> & scheduler, int)
  : scheduler_m(scheduler)
{
  generation(scheduler.generation());
}
template<>
class DataObject<Stub>
{
public:
    inline DataObject(int=-1) {}
    inline int affinity() const { return 0; };
    inline void affinity(int) {}
    inline void request(Iterate<Stub>&, Stub::Action) {}
    inline void release(Stub::Action) {}
protected:
private:
};
inline void concurrency(int)
{
}
inline int concurrency()
{
  return 1;
}
inline void wait()
{
}
inline void add(Runnable *runnable)
{
  runnable->execute();
  delete runnable;
}
}
namespace Pooma {
  typedef Smarts::Stub SmartsTag_t;
}
namespace Pooma {
static const char schedulerVersion[] = "stub scheduler";
typedef Smarts::IterateScheduler<SmartsTag_t> Scheduler_t;
typedef Smarts::DataObject<SmartsTag_t> DataObject_t;
typedef Smarts::Iterate<SmartsTag_t> Iterate_t;
typedef Smarts::Runnable Runnable_t;
inline void addRunnable(Runnable_t *runnable)
{
  Smarts::add(runnable);
}
}
namespace Pooma {
class Assertion
{
  char *msg_m;
  char *file_m;
  int line_m;
public:
  Assertion(const char *msg, const char *file, int line);
  Assertion(const Assertion &a);
  ~Assertion() { delete[] msg_m; delete [] file_m; }
  Assertion &operator=(const Assertion &a);
  const char *what() const { return msg_m; }
  const char *file() const { return file_m; }
  int line() const { return line_m; }
  template<class OS>
  void print(OS &os) const
  {
    os << "### POOMA Assertion Failure ###\n";
    os << "### " << what() << "\n";
    os << "### File " << file() << "; Line " << line();
  }
};
void toss_cookies(const char *msg, const char *file, int line ...) __attribute__((noreturn));
}
template<bool B> struct PoomaCTAssert {};
template<> struct PoomaCTAssert<true> { static inline void test() {} };
template<class T1, class T2>
struct SameType
{
  enum { same = false };
};
template<class T1>
struct SameType<T1, T1>
{
  enum { same = true };
};
namespace Pooma {
  class DummyMutex
  {
  public:
    inline DummyMutex() { }
    inline DummyMutex(const DummyMutex &) { }
    inline DummyMutex &operator=(const DummyMutex &) { return *this; }
    inline void lock() { }
    inline void unlock() { }
  };
  typedef DummyMutex Mutex_t;
}
#include <iostream>
#include <map>
class InformStream;
class Inform
{
public:
  typedef int ID_t;
  typedef int Level_t;
  typedef int Context_t;
  enum { out, app };
  enum { allContexts = (-1) };
  enum { off = (-1), on = 0 };
  Inform(const char *prefix = 0, Context_t outputContext = 0);
  Inform(const char *prefix, const char *fname, int writemode,
  Context_t outputContext = 0);
  Inform(const char *prefix, std::ostream &outstream,
  Context_t outputContext = 0);
  ~Inform();
  const std::string &prefix() const { return prefix_m; }
  void setPrefix(const char *prefix = 0);
  ID_t open(Context_t context = 0);
  ID_t open(const char *fname, int writemode, Context_t context = 0);
  ID_t open(std::ostream &outstream, Context_t context = 0);
  void close(ID_t);
  void close();
  Level_t messageLevel() const { return level_m; }
  Inform &setMessageLevel(Level_t newval) { level_m = newval; return *this; }
  Level_t outputLevel(ID_t id = 0) const;
  void setOutputLevel(Level_t newval, ID_t id);
  void setOutputLevel(Level_t newval);
  Context_t outputContext(ID_t id = 0) const;
  void setOutputContext(Context_t outputContext, ID_t id);
  void setOutputContext(Context_t outputContext);
  inline static Context_t context() { return context_s; }
  inline static Context_t numContexts() { return nContexts_s; }
  static inline void setContext(Context_t c) { context_s = c; }
  static inline void setNumContexts(Context_t n) { nContexts_s = n; }
  void flush();
  void print() { flush(); }
  void output() { flush(); }
  typedef std::ios_base::fmtflags FmtFlags_t;
  std::ostream& stream() { return *message_m; }
  FmtFlags_t
    setf(FmtFlags_t setbits,FmtFlags_t field)
    { return message_m->setf(setbits,field);}
  FmtFlags_t
    setf(FmtFlags_t f) { return message_m->setf(f); }
  void unsetf(FmtFlags_t f) { message_m->unsetf(f); }
  long flags() const { return message_m->flags(); }
  long flags(FmtFlags_t f) { return message_m->flags(f); }
  int width() const { return message_m->width(); }
  int width(int w) { return message_m->width(w); }
  char fill() const { return message_m->fill(); }
  char fill(char c) { return message_m->fill(c); }
  int precision() const { return message_m->precision(); }
  int precision(int p) { return message_m->precision(p); }
  void lock() const { mutex_m.lock(); }
  void unlock() const { mutex_m.unlock(); }
private:
  typedef std::map<ID_t, InformStream *> StreamList_t;
  typedef StreamList_t::size_type Size_t;
  typedef StreamList_t::value_type Value_t;
  typedef StreamList_t::iterator iterator;
  typedef StreamList_t::const_iterator const_iterator;
  std::string prefix_m;
  Context_t outputContext_m;
  Level_t level_m;
  StreamList_t streams_m;
  std::ostringstream *message_m;
  char *buffer_m;
  static const unsigned int bufSize;
  ID_t nextID_m;
  mutable Pooma::Mutex_t mutex_m;
  static Pooma::Mutex_t outputMutex_s;
  static Context_t context_s;
  static Context_t nContexts_s;
  InformStream *findStream(ID_t) const;
  void setup(const char *prefix);
};
namespace std {
  extern Inform &endl(Inform &);
  extern Inform &flush(Inform &);
  extern Inform &lock(Inform &);
  extern Inform &unlock(Inform &);
}
inline Inform &operator<<(Inform &o, Inform &(*d)(Inform &))
{
  return d(o);
}
inline Inform &operator<<(Inform &o, std::ios_base &(*d)(std::ios_base &))
{
  d(o.stream());
  return o;
}
template<class T>
inline Inform &operator<<(Inform &o, const T &val)
{
  o.stream() << val;
  return o;
}
inline Inform &operator<<(Inform &o, const void *val)
{
  Inform::FmtFlags_t oldformat =
    o.setf(std::ios::hex, std::ios::basefield);
  o.stream() << "0x" << reinterpret_cast<long>(val);
  o.setf(oldformat, std::ios::basefield);
  return o;
}
inline Inform &operator<<(Inform &o, const char *s)
{
  o.stream() << s;
  return o;
}
inline Inform &operator<<(Inform &o, const std::string &s)
{
  o.stream() << s.c_str();
  return o;
}
#include <iterator>
template <class T>
class InformIterator
{
public:
  typedef std::output_iterator_tag iterator_category;
  typedef void value_type;
  typedef void difference_type;
  typedef void pointer;
  typedef void reference;
  InformIterator(Inform &s) : out_m(&s), delim_m(0) { }
  InformIterator(Inform &s, const char *d) : out_m(&s), delim_m(d) { }
  InformIterator &operator=(const T &value)
  {
    *out_m << value;
    if (delim_m != 0)
      *out_m << delim_m;
    return *this;
  }
  InformIterator &operator*() { return *this; }
  InformIterator &operator++() { return *this; }
  InformIterator &operator++(int) { return *this; }
private:
  Inform *out_m;
  const char *delim_m;
};
namespace Pooma {
class Options
{
public:
  Options();
  Options(int &argc, char ** argv);
  Options(const Options &opts);
  Options &operator=(const Options &opts);
  ~Options();
  int concurrency() const { return concurrency_m; }
  void concurrency(int c)
    {
      ;
      concurrency_m = c;
    }
  bool printInfo() const { return info_m; }
  void printInfo(bool p) { info_m = p; }
  bool printWarnings() const { return warn_m; }
  void printWarnings(bool p) { warn_m = p; }
  bool printErrors() const { return err_m; }
  void printErrors(bool p) { err_m = p; }
  const std::string &logfile() const { return logfile_m; }
  void logfile(const std::string &s) { logfile_m = s; }
  bool printStats() const { return stats_m; }
  void printStats(bool p) { stats_m = p; }
  int debug() const { return debug_m; }
  void debug(int p) { debug_m = p; }
  bool neverCompress() const { return neverCompress_m; }
  void neverCompress(bool p) { neverCompress_m = p; }
  bool deferredGuardFills() const { return deferredFills_m; }
  void deferredGuardFills(bool p) { deferredFills_m = p; }
  bool hardInit() const { return hardinit_m; }
  void hardInit(bool p) { hardinit_m = p; }
  bool hardRun() const { return hardrun_m; }
  void hardRun(bool p) { hardrun_m = p; }
  bool lockThreads() const { return lockthreads_m; }
  void lockThreads(bool p) { lockthreads_m = p; }
  bool blockingExpressions() const { return blockingExpressions_m; }
  void blockingExpressions(bool p) { blockingExpressions_m = p; }
  void usage();
  void reset();
  void parse(int &argc, char ** &argv);
private:
  int concurrency_m;
  bool info_m;
  bool warn_m;
  bool err_m;
  std::string logfile_m;
  bool stats_m;
  int debug_m;
  bool neverCompress_m;
  bool deferredFills_m;
  bool hardinit_m;
  bool hardrun_m;
  bool lockthreads_m;
  bool blockingExpressions_m;
};
bool intArgument(int argc, char **argv, int pos, int &val);
bool stringArgument(int argc, char **argv, int pos, std::string &val);
bool doubleArgument(int argc, char **argv, int pos, double &val);
}
namespace Pooma {
  typedef void (*AbortHandler_t)();
  typedef int Context_t;
  typedef int PatchID_t;
  namespace Arch {
    inline void dawdle() { }
    inline void getCommandLineArguments(int &, char** &) { }
    inline void initialize() { }
    inline void finalize() { }
  }
  void incrementNumExpressions(long val = 1);
  void incrementNumMultiPatchExpressions(long val = 1);
  void incrementNumZBExpressions(long val = 1);
  void incrementNumCompressedAssigns(long val = 1);
  void incrementNumAssignsRequiringUnCompression(long val = 1);
  void incrementNumInlineEvaluations(long val = 1);
  void incrementNumLocalPatchesEvaluated(long val = 1);
  void incrementNumReductions(long val = 1);
  void incrementNumUnCompresses(long val = 1);
  void incrementNumUnsuccessfulTryCompresses(long val = 1);
  void incrementNumSuccessfulTryCompresses(long val = 1);
  void incrementNumPolls(long val = 1);
  extern Inform pinfo;
  extern Inform pwarn;
  extern Inform perr;
  extern Inform pdebug;
  bool initialize(int &argc, char ** &argv,
    bool initRTS = true, bool getCLArgsArch = true, bool initArch = true);
  bool initialize(Pooma::Options &opts, bool initRTS = true,
    bool initArch = true);
  bool finalize();
  bool finalize(bool quitRTS, bool quitArch);
  void pAbort(int errorcode = 0) __attribute__((noreturn));
  void pAbort(const char *msg, int errorcode = 0) __attribute__((noreturn));
  void stopHere();
  AbortHandler_t abortHandler();
  AbortHandler_t abortHandler(AbortHandler_t);
  AbortHandler_t resetAbortHandler();
  const char *version();
  int majorVersion();
  int minorVersion();
  const char *buildDate();
  bool printStats();
  void printStats(bool on);
  bool infoMessages();
  void infoMessages(bool on);
  bool warnMessages();
  void warnMessages(bool on);
  bool errorMessages();
  void errorMessages(bool on);
  void logMessages(const char *filename);
  int debugLevel();
  void debugLevel(int val);
  bool neverCompress();
  void neverCompress(bool p);
  bool deferredGuardFills();
  void deferredGuardFills(bool p);
  extern Context_t myContext_g;
  extern int numContexts_g;
  extern int expression_g;
  inline Context_t context() { return myContext_g; }
  inline int contexts() { return numContexts_g; }
  Scheduler_t &scheduler();
  void blockAndEvaluate();
  bool hardInit();
  void hardInit(bool on);
  bool hardRun();
  void hardRun(bool on);
  bool lockThreads();
  void lockThreads(bool on);
  bool blockingExpressions();
  void blockingExpressions(bool on);
  inline void beginExpression()
  {
    scheduler().beginGeneration();
  }
  inline void endExpression()
  {
    scheduler().endGeneration();
    expression_g++;
    if (blockingExpressions())
      blockAndEvaluate();
  }
  inline int expression()
  {
    return expression_g;
  }
inline void poll()
{
    ;
}
}
template<int Dim, class T, class EngineTag> class Array;
template<int Dim, class T, class EngineTag> class Engine;
template<class Subject, class Sub1, bool SV>
struct View1Implementation;
template <class LayoutTag, class PatchTag>
struct MultiPatch;
template <class LayoutTag, class PatchTag, int Dim2>
struct MultiPatchView;
template<class Expr>
struct ExpressionTag;
template <int Dim, class T, class EngineTag>
class Engine;
template <class Engine, class SubDomain>
struct NewEngine
{
};
template <class Engine, class SubDomain>
struct NewEngineEngine
{
  typedef Engine Type_t;
  static inline
  const Engine &apply(const Engine &e, const SubDomain &)
  {
    return e;
  }
} ;
template <class Engine, class SubDomain>
struct NewEngineDomain
{
  typedef SubDomain Type_t;
  typedef const SubDomain &Return_t;
  static inline
  Return_t apply(const Engine &, const SubDomain &i)
  {
    return i;
  }
} ;
template<class Eng, class Dom>
inline typename NewEngineEngine<Eng, Dom>::Type_t
newEngineEngine(const Eng &e, const Dom &dom)
{
  return NewEngineEngine<Eng, Dom>::apply(e, dom);
}
template<class Eng, class Dom>
inline typename NewEngineDomain<Eng, Dom>::Type_t
newEngineDomain(const Eng &e, const Dom &dom)
{
  return NewEngineDomain<Eng, Dom>::apply(e, dom);
}
struct EngineConstructTag
{
  EngineConstructTag() { };
  ~EngineConstructTag() { };
  EngineConstructTag(const EngineConstructTag &) { };
  EngineConstructTag &operator=(const EngineConstructTag &) { return *this; }
};
template<class T>
class Scalar
{
public:
  inline
  Scalar() { }
  inline
  Scalar(const T &t) : scalar_m(t) { }
  template<class T1>
  inline
  explicit Scalar(const T1 &t) : scalar_m(t) { }
  template<class Arg>
  inline
  Scalar(const Scalar<T> &s, const Arg &)
    : scalar_m(s.scalar_m) { }
  template<class Arg1, class Arg2>
  inline
  Scalar(const Scalar<T> &s, const Arg1 &, const Arg2 &)
    : scalar_m(s.scalar_m) { }
  inline
  Scalar(const Scalar<T> &s) : scalar_m(s.scalar_m) { }
  inline
  const T &value() const { return scalar_m; }
  inline
  Scalar<T> &operator=(const Scalar<T> &rhs)
  {
    scalar_m = rhs.scalar_m;
    return *this;
  }
  inline
  Scalar<T> &operator=(const T &rhs)
  {
    scalar_m = rhs;
    return *this;
  }
private:
  T scalar_m;
};
template<class T, class Op>
struct UnaryReturn {
  typedef T Type_t;
};
template<class T1, class T2>
struct Promote { typedef T1 Type_t; };
template<>
struct Promote<bool, bool> {
  typedef bool Type_t;
};
template<>
struct Promote<bool, char> {
  typedef char Type_t;
};
template<>
struct Promote<bool, short> {
  typedef short Type_t;
};
template<>
struct Promote<bool, int> {
  typedef int Type_t;
};
template<>
struct Promote<bool, long> {
  typedef long Type_t;
};
template<>
struct Promote<bool, float> {
  typedef float Type_t;
};
template<>
struct Promote<bool, double> {
  typedef double Type_t;
};
template<>
struct Promote<char, bool> {
  typedef char Type_t;
};
template<>
struct Promote<char, char> {
  typedef char Type_t;
};
template<>
struct Promote<char, short> {
  typedef short Type_t;
};
template<>
struct Promote<char, int> {
  typedef int Type_t;
};
template<>
struct Promote<char, long> {
  typedef long Type_t;
};
template<>
struct Promote<char, float> {
  typedef float Type_t;
};
template<>
struct Promote<char, double> {
  typedef double Type_t;
};
template<>
struct Promote<short, bool> {
  typedef short Type_t;
};
template<>
struct Promote<short, char> {
  typedef short Type_t;
};
template<>
struct Promote<short, short> {
  typedef short Type_t;
};
template<>
struct Promote<short, int> {
  typedef int Type_t;
};
template<>
struct Promote<short, long> {
  typedef long Type_t;
};
template<>
struct Promote<short, float> {
  typedef float Type_t;
};
template<>
struct Promote<short, double> {
  typedef double Type_t;
};
template<>
struct Promote<int, bool> {
  typedef int Type_t;
};
template<>
struct Promote<int, char> {
  typedef int Type_t;
};
template<>
struct Promote<int, short> {
  typedef int Type_t;
};
template<>
struct Promote<int, int> {
  typedef int Type_t;
};
template<>
struct Promote<int, long> {
  typedef long Type_t;
};
template<>
struct Promote<int, float> {
  typedef float Type_t;
};
template<>
struct Promote<int, double> {
  typedef double Type_t;
};
template<>
struct Promote<long, bool> {
  typedef long Type_t;
};
template<>
struct Promote<long, char> {
  typedef long Type_t;
};
template<>
struct Promote<long, short> {
  typedef long Type_t;
};
template<>
struct Promote<long, int> {
  typedef long Type_t;
};
template<>
struct Promote<long, long> {
  typedef long Type_t;
};
template<>
struct Promote<long, float> {
  typedef float Type_t;
};
template<>
struct Promote<long, double> {
  typedef double Type_t;
};
template<>
struct Promote<float, bool> {
  typedef float Type_t;
};
template<>
struct Promote<float, char> {
  typedef float Type_t;
};
template<>
struct Promote<float, short> {
  typedef float Type_t;
};
template<>
struct Promote<float, int> {
  typedef float Type_t;
};
template<>
struct Promote<float, long> {
  typedef float Type_t;
};
template<>
struct Promote<float, float> {
  typedef float Type_t;
};
template<>
struct Promote<float, double> {
  typedef double Type_t;
};
template<>
struct Promote<double, bool> {
  typedef double Type_t;
};
template<>
struct Promote<double, char> {
  typedef double Type_t;
};
template<>
struct Promote<double, short> {
  typedef double Type_t;
};
template<>
struct Promote<double, int> {
  typedef double Type_t;
};
template<>
struct Promote<double, long> {
  typedef double Type_t;
};
template<>
struct Promote<double, float> {
  typedef double Type_t;
};
template<>
struct Promote<double, double> {
  typedef double Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn {
  typedef typename Promote<T1, T2>::Type_t Type_t;
};
template<class T1, class T2, class T3, class Op>
struct TrinaryReturn {
  typedef typename BinaryReturn<T2, T3, Op>::Type_t Type_t;
};
template<class T>
struct Reference
{
  typedef T Type_t;
  inline
  Reference(const T &reference)
    : reference_m(reference)
  { }
  inline
  Reference(const Reference<T> &model)
    : reference_m(model.reference())
  { }
  inline
  const T &reference() const
  {
    return reference_m;
  }
  operator const T& () const { return reference_m; }
  operator T& () const { return const_cast<T&>(reference_m); }
  const T &reference_m;
};
template<class T>
struct DeReference
{
  typedef const T &Return_t;
  typedef T Type_t;
  static inline Return_t apply(const T &a) { return a; }
};
template<class T>
struct DeReference<Reference<T> >
{
  typedef const T &Return_t;
  typedef T Type_t;
  static inline Return_t apply(const Reference<T> &a) { return a.reference(); }
};
template<class Op, class Child>
class UnaryNode
{
public:
  inline
  typename DeReference<Child>::Return_t
  child() const { return DeReference<Child>::apply(child_m); }
  inline
  UnaryNode(const Child &c)
    : child_m(c) { }
  inline
  UnaryNode(const UnaryNode<Op, Child> &t)
    : child_m(t.child()) { }
  template<class OtherChild>
  inline
  UnaryNode(const UnaryNode<Op, OtherChild> &t)
    : child_m(t.child()) { }
  template<class OtherChild, class Arg>
  inline
  UnaryNode(const UnaryNode<Op, OtherChild> &t, const Arg &a)
    : child_m(t.child(), a) { }
  template<class OtherChild, class Arg1, class Arg2>
  inline
  UnaryNode(const UnaryNode<Op, OtherChild> &t,
     const Arg1 &a1, const Arg2 &a2)
    : child_m(t.child(), a1, a2)
    { }
private:
  Child child_m;
};
template<class Op, class Left, class Right>
class BinaryNode
{
public:
  inline
  typename DeReference<Left>::Return_t
  left() const { return DeReference<Left>::apply(left_m); }
  inline
  typename DeReference<Right>::Return_t
  right() const { return DeReference<Right>::apply(right_m); }
  inline
  BinaryNode(const Left &l, const Right &r)
    : left_m(l), right_m(r)
  { }
  inline
  BinaryNode(const BinaryNode<Op, Left, Right> &t)
    : left_m(t.left()), right_m(t.right())
  { }
  template<class OtherLeft, class OtherRight>
  inline
  BinaryNode(const BinaryNode<Op, OtherLeft, OtherRight> &t)
    : left_m(t.left()), right_m(t.right())
  { }
  template<class OtherLeft, class OtherRight, class Arg>
  inline
  BinaryNode(const BinaryNode<Op, OtherLeft, OtherRight> &t,
      const Arg &a)
    : left_m(t.left(), a), right_m(t.right(), a)
  { }
  template<class OtherLeft, class OtherRight, class Arg1, class Arg2>
  inline
  BinaryNode(const BinaryNode<Op, OtherLeft, OtherRight> &t,
      const Arg1 &a1, const Arg2 &a2)
    : left_m(t.left(), a1, a2), right_m(t.right(), a1, a2)
  { }
private:
  Left left_m;
  Right right_m;
};
template< class Op, class Left, class Middle, class Right>
class TrinaryNode
{
public:
  inline
  typename DeReference<Left>::Return_t
  left() const { return DeReference<Left>::apply(left_m); }
  inline
  typename DeReference<Right>::Return_t
  right() const { return DeReference<Right>::apply(right_m); }
  inline
  typename DeReference<Middle>::Return_t
  middle() const { return DeReference<Middle>::apply(middle_m); }
  inline
  TrinaryNode(const Left &l, const Middle &m, const Right &r)
    : left_m(l), middle_m(m), right_m(r)
  { }
  inline
  TrinaryNode(const TrinaryNode<Op, Left, Middle, Right> &t)
    : left_m(t.left()), middle_m(t.middle()), right_m(t.right())
  { }
  template<class OtherLeft, class OtherMiddle, class OtherRight>
  inline
  TrinaryNode(const TrinaryNode<Op, OtherLeft, OtherMiddle, OtherRight> & t)
    : left_m(t.left()), middle_m(t.middle()), right_m(t.right())
  { }
  template<class OtherLeft, class OtherMiddle, class OtherRight, class Arg>
  inline
  TrinaryNode(const TrinaryNode<Op, OtherLeft, OtherMiddle, OtherRight> &t,
       const Arg &a)
    : left_m(t.left(), a), middle_m(t.middle(), a), right_m(t.right(), a)
  { }
  template<class OtherLeft, class OtherMiddle, class OtherRight,
    class Arg1, class Arg2>
  inline
  TrinaryNode(const TrinaryNode<Op, OtherLeft, OtherMiddle, OtherRight> &t,
       const Arg1 &a1, const Arg2 &a2)
    : left_m(t.left(), a1, a2),
      middle_m(t.middle(), a1, a2) , right_m(t.right(), a1, a2)
  { }
private:
  Left left_m;
  Middle middle_m;
  Right right_m;
};
struct FnArcCos
{
 
  template<class T>
  inline typename UnaryReturn<T, FnArcCos >::Type_t
  operator()(const T &a) const
  {
    return (acos(a));
  }
};
struct FnArcSin
{
 
  template<class T>
  inline typename UnaryReturn<T, FnArcSin >::Type_t
  operator()(const T &a) const
  {
    return (asin(a));
  }
};
struct FnArcTan
{
 
  template<class T>
  inline typename UnaryReturn<T, FnArcTan >::Type_t
  operator()(const T &a) const
  {
    return (atan(a));
  }
};
struct FnCeil
{
 
  template<class T>
  inline typename UnaryReturn<T, FnCeil >::Type_t
  operator()(const T &a) const
  {
    return (ceil(a));
  }
};
struct FnCos
{
 
  template<class T>
  inline typename UnaryReturn<T, FnCos >::Type_t
  operator()(const T &a) const
  {
    return (cos(a));
  }
};
struct FnHypCos
{
 
  template<class T>
  inline typename UnaryReturn<T, FnHypCos >::Type_t
  operator()(const T &a) const
  {
    return (cosh(a));
  }
};
struct FnExp
{
 
  template<class T>
  inline typename UnaryReturn<T, FnExp >::Type_t
  operator()(const T &a) const
  {
    return (exp(a));
  }
};
struct FnFabs
{
 
  template<class T>
  inline typename UnaryReturn<T, FnFabs >::Type_t
  operator()(const T &a) const
  {
    return (fabs(a));
  }
};
struct FnFloor
{
 
  template<class T>
  inline typename UnaryReturn<T, FnFloor >::Type_t
  operator()(const T &a) const
  {
    return (floor(a));
  }
};
struct FnLog
{
 
  template<class T>
  inline typename UnaryReturn<T, FnLog >::Type_t
  operator()(const T &a) const
  {
    return (log(a));
  }
};
struct FnLog10
{
 
  template<class T>
  inline typename UnaryReturn<T, FnLog10 >::Type_t
  operator()(const T &a) const
  {
    return (log10(a));
  }
};
struct FnSin
{
 
  template<class T>
  inline typename UnaryReturn<T, FnSin >::Type_t
  operator()(const T &a) const
  {
    return (sin(a));
  }
};
struct FnHypSin
{
 
  template<class T>
  inline typename UnaryReturn<T, FnHypSin >::Type_t
  operator()(const T &a) const
  {
    return (sinh(a));
  }
};
struct FnSqrt
{
 
  template<class T>
  inline typename UnaryReturn<T, FnSqrt >::Type_t
  operator()(const T &a) const
  {
    return (sqrt(a));
  }
};
struct FnTan
{
 
  template<class T>
  inline typename UnaryReturn<T, FnTan >::Type_t
  operator()(const T &a) const
  {
    return (tan(a));
  }
};
struct FnHypTan
{
 
  template<class T>
  inline typename UnaryReturn<T, FnHypTan >::Type_t
  operator()(const T &a) const
  {
    return (tanh(a));
  }
};
struct OpUnaryMinus
{
 
  template<class T>
  inline typename UnaryReturn<T, OpUnaryMinus >::Type_t
  operator()(const T &a) const
  {
    return (-a);
  }
};
struct OpUnaryPlus
{
 
  template<class T>
  inline typename UnaryReturn<T, OpUnaryPlus >::Type_t
  operator()(const T &a) const
  {
    return (+a);
  }
};
struct OpBitwiseNot
{
 
  template<class T>
  inline typename UnaryReturn<T, OpBitwiseNot >::Type_t
  operator()(const T &a) const
  {
    return (~a);
  }
};
struct OpIdentity
{
 
  template<class T>
  inline typename UnaryReturn<T, OpIdentity >::Type_t
  operator()(const T &a) const
  {
    return (a);
  }
};
struct OpNot
{
 
  template<class T>
  inline typename UnaryReturn<T, OpNot >::Type_t
  operator()(const T &a) const
  {
    return (!a);
  }
};
template<class T >
struct UnaryReturn<T, OpNot > {
  typedef bool Type_t;
};
template <class T1>
struct OpCast
{
 
  template<class T2>
  inline UnaryReturn<T2, OpCast<T1> >
  operator()(const T2 &a) const
  {
    return T1(a);
  }
};
template<class T1, class T2>
struct UnaryReturn<T2, OpCast<T1> > {
  typedef T1 Type_t;
};
struct OpAdd
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpAdd >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a + b);
  }
};
struct OpSubtract
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpSubtract >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a - b);
  }
};
struct OpMultiply
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpMultiply >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a * b);
  }
};
struct OpDivide
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpDivide >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a / b);
  }
};
struct OpMod
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpMod >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a % b);
  }
};
struct OpBitwiseAnd
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseAnd >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a & b);
  }
};
struct OpBitwiseOr
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseOr >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a | b);
  }
};
struct OpBitwiseXor
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseXor >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a ^ b);
  }
};
struct FnLdexp
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnLdexp >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (ldexp(a,b));
  }
};
struct FnPow
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnPow >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (pow(a,b));
  }
};
struct FnFmod
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnFmod >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (fmod(a,b));
  }
};
struct FnArcTan2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnArcTan2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (atan2(a,b));
  }
};
struct OpLT
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLT >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a < b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLT > {
  typedef bool Type_t;
};
struct OpLE
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLE >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a <= b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLE > {
  typedef bool Type_t;
};
struct OpGT
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpGT >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a > b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpGT > {
  typedef bool Type_t;
};
struct OpGE
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpGE >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a >= b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpGE > {
  typedef bool Type_t;
};
struct OpEQ
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpEQ >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a == b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpEQ > {
  typedef bool Type_t;
};
struct OpNE
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpNE >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a != b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpNE > {
  typedef bool Type_t;
};
struct OpAnd
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpAnd >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a && b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpAnd > {
  typedef bool Type_t;
};
struct OpOr
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpOr >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a || b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpOr > {
  typedef bool Type_t;
};
struct OpLeftShift
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLeftShift >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a << b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLeftShift > {
  typedef T1 Type_t;
};
struct OpRightShift
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpRightShift >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a >> b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpRightShift > {
  typedef T1 Type_t;
};
struct OpAddAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpAddAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) += b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpAddAssign > {
  typedef T1 &Type_t;
};
struct OpSubtractAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpSubtractAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) -= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpSubtractAssign > {
  typedef T1 &Type_t;
};
struct OpMultiplyAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpMultiplyAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) *= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpMultiplyAssign > {
  typedef T1 &Type_t;
};
struct OpDivideAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpDivideAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) /= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpDivideAssign > {
  typedef T1 &Type_t;
};
struct OpModAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpModAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) %= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpModAssign > {
  typedef T1 &Type_t;
};
struct OpBitwiseOrAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseOrAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) |= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpBitwiseOrAssign > {
  typedef T1 &Type_t;
};
struct OpBitwiseAndAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseAndAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) &= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpBitwiseAndAssign > {
  typedef T1 &Type_t;
};
struct OpBitwiseXorAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpBitwiseXorAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) ^= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpBitwiseXorAssign > {
  typedef T1 &Type_t;
};
struct OpLeftShiftAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLeftShiftAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) <<= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLeftShiftAssign > {
  typedef T1 &Type_t;
};
struct OpRightShiftAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpRightShiftAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    (const_cast<T1 &>(a) >>= b); return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpRightShiftAssign > {
  typedef T1 &Type_t;
};
struct OpAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (const_cast<T1 &>(a) = b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpAssign > {
  typedef T1 &Type_t;
};
struct FnWhere
{
 
  template<class T1, class T2, class T3>
  inline typename TrinaryReturn<T1, T2, T3, FnWhere >
  ::Type_t
  operator()(T1 &a, const T2 &b, const T3 &c) const
  {
    if (a) return b; else return c;
  }
};
template<class LeafType, class LeafTag>
struct LeafFunctor
{ };
template<class LeafType, class LeafTag>
inline
typename LeafFunctor<LeafType, LeafTag>::Type_t
leafFunctor(const LeafType &leaf, const LeafTag &tag)
{
  return LeafFunctor<LeafType, LeafTag>::apply(leaf, tag);
}
struct EvalLeaf1
{
  int i1_m;
  inline EvalLeaf1(int i1) : i1_m(i1) { }
  inline int val1() const { return i1_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf1>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf1 &)
  {
    return s.value();
  }
};
struct EvalLeaf2
{
  int i1_m, i2_m;
  inline EvalLeaf2(int i1, int i2) : i1_m(i1), i2_m(i2) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf2>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf2 &)
  {
    return s.value();
  }
};
struct EvalLeaf3
{
  int i1_m, i2_m, i3_m;
  inline EvalLeaf3(int i1, int i2, int i3)
    : i1_m(i1), i2_m(i2), i3_m(i3) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf3>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf3 &)
  {
    return s.value();
  }
};
struct EvalLeaf4
{
  int i1_m, i2_m, i3_m, i4_m;
  inline EvalLeaf4(int i1, int i2, int i3, int i4)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf4>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf4 &)
  {
    return s.value();
  }
};
struct EvalLeaf5
{
  int i1_m, i2_m, i3_m, i4_m, i5_m;
  inline EvalLeaf5(int i1, int i2, int i3, int i4, int i5)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf5>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf5 &)
  {
    return s.value();
  }
};
struct EvalLeaf6
{
  int i1_m, i2_m, i3_m, i4_m, i5_m, i6_m;
  inline EvalLeaf6(int i1, int i2, int i3, int i4, int i5, int i6)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5), i6_m(i6) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
  inline int val6() const { return i6_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf6>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf6 &)
  {
    return s.value();
  }
};
struct EvalLeaf7
{
  int i1_m, i2_m, i3_m, i4_m, i5_m, i6_m, i7_m;
  inline EvalLeaf7(int i1, int i2, int i3, int i4, int i5, int i6,
    int i7)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5), i6_m(i6), i7_m(i7) { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
  inline int val6() const { return i6_m; }
  inline int val7() const { return i7_m; }
};
template<class T>
struct LeafFunctor<Scalar<T>, EvalLeaf7>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const EvalLeaf7 &)
  {
    return s.value();
  }
};
struct IncrementLeaf
{ };
template<class T>
struct LeafFunctor<T, IncrementLeaf>
{
  typedef int Type_t;
  inline static
  Type_t apply(const T &cl, const IncrementLeaf &)
  {
    T &l = const_cast<T &>(cl);
    ++l;
    return 0;
  }
};
template<class T>
struct LeafFunctor<Scalar<T>, IncrementLeaf>
{
  typedef int Type_t;
  inline static
  Type_t apply(const Scalar<T> &, const IncrementLeaf &)
  {
    return 0;
  }
};
struct DecrementLeaf
{ };
template<class T>
struct LeafFunctor<T, DecrementLeaf>
{
  typedef int Type_t;
  inline static
  Type_t apply(const T &cl, const DecrementLeaf &)
  {
    T &l = const_cast<T &>(cl);
    --l;
    return 0;
  }
};
template<class T>
struct LeafFunctor<Scalar<T>, DecrementLeaf>
{
  typedef int Type_t;
  inline static
  Type_t apply(const Scalar<T> &, const DecrementLeaf &)
  {
    return 0;
  }
};
struct DereferenceLeaf
{ };
template<class ForwardIterator>
struct LeafFunctor<ForwardIterator, DereferenceLeaf>
{
  typedef typename std::iterator_traits<ForwardIterator>::value_type Type_t;
  inline static
  Type_t apply(const ForwardIterator &i, const DereferenceLeaf &)
  {
    return *i;
  }
};
template<class T>
struct LeafFunctor<Scalar<T>, DereferenceLeaf>
{
  typedef T Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const DereferenceLeaf &)
  {
    return s.value();
  }
};
template<class A, class Op, class Tag>
struct Combine1
{
  typedef A Type_t;
  inline static
  Type_t combine(const A &a, const Tag &) { return a; }
};
template<class A, class B, class Op, class Tag>
struct Combine2
{
};
template<class A,class B,class C,class Op,class Tag>
struct Combine3
{
  typedef typename Combine2<A, B, Op, Tag>::Type_t Type1_t;
  typedef typename Combine2<Type1_t, C, Op, Tag>::Type_t Type_t;
  inline static
  Type_t combine(const A& a, const B& b, const C& c, const Tag& t)
  {
    return
      Combine2<Type1_t, C,
      Op, Tag>::combine(Combine2<A, B, Op, Tag>::combine(a,b,t),c,t);
  }
};
template<class A, class Op, class Tag>
inline typename Combine1<A, Op, Tag>::Type_t
peteCombine(const A &a, const Op &, const Tag &t)
{
  return Combine1<A, Op, Tag>::combine(a, t);
}
template<class A, class B, class Op, class Tag>
inline typename Combine2<A, B, Op, Tag>::Type_t
peteCombine(const A &a, const B &b, const Op &, const Tag &t)
{
  return Combine2<A, B, Op, Tag>::combine(a, b, t);
}
template<class A, class B, class C, class Op, class Tag>
inline typename Combine3<A, B, C, Op, Tag>::Type_t
peteCombine(const A &a, const B &b, const C &c, const Op &, const Tag &t)
{
  return Combine3<A, B, C, Op, Tag>::combine(a, b, c, t);
}
struct TreeCombine
{
 
};
template<class A, class Op>
struct Combine1<A, Op, TreeCombine >
{
  typedef UnaryNode<Op, A> Type_t;
  inline static
  Type_t combine(const A &a, const TreeCombine &t)
  {
    return Type_t(a);
  }
};
template<class A, class B, class Op>
struct Combine2<A, B, Op, TreeCombine >
{
  typedef BinaryNode<Op, A, B> Type_t;
  inline static
  Type_t combine(const A &a, const B &b, const TreeCombine &t)
  {
    return Type_t(a, b);
  }
};
template<class A, class B, class C, class Op>
struct Combine3<A, B, C, Op, TreeCombine >
{
  typedef TrinaryNode<Op, A, B, C> Type_t;
  inline static
  Type_t combine(const A &a, const B &b, const C &c, const TreeCombine &t)
  {
    return Type_t(a, b, c);
  }
};
struct OpCombine
{
 
};
template<class A,class Op>
struct Combine1<A, Op, OpCombine>
{
  typedef typename UnaryReturn<A, Op>::Type_t Type_t;
  inline static
  Type_t combine(A a, OpCombine) { return Op()(a); }
};
template<class A,class B,class Op>
struct Combine2<A, B, Op, OpCombine>
{
  typedef typename BinaryReturn<A, B, Op>::Type_t Type_t;
  inline static
  Type_t combine(A a, B b, OpCombine)
  {
    return Op()(a, b);
  }
};
template<class A,class B,class C,class Op>
struct Combine3<A, B, C, Op, OpCombine>
{
  typedef typename TrinaryReturn<A, B, C, Op>::Type_t Type_t;
  inline static
  Type_t combine(A a, B b, C c, OpCombine)
  {
    return Op()(a, b, c);
  }
};
struct AndCombine
{
 
};
template<class Op>
struct Combine2<bool, bool, Op, AndCombine>
{
  typedef bool Type_t;
  inline static
  Type_t combine(bool a, bool b, AndCombine)
  {
    return (a && b);
  }
};
struct OrCombine
{
 
};
template<class Op>
struct Combine2<bool, bool, Op, OrCombine>
{
  typedef bool Type_t;
  inline static
  Type_t combine(bool a, bool b, OrCombine)
  {
    return (a || b);
  }
};
struct NullCombine
{
 
};
template<class Op>
struct Combine2<int, int, Op, NullCombine>
{
  typedef int Type_t;
  inline static
  Type_t combine(int, int, NullCombine)
  {
    return 0;
  }
};
struct SumCombine
{
 
};
template<class Op>
struct Combine2<int, int, Op, SumCombine>
{
  typedef int Type_t;
  inline static
  Type_t combine(int a, int b, SumCombine)
  {
    return a + b;
  }
};
template<class Expr, class FTag, class CTag>
struct ForEach
{
  typedef typename LeafFunctor<Expr, FTag>::Type_t Type_t;
  inline static
  Type_t apply(const Expr &expr, const FTag &f, const CTag &)
  {
    return LeafFunctor<Expr, FTag>::apply(expr, f);
  }
};
template<class Expr, class FTag, class CTag>
inline typename ForEach<Expr,FTag,CTag>::Type_t
forEach(const Expr &e, const FTag &f, const CTag &c)
{
  return ForEach<Expr, FTag, CTag>::apply(e, f, c);
}
template<class Op, class A, class FTag, class CTag>
struct ForEach<UnaryNode<Op, A>, FTag, CTag>
{
  typedef typename ForEach<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename Combine1<TypeA_t, Op, CTag>::Type_t Type_t;
  inline static
  Type_t apply(const UnaryNode<Op, A> &expr, const FTag &f,
    const CTag &c)
  {
    return Combine1<TypeA_t, Op, CTag>::
      combine(ForEach<A, FTag, CTag>::apply(expr.child(), f, c), c);
  }
};
template<class Op, class A, class B, class FTag, class CTag>
struct ForEach<BinaryNode<Op, A, B>, FTag, CTag >
{
  typedef typename ForEach<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename ForEach<B, FTag, CTag>::Type_t TypeB_t;
  typedef typename Combine2<TypeA_t, TypeB_t, Op, CTag>::Type_t Type_t;
  inline static
  Type_t apply(const BinaryNode<Op, A, B> &expr, const FTag &f,
        const CTag &c)
  {
    return Combine2<TypeA_t, TypeB_t, Op, CTag>::
      combine(ForEach<A, FTag, CTag>::apply(expr.left(), f, c),
              ForEach<B, FTag, CTag>::apply(expr.right(), f, c),
       c);
  }
};
template<class Op, class A, class B, class C, class FTag, class CTag>
struct ForEach<TrinaryNode<Op, A, B, C>, FTag, CTag >
{
  typedef typename ForEach<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename ForEach<B, FTag, CTag>::Type_t TypeB_t;
  typedef typename ForEach<C, FTag, CTag>::Type_t TypeC_t;
  typedef typename Combine3<TypeA_t, TypeB_t, TypeC_t, Op, CTag>::Type_t
    Type_t;
  inline static
  Type_t apply(const TrinaryNode<Op, A, B, C> &expr, const FTag &f,
        const CTag &c)
  {
    return Combine3<TypeA_t, TypeB_t, TypeC_t, Op, CTag>::
      combine(ForEach<A, FTag, CTag>::apply(expr.left(), f, c),
       ForEach<B, FTag, CTag>::apply(expr.middle(), f, c),
       ForEach<C, FTag, CTag>::apply(expr.right(), f, c),
       c);
  }
};
template<class T> class Expression;
template<class T, class FTag, class CTag>
struct ForEach<Expression<T>, FTag, CTag>
{
  typedef typename ForEach<T, FTag, CTag>::Type_t Type_t;
  inline static
  Type_t apply(const Expression<T> &expr, const FTag &f,
        const CTag &c)
  {
    return ForEach<T, FTag, CTag>::apply(expr.expression(), f, c);
  }
};
template<class T> struct Reference;
template<class T, class FTag, class CTag>
struct ForEach<Reference<T>, FTag, CTag>
{
  typedef typename ForEach<T, FTag, CTag>::Type_t Type_t;
  inline static
  Type_t apply(const Reference<T> &ref, const FTag &f,
        const CTag &c)
  {
    return ForEach<T, FTag, CTag>::apply(ref.reference(), f, c);
  }
};
template<class T>
class Expression
{
public:
  typedef T Expression_t;
  Expression(const T& expr) : expr_m(expr)
  { }
  const Expression_t& expression() const
  {
    return expr_m;
  }
private:
  T expr_m;
};
template<class T>
struct CreateLeaf
{
  typedef Scalar<T> Leaf_t;
  inline static
  Leaf_t make(const T &a)
  {
    return Scalar<T>(a);
  }
};
template<class T>
struct CreateLeaf<Expression<T> >
{
  typedef typename Expression<T>::Expression_t Leaf_t;
  inline static
  const Leaf_t &make(const Expression<T> &a)
  {
    return a.expression();
  }
};
template<class T>
struct MakeReturn
{
  typedef Expression<T> Expression_t;
  inline static
  Expression_t make(const T &a) { return Expression_t(a); }
};
struct ErrorType
{
};
template<class Expr, class FTag, class CTag>
struct ForEachRef
{
  typedef typename LeafFunctor<Expr, FTag>::Type_t Type_t;
  inline static
  const Type_t &apply(const Expr &expr, const FTag &f, const CTag &)
    {
      return LeafFunctor<Expr, FTag>::apply(expr, f);
    }
};
template<class Expr, class FTag, class CTag>
inline const typename ForEachRef<Expr,FTag,CTag>::Type_t &
forEachRef(const Expr &e, const FTag &f, const CTag &c)
{
  return ForEachRef<Expr, FTag, CTag>::apply(e, f, c);
}
template<class Op, class A, class FTag, class CTag>
struct ForEachRef<UnaryNode<Op, A>, FTag, CTag>
{
  typedef typename ForEachRef<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename Combine1<TypeA_t, Op, CTag>::Type_t Type_t;
  inline static
  const Type_t &apply(const UnaryNode<Op, A> &expr, const FTag &f,
    const CTag &c)
    {
      return Combine1<TypeA_t, Op, CTag>::
        combine(ForEachRef<A, FTag, CTag>::apply(expr.child(), f, c),
                c);
    }
};
template<class Op, class A, class B, class FTag, class CTag>
struct ForEachRef<BinaryNode<Op, A, B>, FTag, CTag >
{
  typedef typename ForEachRef<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename ForEachRef<B, FTag, CTag>::Type_t TypeB_t;
  typedef typename Combine2<TypeA_t, TypeB_t, Op, CTag>::Type_t Type_t;
  inline static
  const Type_t &apply(const BinaryNode<Op, A, B> &expr, const FTag &f,
                   const CTag &c)
    {
      return Combine2<TypeA_t, TypeB_t, Op, CTag>::
        combine(ForEachRef<A, FTag, CTag>::apply(expr.left(), f, c),
                ForEachRef<B, FTag, CTag>::apply(expr.right(), f, c),
         c);
    }
};
template<class Op, class A, class B, class C, class FTag, class CTag>
struct ForEachRef<TrinaryNode<Op, A, B, C>, FTag, CTag >
{
  typedef typename ForEachRef<A, FTag, CTag>::Type_t TypeA_t;
  typedef typename ForEachRef<B, FTag, CTag>::Type_t TypeB_t;
  typedef typename ForEachRef<C, FTag, CTag>::Type_t TypeC_t;
  typedef typename Combine3<TypeA_t, TypeB_t, TypeC_t, Op, CTag>::Type_t
    Type_t;
  inline static
  const Type_t &apply(const TrinaryNode<Op, A, B, C> &expr, const FTag &f,
                   const CTag &c)
    {
      return Combine3<TypeA_t, TypeB_t, TypeC_t, Op, CTag>::
        combine(ForEachRef<A, FTag, CTag>::apply(expr.left(), f, c),
         ForEachRef<B, FTag, CTag>::apply(expr.middle(), f, c),
         ForEachRef<C, FTag, CTag>::apply(expr.right(), f, c),
         c);
    }
};
template<class T, class FTag, class CTag>
struct ForEachRef<Expression<T>, FTag, CTag>
{
  typedef typename ForEachRef<T, FTag, CTag>::Type_t Type_t;
  inline static
  const Type_t &apply(const Expression<T> &expr, const FTag &f,
                   const CTag &c)
    {
      return ForEachRef<T, FTag, CTag>::apply(expr.expression(), f, c);
    }
};
template<class T, class FTag, class CTag>
struct ForEachRef<Reference<T>, FTag, CTag>
{
  typedef typename ForEachRef<T, FTag, CTag>::Type_t Type_t;
  inline static
  const Type_t &apply(const Reference<T> &ref, const FTag &f,
                   const CTag &c)
    {
      return ForEachRef<T, FTag, CTag>::apply(ref.reference(), f, c);
    }
};
template<int Integer> class WrappedInt
{
public:
  enum { val = Integer };
 
};
template<int Dim, class T, class EngineTag> class Engine;
template<class Eng, class Tag>
struct EngineFunctorDefault
{ };
template<class Eng, class Tag>
struct EngineFunctor
{
  typedef typename EngineFunctorDefault<Eng,Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Eng &e, const Tag &t)
  {
    return EngineFunctorDefault<Eng,Tag>::apply(e,t);
  }
};
template<class Eng, class Tag>
inline typename EngineFunctor<Eng,Tag>::Type_t
engineFunctor(const Eng &e, const Tag &tag)
{
  return EngineFunctor<Eng,Tag>::apply(e,tag);
}
template<class T, class Tag>
struct EngineFunctorScalar
{ };
template<class Tag>
struct EngineView;
template<class Node, class Tag>
struct LeafFunctor<Node, EngineView<Tag> >
{
};
template<class T, class Tag>
struct LeafFunctor<Scalar<T>, EngineView<Tag> >
{
  typedef Scalar<T> Type_t;
  static inline
  Type_t apply(const Scalar<T> &s, const EngineView<Tag> &)
  {
    return s;
  }
};
template<class Engine, class Tag>
struct DefaultEngineView;
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Engine<Dim, T, E>, EngineView<Tag> >
{
  typedef Engine<Dim, T, E> Subject_t;
  typedef DefaultEngineView<Subject_t, Tag> EngineView_t;
  typedef typename EngineView_t::Type_t Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const EngineView<Tag> &tag)
  {
    return EngineView_t::apply(engine, tag);
  }
};
template<class Tag>
struct ExpressionApply
{
  inline
  ExpressionApply(const Tag &tag)
    : tag_m(tag)
  {
  }
  template<class A>
  void operator()(const A &a) const
  {
    forEach(a, *this, NullCombine());
  }
  const Tag &tag() const { return tag_m; }
  const Tag &tag_m;
};
template<class A, class Tag>
inline void
expressionApply(const A &a, const Tag &tag)
{
  forEach(a, ExpressionApply<Tag>(tag), NullCombine());
}
template<class Node, class Tag>
struct LeafFunctor<Node, ExpressionApply<Tag> >
{
};
template<class T, class Tag>
struct LeafFunctor<Scalar<T>, ExpressionApply<Tag> >
{
  typedef int Type_t;
  static inline
  Type_t apply(const Scalar<T> &, const ExpressionApply<Tag> &)
  {
    return 0;
  }
};
template<class Engine, class Tag>
struct DefaultExpressionApply;
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Engine<Dim, T, E>, ExpressionApply<Tag> >
{
  typedef Engine<Dim, T, E> Subject_t;
  typedef DefaultExpressionApply<Subject_t, Tag> ExpressionApply_t;
  typedef int Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const ExpressionApply<Tag> &tag)
  {
    return ExpressionApply_t::apply(engine, tag);
  }
};
namespace Pooma {
class NoInit
{
public:
 
};
}
template <class T> class DomainTraits;
template <class T>
struct SizeTypePromotion
{
  typedef T Type_t;
};
template <>
struct SizeTypePromotion<int>
{
  typedef long Type_t;
};
template <>
struct SizeTypePromotion<float>
{
  typedef double Type_t;
};
template <int I>
struct Dom1Initialize {
  template <class DT>
  static inline void apply(typename DT::Storage_t& s)
  {
    Dom1Initialize<I-1>::template apply<DT>(s);
    DomainTraits<typename DT::OneDomain_t>::initializeStorage(s[I].storage());
  }
};
template <>
struct Dom1Initialize<0> {
  template <class DT>
  static inline void apply(typename DT::Storage_t& s)
  {
    DomainTraits<typename DT::OneDomain_t>::initializeStorage(s[0].storage());
  }
};
template <class Domain>
struct WrapNoInit : public Domain
{
  WrapNoInit() : Domain(Pooma::NoInit()) {}
};
template<class DomT, class T, int Dim>
struct DomainTraitsDomain
{
  typedef typename SizeTypePromotion<T>::Type_t Size_t;
  typedef T Element_t;
  typedef DomT Domain_t;
  typedef DomT NewDomain1_t;
  enum { domain = true };
  enum { dimensions = Dim };
  static bool getIgnorable(const Domain_t &, int) { return false; }
};
template<class DomT, class T>
struct DomainTraitsDomain<DomT, T, 1>
{
  typedef typename SizeTypePromotion<T>::Type_t Size_t;
  typedef T Element_t;
  typedef DomT Domain_t;
  typedef DomT NewDomain1_t;
  enum { domain = true };
  enum { dimensions = 1 };
  inline
  static Element_t getFirst(const Domain_t &d) { return d.first(); }
  inline
  static Element_t getLast(const Domain_t &d) { return d.last(); }
  inline
  static Element_t getStride(const Domain_t &d) { return d.stride(); }
  inline
  static Size_t getLength(const Domain_t &d) { return d.length(); }
  inline
  static Size_t getSize(const Domain_t &d) { return d.size(); }
  inline
  static Element_t getMin(const Domain_t &d) { return d.min(); }
  inline
  static Element_t getMax(const Domain_t &d) { return d.max(); }
  inline
  static bool getEmpty(const Domain_t &d) { return d.empty(); }
  inline
  static int getLoop(const Domain_t &d) { return d.loop(); }
  inline
  static Element_t getElem(const Domain_t &d, int n) { return d.elem(n); }
  inline
  static bool getIgnorable(const Domain_t &, int) { return false; }
};
template<class DomT, class T, class NewDom1T>
struct DomainTraitsScalar
{
  typedef DomT Domain_t;
  typedef DomT OneDomain_t;
  typedef NewDom1T NewDomain1_t;
  typedef T PointDomain_t;
  typedef T Element_t;
  typedef int Size_t;
  enum { domain = false };
  enum { dimensions = 1,
  sliceDimensions = 0 };
  enum { loopAware = false };
  enum { singleValued = true };
  enum { unitStride = true };
  enum { wildcard = false };
  inline
  static OneDomain_t getDomain(T d, int) { return OneDomain_t(d); }
  inline
  static PointDomain_t getPointDomain(T d, int) { return d; }
  inline
  static Element_t getFirst(const Element_t &d) { return d; }
  inline
  static Element_t getLast(const Element_t &d) { return d; }
  inline
  static int getStride(const Element_t &) { return 1; }
  inline
  static Size_t getLength(const Element_t &) { return 1; }
  inline
  static Size_t getSize(const Element_t &d) { return 1; }
  inline
  static Element_t getMin(const Element_t &d) { return d; }
  inline
  static Element_t getMax(const Element_t &d) { return d; }
  inline
  static bool getEmpty(const Element_t &) { return false; }
  inline
  static int getLoop(const Element_t &) { return 0; }
  inline
  static Element_t getElem(const Element_t &d, int) { return d; }
};
template<class T>
struct DomainTraits : public DomainTraitsScalar<T, T, T>
{
  typedef DomainTraitsScalar<T, T, T> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::OneDomain_t OneDomain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef typename Base_t::PointDomain_t PointDomain_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Size_t Size_t;
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = Base_t::sliceDimensions };
  enum { loopAware = Base_t::loopAware };
  enum { singleValued = Base_t::singleValued };
  enum { unitStride = Base_t::unitStride };
  enum { wildcard = Base_t::wildcard };
};
template<class T, int Dim>
struct DomainChangeDim {
  typedef T OldType_t;
  typedef T NewType_t;
  enum { oldDim = Dim,
  newDim = Dim };
};
template <class Dom, class Storage, class T1, class T2>
inline void
setDomain(const Dom&, Storage& data, const T1& beg, const T2& end) {
  DomainTraits<Dom>::setDomain(data, beg, end);
}
template <int Dim> class Interval;
template <> class Interval<1>;
template <int Dim> class Loc;
template <> class Loc<1>;
template<>
struct DomainTraits<char>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<unsigned char>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<short>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<unsigned short>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<int>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<unsigned int>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<long>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<>
struct DomainTraits<unsigned long>
  : public DomainTraitsScalar<Interval<1>, int, Loc<1> > { };
template<class T1, class T2, bool strided>
struct ContainsDomainSingle {
  static bool contains(const T1 &a, const T2 &b) {
    return (a.min() <= b.min() && a.max() >= b.max());
  }
};
template<class T1, class T2>
struct ContainsDomainSingle<T1,T2,true> {
  static bool contains(const T1 &a, const T2 &b) {
    typedef typename DomainTraits<T1>::Element_t E1_t;
    typedef typename DomainTraits<T2>::Element_t E2_t;
    E1_t a0 = a.min();
    E1_t a1 = a.max();
    E1_t s = a.stride();
    E2_t b0 = b.min();
    E2_t b1 = b.max();
    E2_t t = b.stride();
    if (s < 0)
      s = -s;
    if (t < 0)
      t = -t;
    bool quicktest = (a0 <= b0 && a1 >= b1);
    if (!quicktest || s == 1)
      return quicktest;
    return (t % s == 0) && ((b0-a0) % s == 0) && ((a1-b1) % s == 0);
  }
};
template<class T1, class T2, int Dim>
struct ContainsDomain {
  enum { strided = !DomainTraits<T1>::unitStride };
  enum { n = Dim - 1 };
  static bool contains(const T1 &a, const T2 &b) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    return ContainsDomainSingle<Dom1_t,Dom2_t,strided>::contains(
      DomainTraits<T1>::getDomain(a,n), DomainTraits<T2>::getDomain(b,n)) &&
      ContainsDomain<T1,T2,n>::contains(a,b);
  }
};
template<class T1, class T2>
struct ContainsDomain<T1,T2,1> {
  enum { strided = !DomainTraits<T1>::unitStride };
  static bool contains(const T1 &a, const T2 &b) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    return ContainsDomainSingle<Dom1_t,Dom2_t,strided>::contains(
      DomainTraits<T1>::getDomain(a,0), DomainTraits<T2>::getDomain(b,0));
  }
};
template<class T1, class T2>
inline bool contains(const T1 &a, const T2 &b)
{
  PoomaCTAssert<((int)DomainTraits<T1>::dimensions == DomainTraits<T2>::dimensions)>::test();
  return ContainsDomain<T1,T2,DomainTraits<T1>::dimensions>::contains(a, b);
}
template<int Dim>
class Loc;
template<int Dim>
class Interval;
template<int Dim>
class Range;
template<class T>
class IndirectionList;
template<int Dim>
class Grid;
template<class T1,class T2 >
struct DomainArithOpsTraits
{
};
template <>
struct DomainArithOpsTraits< Loc<1> , Loc<1> >
{
  typedef Loc<1> AddResult_t;
  typedef Loc<1> SubResult_t;
  typedef Loc<1> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Loc<1> , Loc<Dim> >
{
  typedef Loc<Dim> AddResult_t;
  typedef Loc<Dim> SubResult_t;
  typedef Loc<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Loc<Dim> , Loc<1> >
{
  typedef Loc<Dim> AddResult_t;
  typedef Loc<Dim> SubResult_t;
  typedef Loc<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Loc<Dim> , Loc<Dim2> >
{
  typedef Loc<Dim> AddResult_t;
  typedef Loc<Dim> SubResult_t;
  typedef Loc<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Loc<1> , Interval<Dim> >
{
  typedef Interval<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Interval<Dim>, Loc<1> >
{
  typedef Interval<Dim> AddResult_t;
  typedef Interval<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Loc<Dim> , Interval<Dim2> >
{
  typedef Interval<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Interval<Dim>, Loc<Dim2> >
{
  typedef Interval<Dim> AddResult_t;
  typedef Interval<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Loc<1> , Range<Dim> >
{
  typedef Range<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Range<Dim>, Loc<1> >
{
  typedef Range<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Loc<Dim> , Range<Dim2> >
{
  typedef Range<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Range<Dim>, Loc<Dim2> >
{
  typedef Range<Dim> AddResult_t;
  typedef Range<Dim> SubResult_t;
  typedef Range<Dim> MultResult_t;
};
template< >
struct DomainArithOpsTraits<Loc<1> , IndirectionList<int> >
{
  typedef IndirectionList<int> AddResult_t;
  typedef IndirectionList<int> SubResult_t;
  typedef IndirectionList<int> MultResult_t;
};
template< >
struct DomainArithOpsTraits<IndirectionList<int>, Loc<1> >
{
  typedef IndirectionList<int> AddResult_t;
  typedef IndirectionList<int> SubResult_t;
  typedef IndirectionList<int> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Loc<1> , Grid<Dim> >
{
  typedef Grid<Dim> AddResult_t;
  typedef Grid<Dim> SubResult_t;
  typedef Grid<Dim> MultResult_t;
};
template<int Dim>
struct DomainArithOpsTraits<Grid<Dim>, Loc<1> >
{
  typedef Grid<Dim> AddResult_t;
  typedef Grid<Dim> SubResult_t;
  typedef Grid<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Loc<Dim> , Grid<Dim2> >
{
  typedef Grid<Dim> AddResult_t;
  typedef Grid<Dim> SubResult_t;
  typedef Grid<Dim> MultResult_t;
};
template<int Dim,int Dim2>
struct DomainArithOpsTraits<Grid<Dim>, Loc<Dim2> >
{
  typedef Grid<Dim> AddResult_t;
  typedef Grid<Dim> SubResult_t;
  typedef Grid<Dim> MultResult_t;
};
template <class Dom>
class DomainIterator
{
public:
  typedef DomainIterator<Dom> This_t;
  typedef Dom Domain_t;
  typedef typename Domain_t::AskDomain_t Value_t;
  typedef std::input_iterator_tag iterator_category;
  typedef Value_t value_type;
  typedef ptrdiff_t difference_type;
  typedef const Value_t* pointer;
  typedef const Value_t& reference;
  enum { dimensions = DomainTraits<Dom>::dimensions };
  DomainIterator(const Dom &d, int size = 0)
    : domain_m(d), loc_m(d.firsts()), index_m(domain_m.size()-size)
    {
      ;
      for (int i=0; i < dimensions; ++i)
 current_m[i] = 0;
    }
  DomainIterator(const This_t &model)
    : domain_m(model.domain_m), loc_m(model.loc_m), index_m(model.index_m)
    {
      ;
      for (int i=0; i < dimensions; ++i)
 current_m[i] = model.current_m[i];
    }
  DomainIterator()
    : index_m(0)
    {
      for (int i=0; i < dimensions; ++i)
 current_m[i] = 0;
    }
  inline const Value_t &operator*() const
    {
      ;
      return loc_m;
    }
  inline const Value_t *operator->() const
    {
      ;
      return &loc_m;
    }
  inline bool operator==(const This_t &rhs) const
    {
      return (index_m == rhs.index_m);
    }
  inline bool operator!=(const This_t &rhs) const
    {
      return (index_m != rhs.index_m);
    }
  bool done() const
    {
      return (index_m == 0);
    }
  This_t &operator=(const This_t &model)
    {
      index_m = model.index_m;
      domain_m = model.domain_m;
      loc_m = model.loc_m;
      for (int i=0; i < dimensions; ++i)
 current_m[i] = model.current_m[i];
      return *this;
    }
  This_t &operator++()
    {
      increment(WrappedInt<Domain_t::unitStride>());
      return *this;
    }
  This_t operator++(int)
    {
      DomainIterator<Dom> save(*this);
      increment(WrappedInt<Domain_t::unitStride>());
      return save;
    }
private:
  Domain_t domain_m;
  Value_t loc_m;
  int current_m[dimensions];
  int index_m;
  void increment(const WrappedInt<true>&)
    {
      ;
      --index_m;
      ++(current_m[0]);
      ++loc_m[0];
      if (__builtin_expect(current_m[0] < domain_m[0].length(), 1))
        return;
      for (int i = 1; i < dimensions; ++i)
 {
   current_m[i-1] = 0;
   loc_m[i-1] = domain_m[i-1].first();
   ++(current_m[i]);
   ++loc_m[i];
   if (__builtin_expect(current_m[i] < domain_m[i].length(), 1))
     return;
 }
    }
  void increment(const WrappedInt<false>&)
    {
      ;
      --index_m;
      ++(current_m[0]);
      if (__builtin_expect(current_m[0] < domain_m[0].length(), 1)) {
        loc_m[0] = domain_m[0](current_m[0]);
        return;
      }
      for (int i = 1; i < dimensions; ++i)
 {
   current_m[i-1] = 0;
   loc_m[i-1] = domain_m[i-1].first();
   ++(current_m[i]);
   if (__builtin_expect(current_m[i] < domain_m[i].length(), 1)) {
     loc_m[i] = domain_m[i](current_m[i]);
     return;
   }
 }
    }
};
template <class Dom>
class DomainBlockIterator
{
public:
  typedef DomainBlockIterator<Dom> This_t;
  typedef Dom Domain_t;
  typedef typename Domain_t::OneDomain_t OneDomain_t;
  typedef typename Domain_t::AskDomain_t Value_t;
  typedef typename Domain_t::BlockDomain_t Block_t;
  typedef typename Block_t::OneDomain_t OneBlock_t;
  typedef typename OneDomain_t::iterator iterator;
  typedef typename Domain_t::Element_t Element_t;
  enum { dimensions = DomainTraits<Dom>::dimensions };
  DomainBlockIterator()
    : index_m(-1)
    {
    }
  DomainBlockIterator(const Dom &d);
  DomainBlockIterator(const This_t &model);
  ~DomainBlockIterator()
    {
    }
  inline const Block_t &operator*() const
    {
      ;
      return block_m;
    }
  inline const Block_t *operator->() const
    {
      ;
      return block_m;
    }
  inline const Value_t &point() const
    {
      ;
      return loc_m;
    }
  inline int index() const
    {
      ;
      return index_m;
    }
  inline bool operator==(const This_t &rhs) const
    {
      if (done() || rhs.done())
 return (done() && rhs.done());
      else
 return (block_m == *rhs);
    }
  inline bool operator!=(const This_t &rhs) const
    {
      return !(operator==(rhs));
    }
  bool done() const
    {
      return (index_m < 0);
    }
  This_t &operator=(const This_t &model)
    {
      domain_m = model.domain_m;
      loc_m = model.loc_m;
      block_m = model.block_m;
      index_m = model.index_m;
      for (int i=0; i < dimensions; ++i)
 current_m[i] = model.current_m[i];
      return *this;
    }
  This_t &operator++()
    {
      increment();
      return *this;
    }
  This_t operator++(int)
    {
      This_t save(*this);
      increment();
      return save;
    }
private:
  Domain_t domain_m;
  iterator current_m[dimensions];
  Value_t loc_m;
  Block_t block_m;
  int index_m;
  void setDone()
    {
      index_m = (-1);
    }
  void increment();
};
template<class Dom>
DomainBlockIterator<Dom>::DomainBlockIterator(const Dom &d)
  : domain_m(d), loc_m(0), index_m(0)
{
  for (int i=0; i < dimensions; ++i)
    {
      if (d[i].begin() == d[i].end())
 {
   setDone();
   break;
 }
      else
 {
   current_m[i] = d[i].begin();
   iterator next = current_m[i];
   Element_t a, b;
   if (++next == d[i].end())
     {
       a = b = (*(current_m[i])).first();
     }
   else
     {
       a = (*(current_m[i])).first();
       b = (*next).first();
     }
   if (b < a)
     block_m[i] = OneBlock_t(b + 1, a);
   else if (b == a)
     block_m[i] = OneBlock_t(a, a);
   else
     block_m[i] = OneBlock_t(a, b - 1);
 }
    }
}
template<class Dom>
DomainBlockIterator<Dom>::DomainBlockIterator(const This_t &model)
  : domain_m(model.domain_m), loc_m(model.loc_m),
    block_m(model.block_m), index_m(model.index_m)
{
  for (int i=0; i < dimensions; ++i)
    current_m[i] = model.current_m[i];
}
template<class Dom>
void DomainBlockIterator<Dom>::increment()
{
  ;
  for (int i = 0; i < dimensions; ++i)
    {
      if (++(current_m[i]) == domain_m[i].end())
 {
   if (i >= dimensions-1)
     {
       setDone();
       break;
     }
 }
      else
 {
   iterator next = current_m[i];
   if (++next == domain_m[i].end())
     {
       if (i < dimensions-1)
  {
    current_m[i] = domain_m[i].begin();
    next = current_m[i];
    Element_t a, b;
    if (++next == domain_m[i].end())
      {
        a = b = (*(current_m[i])).first();
      }
    else
      {
        a = (*(current_m[i])).first();
        b = (*next).first();
      }
    if (b < a)
      block_m[i] = OneBlock_t(b + 1, a);
    else if (b == a)
      block_m[i] = OneBlock_t(a, a);
    else
      block_m[i] = OneBlock_t(a, b - 1);
    loc_m[i] = 0;
  }
       else
  {
    setDone();
    break;
  }
     }
   else
     {
       Element_t a = (*(current_m[i])).first();
       Element_t b = (*next).first();
       if (b < a)
  block_m[i] = OneBlock_t(b + 1, a);
       else
  block_m[i] = OneBlock_t(a, b - 1);
       loc_m[i] = loc_m[i].first() + 1;
       index_m++;
       break;
     }
 }
    }
}
template<class DT>
class DomainBase
{
public:
  typedef typename DT::Domain_t Domain_t;
  typedef typename DT::AskDomain_t AskDomain_t;
  typedef typename DT::MultResult_t MultResult_t;
  typedef typename DT::Storage_t Storage_t;
  typedef DomainIterator<Domain_t> const_iterator;
  typedef DomainIterator<Domain_t> iterator;
  typedef DomainBlockIterator<Domain_t> const_blockIterator;
  typedef DomainBlockIterator<Domain_t> blockIterator;
  inline
  DomainBase() {
    PoomaCTAssert<(DT::dimensions > 0)>::test();
    DT::initializeStorage(domain_m);
  }
  inline
  DomainBase(const Pooma::NoInit &) {
    PoomaCTAssert<(DT::dimensions > 0)>::test();
  }
  inline
  Domain_t &unwrap() { return *static_cast<Domain_t *>(this); }
  const Domain_t &unwrap() const {
    return *static_cast<const Domain_t *>(this);
  }
  inline
  AskDomain_t firsts() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].first();
    return retval;
  }
  inline
  AskDomain_t lasts() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].last();
    return retval;
  }
  inline
  AskDomain_t strides() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].stride();
    return retval;
  }
  inline
  AskDomain_t lengths() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].length();
    return retval;
  }
  inline
  AskDomain_t sizes() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].size();
    return retval;
  }
  inline
  AskDomain_t mins() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].min();
    return retval;
  }
  inline
  AskDomain_t maxes() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].max();
    return retval;
  }
  inline
  AskDomain_t loops() const {
    AskDomain_t retval = Pooma::NoInit();
    for (int i=0; i < DT::dimensions; ++i)
      retval[i] = unwrap()[i].loop();
    return retval;
  }
  Storage_t& storage() { return domain_m; }
  const Storage_t& storage() const { return domain_m; }
  MultResult_t operator-() const {
    return (MultResult_t(unwrap()) * (-1));
  }
  const_iterator begin() const { return const_iterator(unwrap()); }
  const_iterator end() const { return const_iterator(unwrap(),
           unwrap().size()); }
  const_blockIterator beginBlock() const{return const_blockIterator(unwrap());}
  const_blockIterator endBlock() const { return const_blockIterator(); }
  template<class Out>
  void print(Out &o) const;
protected:
  Storage_t domain_m;
private:
  DomainBase(const DomainBase<DT> &);
  void operator=(const DomainBase<DT> &);
};
template<class DT>
template<class Out>
void DomainBase<DT>::print(Out &o) const
{
  const Domain_t &d = unwrap();
  o << "[";
  for (int i=0; i < DT::dimensions; ++i) {
    o << d[i].first() << ":" << d[i].last() << ":" << d[i].stride();
    if (i < (DT::dimensions-1))
      o << ",";
  }
  o << "]";
}
template <class T1, class T2, bool SV>
struct DomPair {
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::AddResult_t
  add(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::AddResult_t
      retval(d1.unwrap());
    return (retval += d2.unwrap());
  }
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::SubResult_t
  sub(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::SubResult_t
      retval(d1.unwrap());
    return (retval -= d2.unwrap());
  }
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::MultResult_t
  mult(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::MultResult_t
      retval(d1.unwrap());
    return (retval *= d2.unwrap());
  }
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::MultResult_t
  div(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::MultResult_t
      retval(d1.unwrap());
    return (retval /= d2.unwrap());
  }
};
template <class T1, class T2>
struct DomPair<T1,T2,false> {
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::AddResult_t
  add(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::AddResult_t
      retval(d2.unwrap());
    return (retval += d1.unwrap());
  }
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::SubResult_t
  sub(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::SubResult_t
      retval(d2.unwrap());
    retval = -retval;
    return (retval += d1.unwrap());
  }
  static typename DomainArithOpsTraits<typename T1::Domain_t,
                                       typename T2::Domain_t>::MultResult_t
  mult(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
  {
    typename DomainArithOpsTraits<typename T1::Domain_t,
                                  typename T2::Domain_t>::MultResult_t
      retval(d2.unwrap());
    return (retval *= d1.unwrap());
  }
};
template<class T1, class T2>
inline typename DomainArithOpsTraits<typename T1::Domain_t,
                                     typename T2::Domain_t>::AddResult_t
operator+(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
{
  return DomPair<T1,T2,T2::singleValued>::add(d1,d2);
}
template<class T1, class T2>
inline typename DomainArithOpsTraits<typename T1::Domain_t,
                                     typename T2::Domain_t>::SubResult_t
operator-(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
{
  return DomPair<T1,T2,T2::singleValued>::sub(d1,d2);
}
template<class T1, class T2>
inline typename DomainArithOpsTraits<typename T1::Domain_t,
                                     typename T2::Domain_t>::MultResult_t
operator*(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
{
  return DomPair<T1,T2,T2::singleValued>::mult(d1,d2);
}
template<class T1, class T2>
inline typename DomainArithOpsTraits<typename T1::Domain_t,
                                     typename T2::Domain_t>::MultResult_t
operator/(const DomainBase<T1> &d1, const DomainBase<T2> &d2)
{
  return DomPair<T1,T2,T2::singleValued>::div(d1,d2);
}
template<class T> inline bool operator==(char d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(short d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(int d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(long d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(float d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); } template<class T> inline bool operator==(double d1, const DomainBase<T> &d2) { return (d2.unwrap() == d1); }
template<class T> inline bool operator!=(char d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(short d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(int d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(long d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(float d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); } template<class T> inline bool operator!=(double d1, const DomainBase<T> &d2) { return (d2.unwrap() != d1); }
template<class T> inline bool operator<(char d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(short d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(int d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(long d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(float d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); } template<class T> inline bool operator<(double d1, const DomainBase<T> &d2) { return (d2.unwrap() < d1); }
template<class T> inline bool operator>(char d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(short d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(int d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(long d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(float d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); } template<class T> inline bool operator>(double d1, const DomainBase<T> &d2) { return (d2.unwrap() > d1); }
template<class T> inline bool operator<=(char d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(short d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(int d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(long d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(float d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); } template<class T> inline bool operator<=(double d1, const DomainBase<T> &d2) { return (d2.unwrap() <= d1); }
template<class T> inline bool operator>=(char d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(unsigned char d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(short d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(unsigned short d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(int d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(unsigned int d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(long d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(unsigned long d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(float d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); } template<class T> inline bool operator>=(double d1, const DomainBase<T> &d2) { return (d2.unwrap() >= d1); }
template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, char d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(char d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, unsigned char d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(unsigned char d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, short d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(short d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, unsigned short d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(unsigned short d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, int d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(int d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, unsigned int d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(unsigned int d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, long d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(long d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, unsigned long d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(unsigned long d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, float d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(float d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); } template<class T> inline typename T::AddResult_t operator+(const DomainBase<T> &d1, double d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval += d2); } template<class T> inline typename T::AddResult_t operator+(double d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval += d1); }
template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, char d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(char d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, unsigned char d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(unsigned char d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, short d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(short d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, unsigned short d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(unsigned short d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, int d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(int d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, unsigned int d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(unsigned int d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, long d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(long d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, unsigned long d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(unsigned long d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, float d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(float d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); } template<class T> inline typename T::AddResult_t operator-(const DomainBase<T> &d1, double d2) { typename T::AddResult_t retval(d1.unwrap()); return (retval -= d2); } template<class T> inline typename T::AddResult_t operator-(double d1, const DomainBase<T> &d2) { typename T::AddResult_t retval(d2.unwrap()); return (retval -= d1); }
template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, char d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(char d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, unsigned char d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(unsigned char d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, short d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(short d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, unsigned short d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(unsigned short d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, int d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(int d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, unsigned int d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(unsigned int d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, long d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(long d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, unsigned long d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(unsigned long d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, float d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(float d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); } template<class T> inline typename T::MultResult_t operator*(const DomainBase<T> &d1, double d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval *= d2); } template<class T> inline typename T::MultResult_t operator*(double d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval *= d1); }
template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, char d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(char d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, unsigned char d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(unsigned char d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, short d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(short d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, unsigned short d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(unsigned short d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, int d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(int d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, unsigned int d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(unsigned int d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, long d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(long d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, unsigned long d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(unsigned long d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, float d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(float d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); } template<class T> inline typename T::MultResult_t operator/(const DomainBase<T> &d1, double d2) { typename T::MultResult_t retval(d1.unwrap()); return (retval /= d2); } template<class T> inline typename T::MultResult_t operator/(double d1, const DomainBase<T> &d2) { typename T::MultResult_t retval(d2.unwrap()); return (retval /= d1); }
template<class D, class V>
inline void DomainToVector(const D &dom, V &vec)
{
  for (int i=0; i < DomainTraits<D>::dimensions; ++i)
    vec(i) = dom[i].first();
}
template<class V, class D>
inline void VectorToDomain(const V &vec, D &dom)
{
  for (int i=0; i < DomainTraits<D>::dimensions; ++i)
    dom[i] = DomainTraits<D>::OneDomain_t(vec(i), vec(i));
}
template<class DT>
std::ostream& operator<<(std::ostream &o, const DomainBase<DT> &dbase)
{
  dbase.print(o);
  return o;
}
template <int Dim, int C>
struct DomainDelta;
template <int Dim, int C>
struct DomainDelta;
template<int Dim, class DT>
class Domain : public DomainBase<DT>
{
  typedef DomainBase<DT> Base_t;
public:
  typedef typename DT::Size_t Size_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename DT::OneDomain_t OneDomain_t;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename Base_t::blockIterator blockIterator;
  inline
  Domain() {
    PoomaCTAssert<(DT::dimensions == Dim && Dim > 0)>::test();
  }
  inline Domain(const Pooma::NoInit &d) : Base_t(d) {
    PoomaCTAssert<(DT::dimensions == Dim && Dim > 0)>::test();
  }
  inline
  ~Domain() { }
  inline
  const OneDomain_t &operator[](int d) const { return this->domain_m[d]; }
  inline
  OneDomain_t &operator[](int d) { return this->domain_m[d]; }
  inline
  Size_t size() const {
    Size_t sz = this->domain_m[0].size();
    for (int i = 1; i < Dim; i++)
      sz *= this->domain_m[i].size();
    return sz;
  }
  inline
  bool empty() const {
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i].empty())
        return true;
    return false;
  }
  inline
  bool initialized() const { return (!empty()); }
  template<class T>
  bool operator==(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] != DomainTraits<T>::getDomain(d2, i))
        return false;
    return true;
  }
  template<class T>
  bool operator<(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] >= DomainTraits<T>::getDomain(d2, i))
        return false;
    return true;
  }
  template<class T>
  bool operator!=(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] != DomainTraits<T>::getDomain(d2, i))
        return true;
    return false;
  }
  template<class T>
  bool operator>(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] <= DomainTraits<T>::getDomain(d2, i))
        return false;
    return true;
  }
  template<class T>
  bool operator<=(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] > DomainTraits<T>::getDomain(d2, i))
        return false;
    return true;
  }
  template<class T>
  bool operator>=(const T &d2) const {
    PoomaCTAssert<(Dim == DomainTraits<T>::dimensions)>::test();
    for (int i = 0; i < Dim; i++)
      if (this->domain_m[i] < DomainTraits<T>::getDomain(d2, i))
        return false;
    return true;
  }
  Domain_t &operator++() {
    for (int i=0; i<Dim; ++i)
      this->domain_m[i] += this->domain_m[i].stride();
    return this->unwrap();
  }
  Domain_t &operator--() {
    for (int i=0; i<Dim; ++i)
      this->domain_m[i] -= this->domain_m[i].stride();
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator+=(const T &d2)
  {
    PoomaCTAssert<(DomainTraits<T>::dimensions == Dim || DomainTraits<T>::dimensions == 1 || Dim == 1)>::test();
    int d = DomainTraits<T>::dimensions > Dim ?
      DomainTraits<T>::dimensions : Dim;
    for (int i = 0; i < d; i++)
      this->domain_m[i] += DomainTraits<T>::getPointDomain(d2, i);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator-=(const T &d2) {
    PoomaCTAssert<(DomainTraits<T>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == Dim || DomainTraits<T>::dimensions == 1)>::test();
    for (int i = 0; i < Dim; i++)
      this->domain_m[i] -= DomainTraits<T>::getPointDomain(d2, i);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator*=(const T &d2) {
    PoomaCTAssert<(DomainTraits<T>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == Dim || DomainTraits<T>::dimensions == 1)>::test();
    for (int i = 0; i < Dim; i++)
      this->domain_m[i] *= DomainTraits<T>::getPointDomain(d2, i);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator/=(const T &d2) {
    PoomaCTAssert<(DomainTraits<T>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == Dim || DomainTraits<T>::dimensions == 1)>::test();
    for (int i = 0; i < Dim; i++)
      this->domain_m[i] /= DomainTraits<T>::getPointDomain(d2, i);
    return this->unwrap();
  }
  template <int Dim2, int C>
  inline
  Domain_t &operator+=(const DomainDelta<Dim2, C>&)
  {
    if (C < Dim)
      this->domain_m[C] += 1;
    return this->unwrap();
  }
  template <int Dim2, int C>
  inline
  Domain_t &operator-=(const DomainDelta<Dim2, C>&)
  {
    if (C < Dim)
      this->domain_m[C] -= 1;
    return this->unwrap();
  }
private:
  Domain(const Domain<Dim,DT> &);
  void operator=(const Domain<Dim,DT> &);
};
template<class DT, class ST, class T, class UT, bool wildcard>
struct SetDomainFunctor
{
  inline
  static void setDomain(ST &domain, const T &newdom) {
    DT::setDomain(domain, newdom);
  }
  inline
  static void setWildcardDomain(ST &domain, const UT &, const T &newdom) {
    DT::setDomain(domain, newdom);
  }
};
template<class DT, class ST, class T, class UT>
struct SetDomainFunctor<DT, ST, T, UT, true>
{
  inline
  static void setDomain(ST &, const T &) { }
  inline
  static void setWildcardDomain(ST &domain, const UT &u, const T &newdom) {
    DT::setWildcardDomain(domain, u, newdom);
  }
};
template<class DT>
class Domain<1, DT> : public DomainBase<DT>
{
  typedef DomainBase<DT> Base_t;
public:
  typedef typename DT::Size_t Size_t;
  typedef typename DT::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::Storage_t Storage_t;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename Base_t::blockIterator blockIterator;
  inline
  Domain() { }
  inline
  Domain(const Pooma::NoInit &d) : Base_t(d) { }
  inline
  Domain_t &operator[](int) { return this->unwrap(); }
  inline
  const Domain_t &operator[](int) const { return this->unwrap(); }
  inline
  Element_t elem(int n) const { return DT::elem(this->domain_m, n); }
  inline
  Element_t operator()(int n) const { return DT::elem(this->domain_m, n); }
  inline
  Element_t first() const { return DT::first(this->domain_m); }
  inline
  Element_t last() const { return DT::last(this->domain_m); }
  inline
  Element_t stride() const { return DT::stride(this->domain_m); }
  inline
  Size_t length() const { return DT::length(this->domain_m); }
  inline
  Element_t min() const { return DT::min(this->domain_m); }
  inline
  Element_t max() const { return DT::max(this->domain_m); }
  inline
  Size_t size() const { return length(); }
  inline
  bool empty() const { return DT::empty(this->domain_m); }
  inline
  bool initialized() const { return (!empty()); }
  inline
  int loop() const { return DT::loop(this->domain_m); }
  template<class T>
  inline
  void setDomain(const T &newdom) {
    SetDomainFunctor<DT,Storage_t,T,T,DomainTraits<T>::wildcard>::
      setDomain(this->domain_m, newdom);
  }
  template<class UT, class T>
  inline
  void setWildcardDomain(const UT &u, const T &newdom) {
    SetDomainFunctor<DT,Storage_t,T,UT,DomainTraits<T>::wildcard>::
      setWildcardDomain(this->domain_m, u, newdom);
  }
  inline
  void setLoop(int newloop) { DT::setLoop(this->domain_m, newloop); }
  template<class T>
  bool operator==(const T &d2) const {
    return DT::isEqualTo(this->domain_m, d2);
  }
  template<class T>
  bool operator<(const T &d2) const {
    return DT::isLessThan(this->domain_m, d2);
  }
  template<class T>
  bool operator!=(const T &d2) const { return !(*this == d2); }
  template<class T>
  bool operator>(const T &d2) const { return !(*this < d2 || *this == d2); }
  template<class T>
  bool operator<=(const T &d2) const { return (*this < d2 || *this == d2); }
  template<class T>
  bool operator>=(const T &d2) const { return !(*this < d2); }
  Domain_t &operator++() {
    DT::addAccum(this->domain_m, DT::stride(this->domain_m));
    return this->unwrap();
  }
  Domain_t &operator--() {
    DT::subtractAccum(this->domain_m, DT::stride(this->domain_m));
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator+=(const T &d2) {
    DT::addAccum(this->domain_m, d2);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator-=(const T &d2) {
    DT::subtractAccum(this->domain_m, d2);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator*=(const T &d2) {
    DT::multiplyAccum(this->domain_m, d2);
    return this->unwrap();
  }
  template<class T>
  inline
  Domain_t &operator/=(const T &d2) {
    DT::divideAccum(this->domain_m, d2);
    return this->unwrap();
  }
  template <int Dim2, int C>
  inline
  Domain_t &operator+=(const DomainDelta<Dim2, C>&)
  {
    if (C == 0)
      DT::addAccum(this->domain_m, 1);
    return this->unwrap();
  }
  template <int Dim2, int C>
  inline
  Domain_t &operator-=(const DomainDelta<Dim2, C>&)
  {
    if (C == 0)
      DT::subtractAccum(this->domain_m, 1);
    return this->unwrap();
  }
private:
  Domain(const Domain<1,DT> &);
  void operator=(const Domain<1,DT> &);
};
template <int Dim> class Loc;
template <> class Loc<1>;
template <int Dim> class Interval;
template <> class Interval<1>;
template <int Dim> class Range;
template <> class Range<1>;
template<int Dim>
struct DomainTraits< Interval<Dim> >
  : public DomainTraitsDomain<Interval<Dim>, int, Dim>
{
  typedef DomainTraitsDomain<Interval<Dim>, int, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef Interval<1> OneDomain_t;
  typedef Interval<1> PointDomain_t;
  typedef Interval<Dim> BlockDomain_t;
  typedef Loc<Dim> AskDomain_t;
  typedef Interval<Dim> AddResult_t;
  typedef Range<Dim> MultResult_t;
  typedef WrapNoInit<OneDomain_t> Storage_t[Dim];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = Dim };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = true };
  enum { wildcard = false };
  inline
  static OneDomain_t &getDomain(Domain_t &d, int n) { return d[n]; }
  inline
  static const OneDomain_t &getDomain(const Domain_t &d,int n) { return d[n]; }
  inline
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  inline
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  inline
  static void initializeStorage(Storage_t &dom) {
    Dom1Initialize<Dim-1>::template apply<DomainTraits<Interval<Dim> > >(dom);
  }
};
template<>
struct DomainTraits< Interval<1> >
  : public DomainTraitsDomain<Interval<1>, int, 1>
{
  typedef Interval<1> OneDomain_t;
  typedef Interval<1> PointDomain_t;
  typedef Interval<1> BlockDomain_t;
  typedef Loc<1> AskDomain_t;
  typedef Interval<1> AddResult_t;
  typedef Range<1> MultResult_t;
  typedef Element_t Storage_t[2];
  enum { dimensions = 1,
         sliceDimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = true };
  enum { wildcard = false };
  inline
  static Element_t first(const Storage_t &d) { return d[0]; }
  inline
  static Element_t last(const Storage_t &d) { return d[0] + d[1] - 1; }
  inline
  static Element_t stride(const Storage_t &) { return 1; }
  inline
  static Element_t length(const Storage_t &d) { return d[1]; }
  inline
  static Element_t min(const Storage_t &d) { return d[0]; }
  inline
  static Element_t max(const Storage_t &d) { return d[0] + d[1] - 1; }
  inline
  static bool empty(const Storage_t &d) { return (d[1] < 1); }
  inline
  static int loop(const Storage_t &) { return 0; }
  inline
  static Element_t elem(const Storage_t &d, int n) { return d[0] + n; }
  inline
  static OneDomain_t &getDomain(Domain_t &d, int) { return d; }
  inline
  static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; }
  inline
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  inline
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  inline
  static void initializeStorage(Storage_t &dom) {
    dom[0] = 0;
    dom[1] = 0;
  }
  template<class T>
  inline
  static void setDomain(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    dom[0] = DomainTraits<T>::getFirst(newdom);
    dom[1] = DomainTraits<T>::getLength(newdom);
  }
  template<class T1, class T2>
  inline
  static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T2>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T1>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T2>::singleValued)>::test();
    dom[0] = begval;
    dom[1] = (endval - begval + 1);
    ;
  }
  inline
  static void setLoop(Storage_t &, int) { }
  template<class UT, class T>
  inline
  static void setWildcardDomain(Storage_t &dom, const UT &u, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::wildcard)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<UT>::dimensions == 1)>::test();
    dom[0] = newdom.first(u);
    dom[1] = newdom.length(u);
  }
  template<class T>
  static bool isLessThan(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    return (dom[1] < DomainTraits<T>::getLength(newdom) ||
     (dom[1] == DomainTraits<T>::getLength(newdom) &&
      (dom[0] < DomainTraits<T>::getFirst(newdom) ||
       (dom[0] == DomainTraits<T>::getFirst(newdom) &&
        DomainTraits<T>::getStride(newdom) > 1))));
  }
  template<class T>
  static bool isEqualTo(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    return ((dom[1] == 0 && DomainTraits<T>::getLength(newdom) == 0) ||
     (dom[0] == DomainTraits<T>::getFirst(newdom) &&
      dom[1] == DomainTraits<T>::getLength(newdom) &&
      DomainTraits<T>::getStride(newdom) == 1));
  }
  template<class T>
  inline
  static void addAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] += DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  inline
  static void subtractAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] -= DomainTraits<T>::getFirst(newdom);
  }
};
template<int Dim1, int Dim2>
struct DomainChangeDim<Interval<Dim1>, Dim2>
{
  typedef Interval<Dim1> OldType_t;
  typedef Interval<Dim2> NewType_t;
  enum { oldDim = Dim1,
  newDim = Dim2 };
};
template<int Dim> class Loc;
template<int Dim> class Interval;
template<int Dim> class Range;
template<int Dim> class Grid;
template<int Dim> class AllDomain;
template<int Dim> class LeftDomain;
template<int Dim> class RightDomain;
template<int Dim, int SliceDim> class SliceInterval;
template<int Dim, int SliceDim> class SliceRange;
template<int Dim, class T> class Region;
template<class T> class IndirectionList;
template<class RT, class CT, int DS>
struct CombineDomain {
  enum { DRT = DomainTraits<RT>::dimensions };
  enum { DCT = DomainTraits<CT>::dimensions };
  static void combine(RT &rt, const CT& ct) {
    PoomaCTAssert<(DS >= 0)>::test();
    PoomaCTAssert<(DRT > (DS + DCT - 1))>::test();
    for (int i=0; i < DCT; ++i)
      DomainTraits<RT>::getDomain(rt, DS + i).setDomain(
                         DomainTraits<CT>::getDomain(ct, i));
  }
};
template<class RT, class UT, class CT, int DS, int SliceDS,
         bool incl, bool wc>
struct CombineSliceDomainWC {
  enum { DRT = DomainTraits<RT>::dimensions };
  enum { DCT = DomainTraits<CT>::dimensions };
  static void combine(RT &rt, const UT &, const CT& ct) {
    PoomaCTAssert<(DS >= 0)>::test();
    PoomaCTAssert<(DRT > (DS + DCT - 1))>::test();
    for (int i=0; i < DCT; ++i)
      DomainTraits<RT>::getDomain(rt, DS + i).setDomain(
                         DomainTraits<CT>::getPointDomain(ct, i));
  }
};
template<class RT, class UT, class CT, int DS, int SliceDS>
struct CombineSliceDomainWC<RT,UT,CT,DS,SliceDS,true,false> {
  enum { DRT = DomainTraits<RT>::dimensions };
  enum { DCT = DomainTraits<CT>::dimensions };
  static void combine(RT &rt, const UT &, const CT& ct) {
    PoomaCTAssert<(DS >= 0 && SliceDS >= 0)>::test();
    PoomaCTAssert<(DRT > (DS + DCT - 1))>::test();
    for (int i=0; i < DCT; ++i) {
      DomainTraits<RT>::getDomain(rt, DS + i).setDomain(
 DomainTraits<CT>::getPointDomain(ct, i));
      DomainTraits<RT>::setIgnorable(rt, DS + i,
        DomainTraits<CT>::getIgnorable(ct, i));
    }
    rt.setSliceFromTotal();
  }
};
template<class RT, class UT, class CT, int DS, int SliceDS>
struct CombineSliceDomainWC<RT,UT,CT,DS,SliceDS,false,true> {
  enum { DRT = DomainTraits<RT>::dimensions };
  enum { DUT = DomainTraits<UT>::dimensions };
  enum { DCT = DomainTraits<CT>::dimensions };
  static void combine(RT &rt, const UT &u, const CT& ct) {
    PoomaCTAssert<(DS >= 0)>::test();
    PoomaCTAssert<(DRT > (DS + DCT - 1))>::test();
    PoomaCTAssert<(DUT == DRT)>::test();
    for (int i=0; i < DCT; ++i)
      DomainTraits<RT>::getDomain(rt, DS + i).setWildcardDomain(
 DomainTraits<UT>::getPointDomain(u, DS + i),
 DomainTraits<CT>::getPointDomain(ct, i));
  }
};
template<class RT, class UT, class CT, int DS, int SliceDS>
struct CombineSliceDomainWC<RT,UT,CT,DS,SliceDS,true,true> {
  enum { DRT = DomainTraits<RT>::dimensions };
  enum { DUT = DomainTraits<UT>::dimensions };
  enum { DCT = DomainTraits<CT>::dimensions };
  static void combine(RT &rt, const UT &u, const CT& ct) {
    PoomaCTAssert<(DS >= 0 && SliceDS >= 0)>::test();
    PoomaCTAssert<(DRT > (DS + DCT - 1))>::test();
    PoomaCTAssert<((int)DUT == DRT)>::test();
    for (int i=0; i < DCT; ++i) {
      DomainTraits<RT>::getDomain(rt, DS + i).setWildcardDomain(
 DomainTraits<UT>::getPointDomain(u, DS + i),
 DomainTraits<CT>::getPointDomain(ct, i));
      DomainTraits<RT>::getSliceDomain(rt, SliceDS + i).setWildcardDomain(
 DomainTraits<UT>::getPointDomain(u, DS + i),
 DomainTraits<CT>::getPointDomain(ct, i));
      DomainTraits<RT>::cantIgnoreDomain(rt, DS + i);
    }
  }
};
template<class RT, class UT, class CT, int DS, int SliceDS, bool incl>
struct CombineSliceDomain {
  static void combine(RT &rt, const UT &u, const CT& ct) {
    CombineSliceDomainWC<RT,UT,CT,DS,SliceDS,incl,
      DomainTraits<CT>::wildcard>::combine(rt, u, ct);
  }
};
template<class T1, class T2, class TCombine, class TSCombine>
struct NewDomain2Base
{
  typedef TCombine Type_t;
  typedef TSCombine SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a, b);
    }
  template<class RT>
  inline static RT &fill(RT &retval, const T1 &a, const T2 &b)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::
 combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::
 combine(retval,u,b);
      return retval;
    }
};
template<class T1, class T2>
struct AddNewDomain2Dimensions
{
  enum { dimensions =
    DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions };
};
template<class T1, class T2>
struct NewDomain2
  : public NewDomain2Base<T1, T2,
                          Interval<AddNewDomain2Dimensions<T1,T2>::dimensions>,
                          Loc<AddNewDomain2Dimensions<T1,T2>::dimensions> >
{ };
template <int D1, int D2> struct NewDomain2< Range<D1>, Range<D2> > : public NewDomain2Base< Range<D1>, Range<D2>, Range<D1+D2>, Range<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Range<D1>, Loc<D2> > : public NewDomain2Base< Range<D1>, Loc<D2>, Range<D1+D2>, SliceRange<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, Range<D1> > : public NewDomain2Base< Loc<D2>, Range<D1>, Range<D1+D2>, SliceRange<D1+D2,D1> > { }; template <int D> struct NewDomain2< Range<D>, char > : public NewDomain2Base< Range<D>, char, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< char, Range<D> > : public NewDomain2Base< char, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, unsigned char > : public NewDomain2Base< Range<D>, unsigned char, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, Range<D> > : public NewDomain2Base< unsigned char, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, short > : public NewDomain2Base< Range<D>, short, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< short, Range<D> > : public NewDomain2Base< short, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, unsigned short > : public NewDomain2Base< Range<D>, unsigned short, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, Range<D> > : public NewDomain2Base< unsigned short, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, int > : public NewDomain2Base< Range<D>, int, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< int, Range<D> > : public NewDomain2Base< int, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, unsigned int > : public NewDomain2Base< Range<D>, unsigned int, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, Range<D> > : public NewDomain2Base< unsigned int, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, long > : public NewDomain2Base< Range<D>, long, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< long, Range<D> > : public NewDomain2Base< long, Range<D>, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Range<D>, unsigned long > : public NewDomain2Base< Range<D>, unsigned long, Range<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, Range<D> > : public NewDomain2Base< unsigned long, Range<D>, Range<D+1>, SliceRange<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< Range<D1>, Interval<D2> > : public NewDomain2Base< Range<D1>, Interval<D2>, Range<D1+D2>, Range<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Interval<D1>, Range<D2> > : public NewDomain2Base< Interval<D1>, Range<D2>, Range<D1+D2>, Range<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Range<D1>, AllDomain<D2> > : public NewDomain2Base< Range<D1>, AllDomain<D2>, Range<D1+D2>, Range<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< AllDomain<D1>, Range<D2> > : public NewDomain2Base< AllDomain<D1>, Range<D2>, Range<D1+D2>, Range<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Range<D1>, LeftDomain<D2> > : public NewDomain2Base< Range<D1>, LeftDomain<D2>, Range<D1+D2>, Range<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, Range<D2> > : public NewDomain2Base< LeftDomain<D1>, Range<D2>, Range<D1+D2>, Range<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Range<D1>, RightDomain<D2> > : public NewDomain2Base< Range<D1>, RightDomain<D2>, Range<D1+D2>, Range<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, Range<D2> > : public NewDomain2Base< RightDomain<D1>, Range<D2>, Range<D1+D2>, Range<D1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, Loc<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, Loc<D2>, SliceRange<D1+D2,DS1>, SliceRange<D1+D2,DS1> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Loc<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< Loc<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1>, SliceRange<D1+D2,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, char > : public NewDomain2Base< SliceRange<D1,DS1>, char ,SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, unsigned char > : public NewDomain2Base< SliceRange<D1,DS1>, unsigned char, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< char, SliceRange<D1,DS1> > : public NewDomain2Base< char, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned char, SliceRange<D1,DS1> > : public NewDomain2Base< unsigned char, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, short > : public NewDomain2Base< SliceRange<D1,DS1>, short ,SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, unsigned short > : public NewDomain2Base< SliceRange<D1,DS1>, unsigned short, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< short, SliceRange<D1,DS1> > : public NewDomain2Base< short, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned short, SliceRange<D1,DS1> > : public NewDomain2Base< unsigned short, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, int > : public NewDomain2Base< SliceRange<D1,DS1>, int ,SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, unsigned int > : public NewDomain2Base< SliceRange<D1,DS1>, unsigned int, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< int, SliceRange<D1,DS1> > : public NewDomain2Base< int, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned int, SliceRange<D1,DS1> > : public NewDomain2Base< unsigned int, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, long > : public NewDomain2Base< SliceRange<D1,DS1>, long ,SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceRange<D1,DS1>, unsigned long > : public NewDomain2Base< SliceRange<D1,DS1>, unsigned long, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< long, SliceRange<D1,DS1> > : public NewDomain2Base< long, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned long, SliceRange<D1,DS1> > : public NewDomain2Base< unsigned long, SliceRange<D1,DS1>, SliceRange<D1+1,DS1>, SliceRange<D1+1,DS1> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, Range<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, Range<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Range<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< Range<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, Interval<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, Interval<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Interval<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< Interval<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, AllDomain<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, AllDomain<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< AllDomain<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< AllDomain<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, LeftDomain<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, LeftDomain<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< LeftDomain<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< LeftDomain<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceRange<D1,DS1>, RightDomain<D2> > : public NewDomain2Base< SliceRange<D1,DS1>, RightDomain<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< RightDomain<D2>, SliceRange<D1,DS1> > : public NewDomain2Base< RightDomain<D2>, SliceRange<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int D2> struct NewDomain2< Interval<D1>, Interval<D2> > : public NewDomain2Base< Interval<D1>, Interval<D2>, Interval<D1+D2>, Interval<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Interval<D1>, Loc<D2> > : public NewDomain2Base< Interval<D1>, Loc<D2>, Interval<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, Interval<D1> > : public NewDomain2Base< Loc<D2>, Interval<D1>, Interval<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D> struct NewDomain2< Interval<D>, char > : public NewDomain2Base< Interval<D>, char, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< char, Interval<D> > : public NewDomain2Base< char, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, unsigned char > : public NewDomain2Base< Interval<D>, unsigned char, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, Interval<D> > : public NewDomain2Base< unsigned char, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, short > : public NewDomain2Base< Interval<D>, short, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< short, Interval<D> > : public NewDomain2Base< short, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, unsigned short > : public NewDomain2Base< Interval<D>, unsigned short, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, Interval<D> > : public NewDomain2Base< unsigned short, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, int > : public NewDomain2Base< Interval<D>, int, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< int, Interval<D> > : public NewDomain2Base< int, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, unsigned int > : public NewDomain2Base< Interval<D>, unsigned int, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, Interval<D> > : public NewDomain2Base< unsigned int, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, long > : public NewDomain2Base< Interval<D>, long, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< long, Interval<D> > : public NewDomain2Base< long, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< Interval<D>, unsigned long > : public NewDomain2Base< Interval<D>, unsigned long, Interval<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, Interval<D> > : public NewDomain2Base< unsigned long, Interval<D>, Interval<D+1>, SliceInterval<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< Interval<D1>, AllDomain<D2> > : public NewDomain2Base< Interval<D1>, AllDomain<D2>, Interval<D1+D2>, Interval<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< AllDomain<D1>, Interval<D2> > : public NewDomain2Base< AllDomain<D1>, Interval<D2>, Interval<D1+D2>, Interval<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Interval<D1>, LeftDomain<D2> > : public NewDomain2Base< Interval<D1>, LeftDomain<D2>, Interval<D1+D2>, Interval<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, Interval<D2> > : public NewDomain2Base< LeftDomain<D1>, Interval<D2>, Interval<D1+D2>, Interval<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Interval<D1>, RightDomain<D2> > : public NewDomain2Base< Interval<D1>, RightDomain<D2>, Interval<D1+D2>, Interval<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, Interval<D2> > : public NewDomain2Base< RightDomain<D1>, Interval<D2>, Interval<D1+D2>, Interval<D1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, Loc<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, Loc<D2>, SliceInterval<D1+D2,DS1>, SliceInterval<D1+D2,DS1> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Loc<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< Loc<D2>, SliceInterval<D1,DS1>, SliceInterval<D1+D2,DS1>, SliceInterval<D1+D2,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, char > : public NewDomain2Base< SliceInterval<D1,DS1>, char ,SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, unsigned char > : public NewDomain2Base< SliceInterval<D1,DS1>, unsigned char, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< char, SliceInterval<D1,DS1> > : public NewDomain2Base< char, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned char, SliceInterval<D1,DS1> > : public NewDomain2Base< unsigned char, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, short > : public NewDomain2Base< SliceInterval<D1,DS1>, short ,SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, unsigned short > : public NewDomain2Base< SliceInterval<D1,DS1>, unsigned short, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< short, SliceInterval<D1,DS1> > : public NewDomain2Base< short, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned short, SliceInterval<D1,DS1> > : public NewDomain2Base< unsigned short, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, int > : public NewDomain2Base< SliceInterval<D1,DS1>, int ,SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, unsigned int > : public NewDomain2Base< SliceInterval<D1,DS1>, unsigned int, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< int, SliceInterval<D1,DS1> > : public NewDomain2Base< int, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned int, SliceInterval<D1,DS1> > : public NewDomain2Base< unsigned int, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, long > : public NewDomain2Base< SliceInterval<D1,DS1>, long ,SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< SliceInterval<D1,DS1>, unsigned long > : public NewDomain2Base< SliceInterval<D1,DS1>, unsigned long, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< long, SliceInterval<D1,DS1> > : public NewDomain2Base< long, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { }; template <int D1, int DS1> struct NewDomain2< unsigned long, SliceInterval<D1,DS1> > : public NewDomain2Base< unsigned long, SliceInterval<D1,DS1>, SliceInterval<D1+1,DS1>, SliceInterval<D1+1,DS1> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, Interval<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, Interval<D2>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Interval<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< Interval<D2>, SliceInterval<D1,DS1>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, Range<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, Range<D2>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< Range<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< Range<D2>, SliceInterval<D1,DS1>, SliceRange<D1+D2,DS1+D2>, SliceRange<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, AllDomain<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, AllDomain<D2>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< AllDomain<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< AllDomain<D2>, SliceInterval<D1,DS1>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, LeftDomain<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, LeftDomain<D2>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< LeftDomain<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< LeftDomain<D2>, SliceInterval<D1,DS1>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { };
template <int D1, int DS1, int D2> struct NewDomain2< SliceInterval<D1,DS1>, RightDomain<D2> > : public NewDomain2Base< SliceInterval<D1,DS1>, RightDomain<D2>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { }; template <int D1, int DS1, int D2> struct NewDomain2< RightDomain<D2>, SliceInterval<D1,DS1> > : public NewDomain2Base< RightDomain<D2>, SliceInterval<D1,DS1>, SliceInterval<D1+D2,DS1+D2>, SliceInterval<D1+D2,DS1+D2> > { };
template <int D1, int D2> struct NewDomain2< AllDomain<D1>, AllDomain<D2> > : public NewDomain2Base< AllDomain<D1>, AllDomain<D2>, AllDomain<D1+D2>, AllDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< AllDomain<D1>, Loc<D2> > : public NewDomain2Base< AllDomain<D1>, Loc<D2>, AllDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, AllDomain<D1> > : public NewDomain2Base< Loc<D2>, AllDomain<D1>, AllDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D> struct NewDomain2< AllDomain<D>, char > : public NewDomain2Base< AllDomain<D>, char, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< char, AllDomain<D> > : public NewDomain2Base< char, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, unsigned char > : public NewDomain2Base< AllDomain<D>, unsigned char, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, AllDomain<D> > : public NewDomain2Base< unsigned char, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, short > : public NewDomain2Base< AllDomain<D>, short, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< short, AllDomain<D> > : public NewDomain2Base< short, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, unsigned short > : public NewDomain2Base< AllDomain<D>, unsigned short, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, AllDomain<D> > : public NewDomain2Base< unsigned short, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, int > : public NewDomain2Base< AllDomain<D>, int, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< int, AllDomain<D> > : public NewDomain2Base< int, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, unsigned int > : public NewDomain2Base< AllDomain<D>, unsigned int, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, AllDomain<D> > : public NewDomain2Base< unsigned int, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, long > : public NewDomain2Base< AllDomain<D>, long, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< long, AllDomain<D> > : public NewDomain2Base< long, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< AllDomain<D>, unsigned long > : public NewDomain2Base< AllDomain<D>, unsigned long, AllDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, AllDomain<D> > : public NewDomain2Base< unsigned long, AllDomain<D>, AllDomain<D+1>, SliceInterval<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, LeftDomain<D2> > : public NewDomain2Base< LeftDomain<D1>, LeftDomain<D2>, LeftDomain<D1+D2>, LeftDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, Loc<D2> > : public NewDomain2Base< LeftDomain<D1>, Loc<D2>, LeftDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, LeftDomain<D1> > : public NewDomain2Base< Loc<D2>, LeftDomain<D1>, LeftDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D> struct NewDomain2< LeftDomain<D>, char > : public NewDomain2Base< LeftDomain<D>, char, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< char, LeftDomain<D> > : public NewDomain2Base< char, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, unsigned char > : public NewDomain2Base< LeftDomain<D>, unsigned char, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, LeftDomain<D> > : public NewDomain2Base< unsigned char, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, short > : public NewDomain2Base< LeftDomain<D>, short, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< short, LeftDomain<D> > : public NewDomain2Base< short, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, unsigned short > : public NewDomain2Base< LeftDomain<D>, unsigned short, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, LeftDomain<D> > : public NewDomain2Base< unsigned short, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, int > : public NewDomain2Base< LeftDomain<D>, int, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< int, LeftDomain<D> > : public NewDomain2Base< int, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, unsigned int > : public NewDomain2Base< LeftDomain<D>, unsigned int, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, LeftDomain<D> > : public NewDomain2Base< unsigned int, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, long > : public NewDomain2Base< LeftDomain<D>, long, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< long, LeftDomain<D> > : public NewDomain2Base< long, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< LeftDomain<D>, unsigned long > : public NewDomain2Base< LeftDomain<D>, unsigned long, LeftDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, LeftDomain<D> > : public NewDomain2Base< unsigned long, LeftDomain<D>, LeftDomain<D+1>, SliceInterval<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< RightDomain<D1>, RightDomain<D2> > : public NewDomain2Base< RightDomain<D1>, RightDomain<D2>, RightDomain<D1+D2>, RightDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, Loc<D2> > : public NewDomain2Base< RightDomain<D1>, Loc<D2>, RightDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, RightDomain<D1> > : public NewDomain2Base< Loc<D2>, RightDomain<D1>, RightDomain<D1+D2>, SliceInterval<D1+D2,D1> > { }; template <int D> struct NewDomain2< RightDomain<D>, char > : public NewDomain2Base< RightDomain<D>, char, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< char, RightDomain<D> > : public NewDomain2Base< char, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, unsigned char > : public NewDomain2Base< RightDomain<D>, unsigned char, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, RightDomain<D> > : public NewDomain2Base< unsigned char, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, short > : public NewDomain2Base< RightDomain<D>, short, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< short, RightDomain<D> > : public NewDomain2Base< short, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, unsigned short > : public NewDomain2Base< RightDomain<D>, unsigned short, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, RightDomain<D> > : public NewDomain2Base< unsigned short, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, int > : public NewDomain2Base< RightDomain<D>, int, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< int, RightDomain<D> > : public NewDomain2Base< int, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, unsigned int > : public NewDomain2Base< RightDomain<D>, unsigned int, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, RightDomain<D> > : public NewDomain2Base< unsigned int, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, long > : public NewDomain2Base< RightDomain<D>, long, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< long, RightDomain<D> > : public NewDomain2Base< long, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< RightDomain<D>, unsigned long > : public NewDomain2Base< RightDomain<D>, unsigned long, RightDomain<D+1>, SliceInterval<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, RightDomain<D> > : public NewDomain2Base< unsigned long, RightDomain<D>, RightDomain<D+1>, SliceInterval<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< AllDomain<D1>, LeftDomain<D2> > : public NewDomain2Base< AllDomain<D1>, LeftDomain<D2>, AllDomain<D1+D2>, AllDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, AllDomain<D2> > : public NewDomain2Base< LeftDomain<D1>, AllDomain<D2>, AllDomain<D1+D2>, AllDomain<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< AllDomain<D1>, RightDomain<D2> > : public NewDomain2Base< AllDomain<D1>, RightDomain<D2>, AllDomain<D1+D2>, AllDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, AllDomain<D2> > : public NewDomain2Base< RightDomain<D1>, AllDomain<D2>, AllDomain<D1+D2>, AllDomain<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, RightDomain<D2> > : public NewDomain2Base< LeftDomain<D1>, RightDomain<D2>, LeftDomain<D1+D2>, LeftDomain<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, LeftDomain<D2> > : public NewDomain2Base< RightDomain<D1>, LeftDomain<D2>, LeftDomain<D1+D2>, LeftDomain<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, Grid<D2> > : public NewDomain2Base< Grid<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Grid<D1>, Loc<D2> > : public NewDomain2Base< Grid<D1>, Loc<D2>, Grid<D1+D2>, SliceRange<D1+D2,D1> > { }; template <int D1, int D2> struct NewDomain2< Loc<D2>, Grid<D1> > : public NewDomain2Base< Loc<D2>, Grid<D1>, Grid<D1+D2>, SliceRange<D1+D2,D1> > { }; template <int D> struct NewDomain2< Grid<D>, char > : public NewDomain2Base< Grid<D>, char, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< char, Grid<D> > : public NewDomain2Base< char, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, unsigned char > : public NewDomain2Base< Grid<D>, unsigned char, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned char, Grid<D> > : public NewDomain2Base< unsigned char, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, short > : public NewDomain2Base< Grid<D>, short, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< short, Grid<D> > : public NewDomain2Base< short, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, unsigned short > : public NewDomain2Base< Grid<D>, unsigned short, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned short, Grid<D> > : public NewDomain2Base< unsigned short, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, int > : public NewDomain2Base< Grid<D>, int, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< int, Grid<D> > : public NewDomain2Base< int, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, unsigned int > : public NewDomain2Base< Grid<D>, unsigned int, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned int, Grid<D> > : public NewDomain2Base< unsigned int, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, long > : public NewDomain2Base< Grid<D>, long, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< long, Grid<D> > : public NewDomain2Base< long, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< Grid<D>, unsigned long > : public NewDomain2Base< Grid<D>, unsigned long, Grid<D+1>, SliceRange<D+1,D> > { }; template <int D> struct NewDomain2< unsigned long, Grid<D> > : public NewDomain2Base< unsigned long, Grid<D>, Grid<D+1>, SliceRange<D+1,D> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, Range<D2> > : public NewDomain2Base< Grid<D1>, Range<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Range<D1>, Grid<D2> > : public NewDomain2Base< Range<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, Interval<D2> > : public NewDomain2Base< Grid<D1>, Interval<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< Interval<D1>, Grid<D2> > : public NewDomain2Base< Interval<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, AllDomain<D2> > : public NewDomain2Base< Grid<D1>, AllDomain<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< AllDomain<D1>, Grid<D2> > : public NewDomain2Base< AllDomain<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, LeftDomain<D2> > : public NewDomain2Base< Grid<D1>, LeftDomain<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< LeftDomain<D1>, Grid<D2> > : public NewDomain2Base< LeftDomain<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { };
template <int D1, int D2> struct NewDomain2< Grid<D1>, RightDomain<D2> > : public NewDomain2Base< Grid<D1>, RightDomain<D2>, Grid<D1+D2>, Grid<D1+D2> > { }; template <int D1, int D2> struct NewDomain2< RightDomain<D1>, Grid<D2> > : public NewDomain2Base< RightDomain<D1>, Grid<D2>, Grid<D1+D2>, Grid<D1+D2> > { };
template<int D>
struct NewDomain2< Grid<D>, IndirectionList<int> >
  : public NewDomain2Base<Grid<D>,IndirectionList<int>,Grid<D+1>,Grid<D+1> >{};
template<int D>
struct NewDomain2< IndirectionList<int>, Grid<D> >
  : public NewDomain2Base<IndirectionList<int>,Grid<D>,Grid<D+1>,Grid<D+1> >{};
template<int D1, int D2>
struct NewDomain2< Loc<D1>, Loc<D2> >
  : public NewDomain2Base<Loc<D1>, Loc<D2>, Loc<D1+D2>, Loc<D1+D2> > { };
template <int D1, class T1, int D2, class T2> struct NewDomain2< Region<D1,T1>, Region<D2,T2> > : public NewDomain2Base< Region<D1,T1>, Region<D2,T2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, char > : public NewDomain2Base< Region<D1,T1>, char, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< char, Region<D1,T1> > : public NewDomain2Base< char, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, unsigned char > : public NewDomain2Base< Region<D1,T1>, unsigned char, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< unsigned char, Region<D1,T1> > : public NewDomain2Base< unsigned char, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, short > : public NewDomain2Base< Region<D1,T1>, short, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< short, Region<D1,T1> > : public NewDomain2Base< short, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, unsigned short > : public NewDomain2Base< Region<D1,T1>, unsigned short, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< unsigned short, Region<D1,T1> > : public NewDomain2Base< unsigned short, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, int > : public NewDomain2Base< Region<D1,T1>, int, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< int, Region<D1,T1> > : public NewDomain2Base< int, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, unsigned int > : public NewDomain2Base< Region<D1,T1>, unsigned int, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< unsigned int, Region<D1,T1> > : public NewDomain2Base< unsigned int, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, long > : public NewDomain2Base< Region<D1,T1>, long, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< long, Region<D1,T1> > : public NewDomain2Base< long, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, unsigned long > : public NewDomain2Base< Region<D1,T1>, unsigned long, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< unsigned long, Region<D1,T1> > : public NewDomain2Base< unsigned long, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, float > : public NewDomain2Base< Region<D1,T1>, float, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< float, Region<D1,T1> > : public NewDomain2Base< float, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1> struct NewDomain2< Region<D1,T1>, double > : public NewDomain2Base< Region<D1,T1>, double, Region<D1+1,T1>, Region<D1+1,T1> > { }; template <int D1, class T1> struct NewDomain2< double, Region<D1,T1> > : public NewDomain2Base< double, Region<D1,T1>, Region<D1+1,T1>, Region<D1+1,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, Range<D2> > : public NewDomain2Base< Region<D1,T1>, Range<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< Range<D2>, Region<D1,T1> > : public NewDomain2Base< Range<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, Interval<D2> > : public NewDomain2Base< Region<D1,T1>, Interval<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< Interval<D2>, Region<D1,T1> > : public NewDomain2Base< Interval<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, Loc<D2> > : public NewDomain2Base< Region<D1,T1>, Loc<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< Loc<D2>, Region<D1,T1> > : public NewDomain2Base< Loc<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, AllDomain<D2> > : public NewDomain2Base< Region<D1,T1>, AllDomain<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< AllDomain<D2>, Region<D1,T1> > : public NewDomain2Base< AllDomain<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, LeftDomain<D2> > : public NewDomain2Base< Region<D1,T1>, LeftDomain<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< LeftDomain<D2>, Region<D1,T1> > : public NewDomain2Base< LeftDomain<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <int D1, class T1, int D2> struct NewDomain2< Region<D1,T1>, RightDomain<D2> > : public NewDomain2Base< Region<D1,T1>, RightDomain<D2>, Region<D1+D2,T1>, Region<D1+D2,T1> > { }; template <int D1, class T1, int D2> struct NewDomain2< RightDomain<D2>, Region<D1,T1> > : public NewDomain2Base< RightDomain<D2>, Region<D1,T1>, Region<D1+D2,T1>, Region<D1+D2,T1> > { };
template <> struct NewDomain2<double, double> : public NewDomain2Base< double, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<float, float> : public NewDomain2Base< float, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<double, char> : public NewDomain2Base< double, char, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<char, double> : public NewDomain2Base< char, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, unsigned char> : public NewDomain2Base< double, unsigned char, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<unsigned char, double> : public NewDomain2Base< unsigned char, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, short> : public NewDomain2Base< double, short, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<short, double> : public NewDomain2Base< short, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, unsigned short> : public NewDomain2Base< double, unsigned short, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<unsigned short, double> : public NewDomain2Base< unsigned short, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, int> : public NewDomain2Base< double, int, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<int, double> : public NewDomain2Base< int, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, unsigned int> : public NewDomain2Base< double, unsigned int, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<unsigned int, double> : public NewDomain2Base< unsigned int, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, long> : public NewDomain2Base< double, long, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<long, double> : public NewDomain2Base< long, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, unsigned long> : public NewDomain2Base< double, unsigned long, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<unsigned long, double> : public NewDomain2Base< unsigned long, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<double, float> : public NewDomain2Base< double, float, Region<2,double>, Region<2,double> > { }; template <> struct NewDomain2<float, double> : public NewDomain2Base< float, double, Region<2,double>, Region<2,double> > { };
template <> struct NewDomain2<float, char> : public NewDomain2Base< float, char, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<char, float> : public NewDomain2Base< char, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, unsigned char> : public NewDomain2Base< float, unsigned char, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<unsigned char, float> : public NewDomain2Base< unsigned char, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, short> : public NewDomain2Base< float, short, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<short, float> : public NewDomain2Base< short, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, unsigned short> : public NewDomain2Base< float, unsigned short, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<unsigned short, float> : public NewDomain2Base< unsigned short, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, int> : public NewDomain2Base< float, int, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<int, float> : public NewDomain2Base< int, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, unsigned int> : public NewDomain2Base< float, unsigned int, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<unsigned int, float> : public NewDomain2Base< unsigned int, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, long> : public NewDomain2Base< float, long, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<long, float> : public NewDomain2Base< long, float, Region<2,float>, Region<2,float> > { };
template <> struct NewDomain2<float, unsigned long> : public NewDomain2Base< float, unsigned long, Region<2,float>, Region<2,float> > { }; template <> struct NewDomain2<unsigned long, float> : public NewDomain2Base< unsigned long, float, Region<2,float>, Region<2,float> > { };
template <int D1> struct NewDomain2< double, Loc<D1> > : public NewDomain2Base< double, Loc<D1>, Region<D1+1,double>, Region<D1+1,double> > { }; template <int D1> struct NewDomain2< Loc<D1>, double > : public NewDomain2Base< Loc<D1>, double, Region<D1+1,double>, Region<D1+1,double> > { };
template <int D1> struct NewDomain2< double, Interval<D1> > : public NewDomain2Base< double, Interval<D1>, Region<D1+1,double>, Region<D1+1,double> > { }; template <int D1> struct NewDomain2< Interval<D1>, double > : public NewDomain2Base< Interval<D1>, double, Region<D1+1,double>, Region<D1+1,double> > { };
template <int D1> struct NewDomain2< double, Range<D1> > : public NewDomain2Base< double, Range<D1>, Region<D1+1,double>, Region<D1+1,double> > { }; template <int D1> struct NewDomain2< Range<D1>, double > : public NewDomain2Base< Range<D1>, double, Region<D1+1,double>, Region<D1+1,double> > { };
template <int D1> struct NewDomain2< float, Loc<D1> > : public NewDomain2Base< float, Loc<D1>, Region<D1+1,float>, Region<D1+1,float> > { }; template <int D1> struct NewDomain2< Loc<D1>, float > : public NewDomain2Base< Loc<D1>, float, Region<D1+1,float>, Region<D1+1,float> > { };
template <int D1> struct NewDomain2< float, Interval<D1> > : public NewDomain2Base< float, Interval<D1>, Region<D1+1,float>, Region<D1+1,float> > { }; template <int D1> struct NewDomain2< Interval<D1>, float > : public NewDomain2Base< Interval<D1>, float, Region<D1+1,float>, Region<D1+1,float> > { };
template <int D1> struct NewDomain2< float, Range<D1> > : public NewDomain2Base< float, Range<D1>, Region<D1+1,float>, Region<D1+1,float> > { }; template <int D1> struct NewDomain2< Range<D1>, float > : public NewDomain2Base< Range<D1>, float, Region<D1+1,float>, Region<D1+1,float> > { };
template<class ND, class T>
struct NewDomainNBase
{
  typedef typename ND::Type_t PrevType_t;
  typedef typename ND::SliceType_t PrevSliceType_t;
  typedef typename NewDomain2<PrevType_t,T>::Type_t Type_t;
  typedef typename NewDomain2<PrevSliceType_t,T>::SliceType_t SliceType_t;
};
template<class T1>
struct NewDomain1
{
  typedef typename DomainTraits<T1>::Domain_t Type_t;
  typedef typename DomainTraits<T1>::NewDomain1_t SliceType_t;
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  inline static Type_t combine(const T1 &a)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a);
    }
  template<class RT>
  inline static RT &fill(RT &retval, const T1 &a)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u, const T1 &a)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      return retval;
    }
};
template<class T1, class T2, class T3>
struct NewDomain3 : public NewDomainNBase<NewDomain2<T1,T2>, T3>
{
  typedef typename NewDomainNBase<NewDomain2<T1,T2>, T3>::Type_t Type_t;
  typedef typename NewDomainNBase<NewDomain2<T1,T2>, T3>::SliceType_t SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { S3 = S2 + DomainTraits<T2>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  enum { DX3 = DomainTraits<T3>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b, const T3 &c)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a, b, c);
    }
  template<class RT>
  inline static RT &fill(RT &retval,
    const T1 &a, const T2 &b, const T3 &c)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      CombineDomain<RT,T3,S3>::combine(retval,c);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b, const T3 &c)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b, c);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b, const T3 &c)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::combine(retval,u,b);
      CombineSliceDomain<RT,UT,T3,S3,DX1+DX2,(DX3>0 && RDX)>::
        combine(retval,u,c);
      return retval;
    }
};
template<class T1, class T2, class T3, class T4>
struct NewDomain4 : public NewDomainNBase<NewDomain3<T1,T2,T3>, T4>
{
  typedef typename NewDomainNBase<NewDomain3<T1,T2,T3>, T4>::Type_t Type_t;
  typedef typename NewDomainNBase<NewDomain3<T1,T2,T3>, T4>::SliceType_t
    SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { S3 = S2 + DomainTraits<T2>::dimensions };
  enum { S4 = S3 + DomainTraits<T3>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  enum { DX3 = DomainTraits<T3>::sliceDimensions };
  enum { DX4 = DomainTraits<T4>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b, const T3 &c,
          const T4 &d)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a, b, c, d);
    }
  template<class RT>
  inline static RT &fill(RT &retval,
    const T1 &a, const T2 &b, const T3 &c,
    const T4 &d)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      CombineDomain<RT,T3,S3>::combine(retval,c);
      CombineDomain<RT,T4,S4>::combine(retval,d);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b, const T3 &c,
      const T4 &d)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b, c, d);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b, const T3 &c,
         const T4 &d)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::combine(retval,u,b);
      CombineSliceDomain<RT,UT,T3,S3,DX1+DX2,(DX3>0 && RDX)>::
        combine(retval,u,c);
      CombineSliceDomain<RT,UT,T4,S4,DX1+DX2+DX3,(DX4>0 && RDX)>::
        combine(retval,u,d);
      return retval;
    }
};
template<class T1, class T2, class T3, class T4, class T5>
struct NewDomain5 : public NewDomainNBase<NewDomain4<T1,T2,T3,T4>, T5>
{
  typedef typename NewDomainNBase<NewDomain4<T1,T2,T3,T4>, T5>::Type_t Type_t;
  typedef typename NewDomainNBase<NewDomain4<T1,T2,T3,T4>, T5>::SliceType_t
    SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { S3 = S2 + DomainTraits<T2>::dimensions };
  enum { S4 = S3 + DomainTraits<T3>::dimensions };
  enum { S5 = S4 + DomainTraits<T4>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  enum { DX3 = DomainTraits<T3>::sliceDimensions };
  enum { DX4 = DomainTraits<T4>::sliceDimensions };
  enum { DX5 = DomainTraits<T5>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b, const T3 &c,
          const T4 &d, const T5 &e)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a, b, c, d, e);
    }
  template<class RT>
  inline static RT &fill(RT &retval,
    const T1 &a, const T2 &b, const T3 &c,
    const T4 &d, const T5 &e)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      CombineDomain<RT,T3,S3>::combine(retval,c);
      CombineDomain<RT,T4,S4>::combine(retval,d);
      CombineDomain<RT,T5,S5>::combine(retval,e);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b, const T3 &c,
      const T4 &d, const T5 &e)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b, c, d, e);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b, const T3 &c,
         const T4 &d, const T5 &e)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::combine(retval,u,b);
      CombineSliceDomain<RT,UT,T3,S3,DX1+DX2,(DX3>0 && RDX)>::
        combine(retval,u,c);
      CombineSliceDomain<RT,UT,T4,S4,DX1+DX2+DX3,(DX4>0 && RDX)>::
        combine(retval,u,d);
      CombineSliceDomain<RT,UT,T5,S5,DX1+DX2+DX3+DX4,(DX5>0 && RDX)>::
        combine(retval,u,e);
      return retval;
    }
};
template<class T1, class T2, class T3, class T4, class T5, class T6>
struct NewDomain6 : public NewDomainNBase<NewDomain5<T1,T2,T3,T4,T5>, T6>
{
  typedef typename
    NewDomainNBase<NewDomain5<T1,T2,T3,T4,T5>, T6>::Type_t Type_t;
  typedef typename
    NewDomainNBase<NewDomain5<T1,T2,T3,T4,T5>, T6>::SliceType_t SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { S3 = S2 + DomainTraits<T2>::dimensions };
  enum { S4 = S3 + DomainTraits<T3>::dimensions };
  enum { S5 = S4 + DomainTraits<T4>::dimensions };
  enum { S6 = S5 + DomainTraits<T5>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  enum { DX3 = DomainTraits<T3>::sliceDimensions };
  enum { DX4 = DomainTraits<T4>::sliceDimensions };
  enum { DX5 = DomainTraits<T5>::sliceDimensions };
  enum { DX6 = DomainTraits<T6>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b,
          const T3 &c, const T4 &d,
          const T5 &e, const T6 &f)
    {
      Type_t retval = Pooma::NoInit();
      return fill(retval, a, b, c, d, e, f);
    }
  template<class RT>
  inline static RT &fill(RT &retval,
    const T1 &a, const T2 &b,
    const T3 &c, const T4 &d,
    const T5 &e, const T6 &f)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      CombineDomain<RT,T3,S3>::combine(retval,c);
      CombineDomain<RT,T4,S4>::combine(retval,d);
      CombineDomain<RT,T5,S5>::combine(retval,e);
      CombineDomain<RT,T6,S6>::combine(retval,f);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b,
      const T3 &c, const T4 &d,
      const T5 &e, const T6 &f)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b, c, d, e, f);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b, const T3 &c,
         const T4 &d, const T5 &e, const T6 &f)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::combine(retval,u,b);
      CombineSliceDomain<RT,UT,T3,S3,DX1+DX2,(DX3>0 && RDX)>::
        combine(retval,u,c);
      CombineSliceDomain<RT,UT,T4,S4,DX1+DX2+DX3,(DX4>0 && RDX)>::
        combine(retval,u,d);
      CombineSliceDomain<RT,UT,T5,S5,DX1+DX2+DX3+DX4,(DX5>0 && RDX)>::
        combine(retval,u,e);
      CombineSliceDomain<RT,UT,T6,S6,DX1+DX2+DX3+DX4+DX5,(DX6>0 && RDX)>::
        combine(retval,u,f);
      return retval;
    }
};
template<class T1, class T2, class T3, class T4, class T5, class T6, class T7>
struct NewDomain7 : public NewDomainNBase<NewDomain6<T1,T2,T3,T4,T5,T6>, T7>
{
  typedef typename
    NewDomainNBase<NewDomain6<T1,T2,T3,T4,T5,T6>, T7>::Type_t Type_t;
  typedef typename
    NewDomainNBase<NewDomain6<T1,T2,T3,T4,T5,T6>, T7>::SliceType_t SliceType_t;
  enum { S2 = DomainTraits<T1>::dimensions };
  enum { S3 = S2 + DomainTraits<T2>::dimensions };
  enum { S4 = S3 + DomainTraits<T3>::dimensions };
  enum { S5 = S4 + DomainTraits<T4>::dimensions };
  enum { S6 = S5 + DomainTraits<T5>::dimensions };
  enum { S7 = S6 + DomainTraits<T6>::dimensions };
  enum { DX1 = DomainTraits<T1>::sliceDimensions };
  enum { DX2 = DomainTraits<T2>::sliceDimensions };
  enum { DX3 = DomainTraits<T3>::sliceDimensions };
  enum { DX4 = DomainTraits<T4>::sliceDimensions };
  enum { DX5 = DomainTraits<T5>::sliceDimensions };
  enum { DX6 = DomainTraits<T6>::sliceDimensions };
  enum { DX7 = DomainTraits<T7>::sliceDimensions };
  inline static Type_t combine(const T1 &a, const T2 &b,
          const T3 &c, const T4 &d,
          const T5 &e, const T6 &f,
          const T7 &g)
    {
      Type_t retval = Pooma::NoInit();
      NewDomain7<T1,T2,T3,T4,T5,T6,T7>::fill(retval, a, b, c, d, e, f, g);
      return fill(retval, a, b, c, d, e, f,g);
    }
  template<class RT>
  inline static RT &fill(RT &retval,
    const T1 &a, const T2 &b,
    const T3 &c, const T4 &d,
    const T5 &e, const T6 &f,
    const T7 &g)
    {
      CombineDomain<RT,T1,0>::combine(retval,a);
      CombineDomain<RT,T2,S2>::combine(retval,b);
      CombineDomain<RT,T3,S3>::combine(retval,c);
      CombineDomain<RT,T4,S4>::combine(retval,d);
      CombineDomain<RT,T5,S5>::combine(retval,e);
      CombineDomain<RT,T6,S6>::combine(retval,f);
      CombineDomain<RT,T7,S7>::combine(retval,g);
      return retval;
    }
  template<class UT>
  inline static SliceType_t combineSlice(const UT &u,
      const T1 &a, const T2 &b,
      const T3 &c, const T4 &d,
      const T5 &e, const T6 &f,
      const T7 &g)
    {
      SliceType_t retval = Pooma::NoInit();
      return fillSlice(retval, u, a, b, c, d, e, f, g);
    }
  template<class RT, class UT>
  inline static RT &fillSlice(RT &retval, const UT &u,
         const T1 &a, const T2 &b,
         const T3 &c, const T4 &d,
         const T5 &e, const T6 &f,
         const T7 &g)
    {
      enum { RDX =
        DomainTraits<RT>::dimensions > DomainTraits<RT>::sliceDimensions };
      CombineSliceDomain<RT,UT,T1,0,0,(DX1>0 && RDX)>::combine(retval,u,a);
      CombineSliceDomain<RT,UT,T2,S2,DX1,(DX2>0 && RDX)>::combine(retval,u,b);
      CombineSliceDomain<RT,UT,T3,S3,DX1+DX2,(DX3>0 && RDX)>::
        combine(retval,u,c);
      CombineSliceDomain<RT,UT,T4,S4,DX1+DX2+DX3,(DX4>0 && RDX)>::
        combine(retval,u,d);
      CombineSliceDomain<RT,UT,T5,S5,DX1+DX2+DX3+DX4,(DX5>0 && RDX)>::
        combine(retval,u,e);
      CombineSliceDomain<RT,UT,T6,S6,DX1+DX2+DX3+DX4+DX5,(DX6>0 && RDX)>::
        combine(retval,u,f);
      CombineSliceDomain<RT,UT,T7,S7,DX1+DX2+DX3+DX4+DX5+DX6,(DX7>0 && RDX)>::
        combine(retval,u,g);
      return retval;
    }
};
template<class Domain, class Sub>
struct TemporaryNewDomain1
{
  typedef typename NewDomain1<Sub>::SliceType_t SliceType_t;
  static inline
  SliceType_t combineSlice(const Domain &d, const Sub &s)
  {
    return NewDomain1<Sub>::combineSlice(d, s);
  }
};
template<class Domain, int N>
struct TemporaryNewDomain1<Domain, AllDomain<N> >
{
  typedef Domain SliceType_t;
  static inline
  const SliceType_t &combineSlice(const Domain &d, const AllDomain<N> &)
  {
    return d;
  }
};
template<int Dim>
class Interval : public Domain<Dim, DomainTraits<Interval<Dim> > >
{
  typedef DomainTraits< Interval<Dim> > DT_t;
  typedef Domain<Dim, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Interval() { }
  Interval(const Interval<Dim> &a)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain1<Interval<Dim> >::fill(*this, a);
  }
  Interval(const Pooma::NoInit &a)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(a)
  { }
  template<class T1>
  explicit Interval(const T1 &a)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  template<class T1, class T2>
  Interval(const T1 &a, const T2 &b)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain2<T1,T2>::fill(*this, a, b);
  }
  template<class T1, class T2, class T3>
  Interval(const T1 &a, const T2 &b, const T3 &c)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain3<T1,T2,T3>::fill(*this, a, b, c);
  }
  template<class T1, class T2, class T3, class T4>
  Interval(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain4<T1,T2,T3,T4>::fill(*this, a, b, c, d);
  }
  template<class T1, class T2, class T3, class T4, class T5>
  Interval(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain5<T1,T2,T3,T4,T5>::fill(*this, a, b, c, d, e);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  Interval(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain6<T1,T2,T3,T4,T5,T6>::fill(*this, a, b, c, d, e, f);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  Interval(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f, const T7 &g)
    : Domain<Dim, DomainTraits<Interval<Dim> > >(Pooma::NoInit()) {
    NewDomain7<T1,T2,T3,T4,T5,T6,T7>::fill(*this, a, b, c, d, e, f, g);
  }
  ~Interval() { }
  template<class T>
  Interval<Dim> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Interval<Dim> &operator=(const Interval<Dim> &newdom) {
    return NewDomain1<Interval<Dim> >::fill(*this, newdom);
  }
protected:
private:
};
template<>
class Interval<1> : public Domain<1, DomainTraits<Interval<1> > >
{
  typedef DomainTraits< Interval<1> > DT_t;
public:
  typedef DT_t::Element_t Element_t;
  typedef DT_t::Domain_t Domain_t;
  typedef DT_t::OneDomain_t OneDomain_t;
  typedef DT_t::BlockDomain_t BlockDomain_t;
  typedef DT_t::AskDomain_t AskDomain_t;
  typedef DT_t::AddResult_t AddResult_t;
  typedef DT_t::MultResult_t MultResult_t;
  typedef DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Interval() { }
  Interval(const Interval<1> &a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    NewDomain1<Interval<1> >::fill(*this, a);
  }
  Interval(const Pooma::NoInit &a)
    : Domain<1, DomainTraits<Interval<1> > >(a)
  { }
  template<class T1>
  explicit Interval(const T1 &a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  Interval(char a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(unsigned char a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(short a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(unsigned short a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(int a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(unsigned int a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(long a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  Interval(unsigned long a)
    : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
    DomainTraits<Interval<1> >::setDomain(domain_m, 0, a - 1);
  }
  template<class T1, class T2>
  Interval(const T1 &m, const T2 &n);
  template<class T1, class T2, class T3>
  Interval(const T1 &m, const T2 &n, const T3 &s);
  template<class T>
  Interval<1> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Interval<1> &operator=(const Interval<1> &newdom) {
    return NewDomain1<Interval<1> >::fill(*this, newdom);
  }
  const OneDomain_t &operator[](int d) const { return *this; }
  OneDomain_t &operator[](int d) { return *this; }
};
template <class T1, class T2>
inline
Interval<1>::Interval(const T1 &m, const T2 &n)
  : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
  DomainTraits<Interval<1> >::setDomain(domain_m, m, n);
}
template <class T1, class T2, class T3>
inline
Interval<1>::Interval(const T1 &m, const T2 &n, const T3 &s)
  : Domain<1, DomainTraits<Interval<1> > >(Pooma::NoInit()) {
  ;
  DomainTraits<Interval<1> >::setDomain(domain_m, m, n);
}
template <int Dim> class Loc;
template <> class Loc<1>;
template <int Dim> class Interval;
template <> class Interval<1>;
template<int Dim>
struct DomainTraits< Loc<Dim> >
  : public DomainTraitsDomain<Loc<Dim>, int, Dim>
{
  typedef DomainTraitsDomain<Loc<Dim>, int, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef Loc<1> OneDomain_t;
  typedef Loc<1> PointDomain_t;
  typedef Interval<Dim> BlockDomain_t;
  typedef Loc<Dim> AskDomain_t;
  typedef Loc<Dim> AddResult_t;
  typedef Loc<Dim> MultResult_t;
  typedef WrapNoInit<OneDomain_t> Storage_t[Dim];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = 0 };
  enum { loopAware = false };
  enum { singleValued = true };
  enum { unitStride = true };
  enum { wildcard = false };
  inline
  static OneDomain_t &getDomain(Domain_t &d, int n) {
    return d[n];
  }
  inline
  static const OneDomain_t &getDomain(const Domain_t &d, int n) {
    return d[n];
  }
  inline
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return d[n];
  }
  inline
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return d[n];
  }
  static void initializeStorage(Storage_t &dom) {
    Dom1Initialize<Dim-1>::template apply<DomainTraits<Loc<Dim> > >(dom);
  }
  template<class T>
  inline
  static void addAccum(Storage_t &dom, const T &newdom)
  {
    PoomaCTAssert<(DomainTraits<T>::singleValued && (DomainTraits<T>::dimensions == 1 || DomainTraits<T>::dimensions == dimensions ))>::test();
    if (DomainTraits<T>::dimensions > 1)
      for (int i = 0;i< DomainTraits<T>::dimensions ; ++i)
 dom[i] += DomainTraits<T>::getFirst(newdom[i]);
    else
      for (int i = 0;i< dimensions ; ++i)
 dom[i] += DomainTraits<T>::getFirst(newdom[0]);
  }
  template<class T>
  inline
  static void subtractAccum(Storage_t &dom, const T &newdom)
  {
    PoomaCTAssert<(DomainTraits<T>::singleValued && (DomainTraits<T>::dimensions == 1 || DomainTraits<T>::dimensions == dimensions ))>::test();
    if (DomainTraits<T>::dimensions > 1)
      for (int i = 0;i< DomainTraits<T>::dimensions ; ++i)
 dom[i] -= DomainTraits<T>::getFirst(newdom[i]);
    else
      for (int i = 0;i< dimensions ; ++i)
 dom[i] -= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void multiplyAccum(Storage_t &dom, const T &newdom)
  {
    PoomaCTAssert<(DomainTraits<T>::singleValued && (DomainTraits<T>::dimensions == 1 || DomainTraits<T>::dimensions == dimensions ))>::test();
    if (DomainTraits<T>::dimensions > 1)
      for (int i = 0;i< DomainTraits<T>::dimensions ; ++i)
 dom[i] *= DomainTraits<T>::getFirst(newdom[i]);
    else
      for (int i = 0;i< dimensions ; ++i)
 dom[i] *= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void divideAccum(Storage_t &dom, const T &newdom)
  {
    PoomaCTAssert<(DomainTraits<T>::singleValued && (DomainTraits<T>::dimensions == 1 || DomainTraits<T>::dimensions == dimensions ))>::test();
    if (DomainTraits<T>::dimensions > 1)
      for (int i = 0;i< DomainTraits<T>::dimensions ; ++i)
 dom[i] /= DomainTraits<T>::getFirst(newdom[i]);
    else
      for (int i = 0;i< dimensions ; ++i)
 dom[i] /= DomainTraits<T>::getFirst(newdom);
  }
};
template<>
struct DomainTraits< Loc<1> >
  : public DomainTraitsDomain<Loc<1>, int, 1>
{
  typedef Loc<1> OneDomain_t;
  typedef Loc<1> PointDomain_t;
  typedef Interval<1> BlockDomain_t;
  typedef Loc<1> AskDomain_t;
  typedef Loc<1> AddResult_t;
  typedef Loc<1> MultResult_t;
  typedef Element_t Storage_t;
  enum { dimensions = 1,
         sliceDimensions = 0 };
  enum { loopAware = false };
  enum { singleValued = true };
  enum { unitStride = true };
  enum { wildcard = false };
  inline
  static Element_t first(Storage_t d) { return d; }
  inline
  static Element_t last(Storage_t d) { return d; }
  inline
  static Element_t stride(Storage_t) { return 1; }
  inline
  static Element_t length(Storage_t) { return 1; }
  inline
  static Element_t min(Storage_t d) { return d; }
  inline
  static Element_t max(Storage_t d) { return d; }
  inline
  static bool empty(Storage_t) { return false; }
  inline
  static int loop(Storage_t) { return 0; }
  inline
  static Element_t elem(Storage_t d, int) { return d; }
  inline
  static OneDomain_t &getDomain(Domain_t &d, int) {
    return d;
  }
  inline
  static const OneDomain_t &getDomain(const Domain_t &d, int) {
    return d;
  }
  inline
  static PointDomain_t &getPointDomain(Domain_t &d, int) {
    return d;
  }
  inline
  static const PointDomain_t &getPointDomain(const Domain_t &d, int) {
    return d;
  }
  inline
  static void initializeStorage(Storage_t &dom) {
    dom = 0;
  }
  template<class T>
  inline
  static void setDomain(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    dom = DomainTraits<T>::getFirst(newdom);
  }
  inline
  static void setLoop(Storage_t &, int) { }
  template<class UT, class T>
  inline
  static void setWildcardDomain(Storage_t &dom, const UT &u, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::wildcard)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<UT>::dimensions == 1)>::test();
    dom = newdom.first(u);
  }
  template<class T>
  static bool isLessThan(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    return (dom < DomainTraits<T>::getFirst(newdom));
  }
  template<class T>
  static bool isEqualTo(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    return (dom == DomainTraits<T>::getFirst(newdom));
  }
  template<class T>
  inline
  static void addAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
   dom += DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  inline
  static void subtractAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom -= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void multiplyAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom *= DomainTraits<T>::getFirst(newdom);
  }
 template<class T>
  static void divideAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom /= DomainTraits<T>::getFirst(newdom);
  }
};
template<int Dim1, int Dim2>
struct DomainChangeDim<Loc<Dim1>, Dim2>
{
  typedef Loc<Dim1> OldType_t;
  typedef Loc<Dim2> NewType_t;
  enum { oldDim = Dim1,
  newDim = Dim2 };
};
template <int dstIndex, int toGo>
struct FillLocStorage
{
  template <int Dim, class T>
  static inline
  void fill(Loc<Dim> &loc, const T &a)
  {
    PoomaCTAssert<(dstIndex < Dim)>::test();
    loc[dstIndex].setDomain(DomainTraits<T>::getPointDomain(a, DomainTraits<T>::dimensions-toGo-1));
    FillLocStorage<dstIndex+1,toGo-1>::fill(loc, a);
  }
};
template <int dstIndex>
struct FillLocStorage<dstIndex, 0>
{
  template <int Dim, class T>
  static inline
  void fill(Loc<Dim> &loc, const T &a)
  {
    PoomaCTAssert<(dstIndex < Dim)>::test();
    loc[dstIndex].setDomain(DomainTraits<T>::getPointDomain(a, DomainTraits<T>::dimensions-1));
  }
};
template <int i>
struct FillAllLocStorage
{
  template <int Dim, class T>
  inline
  static void fill(Loc<Dim> &loc, const T &a)
  {
    loc[Dim-i-1].setDomain(DomainTraits<T>::getPointDomain(a, 0));
    FillAllLocStorage<i-1>::fill(loc, a);
  }
};
template <>
struct FillAllLocStorage<0>
{
  template <int Dim, class T>
  inline
  static void fill(Loc<Dim> &loc, const T &a)
  {
    loc[Dim-1].setDomain(DomainTraits<T>::getPointDomain(a, 0));
  }
};
template<int Dim, class T1>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a)
{
  FillLocStorage<0, DomainTraits<T1>::dimensions-1>::fill(loc, a);
}
template<int Dim, class T1, class T2>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b)
{
  fillLocStorage(loc, a);
  FillLocStorage<DomainTraits<T1>::dimensions, DomainTraits<T2>::dimensions-1>::fill(loc, b);
}
template<int Dim, class T1, class T2, class T3>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b, const T3 &c)
{
  fillLocStorage(loc, a, b);
  FillLocStorage<DomainTraits<T1>::dimensions
     + DomainTraits<T2>::dimensions,
                 DomainTraits<T3>::dimensions-1>::fill(loc, c);
}
template<int Dim, class T1, class T2, class T3, class T4>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b, const T3 &c,
      const T4 &d)
{
  fillLocStorage(loc, a, b, c);
  FillLocStorage<DomainTraits<T1>::dimensions
     + DomainTraits<T2>::dimensions
     + DomainTraits<T3>::dimensions,
                 DomainTraits<T4>::dimensions-1>::fill(loc, d);
}
template<int Dim, class T1, class T2, class T3, class T4, class T5>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b, const T3 &c,
      const T4 &d, const T5 &e)
{
  fillLocStorage(loc, a, b, c, d);
  FillLocStorage<DomainTraits<T1>::dimensions
     + DomainTraits<T2>::dimensions
     + DomainTraits<T3>::dimensions
     + DomainTraits<T4>::dimensions,
                 DomainTraits<T5>::dimensions-1>::fill(loc, e);
}
template<int Dim, class T1, class T2, class T3, class T4, class T5, class T6>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b, const T3 &c,
      const T4 &d, const T5 &e, const T6 &f)
{
  fillLocStorage(loc, a, b, c, d, e);
  FillLocStorage<DomainTraits<T1>::dimensions
     + DomainTraits<T2>::dimensions
     + DomainTraits<T3>::dimensions
     + DomainTraits<T4>::dimensions
     + DomainTraits<T5>::dimensions,
                 DomainTraits<T6>::dimensions-1>::fill(loc, f);
}
template<int Dim, class T1, class T2, class T3, class T4, class T5, class T6, class T7>
inline
void fillLocStorage(Loc<Dim> &loc, const T1 &a, const T2 &b, const T3 &c,
      const T4 &d, const T5 &e, const T6 &f, const T7 &g)
{
  fillLocStorage(loc, a, b, c, d, e, f);
  FillLocStorage<DomainTraits<T1>::dimensions
     + DomainTraits<T2>::dimensions
     + DomainTraits<T3>::dimensions
     + DomainTraits<T4>::dimensions
     + DomainTraits<T5>::dimensions
     + DomainTraits<T6>::dimensions,
                 DomainTraits<T7>::dimensions-1>::fill(loc, g);
}
template<int Dim, class T, int DimT, bool wildcard>
struct CopyLocStorageImpl
{
  inline
  static void copy(Loc<Dim> &, const T &) { }
};
template<int Dim, class T, int DimT>
struct CopyLocStorageImpl<Dim, T, DimT, false>
{
  inline
  static void copy(Loc<Dim> &loc, const T &a) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == DimT)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions <= Dim)>::test();
    fillLocStorage(loc, a);
  }
};
template<int Dim, class T>
struct CopyLocStorageImpl<Dim, T, 1, false>
{
  inline
  static void copy(Loc<Dim> &loc, const T &a) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    FillAllLocStorage<Dim-1>::fill(loc, a);
  }
};
template<int Dim, class T>
struct CopyLocStorage
{
  inline
  static void copy(Loc<Dim> &loc, const T &a) {
    CopyLocStorageImpl<Dim, T, DomainTraits<T>::dimensions,
                       DomainTraits<T>::wildcard>::copy(loc, a);
  }
};
template<int Dim>
class Loc : public Domain<Dim, DomainTraits<Loc<Dim> > >
{
  typedef DomainTraits< Loc<Dim> > DT_t;
  typedef Domain<Dim, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  inline
  Loc() { }
  inline
  Loc(const Loc<Dim> &a)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    fillLocStorage(*this, a);
  }
  Loc(const Pooma::NoInit &a)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(a)
  { }
  template<class T1>
  inline
  explicit Loc(const T1 &a)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    CopyLocStorage<Dim, T1>::copy(*this, a);
  }
  template<class T1, class T2>
  inline
  Loc(const T1 &a, const T2 &b)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions))>::test();
    fillLocStorage(*this, a, b);
  }
  template<class T1, class T2, class T3>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions + DomainTraits<T3>::dimensions))>::test();
    fillLocStorage(*this, a, b, c);
  }
  template<class T1, class T2, class T3, class T4>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions + DomainTraits<T3>::dimensions + DomainTraits<T4>::dimensions))>::test();
    fillLocStorage(*this, a, b, c, d);
  }
  template<class T1, class T2, class T3, class T4, class T5>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions + DomainTraits<T3>::dimensions + DomainTraits<T4>::dimensions + DomainTraits<T5>::dimensions))>::test();
    fillLocStorage(*this, a, b, c, d, e);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions + DomainTraits<T3>::dimensions + DomainTraits<T4>::dimensions + DomainTraits<T5>::dimensions + DomainTraits<T6>::dimensions))>::test();
    fillLocStorage(*this, a, b, c, d, e, f);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f, const T7 &g)
    : Domain<Dim, DomainTraits<Loc<Dim> > >(Pooma::NoInit()) {
    PoomaCTAssert<(Dim >= (DomainTraits<T1>::dimensions + DomainTraits<T2>::dimensions + DomainTraits<T3>::dimensions + DomainTraits<T4>::dimensions + DomainTraits<T5>::dimensions + DomainTraits<T6>::dimensions + DomainTraits<T7>::dimensions))>::test();
    fillLocStorage(*this, a, b, c, d, e, f, g);
  }
  inline
  ~Loc() { }
  template<class T>
  inline
  Loc<Dim> &operator=(const T &newdom) {
    CopyLocStorage<Dim, T>::copy(*this, newdom);
    return *this;
  }
  inline
  Loc<Dim> &operator=(const Loc<Dim> &newdom) {
    fillLocStorage(*this, newdom);
    return *this;
  }
  template<class Out>
  void print(Out &o) const;
protected:
private:
};
template<int Dim>
template<class Out>
void Loc<Dim>::print(Out &o) const
{
  const Domain_t &d = this->unwrap();
  o << "[";
  for (int i=0; i < Dim; ++i) {
    o << d[i].first();
    if (i < (Dim-1))
      o << ",";
  }
  o << "]";
}
template<>
class Loc<1> : public Domain<1, DomainTraits<Loc<1> > >
{
  typedef DomainTraits< Loc<1> > DT_t;
public:
  typedef DT_t::Element_t Element_t;
  typedef DT_t::Domain_t Domain_t;
  typedef DT_t::OneDomain_t OneDomain_t;
  typedef DT_t::BlockDomain_t BlockDomain_t;
  typedef DT_t::AskDomain_t AskDomain_t;
  typedef DT_t::AddResult_t AddResult_t;
  typedef DT_t::MultResult_t MultResult_t;
  typedef DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  inline
  Loc() { }
  inline
  Loc(const Loc<1> &a)
    : Domain<1, DomainTraits<Loc<1> > >(Pooma::NoInit()) {
    setDomain(a);
  }
  Loc(const Pooma::NoInit &a)
    : Domain<1, DomainTraits<Loc<1> > >(a)
  { }
  template<class T1>
  inline
  explicit Loc(const T1 &a)
    : Domain<1, DomainTraits<Loc<1> > >(Pooma::NoInit()) {
    setDomain(DomainTraits<T1>::getPointDomain(a, 0));
  }
  template<class T1, class T2>
  inline
  Loc(const T1 &a, const T2 &b)
    : Domain<1, DomainTraits<Loc<1> > >(Pooma::NoInit()) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1 && DomainTraits<T2>::dimensions == 1 && DomainTraits<T1>::singleValued && DomainTraits<T2>::singleValued)>::test();
    ;
    setDomain(DomainTraits<T1>::getPointDomain(a, 0));
  }
  template<class T1, class T2, class T3>
  inline
  Loc(const T1 &a, const T2 &b, const T3 &c)
    : Domain<1, DomainTraits<Loc<1> > >(Pooma::NoInit()) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1 && DomainTraits<T2>::dimensions == 1 && DomainTraits<T3>::dimensions == 1 && DomainTraits<T1>::singleValued && DomainTraits<T2>::singleValued && DomainTraits<T3>::singleValued)>::test();
    ;
    setDomain(DomainTraits<T1>::getPointDomain(a, 0));
  }
  template<class T>
  inline
  Loc<1> &operator=(const T &newdom) {
    setDomain(DomainTraits<T>::getPointDomain(newdom, 0));
    return *this;
  }
  inline
  Loc<1> &operator=(const Loc<1> &newdom) {
    setDomain(newdom);
    return *this;
  }
  const OneDomain_t &operator[](int d) const { return *this; }
  OneDomain_t &operator[](int d) { return *this; }
  template<class Out>
  void print(Out &o) const;
};
template<class Out>
void Loc<1>::print(Out &o) const
{
  const Domain_t &d = this->unwrap();
  o << "[";
  o << d[0].first();
  o << "]";
}
template<int Dim>
std::ostream& operator<<(std::ostream &o, const Loc<Dim> &loc)
{
  loc.print(o);
  return o;
}
#include <vector>
class Pool
{
public:
  Pool(size_t sz);
  Pool();
  ~Pool();
  inline void* alloc()
    {
      outstandingAllocs_m += 1;
      if ( head_m==0 )
 grow();
      Link *p = head_m;
      memcpy(&head_m, &p->next_m, sizeof(head_m));
      return p;
    }
  inline void free(void *b)
    {
      outstandingAllocs_m -= 1;
      Link *p = (Link*)b;
      p->next_m = head_m;
      memcpy(&p->next_m, &head_m, sizeof(head_m));
      head_m = p;
    }
private:
  struct Link { Link *next_m; };
  enum { page=4096-8 };
  enum { align = 8 };
  enum { alignMask = align-1 };
  static inline int blocksInPage(size_t sz)
    {
      return (page>sz)?(page/sz):1;
    }
  static inline size_t roundToAlign(size_t s)
    {
      if (s)
 s = (s & ~alignMask) + ((s&alignMask)?align:0);
      else
 s = align;
      return s;
    }
  void grow();
  Link *head_m;
  int outstandingAllocs_m;
  size_t bsize_m;
  size_t nblock_m;
  std::vector<char*> chunks_m;
};
template<class T>
class Pooled
{
public:
  inline void* operator new(size_t) { return pool_s.alloc(); }
  inline void operator delete(void *p, size_t) { if (p) pool_s.free(p); }
  inline void* operator new(size_t, void* ptr) { return ptr; }
  inline void operator delete(void *, void *) { }
private:
  static Pool pool_s;
};
template<class T>
Pool Pooled<T>::pool_s(sizeof(T));
template<class Dom, class OrigDom = Dom>
class Node : public Pooled<Node<Dom, OrigDom> >
{
public:
  typedef Dom Domain_t;
  typedef OrigDom AllocatedDomain_t;
  typedef int Context_t;
  typedef int ID_t;
  typedef Node<Dom,OrigDom> This_t;
  Node()
    : local_m(-1), global_m(0), context_m(0), affinity_m(-1)
  {
  }
  Node(const Domain_t &owned, const AllocatedDomain_t &allocated,
       Context_t c, ID_t gid, ID_t lid = (-1))
    : domain_m(owned), allocated_m(allocated),
      local_m(lid), global_m(gid),
      context_m(c), affinity_m(-1)
  {
    ;
    ;
    ;
  }
  Node(const Domain_t &d, Context_t c, ID_t gid, ID_t lid = (-1))
    : domain_m(d), allocated_m(d),
      local_m(lid), global_m(gid),
      context_m(c), affinity_m(-1)
  {
    ;
    ;
  }
  Node(int affinity, const Domain_t &owned, const AllocatedDomain_t &allocated,
       Context_t c, ID_t gid, ID_t lid = (-1))
    : domain_m(owned), allocated_m(allocated),
      local_m(lid), global_m(gid), context_m(c),
      affinity_m(affinity)
  {
    ;
    ;
    ;
  }
  Node(int affinity, const Domain_t &d,
       Context_t c, ID_t gid, ID_t lid = (-1))
    : domain_m(d), allocated_m(d),
      local_m(lid), global_m(gid),
      context_m(c), affinity_m(affinity)
  {
    ;
    ;
  }
  Node(const This_t &n)
    : domain_m(n.domain_m), allocated_m(n.allocated_m),
      local_m(n.local_m), global_m(n.global_m),
      context_m(n.context_m), affinity_m(n.affinity_m)
  {
  }
  template<class ODom, class OAlloc>
  Node(const Node<ODom,OAlloc> &n)
    : domain_m(n.domain()), allocated_m(n.allocated()),
      local_m(n.localID()), global_m(n.globalID()),
      context_m(n.context()), affinity_m(n.affinity())
  {
  }
  void initialize(const Domain_t &owned, const AllocatedDomain_t &allocated,
                  Context_t c, ID_t gid, ID_t lid = (-1))
  {
    ;
    ;
    domain_m = owned;
    allocated_m = allocated;
    context_m = c;
    local_m = lid;
    global_m = gid;
  }
  void initialize(const Domain_t &d, Context_t c, ID_t gid, ID_t lid = (-1))
  {
    ;
    ;
    domain_m = d;
    allocated_m = d;
    context_m = c;
    local_m = lid;
    global_m = gid;
  }
  ~Node()
  {
  }
  inline const Domain_t &domain() const { return domain_m; }
  inline const AllocatedDomain_t &allocated() const { return allocated_m; }
  Context_t context() const { return context_m; }
  ID_t localID() const { return local_m; }
  ID_t globalID() const { return global_m; }
  bool isLocal() const { return (local_m >= 0); }
  int affinity() const { return affinity_m; }
  int& affinity() { return affinity_m; }
  int& context() { return context_m; }
  int& localID() { return local_m; }
  void setDomain(const Domain_t &dom) { domain_m = dom; }
  Domain_t &domain() { return domain_m; }
  void setAllocated(const AllocatedDomain_t &dom) { allocated_m = dom; }
  AllocatedDomain_t &allocated() { return allocated_m; }
  This_t &operator=(const This_t &n)
  {
    domain_m = n.domain();
    allocated_m = n.allocated();
    context_m = n.context();
    local_m = n.localID();
    global_m = n.globalID();
    affinity_m = n.affinity();
    return *this;
  }
  template<class ODom, class OAlloc>
  This_t &operator=(const Node<ODom,OAlloc> &n)
  {
    domain_m = n.domain();
    allocated_m = n.allocated();
    context_m = n.context();
    local_m = n.localID();
    global_m = n.globalID();
    affinity_m = n.affinity();
    return *this;
  }
  This_t &operator=(const Domain_t &d)
  {
    domain_m = d;
    return *this;
  }
  template<class Out>
  void print(Out &o) const
  {
    o << "{" << domain();
    o << ": allocated=" << allocated();
    o << ", con=" << context();
    o << ", aff=" << affinity();
    o << ", gid=" << globalID();
    o << ", lid=" << localID();
    o << "}";
  }
private:
  enum { dim = DomainTraits<Dom>::dimensions };
  enum { origDim = DomainTraits<OrigDom>::dimensions };
  Domain_t domain_m;
  AllocatedDomain_t allocated_m;
  ID_t local_m;
  ID_t global_m;
  Context_t context_m;
  int affinity_m;
};
template <class D, class A>
std::ostream &operator<<(std::ostream &o, const Node<D,A> &node)
{
  node.print(o);
  return o;
}
template<int Dim, class Dom, class OrigDom>
inline bool contains(const Interval<Dim> &i, const Node<Dom, OrigDom> &n)
{
  return contains(i, n.domain());
}
template<class Dom, class OrigDom>
struct DomainTraits<Node<Dom, OrigDom> >
{
  enum { singleValued = 0 };
};
template<class Domain, class Sub>
struct TemporaryNewDomain1;
template<class Domain, class OwnedDomain, class AllocatedDomain>
struct TemporaryNewDomain1<Domain, Node<OwnedDomain, AllocatedDomain> >
{
  typedef Node<OwnedDomain,AllocatedDomain> SliceType_t;
  static inline
  const SliceType_t &combineSlice(const Domain &,
    const Node<OwnedDomain,AllocatedDomain> &n)
  {
    return n;
  }
};
#include <utility>
class GlobalIDDataBase
{
public:
  typedef int LayoutID_t;
  typedef int GlobalID_t;
  typedef int NodeKey_t;
  typedef std::map<LayoutID_t, GlobalID_t> Shared_t;
  GlobalIDDataBase() { }
  inline static
  NodeKey_t nullNodeKey()
  {
    return -1;
  }
  NodeKey_t push(LayoutID_t layoutID, int context, GlobalID_t globalID);
  NodeKey_t push(LayoutID_t layoutID,
   int context,
   GlobalID_t globalID,
   NodeKey_t parentNode);
  void shared(LayoutID_t idNew, LayoutID_t idOld);
  GlobalID_t globalID(LayoutID_t layoutID, NodeKey_t key) const;
  int context(LayoutID_t layoutID, NodeKey_t key) const;
  int context(NodeKey_t key) const;
  bool contextParticipates(int context, NodeKey_t key) const;
  template<class OSTR>
  inline void print(OSTR &ostr)
  {
    typedef std::vector<Pack> Store_t;
    typedef typename Store_t::const_iterator Iterator_t;
    Iterator_t p = data_m.begin();
    for (; p != data_m.end(); ++p)
    {
      ostr << "(" << (*p).layoutID() << ","
    << (*p).globalID() << ","
    << (*p).context() << ","
    << (*p).parent() << ")";
    }
  }
private:
  struct Pack
  {
    Pack()
      : layoutID_m(0), context_m(0), globalID_m(0), parent_m(0)
    { }
    inline
    Pack(LayoutID_t layoutID, int context, GlobalID_t globalID,
  NodeKey_t parent)
      : layoutID_m(layoutID),
 context_m(context),
 globalID_m(globalID),
 parent_m(parent)
    { }
    inline LayoutID_t layoutID() const { return layoutID_m; }
    inline int context() const { return context_m; }
    inline GlobalID_t globalID() const { return globalID_m; }
    inline NodeKey_t parent() const { return parent_m; }
    LayoutID_t layoutID_m;
    int context_m;
    GlobalID_t globalID_m;
    NodeKey_t parent_m;
  };
  std::vector<Pack> data_m;
  Shared_t shared_m;
};
class Unique
{
public:
  typedef long Value_t;
  Unique()
    {
    }
  ~Unique()
    {
    }
  static inline Value_t get()
    {
      mutex_s.lock();
      Value_t retval = next_s++;
      mutex_s.unlock();
      return retval;
    }
  static inline Value_t lockedGet()
    {
      return get();
    }
private:
  static Value_t next_s;
  static Pooma::Mutex_t mutex_s;
};
struct TouchesConstructNodePtr {
  TouchesConstructNodePtr(){};
  ~TouchesConstructNodePtr(){};
};
struct TouchesConstructNodeObj {
  TouchesConstructNodeObj(){};
  ~TouchesConstructNodeObj(){};
};
template<class Domain>
inline Node<Domain> *
touchesConstruct(const Domain &owned,
   int affinity, int c, int gid, int lid,
   const TouchesConstructNodePtr &)
{
  return new Node<Domain>(affinity, owned, c, gid, lid);
}
template<class Domain, class AllocatedDomain>
inline Node<Domain,AllocatedDomain> *
touchesConstruct(const Domain &owned, const AllocatedDomain &allocated,
   int affinity, int c, int gid, int lid,
   const TouchesConstructNodePtr &)
{
  return new Node<Domain,AllocatedDomain>
             (affinity, owned, allocated, c, gid, lid);
}
template<class Domain>
inline Node<Domain>
touchesConstruct(const Domain &owned,
   int affinity, int c, int gid, int lid,
    const TouchesConstructNodeObj &)
{
  return Node<Domain>(affinity, owned, c, gid, lid);
}
template<class Domain, class AllocatedDomain>
inline Node<Domain,AllocatedDomain>
touchesConstruct(const Domain &owned, const AllocatedDomain &allocated,
   int affinity, int c, int gid, int lid,
   const TouchesConstructNodeObj &)
{
  return Node<Domain,AllocatedDomain>(affinity, owned, allocated, c, gid, lid);
}
template<int Dim> class INode;
template<int Dim>
struct TouchesConstructINode
{
  typedef GlobalIDDataBase::NodeKey_t NodeKey_t;
  typedef Unique::Value_t LayoutID_t;
  TouchesConstructINode(LayoutID_t layoutID,
   NodeKey_t parent,
   GlobalIDDataBase *globalIDDataBase)
    : layoutID_m(layoutID), parent_m(parent),
      globalIDDataBase_m(globalIDDataBase)
  { }
  inline LayoutID_t layoutID() const { return layoutID_m; }
  inline NodeKey_t parent() const { return parent_m; }
  inline GlobalIDDataBase *globalIDDataBase() const
  {
    return globalIDDataBase_m;
  }
  LayoutID_t layoutID_m;
  NodeKey_t parent_m;
  GlobalIDDataBase *globalIDDataBase_m;
};
template <int Dim>
class INode
{
public:
  typedef INode<Dim> This_t;
  typedef Interval<Dim> Domain_t;
  typedef GlobalIDDataBase::LayoutID_t LayoutID_t;
  typedef GlobalIDDataBase::GlobalID_t GlobalID_t;
  typedef GlobalIDDataBase::NodeKey_t NodeKey_t;
  enum { dimensions = Dim };
  inline INode() : domain_m(Pooma::NoInit()) { }
  inline INode(const INode<Dim> &model)
    : domain_m(model.domain_m),
      globalIDDataBase_m(model.globalIDDataBase_m),
      key_m(model.key_m)
  { }
  template<int D2, class Dom>
  inline INode(const INode<D2> &model, const Dom &dom)
    : domain_m(dom),
      globalIDDataBase_m(model.globalIDDataBase()),
      key_m(model.key())
  { }
  inline
  INode(const Interval<Dim> &dom, LayoutID_t layoutID, int context,
 GlobalID_t globalID,
 GlobalIDDataBase *globalIDDataBase, NodeKey_t parent = -1)
    : domain_m(dom),
      globalIDDataBase_m(globalIDDataBase)
  {
    key_m = globalIDDataBase_m->push(layoutID, context, globalID, parent);
  }
  template<class Alloc>
  inline
  INode(const Node<Interval<Dim>, Alloc> &node, LayoutID_t layoutID,
 GlobalIDDataBase *globalIDDataBase)
    : domain_m(node.domain()),
      globalIDDataBase_m(globalIDDataBase)
  {
    key_m = globalIDDataBase_m->push(layoutID, node.context(),
         node.globalID());
  }
  inline
  INode(const Interval<Dim> &dom, int context, GlobalID_t globalID,
 const TouchesConstructINode<Dim> &tcin)
    : domain_m(dom),
      globalIDDataBase_m(tcin.globalIDDataBase())
  {
    key_m = globalIDDataBase_m->push(tcin.layoutID(), context, globalID,
         tcin.parent());
  }
  inline
  INode(const INode<Dim> &inode, int context, GlobalID_t globalID,
 const TouchesConstructINode<Dim> &tcin)
    : domain_m(inode.domain()),
      globalIDDataBase_m(tcin.globalIDDataBase())
  {
    key_m = globalIDDataBase_m->push(tcin.layoutID(), context, globalID,
         tcin.parent());
  }
  template<class Alloc>
  inline
  INode(const Node<Interval<Dim>, Alloc> &node, int context,
 GlobalID_t globalID,
 const TouchesConstructINode<Dim> &tcin)
    : domain_m(node.domain()),
      globalIDDataBase_m(tcin.globalIDDataBase())
  {
    key_m = globalIDDataBase_m->push(tcin.layoutID(), context, globalID,
         tcin.parent());
  }
  inline INode(const Range<Dim> &range, int context, int globalID,
        const TouchesConstructINode<Dim> &tcin)
    : globalIDDataBase_m(tcin.globalIDDataBase())
  {
    key_m = globalIDDataBase_m->push(tcin.layoutID(), context, globalID,
         tcin.parent());
    int i;
    for (i = 0; i < Dim; ++i)
    {
      domain_m[i] = Interval<1>(range[i].first(), range[i].last());
    }
  }
  inline INode<Dim> &operator=(const INode<Dim> &rhs)
  {
    if (&rhs != this)
    {
      domain_m = rhs.domain();
      globalIDDataBase_m = rhs.globalIDDataBase();
      key_m = rhs.key();
    }
    return *this;
  }
  inline ~INode() { }
  inline const Domain_t &domain() const { return domain_m; }
  inline
  GlobalID_t globalID(LayoutID_t id) const
  {
    ;
    return globalIDDataBase_m->globalID(id, key_m);
  }
  inline int context() const
  {
    ;
    return globalIDDataBase_m->context(key_m);
  }
  inline int context(LayoutID_t id) const
  {
    ;
    return globalIDDataBase_m->context(id, key_m);
  }
  inline bool contextParticipates(int context) const
  {
    ;
    return globalIDDataBase_m->contextParticipates(context, key_m);
  }
  inline
  GlobalIDDataBase *globalIDDataBase() const { return globalIDDataBase_m; }
  inline NodeKey_t key() const { return key_m; }
  inline
  TouchesConstructINode<Dim> touchesConstructINode(LayoutID_t layoutID)
  {
    return TouchesConstructINode<Dim>(layoutID, key_m, globalIDDataBase_m);
  }
  template<int Dim2>
  inline static
  TouchesConstructINode<Dim> touchesConstructINode(LayoutID_t layoutID,
         const INode<Dim2> &inode)
  {
    return TouchesConstructINode<Dim>(layoutID, inode.key(),
          inode.globalIDDataBase());
  }
  template<class Out>
  void print(Out &o) const
  {
    o << "{" << domain();
    o << ": key=" << key();
    o << "}";
  }
private:
  Domain_t domain_m;
  GlobalIDDataBase *globalIDDataBase_m;
  NodeKey_t key_m;
};
template<int Dim>
inline INode<Dim> operator+(const INode<Dim> &inode, const Loc<Dim> &loc)
{
  return INode<Dim>(inode, inode.domain() + loc);
}
template <int Dim>
std::ostream &operator<<(std::ostream &o, const INode<Dim> &inode)
{
  inode.print(o);
  return o;
}
template<int Dim>
inline bool contains(const Interval<Dim> &i, const INode<Dim> &n)
{
  return contains(i, n.domain());
}
template<int Dim>
struct DomainTraits<INode<Dim> >
{
  enum { singleValued = 0 };
};
template<class Domain, class Sub>
struct TemporaryNewDomain1;
template<class Domain, int N>
struct TemporaryNewDomain1<Domain, INode<N> >
{
  typedef INode<N> SliceType_t;
  static inline
  const SliceType_t &combineSlice(const Domain &, const INode<N> &i)
  {
    return i;
  }
};
template<class Domain, int Dim>
inline INode<Dim>
touchesConstruct(const Domain &d,
   int, int context, int gid, int,
   const TouchesConstructINode<Dim> &tcin)
{
  return INode<Dim>(d, context, gid, tcin);
}
template<class Domain, class AllocatedDomain, int Dim>
inline INode<Dim>
touchesConstruct(const Domain &d, const AllocatedDomain &,
   int, int context, int gid, int,
   const TouchesConstructINode<Dim> & tcin)
{
  return INode<Dim>(d, context, gid, tcin);
}
template <int Dim>
class GuardLayers
{
public:
  explicit GuardLayers(int gcs = 0)
  {
    ;
    for (int i = 0; i < Dim; ++i)
      {
        lower_m[i] = gcs;
        upper_m[i] = gcs;
      }
  }
  GuardLayers(int lower[Dim], int upper[Dim])
  {
    for (int i = 0; i < Dim; ++i)
      {
        ;
        lower_m[i] = lower[i];
        upper_m[i] = upper[i];
      }
  }
  GuardLayers(const Loc<Dim> &lower, const Loc<Dim> &upper)
  {
    for (int i = 0; i < Dim; ++i)
      {
        ;
        lower_m[i] = lower[i].first();
        upper_m[i] = upper[i].first();
      }
  }
  void initialize(const Loc<Dim> &lower, const Loc<Dim> &upper)
  {
    for (int i = 0; i < Dim; ++i)
      {
        ;
        lower_m[i] = lower[i].first();
        upper_m[i] = upper[i].first();
      }
  }
  void initialize(const GuardLayers<Dim> &gl)
  {
    *this = gl;
  }
  int lower(int i) const
  {
    return lower_m[i];
  }
  int upper(int i) const
  {
    return upper_m[i];
  }
  int &lower(int i)
  {
    return lower_m[i];
  }
  int &upper(int i)
  {
    return upper_m[i];
  }
  bool operator==(const GuardLayers<Dim> &gcs) const
  {
    bool result = true;
    for (int d = 0; d < Dim; ++d)
      {
        result = result && lower_m[d] == gcs.lower_m[d];
        result = result && upper_m[d] == gcs.upper_m[d];
      }
    return result;
  }
  bool operator==(int gcw) const
  {
    bool result = true;
    for (int d = 0; d < Dim; ++d)
      {
        result = result && lower_m[d] == gcw;
        result = result && upper_m[d] == gcw;
      }
    return result;
  }
  bool operator!=(const GuardLayers<Dim> &gcs) const
  {
    return !operator==(gcs);
  }
  bool operator!=(int gcw) const
  {
    return !operator==(gcw);
  }
  GuardLayers<Dim> operator-(const GuardLayers<Dim> &gcs)
  {
    GuardLayers<Dim> result;
    for (int d = 0; d < Dim; ++d)
      {
        result.lower(d) = lower_m[d] - gcs.lower_m[d];
        ;
        result.upper(d) = upper_m[d] - gcs.upper_m[d];
        ;
      }
    return result;
  }
  GuardLayers<Dim> operator-(int dw)
  {
    GuardLayers<Dim> result;
    for (int d = 0; d < Dim; ++d)
      {
        result.lower(d) = lower_m[d] - dw;
        ;
        result.upper(d) = upper_m[d] - dw;
        ;
      }
    return result;
  }
  inline static void
  addGuardLayers(Interval<Dim> &dom, const GuardLayers<Dim> &gcs)
  {
    for (int d = 0; d < Dim; ++d)
      {
        int a = dom[d].first() - gcs.lower(d);
        int b = dom[d].last() + gcs.upper(d);
        dom[d] = Interval<1>(a,b);
      }
  }
  Interval<Dim> addGuardLayersToDomain(const Interval<Dim> &d) const
  {
    Interval<Dim> dom(d);
    addGuardLayers(dom, *this);
    return dom;
  }
  template <class Ostream>
  void print(Ostream &ostr) const
  {
    ostr << "GuardLayers<" << Dim << "> [";
    for (int d = 0; d < Dim; ++d)
      {
        ostr << "l: " << lower_m[d] << ", u: " << upper_m[d];
        if (d != Dim - 1)
          ostr << "; ";
      }
    ostr << "]";
  }
private:
  int lower_m[Dim];
  int upper_m[Dim];
};
template<int Dim>
inline Interval<Dim>
grow(const Interval<Dim> &dom, const GuardLayers<Dim> &gcs)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - gcs.lower(d);
      int b = dom[d].last() + gcs.upper(d);
      ret[d] = Interval<1>(a,b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrink(const Interval<Dim> &dom, const GuardLayers<Dim> &gcs)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + gcs.lower(d);
      int b = dom[d].last() - gcs.upper(d);
      ret[d] = Interval<1>(a,b);
    }
  return ret;
}
template<int Dim>
std::ostream &operator<<(std::ostream &ostr,
  const GuardLayers<Dim> &gl)
{
  gl.print(ostr);
  return ostr;
}
template <int Dim> class Loc;
template <> class Loc<1>;
template <int Dim> class Interval;
template <> class Interval<1>;
template <int Dim> class Range;
template <> class Range<1>;
template<int Dim>
struct DomainTraits< Range<Dim> >
  : public DomainTraitsDomain<Range<Dim>, int, Dim>
{
  typedef DomainTraitsDomain<Range<Dim>, int, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef Range<1> OneDomain_t;
  typedef Range<1> PointDomain_t;
  typedef Interval<Dim> BlockDomain_t;
  typedef Loc<Dim> AskDomain_t;
  typedef Range<Dim> AddResult_t;
  typedef Range<Dim> MultResult_t;
  typedef WrapNoInit<OneDomain_t> Storage_t[Dim];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = Dim };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  enum { wildcard = false };
  static OneDomain_t &getDomain(Domain_t &d, int n) { return d[n]; }
  static const OneDomain_t &getDomain(const Domain_t &d,int n) { return d[n]; }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void initializeStorage(Storage_t &dom) {
    Dom1Initialize<Dim-1>::template apply<DomainTraits<Range<Dim> > >(dom);
  }
};
template<>
struct DomainTraits< Range<1> >
  : public DomainTraitsDomain<Range<1>, int, 1>
{
  typedef Range<1> OneDomain_t;
  typedef Range<1> PointDomain_t;
  typedef Interval<1> BlockDomain_t;
  typedef Loc<1> AskDomain_t;
  typedef Range<1> AddResult_t;
  typedef Range<1> MultResult_t;
  typedef Element_t Storage_t[3];
  enum { dimensions = 1,
         sliceDimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  enum { wildcard = false };
  static Element_t first(const Storage_t &d) { return d[0]; }
  static Element_t last(const Storage_t &d) { return d[0] + (d[1]-1)*d[2]; }
  static Element_t stride(const Storage_t &d) { return d[2]; }
  static Element_t length(const Storage_t &d) { return d[1]; }
  static Element_t min(const Storage_t &d) {
    return (d[2] > 0 ? d[0] : d[0] + (d[1]-1)*d[2]);
  }
  static Element_t max(const Storage_t &d) {
    return (d[2] < 0 ? d[0] : d[0] + (d[1]-1)*d[2]);
  }
  static bool empty(const Storage_t &d) { return (d[1] < 1); }
  static int loop(const Storage_t &) { return 0; }
  static Element_t elem(const Storage_t &d, int n) { return d[0] + n*d[2]; }
  static OneDomain_t &getDomain(Domain_t &d, int) { return d; }
  static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void initializeStorage(Storage_t &dom) {
    dom[0] = 0;
    dom[1] = 0;
    dom[2] = 1;
  }
  template<class T>
  static void setDomain(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    dom[0] = DomainTraits<T>::getFirst(newdom);
    dom[1] = DomainTraits<T>::getLength(newdom);
    dom[2] = DomainTraits<T>::getStride(newdom);
  }
  template<class T1, class T2>
  static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T2>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T1>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T2>::singleValued)>::test();
    Element_t strideval = (endval < begval ? -1 : 1);
    dom[0] = begval;
    dom[1] = (endval - begval)/strideval + 1;
    dom[2] = strideval;
  }
  template<class T1, class T2, class T3>
  static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval,
   const T3 &strideval) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T2>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T3>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T1>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T2>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T3>::singleValued)>::test();
    dom[0] = begval;
    dom[1] = (endval - begval)/strideval + 1;
    dom[2] = strideval;
  }
  static void setLoop(Storage_t &, int) { }
  template<class UT, class T>
  static void setWildcardDomain(Storage_t &dom, const UT &u, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::wildcard)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<UT>::dimensions == 1)>::test();
    dom[0] = newdom.first(u);
    dom[1] = newdom.length(u);
    dom[2] = newdom.stride(u);
  }
  template<class T>
  static bool isLessThan(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    return (dom[1] < DomainTraits<T>::getLength(newdom) ||
     (dom[1] == DomainTraits<T>::getLength(newdom) &&
      (dom[0] < DomainTraits<T>::getFirst(newdom) ||
       (dom[0] == DomainTraits<T>::getFirst(newdom) &&
        dom[2] < DomainTraits<T>::getStride(newdom)))));
  }
  template<class T>
  static bool isEqualTo(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    return ((dom[1] == 0 && DomainTraits<T>::getLength(newdom) == 0) ||
     (dom[0] == DomainTraits<T>::getFirst(newdom) &&
      dom[1] == DomainTraits<T>::getLength(newdom) &&
      dom[2] == DomainTraits<T>::getStride(newdom)));
  }
  template<class T>
  static void addAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] += DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void subtractAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] -= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void multiplyAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] *= DomainTraits<T>::getFirst(newdom);
    dom[2] *= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void divideAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom[0] /= DomainTraits<T>::getFirst(newdom);
    dom[2] /= DomainTraits<T>::getFirst(newdom);
  }
};
template<int Dim1, int Dim2>
struct DomainChangeDim<Range<Dim1>, Dim2>
{
  typedef Range<Dim1> OldType_t;
  typedef Range<Dim2> NewType_t;
  enum { oldDim = Dim1,
  newDim = Dim2 };
};
template <int Dim> class Range;
template<int Dim>
inline
void fillRangeScalar(Range<Dim> &r, const int &a);
template<int Dim>
class Range : public Domain<Dim, DomainTraits<Range<Dim> > >
{
  typedef DomainTraits< Range<Dim> > DT_t;
  typedef Domain<Dim, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Range() { }
  Range(const Range<Dim> &a)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain1<Range<Dim> >::fill(*this, a);
  }
  Range(const Pooma::NoInit &a)
    : Domain<Dim, DomainTraits<Range<Dim> > >(a)
  { }
  template<class T1>
  explicit Range(const T1 &a)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  template<class T1, class T2>
  Range(const T1 &a, const T2 &b)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain2<T1,T2>::fill(*this, a, b);
  }
  template<class T1, class T2, class T3>
  Range(const T1 &a, const T2 &b, const T3 &c)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain3<T1,T2,T3>::fill(*this, a, b, c);
  }
  template<class T1, class T2, class T3, class T4>
  Range(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain4<T1,T2,T3,T4>::fill(*this, a, b, c, d);
  }
  template<class T1, class T2, class T3, class T4, class T5>
  Range(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain5<T1,T2,T3,T4,T5>::fill(*this, a, b, c, d, e);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  Range(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
 const T6 &f)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain6<T1,T2,T3,T4,T5,T6>::fill(*this, a, b, c, d, e, f);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  Range(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
 const T6 &f, const T7 &g)
    : Domain<Dim, DomainTraits<Range<Dim> > >(Pooma::NoInit()) {
    NewDomain7<T1,T2,T3,T4,T5,T6,T7>::fill(*this, a, b, c, d, e, f, g);
  }
  ~Range() { }
  template<class T>
  Range<Dim> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Range<Dim> &operator=(const Range<Dim> &newdom) {
    return NewDomain1<Range<Dim> >::fill(*this, newdom);
  }
  Range<Dim> &operator=(const int a) {
    fillRangeScalar(*this,a);
    return *this;
  }
protected:
private:
};
template<>
class Range<1> : public Domain<1, DomainTraits<Range<1> > >
{
  typedef DomainTraits< Range<1> > DT_t;
public:
  typedef DT_t::Element_t Element_t;
  typedef DT_t::Domain_t Domain_t;
  typedef DT_t::OneDomain_t OneDomain_t;
  typedef DT_t::BlockDomain_t BlockDomain_t;
  typedef DT_t::AskDomain_t AskDomain_t;
  typedef DT_t::AddResult_t AddResult_t;
  typedef DT_t::MultResult_t MultResult_t;
  typedef DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Range() { }
  Range(const Range<1> &a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    NewDomain1<Range<1> >::fill(*this, a);
  }
  Range(const Pooma::NoInit &a)
    : Domain<1, DomainTraits<Range<1> > >(a)
  { }
  template<class T1>
  explicit Range(const T1 &a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  Range(char a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - 1);
  }
  Range(unsigned char a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - 1);
  }
  Range(short a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    short s = (a < 0 ? -1 : 1);
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - s);
  }
  Range(unsigned short a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - 1);
  }
  Range(int a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    int s = (a < 0 ? -1 : 1);
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - s);
  }
  Range(unsigned int a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - 1);
  }
  Range(long a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    long s = (a < 0 ? -1 : 1);
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - s);
  }
  Range(unsigned long a)
    : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
    ;
    DomainTraits<Range<1> >::setDomain(domain_m, 0, a - 1);
  }
  template<class T1, class T2>
  Range(const T1 &m, const T2 &n);
  template<class T1, class T2, class T3>
  Range(const T1 &m, const T2 &n, const T3 &s);
  template<class T>
  Range<1> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Range<1> &operator=(const Range<1> &newdom) {
    return NewDomain1<Range<1> >::fill(*this, newdom);
  }
  const OneDomain_t &operator[](int d) const { return *this; }
  OneDomain_t &operator[](int d) { return *this; }
};
template <class T1, class T2>
inline
Range<1>::Range(const T1 &m, const T2 &n)
  : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
  DomainTraits<Range<1> >::setDomain(domain_m, m, n);
}
template <class T1, class T2, class T3>
inline
Range<1>::Range(const T1 &m, const T2 &n, const T3 &s)
  : Domain<1, DomainTraits<Range<1> > >(Pooma::NoInit()) {
  DomainTraits<Range<1> >::setDomain(domain_m, m, n, s);
}
template<int Dim>
inline
void fillRangeScalar(Range<Dim> &r, const int &a)
{
  for (int i=0; i < Dim; ++i)
    r[i]=Range<1>(a);
}
class ObserverEvent
{
public:
  typedef Unique::Value_t ID_t;
  ObserverEvent(int event)
    : event_m(event), ID_m(Unique::get())
    {
    }
  ObserverEvent(const ObserverEvent &oe)
    : event_m(oe.event_m), ID_m(oe.ID_m)
    {
    }
  ObserverEvent &operator=(const ObserverEvent &oe)
    {
      event_m = oe.event();
      ID_m = oe.ID();
      return *this;
    }
  virtual ~ObserverEvent()
    {
    }
  inline int event() const
    {
      return event_m;
    }
  inline ID_t ID() const
    {
      return ID_m;
    }
  static inline ID_t nullID()
    {
      return (-1);
    }
private:
  int event_m;
  ID_t ID_m;
};
template<class Obj>
inline bool checkDynamicID(Obj &, ObserverEvent::ID_t)
{
  return true;
}
template<class T>
class Observer
{
public:
  Observer()
    {
    }
  virtual ~Observer()
    {
    }
  virtual void notify(T &observed, const ObserverEvent &event) = 0;
  inline void notify(T &observed, int event)
    {
      notify(observed, ObserverEvent(event));
    }
};
template<class T>
class SingleObserver
{
public:
  SingleObserver() { }
  virtual ~SingleObserver() { }
  virtual void notify(const T &observed, const ObserverEvent &event) = 0;
  inline void notify(const T &observed, int event)
    {
      notify(observed, ObserverEvent(event));
    }
};
template<class T>
class Observable
{
public:
  enum { deleteEvent = 0 };
  Observable(T &o) : observed_m(o), count_m(0)
    {
    }
  ~Observable()
    {
      notify(deleteEvent);
    }
  int observers() const
    {
      return count_m;
    }
  void attach(Observer<T> *o)
    {
      mutex_m.lock();
      observers_m.push_back(o);
      count_m += 1;
      mutex_m.unlock();
    }
  void attach(Observer<T> &o)
    {
      attach(&o);
    }
  void detach(Observer<T> *o)
    {
      mutex_m.lock();
      for (int i=0; i < count_m; ++i) {
 if (observers_m[i] == o) {
   count_m -= 1;
   observers_m.erase(observers_m.begin() + i);
   break;
 }
      }
      mutex_m.unlock();
    }
  void detach(Observer<T> &o)
    {
      detach(&o);
    }
  inline void notify(int event)
    {
      for (int i=0; i < count_m; ++i)
 observers_m[i]->notify(observed_m, event);
    }
  inline void notify(const ObserverEvent &event)
    {
      for (int i=0; i < count_m; ++i)
 observers_m[i]->notify(observed_m, event);
    }
private:
  T &observed_m;
  std::vector<Observer<T> *> observers_m;
  int count_m;
  Pooma::Mutex_t mutex_m;
  Observable();
  Observable(const Observable<T> &);
  Observable<T> &operator=(const Observable<T> &);
};
template<class T>
class SingleObservable
{
public:
  enum { deleteEvent = 0 };
  SingleObservable() : observer_m(0)
    {
    }
  ~SingleObservable()
    {
      notify(T(),0);
    }
  void attach(SingleObserver<T> *o)
    {
      ;
      observer_m = o;
    }
  void attach(SingleObserver<T> &o)
    {
      attach(&o);
    }
  void detach()
    {
      observer_m = 0;
    }
  inline void notify(const T& value, int event)
    {
      if (observer_m != 0)
 observer_m->notify(value, event);
    }
  inline void notify(const T& value, const ObserverEvent &event)
    {
      if (observer_m != 0)
 observer_m->notify(value, event);
    }
private:
  SingleObserver<T> *observer_m;
  SingleObservable(const SingleObservable<T> &);
  SingleObservable<T> &operator=(const SingleObservable<T> &);
};
template <class T>
struct ElementProperties
{
  typedef T This_t;
  enum { hasTrivialDefaultConstructor = false };
  enum { hasTrivialDestructor = false };
  enum { concrete = false };
  enum { basicType = false };
  static void construct(This_t * addr)
  {
    new (addr) This_t();
  }
  static void construct(This_t * addr, const This_t & model)
  {
    new (addr) This_t(model);
  }
  static This_t * clone(const This_t &model)
  {
    return new This_t(model);
  }
  static void destruct(This_t * addr)
  {
    addr->~This_t();
  }
};
template <class T>
struct TrivialElementPropertiesBase
{
  typedef T This_t;
  enum { hasTrivialDefaultConstructor = true };
  enum { hasTrivialDestructor = true };
  enum { concrete = true };
  static void construct(This_t * addr, const This_t & model)
  {
    new (addr) This_t(model);
  }
  static This_t * clone(const This_t &model)
  {
    return new This_t(model);
  }
  static void construct(This_t *addr)
  {
    new (addr) This_t();
  }
  static void destruct(This_t *)
  {
    if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("TrivialElementProperties<T>::destruct(addr) not allowed!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Utilities/ElementProperties.h", 213);
  }
};
template <class T>
struct TrivialElementProperties : public TrivialElementPropertiesBase<T>
{
  enum { basicType = false };
};
template <class T>
struct BasicTypeProperties : public TrivialElementPropertiesBase<T>
{
  enum { basicType = true };
};
template <class T>
struct MakeOwnCopyProperties
{
  typedef T This_t;
  enum { hasTrivialDefaultConstructor = false };
  enum { hasTrivialDestructor = false };
  enum { concrete = false };
  enum { basicType = false };
  static void construct(This_t * addr)
  {
    new (addr) This_t;
    addr->makeOwnCopy();
  }
  static void construct(This_t * addr, const This_t & model)
  {
    new (addr) This_t(model);
    addr->makeOwnCopy();
  }
  static This_t * clone(const This_t &model)
  {
    This_t * temp = new This_t(model);
    temp->makeOwnCopy();
    return temp;
  }
  static void destruct(This_t * addr)
  {
    addr->~This_t();
  }
};
template <>
struct ElementProperties<bool> : public BasicTypeProperties<bool>
{ };
template <>
struct ElementProperties<char> : public BasicTypeProperties<char>
{ };
template <>
struct ElementProperties<unsigned char>
  : public BasicTypeProperties<unsigned char>
{ };
template <>
struct ElementProperties<short> : public BasicTypeProperties<short>
{ };
template <>
struct ElementProperties<unsigned short>
  : public BasicTypeProperties<unsigned short>
{ };
template <>
struct ElementProperties<int> : public BasicTypeProperties<int>
{ };
template <>
struct ElementProperties<unsigned int>
  : public BasicTypeProperties<unsigned int>
{ };
template <>
struct ElementProperties<long> : public BasicTypeProperties<long>
{ };
template <>
struct ElementProperties<long long> : public BasicTypeProperties<long long>
{ };
template <>
struct ElementProperties<unsigned long>
  : public BasicTypeProperties<unsigned long>
{ };
template <>
struct ElementProperties<float> : public BasicTypeProperties<float>
{ };
template <>
struct ElementProperties<double> : public BasicTypeProperties<double>
{ };
namespace std {
  template <class Float> class complex;
}
template <class FloatType>
struct ElementProperties<std::complex<FloatType> >
  : public TrivialElementProperties<std::complex<FloatType> >
{ };
class RefCounted
{
public:
  RefCounted()
    : count_m(0)
    { }
  RefCounted(const RefCounted &)
    : count_m(0)
    { }
  ~RefCounted() { }
  bool isShared() const;
  void addReference();
  void removeReference();
  bool removeRefAndCheckGarbage();
  void lock() const
  {
    mutex_m.lock();
  }
  void unlock() const
  {
    mutex_m.unlock();
  }
  int count() const;
  int countUnlocked() const;
private:
  RefCounted & operator=(const RefCounted &);
  int count_m;
  mutable Pooma::Mutex_t mutex_m;
};
inline bool
RefCounted::isShared() const
{
  mutex_m.lock();
  bool test = count_m > 1;
  mutex_m.unlock();
  return test;
}
inline void
RefCounted::addReference()
{
  mutex_m.lock();
  ++count_m;
  mutex_m.unlock();
}
inline void
RefCounted::removeReference()
{
  mutex_m.lock();
  --count_m;
  ;
  mutex_m.unlock();
}
inline bool
RefCounted::removeRefAndCheckGarbage()
{
  mutex_m.lock();
  ;
  bool test = --count_m == 0;
  mutex_m.unlock();
  return test;
}
inline int
RefCounted::count() const
{
  mutex_m.lock();
  int count = count_m;
  mutex_m.unlock();
  return count;
}
inline int
RefCounted::countUnlocked() const
{
  return count_m;
}
template <class T>
class Shared : public RefCounted
{
public:
  Shared(const T &d) : data_m(d) {};
  Shared(const Shared<T> & model)
    : data_m(model.data_m)
  { }
  Shared<T> & operator=(const Shared<T> &model)
  {
    if (&model == this) return *this;
    data_m = model.data_m;
    return *this;
  }
  Shared<T> & operator=(const T & d)
  {
    data_m = d;
    return *this;
  }
  inline
  T &data() { return data_m; }
  inline
  const T &data() const { return data_m; }
  bool operator==(const Shared<T> &rhs) const
    { return data_m == rhs.data_m; }
  bool operator!=(const Shared<T> &rhs) const
    { return data_m != rhs.data_m; }
protected:
  T data_m;
};
template <class T>
class RefCountedPtr
{
public:
  typedef RefCountedPtr<T> This_t;
  typedef T Pointee_t;
  RefCountedPtr() : ptr_m(0) { }
  RefCountedPtr(T * const pT)
    : ptr_m(pT)
    { if (isValid()) ptr_m->addReference(); }
  RefCountedPtr(const This_t &model)
    : ptr_m(model.ptr_m)
    { if (isValid()) ptr_m->addReference(); }
  ~RefCountedPtr();
  RefCountedPtr & operator=(const RefCountedPtr &);
  RefCountedPtr & operator=(T *);
  inline T * operator->() const { return ptr_m; }
  inline T & operator*() const { return *ptr_m; }
  bool operator==(const This_t& a) const
  { return ptr_m == a.ptr_m; }
  bool operator!=(const This_t& a) const
  { return ptr_m != a.ptr_m; }
  void invalidate();
  inline bool isValid() const { return ptr_m != 0; }
  inline bool isShared() const { return ptr_m->isShared(); }
  inline int count() const { return ptr_m->count(); }
  RefCountedPtr<T> & makeOwnCopy();
  inline T * rawPointer() { return ptr_m; }
  inline const T * rawPointer() const { return ptr_m; }
private:
  template <class T2, bool val, class Controller>
  friend class RefCountedBlockPtr;
  T * ptr_m;
};
template <class T>
inline void RefCountedPtr<T>::invalidate()
{
  if ( isValid() && ptr_m->removeRefAndCheckGarbage() )
    delete ptr_m;
  ptr_m = 0;
}
template <class T>
inline RefCountedPtr<T>::~RefCountedPtr()
{
  invalidate();
}
template <class T>
inline RefCountedPtr<T> &
RefCountedPtr<T>::operator=(const RefCountedPtr<T>& rhs)
{
  if (ptr_m != rhs.ptr_m)
    {
      if ( isValid() && ptr_m->removeRefAndCheckGarbage() )
 delete ptr_m;
      ptr_m = rhs.ptr_m;
      if ( isValid() ) ptr_m->addReference();
    }
  return *this;
}
template <class T>
inline RefCountedPtr<T> &
RefCountedPtr<T>::operator=(T *pp)
{
  if (ptr_m != pp)
    {
      if ( isValid() && ptr_m->removeRefAndCheckGarbage() )
 delete ptr_m;
      ptr_m = pp;
      if ( isValid() ) ptr_m->addReference();
    }
  return *this;
}
template <class T>
inline RefCountedPtr<T> &
RefCountedPtr<T>::makeOwnCopy()
{
  if ( isValid() && ptr_m->isShared() )
    {
      T * temp = ElementProperties<T>::clone(*ptr_m);
      ptr_m->removeReference();
      ptr_m = temp;
      ptr_m->addReference();
    }
  return *this;
}
template <class T>
class RefBlockController : public RefCounted
{
public:
  struct NoInitTag
  {
     NoInitTag() { }
     NoInitTag(const NoInitTag &) { }
     NoInitTag & operator=(const NoInitTag &) { return *this; }
  };
  explicit
  RefBlockController(size_t size)
    : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false)
  {
    reallocateStorage(size, false);
    if (!ElementProperties<T>::hasTrivialDefaultConstructor)
      {
 for (T * pt = begin(); pt != end(); ++pt)
   ElementProperties<T>::construct(pt);
      }
  }
  RefBlockController(size_t size, const T & model)
    : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false)
  {
    reallocateStorage(size, false);
    for (T * pt = begin(); pt != end(); ++pt)
      ElementProperties<T>::construct(pt, model);
  }
  RefBlockController(size_t size, const NoInitTag &)
    : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false)
  {
    reallocateStorage(size, false);
  }
  RefBlockController(T *p, size_t size)
    : pBegin_m(p), pEnd_m(p+size), pEndOfStorage_m(p+size), dealloc_m(false)
  { }
  RefBlockController(const RefBlockController &model)
    : pBegin_m(0), pEnd_m(0), pEndOfStorage_m(0), dealloc_m(false)
  {
    size_t allocatedSize = model.pEndOfStorage_m - model.pBegin_m;
    size_t size = model.end() - model.begin();
    reallocateStorage(allocatedSize, false);
    pEnd_m = pBegin_m + size;
    T * pOld = model.begin();
    T * pNew = begin();
    while (pNew != end())
      {
 ElementProperties<T>::construct(pNew++,*pOld++);
      }
  }
  ~RefBlockController()
  {
    deleteStorage();
  }
  bool resize(size_t newsize, const NoInitTag &)
  {
    T *pNewEnd = pBegin_m + newsize;
    if (pNewEnd <= pEndOfStorage_m)
      {
        pEnd_m = pNewEnd;
        return true;
      }
    else
      {
        return false;
      }
  }
  bool resize(size_t newsize)
  {
    bool success = resize(newsize,NoInitTag());
    if (!ElementProperties<T>::hasTrivialDefaultConstructor)
      if (success)
 for (T * pt = begin(); pt != end(); ++pt)
          ElementProperties<T>::construct(pt);
    return success;
  }
  bool resize(size_t newsize, const T &model)
  {
    bool success = resize(newsize,NoInitTag());
    if (success)
      for (T * pt = begin(); pt != end(); ++pt)
        ElementProperties<T>::construct(pt, model);
    return success;
  }
  T *resizeAndCopy(size_t newsize)
  {
    size_t oldsize = size();
    if (!resize(newsize, NoInitTag()))
      {
 reallocateStorage(newsize, true);
 if (newsize > oldsize)
   for (T *pt = begin() + oldsize; pt != end(); ++pt)
     ElementProperties<T>::construct(pt);
      }
    return begin();
  }
  T *resizeAndCopy(size_t newsize, const T &model)
  {
    size_t oldsize = size();
    if (!resize(newsize, NoInitTag()))
      {
 reallocateStorage(newsize, true);
 if (newsize > oldsize)
   for (T *pt = begin() + oldsize; pt != end(); ++pt)
     ElementProperties<T>::construct(pt, model);
      }
    return begin();
  }
  T *resizeAndCopy(size_t newsize, const NoInitTag &)
  {
    if (!resize(newsize, NoInitTag()))
      {
 reallocateStorage(newsize, true);
      }
    return begin();
  }
  inline T *begin() const
  {
    return pBegin_m;
  }
  inline T *end() const
  {
    return pEnd_m;
  }
  inline size_t size() const
  {
    return static_cast<size_t>(pEnd_m - pBegin_m);
  }
  inline size_t capacity() const
  {
    return static_cast<size_t>(pEndOfStorage_m - pBegin_m);
  }
  inline bool empty() const
  {
    return pEnd_m == pBegin_m;
  }
  inline bool isMine() const
  {
    return dealloc_m;
  }
  inline bool checkDeref(const T *p) const
  {
    return ((pBegin_m <= p) && (p < pEnd_m));
  }
private:
  void deleteStorage()
  {
    if (isMine() && pBegin_m != 0)
      {
 if (!ElementProperties<T>::hasTrivialDestructor)
   for (T *pt = begin(); pt != end(); ++pt)
     ElementProperties<T>::destruct(pt);
 char *tmp = reinterpret_cast<char *>(pBegin_m);
 delete [] tmp;
      }
  }
  void reallocateStorage(size_t newsize, bool copyold = false)
  {
    T *pBeginNew = 0;
    T *pEndNew = 0;
    T *pEndOfStorageNew = 0;
    if (newsize > 0)
      {
 int nsize = newsize * sizeof(T);
 char *tmp = new char[nsize];
 pBeginNew = reinterpret_cast<T *>(tmp);
 pEndNew = pBeginNew + newsize;
 pEndOfStorageNew = pBeginNew + (nsize / sizeof(T));
 if (copyold)
   {
     T * pOld = begin();
     T * pNew = pBeginNew;
     while (pOld != end() && pNew != pEndNew)
       ElementProperties<T>::construct(pNew++,*pOld++);
   }
      }
    deleteStorage();
    pBegin_m = pBeginNew;
    pEnd_m = pEndNew;
    pEndOfStorage_m = pEndOfStorageNew;
    dealloc_m = true;
  }
  T *pBegin_m;
  T *pEnd_m;
  T *pEndOfStorage_m;
  bool dealloc_m;
};
template <class T,
  bool BoundsChecked=false,
  class Controller=RefBlockController<T> >
class RefCountedBlockPtr
{
public:
  typedef std::random_access_iterator_tag iterator_category;
  typedef T value_type;
  typedef ptrdiff_t difference_type;
  typedef T* pointer;
  typedef T& reference;
  typedef T Element_t;
  typedef T Pointee_t;
  typedef ptrdiff_t Offset_t;
  typedef RefCountedBlockPtr<T,BoundsChecked,Controller> This_t;
  typedef RefCountedBlockPtr<T,!BoundsChecked,Controller> That_t;
  struct NoInitTag
  {
     NoInitTag() { }
     NoInitTag(const NoInitTag &) { }
     NoInitTag & operator=(const NoInitTag &) { return *this; }
  };
  inline RefCountedBlockPtr()
    : offset_m(0)
  { }
  inline explicit RefCountedBlockPtr(size_t size)
    : offset_m(0),
      blockControllerPtr_m(new Controller(size))
  { }
  inline RefCountedBlockPtr(size_t size, const T & model)
    : offset_m(0),
      blockControllerPtr_m(new Controller(size,model))
  { }
  inline RefCountedBlockPtr(size_t size, const NoInitTag &)
    : offset_m(0),
      blockControllerPtr_m(new Controller(size,
       typename Controller::NoInitTag()))
  {
    blockControllerPtr_m->resize(0,typename Controller::NoInitTag());
  }
  inline RefCountedBlockPtr(T *p, size_t size)
    : offset_m(0),
      blockControllerPtr_m(new Controller(p, size))
  { }
  inline RefCountedBlockPtr(const This_t & model)
    : offset_m(model.offset_m),
      blockControllerPtr_m(model.blockControllerPtr_m)
  { }
  inline RefCountedBlockPtr(const That_t & model)
    : offset_m(model.offset_m),
      blockControllerPtr_m(model.blockControllerPtr_m)
  { }
  inline RefCountedBlockPtr(const This_t & model, Offset_t offset)
    : offset_m(model.offset_m + offset),
      blockControllerPtr_m(model.blockControllerPtr_m)
  { }
  inline ~RefCountedBlockPtr() {}
  inline This_t & operator=(const This_t & rhs)
  {
    blockControllerPtr_m = rhs.blockControllerPtr_m;
    offset_m = rhs.offset_m;
    return *this;
  }
  inline This_t & operator=(const That_t & rhs)
  {
    blockControllerPtr_m = rhs.blockControllerPtr_m;
    offset_m = rhs.offset_m;
    return *this;
  }
  template<class T1, bool BoundsChecked1, class Controller1>
  inline bool operator==(
    const RefCountedBlockPtr<T1, BoundsChecked1, Controller1>&) const
  {
    return false;
  }
  template<class T1, bool BoundsChecked1, class Controller1>
  inline bool operator!=(
    const RefCountedBlockPtr<T1, BoundsChecked1, Controller1>&) const
  {
    return true;
  }
  inline bool operator==(const This_t& a) const
  {
    return (beginPointer() == a.beginPointer() && offset() == a.offset());
  }
  inline bool operator!=(const This_t& a) const
  {
    return (beginPointer() != a.beginPointer() || offset() != a.offset());
  }
  inline bool operator<(const This_t& a) const
  {
    ;
    return offset() < a.offset();
  }
  inline bool operator>(const This_t& a) const
  {
    ;
    return offset() > a.offset();
  }
  inline bool operator<=(const This_t& a) const
  {
    ;
    return offset() <= a.offset();
  }
  inline bool operator>=(const This_t& a) const
  {
    ;
    return offset() >= a.offset();
  }
  inline bool operator==(const That_t& a) const
  {
    return (beginPointer() == a.beginPointer() && offset() == a.offset());
  }
  inline bool operator!=(const That_t& a) const
  {
    return (beginPointer() != a.beginPointer() || offset() != a.offset());
  }
  inline T& operator*() const
  {
    T *p = currentPointer();
    boundsAssert(p);
    return *p;
  }
  inline T& operator[](Offset_t i) const
  {
    T *p = currentPointer() + i;
    boundsAssert(p);
    return *p;
  }
  inline T *operator->() const
  {
    T *p = currentPointer();
    boundsAssert(p);
    return p;
  }
  inline This_t & operator++()
  {
    ++offset_m;
    return *this;
  }
  inline This_t & operator--()
  {
    --offset_m;
    return *this;
  }
  inline This_t operator++(int)
  {
    This_t save(*this);
    ++offset_m;
    return save;
  }
  inline This_t operator--(int)
  {
    This_t save(*this);
    --offset_m;
    return save;
  }
  inline void operator+=(Offset_t i)
  {
    offset_m += i;
  }
  inline void operator-=(Offset_t i)
  {
    offset_m -= i;
  }
  inline This_t operator+(Offset_t i) const
  {
    This_t ret(*this);
    ret += i;
    return ret;
  }
  inline This_t operator-(Offset_t i) const
  {
    This_t ret(*this);
    ret -= i;
    return ret;
  }
  inline This_t begin() const
  {
    return This_t(*this, -offset_m);
  }
  inline This_t end() const
  {
    return This_t(*this, size() - offset_m);
  }
  void reserve(size_t size)
  {
    ;
    typedef typename Controller::NoInitTag NoInit_t;
    blockControllerPtr_m = new Controller(size, NoInit_t());
    blockControllerPtr_m->resize(0,NoInit_t());
    offset_m = 0;
  }
  bool resize(size_t size, const NoInitTag &)
  {
    ;
    typedef typename Controller::NoInitTag NoInit_t;
    return blockControllerPtr_m->resize(size, NoInit_t());
  }
  bool resize(size_t size)
  {
    ;
    return blockControllerPtr_m->resize(size);
  }
  bool resize(size_t size, const T &model)
  {
    ;
    return blockControllerPtr_m->resize(size, model);
  }
  void resizeAndCopy(size_t size, const NoInitTag &)
  {
    ;
    typedef typename Controller::NoInitTag NoInit_t;
    blockControllerPtr_m->resizeAndCopy(size, NoInit_t());
  }
  void resizeAndCopy(size_t size)
  {
    ;
    blockControllerPtr_m->resizeAndCopy(size);
  }
  void resizeAndCopy(size_t size, const T &model)
  {
    ;
    blockControllerPtr_m->resizeAndCopy(size, model);
  }
  void invalidate()
  {
    blockControllerPtr_m.invalidate();
    offset_m = 0;
  }
  This_t & makeOwnCopy()
  {
    blockControllerPtr_m.makeOwnCopy();
    return *this;
  }
  inline Offset_t offset() const
  {
    return offset_m;
  }
  inline bool isValid() const
  {
    return blockControllerPtr_m.isValid();
  }
  inline bool isShared() const
  {
    return blockControllerPtr_m.isShared();
  }
  inline int count() const
  {
    return isValid() ? blockControllerPtr_m.count() : 0;
  }
  inline size_t size() const
  {
    return isValid() ? blockControllerPtr_m->size() : 0;
  }
  inline size_t capacity() const
  {
    return isValid() ? blockControllerPtr_m->capacity() : 0;
  }
  inline bool empty() const
  {
    return isValid() ? blockControllerPtr_m->empty() : true;
  }
  inline bool isAtBeginning() const
  {
    return (offset() == 0);
  }
  inline bool isMine() const
  {
    return isValid() ? blockControllerPtr_m->isMine() : true;
  }
  inline T *beginPointer() const
  {
    ;
    return blockControllerPtr_m->begin();
  }
  inline T *endPointer() const
  {
    ;
    return blockControllerPtr_m->end();
  }
  inline T *currentPointer() const
  {
    return beginPointer() + offset();
  }
protected:
  friend class RefCountedBlockPtr<T,!BoundsChecked,Controller>;
  RefCountedBlockPtr(Controller *con)
    : offset_m(0), blockControllerPtr_m(con)
  { }
  inline void boundsAssert(T *p) const
  {
    if (BoundsChecked)
      {
        if (__builtin_expect(!!(isValid() && blockControllerPtr_m->checkDeref(p)), true)) {} else Pooma::toss_cookies("RefCountedBlockPtr: Bounds Violation.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Utilities/RefCountedBlockPtr.h", 1038);
      }
  }
  Offset_t offset_m;
  RefCountedPtr<Controller> blockControllerPtr_m;
};
template <class T, bool C1, bool C2, class Controller>
inline ptrdiff_t
operator-(const RefCountedBlockPtr<T,C1,Controller> &first,
          const RefCountedBlockPtr<T,C2,Controller> &second)
{
  return first.currentPointer() - second.currentPointer();
}
template <class T> class SingleObserver;
template <class T>
class DataBlockController
  : public RefBlockController<T>
{
public:
  typedef Pooma::DataObject_t DataObject_t;
  typedef SingleObservable<int> Observable_t;
  typedef RefBlockController<T> Base_t;
  typedef typename RefBlockController<T>::NoInitTag NoInitTag;
  typedef ObserverEvent::ID_t DynamicID_t;
  explicit
  DataBlockController(size_t size)
    : Base_t(size), dataObjectPtr_m(new DataObject_t(-1)), owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, const T & model)
    : Base_t(size,model), dataObjectPtr_m(new DataObject_t(-1)), owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(T *p, size_t size)
    : Base_t(p,size), dataObjectPtr_m(new DataObject_t(-1)), owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, const NoInitTag &tag)
    : Base_t(size,tag), dataObjectPtr_m(new DataObject_t(-1)), owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  struct WithAffinity
  {
    WithAffinity() { }
    WithAffinity(const WithAffinity&) { }
    WithAffinity &operator=(const WithAffinity &) { return *this; }
  };
  DataBlockController(size_t size, int affinity, const WithAffinity &)
    : Base_t(size), dataObjectPtr_m(new DataObject_t(affinity)), owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, int affinity, const WithAffinity &,
                      const NoInitTag &tag)
    : Base_t(size,tag), dataObjectPtr_m(new DataObject_t(affinity)),
      owned_m(true),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, DataObject_t &dobj)
    : Base_t(size), dataObjectPtr_m(&dobj), owned_m(false),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, const T& model, DataObject_t &dobj)
    : Base_t(size,model), dataObjectPtr_m(&dobj), owned_m(false),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(size_t size, DataObject_t &dobj, const NoInitTag &tag)
    : Base_t(size,tag), dataObjectPtr_m(&dobj), owned_m(false),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(const DataBlockController &model)
    : Base_t(model),
      dataObjectPtr_m(model.dataObjectPtr_m ?
        new DataObject_t(model.affinity()) : 0),
      owned_m(model.dataObjectPtr_m ? true : false),
      observable_m(),
      dynamicID_m(ObserverEvent::nullID())
  { }
  DataBlockController(const DataBlockController &model, DataObject_t &dobj)
    : Base_t(model), observable_m(), owned_m(false),
      dataObjectPtr_m(&dobj),
      dynamicID_m(ObserverEvent::nullID())
  { }
  ~DataBlockController()
  {
    if (owned_m) delete dataObjectPtr_m;
  }
  void attach(SingleObserver<int> *o)
  {
    observable_m.attach(o);
  }
  void detach()
  {
    observable_m.detach();
  }
  inline DataObject_t* dataObject() const
  {
    return dataObjectPtr_m;
  }
  inline void dataObject(DataObject_t *obj)
  {
    if (owned_m) delete dataObjectPtr_m;
    owned_m = false;
    dataObjectPtr_m = obj;
  }
  inline int affinity() const
  {
    return dataObjectPtr_m->affinity();
  }
  inline void affinity(int affin)
  {
    dataObjectPtr_m->affinity(affin);
  }
  enum Notifier { addViewEvent, removeViewEvent };
  inline void notifyOnDestruct()
  {
    observable_m.notify(0,removeViewEvent);
  }
  inline void notifyOnConstruct()
  {
    observable_m.notify(0,addViewEvent);
  }
  DynamicID_t dynamicID() const
  {
    return dynamicID_m;
  }
  void setDynamicID(DynamicID_t id)
  {
    dynamicID_m = id;
  }
private:
  mutable DataObject_t *dataObjectPtr_m;
  bool owned_m;
  Observable_t observable_m;
  DynamicID_t dynamicID_m;
};
template <class T,
          bool BoundsChecked=false>
class DataBlockPtr
  : public RefCountedBlockPtr<T,BoundsChecked,DataBlockController<T> >
{
public:
  typedef T Pointee_t;
  typedef T Element_t;
  typedef DataBlockPtr<T,BoundsChecked> This_t;
  typedef Pooma::DataObject_t DataObject_t;
  typedef SingleObservable<int> Observable_t;
  typedef DataBlockPtr<T,!BoundsChecked> That_t;
  typedef DataBlockController<T> Controller_t;
  typedef RefCountedBlockPtr<T,BoundsChecked,Controller_t> RCBPtr_t;
  typedef typename Controller_t::DynamicID_t DynamicID_t;
  typedef typename RCBPtr_t::NoInitTag NoInitTag;
  DataBlockPtr() : RCBPtr_t()
  { }
  explicit DataBlockPtr(size_t size)
    : RCBPtr_t(size)
  { }
  DataBlockPtr(size_t size, const NoInitTag &tag)
    : RCBPtr_t(size,tag)
  { }
  DataBlockPtr(int size, const T& model)
    : RCBPtr_t(size,model)
  { }
  DataBlockPtr(T* foreignData, int size)
    : RCBPtr_t(foreignData,size)
  { }
  typedef typename Controller_t::WithAffinity WithAffinity_t;
  DataBlockPtr(int size, int affin, const WithAffinity_t&)
    : RCBPtr_t(new Controller_t(size,affin,WithAffinity_t()))
  { }
  DataBlockPtr(int size, int affin, const WithAffinity_t&,
        const NoInitTag &tag)
    : RCBPtr_t(new Controller_t(size,affin,WithAffinity_t(),tag))
  { }
  DataBlockPtr(int size, DataObject_t &dobj)
    : RCBPtr_t(new Controller_t(size,dobj))
  { }
  DataBlockPtr(int size, const T& model, DataObject_t &dobj)
    : RCBPtr_t(new Controller_t(size,model,dobj))
  { }
  DataBlockPtr(int size, DataObject_t &dobj, const NoInitTag &tag)
    : RCBPtr_t(new Controller_t(size,dobj,tag))
  { }
  DataBlockPtr(const This_t& model)
    : RCBPtr_t(model)
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnConstruct();
  }
  DataBlockPtr(const This_t& model, DataObject_t &dobj)
    : RCBPtr_t(new Controller_t(model, dobj))
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnConstruct();
  }
  DataBlockPtr(const That_t& model)
    : RCBPtr_t(model)
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnConstruct();
  }
  DataBlockPtr(const RCBPtr_t& model)
    : RCBPtr_t(model)
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnConstruct();
  }
  DataBlockPtr(const This_t& model, ptrdiff_t offset)
    : RCBPtr_t(model,offset)
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnConstruct();
  }
  ~DataBlockPtr()
  {
    if (this->isValid()) this->blockControllerPtr_m->notifyOnDestruct();
  }
  This_t & operator=(const This_t & rhs)
  {
    if (this != &rhs)
      {
 if (rhs.isValid()) rhs.blockControllerPtr_m->notifyOnConstruct();
 if (this->isValid()) this->blockControllerPtr_m->notifyOnDestruct();
 RCBPtr_t::operator=(rhs);
      }
    return *this;
  }
  This_t & operator=(const That_t & rhs)
  {
    if (this != &rhs)
      {
 if (rhs.isValid()) rhs.blockControllerPtr_m->notifyOnConstruct();
 if (this->isValid()) this->blockControllerPtr_m->notifyOnDestruct();
 RCBPtr_t::operator=(rhs);
      }
    return *this;
  }
  This_t & operator++()
  { RCBPtr_t::operator++(); return *this; }
  This_t & operator--()
  { RCBPtr_t::operator--(); return *this; }
  This_t operator++(int)
  {
    This_t tmp(*this);
    RCBPtr_t::operator++();
    return tmp;
  }
  This_t operator--(int)
  {
    This_t tmp(*this);
    RCBPtr_t::operator--();
    return tmp;
  }
  This_t operator+(ptrdiff_t i) const
  {
    This_t ret(*this);
    ret += i;
    return ret;
  }
  This_t operator-(ptrdiff_t i) const
  {
    This_t ret(*this);
    ret -= i;
    return ret;
  }
  This_t begin() const
  { return RCBPtr_t::begin(); }
  This_t end() const
  { return RCBPtr_t::end(); }
  void attach(SingleObserver<int> *o)
  {
    this->blockControllerPtr_m->attach(o);
  }
  void detach()
  {
    this->blockControllerPtr_m->detach();
  }
  inline DataObject_t* dataObject() const
  {
    return this->blockControllerPtr_m->dataObject();
  }
  inline void dataObject(DataObject_t *obj)
  {
    this->blockControllerPtr_m->dataObject(obj);
  }
  inline int affinity() const
  {
    return this->blockControllerPtr_m->affinity();
  }
  inline void affinity(int affin)
  {
    this->blockControllerPtr_m->affinity(affin);
  }
  bool sameDataObject(const DataBlockPtr<T>& x) const
  {
    return dataObject() == x.dataObject();
  }
  void lockRefCount() const { this->blockControllerPtr_m->lock(); }
  void unlockRefCount() const { this->blockControllerPtr_m->unlock(); }
  DynamicID_t dynamicID() const
  {
    return this->isValid() ?
      this->blockControllerPtr_m->dynamicID() :
      ObserverEvent::nullID();
  }
  void setDynamicID(DynamicID_t id)
  {
    ;
    this->blockControllerPtr_m->setDynamicID(id);
  }
private:
  friend class DataBlockPtr<T,!BoundsChecked>;
};
template <class T, bool C1, bool C2>
ptrdiff_t operator-(const DataBlockPtr<T,C1> &first,
      const DataBlockPtr<T,C2> &second)
{
  return first.currentPointer() - second.currentPointer();
}
template<class T>
class IndirectionList
{
public:
  typedef IndirectionList<T> This_t;
  typedef T Element_t;
  typedef IndirectionList<T> Domain_t;
  typedef DataBlockPtr<T> Storage_t;
  typedef long Size_t;
  enum { dimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  IndirectionList()
    : size_m(0)
    {
    }
  IndirectionList(const This_t &a)
    : iList_m(a.iList_m), size_m(a.size_m)
    {
    }
  IndirectionList(int num) : iList_m(num), size_m(num) { ; }
  IndirectionList(long num) : iList_m(num), size_m(num) { ; }
  IndirectionList(unsigned int num) : iList_m(num), size_m(num) { }
  IndirectionList(unsigned long num) : iList_m(num), size_m(num) { }
  template<class T1>
  IndirectionList(const T1 &first, const T1 &stride, Size_t num)
    : iList_m(num), size_m(num)
    {
      ;
      T1 val = first;
      for (Size_t i=0; i < num; ++i)
 {
   iList_m[i] = val;
   val += stride;
 }
    }
  template<class T1>
  explicit IndirectionList(const T1 &a)
    : iList_m(a.engine().dataBlock()), size_m(a.domain().size())
    {
    }
  ~IndirectionList()
    {
    }
  This_t &operator=(const This_t &newilist)
    {
      iList_m = newilist.iList_m;
      size_m = newilist.size_m;
      return *this;
    }
  template<class T1>
  This_t &operator=(const T1 &a)
    {
      iList_m = a.engine().dataBlock();
      size_m = a.domain().size();
      return *this;
    }
  This_t &operator[](int i)
    {
      ;
      return *this;
    }
  const This_t &operator[](int i) const
    {
      ;
      return *this;
    }
  const T &operator()(Size_t i1) const
    {
      return iList_m[i1];
    }
  T &operator()(Size_t i1)
    {
      return iList_m[i1];
    }
  Size_t length() const
    {
      return size_m;
    }
  T first() const
    {
      return iList_m[0];
    }
  T last() const
    {
      return iList_m[size_m-1];
    }
  T stride() const
    {
      return T(0);
    }
  T min() const
    {
      T result = iList_m[0];
      for (Size_t i=1; i<size_m; ++i)
 result = (iList_m[i] < result) ? iList_m[i] : result;
      return result;
    }
  T max() const
    {
      T result = iList_m[0];
      for (Size_t i=1; i<size_m; ++i)
 result = (result < iList_m[i]) ? iList_m[i] : result;
      return result;
    }
  Size_t size() const
    {
      return size_m;
    }
  bool empty() const
    {
      return (size() == 0);
    }
  bool initialized() const
    {
      return (!empty());
    }
  template<class T1>
  This_t &operator+=(const T1 &val)
    {
      Size_t n = size();
      if (n > 0)
 {
   iList_m.makeOwnCopy();
   for (Size_t i=0; i < n; ++i)
     iList_m[i] += val;
 }
      return *this;
    }
  template<class T1>
  This_t &operator-=(const T1 &val)
    {
      Size_t n = size();
      if (n > 0)
 {
   iList_m.makeOwnCopy();
   for (Size_t i=0; i < n; ++i)
     iList_m[i] -= val;
 }
      return *this;
    }
  template<class T1>
  This_t &operator*=(const T1 &val)
    {
      Size_t n = size();
      if (n > 0)
 {
   iList_m.makeOwnCopy();
   for (Size_t i=0; i < n; ++i)
     iList_m[i] *= val;
 }
      return *this;
    }
  template<class T1>
  This_t &operator/=(const T1 &val)
    {
      Size_t n = size();
      if (n > 0)
 {
   iList_m.makeOwnCopy();
   for (Size_t i=0; i < n; ++i)
     iList_m[i] /= val;
 }
      return *this;
    }
  template<class Out>
  void print(Out &o) const;
private:
  Storage_t iList_m;
  Size_t size_m;
};
template<class T>
template<class Out>
void IndirectionList<T>::print(Out &o) const
{
  o << "[";
  for (Size_t i=0; i < size(); ++i)
    {
      o << (*this)(i);
      if (i < (size() - 1))
 o << ",";
    }
  o << "]";
}
template<class T>
std::ostream& operator<<(std::ostream &o, const IndirectionList<T> &list)
{
  list.print(o);
  return o;
}
namespace Pooma {
template <class Iter>
class IteratorPairDomain
{
public:
  typedef IteratorPairDomain<Iter> This_t;
  typedef Iter iterator;
  typedef std::iterator_traits<Iter> IterTraits_t;
  typedef typename IterTraits_t::value_type Element_t;
  typedef typename IterTraits_t::reference ElementRef_t;
  typedef long Size_t;
  enum { dimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  IteratorPairDomain() : size_m(0) { }
  IteratorPairDomain(Iter begin, Iter end)
    : begin_m(begin), end_m(end)
  {
    size_m = std::distance(begin_m,end_m);
  }
  IteratorPairDomain(const This_t &a)
    : begin_m(a.begin_m), end_m(a.end_m), size_m(a.size_m)
  { }
  template <class OtherIter>
  IteratorPairDomain(const IteratorPairDomain<OtherIter> &a)
    : begin_m(a.begin()), end_m(a.end()), size_m(a.size())
  { }
  This_t &operator=(const This_t &model)
  {
    begin_m = model.begin_m;
    end_m = model.end_m;
    size_m = model.size_m;
    return *this;
  }
  This_t &operator[](int i)
  {
    ;
    return *this;
  }
  const This_t &operator[](int i) const
  {
    ;
    return *this;
  }
  Element_t operator()(Size_t i) const
  {
    ;
    Iter pos = begin_m;
    std::advance(pos,i);
    return *pos;
  }
  ElementRef_t operator()(Size_t i)
  {
    ;
    Iter pos = begin_m;
    std::advance(pos,i);
    return *pos;
  }
  Size_t length() const { return size_m; }
  Size_t size() const { return size_m; }
  bool empty() const { return size_m == 0; }
  bool initialized() const { return size_m != 0; }
  Element_t first() const { return *begin_m; }
  Element_t last() const
  {
    Iter lpos = begin_m;
    std::advance(lpos,size_m-1);
    return *lpos;
  }
  Element_t min() const
  {
    Iter pos = begin_m;
    Element_t result = *pos++;
    for (Size_t i = 1; i < size_m; ++i)
      {
        if (*pos < result) result = *pos;
        ++pos;
      }
    return result;
  }
  Element_t max() const
  {
    Iter pos = begin_m;
    Element_t result = *pos++;
    for (Size_t i = 1; i < size_m; ++i)
      {
        if (result < *pos) result = *pos;
        ++pos;
      }
    return result;
  }
  Iter begin() const { return begin_m; }
  Iter end() const { return end_m; }
  template <class Out>
  void print(Out &o) const;
private:
  Iter begin_m;
  Iter end_m;
  Size_t size_m;
};
template <class Iter>
template <class Out>
void IteratorPairDomain<Iter>::print(Out &o) const
{
  o << "[";
  Iter pos = begin_m;
  o << *pos++;
  for (Size_t i = 1; i < size_m; ++i)
    {
      o << "," << *pos++;
    }
  o << "]";
}
template <class Iter>
std::ostream&
operator<<(std::ostream &o, const IteratorPairDomain<Iter> &list)
{
  list.print(o);
  return o;
}
}
using Pooma::IteratorPairDomain;
struct DynamicEvents
{
  enum EventCode {
         create = 1000,
  extend,
  destroyInterval, destroyRange, destroyList, destroyIterList,
  copyInterval, copyRange, copyList,
  copyPatchList,
  sync,
  unknownEvent };
  static bool isDynamic(int eventcode)
  {
    return eventcode >= DynamicEvents::create &&
           eventcode < DynamicEvents::unknownEvent;
  }
  enum { backfill = 100, shiftup, unknownMethod };
  typedef int PatchID_t;
  typedef int CreateSize_t;
};
struct BackFill
{
  enum { code = DynamicEvents::backfill };
  BackFill(){};
};
struct ShiftUp
{
  enum { code = DynamicEvents::shiftup };
  ShiftUp(){};
};
template<class T>
struct DynamicEventType
{
  enum { destroyCode = DynamicEvents::destroyList };
  enum { copyCode = DynamicEvents::copyList };
  enum { dimensions = 1 };
  typedef IndirectionList<int> Domain_t;
};
template <>
struct DynamicEventType<IteratorPairDomain<const int*> >
{
  enum { destroyCode = DynamicEvents::destroyIterList };
  enum { copyCode = DynamicEvents::copyList };
  enum { dimensions = 1 };
  typedef IteratorPairDomain<const int*> Domain_t;
};
template <>
struct DynamicEventType<IteratorPairDomain<int*> >
{
  enum { destroyCode = DynamicEvents::destroyIterList };
  enum { copyCode = DynamicEvents::copyList };
  enum { dimensions = 1 };
  typedef IteratorPairDomain<const int*> Domain_t;
};
template<>
struct DynamicEventType< IndirectionList< IndirectionList<int> > >
{
  enum { destroyCode = DynamicEvents::unknownEvent };
  enum { copyCode = DynamicEvents::copyPatchList };
  enum { dimensions = 1 };
  typedef IndirectionList< IndirectionList<int> > Domain_t;
};
template<int Dim>
struct DynamicEventType< Interval<Dim> >
{
  enum { destroyCode = DynamicEvents::destroyInterval };
  enum { copyCode = DynamicEvents::copyInterval };
  enum { dimensions = Dim };
  typedef Interval<Dim> Domain_t;
};
template<int Dim>
struct DynamicEventType< Range<Dim> >
{
  enum { destroyCode = DynamicEvents::destroyRange };
  enum { copyCode = DynamicEvents::copyRange };
  enum { dimensions = Dim };
  typedef Range<Dim> Domain_t;
};
template<int Dim>
struct DynamicEventType< Loc<Dim> >
{
  enum { destroyCode = DynamicEvents::destroyInterval };
  enum { copyCode = DynamicEvents::copyInterval };
  enum { dimensions = Dim };
  typedef Interval<Dim> Domain_t;
};
template<>
struct DynamicEventType<int>
{
  enum { destroyCode = DynamicEvents::destroyInterval };
  enum { copyCode = DynamicEvents::copyInterval };
  enum { dimensions = 1 };
  typedef Interval<1> Domain_t;
};
class CreateEvent : public ObserverEvent
{
public:
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  CreateEvent(CreateSize_t num, PatchID_t p)
    : ObserverEvent(DynamicEvents::create),
      amount_m(num), patch_m(p)
    {
    }
  virtual ~CreateEvent()
    {
    }
  inline CreateSize_t amount() const
    {
      return amount_m;
    }
  inline PatchID_t patch() const
    {
      return patch_m;
    }
private:
  CreateSize_t amount_m;
  PatchID_t patch_m;
};
template<class Dom>
class DestroyEvent : public ObserverEvent
{
public:
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef typename DynamicEventType<Dom>::Domain_t Domain_t;
  template<class D>
  DestroyEvent(const D &d, PatchID_t p, int method)
    : ObserverEvent(DynamicEventType<Dom>::destroyCode),
      domain_m(d), patch_m(p), method_m(method)
    {
      PoomaCTAssert<(DynamicEventType<Dom>::dimensions == 1)>::test();
    }
  virtual ~DestroyEvent()
    {
    }
  inline const Domain_t &domain() const
    {
      return domain_m;
    }
  inline PatchID_t patch() const
    {
      return patch_m;
    }
  inline int method() const
    {
      return method_m;
    }
private:
  Domain_t domain_m;
  PatchID_t patch_m;
  int method_m;
};
template<class Dom>
class CopyEvent : public ObserverEvent
{
public:
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef typename DynamicEventType<Dom>::Domain_t Domain_t;
  CopyEvent(const Dom &d, PatchID_t fromp, PatchID_t top)
    : ObserverEvent(DynamicEventType<Dom>::copyCode),
      domain_m(d), from_m(fromp), to_m(top)
    {
      PoomaCTAssert<(DynamicEventType<Dom>::dimensions == 1)>::test();
    }
  template<class D>
  CopyEvent(const D &d, PatchID_t fromp, PatchID_t top)
    : ObserverEvent(DynamicEventType<Dom>::copyCode),
      domain_m(d), from_m(fromp), to_m(top)
    {
      PoomaCTAssert<(DynamicEventType<Dom>::dimensions == 1)>::test();
    }
  virtual ~CopyEvent()
    {
    }
  inline const Domain_t &domain() const
    {
      return domain_m;
    }
  inline PatchID_t fromPatch() const
    {
      return from_m;
    }
  inline PatchID_t toPatch() const
    {
      return to_m;
    }
private:
  Domain_t domain_m;
  PatchID_t from_m;
  PatchID_t to_m;
};
class CopyPatchEvent : public ObserverEvent
{
public:
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef IndirectionList< IndirectionList<int> > Domain_t;
  typedef IndirectionList<int> IDList_t;
  CopyPatchEvent(const Domain_t &domlists, const IDList_t &fromlist,
   PatchID_t top, bool create)
    : ObserverEvent(DynamicEvents::copyPatchList),
      lists_m(domlists), from_m(fromlist), to_m(top), create_m(create)
    {
    }
  virtual ~CopyPatchEvent()
    {
    }
  inline const Domain_t &domainLists() const
    {
      return lists_m;
    }
  inline const IDList_t &fromPatch() const
    {
      return from_m;
    }
  inline PatchID_t toPatch() const
    {
      return to_m;
    }
  inline bool create() const
    {
      return create_m;
    }
private:
  Domain_t lists_m;
  IDList_t from_m;
  PatchID_t to_m;
  bool create_m;
};
class SyncEvent : public ObserverEvent
{
public:
  SyncEvent()
    : ObserverEvent(DynamicEvents::sync)
    {
    }
  virtual ~SyncEvent()
    {
    }
private:
};
template<int Dim>
class ContextMapper
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  ContextMapper(){};
  virtual ~ContextMapper(){};
  virtual void map(const List_t & templist) const = 0;
  void setAffinity(const List_t & templist) const;
};
template<int Dim>
void ContextMapper<Dim>::setAffinity(const List_t & templist) const
{
  int affinityMax = Smarts::concurrency();
  int idMax = 0;
  typename List_t::const_iterator start = templist.begin();
  typename List_t::const_iterator end = templist.end();
  for ( ; start != end ; ++start)
    if((*start)->context()==Pooma::context())
      {
 (*start)->localID()=idMax;
 ++idMax;
      }
  start = templist.begin();
  for ( ; start != end ; ++start)
    {
      if((*start)->context()==Pooma::context())
 (*start)->affinity() = static_cast<int>
   ( affinityMax * ( (*start)->localID()
       / static_cast<double>(idMax) ) );
    }
  return;
}
template<int Dim>
class LocalMapper
  : public ContextMapper<Dim>
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template<class Partitioner>
  LocalMapper(const Partitioner &)
  {}
  LocalMapper()
  {}
  void map(const List_t & templist) const;
};
template<int Dim>
void LocalMapper<Dim>::map(const List_t & templist) const
{
  int idMax = templist.size();
  int naff = Smarts::concurrency();
  for (int i = 0; i< templist.size(); ++i)
    {
      templist[i]->context() = -1;
      templist[i]->localID() = i;
      templist[i]->affinity() = static_cast<int>( ( naff * ( i /
    static_cast<double>(idMax) ) ) );
    }
}
template<int Dim>
class DefaultTPmapper
  : public ContextMapper<Dim>
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template<class Partitioner>
  DefaultTPmapper(const Partitioner & gp)
  {
  }
  void map(const List_t & templist) const;
private:
};
template<int Dim>
void DefaultTPmapper<Dim>::map(const List_t & templist) const
{
  int ncontexts = Pooma::contexts();
  int npc = templist.size()/ncontexts;
  if (templist.size()%ncontexts!=0) ++npc;
  typename List_t::const_iterator start = templist.begin();
  typename List_t::const_iterator end = templist.end();
  int c = 0;
  int p = 0;
  for ( ; start!=end ; ++start)
    {
      (*start)->context() = p;
      if(p == Pooma::context())
 (*start)->localID() = c;
      ++c;
      if (c > npc)
 {
   ++p;
   c = 0;
 }
    }
  int affinityMax = Smarts::concurrency();
  int idMax = 0;
  start = templist.begin();
  for ( ; start != end ; ++start)
    if((*start)->context()==Pooma::context())
      {
 (*start)->localID()=idMax;
 ++idMax;
      }
  start = templist.begin();
  for ( ; start != end ; ++start)
    {
      if((*start)->context()==Pooma::context())
 (*start)->affinity() = static_cast<int>( affinityMax *
       ( (*start)->localID() /
          static_cast<double>(idMax) ) );
    }
}
template<int Dim>
class TilePartition
{
public:
  typedef LocalMapper<Dim> DefaultMapper_t;
  typedef Interval<Dim> Domain_t;
  typedef std::vector<Domain_t> PatchList_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  enum { uniform = false };
  enum { gridded = false };
  enum { tile = true };
  enum { general = true };
  enum { dimensions = Dim };
  TilePartition()
    : hasInternalGuards_m(false),
      hasExternalGuards_m(false),
      num_m(0),
      internalGuards_m(0),
      externalGuards_m(0)
  {
  }
  TilePartition(const PatchList_t &pList)
    : hasInternalGuards_m(false),
      hasExternalGuards_m(false),
      internalGuards_m(0),
      externalGuards_m(0),
      tile_m(pList)
  {
    num_m = pList.size();
  }
  TilePartition(const PatchList_t &pList,
  const GuardLayers<Dim> &gcs)
    : hasInternalGuards_m(true),
      hasExternalGuards_m(false),
      internalGuards_m(gcs),
      externalGuards_m(gcs),
      tile_m(pList)
  {
    num_m = tile_m.size();
  }
  TilePartition(const PatchList_t &pList,
  const GuardLayers<Dim> &igcs,
  const GuardLayers<Dim> &egcs)
    : hasInternalGuards_m(true),
      hasExternalGuards_m(true),
      internalGuards_m(igcs),
      externalGuards_m(egcs),
      tile_m(pList)
  {
    num_m = tile_m.size();
  }
  TilePartition(const TilePartition<Dim> & b)
    : hasInternalGuards_m(b.hasInternalGuards_m),
      hasExternalGuards_m(b.hasExternalGuards_m),
      internalGuards_m(b.internalGuards_m),
      externalGuards_m(b.externalGuards_m),
      tile_m(b.tile_m),
      num_m(b.num_m)
  {
  }
  ~TilePartition() { }
  TilePartition<Dim> &operator=(const TilePartition<Dim> &g)
  {
    if (this != &g)
      {
 hasInternalGuards_m = g.hasInternalGuards_m;
 hasExternalGuards_m = g.hasExternalGuards_m;
 internalGuards_m = g.internalGuards_m;
 externalGuards_m = g.externalGuards_m;
 tile_m = const_cast<TilePartition<Dim>&>(g).tileList();
 num_m = g.maxSize();
 if (!hasInternalGuards_m)
   internalGuards_m = GuardLayers<Dim>(0);
 if (!hasExternalGuards_m)
   externalGuards_m = GuardLayers<Dim>(0);
      }
    return *this;
  }
  int maxSize() const { return num_m; }
  PatchList_t tileList() { return tile_m; }
  bool hasGuards() const { return hasInternalGuards_m||hasExternalGuards_m; }
  bool hasCustomEdgeGuards() const
  {
    if (hasInternalGuards_m&&!hasExternalGuards_m) return true;
    if (!hasInternalGuards_m&&hasExternalGuards_m) return true;
    if (hasInternalGuards_m&&hasExternalGuards_m
       &&(internalGuards_m!=externalGuards_m)) return true;
    return false;
  }
  bool hasInternalGuards() const { return hasInternalGuards_m; }
  bool hasExternalGuards() const { return hasExternalGuards_m;}
  const GuardLayers<Dim> &internalGuards() const
  {
    return internalGuards_m;
  }
  const GuardLayers<Dim> &externalGuards() const
  {
    return externalGuards_m;
  }
  template<class D>
  int partition(const D &bbox,List_t &all,const ContextMapper<Dim> &cmapper) const;
  template<class D>
  int partition(const D &bbox,List_t &all) const
  {
    return partition(bbox,all,LocalMapper<Dim>(*this));
  }
  template<class Out>
  void print(Out &o) const;
private:
  bool hasInternalGuards_m;
  bool hasExternalGuards_m;
  GuardLayers<Dim> internalGuards_m;
  GuardLayers<Dim> externalGuards_m;
  int num_m;
  PatchList_t tile_m;
};
template<int Dim>
template<class D>
int TilePartition<Dim>::partition(const D &bbox, List_t &all,
      const ContextMapper<Dim> &cmapper) const
{
  typedef typename DomainTraits<Domain_t>::Element_t Element_t;
  PoomaCTAssert<(Dim == DomainTraits<Domain_t>::dimensions)>::test();
  typename PatchList_t::const_iterator start = tile_m.begin();
  typename PatchList_t::const_iterator end = tile_m.end();
  while (start!=end)
    {
      Domain_t o = Pooma::NoInit();
      o = * start;
      Domain_t oo = o;
      Domain_t a = Pooma::NoInit();
      a = * start;
      if (hasInternalGuards()||hasExternalGuards())
 {
   for (int i=0;i<Dim;i++)
     {
       if (oo[i].first() == bbox[i].first())
  {
    if (hasExternalGuards())
      {
        o[i]=Interval<1>(o[i].first()-externalGuards().lower(i),
           o[i].last());
        a[i]=Interval<1>(a[i].first()-externalGuards().lower(i),
           a[i].last());
      }
    if (hasInternalGuards() && oo[i].last() != bbox[i].last() )
      a[i]=Interval<1>(a[i].first(),
         a[i].last()+internalGuards().upper(i));
  }
       if (oo[i].last()== bbox[i].last())
  {
    if (hasExternalGuards())
      {
        o[i]=Interval<1>(o[i].first(),
           o[i].last()+externalGuards().upper(i));
        a[i]=Interval<1>(a[i].first(),
           a[i].last()+externalGuards().upper(i));
      }
    if (hasInternalGuards()&&(oo[i].first() != bbox[i].first()))
      a[i]=Interval<1>(a[i].first()-internalGuards().lower(i),
         a[i].last());
  }
       if (oo[i].first()!=bbox[i].first() &&
    oo[i].last() != bbox[i].last() &&
    hasInternalGuards())
  a[i]=Interval<1>(o[i].first()-internalGuards().lower(i),
     o[i].last()+internalGuards().upper(i));
     }
 }
      Value_t * node = new Value_t(o,a,-1,all.size(),-1);
      all.push_back(node);
      ++start;
    }
  cmapper.map(all);
  return all.size();
}
template<int Dim>
template<class Out>
void TilePartition<Dim>::print(Out &o) const
{
  int i;
  o << "TilePartition<" << Dim << ">:" << std::endl;
  o << "  hasInternalGuards_m  hasExternalGuards_m = ";
  o << hasInternalGuards_m<< " "<<hasExternalGuards_m<< std::endl;
  o << "  internalGuards_m:" << std::endl;
  o << "      upper       ";
  for (i=0; i < Dim; ++i)
    o << internalGuards_m.upper(i) << " ";
  o << std::endl;
  o << "      lower       ";
  for (i=0; i < Dim; ++i)
    o << internalGuards_m.lower(i) << " ";
  o << std::endl;
  o << "  externalGuards_m:" << std::endl;
  o << "      upper       ";
  for (i=0; i < Dim; ++i)
    o << externalGuards_m.upper(i) << " ";
  o << std::endl;
  o << "      lower       ";
  for (i=0; i < Dim; ++i)
    o << externalGuards_m.lower(i) << " ";
  o << std::endl;
  o << "  num_m = " << num_m << std::endl;
}
template <int Dim>
std::ostream &operator<<(std::ostream &o, const TilePartition<Dim> &gp)
{
  gp.print(o);
  return o;
}
extern
bool findLeftCommonEndpoint(int a0, int a1, int s, int b0, int b1, int t,
                            int &endpoint);
extern
bool findIntersectionEndpoints(int a0, int a1, int s, int b0, int b1, int t,
                               int &i0, int &i1, int &is);
template<class T1, class T2, class T3, int Dim, bool strided>
struct IntersectDomainSingle {
  static void intersect(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::Element_t E1_t;
    typedef typename DomainTraits<T2>::Element_t E2_t;
    E1_t a0 = a.min();
    E1_t a1 = a.max();
    E2_t b0 = b.min();
    E2_t b1 = b.max();
    if (a1 < b0 || a0 > b1)
      return;
    if (b0 > a0)
      a0 = b0;
    if (b1 < a1)
      a1 = b1;
    typedef typename DomainTraits<T3>::OneDomain_t Dom_t;
    c[Dim-1] = Dom_t(a0, a1);
  }
};
template<class T1, class T2, class T3, int Dim>
struct IntersectDomainSingle<T1,T2,T3,Dim,true> {
  static void intersect(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::Element_t E1_t;
    typedef typename DomainTraits<T2>::Element_t E2_t;
    E1_t s = a.stride();
    E2_t t = b.stride();
    if (s == 1 && t == 1) {
      IntersectDomainSingle<T1,T2,T3,Dim,false>::intersect(a,b,c);
      return;
    }
    E1_t a0 = a.min();
    E1_t a1 = a.max();
    E2_t b0 = b.min();
    E2_t b1 = b.max();
    if (a1 < b0 || a0 > b1)
      return;
    int i1, i2, is;
    if (findIntersectionEndpoints(a0, a1, s, b0, b1, t, i1, i2, is)) {
      typedef typename DomainTraits<T3>::OneDomain_t Dom_t;
      if (s < 0)
        c[Dim-1] = Dom_t(i2, i1, -is);
      else
        c[Dim-1] = Dom_t(i1, i2, is);
    }
  }
};
template<class T1, class T2, class T3, int Dim>
struct IntersectDomain {
  enum { strided =
    !DomainTraits<T1>::unitStride || !DomainTraits<T2>::unitStride };
  static void intersect(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    IntersectDomainSingle<Dom1_t,Dom2_t,T3,Dim,strided>::intersect(
      DomainTraits<T1>::getDomain(a,Dim-1),
      DomainTraits<T2>::getDomain(b,Dim-1), c);
    IntersectDomain<T1,T2,T3,Dim-1>::intersect(a,b,c);
  }
};
template<class T1, class T2, class T3>
struct IntersectDomain<T1,T2,T3,1> {
  enum { strided =
    !DomainTraits<T1>::unitStride || !DomainTraits<T2>::unitStride };
  static void intersect(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    IntersectDomainSingle<Dom1_t,Dom2_t,T3,1,strided>::intersect(
      DomainTraits<T1>::getDomain(a,0), DomainTraits<T2>::getDomain(b,0), c);
  }
};
template<class T1, class T2>
struct IntersectReturnType {
  typedef typename NewDomain2<T1,T2>::Type_t Combine_t;
  typedef typename
    DomainChangeDim<Combine_t,DomainTraits<T1>::dimensions>::NewType_t Type_t;
};
template<class T1, class T2>
inline typename IntersectReturnType<T1,T2>::Type_t
intersect(const T1 &a, const T2 &b)
{
  typedef typename IntersectReturnType<T1,T2>::Type_t T3;
  PoomaCTAssert<((int)DomainTraits<T1>::dimensions == DomainTraits<T2>::dimensions)>::test();
  T3 c;
  IntersectDomain<T1,T2,T3,DomainTraits<T1>::dimensions>::intersect(a, b, c);
  return c;
}
template<int TotalDim, int SliceDim> class SliceRange;
template<int TotalDim, int SliceDim>
struct DomainTraits< SliceRange<TotalDim,SliceDim> >
{
  enum { domain = true };
  enum { dimensions = TotalDim,
  sliceDimensions = SliceDim };
  enum { unitStride = false };
  enum { singleValued = false };
  enum { wildcard = false };
  typedef SliceRange<TotalDim,SliceDim> Domain_t;
  typedef SliceRange<TotalDim,SliceDim> NewDomain1_t;
  typedef Range<SliceDim> SliceDomain_t;
  typedef Range<TotalDim> TotalDomain_t;
  typedef Range<1> OneDomain_t;
  typedef Range<1> PointDomain_t;
  static OneDomain_t &getDomain(Domain_t &d, int n) {
    return d.totalDomain()[n];
  }
  static const OneDomain_t &getDomain(const Domain_t &d,int n) {
    return d.totalDomain()[n];
  }
  static OneDomain_t &getSliceDomain(Domain_t &d, int n) {
    return d.sliceDomain()[n];
  }
  static const OneDomain_t &getSliceDomain(const Domain_t &d, int n) {
    return d.sliceDomain()[n];
  }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void cantIgnoreDomain(Domain_t &d, int n) {
    d.cantIgnoreDomain(n);
  }
  static bool getIgnorable(const Domain_t &d, int n) {
    return d.ignorable(n);
  }
  static void setIgnorable(Domain_t &d, int n, bool i) {
    d.ignorable(n) = i;
  }
};
template<class DT>
class SliceDomain
{
public:
  typedef typename DT::Domain_t Domain_t;
  typedef typename DT::SliceDomain_t SliceDomain_t;
  typedef typename DT::TotalDomain_t TotalDomain_t;
  SliceDomain()
    : slice_m(Pooma::NoInit()),
      domain_m(Pooma::NoInit()) {
    PoomaCTAssert<(DT::sliceDimensions <= DT::dimensions)>::test();
    for (int d = 0; d < DT::dimensions; ++d)
      ignore_m[d] = true;
  }
  SliceDomain(const Pooma::NoInit &e)
    : slice_m(e), domain_m(e) {
    PoomaCTAssert<(DT::sliceDimensions <= DT::dimensions)>::test();
    for (int d = 0; d < DT::dimensions; ++d)
      ignore_m[d] = true;
  }
  SliceDomain(const SliceDomain<DT> &sd)
    : slice_m(sd.slice_m),
      domain_m(sd.domain_m) {
    PoomaCTAssert<(DT::sliceDimensions <= DT::dimensions)>::test();
    for (int d = 0; d < DT::dimensions; ++d)
      ignore_m[d] = sd.ignore_m[d];
  }
  template <class DTO>
  SliceDomain(const SliceDomain<DTO> &sd)
    : slice_m(sd.sliceDomain()),
      domain_m(sd.totalDomain()) {
    PoomaCTAssert<(DT::sliceDimensions <= DT::dimensions)>::test();
    for (int d = 0; d < DT::dimensions; ++d)
      ignore_m[d] = sd.ignorable(d);
  }
  Domain_t &unwrap() { return *static_cast<Domain_t *>(this); }
  const Domain_t &unwrap() const {
    return *static_cast<const Domain_t *>(this);
  }
  ~SliceDomain() { }
  const SliceDomain_t &sliceDomain() const { return slice_m; }
  SliceDomain_t &sliceDomain() { return slice_m; }
  const TotalDomain_t &totalDomain() const { return domain_m; }
  TotalDomain_t &totalDomain() { return domain_m; }
  void cantIgnoreDomain(int d)
  {
    ;
    ignore_m[d] = false;
  }
  bool &ignorable(int d)
  {
    ;
    return ignore_m[d];
  }
  bool ignorable(int d) const
  {
    ;
    return ignore_m[d];
  }
  SliceDomain<DT> &operator=(const SliceDomain<DT> &sd) {
    slice_m = sd.slice_m;
    domain_m = sd.domain_m;
    for (int d = 0; d < DT::dimensions; ++d)
      ignore_m[d] = sd.ignore_m[d];
    return *this;
  }
  void setSliceFromTotal() {
    for (int d = 0, dt = 0; d < DT::dimensions; ++d)
      if (!ignore_m[d])
        slice_m[dt++] = domain_m[d];
  }
  template<class Out>
  void print(Out &o) const;
private:
  SliceDomain_t slice_m;
  TotalDomain_t domain_m;
  bool ignore_m[DT::dimensions];
};
template<class DT>
template<class Out>
void SliceDomain<DT>::print(Out &o) const
{
  o << totalDomain() << "==>" << sliceDomain();
}
template <class T1, class T2> inline typename T1::Domain_t operator+(const SliceDomain<T1> &d1, const DomainBase<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2.unwrap(); ret.setSliceFromTotal(); return ret; } template <class T1, class T2> inline typename T1::Domain_t operator+(const SliceDomain<T1> &d1, const SliceDomain<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2.unwrap().totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, unsigned char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(unsigned char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, unsigned short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(unsigned short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, unsigned int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(unsigned int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, unsigned long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(unsigned long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, float d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(float d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(const SliceDomain<T> &d1, double d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() += d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator+(double d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 + ret.totalDomain(); ret.setSliceFromTotal(); return ret; }
template <class T1, class T2> inline typename T1::Domain_t operator-(const SliceDomain<T1> &d1, const DomainBase<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2.unwrap(); ret.setSliceFromTotal(); return ret; } template <class T1, class T2> inline typename T1::Domain_t operator-(const SliceDomain<T1> &d1, const SliceDomain<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2.unwrap().totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, unsigned char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(unsigned char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, unsigned short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(unsigned short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, unsigned int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(unsigned int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, unsigned long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(unsigned long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, float d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(float d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(const SliceDomain<T> &d1, double d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() -= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator-(double d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 - ret.totalDomain(); ret.setSliceFromTotal(); return ret; }
template <class T1, class T2> inline typename T1::Domain_t operator*(const SliceDomain<T1> &d1, const DomainBase<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2.unwrap(); ret.setSliceFromTotal(); return ret; } template <class T1, class T2> inline typename T1::Domain_t operator*(const SliceDomain<T1> &d1, const SliceDomain<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2.unwrap().totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, unsigned char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(unsigned char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, unsigned short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(unsigned short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, unsigned int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(unsigned int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, unsigned long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(unsigned long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, float d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(float d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(const SliceDomain<T> &d1, double d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() *= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator*(double d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 * ret.totalDomain(); ret.setSliceFromTotal(); return ret; }
template <class T1, class T2> inline typename T1::Domain_t operator/(const SliceDomain<T1> &d1, const DomainBase<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2.unwrap(); ret.setSliceFromTotal(); return ret; } template <class T1, class T2> inline typename T1::Domain_t operator/(const SliceDomain<T1> &d1, const SliceDomain<T2> &d2) { typename T1::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2.unwrap().totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, unsigned char d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(unsigned char d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, unsigned short d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(unsigned short d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, unsigned int d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(unsigned int d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, unsigned long d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(unsigned long d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, float d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(float d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(const SliceDomain<T> &d1, double d2) { typename T::Domain_t ret(d1.unwrap()); ret.totalDomain() /= d2; ret.setSliceFromTotal(); return ret; } template <class T> inline typename T::Domain_t operator/(double d1, const SliceDomain<T> &d2) { typename T::Domain_t ret(d2.unwrap()); ret.totalDomain() = d2 / ret.totalDomain(); ret.setSliceFromTotal(); return ret; }
template<class DT>
std::ostream& operator<<(std::ostream &o, const SliceDomain<DT> &dbase) {
  dbase.print(o);
  return o;
}
template<int Dim, int SliceDim>
class SliceRange
  : public SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > >
{
public:
  SliceRange() { }
  SliceRange(const Pooma::NoInit &e)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > >(e) { }
  SliceRange(const SliceRange<Dim,SliceDim> &nd)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > >(nd) {
  }
  SliceRange(const SliceInterval<Dim,SliceDim> &nd)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > >(nd) {
  }
  template <class Base, class D1>
  SliceRange(const Base &baseDomain, const D1 &d1)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain1<D1> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1);
  }
  template <class Base, class D1, class D2>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain2<D1,D2> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2);
  }
  template <class Base, class D1, class D2, class D3>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2, const D3 &d3)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain3<D1,D2,D3> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3);
  }
  template <class Base, class D1, class D2, class D3,
            class D4>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2, const D3 &d3,
             const D4 &d4)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain4<D1,D2,D3,D4> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2, const D3 &d3,
             const D4 &d4, const D5 &d5)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain5<D1,D2,D3,D4,D5> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5, class D6>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2, const D3 &d3,
             const D4 &d4, const D5 &d5, const D6 &d6)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain6<D1,D2,D3,D4,D5,D6> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5, d6);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5, class D6, class D7>
  SliceRange(const Base &baseDomain, const D1 &d1, const D2 &d2, const D3 &d3,
             const D4 &d4, const D5 &d5, const D6 &d6, const D7 &d7)
    : SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain7<D1,D2,D3,D4,D5,D6,D7> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5, d6, d7);
  }
  ~SliceRange() { }
  SliceRange<Dim,SliceDim> &
    operator=(const SliceRange<Dim,SliceDim> &nd) {
      SliceDomain<DomainTraits<SliceRange<Dim,SliceDim> > >::operator=(nd);
      return *this;
  }
protected:
private:
};
template<class T, int Dim, bool strided>
struct SplitDomainSingle {
  static void split(const T &a, int axis, T &b, T &c) {
    typedef typename DomainTraits<T>::Element_t E1_t;
    typedef typename DomainTraits<T>::OneDomain_t OneDomain_t;
    if (axis != (Dim - 1)) {
      b[Dim-1] = a[Dim-1];
      c[Dim-1] = a[Dim-1];
    } else if (a[Dim-1].length() < 2) {
      b[Dim-1] = a[Dim-1];
    } else {
      E1_t a0 = a[Dim-1].first();
      E1_t a1 = a[Dim-1].last();
      E1_t mid = a0 + a[Dim-1].length()/2;
      b[Dim-1] = OneDomain_t(a0, mid-1);
      c[Dim-1] = OneDomain_t(mid, a1);
    }
  }
  static void split(const T &a, int axis, int leftLength, T &b, T &c) {
    typedef typename DomainTraits<T>::Element_t E1_t;
    typedef typename DomainTraits<T>::OneDomain_t OneDomain_t;
    if (axis != (Dim - 1)) {
      b[Dim-1] = a[Dim-1];
      c[Dim-1] = a[Dim-1];
    } else if (a[Dim-1].length() < 2) {
      b[Dim-1] = a[Dim-1];
    } else {
      E1_t a0 = a[Dim-1].first();
      E1_t a1 = a[Dim-1].last();
      E1_t mid = a0 + leftLength;
      b[Dim-1] = OneDomain_t(a0, mid-1);
      c[Dim-1] = OneDomain_t(mid, a1);
    }
  }
  static void split(const T &a, T &b, T &c) { split(a, Dim-1, b, c); }
};
template<class T, int Dim>
struct SplitDomainSingle<T,Dim,true> {
  static void split(const T &a, int axis, T &b, T &c) {
    typedef typename DomainTraits<T>::Element_t E1_t;
    typedef typename DomainTraits<T>::OneDomain_t OneDomain_t;
    if (axis != (Dim - 1)) {
      b[Dim-1] = a[Dim-1];
      c[Dim-1] = a[Dim-1];
    } else if (a[Dim-1].length() < 2) {
      b[Dim-1] = a[Dim-1];
    } else {
      E1_t a0 = a[Dim-1].first();
      E1_t a1 = a[Dim-1].last();
      E1_t s = a[Dim-1].stride();
      E1_t mid = a0 + (a[Dim-1].length()/2 * s);
      b[Dim-1] = OneDomain_t(a0, mid - s, s);
      c[Dim-1] = OneDomain_t(mid, a1, s);
    }
  }
  static void split(const T &a, int axis, int leftLength, T &b, T &c) {
    typedef typename DomainTraits<T>::Element_t E1_t;
    typedef typename DomainTraits<T>::OneDomain_t OneDomain_t;
    if (axis != (Dim - 1)) {
      b[Dim-1] = a[Dim-1];
      c[Dim-1] = a[Dim-1];
    } else if (a[Dim-1].length() < 2) {
      b[Dim-1] = a[Dim-1];
    } else {
      E1_t a0 = a[Dim-1].first();
      E1_t a1 = a[Dim-1].last();
      E1_t s = a[Dim-1].stride();
      E1_t mid = a0 + (leftLength * s);
      b[Dim-1] = OneDomain_t(a0, mid - s, s);
      c[Dim-1] = OneDomain_t(mid, a1, s);
    }
  }
  static void split(const T &a, T &b, T &c) { split(a, Dim-1, b, c); }
};
template<int Dim, bool strided>
struct SplitDomainSingle<int,Dim,strided> {
  static void split(int a, int, int &b, int &c) {
    b = a;
    c = 0;
  }
  static void split(int a, int, int, int &b, int &c) {
    b = a;
    c = 0;
  }
  static void split(int a, int &b, int &c) {
    b = a;
    c = 0;
  }
};
template<class T, int Dim>
struct SplitDomain {
  enum { strided = !DomainTraits<T>::unitStride };
  static void split(const T &a, T &b, T &c) {
    SplitDomainSingle<T,Dim,strided>::split(a, b, c);
    SplitDomain<T,Dim-1>::split(a, b, c);
  }
  static void split(const T &a, int axis, T &b, T &c) {
    SplitDomainSingle<T,Dim,strided>::split(a, axis, b, c);
    SplitDomain<T,Dim-1>::split(a, axis, b, c);
  }
  static void split(const T &a, int axis, int leftLength, T &b, T &c) {
    SplitDomainSingle<T,Dim,strided>::split(a, axis, leftLength, b, c);
    SplitDomain<T,Dim-1>::split(a, axis, leftLength, b, c);
  }
};
template<class T>
struct SplitDomain<T,1> {
  enum { strided = !DomainTraits<T>::unitStride };
  static void split(const T &a, T &b, T &c) {
    SplitDomainSingle<T,1,strided>::split(a, b, c);
  }
  static void split(const T &a, int axis, T &b, T &c) {
    SplitDomainSingle<T,1,strided>::split(a, axis, b, c);
  }
  static void split(const T &a, int axis, int leftLength, T &b, T &c) {
    SplitDomainSingle<T,1,strided>::split(a, axis, leftLength, b, c);
  }
};
template<class T>
inline void split(const T &a, T &b, T &c)
{
  SplitDomain<T,DomainTraits<T>::dimensions>::split(a, b, c);
}
template<class T>
inline void split(const T &a, int axis, T &b, T &c)
{
  SplitDomain<T,DomainTraits<T>::dimensions>::split(a, axis, b, c);
}
template<class T>
inline void split(const T &a, int axis, int leftLength, T &b, T &c)
{
  SplitDomain<T,DomainTraits<T>::dimensions>::split(a, axis, leftLength, b, c);
}
template<class T1, class T2, bool strided>
struct TouchesDomainSingle {
  static bool touches(const T1 &a, const T2 &b) {
    return (a.min() <= b.max() && a.max() >= b.min());
  }
};
template<class T1, class T2>
struct TouchesDomainSingle<T1,T2,true> {
  static bool touches(const T1 &a, const T2 &b) {
    bool quicktest = TouchesDomainSingle<T1,T2,false>::touches(a, b);
    if (!quicktest || a.stride() == 1 || a.stride() == (-1) ||
 b.stride() == 1 || b.stride() == (-1)) {
      return quicktest;
    }
    int endpoint = 0;
    return findLeftCommonEndpoint(a.min(), a.max(), a.stride(),
      b.min(), b.max(), b.stride(), endpoint);
  }
};
template<class T1, class T2, int Dim>
struct TouchesDomain {
  enum { strided =
    !DomainTraits<T1>::unitStride && !DomainTraits<T2>::unitStride };
  static bool touches(const T1 &a, const T2 &b) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    return TouchesDomainSingle<Dom1_t,Dom2_t,strided>::touches(
      DomainTraits<T1>::getDomain(a,Dim-1),
      DomainTraits<T2>::getDomain(b,Dim-1)) &&
      TouchesDomain<T1,T2,Dim-1>::touches(a,b);
  }
};
template<class T1, class T2>
struct TouchesDomain<T1,T2,1> {
  enum { strided =
    !DomainTraits<T1>::unitStride && !DomainTraits<T2>::unitStride };
  static bool touches(const T1 &a, const T2 &b) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    return TouchesDomainSingle<Dom1_t,Dom2_t,strided>::touches(
      DomainTraits<T1>::getDomain(a,0), DomainTraits<T2>::getDomain(b,0));
  }
};
template<class T1, class T2, int Dim1, int Dim2>
inline bool touches2(const T1 &, const T2 &, const WrappedInt<Dim1> &,
  const WrappedInt<Dim2> &)
{
  return false;
}
template<class T1, class T2, int Dim>
inline bool touches2(const T1 &a, const T2 &b, const WrappedInt<Dim> &,
  const WrappedInt<Dim> &)
{
  return TouchesDomain<T1,T2,Dim>::touches(a, b);
}
template<class T1, class T2>
inline bool touches(const T1 &a, const T2 &b)
{
  if (a.empty() || b.empty())
    return false;
  else
    return touches2(a, b, WrappedInt<DomainTraits<T1>::dimensions>(),
      WrappedInt<DomainTraits<T2>::dimensions>());
}
#include <list>
template<class Dom, class T>
class DomainMapNode : public Pooled<DomainMapNode<Dom,T> >
{
public:
  typedef Dom Domain_t;
  typedef T Data_t;
  typedef std::pair<Domain_t,Data_t> Value_t;
  typedef std::list<Value_t> List_t;
  typedef DomainMapNode<Dom,T> Node_t;
  typedef typename List_t::iterator iterator;
  DomainMapNode(const Domain_t &d, Node_t *p = 0)
    : domain_m(d), left_m(0), right_m(0), parent_m(p) {
  }
  ~DomainMapNode() {
    if (left_m != 0)
      delete left_m;
    if (right_m != 0)
      delete right_m;
  }
  const Domain_t &domain() const { return domain_m; }
  iterator begin() { return list_m.begin(); }
  iterator end() { return list_m.end(); }
  void insert(const Value_t &v) {
    ;
    if (left_m == 0)
      {
 Domain_t leftdom, rightdom;
 split(domain_m, leftdom, rightdom);
 left_m = new Node_t(leftdom, this);
 right_m = new Node_t(rightdom, this);
      }
    if (contains(v.first, domain_m))
      {
 list_m.push_back(v);
      }
    else if (contains(left_m->domain_m, v.first))
      {
 left_m->insert(v);
      }
    else if (contains(right_m->domain_m, v.first))
      {
 right_m->insert(v);
      }
    else
      {
 list_m.push_back(v);
      }
  }
  Node_t *nextRightNode() {
    Node_t *y, *p = this;
    if (p->right_m != 0) {
      p = p->right_m;
      while (p->left_m != 0)
        p = p->left_m;
    } else {
      for (y=p->parent_m; y != 0 && p == y->right_m; y=y->parent_m)
        p = y;
      p = y;
    }
    return p;
  }
  Node_t *nextRightTouchNode(const Domain_t &d) {
    Node_t *p = this;
    Node_t *y = right_m;
    if (y != 0 && touches(d, y->domain_m)) {
      p = y;
      for (y=y->left_m; y != 0 && touches(d, y->domain_m); y=y->left_m)
        p = y;
    } else {
      for (y=p->parent_m; y != 0 && p == y->right_m; y=y->parent_m)
        p = y;
      p = y;
    }
    return p;
  }
  Node_t *findLeftNode() {
    Node_t *p = this;
    while (p->left_m != 0)
      p = p->left_m;
    while (p != 0 && p->begin() == p->end())
      p = p->nextRightNode();
    return p;
  }
  Node_t *findLeftTouchNode(const Domain_t &d) {
    Node_t *y, *p = this;
    for (y=p->left_m; y != 0 && touches(d, y->domain_m); y=y->left_m)
      p = y;
    return p;
  }
private:
  Domain_t domain_m;
  Node_t *left_m, *right_m, *parent_m;
  List_t list_m;
};
template<class Dom, class T>
class DomainMapIterator
{
public:
  typedef Dom Domain_t;
  typedef DomainMapNode<Dom,T> Node_t;
  typedef typename Node_t::Data_t Value_t;
  typedef typename Node_t::iterator NodeIter_t;
  DomainMapIterator() : node_m(0) { }
  DomainMapIterator(Node_t *n, NodeIter_t i) : node_m(n), iter_m(i) { }
  ~DomainMapIterator() { }
  Node_t *getNode() const { return node_m; }
  NodeIter_t getIter() const { return iter_m; }
  bool operator==(const DomainMapIterator<Dom,T> &dmi) {
    return (node_m == dmi.node_m && (node_m == 0 || iter_m == dmi.iter_m));
  }
  bool operator!=(const DomainMapIterator<Dom,T> &dmi) {
    return !(*this == dmi);
  }
  Value_t &operator*() {
    ;
    return (*iter_m).second;
  }
  Domain_t &domain() {
    ;
    return (*iter_m).first;
  }
  DomainMapIterator<Dom,T> &operator++() {
    ;
    if ((++iter_m) == node_m->end()) {
      do {
        node_m = node_m->nextRightNode();
      } while (node_m != 0 && (iter_m=node_m->begin()) == node_m->end());
    }
    return *this;
  }
private:
  Node_t *node_m;
  NodeIter_t iter_m;
};
template<class Dom, class T>
class DomainMapConstIterator
{
public:
  typedef Dom Domain_t;
  typedef DomainMapNode<Dom,T> Node_t;
  typedef typename Node_t::Data_t Value_t;
  typedef typename Node_t::iterator NodeIter_t;
  DomainMapConstIterator() : node_m(0) { }
  DomainMapConstIterator(Node_t *n, NodeIter_t i)
    : node_m(n), iter_m(i) { }
  DomainMapConstIterator(const DomainMapIterator<Dom,T> &dmi)
    : node_m(dmi.getNode()), iter_m(dmi.getIter()) { }
  ~DomainMapConstIterator() { }
  bool operator==(const DomainMapConstIterator<Dom,T> &dmi) {
    return (node_m == dmi.node_m && (node_m == 0 || iter_m == dmi.iter_m));
  }
  bool operator!=(const DomainMapConstIterator<Dom,T> &dmi) {
    return !(*this == dmi);
  }
  Value_t operator*() {
    ;
    return (*iter_m).second;
  }
  Domain_t domain() {
    ;
    return (*iter_m).first;
  }
  DomainMapConstIterator<Dom,T> &operator++() {
    ;
    if ((++iter_m) == node_m->end()) {
      do {
        node_m = node_m->nextRightNode();
      } while (node_m != 0 && (iter_m=node_m->begin()) == node_m->end());
    }
    return *this;
  }
private:
  Node_t *node_m;
  NodeIter_t iter_m;
};
template<class Dom, class T>
class DomainMapTouchIterator
{
public:
  typedef Dom Domain_t;
  typedef DomainMapNode<Dom,T> Node_t;
  typedef typename Node_t::Data_t Value_t;
  typedef typename Node_t::iterator NodeIter_t;
  DomainMapTouchIterator() : node_m(0) { }
  DomainMapTouchIterator(Node_t *n, NodeIter_t i, const Domain_t &d)
    : node_m(n), iter_m(i), domain_m(d) { }
  ~DomainMapTouchIterator() { }
  bool operator==(const DomainMapTouchIterator<Dom,T> &dmi) {
    return (node_m == dmi.node_m && (node_m == 0 || iter_m == dmi.iter_m));
  }
  bool operator!=(const DomainMapTouchIterator<Dom,T> &dmi) {
    return !(*this == dmi);
  }
  Value_t &operator*() {
    ;
    return (*iter_m).second;
  }
  Domain_t &domain() {
    ;
    return (*iter_m).first;
  }
  DomainMapTouchIterator<Dom,T> &operator++() {
    ;
    while ((++iter_m) != node_m->end()) {
      if (touches(domain_m, (*iter_m).first))
        return *this;
    }
    do {
      if ((node_m = node_m->nextRightTouchNode(domain_m)) != 0)
        for (iter_m = node_m->begin(); iter_m != node_m->end(); ++iter_m)
          if (touches(domain_m, (*iter_m).first))
            return *this;
    } while (node_m != 0);
    return *this;
  }
private:
  Node_t *node_m;
  NodeIter_t iter_m;
  Domain_t domain_m;
};
template<class Dom, class T>
class DomainMap
{
public:
  typedef Dom Domain_t;
  typedef Dom key_type;
  typedef T Data_t;
  typedef T mapped_type;
  typedef std::pair<Domain_t,Data_t> Value_t;
  typedef std::pair<Domain_t,Data_t> value_type;
  typedef DomainMapIterator<Domain_t,Data_t> iterator;
  typedef DomainMapConstIterator<Domain_t,Data_t> const_iterator;
  typedef DomainMapTouchIterator<Domain_t,Data_t> touch_iterator;
  typedef std::pair<touch_iterator,touch_iterator> Touch_t;
  typedef std::pair<touch_iterator,touch_iterator> touch_type;
  typedef long Size_t;
  typedef long size_type;
  DomainMap() : size_m(0), root_m(0) { }
  DomainMap(const Domain_t &d) : size_m(0), root_m(0) {
    initialize(d);
  }
  void initialize(const Domain_t &d) {
    ;
    root_m = new Node_t(d);
  }
  ~DomainMap() {
    if (root_m != 0)
      delete root_m;
  }
  iterator begin() { return left_m; }
  iterator end() { return iterator(); }
  const_iterator begin() const { return const_iterator(left_m); }
  const_iterator end() const { return const_iterator(); }
  Size_t size() const { return size_m; }
  Touch_t touch(const Domain_t &d) const {
    Node_t *p = root_m;
    if (p != 0)
    {
      p = p->findLeftTouchNode(d);
      do
      {
 for (NodeIter_t a = p->begin(); a != p->end(); ++a)
   if (touches(d, (*a).first))
     return Touch_t(touch_iterator(p, a, d), touch_iterator());
 p = p->nextRightTouchNode(d);
      } while (p != 0);
    }
    return Touch_t(touch_iterator(), touch_iterator());
  }
  void insert(const Value_t &v) {
    ;
    root_m->insert(v);
    size_m++;
  }
  void update() {
    Node_t *leftnode;
    if (root_m != 0 && size_m > 0 && (leftnode=root_m->findLeftNode()) != 0)
      left_m = iterator(leftnode, leftnode->begin());
    else
      left_m = iterator();
  }
  void clear() {
    if (root_m != 0) {
      Node_t *newroot = new Node_t(root_m->domain());
      delete root_m;
      root_m = newroot;
      size_m = 0;
      update();
    }
  }
  void zap() {
    if (root_m != 0)
      delete root_m;
    size_m = 0;
    root_m = 0;
  }
  template<class Out>
  void print(Out &o) const;
  void print() const;
private:
  typedef DomainMapNode<Domain_t,Data_t> Node_t;
  typedef typename Node_t::iterator NodeIter_t;
  Size_t size_m;
  Node_t *root_m;
  iterator left_m;
  DomainMap(const DomainMap<Domain_t,Data_t> &);
  DomainMap<Domain_t,Data_t> &operator=(const DomainMap<Domain_t,Data_t> &);
};
template<class Dom, class T>
template<class Out>
void DomainMap<Dom, T>::print(Out &o) const
{
  if (size() < 1 || root_m == 0)
    {
      o << "DomainMap: empty.";
    }
  else
    {
      o << "DomainMap: Total domain = " << root_m->domain();
      o << ", touching domains:\n";
      Touch_t touchiters = touch(root_m->domain());
      while (touchiters.first != touchiters.second)
 {
   o << "  " << touchiters.first.domain() << " ==> ";
   o << *(touchiters.first) << "\n";
   ++(touchiters.first);
 }
    }
}
template<class Dom, class T>
void DomainMap<Dom, T>::print() const
{
  if (size() < 1 || root_m == 0)
    {
      std::cout << "DomainMap: empty.";
    }
  else
    {
      std::cout << "DomainMap: Total domain = " << root_m->domain();
      std::cout << ", touching domains:\n";
      Touch_t touchiters = touch(root_m->domain());
      while (touchiters.first != touchiters.second)
 {
   std::cout << "  " << touchiters.first.domain() << " ==> ";
   std::cout << *(touchiters.first) << "\n";
   ++(touchiters.first);
 }
    }
}
template <class Dom, class T>
std::ostream &operator<<(std::ostream &o, const DomainMap<Dom, T> &dmap)
{
  dmap.print(o);
  return o;
}
template <class T>
class ConstDerefIterator;
template <class T>
class DerefIterator
{
public:
  typedef T Value_t;
  typedef std::vector<T*> List_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef std::random_access_iterator_tag iterator_category;
  typedef Value_t value_type;
  typedef ptrdiff_t difference_type;
  typedef Value_t* pointer;
  typedef Value_t& reference;
  friend class ConstDerefIterator<T>;
  friend iterator operator+ (const difference_type n, const iterator &iter)
  {
    return iterator(iter.p_m + n);
  }
protected:
  typename List_t::iterator p_m;
public:
  inline DerefIterator() { }
  inline DerefIterator(typename List_t::iterator x) : p_m(x) { }
  inline reference operator*() const {
    return **p_m;
  }
  inline pointer operator->() const {
    return *p_m;
  }
  inline iterator &operator++() {
    ++p_m;
    return *this;
  }
  inline iterator operator++(int) {
    iterator tmp = *this;
    ++p_m;
    return tmp;
  }
  inline iterator &operator--() {
    --p_m;
    return *this;
  }
  inline iterator operator--(int) {
    iterator tmp = *this;
    --p_m;
    return tmp;
  }
  inline iterator &operator+=(const difference_type i) {
    p_m += i;
    return *this;
  }
  inline iterator &operator-=(const difference_type i) {
    p_m -= i;
    return *this;
  }
  inline iterator operator+(const difference_type i) const {
    return iterator(p_m + i);
  }
  inline iterator operator-(const difference_type i) const {
    return iterator(p_m - i);
  }
  inline difference_type operator-(const iterator &x) const {
    return p_m - x.p_m;
  }
  inline difference_type operator-(const const_iterator &x) const {
    return p_m - x.p_m;
  }
  inline reference operator[](const difference_type i) const {
    return **(p_m + i);
  }
  inline bool operator==(const iterator &x) const {
    return p_m == x.p_m;
  }
  inline bool operator==(const const_iterator &x) const {
    return p_m == x.p_m;
  }
  inline bool operator<(const iterator &x) const {
    return p_m < x.p_m;
  }
  inline bool operator<(const const_iterator &x) const {
    return p_m < x.p_m;
  }
  inline bool operator!= (const iterator &y) const
  { return ! (*this == y); }
  inline bool operator> (const iterator &y) const
  { return (y < *this); }
  inline bool operator<= (const iterator &y) const
  { return ! (y < *this); }
  inline bool operator>= (const iterator &y) const
  { return ! (*this < y); }
  inline bool operator!= (const const_iterator &y) const
  { return ! (*this == y); }
  inline bool operator> (const const_iterator &y) const
  { return (y < *this); }
  inline bool operator<= (const const_iterator &y) const
  { return ! (y < *this); }
  inline bool operator>= (const const_iterator &y) const
  { return ! (*this < y); }
};
template <class T>
class ConstDerefIterator
{
public:
  typedef T Value_t;
  typedef std::vector<T*> List_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef std::random_access_iterator_tag iterator_category;
  typedef Value_t value_type;
  typedef ptrdiff_t difference_type;
  typedef const Value_t* pointer;
  typedef const Value_t& reference;
  friend class DerefIterator<T>;
  friend const_iterator operator+ (const difference_type n,
    const const_iterator &iter)
  {
    return const_iterator(iter.p_m + n);
  }
protected:
  typename List_t::const_iterator p_m;
public:
  inline ConstDerefIterator() { }
  inline ConstDerefIterator(const typename List_t::const_iterator &x) : p_m(x) { }
  inline ConstDerefIterator(const typename List_t::iterator &x) : p_m(x) { }
  inline ConstDerefIterator(const iterator &x) : p_m(x.p_m) { }
  inline ConstDerefIterator(const const_iterator &x) : p_m(x.p_m) { }
  inline reference operator*() const {
    return **p_m;
  }
  inline pointer operator->() const {
    return *p_m;
  }
  inline const_iterator &operator++() {
    ++p_m;
    return *this;
  }
  inline const_iterator operator++(int) {
    const_iterator tmp = *this;
    ++p_m;
    return tmp;
  }
  inline const_iterator &operator--() {
    --p_m;
    return *this;
  }
  inline const_iterator operator--(int) {
    const_iterator tmp = *this;
    --p_m;
    return tmp;
  }
  inline const_iterator &operator+=(const difference_type i) {
    p_m += i;
    return *this;
  }
  inline const_iterator &operator-=(const difference_type i) {
    p_m -= i;
    return *this;
  }
  inline const_iterator operator+(const difference_type i) const {
    return const_iterator(p_m + i);
  }
  inline const_iterator operator-(const difference_type i) const {
    return const_iterator(p_m - i);
  }
  inline difference_type operator-(const const_iterator &x) const {
    return p_m - x.p_m;
  }
  inline difference_type operator-(const iterator &x)
    const {
    return p_m - x.p_m;
  }
  inline reference operator[](const difference_type i) const {
    return **(p_m + i);
  }
  inline bool operator==(const const_iterator &x) const {
    return p_m == x.p_m;
  }
  inline bool operator==(const iterator &x) const {
    return p_m == x.p_m;
  }
  inline bool operator<(const const_iterator &x) const {
    return p_m < x.p_m;
  }
  inline bool operator<(const iterator &x) const {
    return p_m < x.p_m;
  }
  inline bool operator!= (const const_iterator &y) const
  { return ! (*this == y); }
  inline bool operator> (const const_iterator &y) const
  { return (y < *this); }
  inline bool operator<= (const const_iterator &y) const
  { return ! (y < *this); }
  inline bool operator>= (const const_iterator &y) const
  { return ! (*this < y); }
  inline bool operator!= (const iterator &y) const
  { return ! (*this == y); }
  inline bool operator> (const iterator &y) const
  { return (y < *this); }
  inline bool operator<= (const iterator &y) const
  { return ! (y < *this); }
  inline bool operator>= (const iterator &y) const
  { return ! (*this < y); }
};
template<int Dim, int Dim2>
class ViewIndexer
{
public:
  typedef ViewIndexer<Dim, Dim2> This_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim2> BaseDomain_t;
  typedef Loc<Dim2> Mask_t;
  ViewIndexer() { }
  template<class DT>
  ViewIndexer(const SliceDomain<DT> &dom)
  : domain_m(Pooma::NoInit()), baseDomain_m(dom.totalDomain())
  {
    PoomaCTAssert<(Dim == DT::sliceDimensions)>::test();
    PoomaCTAssert<(Dim2 == DT::dimensions)>::test();
    int dt, d;
    const typename DT::TotalDomain_t &domain = dom.totalDomain();
    for (d = 0, dt = 0; dt < Dim2; ++dt)
      {
        if (!dom.ignorable(dt))
          {
            ;
            offset_m[d] = domain[dt].first();
            stride_m[d] = domain[dt].stride();
            domain_m[d] = Interval<1>(domain[dt].length());
            ind_m[d] = dt;
            ++d;
          }
        else
          {
            ;
            mask_m[dt] = domain[dt].first();
          }
      }
  }
  template<class DT>
  ViewIndexer(const ViewIndexer<Dim, Dim2> &orig,
    const Domain<Dim, DT> &dom)
  : domain_m(Pooma::NoInit()),
    baseDomain_m(Pooma::NoInit()),
    mask_m(orig.mask())
  {
    baseDomain_m = orig.baseDomain();
    const typename DT::Domain_t &domain = dom.unwrap();
    for (int d = 0; d < Dim; ++d)
      {
        offset_m[d] = orig.offset(d) + orig.stride(d) *
          domain[d].first();
        stride_m[d] = orig.stride(d) * domain[d].stride();
        domain_m[d] = Interval<1>(domain[d].length());
        ind_m[d] = orig.indirection(d);
      }
    localToBase(domain_m, baseDomain_m);
  }
  template<int OrigDim, class DT>
  ViewIndexer(const ViewIndexer<OrigDim, Dim2> &orig,
    const SliceDomain<DT> &dom)
  : domain_m(Pooma::NoInit()),
    baseDomain_m(orig.baseDomain()), mask_m(orig.mask())
  {
    PoomaCTAssert<(DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<(DT::dimensions == OrigDim)>::test();
    int dt, d;
    const typename DT::TotalDomain_t &domain = dom.totalDomain();
    for (d = 0, dt = 0; dt < OrigDim; ++dt)
      {
        if (!dom.ignorable(dt))
          {
            ;
            offset_m[d] = orig.offset(dt) + orig.stride(dt) *
              domain[dt].first();
            stride_m[d] = orig.stride(dt) * domain[dt].stride();
            domain_m[d] = Interval<1>(domain[dt].length());
            ind_m[d] = orig.indirection(dt);
            baseDomain_m[ind_m[d]] = Range<1>(
              offset_m[d],
              offset_m[d] + stride_m[d] * domain_m[d].last(),
              stride_m[d]);
            ++d;
          }
        else
          {
            ;
            int m = orig.offset(dt) + orig.stride(dt) *
              domain[dt].first();
            mask_m[orig.indirection(dt)] = m;
            baseDomain_m[orig.indirection(dt)] =
              Range<1>(m, m, 1);
          }
      }
  }
  ViewIndexer(const This_t &model)
  : domain_m(model.domain()), baseDomain_m(model.baseDomain()),
    mask_m(model.mask())
  {
    for (int d = 0; d < Dim; d++)
      {
        ind_m[d] = model.indirection(d);
        offset_m[d] = model.offset(d);
        stride_m[d] = model.stride(d);
      }
  }
  This_t &operator=(const This_t &rhs)
  {
    domain_m = rhs.domain();
    baseDomain_m = rhs.baseDomain();
    mask_m = rhs.mask();
    for (int d = 0; d < Dim; d++)
      {
        ind_m[d] = rhs.indirection(d);
        offset_m[d] = rhs.offset(d);
        stride_m[d] = rhs.stride(d);
      }
    return *this;
  }
  const Domain_t &domain() const { return domain_m; }
  const Domain_t &innerDomain() const { return domain_m; }
  const BaseDomain_t &baseDomain() const { return baseDomain_m; }
  int indirection(int i) const { return ind_m[i]; }
  const Mask_t &mask() const { return mask_m; }
  int offset(int i) const { return offset_m[i]; }
  int stride(int i) const { return stride_m[i]; }
  void translate(const Loc<Dim> &loc, Loc<Dim2> &oloc) const
  {
    oloc = mask_m;
    for (int d = 0; d < Dim; d++)
      oloc[ind_m[d]] = Loc<1>(offset_m[d] + stride_m[d] * loc[d].first());
  }
  void translate(int i0, Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
  }
  void translate(int i0, int i1, Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
  }
  void translate(int i0, int i1, int i2,
    Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
    loc[ind_m[2]] = offset_m[2] + stride_m[2] * i2;
  }
  void translate(int i0, int i1, int i2, int i3,
    Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
    loc[ind_m[2]] = offset_m[2] + stride_m[2] * i2;
    loc[ind_m[3]] = offset_m[3] + stride_m[3] * i3;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
    loc[ind_m[2]] = offset_m[2] + stride_m[2] * i2;
    loc[ind_m[3]] = offset_m[3] + stride_m[3] * i3;
    loc[ind_m[4]] = offset_m[4] + stride_m[4] * i4;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, int i5, Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
    loc[ind_m[2]] = offset_m[2] + stride_m[2] * i2;
    loc[ind_m[3]] = offset_m[3] + stride_m[3] * i3;
    loc[ind_m[4]] = offset_m[4] + stride_m[4] * i4;
    loc[ind_m[5]] = offset_m[5] + stride_m[5] * i5;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, int i5, int i6, Loc<Dim2> &loc) const
  {
    loc = mask_m;
    loc[ind_m[0]] = offset_m[0] + stride_m[0] * i0;
    loc[ind_m[1]] = offset_m[1] + stride_m[1] * i1;
    loc[ind_m[2]] = offset_m[2] + stride_m[2] * i2;
    loc[ind_m[3]] = offset_m[3] + stride_m[3] * i3;
    loc[ind_m[4]] = offset_m[4] + stride_m[4] * i4;
    loc[ind_m[5]] = offset_m[5] + stride_m[5] * i5;
    loc[ind_m[6]] = offset_m[6] + stride_m[6] * i6;
  }
  template<class DT>
  BaseDomain_t &localToBase(const Domain<Dim, DT> &dlocal,
    BaseDomain_t &base) const
  {
    base = baseDomain_m;
    const typename DT::Domain_t &local = dlocal.unwrap();
    for (int d = 0; d < Dim; d++)
      {
        base[ind_m[d]] = Range<1>(
          offset_m[d] + stride_m[d] * local[d].first(),
          offset_m[d] + stride_m[d] * local[d].last(),
          stride_m[d] * local[d].stride());
      }
    return base;
  }
  template<class DT>
  SliceRange<Dim2, Dim> &localToBase(const Domain<Dim, DT> &dlocal,
    SliceRange<Dim2, Dim> &base) const
  {
    base.totalDomain() = baseDomain_m;
    const typename DT::Domain_t &local = dlocal.unwrap();
    for (int d = 0; d < Dim; d++)
      {
        Range<1> r(
          offset_m[d] + stride_m[d] * local[d].first(),
          offset_m[d] + stride_m[d] * local[d].last(),
          stride_m[d] * local[d].stride());
        base.totalDomain()[ind_m[d]] = r;
        base.sliceDomain()[d] = r;
        base.cantIgnoreDomain(ind_m[d]);
      }
    return base;
  }
  Interval<Dim> &baseToLocal(const BaseDomain_t &base,
    Interval<Dim> &local) const
  {
    int j;
    for (int d = 0; d < Dim; d++)
      {
        j = ind_m[d];
        local[d] = Interval<1>(
          (base[j].first() - offset_m[d]) / stride_m[d],
          (base[j].last() - offset_m[d]) / stride_m[d]);
        ;
      }
    return local;
  }
  Range<Dim> &baseToLocal(const BaseDomain_t &base,
    Range<Dim> &local) const
  {
    int j;
    for (int d = 0; d < Dim; d++)
      {
        j = ind_m[d];
        local[d] = Range<1>(
          (base[j].first() - offset_m[d]) / stride_m[d],
          (base[j].last() - offset_m[d]) / stride_m[d],
          base[j].stride() / stride_m[d]);
      }
    return local;
  }
  Interval<Dim> &baseToLocalInterval(const Interval<Dim2> &base,
          Interval<Dim> &local) const
  {
    int j;
    for (int d = 0; d < Dim; d++)
    {
      j = ind_m[d];
      local[d] = Interval<1>((base[j].first() - offset_m[d]) / stride_m[d],
        (base[j].last() - offset_m[d]) / stride_m[d]);
      ;
      ;
    }
    return local;
  }
private:
  Domain_t domain_m;
  BaseDomain_t baseDomain_m;
  int stride_m[Dim], offset_m[Dim];
  int ind_m[Dim];
  Mask_t mask_m;
};
template<int Dim>
class ViewIndexer<Dim, Dim>
{
public:
  typedef ViewIndexer<Dim, Dim> This_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim> BaseDomain_t;
  typedef Loc<Dim> Mask_t;
  ViewIndexer() { }
  template<class DT>
  ViewIndexer(const Domain<Dim, DT> &dom)
  : domain_m(Pooma::NoInit()), baseDomain_m(dom.unwrap())
  {
    const typename DT::Domain_t &domain = dom.unwrap();
    for (int d = 0; d < Dim; ++d)
      {
        offset_m[d] = domain[d].first();
        stride_m[d] = domain[d].stride();
        domain_m[d] = Interval<1>(domain[d].length());
      }
  }
  template<class DT>
  ViewIndexer(const ViewIndexer<Dim, Dim> &orig,
    const Domain<Dim, DT> &dom)
  : domain_m(Pooma::NoInit()),
    baseDomain_m(dom.unwrap()),
    mask_m(orig.mask())
  {
    const typename DT::Domain_t &domain = dom.unwrap();
    for (int d = 0; d < Dim; ++d)
      {
        offset_m[d] = orig.offset(d) + orig.stride(d) *
          domain[d].first();
        stride_m[d] = orig.stride(d) * domain[d].stride();
        domain_m[d] = Interval<1>(domain[d].length());
      }
    localToBase(domain_m, baseDomain_m);
}
  ViewIndexer(const This_t &model)
  : domain_m(model.domain()), baseDomain_m(model.baseDomain()),
    mask_m(model.mask())
  {
    for (int d = 0; d < Dim; d++)
      {
        offset_m[d] = model.offset(d);
        stride_m[d] = model.stride(d);
      }
  }
  This_t &operator=(const This_t &rhs)
  {
    domain_m = rhs.domain();
    baseDomain_m = rhs.baseDomain();
    mask_m = rhs.mask();
    for (int d = 0; d < Dim; d++)
      {
        offset_m[d] = rhs.offset(d);
        stride_m[d] = rhs.stride(d);
      }
    return *this;
  }
  const Domain_t &domain() const { return domain_m; }
  const Domain_t &innerDomain() const { return domain_m; }
  const BaseDomain_t &baseDomain() const { return baseDomain_m; }
  int indirection(int i) const { return i; }
  const Mask_t &mask() const { return mask_m; }
  int offset(int i) const { return offset_m[i]; }
  int stride(int i) const { return stride_m[i]; }
  void translate(const Loc<Dim> &loc, Loc<Dim> &oloc) const
  {
    for (int d = 0; d < Dim; d++)
      oloc[d] = Loc<1>(offset_m[d] + stride_m[d] * loc[d].first());
  }
  void translate(int i0, Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
  }
  void translate(int i0, int i1, Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
  }
  void translate(int i0, int i1, int i2,
    Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
    loc[2] = offset_m[2] + stride_m[2] * i2;
  }
  void translate(int i0, int i1, int i2, int i3,
    Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
    loc[2] = offset_m[2] + stride_m[2] * i2;
    loc[3] = offset_m[3] + stride_m[3] * i3;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
    loc[2] = offset_m[2] + stride_m[2] * i2;
    loc[3] = offset_m[3] + stride_m[3] * i3;
    loc[4] = offset_m[4] + stride_m[4] * i4;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, int i5, Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
    loc[2] = offset_m[2] + stride_m[2] * i2;
    loc[3] = offset_m[3] + stride_m[3] * i3;
    loc[4] = offset_m[4] + stride_m[4] * i4;
    loc[5] = offset_m[5] + stride_m[5] * i5;
  }
  void translate(int i0, int i1, int i2, int i3,
    int i4, int i5, int i6, Loc<Dim> &loc) const
  {
    loc[0] = offset_m[0] + stride_m[0] * i0;
    loc[1] = offset_m[1] + stride_m[1] * i1;
    loc[2] = offset_m[2] + stride_m[2] * i2;
    loc[3] = offset_m[3] + stride_m[3] * i3;
    loc[4] = offset_m[4] + stride_m[4] * i4;
    loc[5] = offset_m[5] + stride_m[5] * i5;
    loc[6] = offset_m[6] + stride_m[6] * i6;
  }
  template<class DT>
  BaseDomain_t &localToBase(const Domain<Dim, DT> &dlocal,
    BaseDomain_t &base) const
  {
    const typename DT::Domain_t &local = dlocal.unwrap();
    for (int d = 0; d < Dim; d++)
      {
        base[d] = Range<1>(
          offset_m[d] + stride_m[d] * local[d].first(),
          offset_m[d] + stride_m[d] * local[d].last(),
          stride_m[d] * local[d].stride());
      }
    return base;
  }
  template<class DT>
  SliceRange<Dim, Dim> &localToBase(const Domain<Dim, DT> &dlocal,
    SliceRange<Dim, Dim> &base) const
  {
    base.totalDomain() = baseDomain_m;
    const typename DT::Domain_t &local = dlocal.unwrap();
    for (int d = 0; d < Dim; d++)
      {
        Range<1> r(
          offset_m[d] + stride_m[d] * local[d].first(),
          offset_m[d] + stride_m[d] * local[d].last(),
          stride_m[d] * local[d].stride());
        base.totalDomain()[d] = r;
        base.sliceDomain()[d] = r;
        base.cantIgnoreDomain(d);
      }
    return base;
  }
  Interval<Dim> &baseToLocal(const BaseDomain_t &base,
    Interval<Dim> &local) const
  {
    for (int d = 0; d < Dim; d++)
      {
        local[d] = Interval<1>(
          (base[d].first() - offset_m[d]) / stride_m[d],
          (base[d].last() - offset_m[d]) / stride_m[d]);
        ;
      }
    return local;
  }
  Range<Dim> &baseToLocal(const BaseDomain_t &base,
    Range<Dim> &local) const
  {
    for (int d = 0; d < Dim; d++)
      {
        local[d] = Range<1>(
          (base[d].first() - offset_m[d]) / stride_m[d],
          (base[d].last() - offset_m[d]) / stride_m[d],
          base[d].stride() / stride_m[d]);
      }
    return local;
  }
  Interval<Dim> &baseToLocalInterval(const Interval<Dim> &base,
         Interval<Dim> &local) const
  {
    for (int d = 0; d < Dim; d++)
    {
      local[d] = Interval<1>((base[d].first() - offset_m[d]) / stride_m[d],
        (base[d].last() - offset_m[d]) / stride_m[d]);
      ;
      ;
    }
    return local;
  }
private:
  Domain_t domain_m;
  BaseDomain_t baseDomain_m;
  int stride_m[Dim], offset_m[Dim];
  Mask_t mask_m;
};
template<int Dim>
class ContiguousMapper
  : public ContextMapper<Dim>
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template<class Partitioner>
  ContiguousMapper(const Partitioner & gp,
     const Loc<Dim> &nblocks)
    : blocks_m(gp.blocks())
  {
  }
  template<class Partitioner>
  ContiguousMapper(const Partitioner & gp)
     : blocks_m(gp.blocks())
  {
  }
  ContiguousMapper(const Loc<Dim> & blocks)
     : blocks_m(blocks)
  {
  }
  void map(const List_t & templist) const;
  Loc<Dim> blocks_m;
};
template<int Dim>
void ContiguousMapper<Dim>::map(const List_t & templist) const
{
  int idx[Dim];
  for (int i = 0;i<Dim;++i)
    idx[i]=0;
  int strides[Dim];
  strides[Dim-1] = 1;
  for ( int i=Dim-2; i>=0; --i)
    strides[i] = strides[i+1]*blocks_m[i+1].last();
  int npatch = 1;
  for (int i=0; i<Dim; ++i)
    npatch *= blocks_m[i].first();
  int ncontexts = Pooma::contexts();
  int npc = npatch/ncontexts;
  int remainder = npatch - (npc*ncontexts);
  int pcontext = 0;
  int c = 0;
  int patchdone = 0;
  int patchleft = npatch;
  int incriment[Dim];
  for (int i =0 ; i<Dim; ++i) incriment[i] = 1;
  while ( true )
    {
      int allIdx = 0;
      for ( int i = 0 ; i < Dim ; ++i)
 allIdx += idx[i]*strides[i];
      (*templist[allIdx]).context() = pcontext;
      ++c;
      ++patchdone;
      --patchleft;
      if(c >= npc )
 {
   if (c == npc && remainder >0 &&
       ((idx[0]-1 >= 0 && idx[0]+1<=(blocks_m[0].first()-1)) ||
        (patchleft - ((npc+1)*(ncontexts-(pcontext+1))) >=0 )) )
     --remainder;
   else
     {
       c = 0;
       ++pcontext;
     }
 }
      bool t = true;
      for ( int i = 0 ; i < Dim ; ++i)
 {
   t = t && (
      idx[i] == (blocks_m[i]-1) && incriment[i] == 1
      ||
      idx[i] == 0 && incriment[i] == -1);
 }
      if (t)
 break;
      idx[0] += incriment[0];
      for ( int i = 0 ; i < Dim ; ++i)
 {
   if ( idx[i] > blocks_m[i].last()-1)
     {
       idx[i+1]+=incriment[i+1];
       idx[i]=blocks_m[i].last()-1;
       incriment[i] *= -1;
     }
   else if (idx[i]<0)
     {
       idx[i+1]+=incriment[i+1];
       idx[i]=0;
       incriment[i] *= -1;
     }
   else
     break;
 }
    }
  ContextMapper<Dim>::setAffinity(templist);
}
template <int Dim>
class BisectionMapper
  : public ContextMapper<Dim>
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template<class Partitioner>
  BisectionMapper(const Partitioner & gp,
     const Loc<Dim> &nblocks)
    : blocks_m(gp.blocks())
  {
  }
  template<class Partitioner>
  BisectionMapper(const Partitioner & gp)
     : blocks_m(gp.blocks())
  {
  }
  BisectionMapper(const Loc<Dim>& blocks)
     : blocks_m(blocks)
  {
  }
  void map(const List_t & templist) const;
  Loc<Dim> blocks_m;
};
template <int Dim>
void BisectionMapper<Dim>::map(const List_t & templist) const
{
  int ncontexts = Pooma::contexts();
  int npatch = 1;
  for (int i =0;i<Dim; ++i)
    npatch*=blocks_m[i].first();
  std::list<Domain_t> bvec;
  Domain_t allb;
  for (int i = 0; i<Dim; ++i)
    allb[i]=Interval<1>(0,blocks_m[i].first()-1);
  bvec.push_back(allb);
  while ( bvec.size() < ncontexts )
    {
      int s = 0;
      typename std::list<Domain_t>::iterator bstart = bvec.begin();
      typename std::list<Domain_t>::iterator bend = bvec.end();
      typename std::list<Domain_t>::iterator bpatch;
      for ( ; bstart != bend ; ++bstart)
 {
   if (s < (*bstart).size() )
     {
       bpatch = bstart;
       s = (*bstart).size();
     }
 }
      int d = 0;
      int sd = 0;
      for (int i = 0; i<Dim; ++i)
 {
   if ( sd < (*bpatch)[i].size() )
     {
       d = i;
       sd = (*bpatch)[i].size();
     }
 }
      Domain_t hi(*bpatch),lo(*bpatch);
      int lopoint = hi[d].first();
      int hipoint = hi[d].last();
      int mid = lopoint + ( (hipoint - lopoint)/2);
      if (lopoint<=mid)
 lo[d] = Interval<1>(lopoint,mid);
      else
 lo[d] = Interval<1>(lopoint,lopoint);
      if ( hipoint>=mid+1)
 hi[d] = Interval<1>(mid+1,hipoint);
      else
 hi[d] = Interval<1>(hipoint,hipoint);
      bvec.erase(bpatch++);
      bvec.insert(bpatch,lo);
      bvec.insert(bpatch,hi);
    }
  int strides[Dim];
  strides[0] = 1;
  for ( int i=1; i<Dim; ++i)
    strides[i] = strides[i-1]*blocks_m[i-1].first();
  typename std::list<Domain_t>::iterator start = bvec.begin();
  typename std::list<Domain_t>::iterator end = bvec.end();
  int pcontext = 0;
  for ( ; start != end ; ++start)
    {
      int idx[Dim],mi[Dim],mx[Dim];
      for ( int i = 0 ; i < Dim ; ++i)
 {
   idx[i] = mi[i] = (*start)[i].first();
   mx[i] = (*start)[i].last();
 }
      while ( idx[Dim-1] <= mx[Dim-1] )
 {
   int allIdx = 0;
   for ( int i = 0 ; i < Dim ; ++i)
     allIdx += idx[i]*strides[i];
   (*templist[allIdx]).context() = pcontext;
   ++idx[0];
   for ( int i = 0 ; i < Dim ; ++i)
     {
       if ( idx[i] > mx[i] )
  {
    if ( i!=(Dim-1) )
      {
        ++idx[i+1];
        idx[i]=mi[i];
      }
    else
      ++idx[i];
  }
       else
  break;
     }
 }
      ++pcontext;
    }
  this->setAffinity(templist);
}
class UniformMapper
  : public ContextMapper<1>
{
public:
  typedef Interval<1> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template <class Partitioner>
  inline
  UniformMapper(const Partitioner& gp)
    : blocks_m(gp.blocks())
  {
  }
  inline
  UniformMapper(const Loc<1>& blocks)
    : blocks_m(blocks)
  {
  }
  inline
  UniformMapper(int blocks = 1)
    : blocks_m(blocks)
  {
  }
  virtual ~UniformMapper(){}
  void map(const List_t&) const;
private:
  Loc<1> blocks_m;
};
template<int Dim>
class DistributedMapper
  : public ContextMapper<Dim>
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  template<class Partitioner>
  DistributedMapper(const Partitioner & gp)
    : blocks_m(gp.blocks())
  {
  }
  void map(const List_t & templist) const;
  void uniformMap(const Loc<1> &blocks,
    const List_t &templist,
    const WrappedInt<1>&) const
  {
    UniformMapper(blocks).map(templist);
  }
  template <int D>
  void uniformMap(const Loc<D> &,
    const List_t &,
    const WrappedInt<D>&) const
  {
    ;
  }
private:
  Loc<Dim> blocks_m;
};
template<int Dim>
void DistributedMapper<Dim>::map(const List_t & templist) const
{
  int ncontexts = Pooma::contexts();
  int npc = templist.size()/ncontexts;
  if(ncontexts> templist.size())
    {
      npc = 1;
      ncontexts = templist.size();
    }
  if (Dim == 1)
    {
      uniformMap(blocks_m,templist,WrappedInt<Dim>());
    }
  else if(npc<3)
    {
      ContiguousMapper<Dim>(blocks_m).map(templist);
    }
  else
    {
      BisectionMapper<Dim>(blocks_m).map(templist);
    }
  return;
}
template<int Dim>
class UniformGridPartition
{
public:
  typedef LocalMapper<Dim> DefaultMapper_t;
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  enum { uniform = true };
  enum { gridded = true };
  enum { tile = false };
  enum { general = false };
  enum { dimensions = Dim };
  UniformGridPartition();
  UniformGridPartition(const GuardLayers<Dim> &gcs);
  UniformGridPartition(const Loc<Dim> &a);
  UniformGridPartition(const Loc<Dim> &a,
                       const GuardLayers<Dim> &gcs );
  UniformGridPartition(const Loc<Dim> &a,
                       const GuardLayers<Dim> &igcs,
                       const GuardLayers<Dim> &egcs);
  UniformGridPartition(const UniformGridPartition<Dim> &b);
  ~UniformGridPartition() { }
  UniformGridPartition<Dim> &
  operator=(const UniformGridPartition<Dim> &g)
  {
    if (this != &g)
      {
 blocks_m = g.blocks();
 hasGuards_m = g.hasGuards_m;
 hasCustomEdgeGuards_m = g.hasCustomEdgeGuards_m;
 internalGuards_m = g.internalGuards_m;
 externalGuards_m = g.externalGuards_m;
 num_m = g.maxSize();
      }
    return *this;
  }
  int maxSize() const { return num_m; }
  const Loc<Dim> &blocks() const { return blocks_m; }
  bool hasGuards() const
  {
    ;
    return hasGuards_m;
  }
  bool hasInternalGuards() const
  {
    return hasGuards_m && internalGuards_m != 0;
  }
  bool hasExternalGuards() const
  {
    return hasGuards_m && externalGuards_m != 0;
  }
  const GuardLayers<Dim> &internalGuards() const
  {
    return internalGuards_m;
  }
  const GuardLayers<Dim> &externalGuards() const
  {
    return externalGuards_m;
  }
  template<class D>
  int partition(const D &domain,
  List_t & all,
  const ContextMapper<Dim>& cmapper) const;
  template<class D>
  int partition(const D &domain, List_t & list) const
  {
    return partition(domain,list,DefaultMapper_t(*this));
  }
protected:
  Loc<Dim> blocks_m;
  bool hasGuards_m;
  bool hasCustomEdgeGuards_m;
  GuardLayers<Dim> internalGuards_m;
  GuardLayers<Dim> externalGuards_m;
  int num_m;
  void calcNum()
  {
    num_m = blocks_m[0].first();
    for (int d = 1; d < Dim; ++d)
      {
 num_m *= blocks_m[d].first();
      }
  }
};
template<int Dim>
template<class D>
int UniformGridPartition<Dim>::partition(const D &domain,
      List_t & all,
      const ContextMapper<Dim>& cmapper) const
{
  typedef typename DomainTraits<Domain_t>::Element_t Element_t;
  PoomaCTAssert<(Dim == DomainTraits<D>::dimensions)>::test();
  PoomaCTAssert<(Dim == DomainTraits<Domain_t>::dimensions)>::test();
  PoomaCTAssert<(DomainTraits<D>::unitStride == 1)>::test();
  PoomaCTAssert<(DomainTraits<Domain_t>::unitStride == 1)>::test();
  ;
  Element_t origin[Dim];
  Element_t sizes[Dim];
  Interval<Dim> bdomain = Pooma::NoInit();
  int i;
  for (i = 0; i < Dim; ++i)
    {
      if (!domain.empty())
 {
   int gcwidth =
     (internalGuards_m.lower(i) > internalGuards_m.upper(i)) ?
     internalGuards_m.lower(i) : internalGuards_m.upper(i);
   if (__builtin_expect(!!((domain[i].length() % blocks()[i].first()) == 0), true)) {} else Pooma::toss_cookies("All the blocks in a grid must be the same size.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Partition/UniformGridPartition.h", 369);
   origin[i] = domain[i].first();
   sizes[i] = domain[i].length() / blocks()[i].first();
   if (__builtin_expect(!!(sizes[i] >= gcwidth), true)) {} else Pooma::toss_cookies("Block sizes too small for guard layer specification.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Partition/UniformGridPartition.h", 375);
 }
      bdomain[i] = Interval<1>(blocks()[i].first());
    }
  typename Interval<Dim>::const_iterator it = bdomain.begin();
  while (it != bdomain.end())
    {
      Domain_t owned;
      GuardLayers<Dim> iguards(0);
      GuardLayers<Dim> eguards(0);
      if (!domain.empty())
 {
   Loc<Dim> pos = *it;
   for (i = 0; i < Dim; ++i)
     {
       int position = pos[i].first();
       Element_t a = origin[i] + sizes[i]*position;
       Element_t b = a + sizes[i] - 1;
       typedef typename
  DomainTraits<Domain_t>::OneDomain_t OneDomain_t;
       owned[i] = OneDomain_t(a, b);
     }
   if (hasGuards_m)
     {
       iguards = internalGuards_m;
       for (int d = 0; d < Dim; ++d)
  {
    int position = pos[d].first();
    if ( position == bdomain[d].first() )
      {
        eguards.lower(d) = externalGuards_m.lower(d);
        iguards.lower(d) = 0;
      }
    if ( position == bdomain[d].last() )
      {
        eguards.upper(d) = externalGuards_m.upper(d);
        iguards.upper(d) = 0;
      }
  }
     }
 }
      typename Value_t::ID_t gid = all.size();
      typename Value_t::ID_t lid = (-1);
      GuardLayers<Dim>::addGuardLayers(owned,eguards);
      Domain_t allocated = owned;
      GuardLayers<Dim>::addGuardLayers(allocated,iguards);
      Value_t *node = new Value_t(owned, allocated, -1, gid, lid);
      all.push_back(node);
      ++it;
    }
  cmapper.map(all);
  return num_m;
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition()
: hasGuards_m(false),
  hasCustomEdgeGuards_m(false),
  num_m(1)
{
  blocks_m = 1;
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition(const GuardLayers<Dim> &gcs)
: hasGuards_m(gcs != 0),
  hasCustomEdgeGuards_m(gcs != 0),
  externalGuards_m(gcs),
  num_m(1)
{
  blocks_m = 1;
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition(const Loc<Dim> &a)
: blocks_m(a),
  hasGuards_m(false),
  hasCustomEdgeGuards_m(false)
{
  calcNum();
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition(const Loc<Dim> &a,
                     const GuardLayers<Dim> &gcs)
: blocks_m(a),
  hasGuards_m(gcs != 0),
  hasCustomEdgeGuards_m(false),
  internalGuards_m(gcs),
  externalGuards_m(gcs)
{
  calcNum();
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition(const Loc<Dim> &a,
                     const GuardLayers<Dim> &igcs,
                     const GuardLayers<Dim> &egcs)
: blocks_m(a),
  hasGuards_m(igcs != 0 || egcs != 0),
  hasCustomEdgeGuards_m(igcs != egcs),
  internalGuards_m(igcs),
  externalGuards_m(egcs)
{
  calcNum();
}
template <int Dim>
inline UniformGridPartition<Dim>::
UniformGridPartition(const UniformGridPartition<Dim> &b)
: blocks_m(b.blocks_m),
  hasGuards_m(b.hasGuards_m),
  hasCustomEdgeGuards_m(b.hasCustomEdgeGuards_m),
  internalGuards_m(b.internalGuards_m),
  externalGuards_m(b.externalGuards_m),
  num_m(b.num_m)
{ }
struct ReplicatedTag {};
struct DistributedTag {};
template <class LayoutTag, int Dim>
struct MultiPatchLayoutTraits {};
template <int Dim>
class LayoutBaseData
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Interval<Dim> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  struct GCFillInfo
  {
    GCFillInfo(const Domain_t &dom, int ownedID, int guardID, int face=-1)
    : domain_m(dom), ownedID_m(ownedID), guardID_m(guardID), face_m(face) { }
    GCFillInfo() { if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Shouldn't get here!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Layout/LayoutBase.h", 126); }
    Domain_t domain_m;
    int ownedID_m;
    int guardID_m;
    int face_m;
    Domain_t & domain() { return domain_m;}
    int & ownedID() { return ownedID_m;}
    int & guardID() { return guardID_m;}
  };
  typedef GCFillInfo GCFillInfo_t;
  typedef typename std::vector<GCFillInfo>::const_iterator FillIterator_t;
  LayoutBaseData()
    :
    ID_m(Unique::get()),
    domain_m(Interval<Dim>()),
    innerdomain_m(Interval<Dim>()),
    hasInternalGuards_m(false),
    hasExternalGuards_m(false),
    internalGuards_m(0),
    externalGuards_m(0)
  {
  }
  LayoutBaseData(bool hasIG, bool hasEG,
   GuardLayers_t eg, GuardLayers_t ig,
   Domain_t d, Domain_t id)
    :
    ID_m(Unique::get()),
    domain_m(d),
    innerdomain_m(id),
    hasInternalGuards_m(hasIG),
    hasExternalGuards_m(hasEG),
    internalGuards_m(ig),
    externalGuards_m(eg)
  {
  }
  ~LayoutBaseData()
  {
  }
  inline const Domain_t & domain(int i) const
  {
    ;
    return all_m[i]->allocated();
  }
  inline const Domain_t & ownedDomain(int i) const
  {
    ;
    return all_m[i]->domain();
  }
  inline const Domain_t & allocatedDomain(int i) const
  {
    ;
    return all_m[i]->allocated();
  }
  inline const GuardLayers_t& internalGuards() const
  {
    return internalGuards_m;
  }
  inline const GuardLayers_t& externalGuards() const
  {
    return externalGuards_m;
  }
  inline List_t &nodeListGlobal()
  {
    return all_m;
  }
  inline List_t &nodeListLocal()
  {
    return local_m;
  }
  inline List_t &nodeListRemote()
  {
    return remote_m;
  }
  inline bool initialized() const { return all_m.size() > 0; }
  inline int first(int d) const { return firsti_m[d]; }
  inline int firsts(int d) const { return firste_m[d]; }
  inline const Loc<Dim>& blocks() const { return blocks_m; }
  FillIterator_t beginFillList() const
  {
    return gcFillList_m.begin();
  }
  FillIterator_t endFillList() const
  {
    return gcFillList_m.end();
  }
  ID_t ID_m;
  Domain_t domain_m;
  Domain_t innerdomain_m;
  List_t all_m;
  List_t local_m;
  List_t remote_m;
  bool hasInternalGuards_m;
  bool hasExternalGuards_m;
  GuardLayers_t internalGuards_m;
  GuardLayers_t externalGuards_m;
  std::vector<GCFillInfo> gcFillList_m;
  int firste_m[Dim];
  int firsti_m[Dim];
  Loc<Dim> blocks_m;
};
template <int Dim, class LBD>
class LayoutBase
{
public:
  typedef LayoutBaseData<Dim> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef LayoutBase<Dim,LBD> This_t;
  typedef Observable<This_t> Observable_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef typename LayoutData_t::GCFillInfo_t GCFillInfo_t;
  typedef typename
  std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  enum { supportsGuards = true };
  LayoutBase(LBD * Ldata)
    : pdata_m(Ldata)
  {
  }
   LayoutBase(RefCountedPtr<LBD> pdata)
    : pdata_m(pdata)
  {
  }
  ~LayoutBase()
  {
  }
  inline ID_t ID() const
  {
    return pdata_m->ID_m;
  }
  inline ID_t baseID() const
  {
    return pdata_m->ID_m;
  }
  inline bool initialized() const
  {
    return (sizeGlobal() > 0);
  }
  template <class DT>
  BaseDomain_t &localToBase(const Domain<Dim, DT> &dlocal,
    BaseDomain_t &base) const
  {
    return pdata_m->indexer_m.localToBase(dlocal,base);
  }
  inline const Domain_t &domain() const
  {
    return pdata_m->domain_m;
  }
  inline const Domain_t &innerDomain() const
  {
    return pdata_m->innerdomain_m;
  }
  inline const Domain_t &baseDomain() const
  {
    return pdata_m->domain_m;
  }
  inline const Domain_t &domain(int i) const
  {
    return pdata_m->domain(i);
  }
  inline const Domain_t &ownedDomain(int i) const
  {
    return pdata_m->ownedDomain(i);
  }
  inline const Domain_t &allocatedDomain(int i) const
  {
    return pdata_m->allocatedDomain(i);
  }
  inline const List_t & nodeListGlobal() const
  {
    return pdata_m->nodeListGlobal();
  }
  inline const List_t &nodeListLocal() const
  {
    return pdata_m->nodeListLocal();
  }
  inline const List_t &nodeListRemote() const
  {
    return pdata_m->nodeListRemote();
  }
  inline GuardLayers_t internalGuards() const
  {
    return pdata_m->internalGuards();
  }
  inline GuardLayers_t externalGuards() const
  {
    return pdata_m->externalGuards();
  }
  inline int first(int d) const { return pdata_m->first(d); }
  inline Loc<Dim> blocks() const { return pdata_m->blocks(); }
  inline const Domain_t patchDomain(int lid) const
  {
    return nodeListLocal()[lid]->domain();
  }
  inline int localToGlobalPatchID(int lid) const
  {
    return nodeListLocal()[lid]->globalID();
  }
  int globalID(const Loc<Dim> &loc) const
  { return pdata_m->globalID(loc); }
  int globalID(int i0) const
  { return pdata_m->globalID(i0); }
  int globalID(int i0, int i1) const
  { return pdata_m->globalID(i0,i1); }
  int globalID(int i0, int i1, int i2) const
  { return pdata_m->globalID(i0,i1,i2); }
  int globalID(int i0, int i1, int i2, int i3) const
  { return pdata_m->globalID(i0,i1,i2,i3); }
  int globalID(int i0, int i1, int i2, int i3, int i4) const
  { return pdata_m->globalID(i0,i1,i2,i3,i4); }
  int globalID(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return pdata_m->globalID(i0,i1,i2,i3,i4,i5); }
  int globalID(int i0, int i1, int i2,int i3, int i4, int i5, int i6) const
  { return pdata_m->globalID(i0,i1,i2,i3,i4,i5,i6); }
  template <class Partitioner>
  bool repartition(const Partitioner &gp,const ContextMapper<Dim> &cmap)
  {
    return pdata_m->repartition(gp,cmap);
  }
  template <class Partitioner>
  bool repartition(const Partitioner &gp)
  {
    typename Partitioner::DefaultMapper_t cmap(gp);
    return pdata_m->repartition(gp,cmap);
  }
  template <class L>
  inline bool operator==(const L &layout) const
  {
    return (baseID() == layout.baseID() &&
            baseDomain() == layout.baseDomain());
  }
  template <class L>
  inline bool operator!=(const L &layout) const
  {
    return !(*this == layout);
  }
  inline iterator beginGlobal()
  {
    return iterator(pdata_m->all_m.begin());
  }
  inline iterator endGlobal()
  {
    return iterator(pdata_m->all_m.end());
  }
  inline const_iterator beginGlobal() const
  {
    return const_iterator(pdata_m->all_m.begin());
  }
  inline const_iterator endGlobal() const
  {
    return const_iterator(pdata_m->all_m.end());
  }
  inline int sizeGlobal() const
  {
    return pdata_m->all_m.size();
  }
  inline iterator beginLocal()
  {
    return iterator(pdata_m->local_m.begin());
  }
  inline iterator endLocal()
  {
    return iterator(pdata_m->local_m.end());
  }
  inline const_iterator beginLocal() const
  {
    return const_iterator(pdata_m->local_m.begin());
  }
  inline const_iterator endLocal() const
  {
    return const_iterator(pdata_m->local_m.end());
  }
  inline int sizeLocal() const
  {
    return pdata_m->local_m.size();
  }
  inline iterator beginRemote()
  {
    return iterator(pdata_m->remote_m.begin());
  }
  inline iterator endRemote()
  {
    return iterator(pdata_m->remote_m.end());
  }
  inline const_iterator beginRemote() const
  {
    return const_iterator(pdata_m->remote_m.begin());
  }
  inline const_iterator endRemote() const
  {
    return const_iterator(pdata_m->remote_m.end());
  }
  inline int sizeRemote() const
  {
    return pdata_m->remote_m.size();
  }
  FillIterator_t beginFillList() const
  {
    return pdata_m->beginFillList();
  }
  FillIterator_t endFillList() const
  {
    return pdata_m->endFillList();
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o, const ConstructTag &ctag) const
  {
    return pdata_m->touches(d,o,ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAlloc(const OtherDomain &d, OutIter o,
                   const ConstructTag &ctag) const
  {
    return pdata_m->touchesAlloc(d, o, ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesLocal(const OtherDomain &d, OutIter o,
     const ConstructTag &ctag) const
  {
    return pdata_m->touchesLocal(d, o, ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesAllocLocal(const OtherDomain &d, OutIter o,
          const ConstructTag &ctag) const
  {
    return pdata_m->touchesAllocLocal(d, o, ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesRemote(const OtherDomain & d, OutIter o,
      const ConstructTag &ctag) const
  {
    return pdata_m->touchesRemote(d,o,ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesAllocRemote(const OtherDomain &d, OutIter o,
           const ConstructTag & ctag) const
  {
    return pdata_m->touchesAllocRemote(d,o,ctag);
  }
  template <class OtherDomain, class OutIter>
  inline int touches(const OtherDomain &d, OutIter o) const
  {
    return touches(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  inline int touchesLocal(const OtherDomain &d, OutIter o) const
  {
    return touchesLocal(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  inline int touchesRemote(const OtherDomain &d, OutIter o) const
  {
    return touchesRemote(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  int touchesAlloc(const OtherDomain &d, OutIter o) const
  {
    return touchesAlloc(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  int touchesAllocLocal(const OtherDomain &d, OutIter o) const
  {
    return touchesAllocLocal(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  int touchesAllocRemote(const OtherDomain &d, OutIter o) const
  {
    return touchesAllocRemote(d, o, TouchesConstructNodeObj());
  }
  template <int Dim1, int Dim2, class lbd>
  friend class LayoutBaseView;
  friend class LayoutBaseData<Dim>;
  RefCountedPtr<LBD> pdata_m;
};
template <int Dim, int Dim2, class L>
class LayoutBaseViewData
{
public:
  typedef L Layout_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim2> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef typename Layout_t::Domain_t AllocatedDomain_t;
  typedef ViewIndexer<Dim,Dim2> Indexer_t;
  typedef Node<Domain_t,AllocatedDomain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  LayoutBaseViewData()
   : id_m(Unique::get())
  { }
  template<class DT>
  LayoutBaseViewData(const L & layout, const Domain<Dim,DT> & dom)
    : id_m(Unique::get()), layout_m(layout),
      internalGuards_m(layout.internalGuards()),
      externalGuards_m(layout.externalGuards()),
      indexer_m(dom),
      subdomainsComputed_m(false)
  {
    PoomaCTAssert<(Dim == Dim2)>::test();
    ;
    ;
  }
  template <class DT>
  LayoutBaseViewData(const L &layout, const SliceDomain<DT> &dom)
  : id_m(Unique::get()), layout_m(layout), indexer_m(dom),
    subdomainsComputed_m(false)
  {
    PoomaCTAssert<(Dim == DT::sliceDimensions)>::test();
    PoomaCTAssert<(Dim2 == DT::dimensions)>::test();
    ;
    ;
    int dt, d;
    for (d = 0, dt = 0; dt < Dim2; ++dt)
      {
        if (!dom.ignorable(dt))
          {
            internalGuards_m.lower(d) = layout_m.internalGuards().lower(dt);
            internalGuards_m.upper(d) = layout_m.internalGuards().upper(dt);
            externalGuards_m.lower(d) = layout_m.externalGuards().lower(dt);
            externalGuards_m.upper(d) = layout_m.externalGuards().upper(dt);
            ;
            ++d;
          }
      }
  }
   template <class DT,class LV>
   LayoutBaseViewData(const L &layout,
        const LV & viewLayout,
        const Indexer_t & indexer,
        const Domain<Dim, DT> &dom,
        GuardLayers_t ig,
        GuardLayers_t eg)
  :
    id_m(Unique::get()),
    layout_m(layout),
    internalGuards_m(ig),
    externalGuards_m(eg),
    indexer_m(indexer, dom),
    subdomainsComputed_m(false)
  {
    ;
    ;
  }
   template <class DT,class LV>
   LayoutBaseViewData(const L &layout,
        const LV &viewLayout,
        const Indexer_t indexer,
        const SliceDomain<DT> &dom)
     : id_m(Unique::get()), layout_m(layout),
     indexer_m(indexer),
     subdomainsComputed_m(false)
  {
    PoomaCTAssert<((int)DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<((int)DT::dimensions == LV::dimensions)>::test();
    ;
    ;
    int dt, d;
    for (d = 0, dt = 0; dt < LV::dimensions ; ++dt)
      {
        if (!dom.ignorable(dt))
          {
            internalGuards_m.lower(d) = viewLayout.internalGuards().lower(dt);
            internalGuards_m.upper(d) = viewLayout.internalGuards().upper(dt);
            externalGuards_m.lower(d) = viewLayout.externalGuards().lower(dt);
            externalGuards_m.upper(d) = viewLayout.externalGuards().upper(dt);
            ;
            ++d;
          }
      }
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o,
              const ConstructTag &ctag) const
  {
    BaseDomain_t bd = Pooma::NoInit();
    indexer_m.localToBase(d, bd);
    std::vector<Node<BaseDomain_t,AllocatedDomain_t> > tnodes;
    int count = layout_m.touches(bd, std::back_inserter(tnodes));
    Range<Dim> ld = Pooma::NoInit();
    for (int i = 0; i < count; i++)
      {
        *o++ =
          touchesConstruct(indexer_m.baseToLocal(tnodes[i].domain(), ld),
                           tnodes[i].allocated(),
                           tnodes[i].affinity(), tnodes[i].context(),
                           tnodes[i].globalID(), tnodes[i].localID(), ctag);
      }
    return count;
  }
  void computeSubdomains() const
  {
    if (subdomainsComputed_m)
      return;
    std::vector<Node<BaseDomain_t,AllocatedDomain_t> > tnodes;
    int count = layout_m.touches(indexer_m.baseDomain(),
                                 std::back_inserter(tnodes));
    Domain_t ld = Pooma::NoInit();
    for (int i = 0; i < count; ++i)
      {
        Value_t *pt =
          touchesConstruct(indexer_m.baseToLocal(tnodes[i].domain(), ld),
                           tnodes[i].allocated(),
                           tnodes[i].affinity(),tnodes[i].context(),
                           tnodes[i].globalID(),tnodes[i].localID(),
                           TouchesConstructNodePtr());
        all_m.push_back(pt);
        if (pt->context() == Pooma::context()
     ||pt->context() == -1 )
          local_m.push_back(pt);
        else
          remote_m.push_back(pt);
      }
    subdomainsComputed_m = true;
  }
  ID_t id_m;
  L layout_m;
  GuardLayers_t internalGuards_m;
  GuardLayers_t externalGuards_m;
  Indexer_t indexer_m;
  mutable List_t all_m;
  mutable List_t local_m;
  mutable List_t remote_m;
  mutable bool subdomainsComputed_m;
};
template <int Dim, int Dim2, class lvd>
class LayoutBaseView
{
public:
  enum { dimensions = Dim };
  typedef lvd LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Layout_t Layout_t;
  typedef typename LayoutData_t::AllocatedDomain_t AllocatedDomain_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef typename LayoutData_t::Indexer_t Indexer_t;
  typedef typename LayoutData_t::GuardLayers_t GuardLayers_t;
  typedef LayoutBaseView<Dim, Dim2, lvd> This_t;
  typedef LayoutBaseView<Dim, Dim2, lvd> ViewLayout_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  LayoutBaseView(LayoutData_t * lvdp)
    : pdata_m(lvdp)
  {}
  LayoutBaseView(const RefCountedPtr<LayoutData_t> & pdata)
    : pdata_m(pdata)
  {}
  inline ID_t ID() const { return pdata_m->id_m; }
  inline ID_t baseID() const { return pdata_m->layout_m.baseID(); }
  inline bool initialized() const { return true; }
  inline const Domain_t &domain() const
  {
    return pdata_m->indexer_m.domain();
  }
  inline const Domain_t &innerDomain() const
  {
    return pdata_m->indexer_m.innerDomain();
  }
  inline const BaseDomain_t &baseDomain() const
  {
    return pdata_m->indexer_m.baseDomain();
  }
  inline const Layout_t &baseLayout() const
  {
    return pdata_m->layout_m;
  }
  template <class DT>
  BaseDomain_t &localToBase(const Domain<Dim, DT> &dlocal,
    BaseDomain_t &base) const
  {
    return pdata_m->indexer_m.localToBase(dlocal,base);
  }
  template <class DT>
  SliceRange<Dim2, Dim> &localToBase(const Domain<Dim, DT> &dlocal,
    SliceRange<Dim2, Dim> &base) const
  {
    return pdata_m->indexer_m.localToBase(dlocal,base);
  }
  inline GuardLayers_t internalGuards() const
  {
    return pdata_m->internalGuards_m;
  }
  inline GuardLayers_t externalGuards() const
  {
    return pdata_m->externalGuards_m;
  }
  inline int first(int) const { return 0; }
  template <class L>
  inline bool operator==(const L &layout) const
  {
    return (baseID() == layout.baseID() &&
            baseDomain() == layout.baseDomain());
  }
  template <class L>
  inline bool operator!=(const L &layout) const
  {
    return !(*this == layout);
  }
  inline int
  globalID(const Loc<Dim> &loc, Loc<Dim2> &oloc) const
  {
    pdata_m->indexer_m.translate(loc,oloc);
    return pdata_m->layout_m.globalID(oloc);
  }
  inline int
  globalID(int i0, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, int i2, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,i2,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, int i2, int i3,
           Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,i2,i3,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, int i2, int i3,
           int i4, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,i2,i3,i4,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, int i2, int i3,
           int i4, int i5, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,i2,i3,i4,i5,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  inline int
  globalID(int i0, int i1, int i2, int i3,
           int i4, int i5, int i6, Loc<Dim2> &loc) const
  {
    pdata_m->indexer_m.translate(i0,i1,i2,i3,i4,i5,i6,loc);
    return pdata_m->layout_m.globalID(loc);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o,
    const ConstructTag &ctag) const
  {
    return pdata_m->touches(d,o,ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesLocal(const OtherDomain &d, OutIter o,
    const ConstructTag &ctag) const {
    return pdata_m->touches(d, o, ctag);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesRemote(const OtherDomain &, OutIter,
    const ConstructTag &) const {
    return 0;
  }
  template <class OtherDomain, class OutIter>
  inline int touches(const OtherDomain &d, OutIter o) const {
    return touches(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  inline int touchesLocal(const OtherDomain &d, OutIter o) const {
    return touchesLocal(d, o, TouchesConstructNodeObj());
  }
  template <class OtherDomain, class OutIter>
  inline int touchesRemote(const OtherDomain &d, OutIter o) const {
    return touchesRemote(d, o, TouchesConstructNodeObj());
  }
  inline iterator beginGlobal() {
    computeSubdomains();
    return iterator(pdata_m->all_m.begin());
  }
  inline iterator endGlobal() {
    computeSubdomains();
    return iterator(pdata_m->all_m.end());
  }
  inline const_iterator beginGlobal() const {
    computeSubdomains();
    return const_iterator(pdata_m->all_m.begin());
  }
  inline const_iterator endGlobal() const {
    computeSubdomains();
    return const_iterator(pdata_m->all_m.end());
  }
  inline int sizeGlobal() const {
    computeSubdomains();
    return pdata_m->all_m.size();
  }
  inline iterator beginLocal() {
    computeSubdomains();
    return iterator(pdata_m->local_m.begin());
  }
  inline iterator endLocal() {
    computeSubdomains();
    return iterator(pdata_m->local_m.end());
  }
  inline const_iterator beginLocal() const {
    computeSubdomains();
    return const_iterator(pdata_m->local_m.begin());
  }
  inline const_iterator endLocal() const {
    computeSubdomains();
    return const_iterator(pdata_m->local_m.end());
  }
  inline int sizeLocal() const {
    computeSubdomains();
    return pdata_m->local_m.size();
  }
  inline iterator beginRemote() {
    computeSubdomains();
    return iterator(pdata_m->remote_m.begin());
  }
  inline iterator endRemote() {
    computeSubdomains();
    return iterator(pdata_m->remote_m.end());
  }
  inline const_iterator beginRemote() const {
    computeSubdomains();
    return const_iterator(pdata_m->remote_m.begin());
  }
  inline const_iterator endRemote() const {
    computeSubdomains();
    return const_iterator(pdata_m->remote_m.end());
  }
  inline int sizeRemote() const {
    computeSubdomains();
    return pdata_m->remote_m.size();
  }
  template <int OtherDim, int OtherDim2, class OtherLayoutData>
  friend class LayoutBaseView;
  template <int OtherDim, int OtherDim2, class OtherLayout>
  friend class LayoutBaseViewData;
  void computeSubdomains() const { pdata_m->computeSubdomains(); }
  RefCountedPtr<LayoutData_t> pdata_m;
};
template <int Dim> class SparseTileLayoutData;
template <int Dim> class SparseTileLayout;
template <int Dim, int Dim2> class SparseTileLayoutViewData;
template <int Dim, int Dim2> class SparseTileLayoutView;
struct SparseTileTag { };
template <int Dim>
struct MultiPatchLayoutTraits<SparseTileTag,Dim>
{
  typedef SparseTileLayout<Dim> Layout_t;
  template <int ViewDim>
  struct View
  {
    typedef SparseTileLayoutView<ViewDim,Dim> Layout_t;
  };
};
template<int Dim>
class SparseTileLayoutData
 : public LayoutBaseData<Dim>,
   public RefCounted,
   public Observable< SparseTileLayoutData<Dim> >
{
public:
  typedef SparseTileLayoutData<Dim> This_t;
  typedef Observable<This_t> Observable_t;
  typedef Interval<Dim> Domain_t;
  typedef Interval<Dim> BaseDomain_t;
  typedef Interval<Dim> AllocatedDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef Node<Domain_t,AllocatedDomain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef std::map<int,Value_t> Map_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef std::pair<int,int> pidx_t;
  typedef typename DynamicEvents::PatchID_t PatchID_t;
  typedef typename DynamicEvents::CreateSize_t CreateSize_t;
  typedef BaseDomain_t SubPatch_t;
  typedef std::vector<SubPatch_t> PatchList_t;
  typedef typename LayoutBaseData<Dim>::GCFillInfo_t GCFillInfo_t;
  typedef typename std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  struct GCBorderFillInfo
  {
    GCBorderFillInfo(const Domain_t &dom, int patchID)
      : domain_m(dom), patchID_m(patchID)
      {
      }
    GCBorderFillInfo()
      {
 if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Shouldn't get here!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Layout/SparseTileLayout.h", 173);
      }
    Domain_t domain_m;
    int patchID_m;
    inline const Domain_t& domain() const { return domain_m; }
    int patchID() const { return patchID_m;}
  };
  typedef GCBorderFillInfo GCBorderFillInfo_t;
  typedef typename std::vector<GCBorderFillInfo>::const_iterator
                                               BorderFillIterator_t;
  enum { dimensions = Dim };
  enum { repartitionEvent = 1 };
  enum { dynamic = false };
  SparseTileLayoutData();
  SparseTileLayoutData(const Domain_t &,
         const PatchList_t &,
         const ContextMapper<Dim> &);
  SparseTileLayoutData(const Domain_t &boundingbox,
         const GuardLayers_t & globalGL,
         const PatchList_t & PatchList,
         const ContextMapper<Dim> &);
  SparseTileLayoutData(const Domain_t &boundingbox,
         const GuardLayers_t & internalGL,
         const GuardLayers_t & externalGL,
         const PatchList_t & PatchList,
         const ContextMapper<Dim> &);
  SparseTileLayoutData(const Domain_t &boundingbox);
  SparseTileLayoutData(const Domain_t &boundingbox,
         const GuardLayers_t & globalGL);
  SparseTileLayoutData(const Domain_t &boundingbox,
         const GuardLayers_t & internalGL,
         const GuardLayers_t & externalGL);
template <class Partitioner>
SparseTileLayoutData(const Domain_t &bbox,
       const Partitioner & gpar,
       const ContextMapper<Dim> &cmap);
  ~SparseTileLayoutData() ;
  void initialize(const Domain_t &bbox);
  void initialize(const Domain_t &bbox,
    const GuardLayers_t & globalGL);
  void initialize(const Domain_t &bbox,
    const GuardLayers_t & internalGL,
    const GuardLayers_t & externalGL);
  void initialize(const Domain_t &bbox,
    const PatchList_t &plist,
    const ContextMapper<Dim> &cmap);
  void initialize(const Domain_t &bbox,
    const GuardLayers_t & globalGL,
    const PatchList_t &plist,
    const ContextMapper<Dim> &cmap);
  void initialize(const Domain_t &bbox,
    const GuardLayers_t & internalGL,
    const GuardLayers_t & externalGL,
    const PatchList_t &plist,
    const ContextMapper<Dim> &cmap);
  template <class Partitioner>
  void initialize(const Domain_t &bbox,
    const Partitioner &gpar,
    const ContextMapper<Dim> &cmap);
  void syncPatch();
  void calcMaps();
  void calcAllocMaps() ;
  BorderFillIterator_t beginBorderFillList() const
  {
    return gcBorderFillList_m.begin();
  }
  BorderFillIterator_t endBorderFillList() const
  {
    return gcBorderFillList_m.end();
  }
  int globalID(const Loc<Dim> &loc) const;
  int globalID(int) const;
  int globalID(int,int) const;
  int globalID(int,int,int) const;
  int globalID(int,int,int,int) const;
  int globalID(int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int,int) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d,
       OutIter o,
       const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAlloc(const OtherDomain &d,
     OutIter o,
     const ConstructTag &ctag) const;
  template<class Out>
  void print(Out & o) const;
private:
  void calcGCFillList();
  void calcDomains();
  void calcMaps() const;
  void calcAllocMaps() const;
  std::vector<GCBorderFillInfo> gcBorderFillList_m;
  mutable DomainMap<Interval<Dim>,pidx_t> map_m;
  mutable DomainMap<Interval<Dim>,pidx_t> mapAloc_m;
};
template <int Dim>
class SparseTileLayout : public LayoutBase<Dim,SparseTileLayoutData<Dim> >,
                         public Observable<SparseTileLayout<Dim> >,
                         public Observer<SparseTileLayoutData<Dim> >
{
public:
  enum { dimensions = Dim };
  enum { repartitionEvent = 1 };
  enum { dynamic = true };
  typedef SparseTileLayout<Dim> This_t;
  typedef Observable<This_t> Observable_t;
  typedef SparseTileLayoutData<Dim> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef typename LayoutData_t::SubPatch_t SubPatch_t;
  typedef typename LayoutData_t::PatchList_t PatchList_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef typename LayoutData_t::GCFillInfo_t GCFillInfo_t;
  typedef typename LayoutData_t::FillIterator_t FillIterator_t;
  typedef typename LayoutData_t::BorderFillIterator_t BorderFillIterator_t;
  SparseTileLayout();
  SparseTileLayout(const Domain_t &boundingbox);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL);
  SparseTileLayout(Domain_t & boundingbox,
     const PatchList_t &patchlist,
     const ReplicatedTag &);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL,
     const PatchList_t & PatchList,
     const ReplicatedTag &);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL,
     const PatchList_t & PatchList,
     const ReplicatedTag &);
  template<class Partitioner>
  SparseTileLayout(const Domain_t &bbox,
     const Partitioner &gpar,
     const ReplicatedTag &);
  SparseTileLayout(Domain_t & boundingbox,
     const PatchList_t &patchlist,
     const DistributedTag &);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL,
     const PatchList_t & PatchList,
     const DistributedTag &);
  SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL,
     const PatchList_t & PatchList,
     const DistributedTag &);
  template<class Partitioner>
  SparseTileLayout(const Domain_t &bbox,
     const Partitioner &gpar,
     const DistributedTag &);
  template<class Partitioner>
  SparseTileLayout(const Domain_t &bbox,
     const Partitioner &gpar,
     const ContextMapper<Dim> &cmap);
  SparseTileLayout(const This_t &);
  This_t &
  operator=(const This_t &model)
  {
    if (this != &model)
      {
 this->pdata_m->detach(*this);
 this->pdata_m = model.pdata_m;
 this->pdata_m->attach(*this);
      }
    return *this;
  }
  ~SparseTileLayout()
  {
    this->pdata_m->detach(*this);
  }
  void initialize(const Domain_t & a);
  void initialize(const Domain_t &,
              const GuardLayers_t &);
  void initialize(const Domain_t &,
              const GuardLayers_t &,
     const PatchList_t & );
  template<class Partitioner>
  void initialize(const Domain_t &bbox,
      const Partitioner &gpar);
  BorderFillIterator_t beginBorderFillList() const
    {
      return this->pdata_m->beginBorderFillList();
    }
  BorderFillIterator_t endBorderFillList() const
    {
      return this->pdata_m->endBorderFillList();
    }
  void syncPatch();
  virtual void notify(LayoutData_t &d, const ObserverEvent &event)
    {
      ;
      Observable_t::notify(event);
    }
  template <class Ostream>
  void print(Ostream &ostr) const {
    this->pdata_m->print(ostr);
  }
  template <int Dim1, int Dim2>
  friend class SparseTileLayoutView;
  friend class SparseTileLayoutData<Dim>;
};
template <int Dim, int Dim2>
class SparseTileLayoutViewData
: public LayoutBaseViewData<Dim, Dim2, SparseTileLayout<Dim2> >,
  public RefCounted
{
public:
  typedef SparseTileLayout<Dim2> Layout_t;
  typedef SparseTileLayoutView<Dim, Dim2> ViewLayout_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim2> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef typename Layout_t::Domain_t AllocatedDomain_t;
  typedef ViewIndexer<Dim,Dim2> Indexer_t;
  typedef Node<Domain_t,AllocatedDomain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef SparseTileLayoutViewData<Dim,Dim2> LayoutData_t;
  SparseTileLayoutViewData() { }
  template <class DT>
  inline SparseTileLayoutViewData(const Layout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,SparseTileLayout<Dim2> >(layout,dom)
  {
    PoomaCTAssert<(Dim == Dim2)>::test();
    ;
    ;
  }
  template <class DT>
  inline SparseTileLayoutViewData(const Layout_t &layout, const SliceDomain<DT> &dom)
  :LayoutBaseViewData<Dim,Dim2,SparseTileLayout<Dim2> >(layout,dom)
  {
    PoomaCTAssert<(Dim == DT::sliceDimensions)>::test();
    PoomaCTAssert<(Dim2 == DT::dimensions)>::test();
    ;
    ;
    int dt, d;
    for (d = 0, dt = 0; dt < Dim2; ++dt)
      {
 if (!dom.ignorable(dt))
   {
     this->internalGuards_m.lower(d) = this->layout_m.internalGuards().lower(dt);
     this->internalGuards_m.upper(d) = this->layout_m.internalGuards().upper(dt);
     this->externalGuards_m.lower(d) = this->layout_m.externalGuards().lower(dt);
     this->externalGuards_m.upper(d) = this->layout_m.externalGuards().upper(dt);
     ;
     ++d;
   }
      }
  }
  template <class DT>
  SparseTileLayoutViewData(const ViewLayout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,SparseTileLayout<Dim2> >(
           layout.pdata_m->layout_m,
           layout,
           layout.pdata_m->indexer_m,
           dom,
           layout.internalGuards(),
           layout.externalGuards())
  {
    ;
    ;
  }
  template <int OrigDim, class DT>
  SparseTileLayoutViewData(const SparseTileLayoutView<OrigDim, Dim2> &layout,
      const SliceDomain<DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,SparseTileLayout<Dim2> >(
        layout.pdata_m->layout_m,
        layout,
        Indexer_t(layout.pdata_m->indexer_m,dom),
        dom)
  {
    PoomaCTAssert<(DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<(DT::dimensions == OrigDim)>::test();
    ;
    ;
    int dt, d;
    for (d = 0, dt = 0; dt < OrigDim; ++dt)
      {
 if (!dom.ignorable(dt))
   {
     this->internalGuards_m.lower(d) = layout.internalGuards().lower(dt);
     this->internalGuards_m.upper(d) = layout.internalGuards().upper(dt);
     this->externalGuards_m.lower(d) = layout.externalGuards().lower(dt);
     this->externalGuards_m.upper(d) = layout.externalGuards().upper(dt);
     ;
     ++d;
   }
      }
  }
  ~SparseTileLayoutViewData()
  {
    typename List_t::iterator a;
    for (a = this->all_m.begin(); a != this->all_m.end(); ++a)
      delete (*a);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o,
       const ConstructTag &ctag) const
  {
    BaseDomain_t bd = Pooma::NoInit();
    this->indexer_m.localToBase(d, bd);
    std::vector<Node<BaseDomain_t,AllocatedDomain_t> > tnodes;
    int count = this->layout_m.touches(bd, std::back_inserter(tnodes));
    Range<Dim> ld = Pooma::NoInit();
    for (int i = 0; i < count; i++)
      {
 *o++ =
   touchesConstruct(this->indexer_m.baseToLocal(tnodes[i].domain(), ld),
      tnodes[i].allocated(),
      tnodes[i].affinity(),tnodes[i].context(),
      tnodes[i].globalID(), tnodes[i].localID(), ctag);
      }
    return count;
  }
  void computeSubdomains() const
  {
    if (this->subdomainsComputed_m)
      return;
    std::vector<Node<BaseDomain_t,AllocatedDomain_t> > tnodes;
    int count = this->layout_m.touches(this->indexer_m.baseDomain(),
           std::back_inserter(tnodes));
    Domain_t ld = Pooma::NoInit();
    for (int i = 0; i < count; i++)
      {
 Value_t *pt =
   touchesConstruct(this->indexer_m.baseToLocal(tnodes[i].domain(), ld),
      tnodes[i].allocated(),
      tnodes[i].affinity(),tnodes[i].context(),
      tnodes[i].globalID(),tnodes[i].localID(),
      TouchesConstructNodePtr());
 this->all_m.push_back(pt);
      }
    this->subdomainsComputed_m = true;
  }
};
template <int Dim, int Dim2>
class SparseTileLayoutView
: public LayoutBaseView<Dim, Dim2, SparseTileLayoutViewData<Dim,Dim2> >
{
public:
  enum { dimensions = Dim };
  typedef SparseTileLayoutViewData<Dim, Dim2> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Layout_t Layout_t;
  typedef typename LayoutData_t::AllocatedDomain_t AllocatedDomain_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef typename LayoutData_t::Indexer_t Indexer_t;
  typedef typename LayoutData_t::GuardLayers_t GuardLayers_t;
  typedef SparseTileLayoutView<Dim, Dim2> This_t;
  typedef SparseTileLayoutView<Dim, Dim2> ViewLayout_t;
  typedef LayoutBaseView<Dim,Dim2,LayoutData_t> Base_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  SparseTileLayoutView()
  : Base_t(new LayoutData_t())
  { }
  template <class DT>
  SparseTileLayoutView(const Layout_t &layout, const Domain<Dim2, DT> &dom)
  : LayoutBaseView<Dim,Dim2,SparseTileLayoutViewData<Dim,Dim2> >
    (new SparseTileLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  SparseTileLayoutView(const Layout_t &layout, const SliceDomain<DT> &dom)
  : LayoutBaseView<Dim,Dim2,SparseTileLayoutViewData<Dim,Dim2> >
    (new SparseTileLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  SparseTileLayoutView(const ViewLayout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseView<Dim,Dim2,SparseTileLayoutViewData<Dim,Dim2> >
    (new SparseTileLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <int OldViewDim, class DT>
  SparseTileLayoutView(const SparseTileLayoutView<OldViewDim, Dim2> &layout,
                        const SliceDomain<DT> &dom)
  : LayoutBaseView<Dim,Dim2,SparseTileLayoutViewData<Dim,Dim2> >
    (new SparseTileLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  inline SparseTileLayoutView(const This_t &model)
    : LayoutBaseView<Dim,Dim2,SparseTileLayoutViewData<Dim,Dim2> >
  (model.pdata_m)
  { }
  inline This_t &operator=(const This_t &model)
  {
    if (this != &model)
      {
        this->pdata_m = model.pdata_m;
      }
    return *this;
  }
  inline ~SparseTileLayoutView()
  { }
  template <class Ostream>
  void print(Ostream &ostr) const
  {
    ostr << "SparseTileLayoutView " << this->ID() << " on global domain "
      << this->domain() << ":" << '\n';
    ostr << "   Base ID:          " << this->baseID() << '\n';
    ostr << "   Base domain:      " << this->baseDomain() << '\n';
    ostr << "   Total subdomains: " << this->sizeGlobal() << '\n';
    ostr << "   Local subdomains: " << this->sizeLocal() << '\n';
    ostr << "  Remote subdomains: " << this->sizeRemote() << '\n';
    const_iterator a;
    for (a = this->beginGlobal(); a != this->endGlobal(); ++a)
      ostr << "  Global subdomain = " << *a << '\n';
    for (a = this->beginLocal(); a != this->endLocal(); ++a)
      ostr << "   Local subdomain = " << *a << '\n';
    for (a = this->beginRemote(); a != this->endRemote(); ++a)
      ostr << "  Remote subdomain = " << *a << '\n';
  }
  template <int OtherDim, int OtherDim2>
  friend class SparseTileLayoutView;
  template <int OtherDim, int OtherDim2>
  friend class SparseTileLayoutViewData;
  void computeSubdomains() const { this->pdata_m->computeSubdomains(); }
};
template <int Dim>
struct NewDomain1<SparseTileLayout<Dim> >
{
  typedef SparseTileLayout<Dim> &Type_t;
  inline static Type_t combine(const SparseTileLayout<Dim> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim, int Dim2>
struct NewDomain1<SparseTileLayoutView<Dim, Dim2> >
{
  typedef SparseTileLayoutView<Dim, Dim2> &Type_t;
  inline static Type_t combine(const SparseTileLayoutView<Dim, Dim2> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim>
std::ostream &operator<<(std::ostream &ostr,
    const SparseTileLayout<Dim> &layout)
{
  layout.print(ostr);
  return ostr;
}
template <int Dim, int Dim2>
std::ostream &operator<<(std::ostream &ostr,
    const SparseTileLayoutView<Dim, Dim2> &layout)
{
  layout.print(ostr);
  return ostr;
}
template<int Dim> struct IsValid;
template<class LayoutTag, class PatchTag> struct MultiPatch;
template<class LayoutTag, class PatchTag, int Dim2> struct MultiPatchView;
template<class Expr> struct ExpressionTag;
template<class Eng, class Tag> struct EngineFunctor;
template<class Object,class Dom,class PatchTag>
inline bool isValidLocation(const Object & e,
       Dom & domain,
       MultiPatch<SparseTileTag,PatchTag> &)
{
  typedef typename Object::Domain_t domain_t;
  typedef Node<domain_t,domain_t> node_t;
  std::vector<node_t> v;
  int count = e.engine().layout().touches(domain,std::back_inserter(v));
  return (count!=0);
}
template<class Object,class Dom,class PatchTag,int Dim2>
inline bool isValidLocation(const Object & e,
       Dom & domain,
       MultiPatchView<SparseTileTag,
                      PatchTag,
                      Dim2> &)
{
  typedef typename Object::Domain_t domain_t;
  typedef Node<domain_t,domain_t> node_t;
  std::vector<node_t> v;
  int count = e.engine().layout().touches(domain,std::back_inserter(v));
  return (count!=0);
}
template<class Object,class Dom,class expr>
inline bool isValidLocation(const Object & e,
       Dom & domain,
       ExpressionTag<expr> &)
{
  typedef typename Object::Domain_t domain_t;
  typedef Node<domain_t,domain_t> node_t;
  std::vector<node_t> v;
  typedef typename Object::Engine_t Engine_t;
  IsValid<Engine_t::dimensions> l(domain);
  EngineFunctor<Engine_t, IsValid<Engine_t::dimensions> > ef;
  return ef.apply(e.engine(),l);
}
template <int Dim> class Loc;
template <> class Loc<1>;
template <int Dim> class Interval;
template <> class Interval<1>;
template <int Dim> class Grid;
template <> class Grid<1>;
template<int Dim>
struct DomainTraits< Grid<Dim> >
  : public DomainTraitsDomain<Grid<Dim>, int, Dim>
{
  typedef DomainTraitsDomain<Grid<Dim>, int, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef Grid<1> OneDomain_t;
  typedef Grid<1> PointDomain_t;
  typedef Interval<Dim> BlockDomain_t;
  typedef Loc<Dim> AskDomain_t;
  typedef Grid<Dim> AddResult_t;
  typedef Grid<Dim> MultResult_t;
  typedef OneDomain_t Storage_t[Dim];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = Dim };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  enum { wildcard = false };
  static OneDomain_t &getDomain(Domain_t &d, int n) { return d[n]; }
  static const OneDomain_t &getDomain(const Domain_t &d,int n) { return d[n]; }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void initializeStorage(Storage_t &dom) { }
};
template<>
struct DomainTraits< Grid<1> >
  : public DomainTraitsDomain<Grid<1>, int, 1>
{
  typedef Grid<1> OneDomain_t;
  typedef Grid<1> PointDomain_t;
  typedef Interval<1> BlockDomain_t;
  typedef Loc<1> AskDomain_t;
  typedef Grid<1> AddResult_t;
  typedef Grid<1> MultResult_t;
  typedef IndirectionList<Element_t> Storage_t;
  enum { dimensions = 1,
         sliceDimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = false };
  enum { wildcard = false };
  static Element_t first(const Storage_t &d) { return d.first(); }
  static Element_t last(const Storage_t &d) { return d.last(); }
  static Element_t stride(const Storage_t &d) { return d.stride(); }
  static Element_t length(const Storage_t &d) { return d.length(); }
  static Element_t min(const Storage_t &d) { return d.min(); }
  static Element_t max(const Storage_t &d) { return d.max(); }
  static bool empty(const Storage_t &d) { return d.empty(); }
  static int loop(const Storage_t &) { return 0; }
  static Element_t elem(const Storage_t &d, int n) { return d(n); }
  static OneDomain_t &getDomain(Domain_t &d, int) { return d; }
  static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void initializeStorage(Storage_t &) { }
  template<class T>
  static void setDomain(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    dom = Storage_t(DomainTraits<T>::getFirst(newdom),
      DomainTraits<T>::getStride(newdom),
      DomainTraits<T>::getLength(newdom));
  }
  template<int Dim>
  static void setDomain(Storage_t &dom, const Grid<Dim> &newdom) {
    PoomaCTAssert<(Dim == 1)>::test();
    dom = newdom.storage();
  }
  template<class T1, class T2>
  static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T2>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T1>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T2>::singleValued)>::test();
    Element_t strideval = (endval < begval ? -1 : 1);
    dom = Storage_t(begval, strideval, (endval - begval)/strideval + 1);
  }
  template<class T1, class T2, class T3>
  static void setDomain(Storage_t &dom, const T1 &begval, const T2 &endval,
   const T3 &strideval) {
    PoomaCTAssert<(DomainTraits<T1>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T2>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T3>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<T1>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T2>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<T3>::singleValued)>::test();
    dom = Storage_t(begval, strideval, (endval - begval)/strideval + 1);
  }
  static void setDomain(Storage_t &dom, const Storage_t &newdom) {
    dom = newdom;
  }
  static void setLoop(Storage_t &, int) { }
  template<class UT, class T>
  static void setWildcardDomain(Storage_t &dom, const UT &u, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::wildcard)>::test();
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<UT>::dimensions == 1)>::test();
    dom = Storage_t(newdom.first(u), newdom.stride(u), newdom.length(u));
  }
  template<class T>
  static bool isLessThan(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    ;
    return (dom.first() < DomainTraits<T>::getFirst(newdom) ||
     (dom.first() == DomainTraits<T>::getFirst(newdom) &&
      (dom.last() < DomainTraits<T>::getLast(newdom) ||
       (dom.last() == DomainTraits<T>::getLast(newdom) &&
        dom.length() < DomainTraits<T>::getLength(newdom)))));
  }
  template<class T>
  static bool isEqualTo(const Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::dimensions == 1)>::test();
    return ((dom.empty() && DomainTraits<T>::getEmpty(newdom)) ||
     (dom.first() == DomainTraits<T>::getFirst(newdom) &&
      dom.last() == DomainTraits<T>::getLast(newdom) &&
      dom.length() == DomainTraits<T>::getLength(newdom)));
  }
  template<class T>
  static void addAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom += DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void subtractAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom -= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void multiplyAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom *= DomainTraits<T>::getFirst(newdom);
  }
  template<class T>
  static void divideAccum(Storage_t &dom, const T &newdom) {
    PoomaCTAssert<(DomainTraits<T>::singleValued && DomainTraits<T>::dimensions == 1)>::test();
    dom /= DomainTraits<T>::getFirst(newdom);
  }
};
template<int Dim1, int Dim2>
struct DomainChangeDim<Grid<Dim1>, Dim2>
{
  typedef Grid<Dim1> OldType_t;
  typedef Grid<Dim2> NewType_t;
  enum { oldDim = Dim1,
  newDim = Dim2 };
};
template<int Dim>
class Grid : public Domain<Dim, DomainTraits<Grid<Dim> > >
{
  typedef DomainTraits< Grid<Dim> > DT_t;
  typedef Domain<Dim, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Grid() { }
  Grid(const Grid<Dim> &a) {
    NewDomain1<Grid<Dim> >::fill(*this, a);
  }
  template<class T1>
  explicit Grid(const T1 &a) {
    NewDomain1<T1>::fill(*this, a);
  }
  template<class T1, class T2>
  Grid(const T1 &a, const T2 &b) {
    NewDomain2<T1,T2>::fill(*this, a, b);
  }
  template<class T1, class T2, class T3>
  Grid(const T1 &a, const T2 &b, const T3 &c) {
    NewDomain3<T1,T2,T3>::fill(*this, a, b, c);
  }
  template<class T1, class T2, class T3, class T4>
  Grid(const T1 &a, const T2 &b, const T3 &c, const T4 &d) {
    NewDomain4<T1,T2,T3,T4>::fill(*this, a, b, c, d);
  }
  template<class T1, class T2, class T3, class T4, class T5>
  Grid(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e) {
    NewDomain5<T1,T2,T3,T4,T5>::fill(*this, a, b, c, d, e);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  Grid(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
       const T6 &f) {
    NewDomain6<T1,T2,T3,T4,T5,T6>::fill(*this, a, b, c, d, e, f);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  Grid(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
       const T6 &f, const T7 &g) {
    NewDomain7<T1,T2,T3,T4,T5,T6,T7>::fill(*this, a, b, c, d, e, f, g);
  }
  ~Grid() { }
  template<class T>
  Grid<Dim> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Grid<Dim> &operator=(const Grid<Dim> &newdom) {
    return NewDomain1<Grid<Dim> >::fill(*this, newdom);
  }
  template<class Out>
  void print(Out &o) const;
protected:
private:
};
template<int Dim>
template<class Out>
void Grid<Dim>::print(Out &o) const
{
  iterator p = this->begin();
  iterator pend = this->end();
  o << "[";
  while (p != pend)
    {
      o << *p;
      ++p;
      if (p != pend)
 o << ",";
    }
  o << "]";
}
template<>
class Grid<1> : public Domain<1, DomainTraits<Grid<1> > >
{
  typedef DomainTraits< Grid<1> > DT_t;
public:
  typedef DT_t::Element_t Element_t;
  typedef DT_t::Domain_t Domain_t;
  typedef DT_t::OneDomain_t OneDomain_t;
  typedef DT_t::BlockDomain_t BlockDomain_t;
  typedef DT_t::AskDomain_t AskDomain_t;
  typedef DT_t::AddResult_t AddResult_t;
  typedef DT_t::MultResult_t MultResult_t;
  typedef DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Grid() { }
  Grid(const Grid<1> &a) {
    NewDomain1<Grid<1> >::fill(*this, a);
  }
  template<class T1>
  explicit Grid(const T1 &a) {
    NewDomain1<T1>::fill(*this, a);
  }
  Grid(char a) {
    ;
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - 1);
  }
  Grid(unsigned char a) {
    ;
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - 1);
  }
  Grid(short a) {
    ;
    short s = (a < 0 ? -1 : 1);
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - s);
  }
  Grid(unsigned short a) {
    ;
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - 1);
  }
  Grid(int a) {
    ;
    int s = (a < 0 ? -1 : 1);
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - s);
  }
  Grid(unsigned int a) {
    ;
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - 1);
  }
  Grid(long a) {
    ;
    long s = (a < 0 ? -1 : 1);
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - s);
  }
  Grid(unsigned long a) {
    ;
    DomainTraits<Grid<1> >::setDomain(domain_m, 0, a - 1);
  }
  template<class T1, class T2>
  Grid(const T1 &m, const T2 &n);
  template<class T1, class T2, class T3>
  Grid(const T1 &m, const T2 &n, const T3 &s);
  ~Grid() { }
  template<class T>
  Grid<1> &operator=(const T &newdom) {
    return NewDomain1<T>::fill(*this, newdom);
  }
  Grid<1> &operator=(const Grid<1> &newdom) {
    return NewDomain1<Grid<1> >::fill(*this, newdom);
  }
  template<class Out>
  void print(Out &o) const;
};
template <class T1, class T2>
inline
Grid<1>::Grid(const T1 &m, const T2 &n) {
  DomainTraits<Grid<1> >::setDomain(domain_m, m, n);
}
template <class T1, class T2, class T3>
inline
Grid<1>::Grid(const T1 &m, const T2 &n, const T3 &s) {
  DomainTraits<Grid<1> >::setDomain(domain_m, m, n, s);
}
template<class Out>
void Grid<1>::print(Out &o) const
{
  iterator p = begin();
  iterator pend = end();
  o << "[";
  while (p != pend)
    {
      o << *p;
      ++p;
      if (p != pend)
 o << ",";
    }
  o << "]";
}
template<int Dim>
std::ostream& operator<<(std::ostream &o, const Grid<Dim> &grid)
{
  grid.print(o);
  return o;
}
template <int Dim, class T> class Region;
template <class T> class Region<1,T>;
template<int Dim, class T>
struct DomainTraits< Region<Dim,T> >
  : public DomainTraitsDomain<Region<Dim,T>, T, Dim>
{
  typedef DomainTraitsDomain<Region<Dim,T>, T, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef Region<1,T> OneDomain_t;
  typedef Region<1,T> PointDomain_t;
  typedef Region<Dim,T> BlockDomain_t;
  typedef Region<Dim,T> AskDomain_t;
  typedef Region<Dim,T> AddResult_t;
  typedef Region<Dim,T> MultResult_t;
  typedef WrapNoInit<OneDomain_t> Storage_t[Dim];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = Dim };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = true };
  enum { wildcard = false };
  static OneDomain_t &getDomain(Domain_t &d, int n) { return d[n]; }
  static const OneDomain_t &getDomain(const Domain_t &d,int n) { return d[n]; }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void initializeStorage(Storage_t &dom) {
    Dom1Initialize<Dim-1>::template apply<DomainTraits<Region<Dim, T> > >(dom);
  }
};
template<class T>
struct DomainTraits< Region<1,T> >
  : public DomainTraitsDomain<Region<1,T>, T, 1>
{
  typedef DomainTraitsDomain<Region<1,T>, T, 1> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef Region<1,T> OneDomain_t;
  typedef Region<1,T> BlockDomain_t;
  typedef Region<1,T> AskDomain_t;
  typedef Region<1,T> AddResult_t;
  typedef Region<1,T> MultResult_t;
  typedef Element_t Storage_t[2];
  typedef Element_t IteratorStorage_t[2];
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = 1 };
  enum { loopAware = false };
  enum { singleValued = false };
  enum { unitStride = true };
  enum { wildcard = false };
  static Element_t first(const Storage_t &d) { return d[0]; }
  static Element_t last(const Storage_t &d) { return d[0] + d[1]; }
  static Element_t stride(const Storage_t &d) { return d[1]; }
  static Element_t length(const Storage_t &d) { return d[1]; }
  static Element_t min(const Storage_t &d) {
    return (length(d) >= 0 ? first(d) : last(d));
  }
  static Element_t max(const Storage_t &d) {
    return (length(d) >= 0 ? last(d) : first(d));
  }
  static bool empty(const Storage_t &d) { return false; }
  static int loop(const Storage_t &) { return 0; }
  static Element_t elem(const Storage_t &d, int n) { return d[0] + n*d[1]; }
  static OneDomain_t &getDomain(Domain_t &d, int) { return d; }
  static const OneDomain_t &getDomain(const Domain_t &d, int) { return d; }
  static void initializeStorage(Storage_t &dom) {
    dom[0] = 0;
    dom[1] = 0;
  }
  template<class DT>
  static void setDomain(Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    dom[0] = DomainTraits<DT>::getFirst(newdom);
    dom[1] = DomainTraits<DT>::getLast(newdom) - dom[0];
  }
  static void setDomain(Storage_t &dom, Element_t begval, Element_t endval) {
    dom[0] = begval;
    dom[1] = (endval - begval);
  }
  static void setLoop(Storage_t &, int) { }
  template<class UT, class DT>
  static void setWildcardDomain(Storage_t &dom, const UT &u, const DT &newdom)
  {
    PoomaCTAssert<(DomainTraits<DT>::wildcard)>::test();
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    PoomaCTAssert<(DomainTraits<UT>::dimensions == 1)>::test();
    dom[0] = newdom.first(u);
    dom[1] = newdom.last(u) - dom[0];
  }
  template<class DT>
  static bool isLessThan(const Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    return (dom[1] < DomainTraits<DT>::getLength(newdom) ||
     (dom[1] == DomainTraits<DT>::getLength(newdom) &&
      dom[0] < DomainTraits<DT>::getFirst(newdom)));
  }
  template<class DT>
  static bool isEqualTo(const Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    return (dom[0] == DomainTraits<DT>::getFirst(newdom) &&
     dom[1] == DomainTraits<DT>::getLength(newdom));
  }
  template<class DT>
  static void addAccum(Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    dom[0] += DomainTraits<DT>::getFirst(newdom);
  }
  template<class DT>
  static void subtractAccum(Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::singleValued)>::test();
    PoomaCTAssert<(DomainTraits<DT>::dimensions == 1)>::test();
    dom[0] -= DomainTraits<DT>::getFirst(newdom);
  }
  template<class DT>
  static void multiplyAccum(Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::singleValued && DomainTraits<DT>::dimensions == 1)>::test();
    dom[0] *= DomainTraits<DT>::getFirst(newdom);
    dom[1] *= DomainTraits<DT>::getFirst(newdom);
  }
  template<class DT>
  static void divideAccum(Storage_t &dom, const DT &newdom) {
    PoomaCTAssert<(DomainTraits<DT>::singleValued && DomainTraits<DT>::dimensions == 1)>::test();
    dom[0] /= DomainTraits<DT>::getFirst(newdom);
    dom[1] /= DomainTraits<DT>::getFirst(newdom);
  }
  static void initializeIterator(const Storage_t &d, IteratorStorage_t &i) {
    i[0] = d[0];
    i[1] = d[1];
  }
  static void initializeIterator(const Storage_t &d1, const Storage_t &d2,
     IteratorStorage_t &i) {
    i[0] = d1[0] + d2[1] + d2[1];
    i[1] = d2[1];
  }
  static void copyIterator(IteratorStorage_t d, IteratorStorage_t &i) {
    i[0] = d[0];
    i[1] = d[1];
  }
  static Element_t currentIterator(IteratorStorage_t i) { return i[0]; }
  static bool compareIterator(IteratorStorage_t a, IteratorStorage_t b) {
    return (a[0] == b[0] && a[1] == b[1]);
  }
  static void incrementIterator(IteratorStorage_t &i) { i[0] += i[1]; }
  static void decrementIterator(IteratorStorage_t &i) { i[0] -= i[1]; }
};
template<int Dim1, int Dim2, class T>
struct DomainChangeDim<Region<Dim1,T>, Dim2>
{
  typedef Region<Dim1,T> OldType_t;
  typedef Region<Dim2,T> NewType_t;
  enum { oldDim = Dim1,
  newDim = Dim2 };
};
template<int Dim, class T = double>
class Region : public Domain<Dim, DomainTraits<Region<Dim,T> > >
{
  typedef DomainTraits< Region<Dim,T> > DT_t;
  typedef Domain<Dim, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Region() { }
  Region(const Pooma::NoInit &e)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(e) {
  }
  Region(const Region<Dim,T> &a)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain1<Region<Dim,T> >::fill(*this, a);
  }
  template<class T1>
  explicit Region(const T1 &a)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  template<class T1, class T2>
  Region(const T1 &a, const T2 &b)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain2<T1,T2>::fill(*this, a, b);
  }
  template<class T1, class T2, class T3>
  Region(const T1 &a, const T2 &b, const T3 &c)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain3<T1,T2,T3>::fill(*this, a, b, c);
  }
  template<class T1, class T2, class T3, class T4>
  Region(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain4<T1,T2,T3,T4>::fill(*this, a, b, c, d);
  }
  template<class T1, class T2, class T3, class T4, class T5>
  Region(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain5<T1,T2,T3,T4,T5>::fill(*this, a, b, c, d, e);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  Region(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
 const T6 &f)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain6<T1,T2,T3,T4,T5,T6>::fill(*this, a, b, c, d, e, f);
  }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  Region(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
 const T6 &f, const T7 &g)
    : Domain<Dim, DomainTraits<Region<Dim,T> > >(Pooma::NoInit()) {
    NewDomain7<T1,T2,T3,T4,T5,T6,T7>::fill(*this, a, b, c, d, e, f, g);
  }
  ~Region() { }
  template<class T1>
  Region<Dim,T> &operator=(const T1 &newdom) {
    return NewDomain1<T1>::fill(*this, newdom);
  }
  Region<Dim,T> &operator=(const Region<Dim,T> &newdom) {
    return NewDomain1<Region<Dim,T> >::fill(*this, newdom);
  }
protected:
private:
};
template<class T>
class Region<1,T> : public Domain<1, DomainTraits<Region<1,T> > >
{
  typedef DomainTraits< Region<1,T> > DT_t;
  typedef Domain<1, DT_t> Base_t;
public:
  typedef typename Base_t::iterator iterator;
  typedef typename Base_t::const_iterator const_iterator;
  typedef typename Base_t::blockIterator blockIterator;
  typedef typename Base_t::const_blockIterator const_blockIterator;
  typedef typename DT_t::Element_t Element_t;
  typedef typename DT_t::Domain_t Domain_t;
  typedef typename DT_t::OneDomain_t OneDomain_t;
  typedef typename DT_t::BlockDomain_t BlockDomain_t;
  typedef typename DT_t::AskDomain_t AskDomain_t;
  typedef typename DT_t::AddResult_t AddResult_t;
  typedef typename DT_t::MultResult_t MultResult_t;
  typedef typename DT_t::Storage_t Storage_t;
  enum { domain = DT_t::domain };
  enum { dimensions = DT_t::dimensions,
  sliceDimensions = DT_t::sliceDimensions };
  enum { loopAware = DT_t::loopAware };
  enum { singleValued = DT_t::singleValued };
  enum { unitStride = DT_t::unitStride };
  enum { wildcard = DT_t::wildcard };
  Region() { }
  Region(const Pooma::NoInit &e)
    : Domain<1, DomainTraits<Region<1,T> > >(e) {
  }
  Region(const Region<1,T> &a)
    : Domain<1, DomainTraits<Region<1,T> > >(Pooma::NoInit()) {
    NewDomain1<Region<1,T> >::fill(*this, a);
  }
  template<class T1>
  explicit Region(const T1 &a)
    : Domain<1, DomainTraits<Region<1,T> > >(Pooma::NoInit()) {
    NewDomain1<T1>::fill(*this, a);
  }
  Region(Element_t n)
    : Domain<1, DomainTraits<Region<1,T> > >(Pooma::NoInit()) {
    DomainTraits<Region<1,T> >::setDomain(this->domain_m, 0, n);
  }
  Region(Element_t m, Element_t n)
    : Domain<1, DomainTraits<Region<1,T> > >(Pooma::NoInit()) {
    DomainTraits<Region<1,T> >::setDomain(this->domain_m, m, n);
  }
  Region(Element_t m, Element_t n, Element_t)
    : Domain<1, DomainTraits<Region<1,T> > >(Pooma::NoInit()) {
    DomainTraits<Region<1,T> >::setDomain(this->domain_m, m, n);
  }
  template<class T1>
  Region<1,T> &operator=(const T1 &newdom) {
    return NewDomain1<T1>::fill(*this, newdom);
  }
  Region<1,T> &operator=(const Region<1,T> &newdom) {
    return NewDomain1<Region<1,T> >::fill(*this, newdom);
  }
  const OneDomain_t &operator[](int d) const { return *this; }
  OneDomain_t &operator[](int d) { return *this; }
};
template <int Dim, int C>
struct DomainDelta;
struct DomainDeltaStorage {};
template <int Dim, int C>
struct DomainTraits< DomainDelta<Dim, C> >
  : public DomainTraitsDomain<DomainDelta<Dim, C>, int, Dim>
{
  typedef DomainTraitsDomain<DomainDelta<Dim, C>, int, Dim> Base_t;
  typedef typename Base_t::Element_t Element_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef typename Base_t::NewDomain1_t NewDomain1_t;
  typedef DomainDelta<1, C> OneDomain_t;
  typedef DomainDelta<1, C> PointDomain_t;
  typedef DomainDelta<Dim, C> BlockDomain_t;
  typedef DomainDelta<Dim, C> AskDomain_t;
  typedef Loc<Dim> AddResult_t;
  typedef Loc<Dim> MultResult_t;
  typedef DomainDeltaStorage Storage_t;
  enum { domain = Base_t::domain };
  enum { dimensions = Base_t::dimensions,
  sliceDimensions = 0 };
  enum { loopAware = false };
  enum { singleValued = true };
  enum { unitStride = true };
  enum { wildcard = false };
  inline static void initializeStorage(Storage_t &dom) { }
  inline static OneDomain_t getDomain(const Domain_t &d, int) { return OneDomain_t(); }
  inline static PointDomain_t getPointDomain(const Domain_t &d, int) { return PointDomain_t(); }
};
template <int Dim, int C>
class DomainDelta : public Domain<Dim, DomainTraits<DomainDelta<Dim, C> > > {
 public:
  enum { component = C };
  inline DomainDelta()
    : Domain<Dim, DomainTraits<DomainDelta<Dim, C> > >(Pooma::NoInit()) {}
  inline DomainDelta(const DomainDelta<Dim, C>&)
    : Domain<Dim, DomainTraits<DomainDelta<Dim, C> > >(Pooma::NoInit()) {}
  inline DomainDelta(const Pooma::NoInit &a)
    : Domain<Dim, DomainTraits<DomainDelta<Dim, C> > >(a) {}
  inline ~DomainDelta() {}
  inline DomainDelta<Dim, C> &operator=(const DomainDelta<Dim, C>&) { return *this; }
};
template<class T, int Dim, int C>
inline typename T::AddResult_t
operator+(const DomainBase<T> &d1, const DomainDelta<Dim, C> &d2) {
  typename T::AddResult_t retval(d1.unwrap());
  return (retval += d2);
}
template<class T, int Dim, int C>
inline typename T::AddResult_t
operator-(const DomainBase<T> &d1, const DomainDelta<Dim, C> &d2) {
  typename T::AddResult_t retval(d1.unwrap());
  return (retval -= d2);
}
template<int Dim>
class AllDomain
{
public:
  typedef AllDomain<Dim> Domain_t;
  typedef AllDomain<Dim> NewDomain1_t;
  typedef AllDomain<1> OneDomain_t;
  typedef int Element_t;
  enum { dimensions = Dim };
  AllDomain() {
    PoomaCTAssert<(Dim > 0)>::test();
  }
  AllDomain(const AllDomain<Dim> &) {
    PoomaCTAssert<(Dim > 0)>::test();
  }
  ~AllDomain() { }
  OneDomain_t operator[](int) const { return OneDomain_t(); }
  void setDomain(const AllDomain<Dim> &) { }
  template<class T>
  typename DomainTraits<T>::Element_t first(const T &u) const {
    return u.first();
  }
  int first(int u) const { return u; }
  template<class T>
  typename DomainTraits<T>::Element_t length(const T &u) const {
    return u.length();
  }
  int length(int) const { return 1; }
  template<class T>
  typename DomainTraits<T>::Element_t stride(const T &u) const {
    return u.stride();
  }
  int stride(int) const { return 1; }
  AllDomain<Dim> &operator=(const AllDomain<Dim> &) { return *this; }
protected:
private:
};
template<int Dim>
struct DomainTraits< AllDomain<Dim> >
{
  typedef AllDomain<Dim> Domain_t;
  typedef AllDomain<Dim> NewDomain1_t;
  typedef AllDomain<1> OneDomain_t;
  typedef AllDomain<1> PointDomain_t;
  typedef AllDomain<Dim> AskDomain_t;
  enum { domain = true };
  enum { dimensions = Dim,
  sliceDimensions = Dim };
  enum { wildcard = true };
  enum { singleValued = false };
  static OneDomain_t getDomain(const Domain_t &, int) {
    return OneDomain_t();
  }
  static PointDomain_t getPointDomain(const Domain_t &, int) {
    return PointDomain_t();
  }
};
template<int Dim>
class LeftDomain
{
public:
  typedef LeftDomain<Dim> Domain_t;
  typedef LeftDomain<1> OneDomain_t;
  typedef int Element_t;
  enum { dimensions = Dim };
  LeftDomain() : endpoints_m(Pooma::NoInit()) { PoomaCTAssert<(Dim > 0)>::test(); }
  LeftDomain(const LeftDomain<Dim> &d) : endpoints_m(d.endpoints_m) {
    PoomaCTAssert<(Dim > 0)>::test();
  }
  template<class T1>
  explicit LeftDomain(const T1 &a)
    : endpoints_m(a) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2>
  LeftDomain(const T1 &a, const T2 &b)
    : endpoints_m(a,b) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3>
  LeftDomain(const T1 &a, const T2 &b, const T3 &c)
    : endpoints_m(a,b,c) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4>
  LeftDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : endpoints_m(a,b,c,d) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5>
  LeftDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : endpoints_m(a,b,c,d,e) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  LeftDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f)
    : endpoints_m(a,b,c,d,e,f) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  LeftDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f, const T7 &g)
    : endpoints_m(a,b,c,d,e,f,g) { PoomaCTAssert<(Dim > 0)>::test(); }
  ~LeftDomain() { }
  OneDomain_t operator[](int n) const { return OneDomain_t(endpoints_m[n]); }
  void setDomain(const LeftDomain<Dim> &d) { endpoints_m = d.endpoints_m; }
  template<class T>
  typename DomainTraits<T>::Element_t first(const T &u) const {
    return u.first();
  }
  int first(int u) const { return u; }
  template<class T>
  typename DomainTraits<T>::Element_t length(const T &u) const {
    PoomaCTAssert<(Dim == 1)>::test();
    T dom(u.first(), endpoints_m[0].first(), u.stride());
    return dom.length();
  }
  int length(int u) const {
    PoomaCTAssert<(Dim == 1)>::test();
    Interval<1> dom(u, endpoints_m[0].first());
    return dom.length();
  }
  template<class T>
  typename DomainTraits<T>::Element_t stride(const T &u) const {
    return u.stride();
  }
  int stride(int) const { return 1; }
  LeftDomain<Dim> &operator=(const LeftDomain<Dim> &d) {
    endpoints_m = d.endpoints_m;
    return *this;
  }
protected:
private:
  Loc<Dim> endpoints_m;
};
template<int Dim>
struct DomainTraits< LeftDomain<Dim> >
{
  typedef LeftDomain<Dim> Domain_t;
  typedef LeftDomain<1> OneDomain_t;
  typedef LeftDomain<1> PointDomain_t;
  typedef LeftDomain<Dim> AskDomain_t;
  enum { domain = true };
  enum { dimensions = Dim,
  sliceDimensions = Dim };
  enum { wildcard = true };
  enum { singleValued = false };
  static OneDomain_t getDomain(const Domain_t &d, int n) {
    return d[n];
  }
  static PointDomain_t getPointDomain(const Domain_t &d, int n) {
    return d[n];
  }
};
template<int Dim>
class RightDomain
{
public:
  typedef RightDomain<Dim> Domain_t;
  typedef RightDomain<1> OneDomain_t;
  typedef int Element_t;
  enum { dimensions = Dim };
  RightDomain() : endpoints_m(Pooma::NoInit()) { PoomaCTAssert<(Dim > 0)>::test(); }
  RightDomain(const RightDomain<Dim> &d) : endpoints_m(d.endpoints_m) {
    PoomaCTAssert<(Dim > 0)>::test();
  }
  template<class T1>
  explicit RightDomain(const T1 &a)
    : endpoints_m(a) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2>
  RightDomain(const T1 &a, const T2 &b)
    : endpoints_m(a,b) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3>
  RightDomain(const T1 &a, const T2 &b, const T3 &c)
    : endpoints_m(a,b,c) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4>
  RightDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d)
    : endpoints_m(a,b,c,d) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5>
  RightDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e)
    : endpoints_m(a,b,c,d,e) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6>
  RightDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f)
    : endpoints_m(a,b,c,d,e,f) { PoomaCTAssert<(Dim > 0)>::test(); }
  template<class T1, class T2, class T3, class T4, class T5,
           class T6, class T7>
  RightDomain(const T1 &a, const T2 &b, const T3 &c, const T4 &d, const T5 &e,
      const T6 &f, const T7 &g)
    : endpoints_m(a,b,c,d,e,f,g) { PoomaCTAssert<(Dim > 0)>::test(); }
  ~RightDomain() { }
  OneDomain_t operator[](int n) const { return OneDomain_t(endpoints_m[n]); }
  void setDomain(const RightDomain<Dim> &d) { endpoints_m = d.endpoints_m; }
  template<class T>
  typename DomainTraits<T>::Element_t first(const T &u) const {
    return endpoints_m[0].first();
  }
  int first(int u) const { return u; }
  template<class T>
  typename DomainTraits<T>::Element_t length(const T &u) const {
    PoomaCTAssert<(Dim == 1)>::test();
    T dom(endpoints_m[0].first(), u.last(), u.stride());
    return dom.length();
  }
  int length(int u) const {
    PoomaCTAssert<(Dim == 1)>::test();
    Interval<1> dom(endpoints_m[0].first(), u);
    return dom.length();
  }
  template<class T>
  typename DomainTraits<T>::Element_t stride(const T &u) const {
    return u.stride();
  }
  int stride(int) const { return 1; }
  RightDomain<Dim> &operator=(const RightDomain<Dim> &d) {
    endpoints_m = d.endpoints_m;
    return *this;
  }
protected:
private:
  Loc<Dim> endpoints_m;
};
template<int Dim>
struct DomainTraits< RightDomain<Dim> >
{
  typedef RightDomain<Dim> Domain_t;
  typedef RightDomain<1> OneDomain_t;
  typedef RightDomain<1> PointDomain_t;
  typedef RightDomain<Dim> AskDomain_t;
  enum { domain = true };
  enum { dimensions = Dim,
  sliceDimensions = Dim };
  enum { wildcard = true };
  enum { singleValued = false };
  static OneDomain_t getDomain(const Domain_t &d, int n) {
    return d[n];
  }
  static PointDomain_t getPointDomain(const Domain_t &d, int n) {
    return d[n];
  }
};
template<class T1, class T2, class T3, int Dim, bool strided>
struct EquivSubsetDomainSingle {
  static void equiv(const T1 &a, const T2 &b, T3 &d) {
    d[Dim-1] += (b.first() - a.first());
  }
};
template<class T1, class T2, class T3, int Dim>
struct EquivSubsetDomainSingle<T1,T2,T3,Dim,true> {
  static void equiv(const T1 &a, const T2 &b, T3 &d) {
    typedef typename DomainTraits<T3>::Element_t E3_t;
    E3_t m = b.stride() / a.stride();
    ;
    E3_t k = b.first() - m * a.first();
    d[Dim-1] *= m;
    d[Dim-1] += k;
  }
};
template<class T1, class T2, class T3, int Dim>
struct EquivSubsetDomain {
  enum { strided = !DomainTraits<T3>::unitStride };
  static void equiv(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    EquivSubsetDomainSingle<Dom1_t,Dom2_t,T3,Dim,strided>::equiv(
      DomainTraits<T1>::getDomain(a,Dim-1),
      DomainTraits<T2>::getDomain(b,Dim-1), c);
    EquivSubsetDomain<T1,T2,T3,Dim-1>::equiv(a,b,c);
  }
};
template<class T1, class T2, class T3>
struct EquivSubsetDomain<T1,T2,T3,1> {
  enum { strided = !DomainTraits<T3>::unitStride };
  static void equiv(const T1 &a, const T2 &b, T3 &c) {
    typedef typename DomainTraits<T1>::OneDomain_t Dom1_t;
    typedef typename DomainTraits<T2>::OneDomain_t Dom2_t;
    EquivSubsetDomainSingle<Dom1_t,Dom2_t,T3,1,strided>::equiv(
      DomainTraits<T1>::getDomain(a,0), DomainTraits<T2>::getDomain(b,0), c);
  }
};
template<class T1, class T2, class T3>
struct EquivSubsetReturnType {
  typedef typename NewDomain3<T1,T2,T3>::Type_t Combine_t;
  typedef typename
    DomainChangeDim<Combine_t,DomainTraits<T1>::dimensions>::NewType_t Type_t;
};
template<class T1, class T2, class T3>
inline typename EquivSubsetReturnType<T1,T2,T3>::Type_t
equivSubset(const T1 &a, const T2 &b, const T3 &c)
{
  typedef typename EquivSubsetReturnType<T1,T2,T3>::Type_t T4;
  PoomaCTAssert<((int)DomainTraits<T1>::dimensions == DomainTraits<T2>::dimensions)>::test();
  PoomaCTAssert<((int)DomainTraits<T1>::dimensions == DomainTraits<T3>::dimensions)>::test();
  T4 d = c;
  EquivSubsetDomain<T1,T2,T4,DomainTraits<T1>::dimensions>::equiv(a, b, d);
  return d;
}
namespace Pooma {
class Tester
{
public:
  Tester();
  Tester(int argc, char **argv);
  ~Tester();
  inline Inform &out()
    {
      return inform_m;
    }
  inline bool ok() const
    {
      return ok_m;
    }
  inline int returnValue() const
    {
      return (ok() ? 0 : 1);
    }
  inline bool check(bool val)
    {
      ok_m = (ok_m && val);
      if (!ok_m && abort_m)
        {
          if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Check failed!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Utilities/Tester.h", 163);
        }
      return val;
    }
  inline bool check(const char *str, bool val)
    {
      check(val);
      if (str != 0)
 out() << "Checking " << str;
      else
 out() << "Checking";
      out() << ": check = " << val << ", updated status = " << ok_m;
      out() << std::endl;
      return val;
    }
  template<class T>
  bool check(const char *str, const T &val, const T &correct)
    {
      bool res = check(val == correct);
      if (str != 0)
 out() << "Checking " << str;
      else
 out() << "Checking";
      out() << ": val = " << val << ", correct = " << correct
            << ", updated status = " << ok_m;
      out() << std::endl;
      return res;
    }
  template<class T>
  bool check(const char *str, const T &val, const T &correct,
    const T &tol)
    {
      bool res = check(std::abs(val - correct) < tol);
      if (str != 0)
 out() << "Checking " << str;
      else
 out() << "Checking";
      out() << ": val = " << val << ", correct = " << correct
            << ", updated status = " << ok_m;
      out() << std::endl;
      return res;
    }
  inline void set(bool val)
    {
      ok_m = val;
    }
  inline void setQuiet(bool quiet) {
    quiet_m = quiet;
    if (!verbose_m || quiet_m) {
      out().setOutputLevel(Inform::off);
    } else {
      out().setOutputLevel(Inform::on);
    }
  }
  inline void setVerbose(bool verbose) {
    verbose_m = verbose;
    if (!verbose_m || quiet_m) {
      out().setOutputLevel(Inform::off);
    } else {
      out().setOutputLevel(Inform::on);
    }
  }
  inline bool verbose() { return verbose_m; }
  inline void setPrefix(char *prefix) { out().setPrefix(prefix); }
  int results(const char *msg = 0) const;
  void exceptionHandler(const char *msg = 0);
  void exceptionHandler(const Assertion &asrt);
private:
  bool ok_m;
  bool quiet_m;
  Inform inform_m;
  bool verbose_m;
  bool abort_m;
  void parse(int argc, char **argv);
};
}
template <int Dim>
std::vector<Interval<Dim> >
DomainRemoveOverlap(const Interval<Dim> & s,const Interval<Dim> &r)
{
  typedef Interval<Dim> Domain_t;
  typedef std::vector<Domain_t> DomainList_t;
  DomainList_t result,temp;
  result.push_back(s);
  for (int i=0;i<Dim;++i)
    {
      typename DomainList_t::iterator start = result.begin();
      typename DomainList_t::iterator end = result.end();
      for ( ; start!=end; ++start)
 {
   if (touches( (*start)[i], Loc<1>(r[i].min())))
     {
       Domain_t lower=*start,upper=*start;
       if(r[i].min()-1>=lower[i].min())
  {
    lower[i] = Interval<1>(lower[i].min(),r[i].min()-1);
    temp.push_back(lower);
  } upper[i] = Interval<1>(r[i].min(),upper[i].max());
       temp.push_back(upper);
     }
   else
     temp.push_back(*start);
 }
      result = temp;
      temp.clear();
      start = result.begin();
      end = result.end();
      for ( ; start!=end; ++start)
 {
   if (touches( (*start)[i], Loc<1>(r[i].max())))
     {
       Domain_t lower=*start,upper=*start;
       lower[i] = Interval<1>(lower[i].min(),r[i].max());
       temp.push_back(lower);
       if( r[i].max()+1 <= upper[i].max())
  {
    upper[i] = Interval<1>(r[i].max()+1,upper[i].max());
    temp.push_back(upper);
  }
     }
   else
     temp.push_back(*start);
 }
      result=temp;
      temp.clear();
    }
  typename DomainList_t::iterator start = result.begin();
  typename DomainList_t::iterator end = result.end();
  for ( ; start!=end ; ++start)
    {
      if (!touches(*start,r ) )
 temp.push_back(*start);
    }
  return temp;
}
template <int Dim>
Grid<Dim> makeRGrid(const Interval<Dim> & gdom, const Loc<Dim> & blocks);
template<int Dim>
class UniformGridPartition;
template<int Dim>
class GridPartition
{
public:
  typedef LocalMapper<Dim> DefaultMapper_t;
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  enum { uniform = false };
  enum { gridded = true };
  enum { tile = false };
  enum { general = false };
  enum { dimensions = Dim };
  GridPartition(const Grid<Dim> &g)
    : hasInternalGuards_m(false),
      hasExternalGuards_m(false),
      internalGuards_m(0),
      externalGuards_m(0),
      grid_m(g)
  {
    num_m=1;
    for (int i=0;i<Dim;i++)
      {
 blocks_m[i] = Loc<1>(grid_m[i].size()-1);
 num_m*=blocks_m[i].first();
      }
  }
  GridPartition(const Grid<Dim> &g,
  const GuardLayers<Dim> &gcs)
    : hasInternalGuards_m(true),
      hasExternalGuards_m(true),
      internalGuards_m(gcs),
      externalGuards_m(gcs),
      grid_m(g)
  {
    num_m=1;
    for (int i=0;i<Dim;i++)
      {
 blocks_m[i] = Loc<1>(grid_m[i].size()-1);
 num_m*=blocks_m[i].first();
      }
  }
  GridPartition(const Grid<Dim> &g,
  const GuardLayers<Dim> &igcs,
  const GuardLayers<Dim> &egcs)
    : hasInternalGuards_m(true),
      hasExternalGuards_m(true),
      internalGuards_m(igcs),
      externalGuards_m(egcs),
      grid_m(g)
  {
    num_m=1;
    for (int i=0;i<Dim;i++)
      {
 blocks_m[i] = Loc<1>(grid_m[i].size()-1);
 num_m*=(grid_m[i].size()-1);
      }
  }
  GridPartition()
    : hasInternalGuards_m(false),
      hasExternalGuards_m(false),
      internalGuards_m(0),
      externalGuards_m(0),
      num_m(1)
  {
    for (int i=0;i<Dim;++i)
      blocks_m[i]=Loc<1>(1);
  }
  GridPartition(const Loc<Dim> &a)
    : blocks_m(a),
      hasInternalGuards_m(false),
      hasExternalGuards_m(false),
      internalGuards_m(0),
      externalGuards_m(0)
  {
    num_m = blocks_m[0].first();
    for (int d=1; d < Dim; ++d)
      num_m *= blocks_m[d].first();
  }
  GridPartition(const Loc<Dim> &a,
  const GuardLayers<Dim> &gcs)
    : blocks_m(a),
      hasInternalGuards_m(true),
      hasExternalGuards_m(true),
      internalGuards_m(gcs),
      externalGuards_m(gcs)
  {
    num_m = blocks_m[0].first();
    for (int d=1; d < Dim; ++d)
      num_m *= blocks_m[d].first();
  }
  GridPartition(const Loc<Dim> &a,
  const GuardLayers<Dim> &igcs,
  const GuardLayers<Dim> &egcs)
    : blocks_m(a),
      hasInternalGuards_m(true),
      hasExternalGuards_m(true),
      internalGuards_m(igcs),
      externalGuards_m(egcs)
  {
    num_m = blocks_m[0].first();
    for (int d=1; d < Dim; ++d)
      num_m *= blocks_m[d].first();
  }
  GridPartition(const GridPartition<Dim> & b)
    : blocks_m(b.blocks_m),
      hasInternalGuards_m(b.hasInternalGuards_m),
      hasExternalGuards_m(b.hasExternalGuards_m),
      internalGuards_m(b.internalGuards_m),
      externalGuards_m(b.externalGuards_m),
      num_m(b.num_m),
      grid_m(b.grid_m)
  {
  }
 GridPartition(const UniformGridPartition<Dim> & b)
   : blocks_m(b.blocks_m),
     hasInternalGuards_m(b.hasInternalGuards_m),
     hasExternalGuards_m(b.hasExternalGuards_m),
     internalGuards_m(b.internalGuards_m),
     externalGuards_m(b.externalGuards_m),
     num_m(b.num_m)
  {}
  ~GridPartition() { }
  GridPartition<Dim> &operator=(const GridPartition<Dim> &g)
  {
    if (this != &g)
      {
 hasInternalGuards_m = g.hasInternalGuards_m;
 hasExternalGuards_m = g.hasExternalGuards_m;
 internalGuards_m = g.internalGuards_m;
 externalGuards_m = g.externalGuards_m;
 blocks_m = g.blocks();
 num_m = g.maxSize();
 grid_m = g.grid();
 if (!hasInternalGuards_m)
   internalGuards_m = GuardLayers<Dim>(0);
 if (!hasExternalGuards_m)
   externalGuards_m = GuardLayers<Dim>(0);
      }
    return *this;
  }
  int maxSize() const { return num_m; }
  const Loc<Dim> &blocks() const { return blocks_m; }
  bool hasGuards() const { return hasInternalGuards_m||hasExternalGuards_m; }
  bool hasCustomEdgeGuards() const
  {
    if (hasInternalGuards_m&&!hasExternalGuards_m) return true;
    if (!hasInternalGuards_m&&hasExternalGuards_m) return true;
    if (hasInternalGuards_m&&hasExternalGuards_m
       &&(internalGuards_m!=externalGuards_m)) return true;
    return false;
  }
  bool hasInternalGuards() const { return hasInternalGuards_m; }
  bool hasExternalGuards() const { return hasExternalGuards_m;}
  const Grid<Dim> &grid() const { return grid_m;}
  const GuardLayers<Dim> &internalGuards() const
  {
    return internalGuards_m;
  }
  const GuardLayers<Dim> &externalGuards() const
  {
    return externalGuards_m;
  }
  template<class D>
  int partition(const D &domain,
  List_t & all,
  const ContextMapper<Dim> &cmapper ) const;
  template<class D>
  int partition(const D &domain,
  List_t & all) const
  {
    return partition(domain,all,DefaultMapper_t(*this));
  }
  template<class Out>
  void print(Out &o) const;
private:
  Loc<Dim> blocks_m;
  bool hasInternalGuards_m;
  bool hasExternalGuards_m;
  GuardLayers<Dim> internalGuards_m;
  GuardLayers<Dim> externalGuards_m;
  int num_m;
  Grid<Dim> grid_m;
};
template<int Dim>
template<class D>
int GridPartition<Dim>::partition(const D &domain,
      List_t & all,
      const ContextMapper<Dim> &cmapper ) const
{
  typedef typename DomainTraits<Domain_t>::Element_t Element_t;
  PoomaCTAssert<(Dim == DomainTraits<D>::dimensions)>::test();
  PoomaCTAssert<(Dim == DomainTraits<Domain_t>::dimensions)>::test();
  Grid<Dim> tgrid = grid();
  if (domain.empty())
    {
      int np = 1;
      for (int i=0;i<Dim;++i)
 np*=blocks()[i].first();
      int start=0;
      Domain_t o;
      Domain_t a;
      while (start<np)
 {
   int gid = all.size();
   int lid = -1;
   Value_t *node = new Value_t(o, a, -1, gid, lid);
   all.push_back(node);
   ++start;
 }
      cmapper.map(all);
      return maxSize();
    }
  if (tgrid.empty()&&!domain.empty() )
    {
      tgrid = makeRGrid(domain,blocks_m);
    }
  typename Grid<Dim>::blockIterator start = tgrid.beginBlock();
  typename Grid<Dim>::blockIterator end = tgrid.endBlock();
  while (start!=end)
    {
      Loc<Dim> idx = start.point();
      Domain_t o = Pooma::NoInit();
      o = * start;
      Domain_t a = Pooma::NoInit();
      a = * start;
      if (hasInternalGuards()||hasExternalGuards())
 {
   for (int i=0;i<Dim;i++)
     {
       if (idx[i]==0)
  {
    if (hasExternalGuards())
      {
        o[i]=Interval<1>(o[i].first()-externalGuards().lower(i),
           o[i].last());
        a[i]=Interval<1>(a[i].first()-externalGuards().lower(i),
           a[i].last());
      }
    if (hasInternalGuards() && idx[i]!=(blocks()[i].first()-1))
      a[i]=Interval<1>(a[i].first(),
         a[i].last()+internalGuards().upper(i));
  }
       if (idx[i]==blocks()[i].first()-1)
  {
    if (hasExternalGuards())
      {
        o[i]=Interval<1>(o[i].first(),
           o[i].last()+externalGuards().upper(i));
        a[i]=Interval<1>(a[i].first(),
           a[i].last()+externalGuards().upper(i));
      }
    if (hasInternalGuards()&&(idx[i]!=0))
      a[i]=Interval<1>(a[i].first()-internalGuards().lower(i),
         a[i].last());
  }
       if (idx[i]!=0&&
    idx[i]!=(blocks()[i].first()-1)&&
    hasInternalGuards())
  a[i]=Interval<1>(o[i].first()-internalGuards().lower(i),
     o[i].last()+internalGuards().upper(i));
     }
 }
      int gid = all.size();
      int lid = -1;
      Value_t *node = new Value_t(o, a, -1, gid, lid);
      all.push_back(node);
      ++start;
    }
  cmapper.map(all);
  return maxSize();
}
template<int Dim>
template<class Out>
void GridPartition<Dim>::print(Out &o) const
{
  int i;
  o << "GridPartition<" << Dim << ">:" << std::endl;
  o << "  blocks_m = " << blocks_m << std::endl;
  o << "  hasInternalGuards_m  hasExternalGuards_m = ";
  o << hasInternalGuards_m<< " "<<hasExternalGuards_m<< std::endl;
  o << "  internalGuards_m:" << std::endl;
  o << "      upper       ";
  for (i=0; i < Dim; ++i)
    o << internalGuards_m.upper(i) << " ";
  o << std::endl;
  o << "      lower       ";
  for (i=0; i < Dim; ++i)
    o << internalGuards_m.lower(i) << " ";
  o << std::endl;
  o << "  externalGuards_m:" << std::endl;
  o << "      upper       ";
  for (i=0; i < Dim; ++i)
    o << externalGuards_m.upper(i) << " ";
  o << std::endl;
  o << "      lower       ";
  for (i=0; i < Dim; ++i)
    o << externalGuards_m.lower(i) << " ";
  o << std::endl;
  o << "  num_m = " << num_m << std::endl;
  o << "  grid_m = ";
  if (grid_m.empty() )
    o << "(empty)" << std::endl;
  else
    o << grid_m << std::endl;
}
template <int Dim>
std::ostream &operator<<(std::ostream &o, const GridPartition<Dim> &gp)
{
  gp.print(o);
  return o;
}
template <int Dim>
Grid<Dim> makeRGrid(const Interval<Dim> &gdom, const Loc<Dim> &blocks)
{
  Grid<Dim> ret;
  for (int i=0;i<Dim;++i)
    {
      if (gdom[i].size()%blocks[i].first()==0&& !gdom[i].empty())
 {
   ret[i]=Grid<1>(Range<1>(gdom[i].first(),
      gdom[i].last()+1,
      (int) gdom[i].size()/blocks[i].first()));
 }
      else if (!gdom[i].empty() )
 {
   IndirectionList<int> rret(blocks[i].first()+1);
   rret(0) = gdom[i].first();
   for (int j = 1;j<blocks[i].first()+1;++j)
     {
       int temp = (int) gdom[i].size()/blocks[i].first();
       rret(j)= rret(j-1) + temp ;
       rret(j) += (j > (blocks[i].first() -
          (gdom[i].size()- temp*blocks[i].first()) ) );
     }
   ret[i]=Grid<1>(rret);
 }
      else
 {
 }
    }
  return ret;
}
template <typename T>
std::vector<T> makeRBlocksFactor(T number)
{
  std::vector<T> factors;
  for (T f=2; f<number; f++) {
    while (number % f == 0) {
      factors.push_back(f);
      number /= f;
    }
  }
  if (number != 1)
    factors.push_back(number);
  return factors;
}
template <int Dim>
Loc<Dim> makeRBlocks(const Interval<Dim>& domain, int nodes)
{
  typedef typename std::vector<int>::reverse_iterator riterator_t;
  std::vector<int> df[Dim];
  std::vector<int> nf;
  for (int i=0; i<Dim; i++)
    df[i] = makeRBlocksFactor<int>(domain[i].size());
  nf = makeRBlocksFactor<int>(nodes);
  int setup[Dim];
  for (int i=0; i<Dim; i++)
    setup[i] = 1;
  int sdi[Dim];
  for (int i=0; i<Dim; i++)
    sdi[i] = i;
  for (riterator_t ni = nf.rbegin(); ni < nf.rend(); ni++) {
    bool changed;
    do {
      changed = false;
      for (int i=0; i<Dim-1; i++)
 if (domain[sdi[i]].size()/setup[sdi[i]]
     < domain[sdi[i+1]].size()/setup[sdi[i+1]]) {
   std::swap(sdi[i+1], sdi[i]);
   changed = true;
 }
    } while (changed);
    int i = sdi[0];
    riterator_t di;
    for (di = df[i].rbegin(); di < df[i].rend(); di++) {
      if ((*di) == (*ni)) {
 setup[i] *= (*ni);
 break;
      }
    }
    if (di == df[i].rend())
      setup[i] *= (*ni);
  }
  Loc<Dim> result;
  for (int i=0; i<Dim; i++)
    result[i] = setup[i];
  return result;
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData()
  : Observable<SparseTileLayoutData>(*this)
{
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &boundingbox,
      const PatchList_t & PatchList,
      const ContextMapper<Dim> &cmap)
 : LayoutBaseData<Dim>(false,false,
         GuardLayers_t(0),GuardLayers_t(0),
         boundingbox,boundingbox),
   Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  initialize(boundingbox,PatchList,cmap);
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &boundingbox,
      const GuardLayers_t & globalGL,
      const PatchList_t & PatchList,
      const ContextMapper<Dim> &cmap)
  : LayoutBaseData<Dim>(true,true,
   globalGL,globalGL,
   boundingbox,boundingbox),
  Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  initialize(boundingbox,globalGL,PatchList,cmap);
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &boundingbox,
      const GuardLayers_t & internalGL,
      const GuardLayers_t & externalGL,
      const PatchList_t & PatchList,
      const ContextMapper<Dim> &cmap)
 : LayoutBaseData<Dim>(true,true,
   internalGL,externalGL,
         boundingbox,boundingbox),
  Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  initialize(boundingbox,internalGL,externalGL,PatchList,cmap );
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &boundingbox)
  : LayoutBaseData<Dim>(false, false,
   GuardLayers_t(),GuardLayers_t(),
   boundingbox,boundingbox),
  Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  initialize(boundingbox);
}
template<int Dim>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &boundingbox,
      const GuardLayers_t & internalGL,
      const GuardLayers_t & externalGL)
  : LayoutBaseData<Dim>(true, true,
   internalGL,externalGL,
   boundingbox,boundingbox),
  Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  initialize(boundingbox,internalGL,externalGL);
}
template<int Dim>
template<class Partitioner>
SparseTileLayoutData<Dim>::SparseTileLayoutData(const Domain_t &bbox,
      const Partitioner &gpar,
      const ContextMapper<Dim> &cmap)
   : LayoutBaseData<Dim>(false,false,
     GuardLayers_t(0),GuardLayers_t(0),
     bbox,bbox),
    Observable<SparseTileLayoutData>(*this)
{
  this->blocks_m = Loc<Dim>();
  if (gpar.hasInternalGuards() && gpar.maxSize() > 1)
    {
      this->hasInternalGuards_m = true;
      this->internalGuards_m = gpar.internalGuards();
    }
  if (gpar.hasExternalGuards())
    {
      this->hasExternalGuards_m = true;
      this->externalGuards_m = gpar.externalGuards();
      GuardLayers<Dim>::addGuardLayers(this->domain_m,this->externalGuards_m);
    }
  initialize(bbox, gpar,cmap);
}
template<int Dim>
SparseTileLayoutData<Dim>::~SparseTileLayoutData()
{
  for (typename List_t::iterator a = this->all_m.begin(); a != this->all_m.end(); ++a)
    delete (*a);
}
template<int Dim>
void SparseTileLayoutData<Dim>::syncPatch()
{
  typename List_t::iterator start = this->all_m.begin();
  typename List_t::iterator end = this->all_m.end();
  for ( ; start != end ; ++start)
    if ( (*start)->context() == Pooma::context()
  ||(*start)->context() == -1 )
      this->local_m.push_back(*start);
    else
      this->remote_m.push_back(*start);
   calcMaps();
   calcAllocMaps();
   calcGCFillList();
}
template<int Dim>
void SparseTileLayoutData<Dim>::calcMaps()
{
  if (!this->initialized())
    return;
  map_m.zap();
  map_m.initialize(this->domain_m);
  typename List_t::const_iterator start = this->all_m.begin();
  typename List_t::const_iterator end = this->all_m.end();
  int i=0;
  for ( ; start != end ; ++start, ++i )
    {
      pidx_t tmp((*start)->globalID(),i);
      typename DomainMap<Domain_t,pidx_t>::Value_t val((*start)->domain(),tmp);
      map_m.insert(val);
    }
  map_m.update();
}
template<int Dim>
void SparseTileLayoutData<Dim>::calcAllocMaps()
{
  if (!this->initialized())
    return;
  mapAloc_m.zap();
  mapAloc_m.initialize(this->domain_m);
  typename List_t::const_iterator start = this->all_m.begin();
  typename List_t::const_iterator end = this->all_m.end();
  int i=0;
  for ( ; start!=end ; ++start , ++i)
    {
      pidx_t tmp((*start)->globalID(),i);
      typename DomainMap<Domain_t,pidx_t>::Value_t val((*start)->allocated(),tmp);
      mapAloc_m.insert(val);
    }
  mapAloc_m.update();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &gdom)
{
  this->blocks_m = Loc<Dim>();
  int i;
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  for(i=0;i<Dim;++i)
    this->firste_m[i] = this->firsti_m[i] = this->domain_m[i].first();
  this->domain_m = gdom;
  this->innerdomain_m = gdom;
  this->hasInternalGuards_m = this->hasExternalGuards_m = false;
  this->internalGuards_m = this->externalGuards_m = GuardLayers_t();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &gdom,
        const GuardLayers_t & globalGL)
{
  this->blocks_m = Loc<Dim>();
  int i;
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  this->domain_m = gdom;
  this->innerdomain_m = gdom;
  for(i=0;i<Dim;++i)
    this->firsti_m[i] = this->domain_m[i].first();
  this->hasInternalGuards_m = this->hasExternalGuards_m=true;
  this->internalGuards_m = this->externalGuards_m = globalGL;
  GuardLayers<Dim>::addGuardLayers(this->domain_m, this->externalGuards_m);
  for(i=0;i<Dim;++i)
    this->firste_m[i]=this->domain_m[i].first();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &gdom,
         const GuardLayers_t & internalGL,
         const GuardLayers_t & externalGL)
{
  this->blocks_m = Loc<Dim>();
  int i;
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  this->domain_m = gdom;
  this->innerdomain_m = gdom;
  for(i=0;i<Dim;++i)
    this->firsti_m[i]=this->domain_m[i].first();
  this->hasInternalGuards_m = this->hasExternalGuards_m = true;
  this->internalGuards_m = internalGL;
  this->externalGuards_m = externalGL;
  GuardLayers<Dim>::addGuardLayers(this->domain_m, this->externalGuards_m);
  for(i=0;i<Dim;++i)
    this->firste_m[i] = this->domain_m[i].first();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &bbox,
        const PatchList_t &plist,
        const ContextMapper<Dim> &cmap)
{
  this->blocks_m = Loc<Dim>();
  initialize(bbox);
  TilePartition<Dim> gpar(plist);
  gpar.partition(bbox,this->all_m,cmap);
  syncPatch();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &bbox,
        const GuardLayers_t & globalGL,
        const PatchList_t &plist,
        const ContextMapper<Dim> &cmap)
{
  this->blocks_m = Loc<Dim>();
  initialize(bbox,globalGL);
  TilePartition<Dim> gpar(bbox,plist,globalGL);
  gpar.partition(bbox,this->all_m,cmap);
  syncPatch();
}
template<int Dim>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &bbox,
        const GuardLayers_t & internalGL,
        const GuardLayers_t & externalGL,
        const PatchList_t &plist,
        const ContextMapper<Dim> &cmap)
{
  this->blocks_m = Loc<Dim>();
  initialize(bbox,internalGL,externalGL);
  TilePartition<Dim> gpar(bbox,plist,internalGL,externalGL);
  gpar.partition(bbox,this->all_m,cmap);
  syncPatch();
}
template<int Dim>
template<class Partitioner>
void SparseTileLayoutData<Dim>::initialize(const Domain_t &bbox,
        const Partitioner &gpar,
        const ContextMapper<Dim> &cmap)
{
  this->blocks_m = Loc<Dim>();
  initialize(bbox,gpar.internalGuards(),gpar.externalGuards());
  gpar.partition(bbox,this->all_m,cmap);
  syncPatch();
}
template<int Dim>
void SparseTileLayoutData<Dim>::calcGCFillList()
{
  if(!this->initialized() || !this->hasInternalGuards_m)
    return;
  this->gcFillList_m.clear();
  gcBorderFillList_m.clear();
  typedef Node<Domain_t,AllocatedDomain_t> NNode_t;
  typedef std::vector<NNode_t> TouchList_t;
  TouchList_t tlist;
  typename List_t::iterator start = this->all_m.begin();
  typename List_t::iterator end = this->all_m.end();
  for ( ; start!=end; ++start)
    {
      touches((*start)->allocated(),
       std::back_inserter(tlist),
       TouchesConstructNodeObj());
      typename TouchList_t::iterator GCLstart = tlist.begin();
      typename TouchList_t::iterator GCLend = tlist.end();
      for( ; GCLstart != GCLend ;++GCLstart)
 {
   if(GCLstart->globalID() == (*start)->globalID())
     {
       tlist.erase(GCLstart);
       break;
     }
 }
      GCLstart = tlist.begin();
      GCLend = tlist.end();
      for ( ; GCLstart!=GCLend ; ++GCLstart )
 {
   this->gcFillList_m.push_back(GCFillInfo_t((*GCLstart).domain(),
          (*GCLstart).globalID(),
          (*start)->globalID()));
 }
      tlist.clear();
    }
  std::vector<GCBorderFillInfo> bfv;
  start = this->all_m.begin();
  for ( ; start!=this->all_m.end(); ++start)
    {
      for(int d=0;d<Dim;++d)
 {
   Domain_t gcdom( (*start)->allocated());
   int max = (*start)->allocated()[d].last();
   int min = max - this->internalGuards_m.upper(d) + 1;
   gcdom[d] = Interval<1>(min, max);
   gcdom = intersect(this->innerdomain_m,gcdom);
   if (gcdom.size()>0)
     {
       bfv.push_back(GCBorderFillInfo(gcdom, (*start)->globalID() ));
     }
   gcdom = (*start)->allocated();
   min = (*start)->allocated()[d].first();
   max = min + this->internalGuards_m.lower(d) -1;
    gcdom[d] = Interval<1>(min, max);
   gcdom = intersect(this->innerdomain_m,gcdom);
   if (gcdom.size() > 0)
   {
     bfv.push_back(GCBorderFillInfo(gcdom,(*start)->globalID()));
   }
 }
    }
  std::vector<Domain_t> temp2,temp3,temp4;
  std::vector<GCBorderFillInfo> temp;
  BorderFillIterator_t bst = bfv.begin();
  BorderFillIterator_t ben = bfv.end();
  for ( ; bst != ben ; ++bst)
    {
      FillIterator_t gst = this->beginFillList();
      FillIterator_t gen = this->endFillList();
      temp2.clear();
      temp2.push_back(bst->domain());
      for ( ; gst!=gen ; ++gst )
 {
   typename std::vector<Domain_t>::iterator ts = temp2.begin();
   for ( ; ts != temp2.end() ; ++ts )
     {
       temp3 = DomainRemoveOverlap(*ts,gst->domain_m);
       temp4.insert(temp4.end(),temp3.begin(),temp3.end());
     }
   temp2 = temp4;
   temp4.clear();
 }
      typename std::vector<Domain_t>::iterator ts = temp2.begin();
      for( ; ts != temp2.end(); ++ts)
 temp.push_back(GCBorderFillInfo(*ts, bst->patchID() ));
    }
  gcBorderFillList_m = temp;
}
template<int Dim>
int SparseTileLayoutData<Dim>::globalID(const Loc<Dim> &loc) const
{
  ;
  DomainMapTouchIterator<Interval<Dim>,pidx_t> dmti =
 (map_m.touch(Interval<Dim>(loc))).first;
  DomainMapTouchIterator<Interval<Dim>,pidx_t> baditerator;
  if (__builtin_expect(!!(dmti!=baditerator), true)) {} else Pooma::toss_cookies("Bad location requested in SparseTileLayout", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Layout/SparseTileLayout.cpp", 538);
  return (*dmti).first;
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1, int i2) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4, int i5) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  loc[5] = i5;
  return globalID(loc);
}
template <int Dim>
int SparseTileLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4, int i5, int i6) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  loc[5] = i5;
  loc[6] = i6;
  return globalID(loc);
}
template<int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int SparseTileLayoutData<Dim>::touches(const OtherDomain &fulld,
           OutIter o,
           const ConstructTag &ctag) const
{
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t d = intersect(this->domain_m, fulld);
  if (d.empty())
    return 0;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename DomainMap<Interval<Dim>,pidx_t>::Touch_t dmti =
    map_m.touch(Interval<Dim>(d));
  typename DomainMap<Interval<Dim>,pidx_t>::touch_iterator a;
  int count = 0;
  for( a = dmti.first ;a != dmti.second; ++a)
    {
      int nodeListIndex = (*a).second;
      outDomain = intersect(a.domain(), fulld);
      ;
      *o = touchesConstruct(outDomain,
       this->all_m[nodeListIndex]->allocated(),
       this->all_m[nodeListIndex]->affinity(),
       this->all_m[nodeListIndex]->context(),
       this->all_m[nodeListIndex]->globalID(),
       this->all_m[nodeListIndex]->localID(),
       ctag);
      ++count;
    }
  return count;
}
template<int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int SparseTileLayoutData<Dim>::touchesAlloc(const OtherDomain &fulld,
         OutIter o,
         const ConstructTag &ctag) const
{
  int i;
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t d = intersect(this->domain_m, fulld);
  if (d.empty())
    return 0;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename DomainMap<Interval<Dim>,pidx_t>::Touch_t dmti = map_m.touch(d);
  typename DomainMap<Interval<Dim>,pidx_t>::touch_iterator a;
  int count = 0;
  for( a = dmti.first ;a != dmti.second; ++a)
    {
      int nodeListIndex = (*a).second;
      outDomain = intersect(a.domain(), fulld);
      ;
      *o = touchesConstruct(outDomain,
       this->all_m[nodeListIndex]->allocated(),
       this->all_m[nodeListIndex]->affinity(),
       this->all_m[nodeListIndex]->context(),
       this->all_m[nodeListIndex]->globalID(),
       this->all_m[nodeListIndex]->localID(),
       ctag);
      ++count;
    }
  return count;
}
template<int Dim>
template<class Out>
void SparseTileLayoutData<Dim>::print(Out & o) const
{
  int i;
  o<< " SparseTileLayoutData<"<<Dim<<">: "<<std::endl;
  o<< " ID_m " << this->ID_m << std::endl;
  o<< " domain_m " << this->domain_m <<std::endl;
  o<< " innerdomain_m " << this->innerdomain_m <<std::endl;
  o<< " all_m : " << std::endl;
  typename List_t::const_iterator start = this->all_m.begin();
  typename List_t::const_iterator end = this->all_m.end();
  for ( ; start!=end ; ++start)
    o<< (*start)->globalID()<<" "<<
      (*start)->domain()<<" "<<
      (*start)->allocated()<<" "
     <<std::endl;
  o<< " local_m : " << std::endl;
  start = this->local_m.begin();
  end = this->local_m.end();
  for ( ; start!=end ; ++start)
    o<< (*start)->globalID()<<" "<<
      (*start)->localID()<<" " <<
      (*start)->domain()<<" "<<
      (*start)->allocated()<<" "
     <<std::endl;
  o<< " firste_m[Dim] " ;
  for ( i=0;i<Dim;++i) o<< this->firste_m[i]<<" ";
  o<< std::endl;
  o<< " firsti_m[Dim] " ;
  for ( i=0;i<Dim;++i) o<< this->firsti_m[i]<<" ";
  o<< std::endl;
  o<< " hasInternalGuards_m, hasExternalGuards_m " <<
    this->hasInternalGuards_m <<" " << this->hasExternalGuards_m <<std::endl;
  o<< " internalGuards_m " ;
   for ( i=0;i<Dim;++i)
     o<< this->internalGuards_m.upper(i)<<"-"<<this->internalGuards_m.lower(i)<<" ";
   o<<std::endl;
  o<< " externalGuards_m " ;
   for ( i=0;i<Dim;++i)
     o<< this->externalGuards_m.upper(i)<<"-"<<this->externalGuards_m.lower(i)<<" ";
   o<<std::endl;
   FillIterator_t gstart = this->gcFillList_m.begin();
   FillIterator_t gend = this->gcFillList_m.end();
   o<< " gcFillList_m " <<std::endl;
   for( ; gstart!=gend ; ++gstart)
     o<<"       "
      <<gstart->domain_m<<" "
      <<gstart->ownedID_m<<" "
      <<gstart->guardID_m<<std::endl;
   BorderFillIterator_t bgstart = gcBorderFillList_m.begin();
   BorderFillIterator_t bgend = gcBorderFillList_m.end();
   o<< " gcBorderFillList_m " <<std::endl;
   for( ; bgstart!=bgend ; ++bgstart)
     o<<"       "
      <<bgstart->domain()<<" "
      <<bgstart->patchID()<<std::endl;
}
template<int Dim>
void SparseTileLayout<Dim>::syncPatch()
{
  this->pdata_m->syncPatch();
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout()
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >(new LayoutData_t()),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(Domain_t & boundingbox,
     const PatchList_t &patchlist,
     const ReplicatedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(boundingbox,patchlist,LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(Domain_t & boundingbox,
     const PatchList_t &patchlist,
     const DistributedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(boundingbox,patchlist,DistributedMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
  template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL,
     const PatchList_t & patchlist,
     const DistributedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
  (new LayoutData_t(boundingbox,globalGL,patchlist,DistributedMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL,
     const PatchList_t & patchlist,
     const ReplicatedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
  (new LayoutData_t(boundingbox,globalGL,patchlist,LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL,
     const PatchList_t & patchlist,
     const DistributedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
              (new LayoutData_t(boundingbox,
    internalGL,
    externalGL,
    patchlist,
    DistributedMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL,
     const PatchList_t & patchlist,
     const ReplicatedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
              (new LayoutData_t(boundingbox,
    internalGL,
    externalGL,
    patchlist,
    LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(boundingbox)),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
 template<int Dim>
SparseTileLayout<Dim>:: SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & globalGL)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(boundingbox,globalGL)),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &boundingbox,
     const GuardLayers_t & internalGL,
     const GuardLayers_t & externalGL)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(boundingbox,internalGL,externalGL)),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &bbox,
     const Partitioner &gpar,
     const DistributedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(bbox, gpar,DistributedMapper<Dim>(gpar))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
SparseTileLayout<Dim>::SparseTileLayout(const Domain_t &bbox,
     const Partitioner &gpar,
     const ReplicatedTag &)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >
    (new LayoutData_t(bbox, gpar,LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template<int Dim>
SparseTileLayout<Dim>::SparseTileLayout(const This_t &model)
  : LayoutBase<Dim,SparseTileLayoutData<Dim> >(model.pdata_m),
  Observable<This_t>(*this)
{
   this->pdata_m->attach(*this);
}
template<int Dim >
struct IsValid
{
  IsValid(Loc<Dim> loc) : loc_m(loc) { }
  typedef AndCombine Combine_t;
  Loc<Dim> loc_m;
};
template<class T, int Dim>
struct EngineFunctorScalar<T, IsValid<Dim> >
{
  typedef bool Type_t;
  static inline
  Type_t apply(const T &, const IsValid<Dim> &)
  {
    return true;
  }
};
template<class Engine, int Dim>
struct EngineFunctorDefault<Engine, IsValid<Dim> >
{
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine &, const IsValid<Dim> &)
  {
    return true;
  }
};
template<int Dim,class T,class ptag>
struct EngineFunctor<Engine<Dim, T,MultiPatch<SparseTileTag,ptag> >, IsValid<Dim> >
{
  typedef Engine<Dim,T,MultiPatch<SparseTileTag,ptag> > Engine_t;
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine_t &e, const IsValid<Dim> &f)
  {
    typedef typename Engine_t::Domain_t domain_t;
    typedef Node<domain_t,domain_t> node_t;
    std::vector<node_t> v;
    int count = e.layout().touches(f.loc_m,std::back_inserter(v));
    return (count!=0);
  }
};
template<class Object,class Dom,class tag>
inline bool isValidLocation(const Object &,
       const Dom &,
       const tag &)
{
 return true;
}
#include <iomanip>
class PrintArray;
template<class S, class A, int Dim, class DomainType>
struct PerformPrintArray
{
  static void print(const PrintArray &, S &, const A &, const DomainType &);
};
template<class S, class A, class DomainType>
struct PerformPrintArray<S, A, 1, DomainType>
{
  static void print(const PrintArray &, S &, const A &, const DomainType &);
};
class PrintArray
{
public:
  PrintArray(int domainWidth = 3, int dataWidth = 10,
      int dataPrecision = 4, int carReturn = -1,
      bool scientific = false, int spacing = 1)
    : domainwidth_m(domainWidth), datawidth_m(dataWidth),
      dataprecision_m(dataPrecision), carreturn_m(carReturn),
      spacing_m(spacing), scientific_m(scientific)
    {
      ;
      ;
      ;
      ;
    }
  PrintArray(const PrintArray &a)
    : domainwidth_m(a.domainwidth_m), datawidth_m(a.datawidth_m),
      dataprecision_m(a.dataprecision_m), carreturn_m(a.carreturn_m),
      scientific_m(a.scientific_m)
    {
    }
  ~PrintArray()
    {
    }
  template<class S, class A, class DomainType>
  void print(S &s, const A &a, const DomainType &d) const
  {
    Pooma::blockAndEvaluate();
    PerformPrintArray<S,A,A::dimensions,DomainType>::print(*this, s, a, d);
  }
  template<class S, class A>
  void print(S &s, const A &a) const
  {
    Pooma::blockAndEvaluate();
    PerformPrintArray<S, A, A::dimensions, typename A::Domain_t>::
      print(*this, s, a, a.totalDomain());
  }
  int domainWidth() const
    {
      return domainwidth_m;
    }
  void setDomainWidth(int val)
    {
      domainwidth_m = val;
      ;
    }
  int dataWidth() const
    {
      return datawidth_m;
    }
  void setDataWidth(int val)
    {
      datawidth_m = val;
      ;
    }
  int dataPrecision() const
    {
      return dataprecision_m;
    }
  void setDataPrecision(int val)
    {
      dataprecision_m = val;
      ;
    }
  int carReturn() const
    {
      return carreturn_m;
    }
  void setCarReturn(int val)
    {
      carreturn_m = val;
    }
  bool scientific() const
    {
      return scientific_m;
    }
  void setScientific(bool val)
    {
      scientific_m = val;
    }
  int spacing() const
    {
      return spacing_m;
    }
  void setSpacing(int val)
    {
      spacing_m = val;
      ;
    }
  void setFormatParameters(PrintArray &pa) {
    domainwidth_m = pa.domainWidth();
    datawidth_m = pa.dataWidth();
    dataprecision_m = pa.dataPrecision();
    carreturn_m = pa.carReturn();
    spacing_m = pa.spacing();
    scientific_m = pa.scientific();
  }
private:
  int domainwidth_m;
  int datawidth_m;
  int dataprecision_m;
  int carreturn_m;
  int spacing_m;
  bool scientific_m;
};
template<class S, class A, class DomainType>
void
PerformPrintArray<S,A,1,DomainType>::print(const PrintArray &p, S &s,
                                           const A &a, const DomainType &d)
{
  PoomaCTAssert<(A::dimensions == 1)>::test();
  typedef DomainType Domain_t;
  typedef typename Domain_t::const_iterator Iterator_t;
  Domain_t domain(d);
  Iterator_t griditer = domain.begin();
  Iterator_t enditer = domain.end();
  if (domain.size() == 1) {
    s << "(";
    if (domain[0].first() < 0)
      s.fill(' ');
    else
      s.fill('0');
    s.width(p.domainWidth());
    s << domain[0].first();
    s << ")";
    s.fill(' ');
    s << " = ";
    if (p.scientific())
      s.setf(std::ios::scientific);
    s.precision(p.dataPrecision());
    s.width(p.dataWidth());
    s << a.read(*griditer);
    s << std::endl;
    return;
  }
  s << "(";
  if (domain[0].first() < 0)
    s.fill(' ');
  else
    s.fill('0');
  s.width(p.domainWidth());
  s << domain[0].first() << ":";
  if (domain[0].last() < 0)
    s.fill(' ');
  else
    s.fill('0');
  s.width(p.domainWidth());
  s << domain[0].last() << ":";
  if (domain[0].stride() < 0)
    s.fill(' ');
  else
    s.fill('0');
  s.width(p.domainWidth());
  s << domain[0].stride() << ") = ";
  s.fill(' ');
  int i, printed = 0;
  while (griditer != enditer)
    {
      int spacing = 0;
      if (printed > 0)
 {
   spacing = p.spacing();
   if (p.carReturn() >= 0 && printed >= p.carReturn())
     {
       s << std::endl;
       spacing = 3*p.domainWidth() + 7;
       printed = 0;
     }
 }
      for (i=0; i < spacing; ++i)
 s << " ";
      if (p.scientific())
 s.setf(std::ios::scientific);
      s.precision(p.dataPrecision());
      s.width(p.dataWidth());
      s << a.read(*griditer);
      ++griditer;
      ++printed;
    }
  s << std::endl;
}
template<class S, class A, int Dim, class DomainType>
void
PerformPrintArray<S,A,Dim,DomainType>::print(const PrintArray &p, S &s,
                                             const A &a, const DomainType &d)
{
  int i, j, k;
  PoomaCTAssert<(A::dimensions == Dim && Dim > 1)>::test();
  typedef DomainType Domain_t;
  typedef typename Domain_t::Element_t Element_t;
  typedef typename Domain_t::const_iterator Iterator_t;
  Domain_t domain(d);
  Iterator_t griditer = domain.begin();
  Iterator_t enditer = domain.end();
  if (domain.size() == 1) {
    s << "(";
    if (domain[0].first() < 0)
      s.fill(' ');
    else
      s.fill('0');
    s.width(p.domainWidth());
    s << domain[0].first();
    for (int d = 1; d < Dim; d++) {
      s << ",";
      if (domain[d].first() < 0)
        s.fill(' ');
      else
        s.fill('0');
      s.width(p.domainWidth());
      s << domain[d].first();
    }
    s << ")";
    s.fill(' ');
    s << " = ";
    if (p.scientific())
      s.setf(std::ios::scientific);
    s.precision(p.dataPrecision());
    s.width(p.dataWidth());
    s << a.read(*griditer);
    s << std::endl;
    return;
  }
  Element_t x0 = domain[0].first();
  Element_t x1 = domain[0].last();
  Element_t xs = domain[0].stride();
  Element_t y0 = domain[1].first();
  Element_t y1 = domain[1].last();
  Element_t ys = domain[1].stride();
  if (Dim > 2) {
    s << std::endl << "~~~~~~~~~~~~~~ ";
    s << "(" << domain[0].first() << ":" << domain[0].last()
      << ":" << domain[0].stride();
    for (int d = 1; d < Dim; d++) {
      s << "," << domain[d].first() << ":" << domain[d].last() << ":"
        << domain[d].stride();
    }
    s << ")" << " ~~~~~~~~~~~~~~" << std::endl;
  }
  while (griditer != enditer)
    {
      if (Dim > 2) {
        s << std::endl << "(" << domain[0].first() << ":" << domain[0].last()
          << ":" << domain[0].stride() << "," << domain[1].first() << ":"
          << domain[1].last() << ":" << domain[1].stride();
        for (i=2; i < Dim; ++i)
          s << "," << (*griditer)[i].first();
        s << "):" << std::endl;
        s << "----------------------------------------------------"
          << std::endl;
      }
      for (j=y0; j <= y1; j += ys)
 {
   s << "(";
          if (x0 < 0)
            s.fill(' ');
          else
            s.fill('0');
          s.width(p.domainWidth());
          s << x0 << ":";
          if (x1 < 0)
            s.fill(' ');
          else
            s.fill('0');
          s.width(p.domainWidth());
   s << x1 << ":";
          if (xs < 0)
            s.fill(' ');
          else
            s.fill('0');
          s.width(p.domainWidth());
   s << xs;
   for (i=1; i < Dim; ++i)
     {
              s.fill(' ');
              s << ",";
              if ((*griditer)[i].first() < 0)
                s.fill(' ');
              else
                s.fill('0');
              s.width(p.domainWidth());
       s << (*griditer)[i].first();
     }
          s << ")";
   s.fill(' ');
          s << " = ";
   int printed = 0;
   for (i=x0; i <= x1; i += xs)
     {
       int spacing = 0;
       if (printed > 0)
  {
    spacing = p.spacing();
    if (p.carReturn() >= 0 && printed >= p.carReturn())
      {
        s << std::endl;
        spacing = (Dim + 2)*p.domainWidth() + 2 + Dim + 4;
        printed = 0;
      }
  }
       for (k=0; k < spacing; ++k)
  s << ' ';
       if (p.scientific())
  s.setf(std::ios::scientific);
       s.precision(p.dataPrecision());
       s.width(p.dataWidth());
       typedef typename A::Engine_t::Tag_t Etag_t;
       Etag_t tag;
        if(isValidLocation(a,*griditer,tag))
  s << a.read(*griditer);
        else
   s<< ".";
       ++griditer;
       ++printed;
     }
   s << std::endl;
 }
    }
}
template<class NewDomain, bool sv>
struct CombineDomainOpt;
template<class NewDomain>
struct CombineDomainOpt<NewDomain, true>
{
  typedef typename NewDomain::SliceType_t Type_t;
  template<class Array, class Sub1>
  inline static
  Type_t make(const Array &, const Sub1 &s1)
  {
    return Type_t(s1);
  }
  template<class Array, class Sub1, class Sub2>
  inline static
  Type_t make(const Array &, const Sub1 &s1, const Sub2 &s2)
  {
    return Type_t(s1, s2);
  }
  template<class Array, class Sub1, class Sub2, class Sub3>
  inline static
  Type_t make(const Array &,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3)
  {
    return Type_t(s1, s2, s3);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4>
  inline static
  Type_t make(const Array &,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4)
  {
    return Type_t(s1, s2, s3, s4);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5>
  inline static
  Type_t make(const Array &,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5)
  {
    return Type_t(s1, s2, s3, s4, s5);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5, class Sub6>
  inline static
  Type_t make(const Array &,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5, const Sub6 &s6)
  {
    return Type_t(s1, s2, s3, s4, s5, s6);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5, class Sub6, class Sub7>
  inline static
  Type_t make(const Array &,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5, const Sub6 &s6,
       const Sub7 &s7)
  {
    return Type_t(s1, s2, s3, s4, s5, s6, s7);
  }
};
template<class NewDomain>
struct CombineDomainOpt<NewDomain, false>
{
  typedef typename NewDomain::SliceType_t Type_t;
  template<class Array, class Sub1>
  inline static
  Type_t make(const Array &a, const Sub1 &s1)
  {
    return NewDomain::combineSlice(a.totalDomain(), s1);
  }
  template<class Array, class Sub1, class Sub2>
  inline static
  Type_t make(const Array &a, const Sub1 &s1, const Sub2 &s2)
  {
    return NewDomain::combineSlice(a.totalDomain(), s1, s2);
  }
  template<class Array, class Sub1, class Sub2, class Sub3>
  inline static
  Type_t make(const Array &a,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3)
  {
    return NewDomain::combineSlice(a.totalDomain(), s1, s2, s3);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4>
  inline static
  Type_t make(const Array &a,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4)
  {
    return NewDomain::combineSlice(a.totalDomain(), s1, s2, s3, s4);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5>
  inline static
  Type_t make(const Array &a,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5)
  {
    return NewDomain::combineSlice(a.totalDomain(), s1, s2, s3, s4, s5);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5, class Sub6>
  inline static
  Type_t make(const Array &a,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5, const Sub6 &s6)
  {
    return NewDomain::combineSlice(a.totalDomain(),
      s1, s2, s3, s4, s5, s6);
  }
  template<class Array, class Sub1, class Sub2, class Sub3,
    class Sub4, class Sub5, class Sub6, class Sub7>
  inline static
  Type_t make(const Array &a,
       const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
       const Sub4 &s4, const Sub5 &s5, const Sub6 &s6,
       const Sub7 &s7)
  {
    return NewDomain::combineSlice(a.totalDomain(),
      s1, s2, s3, s4, s5, s6, s7);
  }
};
template <class Tag>
struct Remote;
template<bool Block>
struct DataObjectApply
{ };
template<>
struct DataObjectApply<false>
{
  template<class Engine,class Functor>
  inline static
  typename Functor::Type_t
  apply(const Engine&, const Functor& functor)
  {
    return functor.defaultValue();
  }
};
template<>
struct DataObjectApply<true>
{
  template<class Engine, class Functor>
  inline static
  typename Functor::Type_t
  apply(const Engine& engine, const Functor& functor)
  {
    return functor(engine.dataObject());
  }
  template<int Dim, class T, class Tag, class Functor>
  inline static
  typename Functor::Type_t
  apply(const Engine<Dim, T, Remote<Tag> >& engine, const Functor& functor)
  {
    if (engine.engineIsLocal())
      return functor(engine.localEngine().dataObject());
    else
      return functor.defaultValue();
  }
};
template<class RequestType>
class DataObjectRequest
{};
template<class Eng, class RequestType>
struct EngineFunctorDefault<Eng, DataObjectRequest<RequestType> >
{
  enum { hasDataObject = Eng::hasDataObject };
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  static inline
  Type_t apply(const Eng &e, const DataObjectRequest<RequestType> &request)
  {
    return DataObjectApply<hasDataObject>::apply(e, request);
  }
};
template<class RequestType,class T>
struct EngineFunctorScalar<T, DataObjectRequest<RequestType> >
{
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  inline static
  Type_t apply(const T &, const DataObjectRequest<RequestType> &tag)
  {
    return tag.defaultValue();
  }
};
struct BlockAffinity { };
struct AffinityCombine
{
  AffinityCombine() { }
  AffinityCombine(const AffinityCombine &) { }
};
template<class Op>
struct Combine2<int, int, Op, AffinityCombine>
{
  typedef int Type_t;
  inline static
  Type_t combine(int a, int b, AffinityCombine)
  {
    return a;
  }
};
template<>
class DataObjectRequest<BlockAffinity>
{
public:
  typedef int Type_t;
  typedef AffinityCombine Combine_t;
  DataObjectRequest() { }
  inline Type_t operator()(Pooma::DataObject_t* obj) const
  {
    return obj->affinity();
  }
  inline Type_t defaultValue() const
  {
    return (-1);
  }
};
template<int TotalDim, int SliceDim> class SliceInterval;
template<int TotalDim, int SliceDim>
struct DomainTraits< SliceInterval<TotalDim,SliceDim> >
{
  enum { domain = true };
  enum { dimensions = TotalDim,
  sliceDimensions = SliceDim };
  enum { unitStride = true };
  enum { singleValued = false };
  enum { wildcard = false };
  typedef SliceInterval<TotalDim,SliceDim> Domain_t;
  typedef SliceInterval<TotalDim,SliceDim> NewDomain1_t;
  typedef Interval<SliceDim> SliceDomain_t;
  typedef Interval<TotalDim> TotalDomain_t;
  typedef Interval<1> OneDomain_t;
  typedef Interval<1> PointDomain_t;
  static OneDomain_t &getDomain(Domain_t &d, int n) {
    return d.totalDomain()[n];
  }
  static const OneDomain_t &getDomain(const Domain_t &d,int n) {
    return d.totalDomain()[n];
  }
  static OneDomain_t &getSliceDomain(Domain_t &d, int n) {
    return d.sliceDomain()[n];
  }
  static const OneDomain_t &getSliceDomain(const Domain_t &d, int n) {
    return d.sliceDomain()[n];
  }
  static PointDomain_t &getPointDomain(Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static const PointDomain_t &getPointDomain(const Domain_t &d, int n) {
    return getDomain(d, n);
  }
  static void cantIgnoreDomain(Domain_t &d, int n) {
    d.cantIgnoreDomain(n);
  }
  static bool getIgnorable(const Domain_t &d, int n) {
    return d.ignorable(n);
  }
  static void setIgnorable(Domain_t &d, int n, bool i) {
    d.ignorable(n) = i;
  }
};
template<int Dim, int SliceDim>
class SliceInterval
  : public SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > >
{
public:
  SliceInterval() { }
  SliceInterval(const Pooma::NoInit &d)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > >(d) { }
  SliceInterval(const SliceInterval<Dim,SliceDim> &nd)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > >(nd) {
  }
  template <class Base, class D1, class D2>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain2<D1,D2> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2);
  }
  template <class Base, class D1, class D2, class D3>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2,
                const D3 &d3)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain3<D1,D2,D3> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3);
  }
  template <class Base, class D1, class D2, class D3,
            class D4>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2,
                const D3 &d3, const D4 &d4)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain4<D1,D2,D3,D4> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2,
                const D3 &d3, const D4 &d4, const D5 &d5)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain5<D1,D2,D3,D4,D5> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5, class D6>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2,
                const D3 &d3, const D4 &d4, const D5 &d5, const D6 &d6)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain6<D1,D2,D3,D4,D5,D6> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5, d6);
  }
  template <class Base, class D1, class D2, class D3,
            class D4, class D5, class D6, class D7>
  SliceInterval(const Base &baseDomain, const D1 &d1, const D2 &d2,
                const D3 &d3, const D4 &d4, const D5 &d5, const D6 &d6,
                const D7 &d7)
    : SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > > (
        Pooma::NoInit())
  {
      typedef NewDomain7<D1,D2,D3,D4,D5,D6,D7> NewDomain_t;
      typedef typename NewDomain_t::SliceType_t SliceType_t;
      PoomaCTAssert<(DomainTraits<SliceType_t>::dimensions == Dim)>::test();
      PoomaCTAssert<(DomainTraits<SliceType_t>::sliceDimensions == SliceDim)>::test();
      NewDomain_t::fillSlice(*this, baseDomain, d1, d2, d3, d4, d5, d6, d7);
  }
  ~SliceInterval() { }
  SliceInterval<Dim,SliceDim> &
    operator=(const SliceInterval<Dim,SliceDim> &nd) {
      SliceDomain<DomainTraits<SliceInterval<Dim,SliceDim> > >::operator=(nd);
      return *this;
  }
protected:
private:
};
struct DomainTag { };
template<int Dim>
class DomainLayout
{
public:
  typedef DomainLayout<Dim> This_t;
  typedef Interval<Dim> Domain_t;
  typedef Node<Domain_t> Value_t;
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef Value_t *iterator;
  typedef const Value_t *const_iterator;
  enum { dimensions = Dim };
  enum { dynamic = false };
  inline DomainLayout()
    {
    }
  explicit DomainLayout(const Domain_t &dom)
    : node_m(0, dom, Pooma::context(), 0, 0)
    {
    }
  DomainLayout(const Domain_t &dom, const GuardLayers_t &g)
    : node_m(0, dom, grow(dom, g), Pooma::context(), 0, 0)
    {
    }
  explicit DomainLayout(const Value_t &node)
    : node_m(node)
    {
    }
  DomainLayout(const This_t &layout)
    : node_m(layout.node_m)
    {
    }
  void initialize(const Domain_t &dom)
    {
      node_m = Value_t(0, dom, Pooma::context(), 0, 0);
    }
  void initialize(const Domain_t &dom, const GuardLayers_t &g)
    {
      node_m = Value_t(0, dom, grow(dom, g), Pooma::context(), 0, 0);
    }
  void initialize(const This_t &layout)
  {
    node_m = layout.node_m;
  }
  inline ~DomainLayout()
    {
    }
  inline bool initialized() const
    {
      return domain().initialized();
    }
  inline int first(int d) const { return innerDomain()[d].first(); }
  inline Value_t &node()
    {
      return node_m;
    }
  inline const Value_t &node() const
    {
      return node_m;
    }
  inline Loc<Dim> blocks() const { return Loc<Dim>(1); }
  inline const Domain_t &domain() const
    {
      return node_m.allocated();
    }
  inline const Domain_t &innerDomain() const
  {
    return node_m.domain();
  }
  inline const Domain_t &allocated() const
    {
      return node_m.allocated();
    }
  inline GuardLayers_t internalGuards() const
  {
    return GuardLayers_t(0);
  }
  inline GuardLayers_t externalGuards() const
  {
    GuardLayers_t gl;
    for (int i = 0; i < Dim; i++)
      {
        gl.lower(i) = node_m.domain()[i].min() - node_m.allocated()[i].min();
        gl.upper(i) = node_m.allocated()[i].max() - node_m.domain()[i].max();
      }
    return gl;
  }
  inline const Domain_t &domain(int i) const
  {
    ;
    return node_m.allocated();
  }
 inline const Domain_t &ownedDomain(int i) const
  {
    ;
    return node_m.domain();
  }
  inline const Domain_t &allocatedDomain(int i) const
    {
      ;
      return node_m.allocated();
    }
  template<class L>
  inline bool operator==(const L &layout) const
    {
      return (domain() == layout.domain());
    }
  template<class L>
  inline bool operator!=(const L &layout) const
    {
      return !(*this == layout);
    }
  inline iterator begin()
    {
      return &node_m;
    }
  inline iterator end()
    {
      return &node_m + 1;
    }
  inline const_iterator begin() const
    {
      return &node_m;
    }
  inline const_iterator end() const
    {
      return &node_m + 1;
    }
  inline long size() const
    {
      return 1;
    }
  inline iterator beginLocal()
    {
      return begin();
    }
  inline iterator endLocal()
    {
      return end();
    }
  inline const_iterator beginLocal() const
    {
      return begin();
    }
  inline const_iterator endLocal() const
    {
      return end();
    }
  inline long sizeLocal() const
    {
      return size();
    }
  inline iterator beginGlobal()
    {
      return begin();
    }
  inline iterator endGlobal()
    {
      return end();
    }
  inline const_iterator beginGlobal() const
    {
      return begin();
    }
  inline const_iterator endGlobal() const
    {
      return end();
    }
  inline long sizeGlobal() const
    {
      return size();
    }
  inline iterator beginRemote()
    {
      return iterator(0);
    }
  inline iterator endRemote()
    {
      return iterator(0);
    }
  inline const_iterator beginRemote() const
    {
      return const_iterator(0);
    }
  inline const_iterator endRemote() const
    {
      return const_iterator(0);
    }
  inline long sizeRemote() const
    {
      return 0;
    }
  inline int globalID(const Loc<Dim> &loc) const
    {
      ;
      return 0;
    }
  inline int globalID(int i1) const
    {
      return globalID(Loc<1>(i1));
    }
  inline int globalID(int i1, int i2) const
    {
      return globalID(Loc<2>(i1, i2));
    }
  inline int globalID(int i1, int i2, int i3) const
    {
      return globalID(Loc<3>(i1, i2, i3));
    }
  inline int globalID(int i1, int i2, int i3, int i4) const
    {
      return globalID(Loc<4>(i1, i2, i3, i4));
    }
  inline int globalID(int i1, int i2, int i3, int i4, int i5) const
    {
      return globalID(Loc<5>(i1, i2, i3, i4, i5));
    }
  inline int globalID(int i1, int i2, int i3, int i4, int i5,
        int i6) const
    {
      return globalID(Loc<6>(i1, i2, i3, i4, i5, i6));
    }
  inline int globalID(int i1, int i2, int i3, int i4, int i5,
        int i6, int i7) const
    {
      return globalID(Loc<7>(i1, i2, i3, i4, i5, i6, i7));
    }
  template<class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o, ConstructTag ctag) const;
  template<class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesLocal(const OtherDomain &d, OutIter o,
                          const ConstructTag &ctag) const
    {
      return touches(d, o, ctag);
    }
  template<class OtherDomain, class OutIter, class ConstructTag>
  inline int touchesRemote(const OtherDomain &, OutIter,
      const ConstructTag &) const
    {
      return 0;
    }
  template<class OtherDomain, class OutIter>
  inline int touches(const OtherDomain &d, OutIter o) const
    {
      return touches(d, o, TouchesConstructNodeObj());
    }
  template<class OtherDomain, class OutIter>
  inline int touchesLocal(const OtherDomain &d, OutIter o) const
    {
      return touchesLocal(d, o, TouchesConstructNodeObj());
    }
  template<class OtherDomain, class OutIter>
  inline int touchesRemote(const OtherDomain &d, OutIter o) const
    {
      return touchesRemote(d, o, TouchesConstructNodeObj());
    }
  template<class Out>
  void print(Out &o) const
    {
      o << "DomainLayout: Node = " << node_m;
    }
private:
  Value_t node_m;
};
template<int Dim>
template<class OtherDomain, class OutIter, class ConstructTag>
int DomainLayout<Dim>::touches(const OtherDomain &d, OutIter o,
          ConstructTag ctag) const
{
  int i, count = 0;
  typedef typename IntersectReturnType<Domain_t,OtherDomain>::Type_t
    OutDomain_t;
  typedef Node<OutDomain_t> OutNode_t;
  OutDomain_t outDomain = intersect(d, domain());
  if (!outDomain.empty())
    {
      ++count;
      *o = touchesConstruct(outDomain,
       node().affinity(),
       node().context(),
       node().globalID(),
       node().localID(),
       ctag);
    }
  return count;
}
template <int Dim>
std::ostream &operator<<(std::ostream &o, const DomainLayout<Dim> &layout)
{
  layout.print(o);
  return o;
}
template<int Dim>
struct NewDomain1< DomainLayout<Dim> >
{
  typedef DomainLayout<Dim> &Type_t;
  inline static Type_t combine(const DomainLayout<Dim> &a)
    {
      return const_cast<Type_t>(a);
    }
};
namespace Pooma {
template <int Dim> class BrickViewBase;
template <int pos, int max>
struct OffsetCalc
{
 template <class Dom>
 static inline int apply(const Dom& dom, const int *strides_m)
 {
  return dom[pos].first()*strides_m[pos]
   + OffsetCalc<pos+1,max>::apply(dom, strides_m);
 }
};
template <int end>
struct OffsetCalc<end, end>
{
 template <class Dom>
 static inline int apply(const Dom& dom, const int *strides_m)
 {
  return dom[end].first()*strides_m[end];
 }
};
template <>
struct OffsetCalc<1, 0>
{
 template <class Dom>
 static inline int apply(const Dom& dom, const int *strides_m)
 {
  return 0;
 }
};
template <int Dim>
class BrickBase
{
public:
  typedef Interval<Dim> Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef BrickBase<Dim> This_t;
  enum { dimensions = Dim };
  enum { brick = true };
  enum { zeroBased = false };
  explicit BrickBase(bool compressible = false)
    : compressibleBase_m(compressible)
  { }
  explicit BrickBase(const Domain_t &dom, bool compressible = false)
    : layout_m(dom), compressibleBase_m(compressible)
  {
    init();
  }
  explicit BrickBase(const Node<Domain_t> &node, bool compressible = false)
    : layout_m(node), compressibleBase_m(compressible)
  {
    init();
  }
  explicit BrickBase(const Layout_t &layout, bool compressible = false)
    : layout_m(layout), compressibleBase_m(compressible)
  {
    init();
  }
  ~BrickBase() {}
  inline const Domain_t &domain() const { return layout_m.domain(); }
  inline const Layout_t &layout() const { return layout_m; }
  inline const int *strides() const { return &strides_m[0]; }
  inline const int *originalStrides() const { return &ostrides_m[0]; }
  int first(int i) const { return layout_m.domain()[i].first(); }
  bool compressibleBase() const { return compressibleBase_m; }
  template <class Domain>
  inline int offset(const Domain &dom) const
  { return off_m + offset0(dom); }
  template <class Domain>
  inline int offset0(const Domain &dom) const
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
    return dom[0].first() + OffsetCalc<1, Dim-1>::apply(dom, strides_m);
  }
  template <class Domain>
  inline int offsetC(const Domain &dom) const
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
    return OffsetCalc<0, Dim-1>::apply(dom, strides_m);
  }
  inline int offset() const
  { return off_m; }
  inline int baseOffset() const
  { return off_m; }
  inline int offset(int i0) const
  { return off_m + i0; }
  inline int offset(int i0, int i1) const
  { return off_m + i0 + i1*strides_m[1]; }
  inline int offset(int i0, int i1, int i2) const
  { return off_m + i0 + i1*strides_m[1] + i2*strides_m[2]; }
  inline int offset(int i0, int i1, int i2, int i3) const
  { return off_m + i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4) const
  { return off_m + i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
                      + i4*strides_m[4]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return off_m + i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
                      + i4*strides_m[4] + i5*strides_m[5]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4, int i5, int i6)
  const
  { return off_m + i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
                      + i4*strides_m[4] + i5*strides_m[5] + i6*strides_m[6]; }
  inline int offset0(int i0) const
  { return i0; }
  inline int offset0(int i0, int i1) const
  { return i0 + i1*strides_m[1]; }
  inline int offset0(int i0, int i1, int i2) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]; }
  inline int offset0(int i0, int i1, int i2, int i3) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]; }
  inline int offset0(int i0, int i1, int i2, int i3, int i4) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
              + i4*strides_m[4]; }
  inline int offset0(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
              + i4*strides_m[4] + i5*strides_m[5]; }
  inline int offset0(int i0, int i1, int i2, int i3, int i4, int i5, int i6)
  const
  { return i0 + i1*strides_m[1] + i2*strides_m[2] + i3*strides_m[3]
              + i4*strides_m[4] + i5*strides_m[5] + i6*strides_m[6]; }
  inline int offsetC(int i0) const
  { return i0*strides_m[0]; }
  inline int offsetC(int i0, int i1) const
  { return i0*strides_m[0] + i1*strides_m[1]; }
  inline int offsetC(int i0, int i1, int i2) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]; }
  inline int offsetC(int i0, int i1, int i2, int i3) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3]; }
  inline int offsetC(int i0, int i1, int i2, int i3, int i4) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4]; }
  inline int offsetC(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]; }
  inline int offsetC(int i0, int i1, int i2, int i3, int i4, int i5, int i6)
  const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]
         + i6*strides_m[6]; }
protected:
  void init()
  {
    strides_m[0] = 1;
    ostrides_m[0] = 1;
    off_m = -domain()[0].first();
    for (int d = 1; d < Dim; ++d) {
      strides_m[d] = strides_m[d-1]*domain()[d-1].length();
      ostrides_m[d] = strides_m[d];
      off_m -= domain()[d].first()*strides_m[d];
    }
  }
  void zeroStrides()
  { for (int d = 0; d < Dim; ++d) strides_m[d] = 0; }
  void restoreStrides()
  { for (int d = 0; d < Dim; ++d) strides_m[d] = ostrides_m[d]; }
  Layout_t layout_m;
  int strides_m[Dim];
  int ostrides_m[Dim];
  int off_m;
  bool compressibleBase_m;
};
template <int Dim>
class BrickViewBase
{
public:
  enum { dimensions = Dim };
  enum { zeroBased = true };
  typedef Interval<Dim> Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  BrickViewBase() {}
  typedef BrickViewBase<Dim> This_t;
  BrickViewBase(const This_t &bvbase, bool compressible)
  {
    *this = bvbase;
    compressibleBase_m = compressible;
    if (!compressible) restoreStrides();
  }
  BrickViewBase(const BrickBase<Dim> &base, bool compressible)
  {
    *this = BrickViewBase<Dim>(base, base.domain());
    compressibleBase_m = compressible;
    if (!compressible) restoreStrides();
  }
  BrickViewBase(const BrickBase<Dim> &bbase, const Interval<Dim> &dom)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bbase.offset()),
      compressibleBase_m(bbase.compressibleBase())
  {
    viewInit(bbase, dom);
  }
  BrickViewBase(const BrickBase<Dim> &bbase, const Range<Dim> &dom)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bbase.offset()),
      compressibleBase_m(bbase.compressibleBase())
  {
    viewInit(bbase, dom);
  }
  BrickViewBase(const This_t &bvbase, const Interval<Dim> &domain)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bvbase.baseOffset()),
      compressibleBase_m(bvbase.compressibleBase())
  {
    viewInit(bvbase, domain);
  }
  BrickViewBase(const This_t &bvbase, const Range<Dim> &domain)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bvbase.baseOffset()),
      compressibleBase_m(bvbase.compressibleBase())
  {
    viewInit(bvbase, domain);
  }
  template<int BaseDim>
  BrickViewBase(const BrickBase<BaseDim> &bbase,
  const SliceRange<BaseDim,Dim> &dom)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bbase.offset()),
      compressibleBase_m(bbase.compressibleBase())
  {
    sliceInit(bbase.originalStrides(), dom);
  }
  template<int BaseDim>
  BrickViewBase(const BrickBase<BaseDim> &bbase,
  const SliceInterval<BaseDim,Dim> &dom)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bbase.offset()),
      compressibleBase_m(bbase.compressibleBase())
  {
    sliceInit(bbase.originalStrides(), SliceRange<BaseDim,Dim>(dom));
  }
  template<int SliceDim>
  BrickViewBase(const BrickBase<SliceDim> &bbase,
  const SliceInterval<Dim,SliceDim> &dom,
  const Interval<Dim> &totalDomain)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bbase.offset()),
      compressibleBase_m(bbase.compressibleBase())
  {
    sliceInit(bbase.originalStrides(), dom, totalDomain);
  }
  template<int SliceDim>
  BrickViewBase(const BrickViewBase<SliceDim> &bvbase,
  const SliceInterval<Dim,SliceDim> &dom,
  const Interval<Dim> &totalDomain)
    : domain_m(Pooma::NoInit()),
      baseOffset_m(bvbase.baseOffset())
  {
    sliceInit(bvbase, dom, totalDomain);
  }
  template <int BaseDim>
  BrickViewBase(const BrickViewBase<BaseDim> &bvbase,
                const SliceRange<BaseDim,Dim> &dom)
  : domain_m(Pooma::NoInit()),
    baseOffset_m(bvbase.baseOffset())
  {
    sliceInit(bvbase, dom);
  }
  template <int BaseDim>
  BrickViewBase(const BrickViewBase<BaseDim> &bvbase,
                const SliceInterval<BaseDim,Dim> &dom)
  : domain_m(Pooma::NoInit()),
    baseOffset_m(bvbase.baseOffset())
  {
    sliceInit(bvbase, SliceRange<BaseDim,Dim>(dom));
  }
  ~BrickViewBase() {}
  inline const Domain_t &domain() const { return domain_m; }
  inline Layout_t layout() const { return Layout_t(domain_m); }
  inline const int *strides() const { return &strides_m[0]; }
  inline const int *originalStrides() const { return &ostrides_m[0]; }
  inline int first(int) const { return 0; }
  bool compressibleBase() const { return compressibleBase_m; }
  int baseOffset() const { return baseOffset_m; }
  template <class Domain>
  inline int offset(const Domain &dom) const
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
    return OffsetCalc<0, Dim-1>::apply(dom, strides_m);
  }
  inline int offset(int i0) const
  { return i0*strides_m[0]; }
  inline int offset(int i0, int i1) const
  { return i0*strides_m[0] + i1*strides_m[1]; }
  inline int offset(int i0, int i1, int i2) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]; }
  inline int offset(int i0, int i1, int i2, int i3) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]; }
  inline int offset(int i0, int i1, int i2, int i3, int i4, int i5, int i6)
    const
  { return i0*strides_m[0] + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]
         + i6*strides_m[6]; }
  template <class Domain>
  inline int offsetU(const Domain &dom) const
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
    return dom[0].first() + OffsetCalc<1, Dim-1>::apply(dom, strides_m);
  }
  inline int offsetU(int i0) const
  { return i0; }
  inline int offsetU(int i0, int i1) const
  { return i0 + i1*strides_m[1]; }
  inline int offsetU(int i0, int i1, int i2) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]; }
  inline int offsetU(int i0, int i1, int i2, int i3) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3]; }
  inline int offsetU(int i0, int i1, int i2, int i3, int i4) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4]; }
  inline int offsetU(int i0, int i1, int i2, int i3, int i4, int i5) const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]; }
  inline int offsetU(int i0, int i1, int i2, int i3, int i4, int i5, int i6)
    const
  { return i0 + i1*strides_m[1] + i2*strides_m[2]
         + i3*strides_m[3] + i4*strides_m[4] + i5*strides_m[5]
         + i6*strides_m[6]; }
protected:
  void zeroStrides()
  { for (int d = 0; d < Dim; ++d) strides_m[d] = 0; }
  void restoreStrides()
  { for (int d = 0; d < Dim; ++d) strides_m[d] = ostrides_m[d]; }
  template<int BaseDim>
  void sliceInit(const int *baseStrides,
   const SliceRange<BaseDim,Dim> &dom);
  template<int SliceDim>
  void sliceInit(const int *baseStrides,
   const SliceInterval<Dim,SliceDim> &dom,
   const Interval<Dim> &totalDomain);
  template<int BaseDim>
  void sliceInit(const BrickViewBase<BaseDim>&, const SliceRange<BaseDim, Dim>&);
  template<int SliceDim>
  void sliceInit(const BrickViewBase<SliceDim>&, const SliceInterval<Dim, SliceDim>&,
   const Interval<Dim> &totalDomain);
  void viewInit(const This_t &, const Range<Dim> &domain);
  void viewInit(const BrickBase<Dim> &bbase, const Range<Dim> &domain);
  void viewInit(const This_t &bvbase, const Interval<Dim> &domain)
  {
    for (int d = 0; d < Dim; ++d)
    {
      domain_m[d] = Interval<1>(domain[d].length());
      strides_m[d] = bvbase.ostrides_m[d];
      ostrides_m[d] = strides_m[d];
      baseOffset_m += domain[d].first() * bvbase.ostrides_m[d];
    }
  }
  void viewInit(const BrickBase<Dim> &bbase, const Interval<Dim> &domain)
  {
    for (int d = 0; d < Dim; ++d)
    {
      domain_m[d] = Interval<1>(domain[d].length());
      strides_m[d] = bbase.originalStrides()[d];
      ostrides_m[d] = strides_m[d];
      baseOffset_m += domain[d].first() * bbase.originalStrides()[d];
    }
  }
  Domain_t domain_m;
  int strides_m[Dim];
  int ostrides_m[Dim];
  int baseOffset_m;
  bool compressibleBase_m;
};
template <int Dim>
void
BrickViewBase<Dim>::
viewInit(const This_t &bvbase, const Range<Dim> &domain)
{
  for (int d = 0; d < Dim; ++d)
    {
      domain_m[d] = Interval<1>(domain[d].length());
      strides_m[d] = bvbase.ostrides_m[d] * domain[d].stride();
      baseOffset_m += domain[d].first() * bvbase.ostrides_m[d];
    }
  for (int d = 0; d < Dim; ++d)
    ostrides_m[d] = strides_m[d];
}
template <int Dim>
void
BrickViewBase<Dim>::
viewInit(const BrickBase<Dim> &bbase, const Range<Dim> &domain)
{
  for (int d = 0; d < Dim; ++d)
  {
    domain_m[d] = Interval<1>(domain[d].length());
    strides_m[d] = bbase.originalStrides()[d] * domain[d].stride();
    ostrides_m[d] = strides_m[d];
    baseOffset_m += domain[d].first() * bbase.originalStrides()[d];
  }
}
template <int Dim>
template<int BaseDim>
void
BrickViewBase<Dim>::
sliceInit(const int *baseStrides,
   const SliceRange<BaseDim,Dim> &dom)
{
  typedef typename SliceRange<BaseDim,Dim>::TotalDomain_t TotalDomain_t;
  const TotalDomain_t &domain = dom.totalDomain();
  int d = 0;
  for (int dt = 0; dt < BaseDim; ++dt)
  {
    if (!dom.ignorable(dt))
    {
      ;
      domain_m[d] = Interval<1>(domain[dt].length());
      strides_m[d] = baseStrides[dt] * domain[dt].stride();
      ++d;
    }
    baseOffset_m += domain[dt].first() * baseStrides[dt];
  }
  ;
  for (int d = 0; d < Dim; ++d)
    ostrides_m[d] = strides_m[d];
}
template <int Dim>
template<int SliceDim>
void
BrickViewBase<Dim>::
sliceInit(const int *baseStrides,
   const SliceInterval<Dim,SliceDim> &dom,
   const Interval<Dim> &domain)
{
  int dt = 0;
  for (int d = 0; d < Dim; ++d)
  {
    domain_m[d] = Interval<1>(domain[d].length());
    if (!dom.ignorable(d))
    {
      ;
      strides_m[d] = baseStrides[dt];
      baseOffset_m += domain[dt].first() * baseStrides[dt];
      ++dt;
    } else {
      strides_m[d] = 0;
    }
  }
  ;
  for (int d = 0; d < Dim; ++d)
    ostrides_m[d] = strides_m[d];
}
template <int Dim>
template<int SliceDim>
void
BrickViewBase<Dim>::
sliceInit(const BrickViewBase<SliceDim>& bvbase,
   const SliceInterval<Dim,SliceDim> &dom,
   const Interval<Dim> &domain)
{
  int dt = 0;
  for (int d = 0; d < Dim; ++d)
  {
    domain_m[d] = Interval<1>(domain[d].length());
    if (!dom.ignorable(d))
    {
      ;
      strides_m[d] = bvbase.originalStrides()[dt];
      baseOffset_m += domain[dt].first() * bvbase.originalStrides()[dt];
      ++dt;
    } else {
      strides_m[d] = 0;
    }
  }
  ;
  for (int d = 0; d < Dim; ++d)
    ostrides_m[d] = strides_m[d];
}
template <int Dim>
template<int BaseDim>
void
BrickViewBase<Dim>::
sliceInit(const BrickViewBase<BaseDim>& bvbase, const SliceRange<BaseDim, Dim>& dom)
{
  typedef typename SliceRange<BaseDim,Dim>::TotalDomain_t TotalDomain_t;
  const TotalDomain_t &totDomain = dom.totalDomain();
  int d, dt;
  for (dt = 0, d = 0; dt < BaseDim; ++dt)
    {
      if (!dom.ignorable(dt))
        {
          ;
          domain_m[d] = Interval<1>(totDomain[dt].length());
          strides_m[d] = bvbase.originalStrides()[dt] * totDomain[dt].stride();
          ++d;
        }
      baseOffset_m += totDomain[dt].first() * bvbase.originalStrides()[dt];
    }
  ;
  for (int d = 0; d < Dim; ++d)
    ostrides_m[d] = strides_m[d];
}
}
class Inform;
namespace Pooma {
class StatisticsData
{
  friend class Statistics;
public:
  const std::string &description() const { return data_m.first; }
  long value() const { return data_m.second; }
  void increment(long val = 1) { data_m.second += val; }
private:
  StatisticsData(const char *description, long initialValue = 0)
  : data_m(description, initialValue)
  { }
  ~StatisticsData() { }
  std::pair<std::string, long> data_m;
};
class Statistics {
private:
  static long defaultFilter(long val);
public:
  Statistics();
  ~Statistics();
  void print(Inform &, long (*filter)(long) = defaultFilter);
  StatisticsData *add(const char *description, long initval = 0)
  {
    StatisticsData *sd = new StatisticsData(description, initval);
    statList_m.push_back(sd);
    return sd;
  }
private:
  std::vector<StatisticsData *> statList_m;
};
}
template <class T> class SingleObserver;
template <class T>
class CompressibleBlock
{
public:
  typedef CompressibleBlock<T> This_t;
  typedef T Element_t;
  typedef Pooma::DataObject_t DataObject_t;
  enum Notifier
  {
    notifyDestruct = 0,
    notifyUncompress = 1,
    notifyCompress = 2
  };
  CompressibleBlock()
    : controller_m(0)
  { }
  explicit CompressibleBlock(int size)
    : controller_m(new CompressibleBlockController(size))
  { }
  CompressibleBlock(int size, int affinity)
    : controller_m(new CompressibleBlockController(size,affinity))
  { }
  CompressibleBlock(int size, int affinity, const T& model)
    : controller_m(new CompressibleBlockController(size,affinity,model))
  { }
  CompressibleBlock(const CompressibleBlock &block)
    : controller_m(block.controller_m)
  { }
  ~CompressibleBlock()
  {
    ;
  }
  inline int size() const
  {
    return controller_m.size();
  }
  inline int capacity() const
  {
    return controller_m.capacity();
  }
  inline bool resize(int newsize,
       const typename DataBlockPtr<T>::NoInitTag &)
  {
    return controller_m->resize(newsize,DataBlockPtr<T>::NoInitTag());
  }
  inline void setSize(int newsize)
  {
    controller_m->setSize(newsize);
  }
  inline DataObject_t* dataObject() const
  {
    ;
    return controller_m->dataObject();
  }
  inline int affinity() const
  {
    ;
    return controller_m->dataObject()->affinity();
  }
  inline bool compressed() const
  {
    ;
    return controller_m->compressed();
  }
  inline T* data()
  {
    ;
    return controller_m->data();
  }
  inline void uncompress() const
  {
    ;
    controller_m->uncompress();
  }
  void tryCompress()
  {
    ;
    controller_m->tryCompress();
  }
  inline DataBlockPtr<T> view() const
  {
    ;
    return controller_m->view();
  };
  DataBlockPtr<T> dataBlock() const
  {
    ;
    return controller_m->dataBlock();
  }
  void makeOwnCopy()
  {
    controller_m.makeOwnCopy();
  }
  void invalidate()
  {
    controller_m.invalidate();
  }
  inline bool isControllerPtrValid() const
  {
    return controller_m.isValid();
  }
  inline bool isControllerValid() const
  {
    return controller_m.isValid() && controller_m->isValid();
  }
  inline bool isControllerValidUnlocked() const
  {
    return controller_m.isValid() && controller_m->isValidUnlocked();
  }
  inline bool isShared() const
  {
    return controller_m.isShared();
  }
  bool operator!=(const This_t& a) const
  {
    return controller_m != a.controller_m;
  }
  bool operator==(const This_t& a) const
  {
    return controller_m == a.controller_m;
  }
  void attach(Observer<T*> *o)
  {
    ;
    controller_m->attach(o);
  }
  void detach(Observer<T*> *o)
  {
    ;
    controller_m->detach(o);
  }
  void lock() const
  {
    controller_m->lock();
  }
  void unlock() const
  {
    controller_m->unlock();
  }
  static int randomTries() { return CompressibleBlockController::randomTries(); }
private:
  class CompressibleBlockController
    : public SingleObserver<int>,
      public Observable<T*>,
      public RefCounted
  {
  public:
    typedef CompressibleBlockController This_t;
    typedef T Element_t;
    typedef Pooma::DataObject_t DataObject_t;
    CompressibleBlockController()
      : Observable<T*>(ptr_m),
        size_m(0),
 compressible_m(true),
 ptr_m(0),
 dataObject_m(-1),
 ucOffset_m(-1),
 viewcount_m(0),
 countUncompressed_m(0)
    {
      ElementProperties<T>::construct(&compressedData_m);
      if (Pooma::neverCompress())
        {
          compressible_m = false;
        }
    }
    explicit
    CompressibleBlockController(int size)
      : Observable<T*>(ptr_m),
        compressible_m(true),
        countUncompressed_m(0),
 viewcount_m(0),
 dataObject_m(-1),
        size_m(size),
 ptr_m(&compressedData_m),
 ucOffset_m(-1)
    {
      ElementProperties<T>::construct(&compressedData_m);
      if (Pooma::neverCompress())
        {
          viewcount_m = 1;
          compressible_m = false;
          countUncompressed_m = 1;
          block_m = DataBlockPtr<T>(size_m,dataObject_m);
          ptr_m = block_m.currentPointer();
          block_m.attach(this);
        }
    }
    CompressibleBlockController(int size, int affinity)
      : Observable<T*>(ptr_m),
 compressible_m(true),
        countUncompressed_m(0),
 viewcount_m(0),
 dataObject_m(affinity),
        size_m(size),
 ptr_m(&compressedData_m),
 ucOffset_m(-1)
    {
      ElementProperties<T>::construct(&compressedData_m);
      if (Pooma::neverCompress())
        {
          viewcount_m = 1;
          compressible_m = false;
          countUncompressed_m = 1;
          block_m = DataBlockPtr<T>(size_m,dataObject_m);
          ptr_m = block_m.currentPointer();
          block_m.attach(this);
        }
    }
    CompressibleBlockController(int size, int affinity, const T& value)
      : Observable<T*>(ptr_m),
 compressible_m(true),
        countUncompressed_m(0),
 viewcount_m(0),
 dataObject_m(affinity),
        size_m(size),
 ptr_m(&compressedData_m),
 ucOffset_m(-1)
    {
      ElementProperties<T>::construct(&compressedData_m,value);
      if (Pooma::neverCompress())
        {
          viewcount_m = 1;
          compressible_m = false;
          countUncompressed_m = 1;
          block_m = DataBlockPtr<T>(size_m,value,dataObject_m);
          ptr_m = block_m.currentPointer();
          block_m.attach(this);
        }
    }
    CompressibleBlockController(const CompressibleBlockController& model)
      : Observable<T*>(ptr_m),
        compressible_m(!Pooma::neverCompress()),
 viewcount_m(0),
        dataObject_m(model.dataObject_m.affinity()),
        size_m(model.size_m),
 ucOffset_m(model.ucOffset_m)
    {
      model.lock();
      bool modelCompressed = model.compressed();
      compressedData_m = model.compressedData_m;
      block_m = model.block_m;
      if (!modelCompressed)
 {
   --model.viewcount_m;
 }
      model.unlock();
      if (modelCompressed)
 {
          ;
   ptr_m = &compressedData_m;
   countUncompressed_m = 0;
 }
      else
 {
   block_m.makeOwnCopy();
   ptr_m = block_m.currentPointer();
   block_m.dataObject(&dataObject_m);
   countUncompressed_m = 1;
   ++viewcount_m;
   block_m.attach(this);
 }
      ;
    }
    ~CompressibleBlockController()
    {
      ;
      ;
      ;
      if (!compressed())
 {
   block_m.detach();
 }
    }
    inline size_t size() const
    {
      return block_m.size();
    }
    inline size_t capacity() const
    {
      return block_m.capacity();
    }
    inline void setSize(size_t size)
    {
      size_m = size;
    }
    inline bool resize(size_t newsize,
         const typename DataBlockPtr<T>::NoInitTag &)
    {
      ;
      if (block_m.capacity() >= newsize)
 {
   block_m.resize(newsize, DataBlockPtr<T>::NoInitTag());
   size_m = block_m.size();
 }
      else
 {
   size_t nsize = newsize * sizeof(T);
   size_t n_ext = nsize/sizeof(T);
   DataBlockPtr<T> newdata(n_ext,dataObject_m);
   newdata.resize(newsize, DataBlockPtr<T>::NoInitTag());
          T * pOld = block_m.beginPointer();
          T * pNew = newdata.beginPointer();
          const T * const pEnd = pNew + block_m.size();
          while (pNew != pEnd)
            {
       ElementProperties<T>::construct(pNew++,*pOld++);
            }
   block_m = newdata;
          ptr_m = block_m.currentPointer();
   size_m = newsize;
 }
      return true;
    }
    inline void uncompress()
    {
      lock();
      uncompressUnlocked();
      unlock();
    }
    void uncompressUnlocked()
    {
      if (compressed())
        {
          ;
          ;
   ++countUncompressed_m;
          block_m = DataBlockPtr<T>(size_m,dataObject_m);
   ++viewcount_m;
   ;
          ptr_m = block_m.currentPointer();
          block_m.attach(this);
          T *ptr = block_m.beginPointer();
          const T *const end = block_m.endPointer();
          while (ptr != end)
        {
       ElementProperties<T>::construct(ptr++,compressedData_m);
     }
          Observable<T*>::notify(notifyUncompress);
          ;
        }
    }
    inline void tryCompress()
    {
      if (!Pooma::neverCompress())
        {
          lock();
          tryCompressUnlocked();
          unlock();
        }
    }
    void tryCompressUnlocked()
    {
      if (!compressed() && compressible_m && !Pooma::neverCompress())
        {
          ;
          int size = block_m.size();
          bool failed = false;
          ;
          if (ucOffset_m > -1 && ucOffset_m < size)
            {
              if (block_m[ucOffset_m] != block_m[0]) failed = true;
            }
          if (!failed)
            {
              for (int i = 0; i < randomTries(); ++i)
                {
                  int elem = rand() % size;
                  if (block_m[elem] != block_m[0])
                    {
                      failed = true;
                      ucOffset_m = elem;
                      break;
                    }
                }
            }
          if (!failed)
            {
              const T *const begin = block_m.beginPointer();
              const T *const end = block_m.endPointer();
              const T * ptr;
              for (ptr = begin; ptr != end; ++ptr)
         {
           if (*ptr != *begin) break;
         }
              if (ptr == end)
         {
           block_m.detach();
           block_m.invalidate();
           --viewcount_m;
           ;
           compressedData_m = *begin;
           ptr_m = &compressedData_m;
           Observable<T*>::notify(notifyCompress);
           ;
           return;
         }
       else
         {
           ucOffset_m = ptr - begin;
         }
            }
          ;
        }
    }
    DataBlockPtr<T> view()
    {
      lock();
      if (compressed())
 {
   uncompressUnlocked();
 }
      compressible_m = false;
      unlock();
      return block_m;
    }
    DataBlockPtr<T> dataBlock()
    {
      return block_m;
    }
    inline T* data()
    {
      return ptr_m;
    }
    bool compressed() const
    {
      return ptr_m == &compressedData_m;
    }
    DataObject_t* dataObject()
    {
      return &dataObject_m;
    }
    void lock() const
    {
      mutex_m.lock();
    }
    void unlock() const
    {
      mutex_m.unlock();
    }
    bool isValidUnlocked()
    {
      return compressed() || block_m.isValid();
    }
    bool isValid()
    {
      lock();
      bool valid = isValidUnlocked();
      unlock();
      return valid;
    }
  static int randomTries() { return randomTries_s; }
  private:
    virtual void notify(const int& , const ObserverEvent &event)
    {
      switch (event.event())
      {
        case DataBlockController<T>::addViewEvent:
   viewmutex_m.lock();
   ++viewcount_m;
   viewmutex_m.unlock();
   break;
        case DataBlockController<T>::removeViewEvent:
   viewmutex_m.lock();
   --viewcount_m;
   if (viewcount_m == 1 && !Pooma::neverCompress())
     {
       lock();
       compressible_m = true;
       tryCompressUnlocked();
       unlock();
            }
   viewmutex_m.unlock();
          break;
        default:
          if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Invalid event code sent to CompressibleBlockController::notify()", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/CompressibleBlock.h", 954);
      }
    }
    bool compressible_m;
    int countUncompressed_m;
    DataBlockPtr<T> block_m;
    mutable int viewcount_m;
    mutable Pooma::Mutex_t viewmutex_m;
    DataObject_t dataObject_m;
    int size_m;
    T compressedData_m;
    T *ptr_m;
    int ucOffset_m;
    mutable Pooma::Mutex_t mutex_m;
    enum { randomTries_s = 20 };
  };
  RefCountedPtr<CompressibleBlockController> controller_m;
};
struct CompressibleBrick { };
struct CompressibleBrickView { };
template <int Dim, class T>
class Engine<Dim, T, CompressibleBrickView>;
template <int D1, int D2> class SliceInterval;
template <int D1, int D2> class SliceRange;
template <int Dim, class T>
class Engine<Dim, T, CompressibleBrick>
  : public Pooma::BrickBase<Dim>, public Observer<T*>
{
public:
  typedef Engine<Dim,T,CompressibleBrick> This_t;
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef Pooma::BrickBase<Dim> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef T& ElementRef_t;
  typedef CompressibleBrick Tag_t;
  enum { brick = true };
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = false };
  Engine() : data0_m(0) { }
  explicit Engine(const Domain_t &domain);
  Engine(const Domain_t &domain, const T &elementModel);
  explicit Engine(const Layout_t &layout);
  explicit Engine(const Node<Domain_t> &node);
  Engine(const Engine_t &model);
  ~Engine();
  Engine_t &operator=(const Engine_t &model);
  ElementRef_t operator()(int) const;
  ElementRef_t operator()(int, int) const;
  ElementRef_t operator()(int, int, int) const;
  ElementRef_t operator()(int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int, int) const;
  Element_t read(int) const;
  Element_t read(int, int) const;
  Element_t read(int, int, int) const;
  Element_t read(int, int, int, int) const;
  Element_t read(int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int, int) const;
  ElementRef_t operator()(const Loc<Dim> &) const;
  Element_t read(const Loc<Dim> &) const;
  inline const Domain_t &domain() const
  {
    return this->layout_m.domain();
  }
  Engine_t &makeOwnCopy();
  Pooma::DataObject_t *dataObject() const { return cblock_m.dataObject(); }
  DataBlockPtr<T> dataBlock() const { return cblock_m.view(); }
  CompressibleBlock<T> cblock() const { return cblock_m; }
  bool compressed() const;
  long elementsCompressed() const;
  void tryCompress() { cblock_m.tryCompress(); }
  void uncompress() { cblock_m.uncompress(); }
  T compressedRead() const;
  T& compressedReadWrite() const;
  bool compressedBrickIsWholeView() const { return true; }
private:
  CompressibleBlock<T> cblock_m;
  T *data0_m;
  mutable Pooma::Mutex_t mutex_m;
  inline void lock() const { mutex_m.lock(); }
  inline void unlock() const { mutex_m.unlock(); }
  virtual void notify(T* &data, const ObserverEvent &event);
  void resetDataAndStrides();
  void init();
};
template <int Dim, class T>
class Engine<Dim,T,CompressibleBrickView>
  : public Pooma::BrickViewBase<Dim>, public Observer<T*>
{
public:
  typedef Engine<Dim,T,CompressibleBrickView> This_t;
  typedef Engine<Dim,T,CompressibleBrickView> Engine_t;
  typedef Pooma::BrickViewBase<Dim> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef T& ElementRef_t;
  typedef CompressibleBrickView Tag_t;
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = true };
  enum { multiPatch = false };
  Engine() : data0_m(0) { }
  Engine(const Engine_t &model);
  Engine(const Engine_t &model, const EngineConstructTag &);
  template <class DT>
  Engine(const Engine<Dim,T,CompressibleBrick> &e, const Domain<Dim, DT> &dom)
  : Base_t(e, dom.unwrap()), cblock_m(e.cblock()),
    entire_m(e.domain() == dom.unwrap())
  {
    init();
  }
  template <class Domain>
  Engine(const Engine<Dim,T,CompressibleBrick> &e, const Node<Domain> &node)
    : Base_t(e, node.domain()), cblock_m(e.cblock()),
      entire_m(e.domain() == node.domain())
  {
    init();
  }
  Engine(const Engine<Dim,T,CompressibleBrick> &e, const INode<Dim> &inode)
  : Base_t(e, inode.domain()), cblock_m(e.cblock()),
    entire_m(e.domain() == inode.domain())
  {
    init();
  }
  template <class DT, int Dim2>
  Engine(const Engine<Dim2,T,CompressibleBrick> &e, const SliceDomain<DT> &dom)
  : Base_t(e, dom.unwrap()), cblock_m(e.cblock()),
    entire_m(e.domain() == dom.totalDomain())
  {
    init();
  }
  template <class DT>
  Engine(const This_t &e, const Domain<Dim, DT> &dom)
  : Base_t(e, dom.unwrap()), cblock_m(e.cblock()),
    entire_m(e.entire_m && e.domain() == dom.unwrap())
  {
    init();
  }
  Engine(const This_t &e, const INode<Dim> &inode)
  : Base_t(e, inode.domain()), cblock_m(e.cblock()),
    entire_m(e.entire_m && e.domain() == inode.domain())
  {
    init();
  }
  template <int OrigDim, class DT>
  Engine(const Engine<OrigDim,T,CompressibleBrickView> &e,
  const SliceDomain<DT> &dom)
  : Base_t(e, dom.unwrap()), cblock_m(e.cblock()),
    entire_m(e.entire_m && e.domain() == dom.totalDomain())
  {
    init();
  }
  ~Engine();
  Engine_t &operator=(const Engine_t &model);
  ElementRef_t operator()(int) const;
  ElementRef_t operator()(int, int) const;
  ElementRef_t operator()(int, int, int) const;
  ElementRef_t operator()(int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int, int) const;
  Element_t read(int) const;
  Element_t read(int, int) const;
  Element_t read(int, int, int) const;
  Element_t read(int, int, int, int) const;
  Element_t read(int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int, int) const;
  ElementRef_t operator()(const Loc<Dim> &) const;
  Element_t read(const Loc<Dim> &) const;
  inline const Domain_t &domain() const
  {
    return this->domain_m;
  }
  DataBlockPtr<T> dataBlock() const { return cblock_m.view(); }
  inline
  Pooma::DataObject_t *dataObject() const { return cblock_m.dataObject(); }
  CompressibleBlock<T> cblock() const { return cblock_m; }
  bool compressed() const { return cblock_m.compressed(); }
  T compressedRead() const;
  T& compressedReadWrite() const;
  bool compressedBrickIsWholeView() const { return entire_m; }
  long elementsCompressed() const;
private:
  void lock() const { mutex_m.lock(); }
  void unlock() const { mutex_m.unlock(); }
  virtual void notify(T* &data, const ObserverEvent &event)
  {
    switch (event.event())
      {
      default:
      case CompressibleBlock<T>::notifyDestruct:
 ;
 break;
      case CompressibleBlock<T>::notifyUncompress:
        lock();
        this->restoreStrides();
 data0_m = data + this->baseOffset();
 unlock();
 break;
      case CompressibleBlock<T>::notifyCompress:
        lock();
        this->zeroStrides();
 data0_m = data;
 unlock();
 break;
      }
  }
  void init()
  {
    cblock_m.lock();
    resetDataAndStrides();
    ;
    cblock_m.attach(this);
    cblock_m.unlock();
  }
  void resetDataAndStrides()
  {
    if (cblock_m.compressed())
      {
        this->zeroStrides();
 data0_m = cblock_m.data();
      }
    else
      {
        this->restoreStrides();
 data0_m = cblock_m.data() + this->baseOffset();
      }
  }
  CompressibleBlock<T> cblock_m;
  T *data0_m;
  bool entire_m;
  mutable Pooma::Mutex_t mutex_m;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrick>, Interval<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrick>, Range<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrick>,Node<Interval<Dim> > >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrick>,INode<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>, Interval<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>, Range<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>,
                 Node<Interval<Dim> > >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>,INode<Dim> >
{
  typedef Engine<Dim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,CompressibleBrick>,SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,CompressibleBrick>,SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>,
                 SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,CompressibleBrickView>,
                 SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,CompressibleBrickView> Type_t;
};
template <int Dim, class T>
struct ElementProperties<Engine<Dim, T, CompressibleBrick> >
  : public MakeOwnCopyProperties<Engine<Dim, T, CompressibleBrick> >
{ };
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(const Loc<Dim> &loc) const
{
  return data0_m[this->offsetC(loc)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1) const
{
  ;
  return data0_m[this->offsetC(i1)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2) const
{
  ;
  return data0_m[this->offsetC(i1,i2)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2, int i3) const
{
  ;
  return data0_m[this->offsetC(i1,i2,i3)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2, int i3, int i4) const
{
  ;
  return data0_m[this->offsetC(i1,i2,i3,i4)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  return data0_m[this->offsetC(i1,i2,i3,i4,i5)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  return data0_m[this->offsetC(i1,i2,i3,i4,i5,i6)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrick>::
read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  return data0_m[this->offsetC(i1,i2,i3,i4,i5,i6,i7)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(const Loc<Dim> &loc) const
{
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(loc)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2, int i3) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2,i3)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2, int i3, int i4) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2,i3,i4)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2,i3,i4,i5)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2,i3,i4,i5,i6)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrick>::
operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offsetC(i1,i2,i3,i4,i5,i6,i7)];
}
template <int Dim, class T>
inline bool
Engine<Dim,T,CompressibleBrick>::
compressed() const
{
  ;
  return cblock_m.compressed();
}
template <int Dim, class T>
inline T
Engine<Dim,T,CompressibleBrick>::
compressedRead() const
{
  ;
  ;
  return *data0_m;
}
template <int Dim, class T>
inline T&
Engine<Dim,T,CompressibleBrick>::
compressedReadWrite() const
{
  ;
  ;
  return *data0_m;
}
template <int Dim, class T>
inline bool compressed(const Engine<Dim, T, CompressibleBrick> &e)
{
  return e.compressed();
}
template <int Dim, class T>
inline long elementsCompressed(const Engine<Dim, T, CompressibleBrick> &e)
{
  return e.elementsCompressed();
}
template <int Dim, class T>
inline void compress(Engine<Dim, T, CompressibleBrick> &e)
{
  e.tryCompress();
}
template <int Dim, class T>
inline void uncompress(Engine<Dim, T, CompressibleBrick> &e)
{
  e.uncompress();
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(const Loc<Dim> &loc) const
{
  return data0_m[this->offset(loc)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1) const
{
  ;
  return data0_m[this->offset(i1)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2) const
{
  ;
  return data0_m[this->offset(i1,i2)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2, int i3) const
{
  ;
  return data0_m[this->offset(i1,i2,i3)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2, int i3, int i4) const
{
  ;
  return data0_m[this->offset(i1,i2,i3,i4)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  return data0_m[this->offset(i1,i2,i3,i4,i5)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  return data0_m[this->offset(i1,i2,i3,i4,i5,i6)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  return data0_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(const Loc<Dim> &loc) const
{
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(loc)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2, int i3) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2,i3)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2, int i3, int i4) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2,i3,i4)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2,i3,i4,i5)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2,i3,i4,i5,i6)];
}
template <int Dim, class T>
inline T & Engine<Dim,T,CompressibleBrickView>::
operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  if (cblock_m.compressed()) cblock_m.uncompress();
  return data0_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
}
template <int Dim, class T>
inline T Engine<Dim,T,CompressibleBrickView>::
compressedRead() const
{
  ;
  return *data0_m;
}
template <int Dim, class T>
inline T& Engine<Dim,T,CompressibleBrickView>::
compressedReadWrite() const
{
  ;
  return *data0_m;
}
template <int Dim, class T>
inline
bool compressed(const Engine<Dim,T,CompressibleBrickView> &e)
{
  return e.compressed();
}
template <int Dim, class T>
inline
long elementsCompressed(const Engine<Dim,T,CompressibleBrickView> &e)
{
  return e.elementsCompressed();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::Engine(const Domain_t &domain)
  : Base_t(domain), cblock_m(domain.size())
{
  init();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::Engine(const Node<Domain_t> &node)
  : Base_t(node.allocated()),
    cblock_m(node.allocated().size(), node.affinity())
{
  init();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::Engine(const Layout_t &layout)
  : Base_t(layout.domain()), cblock_m(layout.domain().size())
{
  init();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::Engine(const Domain_t &domain, const T& model)
  : Base_t(domain), cblock_m(domain.size(),-1,model)
{
  init();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::
Engine(const Engine<Dim,T,CompressibleBrick> &modelEngine)
  : cblock_m(modelEngine.cblock_m)
{
  cblock_m.lock();
  data0_m = modelEngine.data0_m;
  Base_t::operator=(modelEngine);
  if (cblock_m.isControllerValidUnlocked()) cblock_m.attach(this);
  cblock_m.unlock();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick> &
Engine<Dim,T,CompressibleBrick>::
operator=(const Engine<Dim,T,CompressibleBrick> &modelEngine)
{
  if (this != &modelEngine)
    {
      ;
      modelEngine.cblock_m.lock();
      if (cblock_m.isControllerPtrValid())
        {
          cblock_m.lock();
          if (cblock_m.isControllerValidUnlocked())
            {
              cblock_m.detach(this);
            }
          cblock_m.unlock();
        }
      cblock_m = modelEngine.cblock_m;
      lock();
      data0_m = modelEngine.data0_m;
      Base_t::operator=(modelEngine);
      unlock();
      if (cblock_m.isControllerValidUnlocked()) cblock_m.attach(this);
      cblock_m.unlock();
    }
  return *this;
}
template <int Dim, class T>
void Engine<Dim,T,CompressibleBrick>::init()
{
  resetDataAndStrides();
  ;
  cblock_m.attach(this);
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick>::~Engine()
{
  if (data0_m)
    {
      cblock_m.lock();
      if (cblock_m.isControllerValidUnlocked())
        {
          cblock_m.detach(this);
        }
      cblock_m.unlock();
    }
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrick> &Engine<Dim,T,CompressibleBrick>::makeOwnCopy()
{
  if (cblock_m.isControllerValidUnlocked() && cblock_m.isShared())
    {
      cblock_m.detach(this);
      cblock_m.makeOwnCopy();
      cblock_m.attach(this);
      data0_m = cblock_m.data() + (cblock_m.compressed() ? 0 : this->baseOffset());
    }
  return *this;
}
template <int Dim, class T>
void Engine<Dim,T,CompressibleBrick>::
notify(T* &data, const ObserverEvent &event)
{
  switch (event.event())
    {
    default:
    case CompressibleBlock<T>::notifyDestruct:
      ;
      break;
    case CompressibleBlock<T>::notifyUncompress:
      lock();
      this->restoreStrides();
      data0_m = data + this->baseOffset();
      unlock();
      break;
    case CompressibleBlock<T>::notifyCompress:
      lock();
      this->zeroStrides();
      data0_m = data;
      unlock();
      break;
    }
}
template <int Dim, class T>
void Engine<Dim,T,CompressibleBrick>::resetDataAndStrides()
{
  if (cblock_m.compressed())
    {
      this->zeroStrides();
      data0_m = cblock_m.data();
    }
  else
    {
      this->restoreStrides();
      data0_m = cblock_m.data() + this->baseOffset();
    }
}
template <int Dim, class T>
long Engine<Dim,T,CompressibleBrick>::
elementsCompressed() const
{
  if (compressed())
    return domain().size();
  else
    return 0L;
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrickView>::
~Engine()
{
  cblock_m.lock();
  if (cblock_m.isControllerValidUnlocked())
    {
      cblock_m.detach(this);
    }
  cblock_m.unlock();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrickView> &
Engine<Dim,T,CompressibleBrickView>::
operator=(const Engine<Dim,T,CompressibleBrickView> &modelEngine)
{
  if (this != &modelEngine)
    {
      ;
      modelEngine.cblock_m.lock();
      if (cblock_m.isControllerPtrValid())
        {
          cblock_m.lock();
          if (cblock_m.isControllerValidUnlocked())
            {
              cblock_m.detach(this);
            }
          cblock_m.unlock();
        }
      cblock_m = modelEngine.cblock_m;
      entire_m = modelEngine.entire_m;
      lock();
      data0_m = modelEngine.data0_m;
      Base_t::operator=(modelEngine);
      unlock();
      if (cblock_m.isControllerValidUnlocked()) cblock_m.attach(this);
      cblock_m.unlock();
    }
  return *this;
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrickView>::
Engine(const Engine<Dim,T,CompressibleBrickView> &modelEngine)
  : cblock_m(modelEngine.cblock_m),
    entire_m(modelEngine.entire_m)
{
  cblock_m.lock();
  data0_m = modelEngine.data0_m;
  Base_t::operator=(modelEngine);
  if (cblock_m.isControllerValidUnlocked()) cblock_m.attach(this);
  cblock_m.unlock();
}
template <int Dim, class T>
Engine<Dim,T,CompressibleBrickView>::
Engine(const Engine<Dim,T,CompressibleBrickView> &modelEngine,
       const EngineConstructTag &)
  : cblock_m(modelEngine.cblock_m),
    entire_m(modelEngine.entire_m)
{
  cblock_m.lock();
  data0_m = modelEngine.data0_m;
  Base_t::operator=(modelEngine);
  if (cblock_m.isControllerValidUnlocked()) cblock_m.attach(this);
  cblock_m.unlock();
}
template <int Dim, class T>
long Engine<Dim,T,CompressibleBrickView>::
elementsCompressed() const
{
  if (compressed())
    return domain().size();
  else
    return 0L;
}
template <int Dim> class Range;
struct Brick {};
struct BrickView {};
struct BrickViewU {};
template <int Dim, class T>
class Engine<Dim,T,BrickView>;
template <int Dim, class T>
class Engine<Dim,T,Brick> : public Pooma::BrickBase<Dim>
{
public:
  typedef Engine<Dim,T,Brick> This_t;
  typedef Engine<Dim,T,Brick> Engine_t;
  typedef Pooma::BrickBase<Dim> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef T& ElementRef_t;
  typedef Brick Tag_t;
  enum { brick = true };
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = false };
  Engine() { }
  explicit Engine(const Domain_t &domain);
  Engine(const Domain_t &domain, const T &elementModel);
  explicit Engine(const Layout_t &layout);
  explicit Engine(const Node<Domain_t> &node);
  Engine(T * foreignData, const Domain_t &domain);
  Engine(const This_t &model)
    : Base_t(model), dataBlock_m(model.dataBlock_m),
      data_m(model.data_m)
  {}
  ~Engine() {}
  This_t &operator=(const This_t &model)
  {
    if (this == &model)
      return *this;
    Base_t::operator=(model);
    dataBlock_m = model.dataBlock_m;
    data_m = model.data_m;
    ;
    return *this;
  }
  Element_t read(const Loc<Dim> &loc) const
  {
    return data_m[this->offset(loc)];
  }
  ElementRef_t operator()(const Loc<Dim> &loc) const
  {
    return data_m[this->offset(loc)];
  }
  Element_t read(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offset(i1)];
  }
  Element_t read(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offset(i1,i2)];
  }
  Element_t read(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offset(i1,i2,i3)];
  }
  Element_t read(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offset(i1,i2,i3,i4)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
  }
  ElementRef_t operator()(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offset(i1)];
  }
  ElementRef_t operator()(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offset(i1,i2)];
  }
  ElementRef_t operator()(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offset(i1,i2,i3)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offset(i1,i2,i3,i4)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
  }
  Engine_t &makeOwnCopy();
  inline
  Pooma::DataObject_t *dataObject() const { return dataBlock_m.dataObject(); }
  DataBlockPtr<T> dataBlock() { return dataBlock_m; }
  const DataBlockPtr<T> & dataBlock() const { return dataBlock_m; }
  bool isShared() const { return dataBlock_m.isValid() && dataBlock_m.count() > 1; }
private:
  DataBlockPtr<T> dataBlock_m;
  T *data_m;
};
template <int Dim, class T>
Engine<Dim,T,Brick>::Engine(const Domain_t &dom)
  : Base_t(dom), dataBlock_m(dom.size()), data_m(dataBlock_m.currentPointer())
{ }
template <int Dim, class T>
Engine<Dim,T,Brick>::Engine(const Node<Domain_t> &node)
  : Base_t(node),
    dataBlock_m(node.allocated().size(), node.affinity(),
           typename DataBlockPtr<T>::WithAffinity_t()),
    data_m(dataBlock_m.currentPointer())
{ }
template <int Dim, class T>
Engine<Dim,T,Brick>::Engine(const Layout_t &layout)
  : Base_t(layout), dataBlock_m(layout.domain().size()),
    data_m(dataBlock_m.currentPointer())
{ }
template <int Dim, class T>
Engine<Dim,T,Brick>::Engine(const Domain_t &dom, const T& model)
  : Base_t(dom), dataBlock_m(dom.size(), model),
    data_m(dataBlock_m.currentPointer())
{ }
template <int Dim, class T>
Engine<Dim,T,Brick>::Engine(T * foreignData, const Domain_t &dom)
  : Base_t(dom), dataBlock_m(foreignData, dom.size()),
    data_m(dataBlock_m.currentPointer())
{ }
template <int Dim, class T>
Engine<Dim,T,Brick> &Engine<Dim,T,Brick>::makeOwnCopy()
{
  if (dataBlock_m.isValid() && dataBlock_m.count() > 1)
    {
      ;
      dataBlock_m.makeOwnCopy();
      data_m = dataBlock_m.currentPointer();
    }
  return *this;
}
template <int Dim, class T>
class Engine<Dim,T,BrickView>
 : public Pooma::BrickViewBase<Dim>
{
public:
  typedef Engine<Dim,T,BrickView> This_t;
  typedef Engine<Dim,T,BrickView> Engine_t;
  typedef Pooma::BrickViewBase<Dim> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef T& ElementRef_t;
  typedef BrickView Tag_t;
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = true };
  enum { multiPatch = false };
  Engine()
    : Base_t(), dataBlock_m(), data_m(0)
  {}
  Engine(const This_t &model)
    : Base_t(model), dataBlock_m(model.dataBlock_m),
      data_m(dataBlock_m.currentPointer())
  {}
  Engine(const This_t &model, const EngineConstructTag &)
    : Base_t(model), dataBlock_m(model.dataBlock_m),
      data_m(dataBlock_m.currentPointer())
  {}
  template <class DT>
  Engine(const Engine<Dim,T,Brick> &e, const Domain<Dim, DT> &dom)
  : Base_t(e, dom.unwrap()), dataBlock_m(e.dataBlock(), e.offset(dom.unwrap())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template<int Dim2>
  Engine(const Engine<Dim2,T,Brick> &e, const SliceRange<Dim2,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template<int Dim2>
  Engine(const Engine<Dim2,T,Brick> &e, const SliceInterval<Dim2,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template <int Dim2>
  Engine(const Engine<Dim2,T,Brick> &e, const SliceInterval<Dim,Dim2> &dom,
  const Interval<Dim> &totalDomain)
    : Base_t(e, dom, totalDomain), dataBlock_m(e.dataBlock(), e.offset(dom.sliceDomain())),
      data_m(dataBlock_m.currentPointer())
  {
  }
  template <int Dim2>
  Engine(const Engine<Dim2,T,BrickView> &e, const SliceInterval<Dim,Dim2> &dom,
  const Interval<Dim> &totalDomain)
    : Base_t(e, dom, totalDomain), dataBlock_m(e.dataBlock(), e.offset(dom.sliceDomain())),
      data_m(dataBlock_m.currentPointer())
  {
  }
  template <int Dim2>
  Engine(const Engine<Dim2,T,BrickViewU> &e, const SliceInterval<Dim,Dim2> &dom,
  const Interval<Dim> &totalDomain)
    : Base_t(e, dom, totalDomain), dataBlock_m(e.dataBlock(), e.offset(dom.sliceDomain())),
      data_m(dataBlock_m.currentPointer())
  {
  }
  template <class DT>
  Engine(const This_t &e, const Domain<Dim, DT> &d)
    : Base_t(e, d.unwrap()), dataBlock_m(e.dataBlock(), e.offset(d.unwrap())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <class DT>
  Engine(const Engine<Dim,T,BrickViewU> &e, const Domain<Dim, DT> &d)
    : Base_t(e, d.unwrap()), dataBlock_m(e.dataBlock(), e.offset(d.unwrap())),
    data_m(dataBlock_m.currentPointer())
  { }
  Engine(const This_t &e, const INode<Dim> &inode)
    : Base_t(e,inode.domain()), dataBlock_m(e.dataBlock(), e.offset(inode.domain())),
    data_m(dataBlock_m.currentPointer())
  { }
  Engine(const Engine<Dim,T,BrickViewU> &e, const INode<Dim> &inode)
    : Base_t(e,inode.domain()), dataBlock_m(e.dataBlock(), e.offset(inode.domain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickView> &e,
         const SliceRange<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickViewU> &e,
         const SliceRange<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickView> &e,
  const SliceInterval<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickViewU> &e,
    const SliceInterval<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  explicit Engine(const Engine<Dim,T,CompressibleBrick> &);
  explicit Engine(const Engine<Dim,T,CompressibleBrickView> &);
  ~Engine() {}
  This_t &operator=(const This_t &model)
  {
    if (this == &model)
      return *this;
    Base_t::operator=(model);
    dataBlock_m = model.dataBlock_m;
    data_m = model.data_m;
    return *this;
  }
  Element_t read(const Loc<Dim> &loc) const
  {
    return data_m[this->offset(loc)];
  }
  ElementRef_t operator()(const Loc<Dim> &loc) const
  {
    return data_m[this->offset(loc)];
  }
  Element_t read(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offset(i1)];
  }
  Element_t read(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offset(i1,i2)];
  }
  Element_t read(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offset(i1,i2,i3)];
  }
  Element_t read(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offset(i1,i2,i3,i4)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
  }
  ElementRef_t operator()(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offset(i1)];
  }
  ElementRef_t operator()(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offset(i1,i2)];
  }
  ElementRef_t operator()(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offset(i1,i2,i3)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offset(i1,i2,i3,i4)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offset(i1,i2,i3,i4,i5,i6,i7)];
  }
  DataBlockPtr<T> dataBlock() { return dataBlock_m; }
  const DataBlockPtr<T> &dataBlock() const { return dataBlock_m; }
  inline
  Pooma::DataObject_t *dataObject() const { return dataBlock_m.dataObject(); }
private:
  DataBlockPtr<T> dataBlock_m;
  T *data_m;
};
template <int Dim, class T>
Engine<Dim,T,BrickView>::
Engine(const Engine<Dim,T,CompressibleBrick> &model)
  : Base_t(model, false)
{
  dataBlock_m = DataBlockPtr<T>(model.dataBlock(),this->baseOffset());
  data_m = dataBlock_m.currentPointer();
}
template <int Dim, class T>
Engine<Dim,T,BrickView>::
Engine(const Engine<Dim,T,CompressibleBrickView> &model)
  : Base_t(model, false)
{
  dataBlock_m = DataBlockPtr<T>(model.dataBlock(),this->baseOffset());
  data_m = dataBlock_m.currentPointer();
}
template <int Dim, class T>
class Engine<Dim,T,BrickViewU>
 : public Pooma::BrickViewBase<Dim>
{
public:
  typedef Engine<Dim,T,BrickViewU> This_t;
  typedef Engine<Dim,T,BrickViewU> Engine_t;
  typedef Pooma::BrickViewBase<Dim> Base_t;
  typedef typename Base_t::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef T& ElementRef_t;
  typedef BrickViewU Tag_t;
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = true };
  enum { multiPatch = false };
  Engine()
    : Base_t(), dataBlock_m(), data_m(0)
  {}
  Engine(const This_t &model)
    : Base_t(model), dataBlock_m(model.dataBlock_m),
      data_m(dataBlock_m.currentPointer())
  {}
  Engine(const This_t &model, const EngineConstructTag &)
    : Base_t(model), dataBlock_m(model.dataBlock_m),
      data_m(dataBlock_m.currentPointer())
  {}
  template <class ETag, class DT>
  Engine(const Engine<Dim,T,ETag> &e, const Domain<Dim, DT> &dom)
  : Base_t(e, dom.unwrap()), dataBlock_m(e.dataBlock(), e.offset(dom.unwrap())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template<int Dim2>
  Engine(const Engine<Dim2,T,Brick> &e, const SliceRange<Dim2,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template<int Dim2>
  Engine(const Engine<Dim2,T,Brick> &e, const SliceInterval<Dim2,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  {
    ;
  }
  template <class DT>
  Engine(const This_t &e, const Domain<Dim, DT> &d)
    : Base_t(e, d.unwrap()), dataBlock_m(e.dataBlock(), e.offset(d.unwrap())),
    data_m(dataBlock_m.currentPointer())
  { }
  Engine(const This_t &e, const INode<Dim> &inode)
    : Base_t(e,inode.domain()), dataBlock_m(e.dataBlock(), e.offset(inode.domain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickView> &e,
         const SliceRange<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  template <int ODim>
  Engine(const Engine<ODim,T,BrickViewU> &e,
    const SliceInterval<ODim,Dim> &dom)
    : Base_t(e, dom), dataBlock_m(e.dataBlock(), e.offset(dom.totalDomain())),
    data_m(dataBlock_m.currentPointer())
  { }
  explicit Engine(const Engine<Dim,T,CompressibleBrick> &);
  explicit Engine(const Engine<Dim,T,CompressibleBrickView> &);
  ~Engine() {}
  This_t &operator=(const This_t &model)
  {
    if (this == &model)
      return *this;
    Base_t::operator=(model);
    dataBlock_m = model.dataBlock_m;
    data_m = model.data_m;
    return *this;
  }
  Element_t read(const Loc<Dim> &loc) const
  {
    return data_m[this->offsetU(loc)];
  }
  ElementRef_t operator()(const Loc<Dim> &loc) const
  {
    return data_m[this->offsetU(loc)];
  }
  Element_t read(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offsetU(i1)];
  }
  Element_t read(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offsetU(i1,i2)];
  }
  Element_t read(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offsetU(i1,i2,i3)];
  }
  Element_t read(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5,i6)];
  }
  Element_t read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5,i6,i7)];
  }
  ElementRef_t operator()(int i1) const
  {
    PoomaCTAssert<(Dim == 1)>::test();
    return data_m[this->offsetU(i1)];
  }
  ElementRef_t operator()(int i1, int i2) const
  {
    PoomaCTAssert<(Dim == 2)>::test();
    return data_m[this->offsetU(i1,i2)];
  }
  ElementRef_t operator()(int i1, int i2, int i3) const
  {
    PoomaCTAssert<(Dim == 3)>::test();
    return data_m[this->offsetU(i1,i2,i3)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4) const
  {
    PoomaCTAssert<(Dim == 4)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5) const
  {
    PoomaCTAssert<(Dim == 5)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
  {
    PoomaCTAssert<(Dim == 6)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5,i6)];
  }
  ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
  {
    PoomaCTAssert<(Dim == 7)>::test();
    return data_m[this->offsetU(i1,i2,i3,i4,i5,i6,i7)];
  }
  DataBlockPtr<T> dataBlock() { return dataBlock_m; }
  const DataBlockPtr<T> &dataBlock() const { return dataBlock_m; }
  inline
  Pooma::DataObject_t *dataObject() const { return dataBlock_m.dataObject(); }
private:
  DataBlockPtr<T> dataBlock_m;
  T *data_m;
};
template <int Dim, class T>
Engine<Dim,T,BrickViewU>::
Engine(const Engine<Dim,T,CompressibleBrick> &model)
  : Base_t(model, false)
{
  dataBlock_m = DataBlockPtr<T>(model.dataBlock(),this->baseOffset());
  data_m = dataBlock_m.currentPointer();
}
template <int Dim, class T>
Engine<Dim,T,BrickViewU>::
Engine(const Engine<Dim,T,CompressibleBrickView> &model)
  : Base_t(model, false)
{
  dataBlock_m = DataBlockPtr<T>(model.dataBlock(),this->baseOffset());
  data_m = dataBlock_m.currentPointer();
}
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,Brick>, Interval<Dim> >
{
  typedef Engine<Dim,T,BrickViewU> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,Brick>, Range<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,Brick>, Node<Interval<Dim> > >
{
  typedef Engine<Dim,T,BrickViewU> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,Brick>, INode<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,Brick>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,Brick>, SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<SliceDim,T,Brick>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<SliceDim,T,BrickView>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<SliceDim,T,BrickViewU>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickView>, Interval<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickView>, Range<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickView>, Node<Interval<Dim> > >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickView>, INode<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,BrickView>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,BrickView>, SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickViewU>, Interval<Dim> >
{
  typedef Engine<Dim,T,BrickViewU> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickViewU>, Range<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickViewU>, Node<Interval<Dim> > >
{
  typedef Engine<Dim,T,BrickViewU> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim,T,BrickViewU>, INode<Dim> >
{
  typedef Engine<Dim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,BrickViewU>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,BrickViewU>, SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,BrickView> Type_t;
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,Brick>, Node<Interval<Dim> > >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,Brick> &,
   const Node<Interval<Dim> > &node)
  {
    return node.domain();
  }
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,Brick>, INode<Dim> >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,Brick> &,
   const INode<Dim> &inode)
  {
    return inode.domain();
  }
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,BrickView>, Node<Interval<Dim> > >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,BrickView> &,
   const Node<Interval<Dim> > &node)
  {
    return node.domain();
  }
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,BrickView>, INode<Dim> >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,BrickView> &,
   const INode<Dim> &inode)
  {
    return inode.domain();
  }
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,BrickViewU>, Node<Interval<Dim> > >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,BrickViewU> &,
   const Node<Interval<Dim> > &node)
  {
    return node.domain();
  }
};
template <int Dim, class T>
struct NewEngineDomain<Engine<Dim,T,BrickViewU>, INode<Dim> >
{
  typedef Interval<Dim> Type_t;
  typedef const Interval<Dim> &Return_t;
  static inline
  Return_t apply(const Engine<Dim,T,BrickViewU> &,
   const INode<Dim> &inode)
  {
    return inode.domain();
  }
};
template <int Dim, class T>
struct ElementProperties<Engine<Dim, T, Brick> >
  : public MakeOwnCopyProperties<Engine<Dim, T, Brick> >
{ };
template <class Expr>
inline bool compressed(const Expr &expr)
{
  return false;
}
template <class Expr>
double compressedFraction(const Expr &expr)
{
  return static_cast<double>(elementsCompressed(expr)) / expr.domain().size();
}
template <class Expr>
inline long elementsCompressed(const Expr &expr)
{
  return 0L;
}
template <class Expr>
inline void compress(Expr &)
{ }
template <class Expr>
inline void uncompress(Expr &)
{ }
struct ConstantFunction
{ };
template<int Dim, class T>
class Engine<Dim, T, ConstantFunction>
{
public:
  typedef ConstantFunction Tag_t;
  typedef Engine<Dim, T, ConstantFunction> This_t;
  typedef This_t Engine_t;
  typedef Interval<Dim> Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  enum { dimensions = Dim };
  enum { hasDataObject = false };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = false };
  Engine() { }
  explicit Engine(const Domain_t &domain, T val = T())
  : val_m(val), domain_m(domain)
  {
    for (int d = 0; d < Dim; ++d)
      firsts_m[d] = domain[d].first();
  }
  template<class Layout>
  explicit Engine(const Layout &layout, T val = T())
  : val_m(val), domain_m(layout.domain())
  {
    for (int d = 0; d < Dim; ++d)
      firsts_m[d] = domain_m[d].first();
  }
  Engine(const Engine<Dim, T, ConstantFunction> &model)
  : val_m(model.constant()), domain_m(model.domain())
  {
    for (int d = 0; d < Dim; ++d)
      {
        firsts_m[d] = model.firsts_m[d];
      }
  }
  template<class DT>
  Engine(const Engine<Dim, T, ConstantFunction> &e, const Domain<Dim, DT> &dom)
  : val_m(e.constant()), domain_m(Pooma::NoInit())
  {
    const typename DT::Domain_t &domain = dom.unwrap();
    for (int d = 0; d < Dim; ++d)
      {
        domain_m[d] = Interval<1>(domain[d].length());
        firsts_m[d] = 0;
      }
  }
  template<int Dim2, class DT>
  Engine(const Engine<Dim2, T, ConstantFunction> &e,
    const SliceDomain<DT> &dom)
  : val_m(e.constant()), domain_m(Pooma::NoInit())
  {
    PoomaCTAssert<(DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<(DT::dimensions == Dim2)>::test();
    const typename DT::SliceDomain_t &domain = dom.sliceDomain();
    for (int d = 0; d < Dim; ++d)
      {
        domain_m[d] = Interval<1>(domain[d].length());
        firsts_m[d] = 0;
      }
  }
  template<class Domain>
  Engine(const Engine<Dim, T, ConstantFunction> &e, const Node<Domain> &node)
  : val_m(e.constant()), domain_m(Pooma::NoInit())
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
    const Domain &domain = node.domain();
    for (int d = 0; d < Dim; ++d)
      {
        domain_m[d] = Interval<1>(domain[d].length());
        firsts_m[d] = 0;
      }
  }
  Engine(const Engine<Dim, T, ConstantFunction> &e, const INode<Dim> &inode)
  : val_m(e.constant()), domain_m(Pooma::NoInit())
  {
    const typename INode<Dim>::Domain_t &domain = inode.domain();
    for (int d = 0; d < Dim; ++d)
      {
        domain_m[d] = Interval<1>(domain[d].length());
        firsts_m[d] = 0;
      }
  }
  inline Element_t read(int) const
    {
      return val_m;
    }
  inline Element_t read(int, int) const
    {
      return val_m;
    }
  inline Element_t read(int, int, int) const
    {
      return val_m;
    }
  inline Element_t read(int, int, int, int) const
    {
      return val_m;
    }
  inline Element_t read(int, int, int, int, int) const
    {
      return val_m;
    }
  inline Element_t read(int, int, int, int, int, int) const
    {
      return val_m;
    }
  inline Element_t read(int, int, int, int, int, int, int) const
    {
      return val_m;
    }
  inline Element_t read(const Loc<Dim> &) const
    {
      return val_m;
    }
  const Domain_t &domain() const { return domain_m; }
  inline Layout_t layout() const { return Layout_t(domain_m); }
  inline int first(int i) const
  {
    ;
    return firsts_m[i];
  }
  T constant() const { return val_m; }
  void setConstant(T val) { val_m = val; }
private:
  T val_m;
  Domain_t domain_m;
  int firsts_m[Dim];
};
template <int Dim, class T>
struct NewEngine<Engine<Dim, T, ConstantFunction>, Interval<Dim> >
{
  typedef Engine<Dim, T, ConstantFunction> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim, T, ConstantFunction>, Range<Dim> >
{
  typedef Engine<Dim, T, ConstantFunction> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,ConstantFunction>, SliceInterval<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,ConstantFunction> Type_t;
};
template <int Dim, class T, int SliceDim>
struct NewEngine<Engine<Dim,T,ConstantFunction>, SliceRange<Dim,SliceDim> >
{
  typedef Engine<SliceDim,T,ConstantFunction> Type_t;
};
template <int Dim, class T, class Domain>
struct NewEngine<Engine<Dim, T, ConstantFunction>, Node<Domain> >
{
  typedef Engine<Dim, T, ConstantFunction> Type_t;
};
template <int Dim, class T>
struct NewEngine<Engine<Dim, T, ConstantFunction>, INode<Dim> >
{
  typedef Engine<Dim, T, ConstantFunction> Type_t;
};
struct ErrorDomain
{
};
struct NullDomain
{
};
template<class D>
bool contains(const NullDomain &, const D &)
{
  return true;
}
template<class Inter>
struct IntersectorTag
{
  inline IntersectorTag(Inter &i) : intersector_m(i) { }
  Inter &intersector_m;
};
template<class Eng, class Intersect>
struct DefaultExpressionApply<Eng, IntersectorTag<Intersect> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const Eng &,
        const ExpressionApply<IntersectorTag<Intersect> > &)
  {
    PoomaCTAssert<(!(Eng::multiPatch))>::test();
    return true;
  }
};
struct AssertEquals
{
  AssertEquals(int ignore = 0) : ignore_m(ignore) { }
  int ignore_m;
};
template<class Op>
struct Combine2<int, int, Op, AssertEquals>
{
  typedef int Type_t;
  inline static
  Type_t combine(const int &a, const int &b, const AssertEquals &ae)
  {
    int ret = a;
    if ((a != ae.ignore_m) && (b != ae.ignore_m))
    {
      ;
    }
    else
    {
      if (b != ae.ignore_m) return ret = b;
    }
    return ret;
  }
};
template<class Thing>
struct View0
{
};
template<class Thing, class Sub>
struct View1
{
};
template<class Thing, class Sub1, class Sub2>
struct View2
{
};
template<class Thing, class Sub1, class Sub2, class Sub3>
struct View3
{
};
template<class Thing, class Sub1, class Sub2, class Sub3, class Sub4>
struct View4
{
};
template<class Thing, class Sub1, class Sub2, class Sub3, class Sub4,
  class Sub5>
struct View5
{
};
template<class Thing, class Sub1, class Sub2, class Sub3, class Sub4,
  class Sub5, class Sub6>
struct View6
{
};
template<class Thing, class Sub1, class Sub2, class Sub3, class Sub4,
  class Sub5, class Sub6, class Sub7>
struct View7
{
};
template<class Components, class Object>
struct ComponentView;
struct EnginePatch
{
  typedef TreeCombine Combine_t;
  typedef int PatchID_t;
  explicit EnginePatch(PatchID_t patch) : patch_m(patch) { }
  PatchID_t patch_m;
};
template<class Eng>
struct EngineFunctorDefault<Eng, EnginePatch>
{
  typedef Eng Type_t;
  inline static
  const Type_t &apply(const Eng &e, const EnginePatch &)
  {
    PoomaCTAssert<(!(Eng::multiPatch))>::test();
    return e;
  }
};
template<class T>
struct LeafFunctor<Scalar<T>, EnginePatch>
{
  typedef Scalar<T> Type_t;
  inline static
  Type_t apply(const Scalar<T> &scalar, const EnginePatch &)
  {
    return scalar;
  }
};
template<class Container>
struct Patch
{
};
template<class Container>
struct PatchView
{
  typedef typename Patch<Container>::Type_t Patch_t;
  typedef typename Patch_t::Domain_t Dom_t;
  typedef typename View1<Patch_t, Dom_t>::Type_t Type_t;
  inline static
  Type_t make(const Container &subject, int i)
  {
    return subject.patchLocal(i)();
  }
};
template<class Node>
struct LeafFunctor<Node, EnginePatch>
{
  typedef typename PatchView<Node>::Type_t Type_t;
  inline static
  Type_t apply(const Node &node, const EnginePatch &tag)
  {
    return node.patchLocal(tag.patch_m)();
  }
};
struct EngineNumPatches
{
  typedef AssertEquals Combine_t;
};
template<class Eng>
struct EngineFunctorDefault<Eng, EngineNumPatches>
{
  typedef int Type_t;
  inline static
  Type_t apply(const Eng &, const EngineNumPatches &)
  {
    PoomaCTAssert<(!(Eng::multiPatch))>::test();
    return 1;
  }
};
template<class T>
struct EngineFunctorScalar<T, EngineNumPatches>
{
  typedef int Type_t;
  inline static
  Type_t apply(const T &, const EngineNumPatches &)
  {
    return 0;
  }
};
template <int Dim>
class DomainLayout;
template<int Dim>
struct EvalLeaf { };
template<class T, int Dim>
struct LeafFunctor<Scalar<T>, EvalLeaf<Dim> >
{
  typedef T Type_t;
  inline static
  Type_t apply(const Scalar<T> &s, const EvalLeaf<Dim> &)
    {
      return s.value();
    }
};
template<int Dim, class T, class E>
struct LeafFunctor<Engine<Dim, T, E>, EvalLeaf<Dim> >
{
  typedef T Type_t;
  inline static
  Type_t apply(const Engine<Dim, T, E> &e, const EvalLeaf<Dim> &t)
  {
    return t.eval(e);
  }
};
template<>
struct EvalLeaf<1>
{
  int i1_m;
  inline EvalLeaf(int i1)
    : i1_m(i1)
  { }
  inline EvalLeaf(const Loc<1> &loc)
    : i1_m(loc[0].first())
  { }
  inline int val1() const { return i1_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1());
  }
};
template<>
struct EvalLeaf<2>
{
  int i1_m, i2_m;
  inline EvalLeaf(int i1, int i2)
    : i1_m(i1), i2_m(i2)
  { }
  inline EvalLeaf(const Loc<2> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2());
  }
};
template<>
struct EvalLeaf<3>
{
  int i1_m, i2_m, i3_m;
  inline EvalLeaf(int i1, int i2, int i3)
    : i1_m(i1), i2_m(i2), i3_m(i3)
  { }
  inline EvalLeaf(const Loc<3> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first()), i3_m(loc[2].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2(), val3());
  }
};
template<>
struct EvalLeaf<4>
{
  int i1_m, i2_m, i3_m, i4_m;
  inline EvalLeaf(int i1, int i2, int i3, int i4)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4)
  { }
  inline EvalLeaf(const Loc<4> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first()), i3_m(loc[2].first()),
      i4_m(loc[3].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2(), val3(), val4());
  }
};
template<>
struct EvalLeaf<5>
{
  int i1_m, i2_m, i3_m, i4_m, i5_m;
  inline EvalLeaf(int i1, int i2, int i3, int i4, int i5)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5)
  { }
  inline EvalLeaf(const Loc<5> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first()), i3_m(loc[2].first()),
      i4_m(loc[3].first()), i5_m(loc[4].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2(), val3(), val4(), val5());
  }
};
template<>
struct EvalLeaf<6>
{
  int i1_m, i2_m, i3_m, i4_m, i5_m, i6_m;
  inline EvalLeaf(int i1, int i2, int i3, int i4, int i5, int i6)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5), i6_m(i6)
  { }
  inline EvalLeaf(const Loc<6> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first()), i3_m(loc[2].first()),
      i4_m(loc[3].first()), i5_m(loc[4].first()), i6_m(loc[5].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
  inline int val6() const { return i6_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2(), val3(), val4(), val5(), val6());
  }
};
template<>
struct EvalLeaf<7>
{
  int i1_m, i2_m, i3_m, i4_m, i5_m, i6_m, i7_m;
  inline EvalLeaf(int i1, int i2, int i3, int i4, int i5, int i6, int i7)
    : i1_m(i1), i2_m(i2), i3_m(i3), i4_m(i4), i5_m(i5), i6_m(i6), i7_m(i7)
  { }
  inline EvalLeaf(const Loc<7> &loc)
    : i1_m(loc[0].first()), i2_m(loc[1].first()), i3_m(loc[2].first()),
      i4_m(loc[3].first()), i5_m(loc[4].first()), i6_m(loc[5].first()),
      i7_m(loc[6].first())
  { }
  inline int val1() const { return i1_m; }
  inline int val2() const { return i2_m; }
  inline int val3() const { return i3_m; }
  inline int val4() const { return i4_m; }
  inline int val5() const { return i5_m; }
  inline int val6() const { return i6_m; }
  inline int val7() const { return i7_m; }
  template<class Engine>
  inline typename Engine::Element_t eval(const Engine &e) const
  {
    return e.read(val1(), val2(), val3(), val4(), val5(), val6(), val7());
  }
};
template<class Domain>
struct ViewFunctorTag
{
  const Domain &domain_m;
  inline ViewFunctorTag(const Domain &domain) : domain_m(domain) { }
};
template<class T, class Domain>
struct LeafFunctor<Scalar<T>, ViewFunctorTag<Domain> >
{
  typedef Scalar<T> Type_t;
  inline static
  Type_t apply(const Scalar<T> &s, const ViewFunctorTag<Domain> &)
  {
    return s;
  }
};
struct DomainFunctorTag { };
template<class T>
struct LeafFunctor<Scalar<T>, DomainFunctorTag>
{
  typedef NullDomain Type_t;
  inline static
  Type_t apply(const Scalar<T> &, const DomainFunctorTag &)
  {
    return NullDomain();
  }
};
template<class T>
struct LeafFunctor<T, DomainFunctorTag>
{
  typedef typename T::Domain_t Type_t;
  inline static
  Type_t apply(const T &leaf, const DomainFunctorTag &)
  {
    return leaf.domain();
  }
};
template<class Domain1, class Domain2, class Op>
struct Combine2<Domain1, Domain2, Op, DomainFunctorTag>
{
  typedef ErrorDomain Type_t;
  inline static
  Type_t combine(const Domain1 &, const Domain2 &, const DomainFunctorTag &)
  {
    return ErrorDomain();
  }
};
template<class Domain, class Op>
struct Combine2<Domain, Domain, Op, DomainFunctorTag>
{
  typedef Domain Type_t;
  inline static
  Type_t combine(const Domain &a, const Domain &, const DomainFunctorTag &)
  {
    return a;
  }
};
template<class Domain, class Op>
struct Combine2<Domain, NullDomain, Op, DomainFunctorTag>
{
  typedef Domain Type_t;
  inline static
  Type_t combine(const Domain &a, const NullDomain &,
   const DomainFunctorTag &)
  {
    return a;
  }
};
template<class Domain,class Op>
struct Combine2<NullDomain, Domain, Op, DomainFunctorTag>
{
  typedef Domain Type_t;
  inline static
  Type_t combine(const NullDomain &, const Domain &b,
   const DomainFunctorTag &)
    {
      return b;
    }
};
template<class Tag>
struct EngineFunctorTag
{
  EngineFunctorTag() : tag_m() { }
  EngineFunctorTag(const Tag &tag) : tag_m(tag) { }
  inline const Tag &tag() const
  {
    return tag_m;
  }
  Tag tag_m;
};
template<class Expr>
struct ExpressionTag
{
  typedef Expr Expression_t;
};
template<int Dim, class T, class Expr>
class Engine<Dim, T, ExpressionTag<Expr> >
{
public:
  typedef Engine<Dim, T, ExpressionTag<Expr> > Engine_t;
  typedef ExpressionTag<Expr> Tag_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  typedef typename ForEach<Expr, DomainFunctorTag, DomainFunctorTag>::Type_t
    Domain_t;
  typedef Expr Expression_t;
  typedef DomainLayout<Dim> Layout_t;
  enum { dimensions = Dim };
  enum { multiPatch = true };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = true };
  inline Engine(const Expr &expr) : expr_m(expr),
    domain_m(forEach(expr_m, DomainFunctorTag(), DomainFunctorTag())) { }
  inline Engine(const Engine_t &engine) : expr_m(engine.expression()),
    domain_m(engine.domain()) { }
  template<int Dim2, class T2, class Expr2, class Initializer>
  inline Engine(const Engine<Dim2, T2, ExpressionTag<Expr2> > &e,
    const Initializer &i)
  : expr_m(e.expression(), i),
    domain_m(forEach(expr_m, DomainFunctorTag(), DomainFunctorTag()))
    { }
  template<int Dim2, class T2, class Expr2, class I1, class I2>
  inline Engine(const Engine<Dim2, T2, ExpressionTag<Expr2> > &e,
                const I1 &i1, const I2 &i2)
    : expr_m(e.expression(), i1, i2),
      domain_m(forEach(expr_m, DomainFunctorTag(), DomainFunctorTag()))
  { }
  template<class Expr2>
  explicit inline Engine(const Engine<Dim,T,ExpressionTag<Expr2> > &e)
    : expr_m(e.expression()),
      domain_m(forEach(expr_m, DomainFunctorTag(), DomainFunctorTag()))
  { }
  inline const Expression_t &expression() const { return expr_m; }
  inline Expression_t &expression() { return expr_m; }
  Engine_t &makeOwnCopy();
  inline Element_t read(int i0) const
    {
      return forEach(expr_m, EvalLeaf<1>(i0), OpCombine());
    }
  inline Element_t read(int i0, int i1) const
    {
      return forEach(expr_m, EvalLeaf<2>(i0, i1), OpCombine());
    }
  inline Element_t read(int i0, int i1, int i2) const
    {
      return forEach(expr_m, EvalLeaf<3>(i0, i1, i2), OpCombine());
    }
  inline Element_t read(int i0, int i1, int i2, int i3) const
    {
      return forEach(expr_m, EvalLeaf<4>(i0, i1, i2, i3),
        OpCombine());
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4) const
    {
      return forEach(expr_m, EvalLeaf<5>(i0, i1, i2, i3, i4),
        OpCombine());
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4, int i5) const
    {
      return forEach(expr_m, EvalLeaf<6>(i0, i1, i2, i3, i4, i5),
        OpCombine());
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4, int i5,
    int i6) const
    {
      return forEach(expr_m, EvalLeaf<7>(i0, i1, i2, i3, i4, i5, i6),
        OpCombine());
    }
  inline Element_t read(const Loc<Dim> &loc) const
  {
    return forEach(expr_m, EvalLeaf<Dim>(loc), OpCombine());
  }
  inline const Domain_t& domain() const
    {
      return domain_m;
    }
  inline Layout_t layout() const { return Layout_t(domain()); }
  inline int first(int) const
  {
    return 0;
  }
  template<class RequestType>
  inline
  typename DataObjectRequest<RequestType>::Type_t
  dataObjectRequest(const DataObjectRequest<RequestType>& f) const
  {
    typedef DataObjectRequest<RequestType> Tag_t;
    typedef EngineFunctorTag<Tag_t> Functor_t;
    typedef typename Tag_t::Combine_t Combine_t;
    return forEach(expr_m,Functor_t(f),Combine_t());
  }
private:
  Expr expr_m;
  Domain_t domain_m;
};
template<int Dim, class T, class Expr, class Domain>
struct NewEngine<Engine<Dim, T, ExpressionTag<Expr> >, Domain>
{
  typedef ViewFunctorTag<Domain> FTag_t;
  typedef typename ForEach<Expr, FTag_t, TreeCombine>::Type_t ExprView_t;
  typedef Engine<Dim, T, ExpressionTag<ExprView_t> > Type_t;
};
template <int Dim, class T, class Expr, int SliceDim>
struct NewEngine<Engine<Dim, T, ExpressionTag<Expr> >,
  SliceInterval<Dim,SliceDim> >
{
  typedef ViewFunctorTag<SliceInterval<Dim,SliceDim> > FTag_t;
  typedef typename ForEach<Expr, FTag_t, TreeCombine>::Type_t ExprView_t;
  typedef Engine<SliceDim, T, ExpressionTag<ExprView_t> > Type_t;
};
template <int Dim, class T, class Expr, int SliceDim>
struct NewEngine<Engine<Dim,T,ExpressionTag<Expr> >,
  SliceRange<Dim,SliceDim> >
{
  typedef ViewFunctorTag<SliceRange<Dim,SliceDim> > FTag_t;
  typedef typename ForEach<Expr, FTag_t, TreeCombine>::Type_t ExprView_t;
  typedef Engine<SliceDim, T, ExpressionTag<ExprView_t> > Type_t;
};
template<class Node, class Tag>
struct LeafFunctor<Node, EngineFunctorTag<Tag> >
{
};
template<class T, class Tag>
struct LeafFunctor<Scalar<T>, EngineFunctorTag<Tag> >
{
  typedef typename EngineFunctorScalar<T,Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Scalar<T> &scalar, const EngineFunctorTag<Tag> &tag)
  {
    return EngineFunctorScalar<T,Tag>::apply(scalar.value(), tag.tag());
  }
};
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Engine<Dim, T, E>, EngineFunctorTag<Tag> >
{
  typedef Engine<Dim, T, E> Engine_t;
  typedef typename EngineFunctor<Engine_t, Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Engine_t &engine,
        const EngineFunctorTag<Tag> &tag)
  {
    return EngineFunctor<Engine_t, Tag>::apply(engine, tag.tag());
  }
};
template<int Dim, class T, class Expr, class Tag>
struct EngineFunctor<Engine<Dim,T,ExpressionTag<Expr> >,Tag>
{
  typedef EngineFunctorTag<Tag> Functor_t;
  typedef typename Tag::Combine_t Combine_t;
  typedef typename ForEach<Expr,Functor_t,Combine_t>::Type_t Type_t;
  inline static
  Type_t apply(const Engine<Dim, T, ExpressionTag<Expr> > &engine,
        const Tag &tag)
  {
    return forEach(engine.expression(), Functor_t(tag), Combine_t());
  }
};
template<int Dim, class T, class Expr>
struct EngineFunctor<Engine<Dim, T, ExpressionTag<Expr> >, EnginePatch>
{
  typedef typename EnginePatch::Combine_t Combine_t;
  typedef typename ForEach<Expr, EnginePatch, Combine_t>::Type_t NewExpr_t;
  typedef Engine<Dim, T, ExpressionTag<NewExpr_t> > Type_t;
  inline static
  Type_t apply(const Engine<Dim, T, ExpressionTag<Expr> > &engine,
        const EnginePatch &tag)
  {
    return Type_t(forEach(engine.expression(), tag, Combine_t()));
  }
};
template<int Dim, class T, class Expr, class Tag>
struct LeafFunctor<Engine<Dim, T, ExpressionTag<Expr> >, EngineView<Tag> >
{
  typedef EngineView<Tag> Functor_t;
  typedef typename Functor_t::Combine_t Combine_t;
  typedef typename ForEach<Expr, Functor_t, Combine_t>::Type_t NewExpr_t;
  typedef Engine<Dim, T, ExpressionTag<NewExpr_t> > Type_t;
  inline static
  Type_t apply(const Engine<Dim, T, ExpressionTag<Expr> > &engine,
        const EngineView<Tag> &tag)
  {
    return Type_t(forEach(engine.expression(), tag, Combine_t()));
  }
};
template<int Dim, class T, class Expr, class Tag>
struct LeafFunctor<Engine<Dim, T, ExpressionTag<Expr> >, ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const Engine<Dim, T, ExpressionTag<Expr> > &engine,
        const ExpressionApply<Tag> &tag)
  {
    return forEach(engine.expression(), tag, NullCombine());
  }
};
template<class Components>
class ComponentWrapper
{
public:
  explicit ComponentWrapper(const Components &c) : c_m(c) { }
  const Components &components() const { return c_m; }
private:
  const Components &c_m;
};
template<class T, class Components>
struct ComponentAccess
{
  typedef T Element_t;
  typedef T &ElementRef_t;
  static inline ElementRef_t indexRef(T &v, const Components &)
  {
    return v;
  }
  static inline Element_t index(const T &v, const Components &)
  {
    return v;
  }
};
template<class Engine>
struct NotifyEngineWrite
{
  NotifyEngineWrite(){}
 ~NotifyEngineWrite(){}
 inline static void
  notify(const Engine &)
  {
    PoomaCTAssert<(!(Engine::multiPatch))>::test();
  }
};
template<class Engine>
inline
void notifyEngineWrite(const Engine &e)
{
  NotifyEngineWrite<Engine>::notify(e);
}
template<class Engine>
inline
void notifyEngineWrite(const Engine &, const WrappedInt<false> &)
{
}
template<class Engine>
inline
void notifyEngineWrite(const Engine &e, const WrappedInt<true> &)
{
  NotifyEngineWrite<Engine>::notify(e);
}
template <int Dim> class DomainLayout;
template<class Eng, class Components>
struct CompFwd { };
template<int Dim, class T, class Eng, class Components>
class Engine<Dim, T, CompFwd<Eng, Components> >
{
public:
  typedef Engine<Dim, T, Eng> This_t;
  typedef This_t Engine_t;
  typedef Eng ElemEngine_t;
  typedef typename Eng::Element_t FwdElement_t;
  typedef ComponentAccess<FwdElement_t, Components> CompAccess_t;
  typedef typename CompAccess_t::Element_t Element_t;
  typedef typename CompAccess_t::ElementRef_t ElementRef_t;
  typedef typename Eng::Domain_t Domain_t;
  typedef CompFwd<Eng, Components> Tag_t;
  typedef typename Eng::Layout_t Layout_t;
  enum { dimensions = Eng::dimensions };
  enum { hasDataObject = Eng::hasDataObject };
  enum { dynamic = false };
  enum { zeroBased = Eng::zeroBased };
  enum { multiPatch = Eng::multiPatch };
  Engine()
    : engine_m(), components_m()
  { }
  Engine(const Eng &e, const Components &l)
    : engine_m(e), components_m(l)
  { }
  Engine(const This_t &e)
    : engine_m(e.elemEngine()), components_m(e.components()) { }
  template<class OtherEng, class Domain>
  Engine(const Engine< Dim, T, CompFwd<OtherEng, Components> > &e,
  const Domain &domain)
    : engine_m(NewEngineEngine<OtherEng,Domain>::apply(e.elemEngine(),domain),
        NewEngineDomain<OtherEng,Domain>::apply(e.elemEngine(),domain)),
      components_m(e.components()) { }
  ~Engine() { }
  inline ElementRef_t operator()(const Loc<dimensions> &eloc) const
  {
    return CompAccess_t::indexRef(elemEngine()(eloc), components());
  }
  inline ElementRef_t operator()(int i1) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1), components());
  }
  inline ElementRef_t operator()(int i1, int i2) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2), components());
  }
  inline ElementRef_t operator()(int i1, int i2, int i3) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2, i3),
      components());
  }
  inline ElementRef_t operator()(int i1, int i2, int i3, int i4) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2, i3, i4),
      components());
  }
  inline ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2, i3, i4, i5),
      components());
  }
  inline ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5,
     int i6) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2, i3, i4, i5, i6),
      components());
  }
  inline ElementRef_t operator()(int i1, int i2, int i3, int i4, int i5,
     int i6, int i7) const
  {
    return CompAccess_t::indexRef(elemEngine()(i1, i2, i3, i4, i5, i6, i7),
      components());
  }
  inline Element_t read(const Loc<dimensions> &eloc) const
  {
    return CompAccess_t::index(elemEngine().read(eloc), components());
  }
  inline Element_t read(int i1) const
  {
    return CompAccess_t::index(elemEngine().read(i1), components());
  }
  inline Element_t read(int i1, int i2) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2), components());
  }
  inline Element_t read(int i1, int i2, int i3) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2, i3),
          components());
  }
  inline Element_t read(int i1, int i2, int i3, int i4) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2, i3, i4),
          components());
  }
  inline Element_t read(int i1, int i2, int i3, int i4, int i5) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2, i3, i4, i5),
          components());
  }
  inline Element_t read(int i1, int i2, int i3, int i4, int i5,
   int i6) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2, i3, i4, i5, i6),
          components());
  }
  inline Element_t read(int i1, int i2, int i3, int i4, int i5,
   int i6, int i7) const
  {
    return CompAccess_t::index(elemEngine().read(i1, i2, i3, i4, i5, i6, i7),
          components());
  }
  inline const Layout_t& layout() const
  {
    return elemEngine().layout();
  }
  inline Layout_t& layout()
  {
    return elemEngine().layout();
  }
  inline const Domain_t& domain() const { return elemEngine().domain(); }
  inline int first(int i) const
  {
    return elemEngine().first(i);
  }
  This_t &makeOwnCopy()
  {
    elemEngine().makeOwnCopy();
    return *this;
  }
  Eng &elemEngine() { return engine_m; }
  const Eng &elemEngine() const { return engine_m; }
  const Components &components() const { return components_m; }
private:
  Eng engine_m;
  Components components_m;
};
template <int Dim, class T, class Eng, class Components, class Domain>
struct NewEngine<Engine<Dim, T, CompFwd<Eng, Components> >, Domain>
{
  typedef typename NewEngine<Eng, Domain>::Type_t NewEngine_t;
  typedef Engine<NewEngine_t::dimensions, T, CompFwd<NewEngine_t, Components> > Type_t;
};
template<int Dim, class T, class Eng, class Components, class EFTag>
struct EngineFunctor<Engine<Dim, T, CompFwd<Eng, Components> >, EFTag>
{
  typedef typename EngineFunctor<Eng, EFTag>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, CompFwd<Eng, Components> > &engine,
 const EFTag &tag)
  {
    return engineFunctor(engine.elemEngine(), tag);
  }
};
template <int D, class T, class E, class Comp, class Tag>
struct LeafFunctor<Engine<D, T, CompFwd<E, Comp> >, EngineView<Tag> >
{
  typedef LeafFunctor<E, EngineView<Tag> > LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t NewViewed_t;
  typedef Engine<D, T, CompFwd<NewViewed_t, Comp> > Type_t;
  static
  Type_t apply(const Engine<D, T, CompFwd<E, Comp> > &engine,
        const EngineView<Tag> &tag)
  {
    return Type_t(LeafFunctor_t::apply(engine.elemEngine(), tag),
    engine.components());
  }
};
template <int D, class T, class E, class Comp, class Tag>
struct LeafFunctor<Engine<D, T, CompFwd<E, Comp> >, ExpressionApply<Tag> >
{
  typedef LeafFunctor<E, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  static
  Type_t apply(const Engine<D, T, CompFwd<E, Comp> > &engine,
        const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(engine.elemEngine(), tag);
  }
};
template<int Dim, class T, class Eng, class Components>
struct NotifyEngineWrite<Engine<Dim,T,CompFwd<Eng,Components> > >
{
  inline static void
  notify(const Engine<Dim,T,CompFwd<Eng,Components> > &engine)
  {
    typedef typename Engine<Dim, T,
      CompFwd<Eng, Components> >::ElemEngine_t Engine_t;
    NotifyEngineWrite<Engine_t>::notify(engine.elemEngine());
  }
};
template <int D, class T, class E, class Comp>
struct EngineFunctor<Engine<D, T, CompFwd<E, Comp> >, EnginePatch>
{
  typedef typename EngineFunctor<E, EnginePatch>::Type_t NewViewed_t;
  typedef Engine<D, T, CompFwd<NewViewed_t, Comp> > Type_t;
  static
  Type_t apply(const Engine<D, T, CompFwd<E, Comp> > &engine,
        const EnginePatch &tag)
  {
    return Type_t(engineFunctor(engine.elemEngine(), tag),
    engine.components());
  }
};
struct WriteRequest {};
struct ReadRequest {};
struct WriteRelease {};
struct ReadRelease {};
struct CountBlocks {};
template<>
class DataObjectRequest<WriteRequest>
{
public:
  typedef int Type_t;
  typedef NullCombine Combine_t;
  DataObjectRequest(Pooma::Iterate_t& iterate)
    : iterate_m(iterate),
      lhs1_m(NULL), lhs2_m(NULL)
  { }
  inline Type_t operator()(Pooma::DataObject_t* obj) const
  {
    if ((obj != lhs1_m) && (obj != lhs2_m))
    {
      if (lhs1_m == NULL)
      {
 lhs1_m = obj;
      }
      else
      {
 if (lhs2_m == NULL)
 {
   lhs2_m = obj;
 }
 else
 {
   ;
 }
      }
      obj->request(iterate_m,Pooma::SmartsTag_t::Write);
    }
    return 0;
  }
  inline Type_t defaultValue() const
  {
    return 0;
  }
  Pooma::DataObject_t* dataObject1() const { return lhs1_m; }
  Pooma::DataObject_t* dataObject2() const { return lhs2_m; }
  Pooma::Iterate_t& iterate() const { return iterate_m; }
private:
  // LLVM: Remove 'mutable' keyword from iterate_m.
  Pooma::Iterate_t& iterate_m;
  mutable Pooma::DataObject_t* lhs1_m;
  mutable Pooma::DataObject_t* lhs2_m;
};
template<>
class DataObjectRequest<ReadRequest>
{
public:
  typedef int Type_t;
  typedef NullCombine Combine_t;
  DataObjectRequest(const DataObjectRequest<WriteRequest>& write)
    : iterate_m(write.iterate()),
      lhs1_m(write.dataObject1()),
      lhs2_m(write.dataObject2())
  { }
  DataObjectRequest(Pooma::Iterate_t& iterate)
    : iterate_m(iterate),
      lhs1_m(NULL), lhs2_m(NULL)
  { }
  inline Type_t operator()(Pooma::DataObject_t* obj) const
  {
    if ((lhs1_m != obj) && (lhs2_m != obj))
    {
      obj->request(iterate_m, Pooma::SmartsTag_t::Read);
    }
    return 0;
  }
  inline Type_t defaultValue() const
  {
    return 0;
  }
private:
  Pooma::Iterate_t& iterate_m;
  Pooma::DataObject_t* lhs1_m;
  Pooma::DataObject_t* lhs2_m;
};
template<>
class DataObjectRequest<WriteRelease>
{
public:
  typedef int Type_t;
  typedef NullCombine Combine_t;
  DataObjectRequest()
    : lhs1_m(NULL), lhs2_m(NULL)
  { }
  inline Type_t operator()(Pooma::DataObject_t* obj) const
  {
    if ((obj != lhs1_m) && (obj != lhs2_m))
    {
      if (lhs1_m == NULL)
      {
 lhs1_m = obj;
      }
      else
      {
 if (lhs2_m == NULL)
 {
   lhs2_m = obj;
 }
 else
 {
   ;
 }
      }
      obj->release(Pooma::SmartsTag_t::Write);
    }
    return 0;
  }
  inline Type_t defaultValue() const
  {
    return 0;
  }
  Pooma::DataObject_t* dataObject1() const { return lhs1_m; }
  Pooma::DataObject_t* dataObject2() const { return lhs2_m; }
private:
  mutable Pooma::DataObject_t* lhs1_m;
  mutable Pooma::DataObject_t* lhs2_m;
};
template<>
class DataObjectRequest<ReadRelease>
{
public:
  typedef int Type_t;
  typedef NullCombine Combine_t;
  DataObjectRequest()
    : lhs1_m(NULL), lhs2_m(NULL)
  { }
  DataObjectRequest(const DataObjectRequest<WriteRelease>& write)
    : lhs1_m(write.dataObject1()), lhs2_m(write.dataObject2())
  { }
  inline Type_t operator()(Pooma::DataObject_t* obj) const
  {
    if ((lhs1_m != obj) && (lhs2_m != obj))
    {
      obj->release(Pooma::SmartsTag_t::Read);
    }
    return 0;
  }
  inline Type_t defaultValue() const
  {
    return 0;
  }
private:
  Pooma::DataObject_t* lhs1_m;
  Pooma::DataObject_t* lhs2_m;
};
template<>
class DataObjectRequest<CountBlocks>
{
public:
  typedef int Type_t;
  typedef SumCombine Combine_t;
  DataObjectRequest() { }
  inline Type_t operator()(Pooma::DataObject_t*) const
  {
    return 1;
  }
  inline Type_t defaultValue() const
  {
    return 0;
  }
};
template<class Eng, class Tag>
struct DefaultExpressionApply<Eng, DataObjectRequest<Tag> >
{
  enum { hasDataObject = Eng::hasDataObject };
  inline static
  int apply(const Eng &e,
     const ExpressionApply<DataObjectRequest<Tag> > &request)
  {
    DataObjectApply<hasDataObject>::apply(e, request.tag());
    return 0;
  }
};
template<int Dim> class DomainLayout;
template<class A1,class A2>
struct IndirectionTag
{ };
template<int Dim,class T,class A1,class A2>
class Engine<Dim,T,IndirectionTag<A1,A2> >
{
public:
  typedef IndirectionTag<A1,A2> Tag_t;
  typedef Engine<Dim,T,Tag_t> Engine_t;
  typedef typename A1::Element_t Element_t;
  typedef typename A1::ElementRef_t ElementRef_t;
  typedef typename A2::Domain_t Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef typename A1::Engine_t Engine1_t;
  typedef typename A2::Engine_t Engine2_t;
  enum { dimensions = Dim };
  enum { hasDataObject = Engine1_t::hasDataObject ||
  Engine2_t::hasDataObject };
  enum { multiPatch = Engine1_t::multiPatch ||
  Engine2_t::multiPatch };
  enum { dynamic = false };
  enum { zeroBased = Engine2_t::zeroBased };
  inline
  Engine(const A1 &array1,const A2 &array2)
    : array1_m(array1),array2_m(array2)
  {
    PoomaCTAssert<(A2::dimensions == Dim)>::test();
  }
  inline
  Engine(const Engine_t &engine)
    : array1_m(engine.array1()),array2_m(engine.array2())
  { }
  template<int OtherDim,class OtherA2, class Domain>
  inline
  Engine(const Engine<OtherDim,T,IndirectionTag<A1,OtherA2> > &e,
  const Domain &d)
    : array1_m(e.array1()),array2_m(e.array2(),d)
  {
    PoomaCTAssert<(A2::dimensions == Dim)>::test();
  }
  inline const A1 &array1() const { return array1_m; }
  inline A1 &array1() { return array1_m; }
  inline const A2 &array2() const { return array2_m; }
  inline A2 &array2() { return array2_m; }
  inline Element_t read(int i0) const
  {
    return array1_m.read(array2_m.read(i0));
  }
  inline Element_t read(int i0, int i1) const
  {
    return array1_m.read(array2_m.read(i0,i1));
  }
  inline Element_t read(int i0, int i1,int i2) const
  {
    return array1_m.read(array2_m.read(i0,i1,i2));
  }
  inline Element_t read(int i0, int i1,int i2,int i3) const
  {
    return array1_m.read(array2_m.read(i0,i1,i2,i3));
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4) const
  {
    return array1_m.read(array2_m.read(i0,i1,i2,i3,i4));
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4, int i5) const
  {
    return array1_m.read(array2_m.read(i0,i1,i2,i3,i4,i5));
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4, int i5,
   int i6) const
  {
    return array1_m.read(array2_m.read(i0,i1,i2,i3,i4,i5,i6));
  }
  template<class Domain>
  inline Element_t read(const Domain &loc) const
  {
    return array1_m.read(array2_m.read(loc));
  }
  inline ElementRef_t operator()(int i0) const
  {
    return array1_m(array2_m.read(i0));
  }
  inline ElementRef_t operator()(int i0, int i1) const
  {
    return array1_m(array2_m.read(i0,i1));
  }
  inline ElementRef_t operator()(int i0, int i1,int i2) const
  {
    return array1_m(array2_m.read(i0,i1,i2));
  }
  inline ElementRef_t operator()(int i0, int i1,int i2,int i3) const
  {
    return array1_m(array2_m.read(i0,i1,i2,i3));
  }
  inline ElementRef_t operator()(int i0, int i1, int i2, int i3, int i4) const
  {
    return array1_m(array2_m.read(i0,i1,i2,i3,i4));
  }
  inline ElementRef_t operator()(int i0, int i1, int i2, int i3, int i4,
     int i5) const
  {
    return array1_m(array2_m.read(i0,i1,i2,i3,i4,i5));
  }
  inline ElementRef_t operator()(int i0, int i1, int i2, int i3, int i4,
     int i5, int i6) const
  {
    return array1_m(array2_m.read(i0,i1,i2,i3,i4,i5,i6));
  }
  template<class Domain>
  inline ElementRef_t operator()(const Domain &loc) const
  {
    return array1_m(array2_m.read(loc));
  }
  inline const Domain_t& domain() const
  {
    return array2_m.domain();
  }
  inline int first(int i) const
  {
    return array2_m.first(i);
  }
private:
  A1 array1_m;
  A2 array2_m;
};
template<int Dim,class T,class A1,class A2,class Domain>
struct NewEngine<Engine<Dim,T,IndirectionTag<A1,A2> >,Domain>
{
  typedef typename View1<A2,Domain>::Type_t NewA2_t;
  enum { newDim = NewA2_t::dimensions };
  typedef Engine<newDim,T,IndirectionTag<A1,NewA2_t> > Type_t;
};
template<int Dim, class T, class A1, class A2, class RequestType>
struct EngineFunctor<Engine<Dim, T, IndirectionTag<A1, A2> >,
  DataObjectRequest<RequestType> >
{
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  typedef typename DataObjectRequest<RequestType>::Combine_t Combine_t;
  static Type_t
  apply(const Engine<Dim, T, IndirectionTag<A1, A2> > &engine,
 const DataObjectRequest<RequestType> &tag)
  {
    return Combine2<Type_t,Type_t,OpAdd,
      Combine_t>::combine(
     engineFunctor(engine.array1().engine(), tag),
     engineFunctor(engine.array2().engine(), tag),
     Combine_t()
     );
  }
};
template<int Dim, class T, class A1, class A2>
struct EngineFunctor<Engine<Dim, T, IndirectionTag<A1, A2> >,
  DataObjectRequest<WriteRequest> >
{
  typedef typename DataObjectRequest<WriteRequest>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, IndirectionTag<A1, A2> > &engine,
 const DataObjectRequest<WriteRequest> &tag)
  {
    engineFunctor(engine.array1().engine(), tag);
    return engineFunctor(engine.array2().engine(),
    DataObjectRequest<ReadRequest>(tag));
  }
};
template<int Dim, class T, class A1, class A2>
struct EngineFunctor<Engine<Dim, T, IndirectionTag<A1, A2> >,
  DataObjectRequest<WriteRelease> >
{
  typedef typename DataObjectRequest<WriteRelease>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, IndirectionTag<A1, A2> > &engine,
 const DataObjectRequest<WriteRelease> &tag)
  {
    engineFunctor(engine.array1().engine(), tag);
    return engineFunctor(engine.array2().engine(),
    DataObjectRequest<ReadRelease>(tag));
  }
};
struct Brick;
struct BrickView;
struct CompressibleBrick;
struct CompressibleBrickView;
template<class Eng, class Components> struct CompFwd;
template<class A1,class A2> struct IndirectionTag;
struct ConstantFunction;
template<class Expr> struct ExpressionTag;
template<class Stencil, class Expression> struct StencilEngine;
struct Compressible
{
  typedef AndCombine Combine_t;
};
struct Compressed
{
  typedef AndCombine Combine_t;
};
struct CompressedRead
{
  typedef OpCombine Combine_t;
};
struct CompressedReadWrite
{
};
struct CompressedBrickIsWholeView
{
};
struct UnCompressedViewEngine
{
};
template<int A, int B, class Op>
struct Combine2<WrappedInt<A>, WrappedInt<B>, Op, AndCombine>
{
  enum { val = A && B };
  typedef WrappedInt<val> Type_t;
  inline static
  Type_t combine(WrappedInt<A> , WrappedInt<B>, AndCombine)
  {
    return Type_t();
  }
};
template<class T>
struct EngineFunctorScalar<T, Compressible >
{
  typedef WrappedInt<true> Type_t;
  static Type_t apply(const T &, const Compressible &)
  {
    return Type_t();
  }
};
template<class T>
struct EngineFunctorScalar<T, Compressed >
{
  typedef bool Type_t;
  static Type_t apply(const T &, const Compressed &)
  {
    return true;
  }
};
template<class T>
struct EngineFunctorScalar<T, CompressedRead >
{
  typedef T Type_t;
  static inline
  Type_t apply(const T& s, const CompressedRead &)
  {
    return s;
  }
};
template<class Engine>
struct EngineFunctorDefault<Engine,Compressible>
{
  typedef WrappedInt<false> Type_t;
};
template<class Engine>
struct EngineFunctorDefault<Engine,Compressed>
{
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine &, const Compressed &)
  {
    return false;
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,Compressible>
{
  typedef WrappedInt<true> Type_t;
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,Compressed>
{
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine_t &e, const Compressed &)
  {
    return e.compressed();
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,CompressedRead>
{
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef T Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedRead &)
  {
    return e.compressedRead();
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,CompressedReadWrite>
{
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef T &Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedReadWrite &)
  {
    return e.compressedReadWrite();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,
  CompressedBrickIsWholeView>
{
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef bool Type_t;
  static inline
  bool apply(const Engine_t &e, const CompressedBrickIsWholeView &)
  {
    return e.compressedBrickIsWholeView();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrick>,UnCompressedViewEngine>
{
  typedef Engine<Dim,T,CompressibleBrick> Engine_t;
  typedef Engine<Dim,T,BrickView> Type_t;
  static inline
  Type_t apply(const Engine_t &e, const UnCompressedViewEngine &)
  {
    return Type_t(e);
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView>,Compressible>
{
  typedef WrappedInt<true> Type_t;
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView >,Compressed>
{
  typedef Engine<Dim,T,CompressibleBrickView > Engine_t;
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine_t &e, const Compressed &)
  {
    return e.compressed();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView >,CompressedRead>
{
  typedef Engine<Dim,T,CompressibleBrickView > Engine_t;
  typedef T Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedRead &)
  {
    return e.compressedRead();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView >,
  CompressedReadWrite>
{
  typedef Engine<Dim,T,CompressibleBrickView > Engine_t;
  typedef T &Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedReadWrite &)
  {
    return e.compressedReadWrite();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView >,
  CompressedBrickIsWholeView>
{
  typedef Engine<Dim,T,CompressibleBrickView > Engine_t;
  typedef bool Type_t;
  static inline
  bool apply(const Engine_t &e, const CompressedBrickIsWholeView &)
  {
    return e.compressedBrickIsWholeView();
  }
};
template<int Dim, class T>
struct EngineFunctor<Engine<Dim,T,CompressibleBrickView >,
  UnCompressedViewEngine>
{
  typedef Engine<Dim,T,CompressibleBrickView > Engine_t;
  typedef Engine<Dim,T,BrickView> Type_t;
  static inline
  Type_t apply(const Engine_t &e, const UnCompressedViewEngine &)
  {
    return Type_t(e);
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,ConstantFunction>,Compressible>
{
  typedef WrappedInt<true> Type_t;
  static inline
  Type_t apply(const Engine<Dim,T,ConstantFunction> &, const Compressible &)
  {
    return WrappedInt<true>();
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,ConstantFunction>,Compressed>
{
  typedef bool Type_t;
  static inline
  Type_t apply(const Engine<Dim,T,ConstantFunction> &, const Compressed &)
  {
    return true;
  }
};
template<int Dim,class T>
struct EngineFunctor<Engine<Dim,T,ConstantFunction>,CompressedRead>
{
  typedef T Type_t;
  static inline
  Type_t apply(const Engine<Dim,T,ConstantFunction> &e,
        const CompressedRead &)
  {
    return e.constant();
  }
};
template<int Dim, class T, class Eng, class Components>
struct EngineFunctor<Engine<Dim,T,CompFwd<Eng, Components> >,Compressible>
{
  typedef typename EngineFunctor<Eng,Compressible>::Type_t Comp_t;
  enum { compressible = Comp_t::val };
  typedef WrappedInt<compressible> Type_t;
};
template<int Dim, class T, class Eng, class Components>
struct EngineFunctor<Engine<Dim,T,CompFwd<Eng, Components> >,CompressedRead>
{
  typedef Engine<Dim,T,CompFwd<Eng, Components> > Engine_t;
  typedef typename Engine_t::CompAccess_t CompAccess_t;
  typedef typename CompAccess_t::Element_t Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedRead &tag)
  {
    return CompAccess_t::index(engineFunctor(e.elemEngine(),tag),
          e.components());
  }
};
template<int Dim, class T, class Eng, class Components>
struct EngineFunctor<Engine<Dim,T,CompFwd<Eng, Components> >,CompressedReadWrite>
{
  typedef Engine<Dim,T,CompFwd<Eng, Components> > Engine_t;
  typedef typename Engine_t::CompAccess_t CompAccess_t;
  typedef typename CompAccess_t::ElementRef_t Type_t;
  static inline
  Type_t apply(const Engine_t &e, const CompressedReadWrite &tag)
  {
    return CompAccess_t::indexRef(engineFunctor(e.elemEngine(),tag),
      e.components());
  }
};
template<int Dim, class T, class Eng, class Components>
struct EngineFunctor<Engine<Dim,T,CompFwd<Eng, Components> >,
  UnCompressedViewEngine>
{
  typedef Engine<Dim,T,CompFwd<Eng, Components> > Engine_t;
  typedef typename EngineFunctor<Eng,
    UnCompressedViewEngine>::Type_t CompEngine_t;
  typedef Engine<Dim,T,CompFwd<CompEngine_t, Components> > Type_t;
  static inline
  Type_t apply(const Engine_t &e,const UnCompressedViewEngine &tag)
  {
    return Type_t(engineFunctor(e.elemEngine(), tag), e.components());
  }
};
template<class Expr> struct CreateLeaf;
struct ErrorKernelTag
{
  ErrorKernelTag(){}
  ~ErrorKernelTag(){}
};
struct InlineKernelTag
{
  InlineKernelTag(){}
  ~InlineKernelTag(){}
};
struct CompressibleKernelTag
{
  CompressibleKernelTag(){}
  ~CompressibleKernelTag(){}
};
struct CompressibleViewKernelTag
{
  CompressibleViewKernelTag(){}
  ~CompressibleViewKernelTag(){}
};
template<bool lhsComp,bool rhsComp>
struct CompressibleKernel
{
  CompressibleKernel(){}
  ~CompressibleKernel(){}
};
template<>
struct CompressibleKernel<false,false>
{
  CompressibleKernel(){}
  ~CompressibleKernel(){}
  typedef InlineKernelTag Kernel_t;
};
template<>
struct CompressibleKernel<false,true>
{
  CompressibleKernel(){}
  ~CompressibleKernel(){}
  typedef InlineKernelTag Kernel_t;
};
template<>
struct CompressibleKernel<true,false>
{
  CompressibleKernel(){}
  ~CompressibleKernel(){}
  typedef CompressibleViewKernelTag Kernel_t;
};
template<>
struct CompressibleKernel<true,true>
{
  CompressibleKernel(){}
  ~CompressibleKernel(){}
  typedef CompressibleKernelTag Kernel_t;
};
template<class Expr>
struct KernelTag1
{
  KernelTag1(){}
 ~KernelTag1(){}
  typedef typename Expr::Engine_t ExprEngine_t;
  typedef typename EngineFunctor<ExprEngine_t, Compressible>::Type_t Expr_t;
  enum { exprComp = Expr_t::val };
  typedef typename CompressibleKernel<exprComp,exprComp>::Kernel_t Kernel_t;
};
template<class LHS,class RHS>
struct KernelTag
{
  KernelTag(){}
 ~KernelTag(){}
  typedef typename LHS::Engine_t LHSEngine_t;
  typedef typename RHS::Engine_t RHSEngine_t;
  typedef typename EngineFunctor<LHSEngine_t,Compressible>::Type_t LHST_t;
  typedef typename EngineFunctor<RHSEngine_t,Compressible>::Type_t RHST_t;
  enum { lhsComp = LHST_t::val };
  enum { rhsComp = RHST_t::val };
  typedef typename CompressibleKernel<lhsComp,rhsComp>::Kernel_t Kernel_t;
};
template<class KernelTag>
struct KernelEvaluator;
template<>
struct KernelEvaluator<InlineKernelTag>
{
  template<class LHS,class Op,class RHS,class Domain>
  static /*__attribute__((leafify))*/
  void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain)
  {
    PoomaCTAssert<(Domain::unitStride)>::test();
    for (int i=0; i<Domain::dimensions; ++i)
      ;
    evaluate(lhs,op,rhs,domain,
      WrappedInt<Domain::dimensions>());
    ;
  }
  template<class LHS,class Op,class RHS>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs)
  {
    evaluate(lhs,op,rhs,lhs.domain());
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<1>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
;
#pragma omp parallel for if (e0 > 512)
    for (int i0=0; i0<e0; ++i0)
      op(localLHS(i0),localRHS.read(i0));
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<2>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
#pragma omp parallel for
    for (int i1=0; i1<e1; ++i1) {
;
      for (int i0=0; i0<e0; ++i0)
 op(localLHS(i0,i1),localRHS.read(i0,i1));
    }
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<3>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
#pragma omp parallel for
    for (int i2=0; i2<e2; ++i2)
      for (int i1=0; i1<e1; ++i1) {
;
 for (int i0=0; i0<e0; ++i0)
   op(localLHS(i0,i1,i2),localRHS.read(i0,i1,i2));
      }
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<4>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
#pragma omp parallel for
    for (int i3=0; i3<e3; ++i3)
      for (int i2=0; i2<e2; ++i2)
 for (int i1=0; i1<e1; ++i1) {
;
   for (int i0=0; i0<e0; ++i0)
     op(localLHS(i0,i1,i2,i3),localRHS.read(i0,i1,i2,i3));
 }
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<5>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
#pragma omp parallel for
    for (int i4=0; i4<e4; ++i4)
      for (int i3=0; i3<e3; ++i3)
 for (int i2=0; i2<e2; ++i2)
   for (int i1=0; i1<e1; ++i1) {
;
     for (int i0=0; i0<e0; ++i0)
       op(localLHS(i0,i1,i2,i3,i4),localRHS.read(i0,i1,i2,i3,i4));
   }
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<6>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
    int e5 = domain[5].length();
#pragma omp parallel for
    for (int i5=0; i5<e5; ++i5)
      for (int i4=0; i4<e4; ++i4)
 for (int i3=0; i3<e3; ++i3)
   for (int i2=0; i2<e2; ++i2)
     for (int i1=0; i1<e1; ++i1) {
;
       for (int i0=0; i0<e0; ++i0)
  op(localLHS(i0,i1,i2,i3,i4,i5),
     localRHS.read(i0,i1,i2,i3,i4,i5));
     }
  }
  template<class LHS,class Op,class RHS,class Domain>
  inline static void evaluate(const LHS& lhs,const Op& op,const RHS& rhs,
         const Domain& domain,WrappedInt<7>)
  {
    LHS localLHS(lhs);
    RHS localRHS(rhs);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
    int e5 = domain[5].length();
    int e6 = domain[6].length();
#pragma omp parallel for
    for (int i6=0; i6<e6; ++i6)
      for (int i5=0; i5<e5; ++i5)
 for (int i4=0; i4<e4; ++i4)
   for (int i3=0; i3<e3; ++i3)
     for (int i2=0; i2<e2; ++i2)
       for (int i1=0; i1<e1; ++i1) {
;
  for (int i0=0; i0<e0; ++i0)
    op(localLHS(i0,i1,i2,i3,i4,i5,i6),
       localRHS.read(i0,i1,i2,i3,i4,i5,i6));
       }
  }
private:
};
template<>
struct KernelEvaluator<CompressibleViewKernelTag>
{
  template<class LHS, class Op, class RHS>
  static void evaluate(const LHS &lhs, const Op &op, const RHS &rhs)
  {
    KernelEvaluator<InlineKernelTag>().
      evaluate(engineFunctor(lhs, UnCompressedViewEngine()),
        op, rhs);
    ;
  }
};
template<>
struct KernelEvaluator<CompressibleKernelTag>
{
  template<class LHS, class Op, class RHS>
  static void evaluate(const LHS &lhs, const Op &op, const RHS &rhs)
  {
    typedef typename LHS::Element_t LHST_t;
    typedef typename RHS::Element_t RHST_t;
    if (engineFunctor(lhs, Compressed()) &&
 engineFunctor(rhs, Compressed()))
      {
        LHST_t &l = engineFunctor(lhs, CompressedReadWrite());
        LHST_t test = l;
        RHST_t r = engineFunctor(rhs, CompressedRead());
        op(test, r);
        if (test != l)
          {
     if (engineFunctor(lhs, CompressedBrickIsWholeView()))
       {
         l = test;
         ;
       }
     else
       {
         KernelEvaluator<CompressibleViewKernelTag>::
                  evaluate(lhs, op, rhs);
       }
          }
        else
          {
            ;
          }
      }
    else
      {
        KernelEvaluator<CompressibleViewKernelTag>::evaluate(lhs, op, rhs);
      }
  }
};
struct Brick;
struct BrickView;
struct BrickViewU;
struct CompressibleBrick;
struct CompressibleBrickView;
struct Dynamic;
struct DynamicView;
template<class LayoutTag, class PatchTag>
struct MultiPatch;
template<class LayoutTag, class PatchTag, int Dim2>
struct MultiPatchView;
template<class Functor>
struct IndexFunction;
template<int Dim2, class Functor>
struct IndexFunctionView;
template<class Eng, class Components>
struct CompFwd;
template<class A1,class A2>
struct IndirectionTag;
struct ConstantFunction;
template<class Expr>
struct ExpressionTag;
template<class Tag>
struct Remote;
struct DistributedTag;
struct ReplicatedTag;
struct ScalarEngineTag
{
  ScalarEngineTag() {}
  ~ScalarEngineTag() {}
};
struct MainEvaluatorTag
{
  MainEvaluatorTag() {}
  ~MainEvaluatorTag() {}
};
struct SinglePatchEvaluatorTag
{
  SinglePatchEvaluatorTag() {}
  ~SinglePatchEvaluatorTag() {}
};
struct MultiPatchEvaluatorTag
{
  MultiPatchEvaluatorTag() {}
  ~MultiPatchEvaluatorTag() {}
};
struct RemoteSinglePatchEvaluatorTag
{
  RemoteSinglePatchEvaluatorTag() {}
  ~RemoteSinglePatchEvaluatorTag() {}
};
struct RemoteMultiPatchEvaluatorTag
{
  RemoteMultiPatchEvaluatorTag() {}
  ~RemoteMultiPatchEvaluatorTag() {}
};
struct EvaluatorTypeTag
{
  EvaluatorTypeTag() {}
  ~EvaluatorTypeTag() {}
};
struct EvaluatorCombineTag
{
  EvaluatorCombineTag() {}
  ~EvaluatorCombineTag() {}
};
template<class EngineTag>
struct EvaluatorEngineTraits
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
};
template<>
struct EvaluatorEngineTraits<ScalarEngineTag>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<ConstantFunction>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<class Functor>
struct EvaluatorEngineTraits<IndexFunction<Functor> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<int Dim2, class Functor>
struct EvaluatorEngineTraits<IndexFunctionView<Dim2, Functor> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<Brick>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<BrickView>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<BrickViewU>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<CompressibleBrick>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<CompressibleBrickView>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<Dynamic>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorEngineTraits<DynamicView>
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<class A1,class A2>
struct EvaluatorEngineTraits<IndirectionTag<A1,A2> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<class Tag>
struct EvaluatorEngineTraits<Remote<Tag> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef RemoteSinglePatchEvaluatorTag Evaluator_t;
};
template<class LayoutTag, class PatchTag>
struct EvaluatorEngineTraits<MultiPatch<LayoutTag, PatchTag> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef MultiPatchEvaluatorTag Evaluator_t;
};
template<class LayoutTag, class PatchTag, int Dim2>
struct EvaluatorEngineTraits<MultiPatchView<LayoutTag, PatchTag, Dim2> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef MultiPatchEvaluatorTag Evaluator_t;
};
template<class LayoutTag, class Tag>
struct EvaluatorEngineTraits<MultiPatch<LayoutTag, Remote<Tag> > >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef RemoteMultiPatchEvaluatorTag Evaluator_t;
};
template<class LayoutTag, class Tag, int Dim2>
struct EvaluatorEngineTraits<MultiPatchView<LayoutTag, Remote<Tag>, Dim2> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef RemoteMultiPatchEvaluatorTag Evaluator_t;
};
template<class Eng, class Components>
struct EvaluatorEngineTraits<CompFwd<Eng, Components> >
{
  EvaluatorEngineTraits() {}
  ~EvaluatorEngineTraits() {}
  typedef EvaluatorEngineTraits<typename Eng::Tag_t> ET;
  typedef typename ET::Evaluator_t Evaluator_t;
};
template<class Expr>
struct EvaluatorEngineTraits<ExpressionTag<Expr> >
{
 EvaluatorEngineTraits() {}
 ~EvaluatorEngineTraits() {}
 typedef typename ForEach<Expr, EvaluatorTypeTag,
   EvaluatorCombineTag>::Type_t Evaluator_t;
};
template<class ETag>
struct DistributionTraits
{
  enum { remote = false };
  typedef ReplicatedTag LayoutTag_t;
};
template<class ETag>
struct DistributionTraits<Remote<ETag> >
{
  enum { remote = true };
  typedef DistributedTag LayoutTag_t;
};
template<class Eval1, class Eval2>
struct EvaluatorCombine
{
 EvaluatorCombine() {}
 ~EvaluatorCombine() {}
 typedef RemoteMultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<SinglePatchEvaluatorTag,
                        MultiPatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef MultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<MultiPatchEvaluatorTag,
                        SinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef MultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<RemoteSinglePatchEvaluatorTag,
                        MultiPatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef RemoteMultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<MultiPatchEvaluatorTag,
                        RemoteSinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef RemoteMultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<RemoteSinglePatchEvaluatorTag,
                        SinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef RemoteSinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<SinglePatchEvaluatorTag,
                        RemoteSinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef RemoteSinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<MultiPatchEvaluatorTag,
                        MultiPatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef MultiPatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<RemoteSinglePatchEvaluatorTag,
                        RemoteSinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef RemoteSinglePatchEvaluatorTag Evaluator_t;
};
template<>
struct EvaluatorCombine<SinglePatchEvaluatorTag,
                        SinglePatchEvaluatorTag>
{
  EvaluatorCombine() {}
  ~EvaluatorCombine() {}
  typedef SinglePatchEvaluatorTag Evaluator_t;
};
template<class T>
struct LeafFunctor<Scalar<T>, EvaluatorTypeTag>
{
 LeafFunctor() {}
 ~LeafFunctor() {}
 typedef typename EvaluatorEngineTraits<ScalarEngineTag>::Evaluator_t Type_t;
};
template<class A>
struct LeafFunctor<A, EvaluatorTypeTag>
{
  LeafFunctor() {}
  ~LeafFunctor() {}
  typedef typename
    EvaluatorEngineTraits<typename A::Engine_t::Tag_t>::Evaluator_t Type_t;
};
template<class Eval1,class Eval2,class Op>
struct Combine2<Eval1, Eval2, Op, EvaluatorCombineTag>
{
  Combine2() {}
  ~Combine2() {}
  typedef typename EvaluatorCombine<Eval1, Eval2>::Evaluator_t Type_t;
};
template<class Expr>
struct EvaluatorTag1
{
  EvaluatorTag1() {}
  ~EvaluatorTag1() {}
  typedef typename LeafFunctor<Expr, EvaluatorTypeTag>::Type_t Evaluator_t;
};
template<class LHS, class RHS>
struct EvaluatorTag
{
  EvaluatorTag() {}
  ~EvaluatorTag() {}
  typedef typename LeafFunctor<LHS, EvaluatorTypeTag>::Type_t LHSEval_t;
  typedef typename LeafFunctor<RHS, EvaluatorTypeTag>::Type_t RHSEval_t;
  typedef typename EvaluatorCombine<LHSEval_t, RHSEval_t>::Evaluator_t
    Evaluator_t;
};
template<class LHS,class Op,class RHS,class EvalTag>
class ExpressionKernel : public Pooma::Iterate_t
{
public:
  typedef ExpressionKernel<LHS,Op,RHS,EvalTag> This_t;
  ExpressionKernel(const LHS&,const Op&,const RHS&);
  virtual ~ExpressionKernel();
  virtual void /*__attribute__((leafify))*/ run();
private:
  LHS lhs_m;
  Op op_m;
  RHS rhs_m;
};
template<class LHS,class Op,class RHS,class EvalTag>
ExpressionKernel<LHS,Op,RHS,EvalTag>::
ExpressionKernel(const LHS& lhs,const Op& op,const RHS& rhs)
  : Pooma::Iterate_t(Pooma::scheduler()),
    lhs_m(lhs), op_m(op), rhs_m(rhs)
{
  hintAffinity(engineFunctor(lhs, DataObjectRequest<BlockAffinity>()));
  DataObjectRequest<WriteRequest> writeReq(*this);
  engineFunctor(lhs_m, writeReq);
  DataObjectRequest<ReadRequest> readReq(writeReq);
  engineFunctor(rhs_m, readReq);
}
template<class LHS,class Op,class RHS,class EvalTag>
ExpressionKernel<LHS,Op,RHS,EvalTag>::~ExpressionKernel()
{
  DataObjectRequest<WriteRelease> writeReq;
  engineFunctor(lhs_m, writeReq);
  DataObjectRequest<ReadRelease> readReq(writeReq);
  engineFunctor(rhs_m, readReq);
}
template<class LHS,class Op,class RHS,class EvalTag>
void
ExpressionKernel<LHS,Op,RHS,EvalTag>::run()
{
  KernelEvaluator<EvalTag>::evaluate(lhs_m,op_m,rhs_m);
}
template<class LHS,class Op,class RHS,class EvalTag>
inline static
ExpressionKernel<LHS,Op,RHS,EvalTag>*
generateKernel(const LHS& lhs, const Op& op, const RHS& rhs, const EvalTag&)
{
  return new ExpressionKernel<LHS,Op,RHS,EvalTag>(lhs, op, rhs);
}
template<int Dim>
class IntersectorData
  : public RefCounted
{
public:
  typedef IntersectorData<Dim> This_t;
  typedef std::vector<int> IDContainer_t;
  typedef Range<7> BaseDomain_t;
  typedef std::vector<BaseDomain_t> BaseDomainContainer_t;
  typedef INode<Dim> INode_t;
  typedef std::vector<INode_t> INodeContainer_t;
  typedef typename INodeContainer_t::const_iterator const_iterator;
  typedef Unique::Value_t LayoutID_t;
  enum { dimensions = Dim };
  inline IntersectorData() { }
  inline ~IntersectorData() { }
  template<class Engine>
  void intersect(const Engine &engine)
  {
    typedef typename Engine::Layout_t Layout_t;
    const Layout_t &layout(engine.layout());
    int n = ids_m.size();
    for (int i = 0; i < n; ++i)
    {
      if (ids_m[i] == layout.ID())
 return;
      if (baseIDs_m[i] == layout.baseID()
   && sameBaseDomain(i, layout.baseDomain()))
      {
 shared(layout.ID(),ids_m[i]);
 return;
      }
    }
    touches(layout);
  }
  template<class Engine, int Dim2>
  bool intersect(const Engine &engine, const GuardLayers<Dim2> &guard,
   GuardLayers<Dim2> &usedGuards)
  {
    PoomaCTAssert<(Engine::dimensions == Dim)>::test();
    typedef typename Engine::Layout_t Layout_t;
    const Layout_t &layout(engine.layout());
    int n = ids_m.size();
    for (int i = 0; i < n; ++i)
    {
      if (ids_m[i] == layout.ID())
 return false;
      if (baseIDs_m[i] == layout.baseID()
   && sameBaseDomain(i, layout.baseDomain(), guard))
      {
 shared(layout.ID(),ids_m[i]);
 if (baseDims_m[i] < Dim2)
   return true;
 bool used = false;
 for (int j = 0; j < Dim2; j++)
 {
   usedGuards.lower(j) = std::max(0, baseDomains_m[i][j].first() - layout.baseDomain()[j].first());
   if (usedGuards.lower(j) != 0)
     used = true;
   usedGuards.upper(j) = std::max(0, layout.baseDomain()[j].last() - baseDomains_m[i][j].last());
   if (usedGuards.upper(j) != 0)
     used = true;
 }
 return used;
      }
    }
    touches(layout);
    return false;
  }
  template<int Dim2>
  bool sameBaseDomain(int i, const Range<Dim2> &domain,
        const GuardLayers<Dim2> &guard)
  {
    if (baseDims_m[i] != Dim2)
      return false;
    for (int j = 0; j < Dim2; j++)
    {
      if (baseDomains_m[i][j].stride() != domain[j].stride()) return false;
      if (baseDomains_m[i][j].first() > domain[j].first() + guard.lower(j))
 return false;
      if (baseDomains_m[i][j].last() < domain[j].last() - guard.upper(j))
 return false;
    }
    return true;
  }
  template<int Dim2>
  bool sameBaseDomain(int i, const Range<Dim2> &domain)
  {
    if (baseDims_m[i] != Dim2)
      return false;
    for (int j = 0; j < Dim2; j++)
      if (baseDomains_m[i][j] != domain[j]) return false;
    return true;
  }
  template<int Dim2>
  bool sameBaseDomain(int i, const Interval<Dim2> &domain,
        const GuardLayers<Dim2> & guard)
  {
    if (baseDims_m[i] != Dim2)
      return false;
    for (int j = 0; j < Dim2; j++)
    {
      if (baseDomains_m[i][j].stride() != 1) return false;
      if (baseDomains_m[i][j].first() > domain[j].first() + guard.lower(j))
 return false;
      if (baseDomains_m[i][j].last() < domain[j].last() - guard.upper(j))
 return false;
    }
    return true;
  }
  template<int Dim2>
  void pushBaseDomain(const Range<Dim2> &domain)
  {
    int i = baseDomains_m.size();
    baseDims_m.push_back(Dim2);
    baseDomains_m.push_back(BaseDomain_t());
    for (int j = 0; j < Dim2; j++)
      baseDomains_m[i][j] =
        Range<1>(domain[j].first(), domain[j].last(), domain[j].stride());
  }
  template<int Dim2>
  bool sameBaseDomain(int i, const Interval<Dim2> &domain)
  {
    if (baseDims_m[i] != Dim2)
      return false;
    for (int j = 0; j < Dim2; j++)
      if (baseDomains_m[i][j] != domain[j]) return false;
    return true;
  }
  template<int Dim2>
  void pushBaseDomain(const Interval<Dim2> &domain)
  {
    int i = baseDomains_m.size();
    baseDims_m.push_back(Dim2);
    baseDomains_m.push_back(BaseDomain_t());
    for (int j = 0; j < Dim2; j++)
      baseDomains_m[i][j] =
        Range<1>(domain[j].first(), domain[j].last(), domain[j].stride());
  }
  template<class Layout>
  void touches(const Layout &l)
  {
    int n = ids_m.size();
    ids_m.push_back(l.ID());
    baseIDs_m.push_back(l.baseID());
    pushBaseDomain(l.baseDomain());
    if (n == 0)
    {
      typename Layout::const_iterator p = l.beginGlobal();
      while (p != l.endGlobal())
      {
 if (! (*p).domain().empty())
   inodes_m.push_back(INode_t(*p,l.ID(),
         &(gidStore_m)));
 ++p;
      }
    }
    else
    {
      int ni = inodes_m.size();
      for (int i = 0; i < ni; i++)
 l.touches(inodes_m[i].domain(),
    std::back_inserter(inodes_m),
    inodes_m[i].touchesConstructINode(l.ID())
    );
      inodes_m.erase(inodes_m.begin(),
        inodes_m.begin() + ni);
    }
  }
  inline
  void shared(LayoutID_t id1, LayoutID_t id2)
  {
    gidStore_m.shared(id1,id2);
  }
  IntersectorData(const This_t &);
  This_t &operator=(const This_t &);
  IDContainer_t ids_m, baseIDs_m, baseDims_m;
  BaseDomainContainer_t baseDomains_m;
  INodeContainer_t inodes_m;
  GlobalIDDataBase gidStore_m;
};
template<int Dim>
class Intersector
{
public:
  typedef IntersectorData<Dim> IntersectorData_t;
  typedef Intersector<Dim> This_t;
  typedef typename IntersectorData_t::IDContainer_t IDContainer_t;
  typedef typename IntersectorData_t::BaseDomain_t BaseDomain_t;
  typedef typename IntersectorData_t::BaseDomainContainer_t
                                                        BaseDomainContainer_t;
  typedef typename IntersectorData_t::INode_t INode_t;
  typedef typename IntersectorData_t::INodeContainer_t INodeContainer_t;
  typedef typename IntersectorData_t::const_iterator const_iterator;
  typedef RefCountedPtr<IntersectorData_t> DataPtr_t;
  enum { dimensions = Dim };
  Intersector()
    : pdata_m(new IntersectorData_t())
  { }
  Intersector(const This_t &model)
    : pdata_m(model.pdata_m)
  { }
  This_t &operator=(const This_t &model)
  {
    if (this != &model)
      pdata_m = model.pdata_m;
    return *this;
  }
  ~Intersector() { }
  inline DataPtr_t &data() { return pdata_m; }
  inline const DataPtr_t &data() const { return pdata_m; }
  inline const_iterator begin() const { return data()->inodes_m.begin(); }
  inline const_iterator end() const { return data()->inodes_m.end(); }
  inline int size() const { return data()->inodes_m.size(); }
  template<class Engine>
  inline
  void intersect(const Engine &l)
  {
    data()->intersect(l);
  }
  template<class Engine, int Dim2>
  inline
  bool intersect(const Engine &l, const GuardLayers<Dim2> &guard, GuardLayers<Dim2> &usedGuards)
  {
    return (data()->intersect(l,guard,usedGuards));
  }
private:
  DataPtr_t pdata_m;
};
template <class EvalTag>
struct Evaluator
{
};
template <>
struct Evaluator<MainEvaluatorTag>
{
  Evaluator() { }
  ~Evaluator() { }
  template <class LHS, class RHS, class Op>
  void evaluate(const LHS& lhs, const Op& op, const RHS& rhs) const
  {
    typedef typename EvaluatorTag<LHS, RHS>::Evaluator_t Eval_t;
    Evaluator<Eval_t> evaluator;
    Pooma::beginExpression();
    evaluator.evaluate(lhs(), op, rhs());
    notifyEngineWrite(lhs.engine());
    Pooma::endExpression();
    ;
  }
  template <class LHS, class RHS, class Op>
  void evaluateZeroBased(const LHS& lhs, const Op& op, const RHS& rhs) const
  {
    typedef typename EvaluatorTag<LHS, RHS>::Evaluator_t Eval_t;
    Evaluator<Eval_t> evaluator;
    Pooma::beginExpression();
    evaluator.evaluate(lhs, op, rhs);
    notifyEngineWrite(lhs.engine());
    Pooma::endExpression();
    ;
  }
};
template <>
struct Evaluator<SinglePatchEvaluatorTag>
{
  Evaluator() { }
  ~Evaluator() { }
  template <class LHS, class RHS, class Op>
  void evaluate(const LHS& lhs, const Op& op, const RHS& rhs) const
  {
    typedef typename KernelTag<LHS,RHS>::Kernel_t Kernel_t;
    Pooma::Iterate_t *iterate = ::generateKernel(lhs, op, rhs, Kernel_t());
    Pooma::scheduler().handOff(iterate);
  }
};
template <>
struct Evaluator<MultiPatchEvaluatorTag>
{
  Evaluator() { }
  ~Evaluator() { }
  template <class LHS, class RHS, class Op>
  void evaluate(const LHS& lhs, const Op& op, const RHS& rhs) const
  {
    typedef Intersector<LHS::dimensions> Inter_t;
    Inter_t inter;
    expressionApply(lhs, IntersectorTag<Inter_t>(inter));
    expressionApply(rhs, IntersectorTag<Inter_t>(inter));
    typename Inter_t::const_iterator i = inter.begin();
    while (i != inter.end())
    {
      Evaluator<SinglePatchEvaluatorTag>().evaluate(lhs(*i), op, rhs(*i));
      ++i;
    }
    ;
    ;
  }
};
template<class T>
struct MaskAssign
{
  MaskAssign() { }
  MaskAssign(bool q) : cond_m(q) { }
  MaskAssign(bool q, const T& v) : cond_m(q), value_m(v) { }
  ~MaskAssign() { }
  inline bool defined() const { return cond_m; }
  inline const T &value() const { return value_m; }
  inline bool operator!=(const MaskAssign<T> &other) const
  {
    if (defined())
    {
      return ((other.defined() != defined()) || (other.value() != value()));
    }
    else
    {
      return other.defined();
    }
  }
  MaskAssign(const MaskAssign<T> &) { }
  MaskAssign<T> &operator=(const MaskAssign<T> &) { return *this; }
  bool cond_m;
  T value_m;
};
template<class Op>
struct OpMask
{
  OpMask() { }
  OpMask(const Op &op) : op_m(op) { }
  ~OpMask() { }
  template<class T1, class T2>
  inline void
  operator()(T1 &a, const MaskAssign<T2> &b) const
  {
    if (b.defined())
    {
      op_m(a, b.value());
    }
  }
  template<class T1, class T2>
  inline void
  operator()(T1 &a, const T2 &b) const
  {
    op_m(a, b);
  }
  Op op_m;
};
template<class T1, class T2, class Op>
struct BinaryReturn<T1, T2, OpMask<Op> >
{
  typedef T1 &Type_t;
};
#ifdef _OPENMP
#include <omp.h>
#endif
template <class Op, class T>
struct ReductionTraits;
template <class Op, class T>
struct ReductionTraits<OpMask<Op>, T>
{
  static T identity() { return ReductionTraits<Op, T>::identity(); }
};
struct WhereMask
{
  WhereMask() { }
  WhereMask(const WhereMask &) { }
  WhereMask &operator=(const WhereMask &) { return *this; }
  ~WhereMask() { }
};
template<class T1, class T2>
struct BinaryReturn<T1, T2, WhereMask>
{
  typedef MaskAssign<T2> Type_t;
};
template<class A, class B, class FTag>
struct ForEach< BinaryNode<WhereMask, A, B>, FTag, OpCombine >
{
  typedef typename ForEach<A,FTag,OpCombine>::Type_t TypeA_t;
  typedef typename ForEach<B,FTag,OpCombine>::Type_t TypeB_t;
  typedef MaskAssign<TypeB_t> Type_t;
  inline
  static Type_t
  apply(const BinaryNode<WhereMask,A,B>& expr,
 const FTag &f, const OpCombine &c)
  {
    bool mask = forEach(expr.left(), f, c);
    if ( mask )
    {
      return Type_t(mask, forEach(expr.right(), f, c));
    }
    else
    {
      return Type_t(mask);
    }
  }
};
struct FarLeftTag;
template<class A, class B>
struct ForEach< BinaryNode<WhereMask, A, B>, FarLeftTag, FarLeftTag >
{
  typedef typename ForEach<B,FarLeftTag,FarLeftTag>::Type_t Type_t;
  inline
  static Type_t
  apply(const BinaryNode<WhereMask,A,B>& expr,
 const FarLeftTag &f, const FarLeftTag &c)
  {
    return forEach(expr.right(), f, c);
  }
};
template<class A, class T>
struct ForEach< BinaryNode<WhereMask, A, Scalar<T> >, FarLeftTag, FarLeftTag >
{
  typedef typename ForEach<A,FarLeftTag,FarLeftTag>::Type_t Type_t;
  inline
  static Type_t
  apply(const BinaryNode<WhereMask,A,Scalar<T> >& expr,
 const FarLeftTag &f, const FarLeftTag &c)
  {
    return forEach(expr.left(), f, c);
  }
};
template<class A, class B>
struct ForEachRef< BinaryNode<WhereMask, A, B>, FarLeftTag, FarLeftTag >
{
  typedef typename ForEach<B,FarLeftTag,FarLeftTag>::Type_t Type_t;
  inline
  static const Type_t&
  apply(const BinaryNode<WhereMask,A,B>& expr,
 const FarLeftTag &f, const FarLeftTag &c)
  {
    return forEachRef(expr.right(), f, c);
  }
};
template<class A, class T>
struct ForEachRef< BinaryNode<WhereMask, A, Scalar<T> >, FarLeftTag, FarLeftTag >
{
  typedef typename ForEach<A,FarLeftTag,FarLeftTag>::Type_t Type_t;
  inline
  static const Type_t&
  apply(const BinaryNode<WhereMask,A,Scalar<T> >& expr,
 const FarLeftTag &f, const FarLeftTag &c)
  {
    return forEachRef(expr.left(), f, c);
  }
};
template<class T>
struct ExpressionTraits
{
  typedef void Type_t;
};
struct ExpressionIsScalar { };
template<class T>
struct ExpressionTraits<Scalar<T> >
{
  typedef ExpressionIsScalar Type_t;
};
template<class A, class B>
struct CombineExpressionTraits
{ };
template<class T>
struct ExpressionTraits<Reference<T> >
{
  typedef typename ExpressionTraits<T>::Type_t Type_t;
};
template<class Op, class Child>
struct ExpressionTraits<UnaryNode<Op, Child> >
{
  typedef typename ExpressionTraits<Child>::Type_t Type_t;
};
template<class Op, class Left, class Right>
struct ExpressionTraits<BinaryNode<Op, Left, Right> >
{
  typedef typename ExpressionTraits<Left>::Type_t Left_t;
  typedef typename ExpressionTraits<Right>::Type_t Right_t;
  typedef typename CombineExpressionTraits<Left_t, Right_t>::Type_t Type_t;
};
template<class Op, class Left, class Middle, class Right>
struct ExpressionTraits<TrinaryNode<Op, Left, Middle, Right> >
{
  typedef typename ExpressionTraits<Left>::Type_t Left_t;
  typedef typename ExpressionTraits<Middle>::Type_t Middle_t;
  typedef typename ExpressionTraits<Right>::Type_t Right_t;
  typedef typename CombineExpressionTraits<Left_t, Right_t>::Type_t Temp_t;
  typedef typename CombineExpressionTraits<Temp_t, Middle_t>::Type_t Type_t;
};
template<class ETrait, class Tree>
struct ConvertWhereProxy
{ };
template<class F, class B>
struct WhereProxy
{
  template <class Cond, class Val, class F1, class B1>
  struct WhereProxyTraits {
    enum { dimensions = F1::dimensions };
    typedef typename ForEach<Val, EvalLeaf<dimensions>, OpCombine>::Type_t Element_t;
  };
  template <class Cond, class T, class F1, class B1>
  struct WhereProxyTraits<Cond, Scalar<T>, F1, B1> {
    enum { dimensions = F1::dimensions };
    typedef T Element_t;
  };
  template <class Val, class T, class F1, class B1>
  struct WhereProxyTraits<Scalar<T>, Val, F1, B1> {
    enum { dimensions = B1::dimensions };
    typedef typename ForEach<Val, EvalLeaf<dimensions>, OpCombine>::Type_t Element_t;
  };
  template <class T1, class T2, class F1, class B1>
  struct WhereProxyTraits<Scalar<T1>, Scalar<T2>, F1, B1> {
  };
  WhereProxy(const F& f, const B& b) : f_m(f), b_m(b) { }
  typedef BinaryNode<WhereMask,
    typename CreateLeaf<F>::Leaf_t,
    typename CreateLeaf<B>::Leaf_t> Tree_t;
  typedef typename ExpressionTraits<Tree_t>::Type_t ETrait_t;
  typedef typename ConvertWhereProxy<ETrait_t,Tree_t>::Make_t MakeFromTree_t;
  typedef typename MakeFromTree_t::Expression_t WhereMask_t;
  typedef typename WhereProxyTraits<typename CreateLeaf<F>::Leaf_t,
 typename CreateLeaf<B>::Leaf_t, F, B>::Element_t Element_t;
  inline WhereMask_t
  whereMask() const
  {
    return MakeFromTree_t::make(Tree_t(CreateLeaf<F>::make(f_m),
           CreateLeaf<B>::make(b_m)));
  }
  template<class Op>
  inline OpMask<Op>
  opMask(const Op &op) const
  {
    return OpMask<Op>(op);
  }
  inline const F &flag() { return f_m; }
  inline const B &value() { return b_m; }
  const F &f_m;
  const B &b_m;
};
template<class F, class B>
inline WhereProxy<F,B>
where(const F &f, const B &b)
{
  return WhereProxy<F,B>(f,b);
}
template<int D,class T,class E> class Vector;
template<int DR, int DC, class T, class E> class TinyMatrix;
template<int D, class T, class E> class Tensor;
template<int D, class T, class EngineTag> class Tensor;
template<class OutputEngineTag, int D, class T, class EngineTag>
Tensor<D, T, OutputEngineTag>
symmetrize(const Tensor<D, T, EngineTag> &x);
struct FnReal
{
 
  template<class T>
  inline typename UnaryReturn<T, FnReal >::Type_t
  operator()(const T &a) const
  {
    return (real(a));
  }
};
struct FnImag
{
 
  template<class T>
  inline typename UnaryReturn<T, FnImag >::Type_t
  operator()(const T &a) const
  {
    return (imag(a));
  }
};
struct FnAbs
{
 
  template<class T>
  inline typename UnaryReturn<T, FnAbs >::Type_t
  operator()(const T &a) const
  {
    return (std::abs(a));
  }
};
struct FnArg
{
 
  template<class T>
  inline typename UnaryReturn<T, FnArg >::Type_t
  operator()(const T &a) const
  {
    return (arg(a));
  }
};
struct FnNorm
{
 
  template<class T>
  inline typename UnaryReturn<T, FnNorm >::Type_t
  operator()(const T &a) const
  {
    return (norm(a));
  }
};
struct FnConj
{
 
  template<class T>
  inline typename UnaryReturn<T, FnConj >::Type_t
  operator()(const T &a) const
  {
    return (conj(a));
  }
};
struct FnPow2
{
 
  template<class T>
  inline typename UnaryReturn<T, FnPow2 >::Type_t
  operator()(const T &a) const
  {
    return (a*a);
  }
};
struct FnPow3
{
 
  template<class T>
  inline typename UnaryReturn<T, FnPow3 >::Type_t
  operator()(const T &a) const
  {
    return (a*a*a);
  }
};
struct FnPow4
{
 
  template<class T>
  inline typename UnaryReturn<T, FnPow4 >::Type_t
  operator()(const T &a) const
  {
    return (a*a*a*a);
  }
};
struct FnMagnitude
{
 
  template<class T>
  inline typename UnaryReturn<T, FnMagnitude >::Type_t
  operator()(const T &a) const
  {
    return (magnitude(a));
  }
};
struct FnTrace
{
 
  template<class T>
  inline typename UnaryReturn<T, FnTrace >::Type_t
  operator()(const T &a) const
  {
    return (trace(a));
  }
};
struct FnDet
{
 
  template<class T>
  inline typename UnaryReturn<T, FnDet >::Type_t
  operator()(const T &a) const
  {
    return (det(a));
  }
};
struct FnTranspose
{
 
  template<class T>
  inline typename UnaryReturn<T, FnTranspose >::Type_t
  operator()(const T &a) const
  {
    return (transpose(a));
  }
};
template<class OutputSymmetry>
struct FnSymmetrize
{
 
  template<class T>
  inline typename UnaryReturn<T, FnSymmetrize<OutputSymmetry> >::Type_t
  operator()(const T &a) const
  {
    return (symmetrize<OutputSymmetry>(a));
  }
};
struct FnDot
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnDot >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return dot(a,b);
  }
};
struct FnPolar
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnPolar >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (polar(a,b));
  }
};
struct FnOuterProduct
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnOuterProduct >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (outerProduct(a,b));
  }
};
struct FnOuterProductAsTinyMatrix
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnOuterProductAsTinyMatrix >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (outerProductAsTinyMatrix(a,b));
  }
};
struct FnDotDot
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnDotDot >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (dotdot(a,b));
  }
};
struct FnMin
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnMin >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return
        std::min(a, b)
;
  }
};
struct FnMax
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnMax >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return
        std::max(a, b)
;
  }
};
struct OpLT2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLT2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a < b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLT2 > {
  typedef bool Type_t;
};
struct OpLE2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpLE2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a <= b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpLE2 > {
  typedef bool Type_t;
};
struct OpGT2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpGT2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a > b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpGT2 > {
  typedef bool Type_t;
};
struct OpGE2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpGE2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a >= b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpGE2 > {
  typedef bool Type_t;
};
struct OpEQ2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpEQ2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a == b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpEQ2 > {
  typedef bool Type_t;
};
struct OpNE2
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, OpNE2 >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    return (a != b);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, OpNE2 > {
  typedef bool Type_t;
};
struct FnMinAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnMinAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
        const_cast<T1 &>(a) = std::min(a, b)
;
    return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, FnMinAssign > {
  typedef T1 &Type_t;
};
struct FnMaxAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnMaxAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
        const_cast<T1 &>(a) = std::max(a, b)
;
    return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, FnMaxAssign > {
  typedef T1 &Type_t;
};
struct FnAndAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnAndAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    const_cast<T1 &>(a) = (a && b);
    return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, FnAndAssign > {
  typedef bool Type_t;
};
struct FnOrAssign
{
 
  template<class T1, class T2>
  inline typename BinaryReturn<T1, T2, FnOrAssign >::Type_t
  operator()(const T1 &a, const T2 &b) const
  {
    const_cast<T1 &>(a) = (a || b);
    return const_cast<T1 &>(a);
  }
};
template<class T1, class T2 >
struct BinaryReturn<T1, T2, FnOrAssign > {
  typedef bool Type_t;
};
namespace std {
template<class T> class complex;
}
using std::complex;
template<class T>
struct UnaryReturn< complex<T>, FnConj >
{
  typedef complex<T> Type_t;
};
template<class T>
struct UnaryReturn<complex<T>, FnReal>
{
  typedef T Type_t;
};
template<class T>
struct UnaryReturn<complex<T>, FnImag>
{
  typedef T Type_t;
};
template<class T>
struct UnaryReturn<complex<T>, FnArg>
{
  typedef T Type_t;
};
template<class T>
struct UnaryReturn<complex<T>, FnNorm>
{
  typedef T Type_t;
};
template<class T>
struct UnaryReturn<T, FnAbs>
{
  typedef T Type_t;
};
template<class T>
struct UnaryReturn<complex<T>, FnAbs>
{
  typedef T Type_t;
};
template<class T>
struct Promote<complex<T>, complex<T> >
{
  typedef complex<T> Type_t;
};
template<class T>
struct Promote<complex<T>, T>
{
  typedef complex<T> Type_t;
};
template<class T>
struct Promote<T, complex<T> >
{
  typedef complex<T> Type_t;
};
template<class T>
struct BinaryReturn<complex<T>, int, FnPow>
{
  typedef complex<T> Type_t;
};
template<class T>
struct UnaryReturn<T, FnPow2>
{
  typedef typename BinaryReturn<T, T, OpMultiply>::Type_t Type_t;
};
template<class T>
struct UnaryReturn<T, FnPow3>
{
  typedef typename BinaryReturn<T, T, OpMultiply>::Type_t Type_t;
};
template<class T>
struct UnaryReturn<T, FnPow4>
{
  typedef typename BinaryReturn<T, T, OpMultiply>::Type_t Type_t;
};
template<class T, class A> struct LeafFunctor;
template<class T> class Scalar;
template<int D>
class ConformTag
{
public:
  template<class Domain>
  ConformTag(const Domain& domain)
  {
    for (int i=0; i<D; ++i)
      lengths_m[i] = domain[i].length();
  }
  int length(int i) const { return lengths_m[i]; }
private:
  int lengths_m[D];
};
template<class Domain>
bool conforms(const Domain &d, const ConformTag<1> &ct)
{
  return d.length() == ct.length(0);
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<2> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1));
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<3> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1))
      && (d[2].length() == ct.length(2));
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<4> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1))
      && (d[2].length() == ct.length(2))
      && (d[3].length() == ct.length(3));
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<5> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1))
      && (d[2].length() == ct.length(2))
      && (d[3].length() == ct.length(3))
      && (d[4].length() == ct.length(4));
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<6> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1))
      && (d[2].length() == ct.length(2))
      && (d[3].length() == ct.length(3))
      && (d[3].length() == ct.length(4))
      && (d[5].length() == ct.length(5));
}
template<class Domain>
bool conforms(const Domain &d, const ConformTag<7> &ct)
{
  return (d[0].length() == ct.length(0))
      && (d[1].length() == ct.length(1))
      && (d[2].length() == ct.length(2))
      && (d[3].length() == ct.length(3))
      && (d[3].length() == ct.length(4))
      && (d[5].length() == ct.length(5))
      && (d[6].length() == ct.length(6));
}
template<int D, class T>
struct LeafFunctor<Scalar<T>, ConformTag<D> >
{
  typedef bool Type_t;
  static Type_t apply(const Scalar<T> &, const ConformTag<D> &)
  {
    return true;
  }
};
template<class T, class A> struct LeafFunctor;
struct PerformUpdateTag {};
template<class Node>
struct LeafFunctor<Node, PerformUpdateTag>
{
  typedef int Type_t;
  inline static
  Type_t apply(const Node &, const PerformUpdateTag &)
    {
      return 0;
    }
};
template<class T>
class ModelElement
{
public:
  explicit ModelElement(const T &e) : e_m(e) { }
  ModelElement(const ModelElement<T> &m) : e_m(m.e_m) { }
  const T &element() const { return e_m; }
private:
  const T &e_m;
};
template<class T>
inline ModelElement<T> modelElement(const T &elem)
  {
    return ModelElement<T>(elem);
  }
template<class T, class A> struct LeafFunctor;
template<class T> class Scalar;
struct NotifyPreReadTag { };
template<class T>
struct LeafFunctor<Scalar<T>, NotifyPreReadTag>
{
  typedef bool Type_t;
  static Type_t apply(const Scalar<T> &, const NotifyPreReadTag &)
  {
    return true;
  }
};
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnArcCos,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
acos(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnArcCos,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnArcSin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
asin(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnArcSin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnArcTan,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
atan(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnArcTan,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnCeil,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
ceil(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnCeil,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnCos,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
cos(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnCos,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnHypCos,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
cosh(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnHypCos,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnExp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
exp(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnExp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnFabs,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
fabs(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnFabs,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnFloor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
floor(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnFloor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnLog,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
log(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnLog,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnLog10,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
log10(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnLog10,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnSin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
sin(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnSin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnHypSin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
sinh(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnHypSin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnSqrt,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
sqrt(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnSqrt,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnTan,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
tan(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnTan,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnHypTan,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
tanh(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnHypTan,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<OpUnaryMinus,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<OpUnaryMinus,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<OpUnaryPlus,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<OpUnaryPlus,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<OpBitwiseNot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
operator~(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<OpBitwiseNot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<OpIdentity,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
PETE_identity(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<OpIdentity,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<OpNot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
operator!(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<OpNot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<UnaryNode<OpCast<T1>,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
peteCast(const T1&, const Array<D2,T2,E2> & l)
{
  typedef UnaryNode<OpCast<T1>,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D2,T2,E2> >::make(l)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLeftShift,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<<(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLeftShift,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpRightShift,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>>(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpRightShift,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpLT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpLE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<=(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpGT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpGE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>=(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator&&(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator||(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpLeftShift,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<<(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLeftShift,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpRightShift,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>>(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpRightShift,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLT,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGT,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAnd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpOr,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class T2,class T3>
inline typename MakeReturn<TrinaryNode<FnWhere,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t,
  typename CreateLeaf<T3 >::Leaf_t> >::Expression_t
where(const Array<D1,T1,E1> & c,const T2 & t,const T3 & f)
{
  typedef TrinaryNode<FnWhere,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t,
    typename CreateLeaf<T3 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(c),
    CreateLeaf<T2 >::make(t),
    CreateLeaf<T3 >::make(f)));
}
template<int D, class T, class EngineTag> class Tensor;
template<class OutputEngineTag, int D, class T, class EngineTag>
Tensor<D, T, OutputEngineTag>
symmetrize(const Tensor<D, T, EngineTag> &x);
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnReal,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
real(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnReal,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnImag,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
imag(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnImag,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnAbs,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
abs(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnAbs,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnArg,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
arg(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnArg,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnNorm,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
norm(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnNorm,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnConj,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
conj(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnConj,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnPow2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
pow2(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnPow2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnPow3,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
pow3(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnPow3,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnPow4,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
pow4(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnPow4,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnMagnitude,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
magnitude(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnMagnitude,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnTrace,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
trace(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnTrace,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnDet,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
det(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnDet,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnTranspose,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
transpose(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnTranspose,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<class OutputSymmetry,int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnSymmetrize<OutputSymmetry>,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
symmetrize(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnSymmetrize<OutputSymmetry>,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
polar(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnMin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
min(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnMax,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
max(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LT(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LE(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GT(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GE(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
NE(const Array<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
polar(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
outerProduct(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
dotdot(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnMin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
min(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<FnMax,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
max(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
LT(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
LE(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
GT(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
GE(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
EQ(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class T2>
inline typename MakeReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
NE(const Array<D1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPolar,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
polar(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnMin,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
min(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnMax,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
max(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLT2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LT(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpLE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LE(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGT2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GT(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpGE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GE(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class T1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
NE(const T1 & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<BinaryNode<FnMin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
min(const Array<D1,T1,E1> & l,const Array<D1,T1,E1> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D1,T1,E1> >::make(r)));
}
template<int D1,class T1,class E1>
inline typename MakeReturn<BinaryNode<FnMax,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
max(const Array<D1,T1,E1> & l,const Array<D1,T1,E1> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D1,T1,E1> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpAdd,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpDivide,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpMod,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnDot,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnPow,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnFmod,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpEQ,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Vector<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Tensor<D1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeReturn<BinaryNode<OpNE,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const TinyMatrix<DR1,DC1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<int Dim, class T, class EngineTag>
struct CreateLeaf<Array<Dim, T, EngineTag> >
{
  typedef Array<Dim, T, EngineTag> Input_t;
  typedef Reference<Input_t> Leaf_t;
  typedef Leaf_t Return_t;
  inline static
  Return_t make(const Input_t &a)
    {
      return Leaf_t(a);
    }
};
template<int Dim, class T, class Expr>
struct CreateLeaf<Array<Dim, T, ExpressionTag<Expr> > >
{
  typedef Array<Dim, T, ExpressionTag<Expr> > Input_t;
  typedef Expr Leaf_t;
  typedef const Leaf_t &Return_t;
  inline static
  Return_t make(const Input_t &a)
    {
      return a.engine().expression();
    }
};
template<int Dim, class T, class EngineTag>
struct CreateLeaf<Scalar<Array<Dim, T, EngineTag> > >
{
  typedef Scalar<Array<Dim, T, EngineTag> > Input_t;
  typedef Scalar<ErrorType> Leaf_t;
  typedef Leaf_t Return_t;
  inline static
  Return_t make(const Input_t &)
    {
      return ErrorType();
    }
};
template<class Op,class Leaf>
struct MakeReturn<UnaryNode<Op,Leaf> >
{
  typedef UnaryNode<Op,Leaf> Tree_t;
  typedef typename ForEach<Tree_t,
    DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename UnaryReturn<typename ForEach<Leaf,
    EvalLeaf<dim>,OpCombine>::Type_t,
    Op>::Type_t T_t;
  typedef Engine<dim,T_t,ExpressionTag<Tree_t> > Engine_t;
  typedef Array<dim,T_t,ExpressionTag<Tree_t > > Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class Op,class Left,class Right>
struct MakeReturn<BinaryNode<Op,Left,Right> >
{
  typedef BinaryNode<Op,Left,Right> Tree_t;
  typedef typename ForEach<Tree_t,
    DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename BinaryReturn<typename ForEach<Left,
    EvalLeaf<dim>,OpCombine>::Type_t,
    typename ForEach<Right,EvalLeaf<dim>,OpCombine>::Type_t,
    Op>::Type_t T_t;
  typedef Engine<dim,T_t,ExpressionTag<Tree_t> > Engine_t;
  typedef Array<dim,T_t,ExpressionTag<Tree_t > > Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class Op,class Cl,class Tr,class Fl>
struct MakeReturn<TrinaryNode<Op,Cl,Tr,Fl> >
{
  typedef TrinaryNode<Op,Cl,Tr,Fl> Tree_t;
  typedef typename ForEach<Tree_t,
    DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename TrinaryReturn<typename ForEach<Cl,
    EvalLeaf<dim>,OpCombine>::Type_t,
    typename ForEach<Tr,EvalLeaf<dim>,OpCombine>::Type_t,
    typename ForEach<Fl,EvalLeaf<dim>,OpCombine>::Type_t,
    Op>::Type_t T_t;
  typedef Engine<dim,T_t,ExpressionTag<Tree_t> > Engine_t;
  typedef Array<dim,T_t,ExpressionTag<Tree_t > > Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class Op, class T>
struct ReductionTraits {
};
template<class T>
struct ReductionTraits<OpAddAssign, T> {
  static inline T identity() { return T(0); }
};
template<class T>
struct ReductionTraits<OpMultiplyAssign, T> {
  static inline T identity() { return T(1); }
};
template<class T>
struct ReductionTraits<FnMinAssign, T> {
  static inline T identity() { return std::numeric_limits<T>::max(); }
};
template<class T>
struct ReductionTraits<FnMaxAssign, T> {
  static inline T identity() { return std::numeric_limits<T>::min(); }
};
template<class T>
struct ReductionTraits<FnOrAssign, T> {
  static inline T identity() { return T(false); }
};
template<class T>
struct ReductionTraits<FnAndAssign, T> {
  static inline T identity() { return T(true); }
};
template<class T>
struct ReductionTraits<OpBitwiseOrAssign, T> {
  static inline T identity() { return T(); }
};
template<class T>
struct ReductionTraits<OpBitwiseAndAssign, T> {
  static inline T identity() { return ~T(); }
};
#ifndef _OPENMP
template<class T>
struct PartialReduction {
 static inline void init() {}
 inline void storePartialResult(const T& result)
 {
   answer = result;
 }
 template <class Op>
 inline void reduce(T& ret, const Op&)
 { 
   ret = answer;
 } 
 T answer;
};
#else
template<class T>
struct PartialReduction {
  static inline void init()
  {
    if (!answer)
     answer = new T[omp_get_max_threads()];
  }
  inline void storePartialResult(const T& result)
  {
    int n = omp_get_thread_num();
    answer[n] = result;
    if (n == 0)
      num_threads = omp_get_num_threads();
  }
  template <class Op>
  inline void reduce(T& ret, const Op& op)
  {
    T res = answer[0];
    for (int i = 1; i<num_threads; ++i)
      op(res, answer[i]);
    ret = res;
  }
  int num_threads;
  static T *answer;
};
template <class T>
T *PartialReduction<T>::answer = NULL;
#endif
template<class KernelTag>
struct ReductionEvaluator;
template<>
struct ReductionEvaluator<InlineKernelTag>
{
  template<class T, class Op, class Expr>
  static /*__attribute__((leafify))*/
  void evaluate(T &ret, const Op &op, const Expr &e)
  {
    typedef typename Expr::Domain_t Domain_t;
    PoomaCTAssert<(Domain_t::unitStride)>::test();
    for (int i=0; i<Domain_t::dimensions; ++i)
      ;
    PartialReduction<T>::init();
    evaluate(ret, op, e, e.domain(),
      WrappedInt<Domain_t::dimensions>());
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<1>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    PartialReduction<T> reduction;
#pragma omp parallel if (e0 > 512)
    {
      T answer = ReductionTraits<Op, T>::identity();
;
#pragma omp for nowait
      for (int i0 = 0; i0 < e0; ++i0)
        op(answer, localExpr.read(i0));
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<2>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i1 = 0; i1 < e1; ++i1) {
;
 for (int i0 = 0; i0 < e0; ++i0)
   op(answer, localExpr.read(i0, i1));
      }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<3>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i2 = 0; i2 < e2; ++i2)
 for (int i1 = 0; i1 < e1; ++i1) {
;
   for (int i0 = 0; i0 < e0; ++i0)
     op(answer, localExpr.read(i0, i1, i2));
 }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<4>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i3 = 0; i3 < e3; ++i3)
 for (int i2 = 0; i2 < e2; ++i2)
   for (int i1 = 0; i1 < e1; ++i1) {
;
     for (int i0 = 0; i0 < e0; ++i0)
       op(answer, localExpr.read(i0, i1, i2, i3));
   }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<5>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i4 = 0; i4 < e4; ++i4)
 for (int i3 = 0; i3 < e3; ++i3)
   for (int i2 = 0; i2 < e2; ++i2)
     for (int i1 = 0; i1 < e1; ++i1) {
;
       for (int i0 = 0; i0 < e0; ++i0)
  op(answer, localExpr.read(i0, i1, i2, i3, i4));
     }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<6>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
    int e5 = domain[5].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i5 = 0; i5 < e5; ++i5)
 for (int i4 = 0; i4 < e4; ++i4)
   for (int i3 = 0; i3 < e3; ++i3)
     for (int i2 = 0; i2 < e2; ++i2)
       for (int i1 = 0; i1 < e1; ++i1) {
;
  for (int i0 = 0; i0 < e0; ++i0)
    op(answer, localExpr.read(i0, i1, i2, i3, i4, i5));
       }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
  template<class T, class Op, class Expr, class Domain>
  inline static void evaluate(T &ret, const Op &op, const Expr &e,
    const Domain &domain, WrappedInt<7>)
  {
    Expr localExpr(e);
    int e0 = domain[0].length();
    int e1 = domain[1].length();
    int e2 = domain[2].length();
    int e3 = domain[3].length();
    int e4 = domain[4].length();
    int e5 = domain[5].length();
    int e6 = domain[6].length();
    PartialReduction<T> reduction;
#pragma omp parallel
    {
      T answer = ReductionTraits<Op, T>::identity();
#pragma omp for nowait
      for (int i6 = 0; i6 < e6; ++i6)
 for (int i5 = 0; i5 < e5; ++i5)
   for (int i4 = 0; i4 < e4; ++i4)
     for (int i3 = 0; i3 < e3; ++i3)
       for (int i2 = 0; i2 < e2; ++i2)
  for (int i1 = 0; i1 < e1; ++i1) {
;
    for (int i0 = 0; i0 < e0; ++i0)
      op(answer, localExpr.read(i0, i1, i2, i3, i4, i5, i6));
  }
      reduction.storePartialResult(answer);
    }
    reduction.reduce(ret, op);
  }
};
template<class T, class Op>
struct CompressibleReduce
{
  template<class T1>
  inline static void evaluate(T &ret, const Op &, const T1 &val, int)
  {
    ret = static_cast<T>(val);
  }
};
template<class T>
struct CompressibleReduce<T, OpAddAssign>
{
  template<class T1>
  inline static void evaluate(T &ret, const OpAddAssign &, const T1 &val,
    int n)
  {
    ret = static_cast<T>(n * val);
  }
};
template<class T>
struct CompressibleReduce<T, OpMultiplyAssign>
{
  template<class T1>
  inline static void evaluate(T &ret, const OpMultiplyAssign &, const T1 &val,
    int n)
  {
    ret = static_cast<T>(val);
    while (--n > 0)
      ret *= static_cast<T>(val);
  }
};
template<>
struct ReductionEvaluator<CompressibleKernelTag>
{
  template<class T, class Op, class Expr>
  inline static void evaluate(T &ret, const Op &op, const Expr &e)
  {
    if (engineFunctor(e, Compressed()))
      {
        CompressibleReduce<T, Op>::
          evaluate(ret, op, engineFunctor(e, CompressedRead()),
            e.domain().size());
      }
    else
      {
        ReductionEvaluator<InlineKernelTag>::evaluate(ret, op, e);
      }
  }
};
namespace Pooma {
class CountingSemaphore
{
public:
  CountingSemaphore() { }
  CountingSemaphore(const CountingSemaphore &) { }
  CountingSemaphore &operator=(const CountingSemaphore &) { return *this; }
  void wait() const { }
  int count() const { return 0; }
  int height() const { return 0; }
  void height(int) { }
  void raise_height(int) { }
  void incr() { }
  CountingSemaphore &operator++() { incr(); return *this; }
  int operator+=(int) { return 0; }
};
}
template<class T, class Op, class Expr, class KernelTag>
class ReductionKernel : public Pooma::Iterate_t
{
public:
  typedef ReductionKernel<T, Op, Expr, KernelTag> This_t;
  ReductionKernel(T &ret, const Op &op, const Expr &e,
    Pooma::CountingSemaphore &csem);
  virtual ~ReductionKernel();
  virtual void /*__attribute__((leafify))*/ run();
private:
  T &ret_m;
  Op op_m;
  Expr expr_m;
  Pooma::CountingSemaphore &csem_m;
};
template<class T, class Op, class Expr, class KernelTag>
ReductionKernel<T, Op, Expr, KernelTag>::
ReductionKernel(T &ret, const Op &op, const Expr &e,
  Pooma::CountingSemaphore &csem)
  : Pooma::Iterate_t(Pooma::scheduler()),
    ret_m(ret), op_m(op), expr_m(e), csem_m(csem)
{
  DataObjectRequest<ReadRequest> readReq(*this);
  engineFunctor(expr_m, readReq);
}
template<class T, class Op, class Expr, class KernelTag>
ReductionKernel<T, Op, Expr, KernelTag>::~ReductionKernel()
{
  DataObjectRequest<ReadRelease> readRelease;
  engineFunctor(expr_m, readRelease);
  csem_m.incr();
}
template<class T, class Op, class Expr, class KernelTag>
void ReductionKernel<T, Op, Expr, KernelTag>::run()
{
  ReductionEvaluator<KernelTag>::evaluate(ret_m, op_m, expr_m);
}
template <class EvalTag>
struct Reduction
{ };
template <>
struct Reduction<MainEvaluatorTag>
{
  Reduction() { }
  ~Reduction() { }
  template <class Expr>
  static inline bool checkValidity(const Expr &e, WrappedInt<false>)
  {
    return true;
  }
  template <class Expr>
  static inline bool checkValidity(const Expr &e, WrappedInt<true>)
  {
    return e.centeringSize() == 1 && e.numMaterials() == 1;
  }
  template<class T, class Op, class Cond, class Expr>
  void evaluate(T &ret, const Op &op, const WhereProxy<Cond, Expr> &w) const
  {
    evaluate(ret, w.opMask(op), w.whereMask());
  }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e) const
  {
    typedef typename EvaluatorTag1<Expr>::Evaluator_t Evaluator_t;
    Pooma::scheduler().beginGeneration();
    ;
    forEach(e, PerformUpdateTag(), NullCombine());
    Reduction<Evaluator_t>().evaluate(ret, op, e());
    Pooma::scheduler().endGeneration();
    ;
  }
};
template <>
struct Reduction<SinglePatchEvaluatorTag>
{
  Reduction() { }
  ~Reduction() { }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e,
  Pooma::CountingSemaphore &csem) const
  {
    typedef typename KernelTag1<Expr>::Kernel_t Kernel_t;
    Pooma::Iterate_t *iterate =
      new ReductionKernel<T, Op, Expr, Kernel_t>(ret, op, e, csem);
    Pooma::scheduler().handOff(iterate);
  }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e) const
  {
    Pooma::CountingSemaphore csem;
    csem.height(1);
    evaluate(ret, op, e, csem);
    csem.wait();
  }
};
template <>
struct Reduction<MultiPatchEvaluatorTag>
{
  Reduction() { }
  ~Reduction() { }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e) const
  {
    typedef Intersector<Expr::dimensions> Inter_t;
    Inter_t inter;
    expressionApply(e, IntersectorTag<Inter_t>(inter));
    const int n = inter.size();
    Pooma::CountingSemaphore csem;
    csem.height(n);
    T *vals = new T[n];
    typename Inter_t::const_iterator i = inter.begin();
    int j = 0;
    while (j < n)
      {
        Reduction<SinglePatchEvaluatorTag>().
          evaluate(vals[j], op, e(*i), csem);
        ++i; ++j;
      }
    csem.wait();
    ret = vals[0];
    for (j = 1; j < n; j++)
      op(ret, vals[j]);
    delete [] vals;
  }
};
template<class Subject>
typename Subject::Element_t sum(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, OpAddAssign(), s);
  return ret;
}
template<class Subject>
typename Subject::Element_t prod(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, OpMultiplyAssign(), s);
  return ret;
}
template<class Subject>
typename Subject::Element_t min(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, FnMinAssign(), s);
  return ret;
}
template<class Subject>
typename Subject::Element_t max(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, FnMaxAssign(), s);
  return ret;
}
template<class Subject>
bool all(const Subject &s)
{
  bool ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, FnAndAssign(), s);
  return ret;
}
template<class Subject>
bool any(const Subject &s)
{
  bool ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, FnOrAssign(), s);
  return ret;
}
template<class Subject>
typename Subject::Element_t bitOr(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, OpBitwiseOrAssign(), s);
  return ret;
}
template<class Subject>
typename Subject::Element_t bitAnd(const Subject &s)
{
  typename Subject::Element_t ret;
  Reduction<MainEvaluatorTag>().evaluate(ret, OpBitwiseAndAssign(), s);
  return ret;
}
template<int Dim, class T, class EngineTag,
  int OtherDim, class OtherT, class OtherEngineTag, class Op>
inline const Array<Dim, T, EngineTag> &
assign(const Array<Dim, T, EngineTag> &lhs,
       const Array<OtherDim, OtherT, OtherEngineTag> &rhs,
       const Op &op);
template<int Dim, class T, class EngineTag, class T1, class Op>
inline const Array<Dim, T, EngineTag> &
assign(const Array<Dim, T, EngineTag> &lhs, const T1 &rhs, const Op &op);
template<class Subject, class Sub1, bool SV>
struct View1Implementation;
template<int Dim, class T, class EngineTag, class Domain>
struct View1Implementation<Array<Dim, T, EngineTag>, Domain, true>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  template<class S1, class Combine>
  inline static
  Type_t make(const Subject_t &a, const S1 &s1,
       const Combine &)
    {
      Domain s(Combine::make(a, s1));
      return a.engine()(s);
    }
  template<class S1, class S2, class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2));
      return a.engine()(s);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3));
      return a.engine()(s);
    }
  template<class S1, class S2, class S3, class S4,
    class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const S4 &s4,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4));
      return a.engine()(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const S4 &s4, const S5 &s5,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5));
      return a.engine()(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const S4 &s4, const S5 &s5, const S6 &s6,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6));
      return a.engine()(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class S7, class Combine>
  inline static
  Type_t make(const Subject_t &a,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const S4 &s4, const S5 &s5, const S6 &s6,
       const S7 &s7,
       const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6, s7));
      return a.engine()(s);
    }
  template<class S1, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a, const S1 &s1,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1));
      return a.engine().read(s);
    }
  template<class S1, class S2, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2));
      return a.engine().read(s);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2, const S3 &s3,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3));
      return a.engine().read(s);
    }
  template<class S1, class S2, class S3, class S4,
    class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2, const S3 &s3,
                   const S4 &s4,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4));
      return a.engine().read(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2, const S3 &s3,
                   const S4 &s4, const S5 &s5,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5));
      return a.engine().read(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2, const S3 &s3,
                   const S4 &s4, const S5 &s5, const S6 &s6,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6));
      return a.engine().read(s);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class S7, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &a,
                   const S1 &s1, const S2 &s2, const S3 &s3,
                   const S4 &s4, const S5 &s5, const S6 &s6,
                   const S7 &s7,
                   const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6, s7));
      return a.engine().read(s);
    }
};
template<int Dim, class T, class EngineTag, class Domain>
struct View1Implementation<Array<Dim, T, EngineTag>, Domain, false>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef typename NewEngine<Engine_t, Domain>::Type_t NewEngine_t;
  enum { newDim = NewEngine_t::dimensions };
  typedef typename NewEngine_t::Tag_t NewEngineTag_t;
  typedef Array<newDim, T, NewEngineTag_t> Type_t;
  typedef Type_t ReadType_t;
  typedef NewEngineEngine<Engine_t, Domain> NewEE_t;
  typedef NewEngineDomain<Engine_t, Domain> NewED_t;
  template<class S1, class Combine>
  static
  Type_t make(const Subject_t &a, const S1 &s1,
           const Combine &)
    {
      Domain s(Combine::make(a, s1));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class Combine>
  static
  Type_t make(const Subject_t &a, const S1 &s1,
           const S2 &s2, const Combine &)
    {
      Domain s(Combine::make(a, s1, s2));
      return Type_t(
     NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class S3,
    class Combine>
  static
  Type_t make(const Subject_t &a,
           const S1 &s1, const S2 &s2, const S3 &s3,
           const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class S3, class S4,
    class Combine>
  static
  Type_t make(const Subject_t &a,
           const S1 &s1, const S2 &s2, const S3 &s3,
           const S4 &s4,
           const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class Combine>
  static
  Type_t make(const Subject_t &a,
           const S1 &s1, const S2 &s2, const S3 &s3,
           const S4 &s4, const S5 &s5,
           const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class Combine>
  static
  Type_t make(const Subject_t &a,
           const S1 &s1, const S2 &s2, const S3 &s3,
           const S4 &s4, const S5 &s5, const S6 &s6,
           const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class S7, class Combine>
  static
  Type_t make(const Subject_t &a,
           const S1 &s1, const S2 &s2, const S3 &s3,
           const S4 &s4, const S5 &s5, const S6 &s6,
           const S7 &s7,
           const Combine &)
    {
      Domain s(Combine::make(a, s1, s2, s3, s4, s5, s6, s7));
      return Type_t(
  NewEE_t::apply(a.engine(), s),
  NewED_t::apply(a.engine(), s));
    }
  template<class S1, class Combine>
  inline static
  Type_t makeRead(const Subject_t &a, const S1 &s1,
               const Combine &c)
    {
      return make(a, s1, c);
    }
  template<class S1, class S2, class Combine>
  inline static
  Type_t makeRead(const Subject_t &a, const S1 &s1,
               const S2 &s2, const Combine &c)
    {
      return make(a, s1, s2, c);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &a,
               const S1 &s1, const S2 &s2, const S3 &s3,
               const Combine &c)
    {
      return make(a, s1, s2, s3, c);
    }
  template<class S1, class S2, class S3, class S4,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &a,
               const S1 &s1, const S2 &s2, const S3 &s3,
               const S4 &s4, const Combine &c)
    {
      return make(a, s1, s2, s3, s4, c);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &a,
               const S1 &s1, const S2 &s2, const S3 &s3,
               const S4 &s4, const S5 &s5, const Combine &c)
    {
      return make(a, s1, s2, s3, s4, s5, c);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &a,
               const S1 &s1, const S2 &s2, const S3 &s3,
               const S4 &s4, const S5 &s5, const S6 &s6,
               const Combine &c)
    {
      return make(a, s1, s2, s3, s4, s5, s6, c);
    }
  template<class S1, class S2, class S3, class S4, class S5,
    class S6, class S7,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &a,
               const S1 &s1, const S2 &s2, const S3 &s3,
               const S4 &s4, const S5 &s5, const S6 &s6,
               const S7 &s7, const Combine &c)
    {
      return make(a, s1, s2, s3, s4, s5, s6, s7, c);
    }
};
template<int Dim, class T, class EngineTag, class Domain>
struct View1<Array<Dim, T, EngineTag>, Domain>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef TemporaryNewDomain1<Domain_t, Domain> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Domain &s1)
    {
      return Dispatch_t::make(a, s1, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Domain &s1)
    {
      return Dispatch_t::makeRead(a, s1, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View0<Array<Dim, T, EngineTag> >
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef typename NewEngine<Engine_t, Domain_t>::Type_t NewEngine_t;
  enum { newDim = NewEngine_t::dimensions };
  typedef typename NewEngine_t::Tag_t NewEngineTag_t;
  typedef Array<newDim, T, NewEngineTag_t> Type_t;
  typedef Type_t ReadType_t;
  static Type_t make(const Subject_t &a)
    {
      typedef NewEngineEngine<Engine_t, Domain_t> NewEE_t;
      typedef NewEngineDomain<Engine_t, Domain_t> NewED_t;
      return Type_t(
  NewEE_t::apply(a.engine(), a.engine().domain()),
  NewED_t::apply(a.engine(), a.engine().domain()));
    }
  inline static ReadType_t makeRead(const Subject_t &a)
    {
      return make(a);
    }
};
template<int Dim, class T, class EngineTag>
struct View1<Array<Dim, T, EngineTag>, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1)
    {
      return a.engine()(s1);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1)
    {
      return a.engine().read(s1);
    }
};
template<int Dim, class T, class EngineTag>
struct View1<Array<Dim, T, EngineTag>, Loc<Dim> >
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, const Loc<Dim>& s1)
    {
      ;
      return a.engine()(s1);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Loc<Dim>& s1)
    {
      ;
      return a.engine().read(s1);
    }
};
template<int D1, class T1, class E1, int D2, class T2, class E2>
struct View1<Array<D1, T1, E1>, Array<D2, T2, E2> >
{
  typedef Array<D1, T1, E1> Array1_t;
  typedef Array<D2, T2, E2> Array2_t;
  typedef IndirectionTag<Array1_t, Array2_t> Tag_t;
  typedef Array<D2, T1, Tag_t> Type_t;
  typedef Type_t ReadType_t;
  static
  Type_t make(const Array1_t &a, const Array2_t &s)
    {
      return Type_t(a, s);
    }
  inline static
  Type_t makeRead(const Array1_t &a, const Array2_t &s)
    {
      return make(a, s);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2>
struct View2<Array<Dim, T, EngineTag>, Sub1, Sub2>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain2<Sub1, Sub2> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2)
    {
      return Dispatch_t::make(a, s1, s2, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2)
    {
      return Dispatch_t::makeRead(a, s1, s2, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View2<Array<Dim, T, EngineTag>, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1, int s2)
    {
      return a.engine()(s1, s2);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2)
    {
      return a.engine().read(s1, s2);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3>
struct View3<Array<Dim, T, EngineTag>, Sub1, Sub2, Sub3>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain3<Sub1, Sub2, Sub3> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3)
    {
      return Dispatch_t::make(a, s1, s2, s3, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3)
    {
      return Dispatch_t::makeRead(a, s1, s2, s3, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View3<Array<Dim, T, EngineTag>, int, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1, int s2, int s3)
    {
      return a.engine()(s1, s2, s3);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2, int s3)
    {
      return a.engine().read(s1, s2, s3);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3, class Sub4>
struct View4<Array<Dim, T, EngineTag>,
  Sub1, Sub2, Sub3, Sub4>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain4<Sub1, Sub2, Sub3, Sub4> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4)
    {
      return Dispatch_t::make(a, s1, s2, s3, s4, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4)
    {
      return Dispatch_t::makeRead(a, s1, s2, s3, s4, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View4<Array<Dim, T, EngineTag>, int, int, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1, int s2, int s3, int s4)
    {
      return a.engine()(s1, s2, s3, s4);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2, int s3, int s4)
    {
      return a.engine().read(s1, s2, s3, s4);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
struct View5<Array<Dim, T, EngineTag>,
  Sub1, Sub2, Sub3, Sub4, Sub5>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain5<Sub1, Sub2, Sub3, Sub4, Sub5> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5)
    {
      return Dispatch_t::make(a, s1, s2, s3, s4, s5, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5)
    {
      return Dispatch_t::makeRead(a, s1, s2, s3, s4, s5, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View5<Array<Dim, T, EngineTag>, int, int, int, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2, int s3,
    int s4, int s5)
    {
      return a.engine().read(s1, s2, s3, s4, s5);
    }
  inline static
  Type_t make(const Subject_t &a, int s1, int s2, int s3, int s4, int s5)
    {
      return a.engine()(s1, s2, s3, s4, s5);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
  class Sub6>
struct View6<Array<Dim, T, EngineTag>,
  Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain6<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5, const Sub6 &s6)
    {
      return Dispatch_t::make(a, s1, s2, s3, s4, s5, s6, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5, const Sub6 &s6)
    {
      return Dispatch_t::makeRead(a, s1, s2, s3, s4, s5, s6, Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View6<Array<Dim, T, EngineTag>, int, int, int, int, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1, int s2, int s3, int s4, int s5,
       int s6)
    {
      return a.engine()(s1, s2, s3, s4, s5, s6);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2, int s3,
    int s4, int s5, int s6)
    {
      return a.engine().read(s1, s2, s3, s4, s5, s6);
    }
};
template<int Dim, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
  class Sub6, class Sub7>
struct View7<Array<Dim, T, EngineTag>,
  Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain7<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>
    NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::Type_t Type_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  inline static
  Type_t make(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5, const Sub6 &s6,
    const Sub7 &s7)
    {
      return Dispatch_t::make(a, s1, s2, s3, s4, s5, s6, s7, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3, const Sub4 &s4, const Sub5 &s5, const Sub6 &s6,
    const Sub7 &s7)
    {
      return Dispatch_t::makeRead(a, s1, s2, s3, s4, s5, s6, s7,
        Combine_t());
    }
};
template<int Dim, class T, class EngineTag>
struct View7<Array<Dim, T, EngineTag>, int, int, int, int, int, int, int>
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &a, int s1, int s2, int s3, int s4, int s5,
       int s6, int s7)
    {
      return a.engine()(s1, s2, s3, s4, s5, s6, s7);
    }
  inline static
  ReadType_t makeRead(const Subject_t &a, int s1, int s2, int s3,
    int s4, int s5, int s6, int s7)
    {
      return a.engine().read(s1, s2, s3, s4, s5, s6, s7);
    }
};
template <class Subject, class Domain>
struct ReverseSliceView;
template <int SliceDim, class T, class EngineTag, int Dim>
struct ReverseSliceView<Array<SliceDim, T, EngineTag>, SliceInterval<Dim, SliceDim> >
{
  typedef Array<SliceDim, T, EngineTag> Subject_t;
  typedef SliceInterval<Dim, SliceDim> Domain_t;
  typedef typename NewEngine<typename Subject_t::Engine_t, Domain_t>::Type_t NewEngine_t;
  typedef Array<Dim, T, typename NewEngine_t::Tag_t> Type_t;
  inline static
  Type_t make(const Subject_t &a, const SliceInterval<Dim, SliceDim>& dom,
       const Interval<Dim>& totalDom)
  {
    return Type_t(NewEngine_t(a.engine(), dom, totalDom));
  }
};
template<int Dim, class T, class EngineTag>
struct Patch<Array<Dim, T, EngineTag> >
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t OldEngine_t;
  typedef typename EngineFunctor<OldEngine_t, EnginePatch>::Type_t Engine_t;
  typedef Array<Dim, T, typename Engine_t::Tag_t> Type_t;
  inline static
  Type_t make(const Subject_t &subject, int i)
    {
      return Type_t(engineFunctor(subject.engine(), EnginePatch(i)));
    }
};
template<class Components, int Dim, class T, class EngineTag>
struct ComponentView<Components, Array<Dim, T, EngineTag> >
{
  typedef Array<Dim, T, EngineTag> Subject_t;
  typedef Engine<Dim, T, EngineTag> Engine_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename ComponentAccess<Element_t, Components>::Element_t NewT_t;
  typedef CompFwd<Engine_t, Components> NewEngineTag_t;
  typedef Array<Dim, NewT_t, NewEngineTag_t> Type_t;
  inline static
  Type_t make(const Subject_t &a, const Components &c)
    {
      return Type_t(a, ComponentWrapper<Components>(c));
    }
};
template<int Dim, class T = double,
  class EngineTag = Brick>
class Array
{
public:
  typedef Array<Dim, T, EngineTag> This_t;
  typedef Engine<Dim, T, EngineTag> Engine_t;
  typedef EngineTag EngineTag_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef typename Engine_t::Domain_t Domain_t;
  typedef typename Engine_t::Layout_t Layout_t;
  enum { dimensions = Engine_t::dimensions };
  enum { rank = Engine_t::dimensions };
  enum { hasRelations = false };
  Array() { }
  inline explicit Array(const Engine_t &modelEngine)
  : engine_m(modelEngine)
    { }
  template<int Dim2, class T2, class EngineTag2, class Initializer>
  inline Array(const Engine<Dim2, T2, EngineTag2> &engine,
    const Initializer &init)
  : engine_m(engine, init)
    { }
  template<int D1, class T1, class E1, int D2, class T2, class E2>
  inline Array(const Array<D1, T1, E1> &a1, const Array<D2, T2, E2> &a2)
  : engine_m(a1, a2)
    { }
  inline Array(const This_t &model)
  : engine_m(model.engine())
    { }
  template<int OtherDim, class OtherT, class OtherEngineTag>
  inline explicit Array(const Array<OtherDim, OtherT, OtherEngineTag> &model)
  : engine_m(model.engine())
    { }
  template<int OtherDim, class OtherT, class OtherEngineTag, class OtherDomain>
  inline Array(const Array<OtherDim, OtherT, OtherEngineTag> &model,
        const OtherDomain &domain)
  : engine_m(NewEngineEngine<Engine<OtherDim,OtherT,OtherEngineTag>,
             OtherDomain>::apply(model.engine(),domain),
             NewEngineDomain<Engine<OtherDim,OtherT,OtherEngineTag>,
             OtherDomain>::apply(model.engine(),domain))
    { }
  template <class OtherT, class OtherEngineTag, class Components>
  Array(const Array<Dim, OtherT, OtherEngineTag> &a,
 const ComponentWrapper<Components>& c)
  : engine_m(a.engine(), c.components())
    { }
  template<class Sub1>
  explicit Array(const Sub1 &s1)
  : engine_m(NewDomain1<Sub1>::combine(s1))
    { }
  template<class Sub1, class Sub2>
  Array(const Sub1 &s1, const Sub2 &s2)
  : engine_m(NewDomain2<Sub1, Sub2>::combine(s1, s2))
    { }
  template<class Sub1, class Sub2, class Sub3>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3)
  : engine_m(NewDomain3<Sub1, Sub2, Sub3>::combine(s1, s2, s3))
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4)
  : engine_m(NewDomain4<Sub1, Sub2, Sub3, Sub4>::
      combine(s1, s2, s3, s4))
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5)
  : engine_m(NewDomain5<Sub1, Sub2, Sub3, Sub4, Sub5>::
      combine(s1, s2, s3, s4, s5))
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5, const Sub6 &s6)
  : engine_m(NewDomain6<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::
      combine(s1, s2, s3, s4, s5, s6))
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5, const Sub6 &s6, const Sub7 &s7)
  : engine_m(NewDomain7<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::
      combine(s1, s2, s3, s4, s5, s6, s7))
    { }
  template<class Sub1>
  Array(const Sub1 &s1, const ModelElement<Element_t> &model)
  : engine_m(NewDomain1<Sub1>::combine(s1), model.element())
    { }
  template<class Sub1, class Sub2>
  Array(const Sub1 &s1, const Sub2 &s2,
        const ModelElement<Element_t> &model)
  : engine_m(NewDomain2<Sub1, Sub2>::combine(s1, s2), model.element())
    { }
  template<class Sub1, class Sub2, class Sub3>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
        const ModelElement<Element_t> &model)
  : engine_m(NewDomain3<Sub1, Sub2, Sub3>::combine(s1, s2, s3),
      model.element())
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const ModelElement<Element_t> &model)
  : engine_m(NewDomain4<Sub1, Sub2, Sub3, Sub4>::
      combine(s1, s2, s3, s4), model.element())
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5, const ModelElement<Element_t> &model)
  : engine_m(NewDomain5<Sub1, Sub2, Sub3, Sub4, Sub5>::
      combine(s1, s2, s3, s4, s5), model.element())
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5, const Sub6 &s6, const ModelElement<Element_t> &model)
  : engine_m(NewDomain6<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::
      combine(s1, s2, s3, s4, s5, s6), model.element())
    { }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  Array(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
        const Sub5 &s5, const Sub6 &s6, const Sub7 &s7,
        const ModelElement<Element_t> &model)
  : engine_m(NewDomain7<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::
      combine(s1, s2, s3, s4, s5, s6, s7), model.element())
    { }
  void initialize(const Engine_t &modelEngine)
    {
      engine_m = modelEngine;
    }
  template<int Dim2, class T2, class EngineTag2, class Initializer>
  void initialize(const Engine<Dim2, T2, EngineTag2> &engine,
    const Initializer &init)
    {
      engine_m = Engine_t(engine, init);
    }
  void initialize(const This_t &model)
    {
      engine_m = model.engine();
    }
  template<int OtherDim, class OtherT, class OtherEngineTag>
  void initialize(const Array<OtherDim, OtherT, OtherEngineTag> &model)
    {
      engine_m = Engine_t(model.engine());
    }
  template<int OtherDim, class OtherT, class OtherEngineTag, class OtherDomain>
  void initialize(const Array<OtherDim, OtherT, OtherEngineTag> &model,
    const OtherDomain &domain)
    {
      engine_m = Engine_t(
        NewEngineEngine<Engine<OtherDim,OtherT,OtherEngineTag>, OtherDomain>::
        apply(model.engine(),domain),
        NewEngineDomain<Engine<OtherDim,OtherT,OtherEngineTag>, OtherDomain>::
        apply(model.engine(),domain));
    }
  template<class Sub1>
  void initialize(const Sub1 &s1)
    {
      engine_m = Engine_t(NewDomain1<Sub1>::combine(s1));
    }
  template<class Sub1, class Sub2>
  void initialize(const Sub1 &s1, const Sub2 &s2)
    {
      engine_m = Engine_t(NewDomain2<Sub1, Sub2>::combine(s1, s2));
    }
  template<class Sub1, class Sub2, class Sub3>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3)
    {
      engine_m = Engine_t(NewDomain3<Sub1, Sub2, Sub3>::combine(s1, s2, s3));
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4)
    {
      engine_m = Engine_t(NewDomain4<Sub1, Sub2, Sub3, Sub4>::
                          combine(s1, s2, s3, s4));
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
                  const Sub5 &s5)
    {
      engine_m = Engine_t(NewDomain5<Sub1, Sub2, Sub3, Sub4, Sub5>::
                          combine(s1, s2, s3, s4, s5));
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
                  const Sub5 &s5, const Sub6 &s6)
    {
      engine_m = Engine_t(NewDomain6<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::
                          combine(s1, s2, s3, s4, s5, s6));
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6, const Sub7 &s7)
    {
      engine_m =
        Engine_t(NewDomain7<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::
        combine(s1, s2, s3, s4, s5, s6, s7));
    }
  template<class Sub1>
  void initialize(const Sub1 &s1, const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain1<Sub1>::combine(s1), model.element());
    }
  template<class Sub1, class Sub2>
  void initialize(const Sub1 &s1, const Sub2 &s2,
    const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain2<Sub1, Sub2>::combine(s1, s2),
        model.element());
    }
  template<class Sub1, class Sub2, class Sub3>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain3<Sub1, Sub2, Sub3>::combine(s1, s2, s3),
        model.element());
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
    const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain4<Sub1, Sub2, Sub3, Sub4>::
        combine(s1, s2, s3, s4), model.element());
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
    const Sub5 &s5, const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain5<Sub1, Sub2, Sub3, Sub4, Sub5>::
        combine(s1, s2, s3, s4, s5), model.element());
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3, const Sub4 &s4,
    const Sub5 &s5, const Sub6 &s6, const ModelElement<Element_t> &model)
    {
      engine_m = Engine_t(NewDomain6<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::
        combine(s1, s2, s3, s4, s5, s6), model.element());
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  void initialize(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6, const Sub7 &s7,
    const ModelElement<Element_t> &model)
    {
      engine_m =
        Engine_t(NewDomain7<Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::
        combine(s1, s2, s3, s4, s5, s6, s7), model.element());
    }
  ~Array()
    { }
  inline typename Patch<This_t>::Type_t
  patchLocal(int i) const
    {
      return Patch<This_t>::make(*this, i);
    }
  inline int
  numPatchesLocal() const
    {
      return engineFunctor(engine_m, EngineNumPatches());
    }
  inline const Domain_t& domain() const
    {
      return engine_m.domain();
    }
  inline Domain_t physicalDomain() const
    {
      return engine_m.layout().innerDomain();
    }
  inline const Domain_t& totalDomain() const
    {
      return engine_m.domain();
    }
  inline typename Engine_t::Layout_t layout() const
    {
      return engine_m.layout();
    }
  typename View0<This_t>::ReadType_t
  read() const
    {
      typedef View0<This_t> Ret_t;
      return Ret_t::makeRead(*this);
    }
  template<class Sub1>
  inline typename View1<This_t, Sub1>::ReadType_t
  read(const Sub1 &s1) const
    {
      typedef View1<This_t, Sub1> Ret_t;
      return Ret_t::makeRead(*this, s1);
    }
  template<class Sub1, class Sub2>
  inline typename View2<This_t, Sub1, Sub2>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2) const
    {
      typedef View2<This_t, Sub1, Sub2> Ret_t;
      return Ret_t::makeRead(*this, s1, s2);
    }
  template<class Sub1, class Sub2, class Sub3>
  inline typename View3<This_t, Sub1, Sub2, Sub3>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3) const
    {
      typedef View3<This_t, Sub1, Sub2, Sub3> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  inline typename View4<This_t, Sub1, Sub2, Sub3, Sub4>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4) const
    {
      typedef View4<This_t, Sub1, Sub2, Sub3, Sub4> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3, s4);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  inline typename View5<This_t, Sub1, Sub2, Sub3, Sub4, Sub5>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5) const
    {
      typedef View5<This_t, Sub1, Sub2, Sub3, Sub4, Sub5> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3, s4, s5);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  inline typename View6<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6) const
    {
      typedef View6<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3, s4, s5, s6);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  inline typename
    View7<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6, const Sub7 &s7) const
    {
      typedef View7<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3, s4, s5, s6, s7);
    }
  typename View0<This_t>::Type_t
  operator()() const
    {
      typedef View0<This_t> Ret_t;
      return Ret_t::make(*this);
    }
  template<class Sub1>
  inline typename View1<This_t,Sub1>::Type_t
  operator()(const Sub1 &s1) const
    {
      typedef View1<This_t, Sub1> Ret_t;
      return Ret_t::make(*this, s1);
    }
  template<class Sub1, class Sub2>
  inline typename View2<This_t, Sub1, Sub2>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2) const
    {
      typedef View2<This_t, Sub1, Sub2> Ret_t;
      return Ret_t::make(*this, s1, s2);
    }
  template<class Sub1, class Sub2, class Sub3>
  inline typename View3<This_t, Sub1, Sub2, Sub3>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3) const
    {
      typedef View3<This_t, Sub1, Sub2, Sub3> Ret_t;
      return Ret_t::make(*this, s1, s2, s3);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4>
  inline typename View4<This_t, Sub1, Sub2, Sub3, Sub4>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4) const
    {
      typedef View4<This_t, Sub1, Sub2, Sub3, Sub4> Ret_t;
      return Ret_t::make(*this, s1, s2, s3, s4);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5>
  inline typename View5<This_t, Sub1, Sub2, Sub3, Sub4, Sub5>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5) const
    {
      typedef View5<This_t, Sub1, Sub2, Sub3, Sub4, Sub5> Ret_t;
      return Ret_t::make(*this, s1, s2, s3, s4, s5);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6>
  inline typename
    View6<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6) const
    {
      typedef View6<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6> Ret_t;
      return Ret_t::make(*this, s1, s2, s3, s4, s5, s6);
    }
  template<class Sub1, class Sub2, class Sub3, class Sub4, class Sub5,
    class Sub6, class Sub7>
  inline typename
    View7<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3,
    const Sub4 &s4, const Sub5 &s5, const Sub6 &s6, const Sub7 &s7) const
    {
      typedef View7<This_t, Sub1, Sub2, Sub3, Sub4, Sub5, Sub6, Sub7> Ret_t;
      return Ret_t::make(*this, s1, s2, s3, s4, s5, s6, s7);
    }
  inline typename ComponentView<Loc<1>, This_t>::Type_t
  comp(int i1) const
    {
      return ComponentView<Loc<1>, This_t>::make(*this, Loc<1>(i1));
    }
  inline typename ComponentView<Loc<2>, This_t>::Type_t
  comp(int i1, int i2) const
    {
      return ComponentView<Loc<2>, This_t>::make(*this, Loc<2>(i1, i2));
    }
  inline typename ComponentView<Loc<3>, This_t>::Type_t
  comp(int i1, int i2, int i3) const
    {
      return ComponentView<Loc<3>, This_t>::make(*this, Loc<3>(i1, i2, i3));
    }
  inline typename ComponentView<Loc<4>, This_t>::Type_t
  comp(int i1, int i2, int i3, int i4) const
    {
      return ComponentView<Loc<4>, This_t>::make(*this,
        Loc<4>(i1, i2, i3, i4));
    }
  inline typename ComponentView<Loc<5>, This_t>::Type_t
  comp(int i1, int i2, int i3, int i4, int i5) const
    {
      return ComponentView<Loc<5>, This_t>::make(*this,
        Loc<5>(i1, i2, i3, i4, i5));
    }
  inline typename ComponentView<Loc<6>, This_t>::Type_t
  comp(int i1, int i2, int i3, int i4, int i5, int i6) const
    {
      return ComponentView<Loc<6>, This_t>::make(*this,
        Loc<6>(i1, i2, i3, i4, i5, i6));
    }
  inline typename ComponentView<Loc<7>, This_t>::Type_t
  comp(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
    {
      return ComponentView<Loc<7>, This_t>::make(*this,
        Loc<7>(i1, i2, i3, i4, i5, i6, i7));
    }
  template<class Components>
  inline typename ComponentView<Components, This_t>::Type_t
  comp(const Components &components) const
    {
      return ComponentView<Components, This_t>::make(*this, components);
    }
  inline void makeOwnCopy()
    { engine_m.makeOwnCopy(); }
  inline int first(int d) const
  {
      return engine_m.first(d);
    }
  inline int last(int d) const
    {
      return engine_m.domain()[d].last();
    }
  inline int length(int d) const
    {
      return engine_m.domain()[d].length();
    }
  inline Loc<Dim> firsts() const
    {
      return engine_m.domain().firsts();
    }
  inline Loc<Dim> lasts() const
    {
      return engine_m.domain().lasts();
    }
  inline Loc<Dim> lengths() const
    {
      return engine_m.domain().lengths();
    }
  inline long size() const
    {
      return engine_m.domain().size();
    }
  This_t &operator=(const Array<Dim, T, EngineTag> &rhs)
    {
      assign(*this, rhs, OpAssign());
      return *this;
    }
  const This_t &operator=(const Array<Dim, T, EngineTag> &rhs) const
    {
      return assign(*this, rhs, OpAssign());
    }
  template<class T1>
  const This_t &operator=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpAssign());
    }
  template<class T1>
  const This_t &operator+=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpAddAssign());
    }
  template<class T1>
  const This_t &operator-=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpSubtractAssign());
    }
  template<class T1>
  const This_t &operator*=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpMultiplyAssign());
    }
  template<class T1>
  const This_t &operator/=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpDivideAssign());
    }
  template<class T1>
  const This_t &operator%=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpModAssign());
    }
  template<class T1>
  const This_t &operator|=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseOrAssign());
    }
  template<class T1>
  const This_t &operator&=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseAndAssign());
    }
  template<class T1>
  const This_t &operator^=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseXorAssign());
    }
  template<class T1>
  const This_t &operator<<=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpLeftShiftAssign());
    }
  template<class T1>
  const This_t &operator>>=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpRightShiftAssign());
    }
  inline Engine_t &engine()
    { return engine_m; }
  inline const Engine_t &engine() const
    { return engine_m; }
private:
  Engine_t engine_m;
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, DomainFunctorTag>
{
  typedef typename Engine<Dim, T, EngineTag>::Domain_t Type_t;
  static Type_t apply(const Array<Dim, T, EngineTag> &a,
        const DomainFunctorTag &)
  {
    return a.domain();
  }
};
template<int Dim, class T, class EngineTag, class Domain>
struct LeafFunctor<Array<Dim, T, EngineTag>, ViewFunctorTag<Domain> >
{
  typedef typename View1<Array<Dim, T, EngineTag>, Domain>::Type_t Type_t;
  inline static Type_t apply(const Array<Dim, T, EngineTag> &a,
    const ViewFunctorTag<Domain> &t)
    {
      typedef View1<Array<Dim, T, EngineTag>, Domain> Ret_t;
      return Ret_t::make(a, t.domain_m + a.firsts());
    }
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, EvalLeaf<Dim> >
{
  typedef typename Array<Dim, T, EngineTag>::Element_t Type_t;
  inline static
  Type_t apply(const Array<Dim, T, EngineTag> &a, const EvalLeaf<Dim> &t)
    {
      return t.eval(a.engine());
    }
};
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Array<Dim, T, E>, EngineView<Tag> >
{
  typedef LeafFunctor<Engine<Dim, T, E>, EngineView<Tag> > LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t NewEngine_t;
  typedef typename NewEngine_t::Tag_t NewTag_t;
  typedef Array<Dim, T, NewTag_t> Type_t;
  inline static
  Type_t apply(const Array<Dim, T, E> &array,
        const EngineView<Tag> &tag)
  {
    return Type_t(LeafFunctor_t::apply(array.engine(), tag));
  }
};
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Array<Dim, T, E>, ExpressionApply<Tag> >
{
  typedef LeafFunctor<Engine<Dim, T, E>, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Array<Dim, T, E> &array,
        const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(array.engine(), tag);
  }
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, ConformTag<Dim> >
{
  typedef bool Type_t;
  static Type_t apply(const Array<Dim, T, EngineTag> &array,
    const ConformTag<Dim> &ct)
    {
      return conforms(array.domain(), ct);
    }
};
template<int Dim1, int Dim2, class T, class EngineTag>
struct LeafFunctor<Array<Dim1, T, EngineTag>, ConformTag<Dim2> >
{
  typedef bool Type_t;
  static Type_t apply(const Array<Dim1, T, EngineTag> &,
    const ConformTag<Dim2> &)
    {
      return false;
    }
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, NotifyPreReadTag>
{
  typedef bool Type_t;
  static Type_t apply(const Array<Dim, T, EngineTag> &a,
    const NotifyPreReadTag &)
    {
      return true;
    }
};
template<int Dim, class T, class E, class Tag>
struct LeafFunctor<Array<Dim, T, E>, EngineFunctorTag<Tag> >
{
  typedef typename Array<Dim,T,E>::Engine_t Engine_t;
  typedef typename EngineFunctor<Engine_t,Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Array<Dim, T, E> &array, const EngineFunctorTag<Tag> &tag)
  {
    return EngineFunctor<Engine_t,Tag>::apply(array.engine(), tag.tag());
  }
};
template<int Dim, class T, class E, class Tag>
struct EngineFunctor<Array<Dim, T, E>, Tag>
{
  typedef typename EngineFunctor<Engine<Dim, T, E>, Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Array<Dim, T, E> &array,
        const Tag &tag)
  {
    return engineFunctor(array.engine(), tag);
  }
};
template <int Dim, class T, class EngineTag>
std::ostream &operator<<(std::ostream &o,
                         const Array<Dim, T, EngineTag> &ca)
{
  Pooma::blockAndEvaluate();
  PrintArray().print(o, ca);
  return o;
}
template <int Dim, class T, class EngineTag>
std::fstream &operator<<(std::fstream &f,
                         const Array<Dim, T, EngineTag> &ca)
{
  Pooma::blockAndEvaluate();
  PrintArray().print(f, ca);
  return f;
}
struct ExpressionIsArray { };
template<int Dim, class T, class EngineTag>
struct ExpressionTraits<Array<Dim, T, EngineTag> >
{
  typedef ExpressionIsArray Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsArray, ExpressionIsArray>
{
  typedef ExpressionIsArray Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsArray, ExpressionIsScalar>
{
  typedef ExpressionIsArray Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsScalar, ExpressionIsArray>
{
  typedef ExpressionIsArray Type_t;
};
template<int Dim, class T, class EngineTag,
  int OtherDim, class OtherT, class OtherEngineTag, class Op>
inline const Array<Dim, T, EngineTag> &
assign(const Array<Dim, T, EngineTag> &lhs,
       const Array<OtherDim, OtherT, OtherEngineTag> &rhs,
       const Op &op)
{
  ;
  Evaluator<MainEvaluatorTag>().evaluate(lhs, op, rhs);
  return lhs;
}
template<int Dim, class T, class EngineTag, class T1, class Op>
inline const Array<Dim, T, EngineTag> &
assign(const Array<Dim, T, EngineTag> &lhs, const T1 &rhs, const Op &op)
{
  Array<Dim, T1, ConstantFunction> rhsExpr(lhs.domain());
  rhsExpr.engine().setConstant(rhs);
  Evaluator<MainEvaluatorTag>().evaluate(lhs, op, rhsExpr);
  return lhs;
}
template<class Tree>
struct ConvertWhereProxy<ExpressionIsArray, Tree>
{
  typedef MakeReturn<Tree> Make_t;
};
template<int Dim, class T, class EngineTag, class F, class B, class Op>
inline const Array<Dim, T, EngineTag> &
assign(const Array<Dim, T, EngineTag> &lhs,
       const WhereProxy<F,B> &rhs,
       const Op &op)
{
  assign(lhs, rhs.whereMask(), rhs.opMask(op));
  return lhs;
}
template<int Dim, class T, class EngineTag>
inline long
elementsCompressed(const Array<Dim, T, EngineTag> &a)
{
  return elementsCompressed(a.engine());
}
template<int Dim, class T, class EngineTag>
inline bool
compressed(const Array<Dim, T, EngineTag> &a)
{
  return compressed(a.engine());
}
template<int Dim, class T, class EngineTag>
inline void
compress(Array<Dim, T, EngineTag> &a)
{
  compress(a.engine());
}
template<int Dim, class T, class EngineTag>
inline void
uncompress(Array<Dim, T, EngineTag> &a)
{
  uncompress(a.engine());
}
template <int Dim, class T, class EngineTag>
struct ElementProperties< Array<Dim, T, EngineTag> >
  : public MakeOwnCopyProperties< Array<Dim, T, EngineTag> >
{ };
template <int Dim> class UniformGridLayout;
template <int Dim, int Dim2> class UniformGridLayoutView;
struct UniformTag { };
template <int Dim>
struct MultiPatchLayoutTraits<UniformTag,Dim>
{
  typedef UniformGridLayout<Dim> Layout_t;
  template <int ViewDim>
  struct View
  {
    typedef UniformGridLayoutView<ViewDim,Dim> Layout_t;
  };
};
template <int Dim>
class UniformGridLayoutData
 : public LayoutBaseData<Dim>,
   public RefCounted,
   public Observable<UniformGridLayoutData<Dim> >
{
public:
  typedef Interval<Dim> Domain_t;
  typedef Interval<Dim> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef typename LayoutBaseData<Dim>::GCFillInfo GCFillInfo_t;
  typedef typename std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  enum { dimensions = Dim };
  enum { repartitionEvent = 1 };
  enum { dynamic = false };
  UniformGridLayoutData();
  template <class Partitioner>
  UniformGridLayoutData(const Domain_t &gdom,
   const Partitioner &gpar,
   const ContextMapper<Dim> & cmap );
  void initialize(const Domain_t& idom,
    const List_t& nodes,
    const Loc<Dim>& blocks,
    bool hasIG, bool hasEG,
    const GuardLayers_t& ig,
    const GuardLayers_t& eg);
  ~UniformGridLayoutData()
  {
    typename List_t::iterator a;
    for (a = this->all_m.begin(); a != this->all_m.end(); ++a)
      delete (*a);
  }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &d, OutIter o, const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesLocal(const OtherDomain &d,
     OutIter o,
     const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesRemote(const OtherDomain &d,
      OutIter o,
      const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAlloc(const OtherDomain &d, OutIter o,
                   const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAllocLocal(const OtherDomain &d, OutIter o,
   const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAllocRemote(const OtherDomain &d, OutIter o,
    const ConstructTag &ctag) const;
  friend class UniformGridLayout<Dim>;
  int globalID(const Loc<Dim> &loc) const;
  int globalID(int) const;
  int globalID(int,int) const;
  int globalID(int,int,int) const;
  int globalID(int,int,int,int) const;
  int globalID(int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int,int) const;
  template <class Partitioner>
  void partition(const Partitioner &, const ContextMapper<Dim>& cmap);
  template <class Partitioner>
  bool repartition(const Partitioner &,const ContextMapper<Dim>&);
  void calcGCFillList();
  int blockstride_m[Dim];
  int blocksizes_m[Dim];
  Interval<Dim> allDomain_m;
};
template <int Dim>
class UniformGridLayout : public LayoutBase<Dim,UniformGridLayoutData<Dim> >,
                          public Observable<UniformGridLayout<Dim> >,
                          public Observer<UniformGridLayoutData<Dim> >
{
public:
  typedef UniformGridLayoutData<Dim> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef UniformGridLayout<Dim> This_t;
  typedef Observable<This_t> Observable_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef typename LayoutData_t::GCFillInfo_t GCFillInfo_t;
  typedef typename
    std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  enum { dimensions = Dim };
  enum { repartitionEvent = LayoutData_t::repartitionEvent };
  enum { dynamic = false };
  UniformGridLayout();
  UniformGridLayout(const Domain_t &,
      const DistributedTag &);
  UniformGridLayout(const Domain_t &,
                    const GuardLayers_t &,
      const DistributedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
      const DistributedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
                    const GuardLayers_t &,
      const DistributedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
                    const GuardLayers_t &,
                    const GuardLayers_t &,
      const DistributedTag &);
  UniformGridLayout(const Domain_t &,
      const ReplicatedTag &);
  UniformGridLayout(const Domain_t &,
                    const GuardLayers_t &,
      const ReplicatedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
      const ReplicatedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
                    const GuardLayers_t &,
      const ReplicatedTag &);
  UniformGridLayout(const Domain_t &,
                    const Loc<Dim> &,
                    const GuardLayers_t &,
                    const GuardLayers_t &,
      const ReplicatedTag &);
  template <class Partitioner>
  UniformGridLayout(const Domain_t &,
      const Partitioner &,
      const ContextMapper<Dim> & );
  template <class Partitioner>
  UniformGridLayout(const Domain_t &,
                    const Partitioner &,
      const DistributedTag &);
  template <class Partitioner>
  UniformGridLayout(const Domain_t &,
                    const Partitioner &,
      const ReplicatedTag &);
  UniformGridLayout(const This_t &);
  This_t &operator=(const This_t &);
  inline ~UniformGridLayout()
  {
    this->pdata_m->detach(*this);
  }
  void initialize(const Domain_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const DistributedTag & );
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const ReplicatedTag & );
  void initialize(const Domain_t &,
                  const Loc<Dim> &,
                  const GuardLayers_t &,
                  const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
                  const Loc<Dim> &,
                  const GuardLayers_t &,
                  const GuardLayers_t &,
    const ReplicatedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const DistributedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const ReplicatedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const ContextMapper<Dim> &);
  void initialize(const Domain_t& idom,
    const List_t& nodes,
    const Loc<Dim>& blocks,
    bool hasIG, bool hasEG,
    const GuardLayers_t& ig,
    const GuardLayers_t& eg);
  virtual void notify(LayoutData_t &d, const ObserverEvent &event)
  {
    ;
    Observable_t::notify(event);
  }
  template <class Ostream>
  void print(Ostream &ostr) const;
  template <int Dim1, int Dim2>
  friend class UniformGridLayoutView;
  friend class UniformGridLayoutData<Dim>;
};
template <int Dim, int Dim2>
class UniformGridLayoutViewData
  : public LayoutBaseViewData<Dim, Dim2, UniformGridLayout<Dim2> >,
    public RefCounted
{
public:
  typedef UniformGridLayout<Dim2> Layout_t;
  typedef UniformGridLayoutView<Dim, Dim2> ViewLayout_t;
  typedef LayoutBaseViewData<Dim,Dim2,Layout_t> Base_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim2> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef typename Layout_t::Domain_t AllocatedDomain_t;
  typedef ViewIndexer<Dim,Dim2> Indexer_t;
  typedef Node<Domain_t,AllocatedDomain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  enum { dim = Dim };
  enum { dim2 = Dim2};
  UniformGridLayoutViewData() { };
  template <class DT>
  inline
  UniformGridLayoutViewData(const Layout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,UniformGridLayout<Dim2> >(layout,dom)
  {
  }
  template <class DT>
  inline
  UniformGridLayoutViewData(const Layout_t &layout, const SliceDomain<DT> &dom)
  :LayoutBaseViewData<Dim,Dim2,UniformGridLayout<Dim2> >(layout,dom)
  {
  }
  template <class DT>
  UniformGridLayoutViewData(const ViewLayout_t &layout,
                            const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,UniformGridLayout<Dim2> >(
           layout.pdata_m->layout_m,
           layout,
           layout.pdata_m->indexer_m,
           dom,
           layout.internalGuards(),
           layout.externalGuards())
  {
  }
  template <int OrigDim, class DT>
  UniformGridLayoutViewData(const UniformGridLayoutView<OrigDim,Dim2> &layout,
                            const SliceDomain<DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,UniformGridLayout<Dim2> >(
        layout.pdata_m->layout_m,
        layout,
        Indexer_t(layout.pdata_m->indexer_m,dom),
        dom)
  {
  }
  ~UniformGridLayoutViewData()
  {
    typename List_t::iterator a;
    for (a = this->all_m.begin(); a != this->all_m.end(); ++a)
      delete (*a);
  }
};
template <int Dim, int Dim2>
class UniformGridLayoutView
  : public LayoutBaseView<Dim, Dim2, UniformGridLayoutViewData<Dim,Dim2> >
{
public:
  enum { dimensions = Dim };
  enum { dim = Dim };
  enum { dim2 = Dim2};
  typedef UniformGridLayoutViewData<Dim, Dim2> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Layout_t Layout_t;
  typedef typename LayoutData_t::AllocatedDomain_t AllocatedDomain_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef typename LayoutData_t::Indexer_t Indexer_t;
  typedef typename LayoutData_t::GuardLayers_t GuardLayers_t;
  typedef UniformGridLayoutView<Dim, Dim2> This_t;
  typedef UniformGridLayoutView<Dim, Dim2> ViewLayout_t;
  typedef LayoutBaseView<Dim,Dim2,LayoutData_t> Base_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  UniformGridLayoutView()
  : Base_t(new LayoutData_t())
  { }
  template <class DT>
  UniformGridLayoutView(const Layout_t &layout, const Domain<Dim2, DT> &dom)
  : LayoutBaseView<Dim,Dim2,UniformGridLayoutViewData<Dim,Dim2> >
    (new UniformGridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  UniformGridLayoutView(const Layout_t &layout, const SliceDomain<DT> &dom)
  : LayoutBaseView<Dim,Dim2,UniformGridLayoutViewData<Dim,Dim2> >
    (new UniformGridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  UniformGridLayoutView(const ViewLayout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseView<Dim,Dim2,UniformGridLayoutViewData<Dim,Dim2> >
    (new UniformGridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <int OldViewDim, class DT>
  UniformGridLayoutView(const UniformGridLayoutView<OldViewDim, Dim2> &layout,
                        const SliceDomain<DT> &dom)
  : LayoutBaseView<Dim,Dim2,UniformGridLayoutViewData<Dim,Dim2> >
    (new UniformGridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  inline UniformGridLayoutView(const This_t &model)
    : LayoutBaseView<Dim,
                     Dim2,
                     UniformGridLayoutViewData<Dim,Dim2> >(model.pdata_m)
  { }
  inline This_t &operator=(const This_t &model)
  {
    if (this != &model)
      {
        this->pdata_m = model.pdata_m;
      }
    return *this;
  }
  inline ~UniformGridLayoutView()
  { }
  template <class Ostream>
  void print(Ostream &ostr) const;
  template <int OtherDim, int OtherDim2>
  friend class UniformGridLayoutView;
  template <int OtherDim, int OtherDim2>
  friend class UniformGridLayoutViewData;
};
template <int Dim>
struct NewDomain1<UniformGridLayout<Dim> >
{
  typedef UniformGridLayout<Dim> &Type_t;
  inline static Type_t combine(const UniformGridLayout<Dim> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim, int Dim2>
struct NewDomain1<UniformGridLayoutView<Dim, Dim2> >
{
  typedef UniformGridLayoutView<Dim, Dim2> &Type_t;
  inline static Type_t combine(const UniformGridLayoutView<Dim, Dim2> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim>
std::ostream &operator<<(std::ostream &ostr,
                         const UniformGridLayout<Dim> &layout)
{
  layout.print(ostr);
  return ostr;
}
template <int Dim, int Dim2>
std::ostream &operator<<(std::ostream &ostr,
                         const UniformGridLayoutView<Dim, Dim2> &layout)
{
  layout.print(ostr);
  return ostr;
}
template <int Dim>
inline UniformGridLayoutData<Dim>::
UniformGridLayoutData()
  : Observable<UniformGridLayoutData>(*this)
{
  for (int i = 0; i < Dim; ++i)
    blockstride_m[i] = blocksizes_m[i] = 0;
}
template <int Dim>
template <class Partitioner>
UniformGridLayoutData<Dim>::
UniformGridLayoutData(const Domain_t &gdom,
        const Partitioner &gpar,
        const ContextMapper<Dim> & cmap )
  : LayoutBaseData<Dim>(false,
   false,
   GuardLayers_t(0),
   GuardLayers_t(0),
   gdom,
   gdom),
    Observable<UniformGridLayoutData>(*this)
{
  if (gpar.hasInternalGuards() && gpar.maxSize() > 1)
    {
      this->hasInternalGuards_m = true;
      this->internalGuards_m = gpar.internalGuards();
    }
  if (gpar.hasExternalGuards())
    {
      this->hasExternalGuards_m = true;
      this->externalGuards_m = gpar.externalGuards();
      GuardLayers<Dim>::addGuardLayers(this->domain_m,this->externalGuards_m);
    }
  partition(gpar,cmap);
}
template <int Dim>
template <class Partitioner>
void UniformGridLayoutData<Dim>::partition(const Partitioner &gpar,
        const ContextMapper<Dim> &cmap)
{
  int i;
  PoomaCTAssert<(Partitioner::uniform)>::test();
  ;
  ;
  ;
  ;
  ;
  this->blocks_m = gpar.blocks();
  blockstride_m[0] = 1;
  int blocks[Dim];
  for (i = 0; i < Dim; ++i)
  {
    this->firsti_m[i] = this->innerdomain_m[i].first();
    this->firste_m[i] = this->domain_m[i].first();
    blocks[i] = gpar.blocks()[i].first();
    allDomain_m[i] = Interval<1>(blocks[i]);
    blocksizes_m[i] = this->innerdomain_m[i].length() / blocks[i];
    if (i > 0)
      blockstride_m[i] = blockstride_m[i-1] * blocks[i-1];
  }
  gpar.partition(this->innerdomain_m, this->all_m, cmap);
  typename List_t::const_iterator start = this->all_m.begin();
  typename List_t::const_iterator end = this->all_m.end();
  for ( ; start!=end ; ++start)
    {
      if ( (*start)->context() == Pooma::context()
    || (*start)->context() == -1 )
 {
   (*start)->localID() = this->local_m.size();
   this->local_m.push_back(*start);
 }
      else
 this->remote_m.push_back(*start);
    }
  if (this->hasInternalGuards_m)
    {
      this->gcFillList_m.clear();
      calcGCFillList();
    }
}
template<int Dim>
void UniformGridLayoutData<Dim>::initialize(const Domain_t& idom,
     const List_t& nodes,
     const Loc<Dim>& ublocks,
     bool hasIG, bool hasEG,
     const GuardLayers_t& ig,
     const GuardLayers_t& eg)
{
  int i;
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  this->domain_m = idom;
  this->innerdomain_m = idom;
  this->hasInternalGuards_m = hasIG;
  if (this->hasInternalGuards_m)
    {
      this->internalGuards_m = ig;
    }
  this->hasExternalGuards_m = (hasEG && ! this->domain_m.empty());
  if (this->hasExternalGuards_m)
    {
      this->externalGuards_m = eg;
      GuardLayers<Dim>::addGuardLayers(this->domain_m, this->externalGuards_m);
    }
  this->blocks_m = ublocks;
  blockstride_m[0] = 1;
  int blocks[Dim];
  for (i = 0; i < Dim; ++i)
  {
    this->firsti_m[i] = this->innerdomain_m[i].first();
    this->firste_m[i] = this->domain_m[i].first();
    blocks[i] = ublocks[i].first();
    allDomain_m[i] = Interval<1>(blocks[i]);
    blocksizes_m[i] = this->innerdomain_m[i].length() / blocks[i];
    if (i > 0)
      blockstride_m[i] = blockstride_m[i-1] * blocks[i-1];
  }
  this->all_m= nodes;
  typename List_t::iterator start = this->all_m.begin();
  typename List_t::iterator end = this->all_m.end();
  for ( ; start!=end ;++start )
    {
      if( (*start)->context() == Pooma::context() ||
   (*start)->context() == -1 )
 this->local_m.push_back(*start);
      else
 this->remote_m.push_back(*start);
    }
  if (this->hasInternalGuards_m)
    {
      this->gcFillList_m.clear();
      calcGCFillList();
    }
}
template <int Dim>
void UniformGridLayoutData<Dim>::calcGCFillList()
  {
    int d, p;
    int numPatches = this->all_m.size();
    this->gcFillList_m.reserve(2*Dim*this->local_m.size());
    for (d = 0; d < Dim; ++d)
      {
        if (this->internalGuards_m.lower(d) > 0)
          {
            typename Interval<Dim>::iterator pos = allDomain_m.begin();
            for (p = 0; p < numPatches; ++p, ++pos)
              {
                if ( (*pos)[d].first() == allDomain_m[d].last() ) continue;
                int sourceID = p;
                int destID = p + blockstride_m[d];
                ;
                ;
                Domain_t gcdom(this->all_m[p]->allocated());
                int max = this->all_m[p]->domain()[d].last();
                int min = max - this->internalGuards_m.lower(d) + 1;
                gcdom[d] = Interval<1>(min,max);
   if (
      this->all_m[sourceID]->context() == -1 ||
      this->all_m[sourceID]->context() == Pooma::context() ||
       this->all_m[destID]->context() == Pooma::context()
      )
                this->gcFillList_m.push_back(GCFillInfo_t(gcdom,sourceID,destID,d*2));
              }
          }
        if (this->internalGuards_m.upper(d) > 0)
          {
            typename Interval<Dim>::iterator pos = allDomain_m.begin();
            for (p = 0; p < numPatches; ++p, ++pos)
              {
                if ( (*pos)[d].first() == allDomain_m[d].first() ) continue;
                int sourceID = p;
                int destID = p - blockstride_m[d];
                ;
                Domain_t gcdom(this->all_m[p]->allocated());
                int min = this->all_m[p]->domain()[d].first();
                int max = min + this->internalGuards_m.upper(d) - 1;
                gcdom[d] = Interval<1>(min,max);
   if (
      this->all_m[sourceID]->context() == -1 ||
      this->all_m[sourceID]->context() == Pooma::context() ||
       this->all_m[destID]->context() == Pooma::context()
      )
    this->gcFillList_m.push_back(GCFillInfo_t(gcdom,sourceID,destID,d*2+1));
              }
          }
      }
  }
template <int Dim>
template <class Partitioner>
bool UniformGridLayoutData<Dim>::
repartition(const Partitioner &p,
     const ContextMapper<Dim>& cmap)
{
  ;
  for (int i = 0; i < this->all_m.size(); ++i)
    delete this->all_m[i];
  this->all_m.clear();
  this->local_m.clear();
  this->remote_m.clear();
  partition(p,cmap);
  if (this->hasInternalGuards_m)
    {
      this->gcFillList_m.clear();
      calcGCFillList();
    }
  this->notify(repartitionEvent);
  return true;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touches(const OtherDomain &d, OutIter o,
     const ConstructTag &ctag) const
{
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->all_m[indx]->domain());
      ;
      *o = touchesConstruct(outDomain,
       this->all_m[indx]->allocated(),
       this->all_m[indx]->affinity(),
       this->all_m[indx]->context(),
       this->all_m[indx]->globalID(),
       this->all_m[indx]->localID(),
       ctag);
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touchesLocal(const OtherDomain &d,
          OutIter o,
          const ConstructTag &ctag) const
{
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->local_m[indx]->domain());
      ;
      *o = touchesConstruct(outDomain,
       this->local_m[indx]->allocated(),
       this->local_m[indx]->affinity(),
       this->local_m[indx]->context(),
       this->local_m[indx]->globalID(),
       this->local_m[indx]->localID(),
       ctag);
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touchesRemote(const OtherDomain &d,
           OutIter o,
           const ConstructTag &ctag) const
{
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->remote_m[indx]->domain());
      ;
      *o = touchesConstruct(outDomain,
       this->remote_m[indx]->allocated(),
       this->remote_m[indx]->affinity(),
       this->remote_m[indx]->context(),
       this->remote_m[indx]->globalID(),
       this->remote_m[indx]->localID(),
       ctag);
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touchesAlloc(const OtherDomain &d, OutIter o,
          const ConstructTag &ctag) const
{
  if (!this->hasInternalGuards_m) return touches(d,o,ctag);
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      if (a > 0) --a;
      if (b < allDomain_m[i].last()) ++b;
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->all_m[indx]->allocated());
      if (!outDomain.empty())
 {
   *o = touchesConstruct(outDomain,
    this->all_m[indx]->allocated(),
    this->all_m[indx]->affinity(),
    this->all_m[indx]->context(),
    this->all_m[indx]->globalID(),
    this->all_m[indx]->localID(),
    ctag);
 }
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touchesAllocLocal(const OtherDomain &d, OutIter o,
               const ConstructTag &ctag) const
{
  if (!this->hasInternalGuards_m) return touches(d,o,ctag);
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      if (a > 0) --a;
      if (b < allDomain_m[i].last()) ++b;
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->local_m[indx]->allocated());
      if (!outDomain.empty())
 {
   *o = touchesConstruct(outDomain,
    this->local_m[indx]->allocated(),
    this->local_m[indx]->affinity(),
    this->local_m[indx]->context(),
    this->local_m[indx]->globalID(),
    this->local_m[indx]->localID(),
    ctag);
 }
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int UniformGridLayoutData<Dim>::touchesAllocRemote(const OtherDomain &d, OutIter o,
                const ConstructTag &ctag) const
{
  if (!this->hasInternalGuards_m) return touches(d,o,ctag);
  int i, count = 0;
  ;
  ;
  Interval<Dim> box = Pooma::NoInit();
  for (i = 0; i < Dim; ++i)
    {
      int a, b;
      if (!this->hasExternalGuards_m)
 {
   a = (d[i].min() - this->firsti_m[i]) / blocksizes_m[i];
   b = (d[i].max() - this->firsti_m[i]) / blocksizes_m[i];
 }
      else
 {
   a = b = 0;
   int pos = d[i].min();
   int last = this->innerdomain_m[i].last();
   int del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       a = del / blocksizes_m[i];
     else
       a = allDomain_m[i].last();
   pos = d[i].max();
   del = pos - this->firsti_m[i];
   if (del >= 0)
     if (pos <= last)
       b = del / blocksizes_m[i];
     else
       b = allDomain_m[i].last();
 }
      if (a > 0) --a;
      if (b < allDomain_m[i].last()) ++b;
      box[i] = Interval<1>(a, b);
    }
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  typename Interval<Dim>::const_iterator boxiter = box.begin();
  while (boxiter != box.end())
    {
      int indx = (*boxiter)[0].first();
      for (i = 1; i < Dim; ++i)
 indx += blockstride_m[i] * (*boxiter)[i].first();
      ;
      outDomain = intersect(d, this->remote_m[indx]->allocated());
      if (!outDomain.empty())
 {
   *o = touchesConstruct(outDomain,
    this->remote_m[indx]->allocated(),
    this->remote_m[indx]->affinity(),
    this->remote_m[indx]->context(),
    this->remote_m[indx]->globalID(),
    this->remote_m[indx]->localID(),
    ctag);
 }
      ++o;
      ++count;
      ++boxiter;
    }
  return count;
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout()
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t()),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const DistributedTag& t)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(),
        DistributedMapper<Dim>(UniformGridPartition<Dim>()))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const ReplicatedTag & t)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(),
        LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const GuardLayers_t &gcs,
    const DistributedTag &)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(gcs),
        DistributedMapper<Dim>(UniformGridPartition<Dim>(gcs)))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const GuardLayers_t &gcs,
    const ReplicatedTag & )
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(gcs),
        LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const Loc<Dim> &blocks,
    const DistributedTag & )
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(blocks),
        DistributedMapper<Dim>(
          UniformGridPartition<Dim>(blocks)))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const Loc<Dim> &blocks,
    const ReplicatedTag & t)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(blocks),
        LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
                  const Loc<Dim> &blocks,
                  const GuardLayers_t &igcs,
    const DistributedTag &)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
   (new LayoutData_t(gdom,
       UniformGridPartition<Dim>(blocks,igcs),
       DistributedMapper<Dim>(
        UniformGridPartition<Dim>(blocks,igcs)))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
                  const Loc<Dim> &blocks,
                  const GuardLayers_t &igcs,
    const ReplicatedTag &)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
     (new LayoutData_t(gdom,
         UniformGridPartition<Dim>(blocks,igcs),
         LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
                  const Loc<Dim> &blocks,
                  const GuardLayers_t &igcs,
                  const GuardLayers_t &egcs,
    const DistributedTag &)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(blocks,igcs,egcs),
        DistributedMapper<Dim>(
                       UniformGridPartition<Dim>(blocks,igcs,egcs)))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
                  const Loc<Dim> &blocks,
                  const GuardLayers_t &igcs,
                  const GuardLayers_t &egcs,
    const ReplicatedTag &t)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,
        UniformGridPartition<Dim>(blocks,igcs,egcs),
        LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const Partitioner &gpar,
    const DistributedTag & )
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
   (new LayoutData_t(gdom,gpar,DistributedMapper<Dim>(gpar))),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const Partitioner &gpar,
    const ReplicatedTag &)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
   (new LayoutData_t(gdom,gpar,LocalMapper<Dim>())),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
inline UniformGridLayout<Dim>::
UniformGridLayout(const Domain_t &gdom,
    const Partitioner &gpar,
    const ContextMapper<Dim> & cmap)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >
    (new LayoutData_t(gdom,gpar,cmap)),
  Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim>::
UniformGridLayout(const This_t &model)
: LayoutBase<Dim,UniformGridLayoutData<Dim> >(model.pdata_m),
  Observable<This_t>(*this)
{
   this->pdata_m->attach(*this);
}
template <int Dim>
inline UniformGridLayout<Dim> & UniformGridLayout<Dim>::
operator=(const This_t &model)
{
  if (this != &model)
    {
      this->pdata_m->detach(*this);
      this->pdata_m = model.pdata_m;
      this->pdata_m->attach(*this);
    }
  return *this;
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const DistributedTag &)
{
  ;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(),
       DistributedMapper<Dim>(UniformGridPartition<Dim>()));
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(),
       LocalMapper<Dim>());
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const GuardLayers_t &gcs,
    const DistributedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(gcs),
       DistributedMapper<Dim>(UniformGridPartition<Dim>(gcs) ));
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const GuardLayers_t &gcs,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(gcs),
       LocalMapper<Dim>());
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const Loc<Dim> &blocks,
    const DistributedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks),
      DistributedMapper<Dim>(UniformGridPartition<Dim>(blocks)));
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
    const Loc<Dim> &blocks,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks),
       LocalMapper<Dim>());
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Loc<Dim> &blocks,
           const GuardLayers_t &gcs,
    const DistributedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks, gcs),
       DistributedMapper<Dim>(
         UniformGridPartition<Dim>(blocks, gcs)));
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Loc<Dim> &blocks,
           const GuardLayers_t &gcs,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks, gcs),
       LocalMapper<Dim>());
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Loc<Dim> &blocks,
           const GuardLayers_t &igcs,
           const GuardLayers_t &egcs,
    const DistributedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks, igcs, egcs),
       DistributedMapper<Dim>(
         UniformGridPartition<Dim>(blocks, igcs, egcs)));
}
template <int Dim>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Loc<Dim> &blocks,
           const GuardLayers_t &igcs,
           const GuardLayers_t &egcs,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->blocks_m = blocks;
  this->pdata_m->partition(UniformGridPartition<Dim>(blocks, igcs, egcs),
       LocalMapper<Dim>());
}
template <int Dim>
template <class Partitioner>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Partitioner &p,
    const DistributedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->blocks_m = p.blocks();
  this->pdata_m->partition(p,DistributedMapper<Dim>(p));
}
template <int Dim>
template <class Partitioner>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Partitioner &p,
    const ReplicatedTag &)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->blocks_m = p.blocks();
  this->pdata_m->partition(p,LocalMapper<Dim>());
}
template <int Dim>
template <class Partitioner>
inline void
UniformGridLayout<Dim>::
initialize(const Domain_t &gdom,
           const Partitioner &p,
    const ContextMapper<Dim> &cmap)
{
  ;
  this->pdata_m->innerdomain_m = gdom;
  this->pdata_m->domain_m = gdom;
  this->pdata_m->blocks_m = p.blocks();
  this->pdata_m->partition(p,cmap);
}
template <int Dim>
void UniformGridLayout<Dim>::initialize(const Domain_t& idom,
     const List_t& nodes,
     const Loc<Dim>& blocks,
     bool hasIG, bool hasEG,
     const GuardLayers_t& ig,
     const GuardLayers_t& eg)
{
  this->pdata_m->initialize(idom,nodes,blocks,hasIG,hasEG,ig,eg);
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(const Loc<Dim> &loc) const
{
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (loc[0].first() - this->firsti_m[0]) / blocksizes_m[0];
      for (int d = 1; d < Dim; ++d)
        currloc += blockstride_m[d] *
          ((loc[d].first() - this->firsti_m[d]) / blocksizes_m[d]);
    }
  else
    {
      currloc = 0;
      for (int d = 0; d < Dim; ++d)
        {
          int l = loc[d].first();
          if (l >= this->firsti_m[d])
            {
              if (l <= this->innerdomain_m[d].last())
                {
                  currloc += blockstride_m[d] *
                    ((l - this->firsti_m[d]) / blocksizes_m[d]);
                }
              else
                {
                  currloc += blockstride_m[d] * allDomain_m[d].last();
                }
            }
        }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0) const
{
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
          currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
          currloc = allDomain_m[0].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1) const
{
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
          currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
          currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1, int i2) const
{
  ;
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1])
              + blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
          currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
          currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
      if (i2 >= this->firsti_m[2]) {
        if (i2 <= this->innerdomain_m[2].last())
          currloc += blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
        else
          currloc += blockstride_m[2] * allDomain_m[2].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3) const
{
  ;
  ;
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1])
              + blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2])
              + blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
           currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
           currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
      if (i2 >= this->firsti_m[2]) {
        if (i2 <= this->innerdomain_m[2].last())
          currloc += blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
        else
          currloc += blockstride_m[2] * allDomain_m[2].last();
      }
      if (i3 >= this->firsti_m[3]) {
        if (i3 <= this->innerdomain_m[3].last())
          currloc += blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3]);
        else
          currloc += blockstride_m[3] * allDomain_m[3].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
                                     int i4) const
{
  ;
  ;
  ;
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1])
              + blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2])
              + blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3])
              + blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
           currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
           currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
      if (i2 >= this->firsti_m[2]) {
        if (i2 <= this->innerdomain_m[2].last())
          currloc += blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
        else
          currloc += blockstride_m[2] * allDomain_m[2].last();
      }
      if (i3 >= this->firsti_m[3]) {
        if (i3 <= this->innerdomain_m[3].last())
          currloc += blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3]);
        else
          currloc += blockstride_m[3] * allDomain_m[3].last();
      }
      if (i4 >= this->firsti_m[4]) {
        if (i4 <= this->innerdomain_m[4].last())
          currloc += blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4]);
        else
          currloc += blockstride_m[4] * allDomain_m[4].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
                                     int i4, int i5) const
{
  ;
  ;
  ;
  ;
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1])
              + blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2])
              + blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3])
              + blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4])
              + blockstride_m[5] * ((i5 - this->firsti_m[5]) / blocksizes_m[5]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
           currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
           currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
      if (i2 >= this->firsti_m[2]) {
        if (i2 <= this->innerdomain_m[2].last())
          currloc += blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
        else
          currloc += blockstride_m[2] * allDomain_m[2].last();
      }
      if (i3 >= this->firsti_m[3]) {
        if (i3 <= this->innerdomain_m[3].last())
          currloc += blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3]);
        else
          currloc += blockstride_m[3] * allDomain_m[3].last();
      }
      if (i4 >= this->firsti_m[4]) {
        if (i4 <= this->innerdomain_m[4].last())
          currloc += blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4]);
        else
          currloc += blockstride_m[4] * allDomain_m[4].last();
      }
      if (i5 >= this->firsti_m[5]) {
        if (i5 <= this->innerdomain_m[5].last())
          currloc += blockstride_m[5] * ((i5 - this->firsti_m[5]) / blocksizes_m[5]);
        else
          currloc += blockstride_m[5] * allDomain_m[5].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
inline int
UniformGridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
                                     int i4, int i5, int i6) const
{
  ;
  ;
  ;
  ;
  ;
  ;
  ;
  ;
  int currloc;
  if (!this->hasExternalGuards_m)
    {
      currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0]
              + blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1])
              + blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2])
              + blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3])
              + blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4])
              + blockstride_m[5] * ((i5 - this->firsti_m[5]) / blocksizes_m[5])
              + blockstride_m[6] * ((i6 - this->firsti_m[6]) / blocksizes_m[6]);
    }
  else
    {
      currloc = 0;
      if (i0 >= this->firsti_m[0]) {
        if (i0 <= this->innerdomain_m[0].last())
           currloc = (i0 - this->firsti_m[0]) / blocksizes_m[0];
        else
           currloc = allDomain_m[0].last();
      }
      if (i1 >= this->firsti_m[1]) {
        if (i1 <= this->innerdomain_m[1].last())
          currloc += blockstride_m[1] * ((i1 - this->firsti_m[1]) / blocksizes_m[1]);
        else
          currloc += blockstride_m[1] * allDomain_m[1].last();
      }
      if (i2 >= this->firsti_m[2]) {
        if (i2 <= this->innerdomain_m[2].last())
          currloc += blockstride_m[2] * ((i2 - this->firsti_m[2]) / blocksizes_m[2]);
        else
          currloc += blockstride_m[2] * allDomain_m[2].last();
      }
      if (i3 >= this->firsti_m[3]) {
        if (i3 <= this->innerdomain_m[3].last())
          currloc += blockstride_m[3] * ((i3 - this->firsti_m[3]) / blocksizes_m[3]);
        else
          currloc += blockstride_m[3] * allDomain_m[3].last();
      }
      if (i4 >= this->firsti_m[4]) {
        if (i4 <= this->innerdomain_m[4].last())
          currloc += blockstride_m[4] * ((i4 - this->firsti_m[4]) / blocksizes_m[4]);
        else
          currloc += blockstride_m[4] * allDomain_m[4].last();
      }
      if (i5 >= this->firsti_m[5]) {
        if (i5 <= this->innerdomain_m[5].last())
          currloc += blockstride_m[5] * ((i5 - this->firsti_m[5]) / blocksizes_m[5]);
        else
          currloc += blockstride_m[5] * allDomain_m[5].last();
      }
      if (i6 >= this->firsti_m[6]) {
        if (i6 <= this->innerdomain_m[6].last())
          currloc += blockstride_m[6] * ((i6 - this->firsti_m[6]) / blocksizes_m[6]);
        else
          currloc += blockstride_m[6] * allDomain_m[6].last();
      }
    }
  ;
  return currloc;
}
template <int Dim>
template <class Ostream>
void UniformGridLayout<Dim>::print(Ostream &ostr) const
{
  ostr << "UniformGridLayout " << this->ID() << " on global domain "
       << this->domain() << ":" << '\n';
  ostr << "   Total subdomains: " << this->sizeGlobal() << '\n';
  ostr << "   Local subdomains: " << this->sizeLocal() << '\n';
  ostr << "  Remote subdomains: " << this->sizeRemote() << '\n';
  ostr << "        Grid blocks: " << this->blocks() << '\n';
  typename UniformGridLayout<Dim>::const_iterator a;
  for (a = this->beginGlobal(); a != this->endGlobal(); ++a)
    ostr << "  Global subdomain = " << *a << '\n';
  for (a = this->beginLocal(); a != this->endLocal(); ++a)
    ostr << "   Local subdomain = " << *a << '\n';
  for (a = this->beginRemote(); a != this->endRemote(); ++a)
    ostr << "  Remote subdomain = " << *a << '\n';
}
template <int Dim, int Dim2>
template <class Ostream>
void UniformGridLayoutView<Dim, Dim2>::print(Ostream &ostr) const
{
  ostr << "UniformGridLayoutView " << this->ID() << " on global domain "
       << this->domain() << ":" << '\n';
  ostr << "   Base ID:          " << this->baseID() << '\n';
  ostr << "   Base domain:      " << this->baseDomain() << '\n';
  ostr << "   Total subdomains: " << this->sizeGlobal() << '\n';
  ostr << "   Local subdomains: " << this->sizeLocal() << '\n';
  ostr << "  Remote subdomains: " << this->sizeRemote() << '\n';
  const_iterator a;
  for (a = this->beginGlobal(); a != this->endGlobal(); ++a)
    ostr << "  Global subdomain = " << *a << '\n';
  for (a = this->beginLocal(); a != this->endLocal(); ++a)
    ostr << "   Local subdomain = " << *a << '\n';
  for (a = this->beginRemote(); a != this->endRemote(); ++a)
    ostr << "  Remote subdomain = " << *a << '\n';
}
template <class DT> class SliceDomain;
template<class Tag> struct Remote;
template <class LayoutTag, class PatchTag>
struct MultiPatch
{
  MultiPatch(){}
  ~MultiPatch(){}
};
template <class LayoutTag, class PatchTag, int Dim2>
struct MultiPatchView
{
  MultiPatchView(){}
  ~MultiPatchView(){}
};
template <int Dim, class T, class LayoutTag, class PatchTag>
class Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >;
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
class Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag,Dim2> >;
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  Interval<Dim> >
{
  typedef Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  Range<Dim> >
{
  typedef Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, class Domain>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  Node<Domain> >
{
  typedef typename
    NewEngine<Engine<Dim, T, PatchTag>, Node<Domain> >::Type_t Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, class Domain>
struct NewEngineEngine<
  Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> >,
  Node<Domain> >
{
  typedef Engine<Dim,T,PatchTag> &Type_t;
  static inline Engine<Dim,T,PatchTag> &
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &e,
 const Node<Domain> &i)
  {
    return e.globalPatch(i);
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag, class Domain>
struct NewEngineDomain<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  Node<Domain> >
{
  typedef const Domain &Type_t;
  static inline const Domain &
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &,
 const Node<Domain> &i)
  {
    return i.domain();
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  INode<Dim> >
{
  typedef typename
    NewEngine<Engine<Dim, T, PatchTag>, Interval<Dim> >::Type_t Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngineEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  INode<Dim> >
{
  typedef Engine<Dim,T,PatchTag> &Type_t;
  static inline Engine<Dim,T,PatchTag> &
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &e,
 const INode<Dim> &i)
  {
    return e.globalPatch(i);
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngineDomain<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  INode<Dim> >
{
  typedef const Interval<Dim> &Type_t;
  static inline const Interval<Dim> &
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &,
 const INode<Dim> &i)
  {
    return i.domain();
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag, int SliceDim>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  SliceInterval<Dim,SliceDim> >
{
  typedef
    Engine<SliceDim, T, MultiPatchView<LayoutTag, PatchTag, Dim> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, int SliceDim>
struct NewEngine<
  Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  SliceRange<Dim,SliceDim> >
{
  typedef
    Engine<SliceDim, T, MultiPatchView<LayoutTag, PatchTag, Dim> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  Interval<Dim> >
{
  typedef
    Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  Range<Dim> >
{
  typedef
    Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> > Type_t;
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, int Dim2, class Domain>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  Node<Domain> >
{
  typedef typename
    NewEngine<Engine<Dim2, T, PatchTag>, SliceRange<Dim2, Dim> >::Type_t
      Type_t;
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, class Domain>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim> >,
  Node<Domain> >
{
  typedef typename
    NewEngine<Engine<Dim, T, PatchTag>, Range<Dim> >::Type_t
      Type_t;
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, int Dim2, class Domain>
struct NewEngineEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
  Node<Domain> >
{
  typedef typename NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
    Node<Domain> >::Type_t Type_t;
  static inline Type_t
  apply(const Engine<Dim,T,MultiPatchView<LayoutTag,PatchTag,Dim2> > &e,
 const Node<Domain> &i)
  {
    return e.globalPatch(i);
  }
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, int Dim2, class Domain>
struct NewEngineDomain<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
  Node<Domain> >
{
  typedef EngineConstructTag Type_t;
  static inline EngineConstructTag
  apply(const Engine<Dim,T,MultiPatchView<LayoutTag,PatchTag,Dim2> > &,
 const Node<Domain> &)
  {
    return EngineConstructTag();
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  INode<Dim> >
{
  typedef typename
    NewEngine<Engine<Dim2, T, PatchTag>, SliceRange<Dim2, Dim> >::Type_t
      Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim> >,
  INode<Dim> >
{
  typedef typename
    NewEngine<Engine<Dim, T, PatchTag>, Range<Dim> >::Type_t
      Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
struct NewEngineEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
  INode<Dim> >
{
  typedef typename NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
    INode<Dim> >::Type_t Type_t;
  static inline Type_t
  apply(const Engine<Dim,T,MultiPatchView<LayoutTag,PatchTag,Dim2> > &e,
 const INode<Dim> &i)
  {
    return e.globalPatch(i);
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
struct NewEngineDomain<
  Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag, Dim2> >,
  INode<Dim> >
{
  typedef EngineConstructTag Type_t;
  static inline EngineConstructTag
  apply(const Engine<Dim,T,MultiPatchView<LayoutTag,PatchTag,Dim2> > &,
 const INode<Dim> &)
  {
    return EngineConstructTag();
  }
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, int Dim2, int SliceDim>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  SliceInterval<Dim, SliceDim> >
{
  typedef
    Engine<SliceDim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> > Type_t;
};
template <int Dim, class T,
          class LayoutTag, class PatchTag, int Dim2, int SliceDim>
struct NewEngine<
  Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >,
  SliceRange<Dim, SliceDim> >
{
  typedef
    Engine<SliceDim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> > Type_t;
};
template <int Dim, class T, class LayoutTag, class PatchTag>
class Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> > :
  public Observer<typename MultiPatchLayoutTraits<LayoutTag,Dim>::Layout_t>
{
public:
  typedef MultiPatch<LayoutTag,PatchTag> Tag_t;
  typedef Engine<Dim,T,Tag_t> This_t;
  typedef Engine<Dim,T,Tag_t> Engine_t;
  typedef Interval<Dim> Domain_t;
  typedef T Element_t;
  typedef PatchTag PatchTag_t;
  typedef Engine<Dim, T, PatchTag> PatchEngine_t;
  typedef typename PatchEngine_t::ElementRef_t ElementRef_t;
  typedef RefCountedBlockPtr<PatchEngine_t> PatchContainer_t;
  typedef MultiPatchLayoutTraits<LayoutTag,Dim> LayoutTraits_t;
  typedef typename LayoutTraits_t::Layout_t Layout_t;
  typedef Layout_t Observable_t;
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef ObserverEvent::ID_t DynamicID_t;
  typedef typename NewEngine<PatchEngine_t, Domain_t>::Type_t PatchView_t;
  enum { brick = false };
  enum { dimensions = Dim };
  enum { hasDataObject = false };
  enum { dynamic = PatchEngine_t::dynamic };
  enum { zeroBased = false };
  enum { multiPatch = true };
  Engine();
  explicit Engine(const Layout_t &layout);
  Engine(const Engine_t &model);
  ~Engine();
  Engine_t &operator=(const Engine_t &model);
  Element_t read(const Loc<Dim> &) const;
  ElementRef_t operator()(const Loc<Dim> &) const;
  Element_t read(int) const;
  Element_t read(int, int) const;
  Element_t read(int, int, int) const;
  Element_t read(int, int, int, int) const;
  Element_t read(int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int, int) const;
  ElementRef_t operator()(int) const;
  ElementRef_t operator()(int, int) const;
  ElementRef_t operator()(int, int, int) const;
  ElementRef_t operator()(int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int, int) const;
  inline PatchEngine_t &globalPatch(const INode<Dim> &inode) const
  {
    int gid = inode.globalID(layout_m.ID());
    PatchEngine_t &pengine = data()[gid];
    ;
    return pengine;
  }
  template<class Domain>
  inline PatchEngine_t &globalPatch(const Node<Domain> &node) const
  {
    int gid = node.globalID();
    PatchEngine_t &pengine = data()[gid];
    ;
    return pengine;
  }
  inline PatchEngine_t &globalPatch(PatchID_t gpatchID) const
  {
    return data()[gpatchID];
  }
  inline PatchEngine_t &localPatch(PatchID_t lpatchID) const
  {
    int gID = (layout_m.nodeListLocal()[lpatchID])->globalID();
    return data()[gID];
  }
  inline bool patchEmpty(PatchID_t patch) const
  {
    return data()[patch].domain().empty();
  }
  inline const Layout_t &layout() const
  {
    return layout_m;
  }
  inline Layout_t &layout()
  {
    return layout_m;
  }
  inline const Domain_t &domain() const
  {
    return layout().domain();
  }
  inline const Domain_t &innerDomain() const
  {
    return layout().innerDomain();
  }
  inline int first(int d) const
  {
    return layout().first(d);
  }
  inline bool initialized() const
  {
    return layout().initialized();
  }
  inline const PatchContainer_t &data() const
  {
    return data_m;
  }
  Engine_t &makeOwnCopy();
  inline void fillGuards(const GuardLayers<Dim>& g) const
  {
    fillGuardsHandler(g, WrappedInt<Layout_t::supportsGuards>());
  }
  inline void fillGuards() const
  {
    fillGuards(layout().internalGuards());
  }
  inline void fillGuardsHandler(const GuardLayers<Dim>&, const WrappedInt<false>&) const { };
  void fillGuardsHandler(const GuardLayers<Dim>&, const WrappedInt<true>&) const ;
  void setGuards(const T &val) const;
  void accumulateFromGuards() const;
  inline int dirty() const { return *pDirty_m; }
  inline void setDirty() const
  {
    *pDirty_m = (1<<(Dim*2))-1;
  }
  inline void clearDirty(int face = -1) const
  {
    if (face == -1)
      *pDirty_m = 0;
    else {
      ;
      *pDirty_m &= ~(1<<face);
    }
  }
  inline bool isDirty(int face = -1) const
  {
    if (face == -1)
      return *pDirty_m != 0;
    else {
      ;
      return *pDirty_m & (1<<face);
    }
  }
  virtual void notify(Observable_t &observed, const ObserverEvent &event);
  void dynamicHandler(Observable_t &, const ObserverEvent &,
                      const WrappedInt<false> &);
  void dynamicHandler(Observable_t &, const ObserverEvent &,
                      const WrappedInt<true> &);
  inline void create(CreateSize_t num, PatchID_t localPatchID = (-1))
    {
      layout().create(num, localPatchID);
    }
  template<class Dom, class DeleteMethod>
  inline void destroy(const Dom &killlist, const DeleteMethod &method)
  {
    layout().destroy(killlist, method);
  }
  template<class Dom>
  inline void destroy(const Dom &killlist)
  {
    layout().destroy(killlist, BackFill());
  }
  template<class Dom, class DeleteMethod>
  inline void destroy(const Dom &killlist, PatchID_t frompatch,
        const DeleteMethod &method)
    {
      layout().destroy(killlist, frompatch, method);
    }
  template<class Dom>
  inline void copy(const Dom &domain, PatchID_t topatch = (-1))
    {
      layout().copy(domain, topatch);
    }
  template<class Dom>
  inline void copy(const Dom &killlist,
                   PatchID_t frompatch, PatchID_t topatch)
    {
      layout().copy(killlist, frompatch, topatch);
    }
  inline void copy(const IndirectionList< IndirectionList<int> > &domlists,
     const IndirectionList< int > &fromlist,
     PatchID_t topatch,
     bool docreate)
    {
      layout().copy(domlists, fromlist, topatch, docreate);
    }
  void sync()
    {
      layout().sync();
    }
private:
  void performCreate(CreateSize_t num, PatchID_t patch,
       DynamicID_t did);
  template<class Dom, class DeleteMethod>
  void performDestroy(const Dom &killlist, PatchID_t patch,
        const DeleteMethod &method,
        DynamicID_t did);
  template<class Dom>
  void performCopy(const Dom &domain, PatchID_t frompatch, PatchID_t topatch,
     DynamicID_t did);
  void performPatchCopy(const IndirectionList< IndirectionList<int> > &dlists,
   const IndirectionList< int > &fromlist,
   PatchID_t topatch,
   bool docreate,
   DynamicID_t did);
  template <class Node, class Counter>
  class PatchAllocator : public Pooma::Runnable_t
  {
  public:
    PatchAllocator(PatchEngine_t &dest, const Node &node, Counter &c)
      : Pooma::Runnable_t(node.affinity()), dest_m(dest),
 node_m(node), counter_m(c)
    {
    }
    ~PatchAllocator() { }
    void run()
    {
      dest_m = PatchEngine_t(node_m);
      ++counter_m;
    }
  private:
    PatchEngine_t &dest_m;
    const Node &node_m;
    Counter &counter_m;
  };
  Layout_t layout_m;
  PatchContainer_t data_m;
  int *pDirty_m;
};
template <int D1, int D2>
struct SubDomainTraits
{
  typedef SliceRange<D1,D2> LocalToBase_t;
  typedef Range<D1> TotalDomain_t;
  inline static
  TotalDomain_t totalDomain(const LocalToBase_t &d)
  {
    return d.totalDomain();
  }
};
template <int D1>
struct SubDomainTraits<D1, D1>
{
  typedef Range<D1> LocalToBase_t;
  typedef Range<D1> TotalDomain_t;
  inline static
  TotalDomain_t totalDomain(const LocalToBase_t &dom)
  {
    return dom;
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
class Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag,Dim2> >
{
public:
  typedef MultiPatchView<LayoutTag, PatchTag, Dim2> Tag_t;
  typedef Engine<Dim,T,Tag_t> This_t;
  typedef Engine<Dim,T,Tag_t> Engine_t;
  typedef Engine<Dim2,T,MultiPatch<LayoutTag,PatchTag> > ViewedEngine_t;
  typedef Interval<Dim> Domain_t;
  typedef T Element_t;
  typedef PatchTag PatchTag_t;
  typedef Engine<Dim2, T, PatchTag_t> PatchEngine_t;
  typedef typename PatchEngine_t::ElementRef_t ElementRef_t;
  typedef RefCountedBlockPtr<PatchEngine_t> PatchContainer_t;
  typedef MultiPatchLayoutTraits<LayoutTag,Dim2> ViewedLayoutTraits_t;
  typedef typename ViewedLayoutTraits_t::Layout_t ViewedLayout_t;
  typedef typename ViewedLayoutTraits_t::template View<Dim>
                                                    NestedViewTraits_t;
  typedef typename NestedViewTraits_t::Layout_t Layout_t;
  enum { dimensions = Dim };
  enum { hasDataObject = false };
  enum { dynamic = PatchEngine_t::dynamic };
  enum { zeroBased = true };
  enum { multiPatch = true };
  Engine() { }
  template<class DT>
  Engine(const ViewedEngine_t &engine, const Domain<Dim2, DT> &domain)
  : layout_m(engine.layout(), domain),
    baseEngine_m(engine)
  { }
  template<class DT>
  Engine(const ViewedEngine_t &engine, const SliceDomain<DT> &domain)
  : layout_m(engine.layout(), domain),
    baseEngine_m(engine)
  { }
  template<class DT>
  Engine(const This_t &engine, const Domain<Dim, DT> &domain)
  : layout_m(engine.layout(), domain),
    baseEngine_m(engine.baseEngine_m)
  { }
  template<int OrigDim, class DT>
  Engine(const Engine<OrigDim, T, Tag_t> &engine,
    const SliceDomain<DT> &domain)
  : layout_m(engine.layout(), domain),
    baseEngine_m(engine.baseEngine())
  { }
  Engine(const Engine_t &model);
  ~Engine();
  Engine_t &operator=(const Engine_t &model);
  Element_t read(const Loc<Dim> &) const;
  ElementRef_t operator()(const Loc<Dim> &) const;
  Element_t read(int) const;
  Element_t read(int, int) const;
  Element_t read(int, int, int) const;
  Element_t read(int, int, int, int) const;
  Element_t read(int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int, int) const;
  ElementRef_t operator()(int) const;
  ElementRef_t operator()(int, int) const;
  ElementRef_t operator()(int, int, int) const;
  ElementRef_t operator()(int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int, int) const;
  typename NewEngine<This_t, INode<Dim> >::Type_t
  globalPatch(const INode<Dim> &inode) const
  {
    typedef SubDomainTraits<Dim2, Dim> SubDomainTraits_t;
    typedef typename SubDomainTraits_t::LocalToBase_t LocalToBase_t;
    int gid = inode.globalID(layout_m.ID());
    PatchEngine_t &pengine = data()[gid];
    LocalToBase_t bdom = Pooma::NoInit();
    layout_m.localToBase(inode.domain(), bdom);
    ;
    typedef typename NewEngine<This_t,INode<Dim> >::Type_t Ret_t;
    return Ret_t(pengine, bdom);
  }
  template<class Domain>
  typename NewEngine<This_t, Node<Domain> >::Type_t
  globalPatch(const Node<Domain> &node) const
  {
    typedef SubDomainTraits<Dim2, Dim> SubDomainTraits_t;
    typedef typename SubDomainTraits_t::LocalToBase_t LocalToBase_t;
    LocalToBase_t bdom = Pooma::NoInit();
    layout_m.localToBase(node.domain(), bdom);
    int gid = node.globalID();
    PatchEngine_t &pengine = data()[gid];
    ;
    typedef typename NewEngine<This_t,Node<Domain> >::Type_t Ret_t;
    return Ret_t(pengine, bdom);
  }
  inline Layout_t &layout()
  {
    return layout_m;
  }
  inline const Layout_t &layout() const
  {
    return layout_m;
  }
  inline const Domain_t &domain() const
  {
    return layout().domain();
  }
  inline const Domain_t &innerDomain() const
  {
    return layout().innerDomain();
  }
  inline int first(int) const
  {
    return 0;
  }
  inline bool initialized() const
  {
    return layout().initialized();
  }
  inline void fillGuards() const
  {
    baseEngine_m.fillGuards();
  }
  inline void fillGuards(const GuardLayers<Dim2>& g) const
  {
    baseEngine_m.fillGuards(g);
  }
  inline void setGuards(const T &val) const
  {
    baseEngine_m.setGuards(val);
  }
  inline void accumulateFromGuards() const
  {
    baseEngine_m.accumulateFromGuards();
  }
  inline void setDirty() const
  {
    baseEngine_m.setDirty();
  }
  inline void clearDirty(int face=-1) const
  {
    baseEngine_m.clearDirty(face);
  }
  inline bool isDirty(int face=-1) const
  {
    return baseEngine_m.isDirty(face);
  }
  inline const PatchContainer_t &data() const
  {
    return baseEngine_m.data();
  }
  template<int D1, class T1>
  inline bool sameController(const Engine<D1, T1, Tag_t> &e) const
  {
    return block() == e.block();
  }
  PatchContainer_t block() const
  {
    return baseEngine_m.data();
  }
  inline const ViewedEngine_t &baseEngine() const
  {
    return baseEngine_m;
  }
private:
  Layout_t layout_m;
  ViewedEngine_t baseEngine_m;
};
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(const Loc<Dim> &loc) const
{
  return data()[layout_m.globalID(loc)].read(loc);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0) const
{
  return data()[layout_m.globalID(i0)].read(i0);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1) const
{
  return data()[layout_m.globalID(i0, i1)].read(i0, i1);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1, int i2)
const
{
  return data()[layout_m.globalID(i0, i1, i2)].read(i0, i1, i2);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1, int i2,
  int i3) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3)].read(i0, i1, i2, i3);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1, int i2,
  int i3, int i4) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4)].read
    (i0, i1, i2, i3, i4);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1, int i2,
  int i3, int i4, int i5) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4, i5)].read
    (i0, i1, i2, i3, i4, i5);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::Element_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::read(int i0, int i1, int i2,
  int i3, int i4, int i5, int i6) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4, i5, i6)].read
    (i0, i1, i2, i3, i4, i5, i6);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(const Loc<Dim> &loc)
  const
{
  return data()[layout_m.globalID(loc)](loc);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0) const
{
  return data()[layout_m.globalID(i0)](i0);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0,
  int i1) const
{
  return data()[layout_m.globalID(i0, i1)](i0, i1);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0, int i1,
  int i2) const
{
  return data()[layout_m.globalID(i0, i1, i2)](i0, i1, i2);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0, int i1,
  int i2, int i3) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3)](i0, i1, i2, i3);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0, int i1,
  int i2, int i3, int i4) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4)]
    (i0, i1, i2, i3, i4);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0, int i1,
  int i2, int i3, int i4, int i5) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4, i5)]
    (i0, i1, i2, i3, i4, i5);
}
template<int Dim, class T, class LayoutTag, class PatchTag>
inline typename Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::ElementRef_t
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::operator()(int i0, int i1,
  int i2, int i3, int i4, int i5, int i6) const
{
  return data()[layout_m.globalID(i0, i1, i2, i3, i4, i5, i6)]
    (i0, i1, i2, i3, i4, i5, i6);
}
template <int Dim, class T, class LayoutTag, class PatchTag>
inline void Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
dynamicHandler(Observable_t &, const ObserverEvent &,
               const WrappedInt<false> &)
{
  if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("This patch engine does not support dynamic events!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.h", 1460);
}
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
Engine(const Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >
  &modelEngine)
: layout_m(modelEngine.layout_m),
  baseEngine_m(modelEngine.baseEngine_m)
{ }
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> > &
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator=(const Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >
  &rhs)
{
  if (&rhs == this) return *this;
  layout_m = rhs.layout_m;
  baseEngine_m = rhs.baseEngine_m;
  return *this;
}
template <int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
Engine<Dim, T, MultiPatchView<LayoutTag,PatchTag,Dim2> >::
~Engine()
{ }
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(const Loc<Dim> &loc) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(loc, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::read(int i0) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1, int i2) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1, int i2, int i3) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1, int i2, int i3, int i4) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1, int i2, int i3, int i4, int i5) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, i5, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline
typename Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::Element_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
read(int i0, int i1, int i2, int i3, int i4, int i5, int i6) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, i5, i6, gloc);
  return data()[o].read(gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(const Loc<Dim> &loc) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(loc, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1, int i2) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1, int i2, int i3) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1, int i2, int i3, int i4) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1, int i2, int i3, int i4, int i5) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, i5, gloc);
  return data()[o](gloc);
}
template<int Dim, class T, class LayoutTag, class PatchTag, int Dim2>
inline typename
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::ElementRef_t
Engine<Dim, T, MultiPatchView<LayoutTag, PatchTag, Dim2> >::
operator()(int i0, int i1, int i2, int i3, int i4, int i5, int i6) const
{
  Loc<Dim2> gloc = Pooma::NoInit();
  int o = layout_m.globalID(i0, i1, i2, i3, i4, i5, i6, gloc);
  return data()[o](gloc);
}
template <int Dim, class T, class LayoutTag, class PatchTag, class Intersect>
struct LeafFunctor<Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  ExpressionApply<IntersectorTag<Intersect> > >
{
  typedef int Type_t;
  static Type_t
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &engine,
 const ExpressionApply<IntersectorTag<Intersect> > &tag)
  {
    GuardLayers<Dim> usedGuards;
    bool useGuards =
      tag.tag().intersector_m.intersect(engine,
      engine.layout().internalGuards(), usedGuards);
    if (useGuards)
      engine.fillGuards(usedGuards);
    return 0;
  }
};
template <int Dim, class T, class LT, class PatchTag, int BD,
  class Intersect>
struct LeafFunctor<Engine<Dim, T, MultiPatchView<LT,PatchTag,BD> >,
  ExpressionApply<IntersectorTag<Intersect> > >
{
  typedef int Type_t;
  static Type_t
  apply(const Engine<Dim,T,MultiPatchView<LT,PatchTag,BD> > &engine,
 const ExpressionApply<IntersectorTag<Intersect> > &tag)
  {
    typedef typename MultiPatchLayoutTraits<LT,Dim>::Layout_t Layout_t;
    return applyHandler(engine, tag, WrappedInt<Layout_t::supportsGuards>());
  }
  inline static Type_t
  applyHandler(const Engine<Dim,T,MultiPatchView<LT,PatchTag,BD> > &engine,
        const ExpressionApply<IntersectorTag<Intersect> > &tag,
        const WrappedInt<true> &)
  {
    GuardLayers<BD> usedGuards;
    bool useGuards =
      tag.tag().intersector_m.
      intersect(engine,
  engine.layout().baseLayout().internalGuards(), usedGuards);
    if (useGuards)
      engine.fillGuards(usedGuards);
    return 0;
  }
  inline static Type_t
  applyHandler(const Engine<Dim,T,MultiPatchView<LT,PatchTag,BD> > &engine,
        const ExpressionApply<IntersectorTag<Intersect> > &tag,
        const WrappedInt<false> &)
  {
    tag.tag().intersector_m.intersect(engine);
    return 0;
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct EngineFunctor<Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  EnginePatch >
{
  typedef Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> > Subject_t;
  typedef Engine<Dim,T,PatchTag> Type_t;
  static inline
  Type_t apply(const Subject_t &engine, const EnginePatch &tag)
  {
    return engine.localPatch(tag.patch_m);
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct EngineFunctor<Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  EngineNumPatches >
{
  typedef int Type_t;
  static inline
  Type_t apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &engine,
        const EngineNumPatches &)
  {
    return engine.layout().sizeLocal();
  }
};
template <int Dim, class T, class LayoutTag, class PatchTag>
struct NotifyEngineWrite<Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> > >
{
  inline static void
  notify(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &engine)
  {
    engine.setDirty();
  }
};
template <int Dim, class T, class LT, class PatchTag, int BD>
struct NotifyEngineWrite<Engine<Dim, T, MultiPatchView<LT,PatchTag,BD> > >
{
  inline static void
  notify(const Engine<Dim,T,MultiPatchView<LT,PatchTag,BD> > &engine)
  {
    engine.setDirty();
  }
};
template<class PatchEngine>
inline
PatchEngine &localPatchEngine(PatchEngine &e)
{
  return e;
}
class TagGenerator
{
public:
  TagGenerator()
    : send_m(1), receive_m(1)
  {
    send_m[0] = 0;
    receive_m[0] = 0;
  }
  TagGenerator(int n)
    : send_m(n), receive_m(n)
  {
    int i;
    for (i = 0; i < n; ++i)
      {
        send_m[i] = 0;
        receive_m[i] = 0;
      }
  }
  int send(int otherContext)
  {
    ;
    int tag = send_m[otherContext];
    send_m[otherContext]++;
    return tag;
  }
  int receive(int otherContext)
  {
    ;
    int tag = receive_m[otherContext];
    receive_m[otherContext]++;
    return tag;
  }
private:
  std::vector<int> send_m;
  std::vector<int> receive_m;
};
namespace Pooma {
extern int expectedMessages_g;
void initializeCheetahHelpers(int contexts);
void finalizeCheetahHelpers();
int sendTag(int context);
int receiveTag(int context);
inline void addIncomingMessage()
{
  expectedMessages_g++;
}
inline void gotIncomingMessage()
{
  expectedMessages_g--;
}
inline bool incomingMessages()
{
  return (expectedMessages_g > 0);
}
}
class Full;
template<int D, class T, class E> class Vector;
template<int D, class T, class E> class VectorEngine;
template<class V, int I>
struct VectorElem
{
  typedef V Element_t;
  typedef const V& ConstElementRef_t;
  typedef V& ElementRef_t;
  static const V& get(const V& x) { return x; }
  static V& get( V& x) { return x; }
};
template<int D, class T, class E, int I>
struct VectorEngineElem
{
  typedef VectorEngine<D,T,E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::ConstElementRef_t ConstElementRef_t;
  typedef typename V::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x(I); }
  static ElementRef_t get( V& x) { return x(I); }
};
template<int D, class T, class E, int I>
struct VectorElem< Vector<D,T,E> , I >
{
  typedef Vector<D,T,E> V;
  typedef VectorEngineElem<D,T,E,I> VE;
  typedef typename VE::Element_t Element_t;
  typedef typename VE::ConstElementRef_t ConstElementRef_t;
  typedef typename VE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return VE::get(x.engine()); }
  static ElementRef_t get(V& x) { return VE::get(x.engine()); }
};
template<class V1, class V2, class Op, int B, int L>
struct VectorAssign
{
  static void apply(V1& v1, const V2& v2, Op op)
    {
      PoomaCTAssert<(L>1)>::test();
      VectorAssign<V1,V2,Op,B,L/2>::apply(v1,v2,op);
      VectorAssign<V1,V2,Op,B+L/2,L-L/2>::apply(v1,v2,op);
    }
};
template<class V1, class V2, class Op, int B>
struct VectorAssign<V1,V2,Op,B,0>
{
  static void apply(V1&, const V2&, Op) {}
};
template<class V1, class V2, class Op, int B>
struct VectorAssign<V1,V2,Op,B,1>
{
  static void apply(V1& v1, const V2& v2, Op op)
    {
      op(VectorElem<V1,B>::get(v1),VectorElem<V2,B>::get(v2));
    }
};
template<class V1, class V2, class Op, int B>
struct VectorAssign<V1,V2,Op,B,2>
{
  static void apply(V1& v1, const V2& v2, Op op)
    {
      op(VectorElem<V1,B >::get(v1), VectorElem<V2,B >::get(v2));
      op(VectorElem<V1,B+1>::get(v1), VectorElem<V2,B+1>::get(v2));
    }
};
template<class V1, class V2, class Op, int B>
struct VectorAssign<V1,V2,Op,B,3>
{
  static void apply(V1& v1, const V2& v2, Op op)
    {
      op(VectorElem<V1,B >::get(v1), VectorElem<V2,B >::get(v2));
      op(VectorElem<V1,B+1>::get(v1), VectorElem<V2,B+1>::get(v2));
      op(VectorElem<V1,B+2>::get(v1), VectorElem<V2,B+2>::get(v2));
    }
};
template<class V1, class V2, class Op>
class BinaryVectorOp;
template<int D, class T, class V1, class V2, class Op>
class VectorEngine<D,T, BinaryVectorOp<V1,V2,Op> >
{
public:
  enum { dimensions=1 };
  enum { d1=D };
  typedef T Element_t;
  typedef BinaryVectorOp<V1,V2,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef VectorEngine<D,T, BinaryVectorOp<V1,V2,Op> > This_t;
  VectorEngine(const V1& v1, const V2& v2)
    : v1_m(v1), v2_m(v2) {}
  Element_t operator()(int i) const
  {
    return Op()(v1_m(i), v2_m(i));
  }
  template<int DD,class TT, class EE, int I>
    friend struct VectorEngineElem;
private:
  const V1& v1_m;
  const V2& v2_m;
};
template<int D, class T, class V1, class V2, class Op, int I>
struct VectorEngineElem<D,T,BinaryVectorOp<V1,V2,Op>, I >
{
  typedef VectorEngine<D,T,BinaryVectorOp<V1,V2,Op> > V;
  typedef typename VectorElem<V1,I>::Element_t T1;
  typedef typename VectorElem<V2,I>::Element_t T2;
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(
        VectorElem<V1,I>::get(x.v1_m),
        VectorElem<V2,I>::get(x.v2_m));
    }
};
template<class V1, class Op>
class UnaryVectorOp;
template<int D, class T, class V1, class Op>
class VectorEngine<D,T,UnaryVectorOp<V1,Op> >
{
public:
  enum { dimensions=1 };
  enum { d1 = D };
  typedef T Element_t;
  typedef UnaryVectorOp<V1,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef VectorEngine<D,T, UnaryVectorOp<V1,Op> > This_t;
  explicit VectorEngine(const V1& v1)
    : v1_m(v1) {}
  Element_t operator()(int i) const
  {
    return Op()(v1_m(i));
  }
  template<int DD,class TT, class EE, int I>
    friend struct VectorEngineElem;
private:
  const V1& v1_m;
};
template<int D, class T, class V1, class Op, int I>
struct VectorEngineElem<D,T,UnaryVectorOp<V1,Op>, I>
{
  typedef VectorEngine<D,T,UnaryVectorOp<V1,Op> > V;
  typedef typename VectorElem<V1,I>::Element_t T1;
  typedef typename UnaryReturn<T1,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(VectorElem<V1,I>::get(x.v1_m));
    }
};
template<int D, class T, class E> class Vector;
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnArcCos > { typedef Vector< D, typename UnaryReturn<T,FnArcCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnArcCos >::Type_t acos( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnArcCos>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnArcCos> > Expr_t; typedef typename UnaryReturn<V1,FnArcCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnArcSin > { typedef Vector< D, typename UnaryReturn<T,FnArcSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnArcSin >::Type_t asin( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnArcSin>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnArcSin> > Expr_t; typedef typename UnaryReturn<V1,FnArcSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnArcTan > { typedef Vector< D, typename UnaryReturn<T,FnArcTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnArcTan >::Type_t atan( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnArcTan>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnArcTan> > Expr_t; typedef typename UnaryReturn<V1,FnArcTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnCeil > { typedef Vector< D, typename UnaryReturn<T,FnCeil>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnCeil >::Type_t ceil( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnCeil>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnCeil> > Expr_t; typedef typename UnaryReturn<V1,FnCeil>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnCos > { typedef Vector< D, typename UnaryReturn<T,FnCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnCos >::Type_t cos( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnCos>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnCos> > Expr_t; typedef typename UnaryReturn<V1,FnCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnHypCos > { typedef Vector< D, typename UnaryReturn<T,FnHypCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnHypCos >::Type_t cosh( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnHypCos>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnHypCos> > Expr_t; typedef typename UnaryReturn<V1,FnHypCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnExp > { typedef Vector< D, typename UnaryReturn<T,FnExp>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnExp >::Type_t exp( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnExp>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnExp> > Expr_t; typedef typename UnaryReturn<V1,FnExp>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnFabs > { typedef Vector< D, typename UnaryReturn<T,FnFabs>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnFabs >::Type_t fabs( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnFabs>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnFabs> > Expr_t; typedef typename UnaryReturn<V1,FnFabs>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnFloor > { typedef Vector< D, typename UnaryReturn<T,FnFloor>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnFloor >::Type_t floor( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnFloor>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnFloor> > Expr_t; typedef typename UnaryReturn<V1,FnFloor>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnLog > { typedef Vector< D, typename UnaryReturn<T,FnLog>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnLog >::Type_t log( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnLog>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnLog> > Expr_t; typedef typename UnaryReturn<V1,FnLog>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnLog10 > { typedef Vector< D, typename UnaryReturn<T,FnLog10>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnLog10 >::Type_t log10( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnLog10>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnLog10> > Expr_t; typedef typename UnaryReturn<V1,FnLog10>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnSin > { typedef Vector< D, typename UnaryReturn<T,FnSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnSin >::Type_t sin( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnSin>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnSin> > Expr_t; typedef typename UnaryReturn<V1,FnSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnHypSin > { typedef Vector< D, typename UnaryReturn<T,FnHypSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnHypSin >::Type_t sinh( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnHypSin>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnHypSin> > Expr_t; typedef typename UnaryReturn<V1,FnHypSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnSqrt > { typedef Vector< D, typename UnaryReturn<T,FnSqrt>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnSqrt >::Type_t sqrt( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnSqrt>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnSqrt> > Expr_t; typedef typename UnaryReturn<V1,FnSqrt>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnTan > { typedef Vector< D, typename UnaryReturn<T,FnTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnTan >::Type_t tan( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnTan>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnTan> > Expr_t; typedef typename UnaryReturn<V1,FnTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, FnHypTan > { typedef Vector< D, typename UnaryReturn<T,FnHypTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, FnHypTan >::Type_t tanh( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,FnHypTan>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,FnHypTan> > Expr_t; typedef typename UnaryReturn<V1,FnHypTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, OpUnaryMinus > { typedef Vector< D, typename UnaryReturn<T,OpUnaryMinus>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, OpUnaryMinus >::Type_t operator-( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,OpUnaryMinus>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,OpUnaryMinus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryMinus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, OpUnaryPlus > { typedef Vector< D, typename UnaryReturn<T,OpUnaryPlus>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, OpUnaryPlus >::Type_t operator+( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,OpUnaryPlus>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,OpUnaryPlus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryPlus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Vector<D,T,E>, OpBitwiseNot > { typedef Vector< D, typename UnaryReturn<T,OpBitwiseNot>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Vector<D,T,E>, OpBitwiseNot >::Type_t operator~( const Vector<D,T,E>& v1 ) { typedef Vector<D,T,E> V1; typedef typename UnaryReturn<T,OpBitwiseNot>::Type_t T3; typedef Vector< D, T3, UnaryVectorOp<V1,OpBitwiseNot> > Expr_t; typedef typename UnaryReturn<V1,OpBitwiseNot>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpAdd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpAdd >::Type_t operator+( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpAdd> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpAdd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpAdd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpAdd >::Type_t operator+( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpAdd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpAdd >::Type_t operator+( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpAdd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpSubtract > { typedef Vector< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpSubtract >::Type_t operator-( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpSubtract> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpSubtract > { typedef Vector< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpSubtract > { typedef Vector< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpSubtract >::Type_t operator-( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpSubtract> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpSubtract >::Type_t operator-( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpSubtract> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpMultiply > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpMultiply >::Type_t operator*( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpMultiply> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpMultiply > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpMultiply > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpMultiply >::Type_t operator*( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpMultiply> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpMultiply >::Type_t operator*( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpMultiply> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpDivide > { typedef Vector< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpDivide >::Type_t operator/( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpDivide> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpDivide > { typedef Vector< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpDivide > { typedef Vector< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpDivide >::Type_t operator/( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpDivide> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpDivide >::Type_t operator/( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpDivide> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpMod > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpMod >::Type_t operator%( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpMod> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpMod > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpMod > { typedef Vector< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpMod >::Type_t operator%( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpMod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpMod >::Type_t operator%( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpMod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpBitwiseAnd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpBitwiseAnd >::Type_t operator&( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseAnd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseAnd > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseAnd >::Type_t operator&( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseAnd >::Type_t operator&( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpBitwiseOr > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpBitwiseOr >::Type_t operator|( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseOr > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseOr > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseOr >::Type_t operator|( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseOr >::Type_t operator|( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, OpBitwiseXor > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, OpBitwiseXor >::Type_t operator^( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseXor > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseXor > { typedef Vector< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, OpBitwiseXor >::Type_t operator^( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, OpBitwiseXor >::Type_t operator^( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, FnLdexp > { typedef Vector< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, FnLdexp >::Type_t ldexp( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,FnLdexp> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, FnLdexp > { typedef Vector< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, FnLdexp > { typedef Vector< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, FnLdexp >::Type_t ldexp( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,FnLdexp> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, FnLdexp >::Type_t ldexp( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,FnLdexp> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, FnPow > { typedef Vector< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, FnPow >::Type_t pow( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,FnPow> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, FnPow > { typedef Vector< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, FnPow > { typedef Vector< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, FnPow >::Type_t pow( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,FnPow> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, FnPow >::Type_t pow( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,FnPow> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, FnFmod > { typedef Vector< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, FnFmod >::Type_t fmod( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,FnFmod> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, FnFmod > { typedef Vector< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, FnFmod > { typedef Vector< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, FnFmod >::Type_t fmod( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,FnFmod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, FnFmod >::Type_t fmod( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,FnFmod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, Vector<D,T2,E>, FnArcTan2 > { typedef Vector< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Vector<D,T1,E1>, Vector<D,T2,E2>, FnArcTan2 >::Type_t atan2( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { typedef Vector<D,T1,E1> V1; typedef Vector<D,T2,E2> V2; typedef typename BinaryReturn<V1,V2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,V2,FnArcTan2> > Expr_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Vector<D,T1,E>, T2, FnArcTan2 > { typedef Vector< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Vector<D,T2,E>, FnArcTan2 > { typedef Vector< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Vector<D,T1,E>, T2, FnArcTan2 >::Type_t atan2( const Vector<D,T1,E>& v1, const T2& x ) { typedef Vector<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<V1,T2,FnArcTan2> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Vector<D,T2,E>, FnArcTan2 >::Type_t atan2( const T1& x, const Vector<D,T2,E>& v2 ) { typedef Vector<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Vector< D, T3, BinaryVectorOp<T1,V2,FnArcTan2> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template<class V1, class V2, int B, int L>
struct VectorDotVector
{
  typedef typename VectorDotVector<V1,V2,B,L/2>::Type_t Left_t;
  typedef typename VectorDotVector<V1,V2,B+L/2,L-L/2>::Type_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpAdd>::Type_t Type_t;
  static Type_t get(const V1& x, const V2& y)
    {
      return
        VectorDotVector<V1,V2,B,L/2>::get(x,y) +
        VectorDotVector<V1,V2,B+L/2,L-L/2>::get(x,y);
    }
};
template<class V1, class V2, int B>
struct VectorDotVector<V1,V2,B,1>
{
  typedef typename VectorElem<V1,B>::Element_t Left_t;
  typedef typename VectorElem<V2,B>::Element_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpMultiply>::Type_t Type_t;
  static Type_t get(const V1& x, const V2& y)
    {
      return VectorElem<V1,B>::get(x) * VectorElem<V2,B>::get(y);
    }
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Vector<D,T2,E2> , FnDot >
{
  typedef Vector<D,T1,E1> V1;
  typedef Vector<D,T2,E2> V2;
  typedef typename VectorDotVector<V1,V2,0,D>::Type_t T0;
  typedef T0 Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< Vector<D,T1,E1>,Vector<D,T2,E2> , FnDot >::Type_t
dot( const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 )
{
  return VectorDotVector<Vector<D,T1,E1>,Vector<D,T2,E2>,0,D>::get(v1,v2);
}
template<int D, class T, class E>
struct UnaryReturn< Vector<D,T,E> , FnNorm >
{
  typedef T Type_t;
};
template<int D, class T, class E>
inline T
norm(const Vector<D,T,E>& x)
{
  return sqrt(dot(x,x));
}
template<int D, class T, class E>
inline T
norm2(const Vector<D,T,E>& x)
{
  return dot(x,x);
}
template<class V1, class V2, int B, int L>
struct VectorEqualsVector
{
  typedef typename VectorEqualsVector<V1,V2,B,L/2>::Type_t Left_t;
  typedef typename VectorEqualsVector<V1,V2,B+L/2,L-L/2>::Type_t Right_t;
  typedef bool Type_t;
  static Type_t get(const V1& x, const V2& y)
    {
      return
        VectorEqualsVector<V1,V2,B,L/2>::get(x,y) &&
        VectorEqualsVector<V1,V2,B+L/2,L-L/2>::get(x,y);
    }
};
template<class V1, class V2, int B>
struct VectorEqualsVector<V1,V2,B,1>
{
  typedef typename VectorElem<V1,B>::Element_t Left_t;
  typedef typename VectorElem<V2,B>::Element_t Right_t;
  typedef bool Type_t;
  static Type_t get(const V1& x, const V2& y)
    {
      return VectorElem<V1,B>::get(x) == VectorElem<V2,B>::get(y);
    }
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Vector<D,T2,E2> , OpEQ >
{
  typedef bool Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Vector<D,T2,E2> , OpNE >
{
  typedef bool Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< Vector<D,T1,E1>,Vector<D,T2,E2> , OpEQ >::Type_t
operator==(const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2)
{
  return VectorEqualsVector<Vector<D,T1,E1>,Vector<D,T2,E2>,0,D>::get(v1,v2);
}
template<int D, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< Vector<D,T1,E1>,Vector<D,T2,E2> , OpNE >::Type_t
operator!=(const Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2)
{
  return !(v1 == v2);
}
template<int D, class T, class E>
inline typename
BinaryReturn<Vector<D, T, E>, Vector<D, T, E> , OpNE>::Type_t
operator!=(const Vector<D, T, E>& v1, const Vector<D, T, E>& v2)
{
  return !(v1 == v2);
}
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator+=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpAddAssign,0,D>::apply(v1,v2,OpAddAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator+=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpAddAssign,0,D>::apply(v1,v2,OpAddAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator-=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpSubtractAssign,0,D>::apply(v1,v2,OpSubtractAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator-=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpSubtractAssign,0,D>::apply(v1,v2,OpSubtractAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator*=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpMultiplyAssign,0,D>::apply(v1,v2,OpMultiplyAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator*=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpMultiplyAssign,0,D>::apply(v1,v2,OpMultiplyAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator/=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpDivideAssign,0,D>::apply(v1,v2,OpDivideAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator/=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpDivideAssign,0,D>::apply(v1,v2,OpDivideAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator%=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpModAssign,0,D>::apply(v1,v2,OpModAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator%=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpModAssign,0,D>::apply(v1,v2,OpModAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator|=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpBitwiseOrAssign,0,D>::apply(v1,v2,OpBitwiseOrAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator|=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpBitwiseOrAssign,0,D>::apply(v1,v2,OpBitwiseOrAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator&=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpBitwiseAndAssign,0,D>::apply(v1,v2,OpBitwiseAndAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator&=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpBitwiseAndAssign,0,D>::apply(v1,v2,OpBitwiseAndAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator^=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpBitwiseXorAssign,0,D>::apply(v1,v2,OpBitwiseXorAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator^=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpBitwiseXorAssign,0,D>::apply(v1,v2,OpBitwiseXorAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator<<=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpLeftShiftAssign,0,D>::apply(v1,v2,OpLeftShiftAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator<<=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpLeftShiftAssign,0,D>::apply(v1,v2,OpLeftShiftAssign()); return v1; }
template <int D, class T1, class T2, class E1, class E2> inline Vector<D,T1,E1>& operator>>=( Vector<D,T1,E1>& v1, const Vector<D,T2,E2>& v2 ) { VectorAssign<Vector<D,T1,E1>,Vector<D,T2,E2>,OpRightShiftAssign,0,D>::apply(v1,v2,OpRightShiftAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Vector<D,T1,E1>& operator>>=( Vector<D,T1,E1>& v1, const T2& v2 ) { VectorAssign<Vector<D,T1,E1>,T2,OpRightShiftAssign,0,D>::apply(v1,v2,OpRightShiftAssign()); return v1; }
template<int D, class T, class E> class Vector;
template<int D, class T, class E> class VectorEngine;
template <class T>
void reverseBytes(T&);
template<int Dim, class T=double, class EngineTag=Full>
class Vector
{
public:
  enum { dimensions=1 };
  enum { d1 = Dim };
  typedef T Element_t;
  typedef EngineTag EngineTag_t;
  typedef VectorEngine<Dim,T,EngineTag> Engine_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef typename Engine_t::ConstElementRef_t ConstElementRef_t;
  typedef Vector<Dim,T,EngineTag> This_t;
  Vector() {}
  Vector(const This_t& x) : engine_m(x.engine_m) {}
  template<int D2, class T2, class EngineTag2>
  Vector(const Vector<D2, T2, EngineTag2>& x) : engine_m(x) {}
  template<class X>
  explicit Vector(const X& x) : engine_m(x) {}
  template<class X1, class X2>
  Vector(const X1& x, const X2& y)
    : engine_m(x,y) {}
  template<class X1, class X2, class X3>
  Vector(const X1& x, const X2& y, const X3& z)
    : engine_m(x,y,z) {}
  template<class X1, class X2, class X3, class X4>
  Vector(const X1& x, const X2& y, const X3& z, const X4& a)
    : engine_m(x,y,z,a) {}
  template<class X1, class X2, class X3, class X4, class X5>
  Vector(const X1& x, const X2& y, const X3& z, const X4& a,
  const X5& b)
    : engine_m(x,y,z,a,b) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  Vector(const X1& x, const X2& y, const X3& z, const X4& a,
  const X5& b, const X6& c)
    : engine_m(x,y,z,a,b,c) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6, class X7>
  Vector(const X1& x, const X2& y, const X3& z, const X4& a,
  const X5& b, const X6& c, const X7& d)
    : engine_m(x,y,z,a,b,c,d) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
      class X7, class X8, class X9, class X10>
  Vector(const X1& x, const X2& y, const X3& z, const X4& a,
  const X5& b, const X6& c, const X7& d, const X8& e,
  const X9& f, const X10& g)
    : engine_m(x,y,z,a,b,c,d,e,f,g) {}
  ~Vector() {}
  This_t& operator=(const This_t& x)
    {
      if ( this != &const_cast<This_t &>(x) )
        engine() = x.engine();
      return *this;
    }
  template<class V>
    This_t&
      operator=(const V& x)
        {
          engine() = x;
          return *this;
        }
  ConstElementRef_t operator()(int i) const
    {
      return engine()(i);
    }
  ElementRef_t operator()(int i)
    {
      return engine()(i);
    }
  const Engine_t& engine() const { return engine_m; }
  Engine_t& engine() { return engine_m; }
  template<class Out>
  void print(Out &out) const;
  inline void reverseBytes() { engine_m.reverseBytes(); }
private:
  Engine_t engine_m;
};
template<int Dim, class T, class EngineTag>
template<class Out>
void Vector<Dim, T, EngineTag>::print(Out &out) const
{
  std::ios::fmtflags incomingFormatFlags = out.flags();
  long width = out.width();
  long precision = out.precision();
  out.width(0);
  out << "(";
  out.flags(incomingFormatFlags);
  out.width(width);
  out.precision(precision);
  out << (*this)(0) ;
  for (int i = 1; i < Dim; i++) {
    out << ",";
    out.flags(incomingFormatFlags);
    out.width(width);
    out.precision(precision);
    out << (*this)(i);
  }
  out << ")";
}
template<int D, class T, class E>
std::ostream &operator<<(std::ostream &out, const Vector<D,T,E> &v)
{
  v.print(out);
  return out;
}
template <int D, class T, class E>
struct ElementProperties< Vector<D,T,E> >
  : public TrivialElementProperties< Vector<D,T,E> >
{ };
template<int D, class T>
class VectorEngine<D,T,Full>
{
public:
  enum { dimensions=1 };
  enum { d1 = D };
  typedef T Element_t;
  typedef Full EngineTag_t;
  typedef T& ElementRef_t;
  typedef const T& ConstElementRef_t;
  typedef VectorEngine<D,T,Full> This_t;
  VectorEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
    for (int i = 0; i < D; ++i)
      {
 ElementProperties<T>::construct(&x_m[i]);
      }
  }
  inline VectorEngine(const VectorEngine<D,T,Full>&);
  template<class X>
    inline explicit VectorEngine(const X& x)
      {
        VectorAssign< VectorEngine<D,T,Full> , X , OpAssign, 0, D >
          ::apply(*this,x,OpAssign());
      }
  template<class X1, class X2>
  inline VectorEngine(const X1& x, const X2& y)
  {
    PoomaCTAssert<(D == 2)>::test();
    x_m[0] = x;
    x_m[1] = y;
  }
  template<class X1, class X2, class X3>
  inline VectorEngine(const X1& x, const X2& y, const X3& z)
  {
    PoomaCTAssert<(D == 3)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
  }
  template<class X1, class X2, class X3, class X4>
  inline VectorEngine(const X1& x, const X2& y, const X3& z,
        const X4& a)
  {
    PoomaCTAssert<(D == 4)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
    x_m[3] = a;
  }
  template<class X1, class X2, class X3, class X4, class X5>
  inline VectorEngine(const X1& x, const X2& y, const X3& z,
        const X4& a, const X5& b)
  {
    PoomaCTAssert<(D == 5)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
    x_m[3] = a;
    x_m[4] = b;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  inline VectorEngine(const X1& x, const X2& y, const X3& z,
        const X4& a, const X5& b, const X6& c)
  {
    PoomaCTAssert<(D == 6)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
    x_m[3] = a;
    x_m[4] = b;
    x_m[5] = c;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6, class X7>
  inline VectorEngine(const X1& x, const X2& y, const X3& z,
        const X4& a, const X5& b, const X6& c, const X7& d)
  {
    PoomaCTAssert<(D == 7)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
    x_m[3] = a;
    x_m[4] = b;
    x_m[5] = c;
    x_m[6] = d;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
     class X7, class X8, class X9, class X10>
  inline VectorEngine(const X1& x, const X2& y, const X3& z,
        const X4& a, const X5& b, const X6& c,
        const X7& d, const X8& e, const X9& f,
        const X10& g)
  {
    PoomaCTAssert<(D == 10)>::test();
    x_m[0] = x;
    x_m[1] = y;
    x_m[2] = z;
    x_m[3] = a;
    x_m[4] = b;
    x_m[5] = c;
    x_m[6] = d;
    x_m[7] = e;
    x_m[8] = f;
    x_m[9] = g;
  }
  ~VectorEngine() {}
  This_t&
    operator=(const This_t& x)
      {
        if ( this != &x )
          VectorAssign<This_t,This_t,OpAssign,0,D>::apply(*this,x,OpAssign());
        return *this;
      }
  template<class V>
    This_t&
      operator=(const V& x)
        {
          VectorAssign<This_t,V,OpAssign,0,D>::apply(*this,x,OpAssign());
          return *this;
        }
  ConstElementRef_t operator()(int i) const
    {
      ;
      return x_m[i];
    }
  ElementRef_t operator()(int i)
    {
      ;
      return x_m[i];
    }
  inline void reverseBytes()
  {
    for (int d = 0; d < D; ++d) ::reverseBytes(x_m[d]);
  }
private:
  T x_m[D];
};
template<int D, class T, int I>
struct VectorElem< VectorEngine<D,T,Full> , I >
{
  typedef VectorEngine<D,T,Full> V;
  typedef VectorEngineElem<D,T,Full,I> VE;
  typedef typename VE::Element_t Element_t;
  typedef typename VE::ConstElementRef_t ConstElementRef_t;
  typedef typename VE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return VE::get(x); }
  static ElementRef_t get(V& x) { return VE::get(x); }
};
template<class T, class Components> struct ComponentAccess;
template<int D, class T, class E, int N>
struct ComponentAccess< Vector<D, T, E>, Loc<N> >
{
  typedef Vector<D, T, E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::ElementRef_t ElementRef_t;
  static inline ElementRef_t indexRef(V &v, const Loc<N> &l)
    {
      PoomaCTAssert<(N==1)>::test();
      return v(l[0].first());
    }
  static inline Element_t index(const V &v, const Loc<N> &l)
    {
      PoomaCTAssert<(N==1)>::test();
      return v(l[0].first());
    }
};
template<int D, class T>
inline
VectorEngine<D,T,Full>::VectorEngine(const VectorEngine<D,T,Full>& x)
{
  VectorAssign<This_t,This_t,OpAssign,0,D>::apply(*this,x,OpAssign());
}
template<class T>
class RemoteProxy
{
public:
  typedef RemoteProxy<T> This_t;
  RemoteProxy(T &val, int owningContext = 0)
  {
    if (Pooma::context() == owningContext)
    {
      value_m = &val;
    }
  }
  RemoteProxy(const RemoteProxy<T> &s)
  {
    if (s.value_m != &s.storedValue_m)
    {
      value_m = s.value_m;
    }
    else
    {
      storedValue_m = s.value();
      value_m = &storedValue_m;
    }
  }
  inline
  operator T() const { return *value_m; }
  inline
  T &value() { return *value_m; }
  inline
  const T &value() const { return *value_m; }
  template<class S>
  inline
  RemoteProxy<T> &operator=(const S &s)
  {
    *value_m = s;
    return *this;
  }
  template<class S>
  inline
  RemoteProxy<T> &operator=(const RemoteProxy<S> &s)
  {
    *value_m = s.value();
    return *this;
  }
  inline
  RemoteProxy<T> &operator=(const RemoteProxy<T> &s)
  {
    *value_m = s.value();
    return *this;
  }
  inline
  typename ComponentAccess<T, Loc<1> >::Element_t
  operator()(int i) const
  {
    return ComponentAccess<T, Loc<1> >::index(value(), Loc<1>(i));
  }
  inline
  typename ComponentAccess<T, Loc<1> >::ElementRef_t
  operator()(int i)
  {
    return ComponentAccess<T, Loc<1> >::indexRef(value(), Loc<1>(i));
  }
private:
  T *value_m;
  T storedValue_m;
};
template<class T, class S>
inline T
operator*(const RemoteProxy<T> &t, const S &s)
{
  return t.value() * s;
}
template<class T>
class ReductionValue
{
public:
  ReductionValue(bool valid, const T &val)
    : valid_m(valid)
    {
      if (valid_m)
 val_m = val;
    }
  ReductionValue(const ReductionValue<T> &model)
    {
      valid_m = model.valid();
      if (valid_m)
 val_m = model.value();
    }
  ReductionValue<T> &operator=(const ReductionValue<T> &rhs)
    {
      if (&rhs != this)
 {
   valid_m = rhs.valid();
   if (valid_m)
     val_m = rhs.value();
 }
      return *this;
    }
  bool valid() const { return valid_m; }
  const T &value() const { ; return val_m; }
  T &value() { ; return val_m; }
private:
  bool valid_m;
  T val_m;
};
template<class T, class ReductionOp>
class ReduceOverContexts
{
  typedef ReduceOverContexts<T, ReductionOp> This_t;
public:
  ReduceOverContexts(const T &val, int = 0, bool valid = true)
    {
      ;
      value_m = val;
    }
  void broadcast(T &val)
    {
      val = value_m;
    }
  inline operator T() const { return value_m; }
private:
  static void receive(This_t *me, ReductionValue<T> &v)
  {
    if (v.valid())
      {
 if (!me->valid_m)
   {
     me->value_m = v.value();
     me->valid_m = true;
   }
 else
   {
     ReductionOp()(me->value_m, v.value());
   }
      }
    me->toReceive_m--;
  }
  T value_m;
  bool valid_m;
  int toReceive_m;
  int toContext_m;
};
struct SendReceive
{
  template<class View>
  static
  void send(const View &view, int toContext)
  {
    ;
  }
};
template<class IncomingView>
struct Receive
{
  template<class View>
  static
  void receive(const View &view, int fromContext)
  {
    ;
  }
};
template<int Dim>
Interval<Dim> &
shrinkRightInPlace(Interval<Dim> &dom, const Loc<Dim> &s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() - s[d].first();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
shrinkRightInPlace(Interval<Dim> &dom, int s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() - s;
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
growRightInPlace(Interval<Dim> &dom, const Loc<Dim> &s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() + s[d].first();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
growRightInPlace(Interval<Dim> &dom, int s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() + s;
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
shrinkLeftInPlace(Interval<Dim> &dom, const Loc<Dim> &s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s[d].first();
      int b = dom[d].last();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
shrinkLeftInPlace(Interval<Dim> &dom, int s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s;
      int b = dom[d].last();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
growLeftInPlace(Interval<Dim> &dom, const Loc<Dim> &s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s[d].first();
      int b = dom[d].last();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
Interval<Dim> &
growLeftInPlace(Interval<Dim> &dom, int s)
{
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s;
      int b = dom[d].last();
      dom[d] = Interval<1>(a, b);
    }
  return dom;
}
template<int Dim>
inline Interval<Dim>
shrinkRight(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() - s[d].first();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrinkRight(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() - s;
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
growRight(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() + s[d].first();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
growRight(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first();
      int b = dom[d].last() + s;
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrinkLeft(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s[d].first();
      int b = dom[d].last();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrinkLeft(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s;
      int b = dom[d].last();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
growLeft(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s[d].first();
      int b = dom[d].last();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
growLeft(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s;
      int b = dom[d].last();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
grow(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s;
      int b = dom[d].last() + s;
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
grow(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() - s[d].first();
      int b = dom[d].last() + s[d].first();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrink(const Interval<Dim> &dom, int s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s;
      int b = dom[d].last() - s;
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template<int Dim>
inline Interval<Dim>
shrink(const Interval<Dim> &dom, const Loc<Dim> &s)
{
  Interval<Dim> ret = Pooma::NoInit();
  for (int d = 0; d < Dim; ++d)
    {
      int a = dom[d].first() + s[d].first();
      int b = dom[d].last() - s[d].first();
      ret[d] = Interval<1>(a, b);
    }
  return ret;
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
Engine()
  : pDirty_m(0)
{
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
Engine(const Layout_t &layout)
  : layout_m(layout),
    data_m(layout.sizeGlobal()),
    pDirty_m(new int)
{
  typedef typename Layout_t::Value_t Node_t;
  setDirty();
  int sz = data().size();
  typedef Pooma::CountingSemaphore CountingSemaphore_t;
  typedef typename Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
    template PatchAllocator<Node_t,CountingSemaphore_t> PatchAllocator_t;
  CountingSemaphore_t csem;
  csem.height(sz);
  typename Layout_t::const_iterator p = layout_m.beginGlobal();
  for (int i = 0; i < sz; ++i, ++p)
    {
      PatchAllocator_t *spot = new PatchAllocator_t(data()[i], *p, csem);
      Pooma::addRunnable(spot);
    }
  csem.wait();
  layout_m.attach(*this);
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
Engine(const Engine_t &modelEngine)
  : layout_m(modelEngine.layout_m),
    data_m(modelEngine.data_m),
    pDirty_m(modelEngine.pDirty_m)
{
  layout_m.attach(*this);
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
~Engine()
{
  if (initialized())
    {
      layout_m.detach(*this);
      if (!data().isShared())
 delete pDirty_m;
    }
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> > &
Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
operator=(const Engine_t &model)
{
  if (&model == this)
    return *this;
  if (!model.initialized())
    return *this;
  if (initialized())
    {
      if (!data().isShared())
 delete pDirty_m;
      layout_m.detach(*this);
    }
  data_m = model.data();
  pDirty_m = model.pDirty_m;
  layout_m = model.layout_m;
  layout_m.attach(*this);
  return *this;
}
template <int Dim, class T, class LayoutTag, class PatchTag>
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> > &
Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
makeOwnCopy()
{
  if (data_m.isValid() && data_m.isShared()) {
    data_m.makeOwnCopy();
    pDirty_m = new int(*pDirty_m);
  }
  return *this;
}
template <int Dim, class T, class Tag>
static inline
void simpleAssign(const Array<Dim, T, Tag>& lhs,
    const Array<Dim, T, Tag>& rhs,
    const Interval<Dim>& domain)
{
  lhs(domain) = rhs(domain);
}
template <int Dim, class T, class Tag>
static inline
void simpleAssign(const Array<Dim, T, Remote<Tag> >& lhs,
    const Array<Dim, T, Remote<Tag> >& rhs,
    const Interval<Dim>& domain)
{
  if (lhs.engine().owningContext() == rhs.engine().owningContext())
    lhs(domain) = rhs(domain);
  else {
    typedef typename NewEngine<Engine<Dim, T, Tag>, Interval<Dim> >::Type_t ViewEngine_t;
    if (lhs.engine().engineIsLocal())
      Receive<ViewEngine_t>::receive(ViewEngine_t(lhs.engine().localEngine(), domain),
         rhs.engine().owningContext());
    else if (rhs.engine().engineIsLocal())
      SendReceive::send(ViewEngine_t(rhs.engine().localEngine(), domain),
   lhs.engine().owningContext());
  }
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
fillGuardsHandler(const GuardLayers<Dim>& g, const WrappedInt<true> &) const
{
  if (!isDirty()) return;
  int updated = 0;
  typename Layout_t::FillIterator_t p = layout_m.beginFillList();
  while (p != layout_m.endFillList())
    {
      int src = p->ownedID_m;
      int dest = p->guardID_m;
      if (isDirty(p->face_m)) {
 int d = p->face_m/2;
 int guardSizeNeeded = p->face_m & 1 ? g.upper(d) : g.lower(d);
        if (!(p->face_m != -1
       && guardSizeNeeded == 0)) {
          Array<Dim, T, PatchTag> lhs(data()[dest]), rhs(data()[src]);
          lhs(p->domain_m) = rhs(p->domain_m);
   updated |= 1<<p->face_m;
 }
      }
      ++p;
    }
  *pDirty_m &= ~updated;
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
setGuards(const T &val) const
{
  typename Layout_t::FillIterator_t p = layout_m.beginFillList();
  while (p != layout_m.endFillList())
    {
      int dest = p->guardID_m;
      Array<Dim, T, PatchTag> lhs(data()[dest]);
      lhs(p->domain_m) = val;
      ++p;
    }
  setDirty();
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
accumulateFromGuards() const
{
  typename Layout_t::FillIterator_t p = layout_m.beginFillList();
  while (p != layout_m.endFillList())
    {
      int dest = p->ownedID_m;
      int src = p->guardID_m;
      Array<Dim, T, PatchTag> lhs(data()[dest]), rhs(data()[src]);
      lhs(p->domain_m) += rhs(p->domain_m);
      ++p;
    }
  setDirty();
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >::
dynamicHandler(Observable_t &,
               const ObserverEvent &event,
               const WrappedInt<true> &)
{
  switch (event.event())
  {
    case DynamicEvents::create:
      {
        typedef const CreateEvent &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        performCreate(e.amount(), e.patch(), e.ID());
      }
      break;
    case DynamicEvents::destroyInterval:
      {
        typedef const DestroyEvent< Interval<1> > &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        switch (e.method())
        {
          case DynamicEvents::backfill:
            performDestroy(e.domain(), e.patch(), BackFill(), e.ID());
     break;
   case DynamicEvents::shiftup:
     performDestroy(e.domain(), e.patch(), ShiftUp(), e.ID());
     break;
   default:
     if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("Unsupported delete method MultiPatchEngine::destroy", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.cpp", 455);
        }
      }
      break;
    case DynamicEvents::destroyRange:
      {
        typedef const DestroyEvent< Range<1> > &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        switch (e.method())
        {
          case DynamicEvents::backfill:
            performDestroy(e.domain(), e.patch(), BackFill(), e.ID());
     break;
   case DynamicEvents::shiftup:
     performDestroy(e.domain(), e.patch(), ShiftUp(), e.ID());
     break;
   default:
     if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("Unsupported delete method MultiPatchEngine::destroy", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.cpp", 476);
        }
      }
      break;
    case DynamicEvents::destroyList:
      {
        typedef const DestroyEvent< IndirectionList<int> > &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        switch (e.method())
        {
          case DynamicEvents::backfill:
            performDestroy(e.domain(), e.patch(), BackFill(), e.ID());
     break;
   case DynamicEvents::shiftup:
     performDestroy(e.domain(), e.patch(), ShiftUp(), e.ID());
     break;
   default:
     if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("Unsupported delete method MultiPatchEngine::destroy", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.cpp", 497);
        }
      }
      break;
    case DynamicEvents::destroyIterList:
      {
        using Pooma::IteratorPairDomain;
        typedef
          const DestroyEvent< IteratorPairDomain<const int*> > &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        switch (e.method())
        {
          case DynamicEvents::backfill:
            performDestroy(e.domain(), e.patch(), BackFill(), e.ID());
     break;
   case DynamicEvents::shiftup:
     performDestroy(e.domain(), e.patch(), ShiftUp(), e.ID());
     break;
   default:
     if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("Unsupported delete method MultiPatchEngine::destroy", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.cpp", 520);
        }
      }
      break;
    case DynamicEvents::copyInterval:
      {
        typedef const CopyEvent< Interval<1> > &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        performCopy(e.domain(), e.fromPatch(), e.toPatch(), e.ID());
      }
      break;
    case DynamicEvents::copyRange:
      {
        typedef const CopyEvent< Range<1> > &EventRef_t;
 EventRef_t e = dynamic_cast<EventRef_t>(event);
 performCopy(e.domain(), e.fromPatch(), e.toPatch(), e.ID());
      }
      break;
    case DynamicEvents::copyList:
      {
        typedef const CopyEvent< IndirectionList<int> > &EventRef_t;
 EventRef_t e = dynamic_cast<EventRef_t>(event);
 performCopy(e.domain(), e.fromPatch(), e.toPatch(), e.ID());
      }
      break;
    case DynamicEvents::copyPatchList:
      {
        typedef const CopyPatchEvent &EventRef_t;
        EventRef_t e = dynamic_cast<EventRef_t>(event);
        performPatchCopy(e.domainLists(), e.fromPatch(), e.toPatch(),
                         e.create(), e.ID());
      }
      break;
    case DynamicEvents::sync:
      {
        for (int i=0; i < layout().sizeGlobal(); ++i)
   data()[i].sync(layout().nodeListGlobal()[i]->domain());
      }
      break;
    default:
      if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Invalid dynamic op???", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Engine/MultiPatchEngine.cpp", 567);
  }
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
notify(Observable_t &observed, const ObserverEvent &event)
{
  ;
  if(event.event() == Layout_t::repartitionEvent)
    {
      typedef typename Layout_t::Value_t Node_t;
      int sz = layout().sizeGlobal();
      PatchContainer_t newData(sz);
      typedef Pooma::CountingSemaphore CountingSemaphore_t;
      typedef typename Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
        template PatchAllocator<Node_t,CountingSemaphore_t> PatchAllocator_t;
      CountingSemaphore_t csem;
      csem.height(sz);
      typename Layout_t::const_iterator p = layout().beginGlobal();
      for (int i = 0; i < sz; ++i, ++p)
 {
          PatchAllocator_t *spot = new PatchAllocator_t(newData[i], *p, csem);
          Pooma::addRunnable(spot);
        }
      csem.wait();
      data_m = newData;
    }
  else
    {
      if (DynamicEvents::isDynamic(event.event()))
        {
          dynamicHandler(observed, event,
            WrappedInt<PatchEngine_t::dynamic>());
 }
      else
 {
 }
    }
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
performCreate(CreateSize_t num, PatchID_t localPatchID, DynamicID_t did)
{
  ;
  ;
  int globalID = layout().nodeListLocal()[localPatchID]->globalID();
  if (! checkDynamicID(data()[globalID], did))
    return;
  data()[globalID].create(num);
}
template <int Dim, class T, class LayoutTag, class PatchTag>
template <class Dom, class DeleteMethod>
void Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
performDestroy(const Dom &killlist, PatchID_t localPatchID,
        const DeleteMethod &method, DynamicID_t did)
{
  ;
  int globalID = layout().nodeListLocal()[localPatchID]->globalID();
  if (! checkDynamicID(data()[globalID], did))
    return;
  data()[globalID].destroy(killlist, method, true);
}
template <int Dim, class T, class LayoutTag, class PatchTag>
template <class Dom>
void Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
performCopy(const Dom &copylist, PatchID_t frompatch, PatchID_t topatch,
     DynamicID_t did)
{
  ;
  ;
  ;
  int from_gID = layout().nodeListLocal()[frompatch]->globalID();
  int to_gID = layout().nodeListLocal()[topatch]->globalID();
  bool chk1 = checkDynamicID(data()[from_gID], did);
  bool chk2 = chk1;
  if (frompatch != topatch)
    chk2 = checkDynamicID(data()[to_gID], did);
  ;
  if (!chk1 || !chk2)
    return;
  ;
  int offs = data()[from_gID].domain()[0].first();
  int i = data()[to_gID].domain()[0].last() + 1;
  int num = copylist.size();
  data()[to_gID].create(num);
  for (int n = 0; n < num; ++n, ++i)
  {
    localPatchEngine(data()[to_gID])(i) =
      localPatchEngine(data()[from_gID])(copylist[0](n) + offs);
  }
}
template <int Dim, class T, class LayoutTag, class PatchTag>
void Engine<Dim, T, MultiPatch<LayoutTag, PatchTag> >::
performPatchCopy(const IndirectionList< IndirectionList<int> > &domlists,
   const IndirectionList< int > &fromlist,
   PatchID_t topatch,
   bool docreate,
   DynamicID_t did)
{
  ;
  ;
  int to_gID = layout().nodeListLocal()[topatch]->globalID();
  if (! checkDynamicID(data()[to_gID], did))
    return;
  int i, p, fill, created = 0;
  int np = domlists.size();
  ;
  for (p = 0; p < np; ++p)
    {
      int frompatch = fromlist(p);
      int from_gID = layout().nodeListLocal()[frompatch]->globalID();
      ;
      ;
      ;
      created += domlists(p).size();
    }
  if (docreate)
    {
      fill = data()[to_gID].domain()[0].last() + 1;
      data()[to_gID].create(created);
    }
  else
    {
      ;
      fill = data()[to_gID].domain()[0].last() + 1 - created;
    }
  for (p = 0; p < np; ++p)
    {
      int sz = domlists(p).size();
      int frompatch = fromlist(p);
      int from_gID = layout().nodeListLocal()[frompatch]->globalID();
      int offs = data()[from_gID].domain()[0].first();
      for (i = 0; i < sz; ++i, ++fill)
      {
 localPatchEngine(data()[to_gID])(fill) =
   localPatchEngine(data()[from_gID])(domlists(p)(i) + offs);
      }
    }
}
template<int Dim, class T, class LTag, class PatchTag>
long elementsCompressed(const Engine<Dim, T, MultiPatch<LTag, PatchTag> >
  &engine)
{
  int size = engine.layout().sizeLocal();
  bool distributed = true;
  if (size > 0 && engine.layout().beginLocal()->context() == -1)
    distributed = false;
  long num = 0L;
  for (int i = 0 ; i < size ; ++i )
    num += elementsCompressed(engine.localPatch(i));
  if (distributed)
    {
      ReduceOverContexts<long, OpAddAssign> total(num);
      total.broadcast(num);
    }
  return num;
}
template<int Dim, class T, class LTag, class PatchTag>
bool compressed(const Engine<Dim, T, MultiPatch<LTag, PatchTag> > &engine)
{
  int size = engine.layout().sizeLocal();
  bool distributed = true;
  if (size > 0 && engine.layout().beginLocal()->context() == -1)
    distributed = false;
  int com = 1;
  for (int i = 0 ; i < size ; ++i )
    com &= (compressed(engine.localPatch(i)) ? 1 : 0);
  if (distributed)
    {
      ReduceOverContexts<int, OpBitwiseAndAssign> total(com);
      total.broadcast(com);
    }
  return com ? true : false;
}
template<int Dim, class T, class LTag, class PatchTag, int Dim2>
long elementsCompressed(const
  Engine<Dim, T, MultiPatchView<LTag, PatchTag, Dim2> > &engine)
{
  typedef Engine<Dim, T, MultiPatchView<LTag, PatchTag, Dim2> > Engine_t;
  typedef typename Engine_t::Layout_t Layout_t;
  int size = engine.layout().sizeLocal();
  bool distributed = true;
  if (size > 0 && engine.layout().beginLocal()->context() == -1)
    distributed = false;
  typename Layout_t::const_iterator i = engine.layout().beginLocal();
  long num = 0L;
  while (i != engine.layout().endLocal())
    {
      num += elementsCompressed(engine.globalPatch(*i));
      ++i;
    }
  if (distributed)
    {
      ReduceOverContexts<long, OpAddAssign> total(num);
      total.broadcast(num);
    }
  return num;
}
template<int Dim, class T, class LTag, class PatchTag>
void compress(Engine<Dim, T, MultiPatch<LTag, PatchTag> > &engine)
{
  for (int i = 0; i < engine.layout().sizeLocal(); ++i)
    compress(engine.localPatch(i));
}
template<int Dim, class T, class LTag, class PatchTag>
void uncompress(Engine<Dim, T, MultiPatch<LTag, PatchTag> > &engine)
{
  for (int i = 0; i < engine.layout().sizeLocal(); ++i)
    uncompress(engine.localPatch(i));
}
template <int Dim> class GridLayoutData;
template <int Dim> class GridLayout;
template <int Dim, int Dim2> class GridLayoutViewData;
template <int Dim, int Dim2> class GridLayoutView;
struct GridTag { };
template <int Dim>
struct MultiPatchLayoutTraits<GridTag,Dim>
{
  typedef GridLayout<Dim> Layout_t;
  template <int ViewDim>
  struct View
  {
    typedef GridLayoutView<ViewDim,Dim> Layout_t;
  };
};
template<int Dim>
class GridLayoutData
  : public LayoutBaseData<Dim>,
    public RefCounted,
    public Observable< GridLayoutData<Dim> >
{
public:
  typedef GridLayoutData<Dim> This_t;
  typedef Observable<This_t> Observable_t;
  typedef Interval<Dim> Domain_t;
  typedef Interval<Dim> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef Node<Domain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef int AxisIndex_t;
  typedef typename DynamicEvents::PatchID_t PatchID_t;
  typedef typename DynamicEvents::CreateSize_t CreateSize_t;
  typedef typename LayoutBaseData<Dim>::GCFillInfo_t GCFillInfo_t;
  typedef typename std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  enum { dimensions = Dim };
  enum { repartitionEvent = 1 };
  enum { dynamic = false };
  GridLayoutData();
  template <class Partitioner>
  GridLayoutData(const Domain_t &gdom,
   const Partitioner &gpar,
   const ContextMapper<Dim> & cmap);
  template <class Partitioner>
  GridLayoutData(const Grid<Dim> &gdom,
   const Partitioner &gpar,
                 const ContextMapper<Dim> &cmap);
  ~GridLayoutData();
  template <class Partitioner>
  void initialize(const Domain_t &gdom,
    const Partitioner &gpar,
    const ContextMapper<Dim> &cmap);
  template <class Partitioner>
  inline void initialize(const Grid<Dim> &gdom,
    const Partitioner &gpar,
                         const ContextMapper<Dim> &cmap);
  void initialize(const Domain_t& idom,
    const List_t& nodes,
    const Loc<Dim>& blocks,
    bool hasIG, bool hasEG,
    const GuardLayers_t& ig,
    const GuardLayers_t& eg);
  inline const Loc<Dim> &blocks() const
    {
      return this->blocks_m;
    }
  inline bool dirty() const
    {
      return dirtyLayout_m;
    }
  int globalID(const Loc<Dim> &loc) const;
  int globalID(int) const;
  int globalID(int,int) const;
  int globalID(int,int,int) const;
  int globalID(int,int,int,int) const;
  int globalID(int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int) const;
  int globalID(int,int,int,int,int,int,int) const;
  FillIterator_t beginFillList() const
    {
      return this->gcFillList_m.begin();
    }
  FillIterator_t endFillList() const
    {
      return this->gcFillList_m.end();
    }
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touches(const OtherDomain &fulld, OutIter o,
       const ConstructTag &ctag) const;
  template <class OtherDomain, class OutIter, class ConstructTag>
  int touchesAlloc(const OtherDomain &fulld, OutIter o,
     const ConstructTag &ctag) const;
  void sync();
  template<class Out>
  void print(Out & ostr);
private:
  void calcGCFillList();
  void calcDomains();
  void calcMaps() const;
  void calcAllocMaps() const;
  inline int blockIndex(const Loc<Dim> &loc) const
    {
      int pos = loc[0].first();
      for (int i=1; i < Dim; ++i)
 pos += loc[i].first() * blockStrides_m[i];
      return pos;
    }
  bool dirtyLayout_m;
  int blockStrides_m[Dim];
  mutable DomainMap<Interval<1>,AxisIndex_t> map_m[Dim];
  mutable DomainMap<Interval<1>,AxisIndex_t> mapAloc_m[Dim];
};
template <int Dim>
class GridLayout : public LayoutBase<Dim,GridLayoutData<Dim> >,
                   public Observable<GridLayout<Dim> >,
                   public Observer<GridLayoutData<Dim> >
{
public:
  typedef GridLayout<Dim> This_t;
  typedef Observable<This_t> Observable_t;
  typedef GridLayoutData<Dim> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef DynamicEvents::PatchID_t PatchID_t;
  typedef DynamicEvents::CreateSize_t CreateSize_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  typedef typename LayoutData_t::GCFillInfo_t GCFillInfo_t;
  typedef typename
    std::vector<GCFillInfo_t>::const_iterator FillIterator_t;
  enum { dimensions = Dim };
  enum { repartitionEvent = 1 };
  enum { dynamic = true };
  GridLayout();
  GridLayout(const Domain_t &,const DistributedTag &);
  GridLayout(const Domain_t &,const ReplicatedTag &);
  GridLayout(const Domain_t &,
             const GuardLayers_t &,const DistributedTag &);
  GridLayout(const Domain_t &,
             const GuardLayers_t &,const ReplicatedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,const DistributedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,
      const GuardLayers_t &,const DistributedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,
      const GuardLayers_t &,
      const GuardLayers_t &,const DistributedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,const ReplicatedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,
      const GuardLayers_t &,const ReplicatedTag &);
  GridLayout(const Domain_t &,
      const Loc<Dim> &,
      const GuardLayers_t &,
      const GuardLayers_t &,const ReplicatedTag &);
  GridLayout(const Grid<Dim> &,
      const DistributedTag &);
  GridLayout(const Grid<Dim> &,
      const GuardLayers_t &,
      const DistributedTag &);
  GridLayout(const Grid<Dim> &,
      const GuardLayers_t &,
      const GuardLayers_t &,
      const DistributedTag &);
  GridLayout(const Grid<Dim> &,
      const ReplicatedTag &);
  GridLayout(const Grid<Dim> &,
      const GuardLayers_t &,
      const ReplicatedTag &);
  GridLayout(const Grid<Dim> &,
      const GuardLayers_t &,
      const GuardLayers_t &,
      const ReplicatedTag &);
  template <class Partitioner>
  GridLayout(const Domain_t &,
      const Partitioner &,
      const DistributedTag &);
  template <class Partitioner>
  GridLayout(const Domain_t &,
      const Partitioner &,
      const ReplicatedTag &);
  template <class Partitioner>
  GridLayout(const Domain_t &,
      const Partitioner &,
      const ContextMapper<Dim> &);
  GridLayout(const This_t &);
  This_t &operator=(const This_t &);
  inline ~GridLayout()
    {
      this->pdata_m->detach(*this);
    }
  void initialize(const Domain_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Grid<Dim> &,
    const DistributedTag &);
  void initialize(const Grid<Dim> &,
    const GuardLayers_t &,
    const DistributedTag &);
  void initialize(const Grid<Dim> &,
    const GuardLayers_t &,
    const GuardLayers_t &,
    const DistributedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const DistributedTag &);
  void initialize(const Domain_t &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  void initialize(const Domain_t &,
    const Loc<Dim> &,
    const GuardLayers_t &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  void initialize(const Grid<Dim> &,
    const ReplicatedTag &);
  void initialize(const Grid<Dim> &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  void initialize(const Grid<Dim> &,
    const GuardLayers_t &,
    const GuardLayers_t &,
    const ReplicatedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const ReplicatedTag &);
  template <class Partitioner>
  void initialize(const Domain_t &,
    const Partitioner &,
    const ContextMapper<Dim> &);
  void initialize(const Domain_t& idom,
    const List_t& nodes,
    const Loc<Dim>& blocks,
    bool hasIG, bool hasEG,
    const GuardLayers_t& ig,
    const GuardLayers_t& eg);
  inline const Loc<Dim> &blocks() const
    {
      return this->pdata_m->blocks();
    }
  template <class Partitioner>
  inline bool repartition(const Partitioner &gp,const ContextMapper<Dim> &cm)
    {
      this->pdata_m->initialize(this->domain(),gp,cm);
      this->pdata_m->notify(repartitionEvent);
      return true;
    }
  inline void sync()
    {
      this->pdata_m->sync();
    }
  virtual void notify(LayoutData_t &d, const ObserverEvent &event)
    {
      ;
      Observable_t::notify(event);
    }
  template <class Ostream>
  void print(Ostream &ostr) const;
  template <int Dim1, int Dim2>
  friend class GridLayoutView;
  friend class GridLayoutData<Dim>;
};
template <int Dim, int Dim2>
class GridLayoutViewData :
                public LayoutBaseViewData<Dim, Dim2, GridLayout<Dim2> >,
                public RefCounted
{
public:
  typedef GridLayout<Dim2> Layout_t;
  typedef GridLayoutView<Dim, Dim2> ViewLayout_t;
  typedef Interval<Dim> Domain_t;
  typedef Range<Dim2> BaseDomain_t;
  typedef int Context_t;
  typedef Unique::Value_t ID_t;
  typedef typename Layout_t::Domain_t AllocatedDomain_t;
  typedef ViewIndexer<Dim,Dim2> Indexer_t;
  typedef Node<Domain_t,AllocatedDomain_t> Value_t;
  typedef std::vector<Value_t *> List_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef GridLayoutViewData<Dim,Dim2> LayoutData_t;
  enum { dim = Dim };
  enum { dim2 = Dim2 };
  GridLayoutViewData() { }
  template <class DT>
  inline GridLayoutViewData(const Layout_t &layout, const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,GridLayout<Dim2> >(layout,dom)
  {
  }
  template <class DT>
  inline GridLayoutViewData(const Layout_t &layout,
                            const SliceDomain<DT> &dom)
  :LayoutBaseViewData<Dim,Dim2,GridLayout<Dim2> >(layout,dom)
  {
  }
  template <class DT>
  GridLayoutViewData(const ViewLayout_t &layout,
                     const Domain<Dim, DT> &dom)
  : LayoutBaseViewData<Dim,Dim2,GridLayout<Dim2> >(
           layout.pdata_m->layout_m,
           layout,
           layout.pdata_m->indexer_m,
           dom,
           layout.internalGuards(),
           layout.externalGuards())
  {
  }
  template <int OrigDim, class DT>
  GridLayoutViewData(const GridLayoutView<OrigDim, Dim2> &layout,
                     const SliceDomain<DT> &dom)
    : LayoutBaseViewData<Dim,Dim2,GridLayout<Dim2> >(
        layout.pdata_m->layout_m,
        layout,
        Indexer_t(layout.pdata_m->indexer_m,dom),
        dom)
  {
  }
  ~GridLayoutViewData()
  {
    typename List_t::iterator a;
    for (a = this->all_m.begin(); a != this->all_m.end(); ++a)
      delete (*a);
  }
};
template <int Dim, int Dim2>
class GridLayoutView
: public LayoutBaseView<Dim, Dim2, GridLayoutViewData<Dim,Dim2> >
{
public:
  enum { dimensions = Dim };
  enum { dim = Dim };
  enum { dim2 = Dim2 };
  typedef GridLayoutViewData<Dim, Dim2> LayoutData_t;
  typedef typename LayoutData_t::Domain_t Domain_t;
  typedef typename LayoutData_t::BaseDomain_t BaseDomain_t;
  typedef typename LayoutData_t::Context_t Context_t;
  typedef typename LayoutData_t::ID_t ID_t;
  typedef typename LayoutData_t::Layout_t Layout_t;
  typedef typename LayoutData_t::AllocatedDomain_t AllocatedDomain_t;
  typedef typename LayoutData_t::Value_t Value_t;
  typedef typename LayoutData_t::List_t List_t;
  typedef typename LayoutData_t::Indexer_t Indexer_t;
  typedef typename LayoutData_t::GuardLayers_t GuardLayers_t;
  typedef GridLayoutView<Dim, Dim2> This_t;
  typedef GridLayoutView<Dim, Dim2> ViewLayout_t;
  typedef LayoutBaseView<Dim, Dim2, LayoutData_t> Base_t;
  typedef DerefIterator<Value_t> iterator;
  typedef ConstDerefIterator<Value_t> const_iterator;
  GridLayoutView()
    : Base_t(new LayoutData_t())
  { }
  template <class DT>
  GridLayoutView(const Layout_t &layout, const Domain<Dim2, DT> &dom)
    : LayoutBaseView<Dim,Dim2,GridLayoutViewData<Dim,Dim2> >
  (new GridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  GridLayoutView(const Layout_t &layout, const SliceDomain<DT> &dom)
    : LayoutBaseView<Dim,Dim2,GridLayoutViewData<Dim,Dim2> >
  (new GridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <class DT>
  GridLayoutView(const ViewLayout_t &layout, const Domain<Dim, DT> &dom)
 : LayoutBaseView<Dim,Dim2,GridLayoutViewData<Dim,Dim2> >
  (new GridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  template <int OldViewDim, class DT>
  GridLayoutView(const GridLayoutView<OldViewDim, Dim2> &layout,
                        const SliceDomain<DT> &dom)
  : LayoutBaseView<Dim,Dim2,GridLayoutViewData<Dim,Dim2> >
  (new GridLayoutViewData<Dim,Dim2>(layout,dom))
  { }
  inline GridLayoutView(const This_t &model)
    : LayoutBaseView<Dim,Dim2,GridLayoutViewData<Dim,Dim2> >(model.pdata_m)
  { }
  inline This_t &operator=(const This_t &model)
  {
    if (this != &model)
      {
        this->pdata_m = model.pdata_m;
      }
    return *this;
  }
  inline ~GridLayoutView()
  { }
  template <class Ostream>
  void print(Ostream &ostr) const;
  template <int OtherDim, int OtherDim2>
  friend class GridLayoutView;
  template <int OtherDim, int OtherDim2>
  friend class GridLayoutViewData;
  void computeSubdomains() const { this->pdata_m->computeSubdomains(); }
};
template <int Dim>
struct NewDomain1<GridLayout<Dim> >
{
  typedef GridLayout<Dim> &Type_t;
  inline static Type_t combine(const GridLayout<Dim> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim, int Dim2>
struct NewDomain1<GridLayoutView<Dim, Dim2> >
{
  typedef GridLayoutView<Dim, Dim2> &Type_t;
  inline static Type_t combine(const GridLayoutView<Dim, Dim2> &a)
    {
      return const_cast<Type_t>(a);
    }
};
template <int Dim>
std::ostream &operator<<(std::ostream &ostr,
    const GridLayout<Dim> &layout)
{
  layout.print(ostr);
  return ostr;
}
template <int Dim, int Dim2>
std::ostream &operator<<(std::ostream &ostr,
    const GridLayoutView<Dim, Dim2> &layout)
{
  layout.print(ostr);
  return ostr;
}
template<int Dim>
GridLayoutData<Dim>::GridLayoutData()
 : LayoutBaseData<Dim>(false,false,
     GuardLayers_t(0),GuardLayers_t(0),
     Interval<Dim>(),Interval<Dim>()),
    Observable<GridLayoutData>(*this)
{
  for (int d=0; d < Dim; ++d)
    this->firsti_m[d] = this->firste_m[d] = blockStrides_m[d] = 0;
}
template<int Dim>
template<class Partitioner>
GridLayoutData<Dim>::GridLayoutData(const Grid<Dim> &gdom,
        const Partitioner &gpar,
        const ContextMapper<Dim> &cmap)
  : LayoutBaseData<Dim>(false,false,
   GuardLayers_t(0),GuardLayers_t(0),
   Interval<Dim>(), Interval<Dim>()),
    Observable<GridLayoutData>(*this)
{
  initialize(gdom, gpar, cmap);
}
template<int Dim>
template<class Partitioner>
GridLayoutData<Dim>::GridLayoutData(const Domain_t &gdom,
        const Partitioner &gpar,
        const ContextMapper<Dim> &cmap)
  : LayoutBaseData<Dim>(false,false,
   GuardLayers_t(0),GuardLayers_t(0),
   gdom,gdom),
    Observable<GridLayoutData>(*this)
{
  for (int d=0; d < Dim; ++d)
    this->firsti_m[d] = this->firste_m[d] = blockStrides_m[d] = 0;
  initialize(gdom, gpar, cmap);
}
template<int Dim>
GridLayoutData<Dim>::~GridLayoutData()
{
  for (typename List_t::iterator a = this->all_m.begin(); a != this->all_m.end(); ++a)
    delete (*a);
}
template<int Dim>
template <class Partitioner>
inline void GridLayoutData<Dim>::initialize(const Grid<Dim> &gdom,
         const Partitioner &gpar,
         const ContextMapper<Dim> &cmap)
{
  Domain_t idom = Pooma::NoInit();
  for (int d=0; d < Dim; ++d)
    idom[d] = Interval<1>(gdom[d].first(), gdom[d].last() - 1);
  initialize(idom, gpar, cmap);
}
template<int Dim>
template<class Partitioner>
inline void GridLayoutData<Dim>::initialize(const Domain_t &gdom,
         const Partitioner &gpar,
         const ContextMapper<Dim> &cmap)
{
  int i;
  PoomaCTAssert<(Partitioner::gridded)>::test();
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  dirtyLayout_m = true;
  this->domain_m = gdom;
  this->innerdomain_m = gdom;
  this->hasInternalGuards_m = (gpar.hasInternalGuards() && gpar.maxSize() > 1);
  if (this->hasInternalGuards_m)
    {
      this->internalGuards_m = gpar.internalGuards();
    }
  this->hasExternalGuards_m = (gpar.hasExternalGuards() && ! this->domain_m.empty());
  if (this->hasExternalGuards_m)
    {
      this->externalGuards_m = gpar.externalGuards();
      GuardLayers<Dim>::addGuardLayers(this->domain_m, this->externalGuards_m);
    }
  this->blocks_m = gpar.blocks();
  for (i=0; i < Dim; ++i)
    {
      if (!this->domain_m[i].empty())
 this->firsti_m[i] = this->domain_m[i].first();
      blockStrides_m[i] = (i == 0 ? 1 :
      blockStrides_m[i-1] * this->blocks_m[i-1].first());
    }
  gpar.partition(this->innerdomain_m, this->all_m, cmap);
  typename List_t::iterator start = this->all_m.begin();
  typename List_t::iterator end = this->all_m.end();
  for ( ; start!=end ;++start )
    {
      if( (*start)->context() == Pooma::context()
   ||(*start)->context() == -1 )
 this->local_m.push_back(*start);
      else
 this->remote_m.push_back(*start);
    }
  calcMaps();
  calcAllocMaps();
  calcGCFillList();
}
template<int Dim>
void GridLayoutData<Dim>::initialize(const Domain_t& idom,
     const List_t& nodes,
     const Loc<Dim>& blocks,
     bool hasIG, bool hasEG,
     const GuardLayers_t& ig,
     const GuardLayers_t& eg)
{
  int i;
  if (this->all_m.size() > 0)
    {
      for (i=0; i < this->all_m.size(); ++i)
 delete this->all_m[i];
      this->all_m.clear();
      this->local_m.clear();
      this->remote_m.clear();
    }
  dirtyLayout_m = true;
  this->domain_m = idom;
  this->innerdomain_m = idom;
  this->hasInternalGuards_m = hasIG;
  if (this->hasInternalGuards_m)
    {
      this->internalGuards_m = ig;
    }
  this->hasExternalGuards_m = (hasEG && ! this->domain_m.empty());
  if (this->hasExternalGuards_m)
    {
      this->externalGuards_m = eg;
      GuardLayers<Dim>::addGuardLayers(this->domain_m, this->externalGuards_m);
    }
  this->blocks_m = blocks;
  for (i=0; i < Dim; ++i)
    {
      if (!this->domain_m[i].empty())
 this->firsti_m[i] = this->domain_m[i].first();
      blockStrides_m[i] = (i == 0 ? 1 :
      blockStrides_m[i-1] * this->blocks_m[i-1].first());
    }
  this->all_m= nodes;
  typename List_t::iterator start = this->all_m.begin();
  typename List_t::iterator end = this->all_m.end();
  for ( ; start!=end ;++start )
    {
      if( (*start)->context() == Pooma::context() ||
   (*start)->context() == -1 )
 this->local_m.push_back(*start);
      else
 this->remote_m.push_back(*start);
    }
  calcMaps();
  calcAllocMaps();
  calcGCFillList();
}
template<int Dim>
void GridLayoutData<Dim>::sync()
{
  ;
  if (!this->initialized() || !dirty())
    return;
  calcDomains();
  calcMaps();
  this->notify(SyncEvent());
}
template<int Dim>
void GridLayoutData<Dim>::calcGCFillList()
{
  int d;
  if (!this->initialized() || !this->hasInternalGuards_m)
    return;
  this->gcFillList_m.clear();
  int numPatches = this->all_m.size();
  this->gcFillList_m.reserve(2*Dim*this->local_m.size());
  ;
  Interval<Dim> grid;
  for (d=0; d < Dim; ++d)
    grid[d] = Interval<1>(this->blocks_m[d].first() + 1);
  for (d=0; d < Dim; ++d)
    {
      if (this->internalGuards_m.lower(d) > 0)
 {
   typename Interval<Dim>::blockIterator start = grid.beginBlock();
   typename Interval<Dim>::blockIterator end = grid.endBlock();
   for (; start != end; ++start)
     {
       int sourceID = start.index();
       Loc<Dim> tmp = start.point();
       tmp[d] += 1;
       if (!(tmp[d] >= this->blocks_m[d] || tmp[d].first() < 0))
  {
    int destID = blockIndex(tmp);
    if (!(this->all_m[sourceID]->domain().empty() ||
   this->all_m[destID]->domain().empty()))
      {
        ;
        Domain_t gcdom(this->all_m[sourceID]->allocated());
        int max = this->all_m[sourceID]->domain()[d].last();
        int min = max - this->internalGuards_m.lower(d) + 1;
        gcdom[d] = Interval<1>(min, max);
        this->gcFillList_m.push_back(GCFillInfo_t(gcdom, sourceID, destID, d*2));
      }
  }
     }
 }
      if (this->internalGuards_m.upper(d) > 0)
 {
   typename Interval<Dim>::blockIterator start = grid.beginBlock();
   typename Interval<Dim>::blockIterator end = grid.endBlock();
   for (; start != end; ++start)
     {
       int sourceID = start.index();
       Loc<Dim> tmp = start.point();
       tmp[d] -= 1;
       if (!(tmp[d] >= this->blocks_m[d] || tmp[d].first() < 0))
  {
    int destID = blockIndex(tmp);
    if (!(this->all_m[sourceID]->domain().empty() ||
   this->all_m[destID]->domain().empty()))
      {
        ;
        Domain_t gcdom(this->all_m[sourceID]->allocated());
        int min = this->all_m[sourceID]->domain()[d].first();
        int max = min + this->internalGuards_m.upper(d) - 1;
        gcdom[d] = Interval<1>(min, max);
        this->gcFillList_m.push_back(GCFillInfo_t(gcdom, sourceID, destID, d*2+1));
      }
  }
     }
 }
    }
}
template<int Dim>
void GridLayoutData<Dim>::calcDomains()
{
  if (!this->initialized() || !dirty())
    return;
  ;
  ;
  CreateSize_t sizes = this->firsti_m[0];
  bool allempty = true;
  for (int i=0; i < this->all_m.size(); ++i)
    {
      Domain_t dom = this->all_m[i]->domain();
      if (!dom[0].empty())
 {
   dom[0] = Interval<1>(sizes, sizes + dom[0].length() - 1);
   sizes += dom[0].length();
   allempty = false;
 }
      this->all_m[i]->setDomain(dom);
      this->all_m[i]->setAllocated(dom);
    }
  if (allempty)
    this->domain_m = Domain_t();
  else
    this->domain_m = Interval<1>(this->firsti_m[0], sizes - 1);
  this->innerdomain_m = this->domain_m;
  dirtyLayout_m = false;
}
template<int Dim>
void GridLayoutData<Dim>::calcMaps() const
{
  int i, j;
  if (!this->initialized() || !dirty())
    return;
  for (i=0; i < Dim; ++i)
    {
      map_m[i].zap();
      if (this->domain_m[i].empty())
 continue;
      Loc<Dim> blockLoc(0);
      map_m[i].initialize(Interval<1>(this->domain_m[i].first() -
          this->externalGuards_m.lower(i),
          this->domain_m[i].last() +
          this->externalGuards_m.upper(i)));
      int b = this->blocks_m[i].first();
      for (j=0; j < b; ++j)
 {
   blockLoc[i] = Loc<1>(j);
   int k = blockIndex(blockLoc);
   Interval<1> blockDom = this->all_m[k]->domain()[i];
   if (!blockDom.empty())
     {
       int lo = (j == 0 ? this->externalGuards_m.lower(i) : 0);
       int hi = (j == (b - 1) ? this->externalGuards_m.upper(i) : 0);
       Interval<1> mval(blockDom.first() - lo, blockDom.last() + hi);
       typename DomainMap<Interval<1>,int>::Value_t val(mval, j);
       map_m[i].insert(val);
     }
 }
      map_m[i].update();
    }
}
template<int Dim>
void GridLayoutData<Dim>::calcAllocMaps() const
{
  int i, j;
  if (!this->initialized() || !dirty())
    return;
  for (i=0; i < Dim; ++i)
    {
      mapAloc_m[i].zap();
      if (this->domain_m[i].empty())
 continue;
      Loc<Dim> blockLoc(0);
      mapAloc_m[i].initialize(Interval<1>(this->domain_m[i].first() -
       this->externalGuards_m.lower(i),
       this->domain_m[i].last() +
       this->externalGuards_m.upper(i)));
      int b = this->blocks_m[i].first();
      for (j=0; j < b; ++j)
 {
   blockLoc[i] = Loc<1>(j);
   int k = blockIndex(blockLoc);
   Interval<1> blockDom = this->all_m[k]->domain()[i];
   if (!blockDom.empty())
     {
       int lo = (j==0 ?
   this->externalGuards_m.lower(i) :
   this->internalGuards_m.lower(i));
       int hi = (j == (b - 1) ?
   this->externalGuards_m.upper(i) :
   this->internalGuards_m.upper(i));
       Interval<1> ival(blockDom.first() - lo, blockDom.last() + hi);
       typename DomainMap<Interval<1>,int>::Value_t valAl(ival, j);
       mapAloc_m[i].insert(valAl);
     }
 }
      mapAloc_m[i].update();
    }
}
template<int Dim>
int GridLayoutData<Dim>::globalID(const Loc<Dim> &loc) const
{
  ;
  Loc<Dim> point;
  for (int i=0; i < Dim; ++i)
    {
      DomainMapTouchIterator<Interval<1>,int> dmti =
 (map_m[i].touch(Interval<1>(loc[i]))).first;
      DomainMapTouchIterator<Interval<1>,int> baditerator;
      ;
     point[i] = *dmti;
    }
  return blockIndex(point);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1, int i2) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4, int i5) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  loc[5] = i5;
  return globalID(loc);
}
template <int Dim>
int GridLayoutData<Dim>::globalID(int i0, int i1, int i2, int i3,
      int i4, int i5, int i6) const
{
  ;
  Loc<Dim> loc;
  loc[0] = i0;
  loc[1] = i1;
  loc[2] = i2;
  loc[3] = i3;
  loc[4] = i4;
  loc[5] = i5;
  loc[6] = i6;
  return globalID(loc);
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int GridLayoutData<Dim>::touches(const OtherDomain &fulld, OutIter o,
     const ConstructTag &ctag) const
{
  int i;
  ;
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t d = intersect(this->domain_m, fulld);
  if (d.empty())
    return 0;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  int hiAxisIndex[Dim];
  int loAxisIndex[Dim];
  Loc<Dim> curnode;
  for (i=0;i < Dim; ++i)
    {
      loAxisIndex[i] =
 *((map_m[i].touch(Interval<1>(d[i].first(),d[i].first()))).first);
      ;
      hiAxisIndex[i] =
 *((map_m[i].touch(Interval<1>(d[i].last(),d[i].last() ))).first);
      ;
      if(loAxisIndex[i]>hiAxisIndex[i])
 {
   int tmp = hiAxisIndex[i];
   hiAxisIndex[i] = loAxisIndex[i];
   loAxisIndex[i] = tmp;
 }
      curnode[i] = loAxisIndex[i];
    }
  int count=0;
  while(1)
    {
      int nodeListIndex = blockIndex(curnode);
      if (!this->all_m[nodeListIndex]->domain().empty())
 {
   outDomain = intersect(fulld,this->all_m[nodeListIndex]->domain());
   ;
   *o = touchesConstruct(outDomain,
    this->all_m[nodeListIndex]->allocated(),
    this->all_m[nodeListIndex]->affinity(),
    this->all_m[nodeListIndex]->context(),
    this->all_m[nodeListIndex]->globalID(),
    this->all_m[nodeListIndex]->localID(),
    ctag);
   ++count;
 }
      curnode[0] += 1;
      for (i=0; i < Dim; ++i)
 {
   if (curnode[i] == (hiAxisIndex[i]+1))
     {
       if (i==(Dim-1))
  break;
       curnode[i] = loAxisIndex[i];
       curnode[i+1] += 1;
     }
 }
      if (curnode[Dim-1] == (hiAxisIndex[Dim-1]+1))
 break;
    }
  return count;
}
template <int Dim>
template <class OtherDomain, class OutIter, class ConstructTag>
int GridLayoutData<Dim>::touchesAlloc(const OtherDomain &fulld, OutIter o,
          const ConstructTag &ctag) const
{
  int i;
  ;
  typedef typename
    IntersectReturnType<Domain_t,OtherDomain>::Type_t OutDomain_t;
  OutDomain_t d = intersect(this->domain_m, fulld);
  if (d.empty())
    return 0;
  OutDomain_t outDomain = Pooma::NoInit();
  typedef Node<OutDomain_t,Domain_t> OutNode_t;
  int hiAxisIndex[Dim];
  int loAxisIndex[Dim];
  Loc<Dim> curnode;
  for (i=0; i < Dim; ++i)
    {
      loAxisIndex[i] =
 *((mapAloc_m[i].touch(Interval<1>(d[i].first(),d[i].first()))).first);
      ;
      hiAxisIndex[i] =
 *((mapAloc_m[i].touch(Interval<1>(d[i].last(),d[i].last()))).first);
      ;
      if(loAxisIndex[i]>hiAxisIndex[i])
 {
   int tmp = hiAxisIndex[i];
   hiAxisIndex[i] = loAxisIndex[i];
   loAxisIndex[i] = tmp;
 }
      curnode[i] = loAxisIndex[i];
    }
  int count=0;
  while(1)
    {
      int nodeListIndex = blockIndex(curnode);
      if (!this->all_m[nodeListIndex]->domain().empty())
 {
   outDomain = intersect(fulld,this->all_m[nodeListIndex]->allocated());
   ;
   *o = touchesConstruct(outDomain,
    this->all_m[nodeListIndex]->allocated(),
    this->all_m[nodeListIndex]->affinity(),
    this->all_m[nodeListIndex]->context(),
    this->all_m[nodeListIndex]->globalID(),
    this->all_m[nodeListIndex]->localID(),
    ctag);
   ++count;
 }
      curnode[0] += 1;
      for (i=0; i < Dim; ++i)
 {
   if (curnode[i] == (hiAxisIndex[i]+1))
     {
       if (i == (Dim-1))
  break;
       curnode[i] = loAxisIndex[i];
       curnode[i+1] += 1;
     }
 }
      if (curnode[Dim-1] == (hiAxisIndex[Dim-1]+1))
 break;
    }
  return count;
}
template<int Dim>
template<class Out>
void GridLayoutData<Dim>::print(Out & ostr)
{
  int i;
  ostr << " hasInternalGuards_m, hasExternalGuards_m "
       << this->hasInternalGuards_m << ' ' << this->hasExternalGuards_m
       << "\n internalGuards_m ";
  for (i=0; i<Dim; ++i)
    ostr << this->internalGuards_m.upper(i) << '-'
  << this->internalGuards_m.lower(i) << ' ';
  ostr << "\n externalGuards_m ";
  for (i=0; i<Dim; ++i)
    ostr << this->externalGuards_m.upper(i) << '-'
  << this->externalGuards_m.lower(i) << ' ';
  ostr << '\n';
  FillIterator_t gstart = this->gcFillList_m.begin();
  FillIterator_t gend = this->gcFillList_m.end();
  ostr << " this->gcFillList_m\n";
  for(; gstart!=gend; ++gstart)
    ostr << "       "
  << gstart->domain_m << ' '
  << gstart->ownedID_m << ' '
  << gstart->guardID_m << '\n';
  ostr << std::flush;
}
template <int Dim>
GridLayout<Dim>::GridLayout()
  : LayoutBase<Dim,GridLayoutData<Dim> >(new LayoutData_t()),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,const DistributedTag & )
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(gdom,
    GridPartition<Dim>(Loc<Dim>(1)),
    DistributedMapper<Dim>(GridPartition<Dim>(Loc<Dim>(1))))),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(gdom,
    GridPartition<Dim>(Loc<Dim>(1)),
    LocalMapper<Dim>())),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const GuardLayers_t &gcs,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(gdom,
    GridPartition<Dim>(Loc<Dim>(1),gcs),
    DistributedMapper<Dim>(
    GridPartition<Dim>(Loc<Dim>(1),gcs)))),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const GuardLayers_t &gcs,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(gdom,
    GridPartition<Dim>(Loc<Dim>(1),gcs),
    LocalMapper<Dim>())),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m =
      new LayoutData_t( gdom,
   GridPartition<Dim>(makeRGrid(gdom,blocks)),
        DistributedMapper<Dim>(GridPartition<Dim>(makeRGrid(gdom,blocks)))
   );
  else
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(blocks),
 DistributedMapper<Dim>(GridPartition<Dim>(blocks))
    );
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(makeRGrid(gdom,blocks)),
    LocalMapper<Dim>());
  else
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(blocks),
    LocalMapper<Dim>());
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const GuardLayers_t &gcs,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(makeRGrid(gdom,blocks),gcs),
       DistributedMapper<Dim>(GridPartition<Dim>(makeRGrid(gdom,blocks),gcs)));
  else
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(blocks,gcs),
       DistributedMapper<Dim>(GridPartition<Dim>(blocks,gcs)));
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const GuardLayers_t &gcs,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m = new LayoutData_t(gdom,
          GridPartition<Dim>(makeRGrid(gdom,blocks),gcs),
          LocalMapper<Dim>());
  else
    this->pdata_m = new LayoutData_t(gdom,
          GridPartition<Dim>(blocks,gcs),
          LocalMapper<Dim>());
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const GuardLayers_t &igcs,
       const GuardLayers_t &egcs,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m = new LayoutData_t( gdom,
      GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs),
      DistributedMapper<Dim>(
       GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs)));
  else
    this->pdata_m = new LayoutData_t( gdom,
      GridPartition<Dim>(blocks,igcs,egcs),
      DistributedMapper<Dim>(GridPartition<Dim>(blocks,igcs,egcs)));
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Loc<Dim> &blocks,
       const GuardLayers_t &igcs,
       const GuardLayers_t &egcs,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >((LayoutData_t*) 0),
    Observable<This_t>(*this)
{
  if (!gdom.empty())
    this->pdata_m = new LayoutData_t(
     gdom,
     GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs),
     LocalMapper<Dim>() );
  else
    this->pdata_m = new LayoutData_t( gdom,
    GridPartition<Dim>(blocks,igcs,egcs),
    LocalMapper<Dim>() );
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >(
      new LayoutData_t( grid,
   GridPartition<Dim>(grid),
   DistributedMapper<Dim>(GridPartition<Dim>(grid)))),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >(
      new LayoutData_t( grid,
   GridPartition<Dim>(grid),
   LocalMapper<Dim>())),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const GuardLayers_t &gcs,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
( new LayoutData_t( grid,
      GridPartition<Dim>(grid,gcs),
      DistributedMapper<Dim>(GridPartition<Dim>(grid,gcs) )) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const GuardLayers_t &gcs,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
( new LayoutData_t( grid,
      GridPartition<Dim>(grid,gcs),
      LocalMapper<Dim>()) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const GuardLayers_t &igcs,
       const GuardLayers_t &egcs,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(grid,
    GridPartition<Dim>(grid,igcs,egcs),
    DistributedMapper<Dim>(GridPartition<Dim>(grid,igcs,egcs)))),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const Grid<Dim> &grid,
       const GuardLayers_t &igcs,
       const GuardLayers_t &egcs,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t( grid,
     GridPartition<Dim>(grid,igcs,egcs),
     LocalMapper<Dim>() ) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Partitioner &gpar,
       const DistributedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
(new LayoutData_t(gdom,
    gpar,
    DistributedMapper<Dim>(gpar)) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Partitioner &gpar,
       const ReplicatedTag &)
  : LayoutBase<Dim,GridLayoutData<Dim> >
      (new LayoutData_t(gdom,
            gpar,
   LocalMapper<Dim>()) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
template <class Partitioner>
GridLayout<Dim>::GridLayout(const Domain_t &gdom,
       const Partitioner &gpar,
       const ContextMapper<Dim> &cmap)
  : LayoutBase<Dim,GridLayoutData<Dim> >(new LayoutData_t(gdom, gpar, cmap) ),
    Observable<This_t>(*this)
{
  this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim>::GridLayout(const This_t &model)
  : LayoutBase<Dim,GridLayoutData<Dim> >(model.pdata_m),
    Observable<This_t>(*this)
{
   this->pdata_m->attach(*this);
}
template <int Dim>
GridLayout<Dim> &GridLayout<Dim>::operator=(const This_t &model)
{
  if (this != &model)
    {
      this->pdata_m->detach(*this);
      this->pdata_m = model.pdata_m;
      this->pdata_m->attach(*this);
    }
  return *this;
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const DistributedTag &)
{
  this->pdata_m->initialize( gdom,
         GridPartition<Dim>(),
         DistributedMapper<Dim>(GridPartition<Dim>()) );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const GuardLayers_t &gcs,
     const DistributedTag &)
{
  this->pdata_m->initialize( gdom,
         GridPartition<Dim>(gcs),
         DistributedMapper<Dim>(GridPartition<Dim>(gcs)) );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const DistributedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize(
    gdom,
    GridPartition<Dim>(makeRGrid(gdom,blocks)),
    DistributedMapper<Dim>(GridPartition<Dim>(makeRGrid(gdom,blocks))));
  else
    this->pdata_m->initialize( gdom,
    GridPartition<Dim>(blocks),
    DistributedMapper<Dim>(GridPartition<Dim>(blocks)) );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const GuardLayers_t &gcs,
     const DistributedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize(
       gdom,
       GridPartition<Dim>(makeRGrid(gdom,blocks),gcs),
       DistributedMapper<Dim>(
                GridPartition<Dim>(makeRGrid(gdom,blocks),gcs)));
  else
    this->pdata_m->initialize(
   gdom,
   GridPartition<Dim>(blocks,gcs),
   DistributedMapper<Dim>(
     GridPartition<Dim>(blocks,gcs)) );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const GuardLayers_t &igcs,
     const GuardLayers_t &egcs,
     const DistributedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize(
      gdom,
      GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs),
      DistributedMapper<Dim>(
 GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs)));
  else
    this->pdata_m->initialize(
   gdom,
   GridPartition<Dim>(blocks,igcs,egcs),
   DistributedMapper<Dim>(
     GridPartition<Dim>(blocks,igcs,egcs)));
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const DistributedTag &)
{
  this->pdata_m->initialize( grid,
         GridPartition<Dim>(grid),
         DistributedMapper<Dim>(GridPartition<Dim>(grid)));
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const GuardLayers_t &gcs,
     const DistributedTag &)
{
  this->pdata_m->initialize( grid,
         GridPartition<Dim>(grid,gcs),
         DistributedMapper<Dim>(GridPartition<Dim>(grid,gcs)) );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const GuardLayers_t &igcs,
     const GuardLayers_t &egcs,
     const DistributedTag &)
{
  this->pdata_m->initialize(
        grid,
        GridPartition<Dim>(grid,igcs,egcs),
        DistributedMapper<Dim>(
   GridPartition<Dim>(grid,igcs,egcs)) );
}
template <int Dim>
template <class Partitioner>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Partitioner &gpar,
     const DistributedTag &)
{
  this->pdata_m->initialize(gdom,
        gpar,
        DistributedMapper<Dim>(gpar));
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const ReplicatedTag &)
{
  this->pdata_m->initialize( gdom, GridPartition<Dim>(),LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const GuardLayers_t &gcs,
     const ReplicatedTag &)
{
  this->pdata_m->initialize( gdom, GridPartition<Dim>(gcs),LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const ReplicatedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize(
   gdom,
   GridPartition<Dim>(makeRGrid(gdom,blocks)),
   LocalMapper<Dim>() );
  else
    this->pdata_m->initialize(
   gdom,
   GridPartition<Dim>(blocks),
   LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const GuardLayers_t &gcs,
     const ReplicatedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize( gdom,
    GridPartition<Dim>(makeRGrid(gdom,blocks),gcs),
    LocalMapper<Dim>() );
  else
    this->pdata_m->initialize( gdom,
    GridPartition<Dim>(blocks,gcs),
    LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Loc<Dim> &blocks,
     const GuardLayers_t &igcs,
     const GuardLayers_t &egcs,
     const ReplicatedTag &)
{
  if (!gdom.empty())
    this->pdata_m->initialize(
       gdom,
       GridPartition<Dim>(makeRGrid(gdom,blocks),igcs,egcs),
       LocalMapper<Dim>() );
  else
    this->pdata_m->initialize(
   gdom,
   GridPartition<Dim>(blocks,igcs,egcs),
   LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const ReplicatedTag &)
{
  this->pdata_m->initialize( grid,
         GridPartition<Dim>(grid),
         LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const GuardLayers_t &gcs,
     const ReplicatedTag &)
{
  this->pdata_m->initialize(
        grid,
        GridPartition<Dim>(grid,gcs),
        LocalMapper<Dim>() );
}
template <int Dim>
void GridLayout<Dim>::initialize(const Grid<Dim> &grid,
     const GuardLayers_t &igcs,
     const GuardLayers_t &egcs,
     const ReplicatedTag &)
{
  this->pdata_m->initialize(
        grid,
        GridPartition<Dim>(grid,igcs,egcs),
        LocalMapper<Dim>() );
}
template <int Dim>
template <class Partitioner>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Partitioner &gpar,
     const ReplicatedTag &)
{
  this->pdata_m->initialize(gdom,
        gpar,
        LocalMapper<Dim>());
}
template <int Dim>
void GridLayout<Dim>::initialize(const Domain_t& idom,
     const List_t& nodes,
     const Loc<Dim>& blocks,
     bool hasIG, bool hasEG,
     const GuardLayers_t& ig,
     const GuardLayers_t& eg)
{
  this->pdata_m->initialize(idom,nodes,blocks,hasIG,hasEG,ig,eg);
}
template <int Dim>
template <class Partitioner>
void GridLayout<Dim>::initialize(const Domain_t &gdom,
     const Partitioner &gpar,
     const ContextMapper<Dim> &cmap)
{
  this->pdata_m->initialize(gdom, gpar, cmap);
}
template <int Dim>
template <class Ostream>
void GridLayout<Dim>::print(Ostream &ostr) const
{
  ostr << "GridLayout " << this->ID() << " on global domain "
       << this->domain() << ":" << '\n';
  ostr << "   Total subdomains: " << this->sizeGlobal() << '\n';
  ostr << "   Local subdomains: " << this->sizeLocal() << '\n';
  ostr << "  Remote subdomains: " << this->sizeRemote() << '\n';
  ostr << "        Grid blocks: " << this->blocks() << '\n';
  typename GridLayout<Dim>::const_iterator a;
  for (a = this->beginGlobal(); a != this->endGlobal(); ++a)
    ostr << "  Global subdomain = " << *a << '\n';
  for (a = this->beginLocal(); a != this->endLocal(); ++a)
    ostr << "   Local subdomain = " << *a << '\n';
  for (a = this->beginRemote(); a != this->endRemote(); ++a)
    ostr << "  Remote subdomain = " << *a << '\n';
  this->pdata_m->print(ostr);
}
template<int Dim, int Dim2>
template <class Ostream>
void GridLayoutView<Dim, Dim2>::print(Ostream &ostr) const
{
  ostr << "GridLayoutView " << this->ID() << " on global domain "
       << this->domain() << ':' << '\n';
  ostr << "   Base ID:          " << this->baseID() << '\n';
  ostr << "   Base domain:      " << this->baseDomain() << '\n';
  ostr << "   Total subdomains: " << this->sizeGlobal() << '\n';
  ostr << "   Local subdomains: " << this->sizeLocal() << '\n';
  ostr << "  Remote subdomains: " << this->sizeRemote() << '\n';
  const_iterator a;
  for (a = this->beginGlobal(); a != this->endGlobal(); ++a)
    ostr << "  Global subdomain = " << *a << '\n';
  for (a = this->beginLocal(); a != this->endLocal(); ++a)
    ostr << "   Local subdomain = " << *a << '\n';
  for (a = this->beginRemote(); a != this->endRemote(); ++a)
    ostr << "  Remote subdomain = " << *a << '\n';
}
template<int OriginalDim, class ViewedEngineTag>
struct ViewEngine
{
  ViewEngine() {};
  ~ViewEngine() {};
 };
template<int Dim, class T, int OriginalDim, class ViewedEngineTag>
class Engine<Dim, T, ViewEngine<OriginalDim, ViewedEngineTag> >
{
public:
  typedef ViewEngine<OriginalDim, ViewedEngineTag> Tag_t;
  typedef Engine<Dim, T, Tag_t> This_t;
  typedef This_t Engine_t;
  typedef Engine<OriginalDim, T, ViewedEngineTag> ViewedEngine_t;
  typedef ViewIndexer<Dim, OriginalDim> Indexer_t;
  typedef Interval<Dim> Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  enum { dimensions = Dim };
  enum { hasDataObject = ViewedEngine_t::hasDataObject };
  enum { dynamic = false };
  enum { zeroBased = true };
  enum { multiPatch = ViewedEngine_t::multiPatch };
  Engine()
    : eng_m()
  {
  }
  template<class DT>
  Engine(const Engine<Dim, T, ViewedEngineTag> &e, const Domain<Dim, DT> &dom)
    : eng_m(e), indexer_m(dom)
  {
    PoomaCTAssert<(OriginalDim == Dim)>::test();
  }
  template<class DT>
  Engine(const Engine<OriginalDim, T, ViewedEngineTag> &e,
  const SliceDomain<DT> &dom)
    : eng_m(e), indexer_m(dom)
  {
    PoomaCTAssert<(DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<(DT::dimensions == OriginalDim)>::test();
  }
  template<class Domain>
  Engine(const Engine<Dim, T, ViewedEngineTag> &e, const Node<Domain> &node)
    : eng_m(e), indexer_m(node.domain())
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
  }
  Engine(const Engine<Dim, T, ViewedEngineTag> &e, const INode<Dim> &inode)
    : eng_m(e), indexer_m(inode.domain())
  { }
  template<class DT>
  Engine(const Engine<Dim, T, ViewEngine<OriginalDim, ViewedEngineTag> > &e,
  const Domain<Dim, DT> &dom)
    : eng_m(e.viewedEngine()), indexer_m(e.indexer(), dom)
  {
  }
  template<int OrigDim, class DT>
  Engine(const Engine<OrigDim, T, ViewEngine<OriginalDim, ViewedEngineTag> > &e,
  const SliceDomain<DT> &dom)
    : eng_m(e.viewedEngine()), indexer_m(e.indexer(), dom)
  {
    PoomaCTAssert<(DT::sliceDimensions == Dim)>::test();
    PoomaCTAssert<(DT::dimensions == OrigDim)>::test();
  }
  template<class Domain>
  Engine(const Engine<Dim, T, ViewEngine<OriginalDim, ViewedEngineTag> > &e,
  const Node<Domain> &node)
    : eng_m(e.viewedEngine()), indexer_m(e.indexer(), node.domain())
  {
    PoomaCTAssert<(Domain::dimensions == Dim)>::test();
  }
  Engine(const Engine<Dim, T, ViewEngine<OriginalDim, ViewedEngineTag> > &e,
  const INode<Dim> &inode)
    : eng_m(e.viewedEngine()), indexer_m(e.indexer(), inode.domain())
  { }
  Engine(const Engine<Dim, T, ViewEngine<OriginalDim, ViewedEngineTag> >
  &model)
    : eng_m(model.viewedEngine()), indexer_m(model.indexer())
  { }
  This_t &operator=(const This_t &rhs)
  {
    eng_m = rhs.viewedEngine();
    indexer_m = rhs.indexer();
    return *this;
  }
  inline Element_t read(int i0) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1, int i2) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, i2, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1, int i2, int i3) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, i2, i3, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, i2, i3, i4, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4, int i5) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, i2, i3, i4, i5, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4,
   int i5, int i6) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(i0, i1, i2, i3, i4, i5, i6, oloc);
    return eng_m.read(oloc);
  }
  inline Element_t read(const Loc<Dim> &loc) const
  {
    Loc<OriginalDim> oloc;
    indexer_m.translate(loc, oloc);
    return eng_m.read(oloc);
  }
  inline const Domain_t &domain() const { return indexer_m.domain(); }
  inline Layout_t layout() const { return Layout_t(domain()); }
  inline int first(int i) const
  {
    ;
    return 0;
  }
  inline const ViewedEngine_t &viewedEngine() const { return eng_m; }
  inline const Indexer_t &indexer() const { return indexer_m; }
  template<class RequestType>
  inline
  typename DataObjectRequest<RequestType>::Type_t
  dataObjectRequest(const DataObjectRequest<RequestType>& f) const
  {
    return eng_m.dataObjectRequest(f);
  }
private:
  ViewedEngine_t eng_m;
  Indexer_t indexer_m;
};
template <int Dim, class T, int D2, class ViewedTag>
struct NewEngine< Engine<Dim,T,ViewEngine<D2,ViewedTag> >, Interval<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Type_t;
};
template <int Dim, class T, int D2, class ViewedTag>
struct NewEngine< Engine<Dim,T,ViewEngine<D2,ViewedTag> >, Range<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Type_t;
};
template <int Dim, class T, int D2, class ViewedTag, int SliceDim>
struct NewEngine< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  SliceInterval<Dim, SliceDim> >
{
  typedef Engine<SliceDim, T, ViewEngine<D2, ViewedTag> > Type_t;
};
template <int Dim, class T, int D2, class ViewedTag, int SliceDim>
struct NewEngine< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  SliceRange<Dim, SliceDim> >
{
  typedef Engine<SliceDim, T, ViewEngine<D2, ViewedTag> > Type_t;
};
template <int Dim, class T, int D2, class ViewedTag>
struct NewEngine< Engine<Dim, T, ViewEngine<D2, ViewedTag> >, INode<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Engine_t;
  typedef typename Engine_t::ViewedEngine_t ViewedEngine_t;
  typedef typename NewEngine<ViewedEngine_t,
    INode<D2> >::Type_t NewViewedEngine_t;
  typedef typename NewEngine<NewViewedEngine_t,
    SliceRange<D2, Dim> >::Type_t Type_t;
};
template <int Dim, class T, int D2, class ViewedTag>
struct NewEngineEngine< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  INode<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Engine_t;
  typedef typename NewEngine< Engine_t, INode<Dim> >::NewViewedEngine_t Type_t;
  static inline Type_t
  apply(const Engine_t &e, const INode<Dim> &inode)
  {
    Range<D2> base;
    e.indexer().localToBase(inode.domain(), base);
    Interval<D2> baseInt;
    int i;
    for (i = 0; i < D2; ++i)
    {
      baseInt[i] = Interval<1>(base[i].first(), base[i].last());
    }
    INode<D2> viewNode(inode, baseInt);
    return Type_t(e.viewedEngine(), viewNode);
  }
};
template <int Dim, class T, int D2, class ViewedTag>
struct NewEngineDomain< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  INode<Dim> >
{
  typedef SliceRange<D2, Dim> Type_t;
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Engine_t;
  static inline Type_t
  apply(const Engine_t &e, const INode<Dim> &inode)
  {
    SliceRange<D2, Dim> base;
    e.indexer().localToBase(inode.domain(), base);
    base.totalDomain() -= base.totalDomain().firsts();
    base.setSliceFromTotal();
    return base;
  }
};
template <int Dim, class T, class ViewedTag>
struct NewEngine<Engine<Dim, T, ViewEngine<Dim, ViewedTag> >, INode<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, ViewedTag> > Engine_t;
  typedef typename Engine_t::ViewedEngine_t ViewedEngine_t;
  typedef typename NewEngine<ViewedEngine_t,
    INode<Dim> >::Type_t NewViewedEngine_t;
  typedef typename NewEngine<NewViewedEngine_t,
    Range<Dim> >::Type_t Type_t;
};
template <int Dim, class T, class ViewedTag>
struct NewEngineEngine<Engine<Dim, T, ViewEngine<Dim, ViewedTag> >,
  INode<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, ViewedTag> > Engine_t;
  typedef typename NewEngine<Engine_t, INode<Dim> >::NewViewedEngine_t Type_t;
  static inline Type_t
  apply(const Engine_t &e, const INode<Dim> &inode)
  {
    Range<Dim> base;
    e.indexer().localToBase(inode.domain(), base);
    Interval<Dim> baseInt;
    int i;
    for (i = 0; i < Dim; ++i)
    {
      baseInt[i] = Interval<1>(base[i].first(), base[i].last());
    }
    INode<Dim> viewNode(inode, baseInt);
    return Type_t(e.viewedEngine(), viewNode);
  }
};
template <int Dim, class T, class ViewedTag>
struct NewEngineDomain< Engine<Dim, T, ViewEngine<Dim, ViewedTag> >,
  INode<Dim> >
{
  typedef Range<Dim> Type_t;
  typedef Engine<Dim, T, ViewEngine<Dim, ViewedTag> > Engine_t;
  static inline Type_t
  apply(const Engine_t &e, const INode<Dim> &inode)
  {
    Range<Dim> base;
    e.indexer().localToBase(inode.domain(), base);
    base -= base.firsts();
    return base;
  }
};
template<int OriginalDim, class ViewedEngineTag>
struct EvaluatorEngineTraits<ViewEngine<OriginalDim, ViewedEngineTag> >
{
  typedef typename EvaluatorEngineTraits<ViewedEngineTag>::Evaluator_t
  Evaluator_t;
};
template<int Dim, int ViewD1, int ViewD2>
class ViewIntersector
{
public:
  typedef IntersectorData<Dim> IntersectorData_t;
  typedef ViewIntersector<Dim, ViewD1, ViewD2> This_t;
  typedef typename IntersectorData_t::IDContainer_t IDContainer_t;
  typedef typename IntersectorData_t::BaseDomain_t BaseDomain_t;
  typedef typename IntersectorData_t::BaseDomainContainer_t
                                                        BaseDomainContainer_t;
  typedef typename IntersectorData_t::INode_t INode_t;
  typedef typename IntersectorData_t::INodeContainer_t INodeContainer_t;
  typedef typename IntersectorData_t::const_iterator const_iterator;
  typedef RefCountedPtr<IntersectorData_t> DataPtr_t;
  typedef ViewIndexer<ViewD1, ViewD2> Indexer_t;
  enum { dimensions = Dim };
  ViewIntersector(const ViewIndexer<ViewD1, ViewD2> &indexer,
    const Intersector<Dim> &model)
    : pdata_m(model.data()), indexer_m(indexer)
  {
    PoomaCTAssert<(Dim == ViewD1)>::test();
  }
  This_t &operator=(const This_t &model)
  {
    if (this != &model)
    {
      indexer_m = model.indexer_m;
      pdata_m = model.pdata_m;
    }
    return *this;
  }
  ~ViewIntersector() { }
  inline DataPtr_t &data() { return pdata_m; }
  inline const DataPtr_t &data() const { return pdata_m; }
  inline const_iterator begin() const { return data()->inodes_m.begin(); }
  inline const_iterator end() const { return data()->inodes_m.end(); }
  template<class Engine>
  inline
  void intersect(const Engine &e)
  {
    int n = data()->ids_m.size();
    typedef INode<ViewD2> INode2_t;
    typedef std::vector<INode2_t> INode2Container_t;
    INode2Container_t inodes2;
    int id = e.layout().ID();
    if (n == 0)
    {
      Range<ViewD2> base = indexer_m.baseDomain();
      e.layout().touches(base,
    std::back_inserter(inodes2),
    TouchesConstructINode<ViewD2>(id, GlobalIDDataBase::
             nullNodeKey(),
             &(data()->gidStore_m))
    );
      int i;
      int ni = inodes2.size();
      for (i = 0; i < ni; i++)
      {
 Interval<Dim> ival1;
 indexer_m.baseToLocalInterval(inodes2[i].domain(), ival1);
 INode<Dim> inode(inodes2[i], ival1);
 data()->inodes_m.push_back(inode);
      }
    }
    else
    {
      int ni = data()->inodes_m.size();
      int i;
      for (i = 0; i < ni; i++)
      {
 Range<ViewD2> range;
 indexer_m.localToBase(data()->inodes_m[i].domain(), range);
 e.layout().touches(range,
      std::back_inserter(inodes2),
      INode<ViewD2>::touchesConstructINode(id,
         data()->inodes_m[i])
      );
      }
      data()->inodes_m.erase(data()->inodes_m.begin(),
        data()->inodes_m.begin() + ni);
      ni = inodes2.size();
      for (i = 0; i < ni; i++)
      {
 Interval<Dim> ival1;
 indexer_m.baseToLocalInterval(inodes2[i].domain(), ival1);
 INode<Dim> inode(inodes2[i], ival1);
 data()->inodes_m.push_back(inode);
      }
    }
  }
  template<class Engine, int Dim2>
  inline
  bool intersect(const Engine &l, const GuardLayers<Dim2> &guard)
  {
    return (data()->intersect(l,guard));
  }
private:
  DataPtr_t pdata_m;
  Indexer_t indexer_m;
};
template <int Dim, class T, int D2, class ViewedTag, class Intersect>
struct LeafFunctor< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  ExpressionApply<IntersectorTag<Intersect> > >
{
  typedef int Type_t;
  typedef Engine<Dim, T, ViewEngine<D2, ViewedTag> > Engine_t;
  static Type_t
  apply(const Engine_t &,
 const ExpressionApply<IntersectorTag<Intersect> > &,
 const WrappedInt<false> &)
  {
    return 0;
  }
  static Type_t
  apply(const Engine_t &engine,
 const ExpressionApply<IntersectorTag<Intersect> > &tag,
 const WrappedInt<true> &)
  {
    enum { d1 = Intersect::dimensions };
    ViewIntersector<d1, Dim, D2> newIntersector(engine.indexer(),
      tag.tag().intersector_m);
    ExpressionApply<IntersectorTag<ViewIntersector<d1, Dim, D2> > >
      newTag(newIntersector);
    forEach(engine.viewedEngine(), newTag, NullCombine());
    return 0;
  }
  static Type_t
  apply(const Engine_t &engine,
 const ExpressionApply<IntersectorTag<Intersect> > &tag)
  {
    enum { multiPatch =
    Engine<Dim, T, ViewEngine<D2, ViewedTag> >::multiPatch };
    return apply(engine, tag, WrappedInt<multiPatch>());
  }
};
template<class RequestType> class DataObjectRequest;
template <int Dim, class T, int D2, class ViewedTag, class RequestType>
struct EngineFunctor< Engine<Dim, T, ViewEngine<D2, ViewedTag> >,
  DataObjectRequest<RequestType> >
{
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, ViewEngine<D2, ViewedTag> > &engine,
 const DataObjectRequest<RequestType> &tag)
  {
    return engineFunctor(engine.viewedEngine(), tag);
  }
};
template <int D, class T, int D2, class E, class Tag>
struct LeafFunctor<Engine<D, T, ViewEngine<D2, E> >, ExpressionApply<Tag> >
{
  typedef Engine<D, T, ViewEngine<D2, E> > Subject_t;
  typedef typename Subject_t::ViewedEngine_t Engine_t;
  typedef LeafFunctor<Engine_t, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  static
  Type_t apply(const Subject_t &engine, const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(engine.viewedEngine(), tag);
  }
};
template<class Functor>
struct IndexFunction
{
  typedef Functor Functor_t;
};
template<int Dim, class Functor>
struct IndexFunctionView
{ };
template<int Dim, class T, class Functor>
class Engine<Dim, T, IndexFunction<Functor> >
{
public:
  typedef IndexFunction<Functor> Tag_t;
  typedef Engine<Dim, T, Tag_t> This_t;
  typedef This_t Engine_t;
  typedef Interval<Dim> Domain_t;
  typedef DomainLayout<Dim> Layout_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  enum { dimensions = Dim };
  enum { hasDataObject = false };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = false };
  Engine() { }
  explicit Engine(const Domain_t &domain, const Functor &f = Functor())
  : funct_m(f), domain_m(domain)
  {
  }
  template<class Layout>
  explicit Engine(const Layout &layout, const Functor &f = Functor())
  : funct_m(f), domain_m(layout.domain())
  {
  }
  Engine(const This_t &model)
  : funct_m(model.functor()), domain_m(model.domain())
  {
  }
  This_t &operator=(const This_t &rhs)
  {
    domain_m = rhs.domain();
    funct_m = rhs.functor();
    return *this;
  }
  inline Element_t read(int i0) const
    {
      return funct_m(i0);
    }
  inline Element_t read(int i0, int i1) const
    {
      return funct_m(i0, i1);
    }
  inline Element_t read(int i0, int i1, int i2) const
    {
      return funct_m(i0, i1, i2);
    }
  inline Element_t read(int i0, int i1, int i2, int i3) const
    {
      return funct_m(i0, i1, i2, i3);
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4) const
    {
      return funct_m(i0, i1, i2, i3, i4);
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4,
    int i5) const
    {
      return funct_m(i0, i1, i2, i3, i4, i5);
    }
  inline Element_t read(int i0, int i1, int i2, int i3, int i4,
    int i5, int i6) const
    {
      return funct_m(i0, i1, i2, i3, i4, i5, i6);
    }
  inline Element_t read(const Loc<1> &loc) const
    {
      return funct_m(loc[0].first());
    }
  inline Element_t read(const Loc<2> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first());
    }
  inline Element_t read(const Loc<3> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first(), loc[2].first());
    }
  inline Element_t read(const Loc<4> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first(), loc[2].first(),
        loc[3].first());
    }
  inline Element_t read(const Loc<5> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first(), loc[2].first(),
        loc[3].first(), loc[4].first());
    }
  inline Element_t read(const Loc<6> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first(), loc[2].first(),
        loc[3].first(), loc[4].first(), loc[5].first());
    }
  inline Element_t read(const Loc<7> &loc) const
    {
      return funct_m(loc[0].first(), loc[1].first(), loc[2].first(),
        loc[3].first(), loc[4].first(), loc[5].first(), loc[6].first());
    }
  inline const Domain_t &domain() const { return domain_m; }
  void setDomain(const Domain_t &dom) { domain_m = dom; }
  inline int first(int i) const
  {
    ;
    return domain_m[i].first();
  }
  Layout_t layout() const
  {
    return Layout_t(domain_m);
  }
  const Functor &functor() const { return funct_m; }
  void setFunctor(const Functor &f) { funct_m = f; }
private:
  Functor funct_m;
  Domain_t domain_m;
};
template <int Dim, class T, class Functor>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >, Interval<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
template <int Dim, class T, class Functor>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >, Range<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
template <int Dim, class T, class Functor, int SliceDim>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >,
  SliceInterval<Dim, SliceDim> >
{
  typedef Engine<SliceDim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
template <int Dim, class T, class Functor, int SliceDim>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >,
  SliceRange<Dim, SliceDim> >
{
  typedef Engine<SliceDim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
template <int Dim, class T, class Functor, class Domain>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >, Node<Domain> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
template <int Dim, class T, class Functor>
struct NewEngine<Engine<Dim, T, IndexFunction<Functor> >, INode<Dim> >
{
  typedef Engine<Dim, T, ViewEngine<Dim, IndexFunction<Functor> > > Type_t;
};
class IotaFunctor
{
public:
  inline IotaFunctor() { }
  inline IotaFunctor(const IotaFunctor &) { }
  inline IotaFunctor &operator=(const IotaFunctor &) { return *this; }
  inline
  Vector<1, int> operator()(int i1) const
  {
    return Vector<1, int>(i1);
  }
  inline
  Vector<2, int> operator()(int i1, int i2) const
  {
    return Vector<2, int>(i1, i2);
  }
  inline
  Vector<3, int> operator()(int i1, int i2, int i3) const
  {
    return Vector<3, int>(i1, i2, i3);
  }
};
template<int Dim>
struct Iota
{
  typedef Array<Dim, Vector<Dim, int>, IndexFunction<IotaFunctor> >
    Iota_t;
  typedef typename ComponentView<Loc<1>, Iota_t>::Type_t Index_t;
};
template<int Dim>
inline
typename Iota<Dim>::Iota_t
iota(const Interval<Dim> &domain)
{
  typedef typename Iota<Dim>::Iota_t Iota_t;
  return Iota_t(domain);
}
template<int Dim>
inline
typename Iota<Dim>::Index_t
iotaIndex(const Interval<Dim> &domain, int i)
{
  typedef typename Iota<Dim>::Iota_t Iota_t;
  return Iota_t(domain).comp(i);
}
inline
Array<1, Vector<1, int>, IndexFunction<IotaFunctor> >
iota(int i1);
inline
Array<1, Vector<1, int>, IndexFunction<IotaFunctor> >
iota(int i1)
{
  return Array<1, Vector<1, int>,
    IndexFunction<IotaFunctor> >(Interval<1>(i1));
}
inline
Array<2, Vector<2, int>, IndexFunction<IotaFunctor> >
iota(int i1, int i2);
inline
Array<2, Vector<2, int>, IndexFunction<IotaFunctor> >
iota(int i1, int i2)
{
  return Array<2, Vector<2, int>,
    IndexFunction<IotaFunctor> >(Interval<2>(i1, i2));
}
inline
Array<3, Vector<3, int>, IndexFunction<IotaFunctor> >
iota(int i1, int i2, int i3);
inline
Array<3, Vector<3, int>, IndexFunction<IotaFunctor> >
iota(int i1, int i2, int i3)
{
  return Array<3, Vector<3, int>,
    IndexFunction<IotaFunctor> >(Interval<3>(i1, i2, i3));
}
template<class Functor, class ArgumentType>
struct FunctorResult
{
  typedef ArgumentType Type_t;
};
template<int D, class T, class E> class Array;
template<class UserFunction, class Expression>
struct UserFunctionEngine
{ };
template<int D, class T, class UserFunction, class Expression>
class Engine< D, T, UserFunctionEngine<UserFunction,Expression> >
{
public:
  typedef UserFunctionEngine<UserFunction,Expression> Tag_t;
  typedef Engine<D,T,Tag_t> This_t;
  typedef This_t Engine_t;
  typedef typename Expression::Domain_t Domain_t;
  typedef typename Expression::Layout_t Layout_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  typedef typename Expression::Engine_t ExprEngine_t;
  enum { dimensions = D };
  enum { hasDataObject = ExprEngine_t::hasDataObject };
  enum { dynamic = false };
  enum { zeroBased = ExprEngine_t::zeroBased };
  enum { multiPatch = ExprEngine_t::multiPatch };
  Engine(const UserFunction& s, const Expression& e)
    : userFunction_m(s), expression_m(e) {}
  template<class OtherE, class Domain>
  Engine(const Engine<D,T,UserFunctionEngine<UserFunction,OtherE> >& e,
  const Domain& d)
    : userFunction_m(e.userFunction()),
      expression_m( e.expression(), d ) {}
  inline Element_t read(const Loc<D> &loc) const
  {
    return userFunction_m(expression_m.read(loc));
  }
  inline Element_t read(int i) const
  {
    return userFunction_m(expression_m.read(i));
  }
  inline Element_t read(int i, int j) const
  {
    return userFunction_m(expression_m.read(i,j));
  }
  inline Element_t read(int i, int j, int k) const
  {
    return userFunction_m(expression_m.read(i,j,k));
  }
  inline Element_t read(int i, int j, int k, int l) const
  {
    return userFunction_m(expression_m.read(i,j,k,l));
  }
  inline Element_t read(int i, int j, int k, int l,int m) const
  {
    return userFunction_m(expression_m.read(i,j,k,l,m));
  }
  inline Element_t read(int i, int j, int k, int l,int m,int n) const
  {
    return userFunction_m(expression_m.read(i,j,k,l,m,n));
  }
  inline Element_t read(int i, int j, int k, int l,int m,int n,int o) const
  {
    return userFunction_m(expression_m.read(i,j,k,l,m,n,o));
  }
  inline Element_t operator()(const Loc<D> &loc) const
  {
    return userFunction_m(expression_m(loc));
  }
  inline Element_t operator()(int i) const
  {
    return userFunction_m(expression_m(i));
  }
  inline Element_t operator()(int i, int j) const
  {
    return userFunction_m(expression_m(i,j));
  }
  inline Element_t operator()(int i, int j, int k) const
  {
    return userFunction_m(expression_m(i,j,k));
  }
  inline Element_t operator()(int i, int j, int k, int l) const
  {
    return userFunction_m(expression_m(i,j,k,l));
  }
  inline Element_t operator()(int i, int j, int k, int l,int m) const
  {
    return userFunction_m(expression_m(i,j,k,l,m));
  }
  inline Element_t operator()(int i, int j, int k, int l,int m,int n) const
  {
    return userFunction_m(expression_m(i,j,k,l,m,n));
  }
  inline Element_t operator()(int i, int j, int k, int l,int m,int n,int o)
    const
  {
    return userFunction_m(expression_m(i,j,k,l,m,n,o));
  }
  inline const Domain_t& domain() const { return expression_m.domain(); }
  inline int first(int d) const
  {
    return expression_m.first(d);
  }
  const UserFunction& userFunction() const { return userFunction_m; }
  const Expression& expression() const { return expression_m; }
  template<class RequestType>
  inline
  typename DataObjectRequest<RequestType>::Type_t
  dataObjectRequest(const DataObjectRequest<RequestType>& f) const
  {
    return engineFunctor(expression_m.engine(),f);
  }
private:
  UserFunction userFunction_m;
  Expression expression_m;
};
template<class Func> class UserFunction;
template<class Func,int D,class T,class E>
struct View1<UserFunction<Func>,Array<D,T,E> >
{
  typedef Array<D,T,E> Expr_t;
  typedef UserFunctionEngine<Func,Expr_t> NewTag_t;
  typedef typename FunctorResult<Func,T>::Type_t NewT_t;
  typedef Engine<D,NewT_t,NewTag_t> NewEngine_t;
  typedef Array<D,NewT_t,NewTag_t> Type_t;
};
template<class Func>
class UserFunction
{
public:
  UserFunction()
  { }
  UserFunction(const Func &func)
    : function_m(func)
  { }
  template<class Init>
  UserFunction(const Init &init)
    : function_m(init)
  { }
  template<class I1, class I2>
  UserFunction(const I1 &i1, const I2 &i2)
    : function_m(i1,i2)
  { }
  template<class I1, class I2, class I3>
  UserFunction(const I1 &i1, const I2 &i2, const I3 &i3)
    : function_m(i1,i2,i3)
  { }
  template<class I1, class I2, class I3, class I4>
  UserFunction(const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4)
    : function_m(i1,i2,i3,i4)
  { }
  template<class I1, class I2, class I3, class I4, class I5>
  UserFunction(const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4,
        const I5 &i5)
    : function_m(i1,i2,i3,i4,i5)
  { }
  template<class I1, class I2, class I3, class I4, class I5, class I6>
  UserFunction(const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4,
        const I5 &i5, const I6 &i6)
    : function_m(i1,i2,i3,i4,i5,i6)
  { }
  template<class I1, class I2, class I3, class I4, class I5, class I6,
    class I7>
  UserFunction(const I1 &i1, const I2 &i2, const I3 &i3, const I4 &i4,
        const I5 &i5, const I6 &i6, const I7 &i7)
    : function_m(i1,i2,i3,i4,i5,i6,i7)
  { }
  template<int D, class T, class E>
  typename View1<UserFunction<Func>,Array<D,T,E> >::Type_t
  operator()(const Array<D,T,E>& expr) const
  {
    typedef typename View1<UserFunction<Func>,Array<D,T,E> >::NewEngine_t
      NewEngine_t;
    typedef typename View1<UserFunction<Func>,Array<D,T,E> >::Type_t
      Type_t;
    return Type_t(NewEngine_t(function(),expr));
  }
  inline Func &function() { return function_m; }
  inline const Func &function() const { return function_m; }
private:
  Func function_m;
};
template <int Dim, class T, class S, class E, class Domain>
struct NewEngine< Engine<Dim,T,UserFunctionEngine<S,E> >, Domain >
{
  typedef typename View1<E,Domain>::Type_t NewExpr_t;
  typedef UserFunctionEngine<S,NewExpr_t> NewTag_t;
  typedef typename NewExpr_t::Element_t OldElement_t;
  typedef typename FunctorResult<S,OldElement_t>::Type_t NewElement_t;
  typedef Engine<Dim,NewElement_t,NewTag_t> Type_t;
};
template<class UserFunction,class Expression>
struct EvaluatorEngineTraits<UserFunctionEngine<UserFunction,Expression> >
{
  typedef typename Expression::Engine_t Engine_t;
  typedef typename Engine_t::Tag_t Tag_t;
  typedef typename EvaluatorEngineTraits<Tag_t>::Evaluator_t Evaluator_t;
};
template <int Dim, class T, class S, class E, class EFTag>
struct EngineFunctor<Engine<Dim, T, UserFunctionEngine<S, E> >, EFTag>
{
  typedef typename EngineFunctor<E, EFTag>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, UserFunctionEngine<S, E> > &engine,
 const EFTag &tag)
  {
    return engineFunctor(engine.expression(), tag);
  }
};
template <int D, class T, class Func, class Expr, class Tag>
struct LeafFunctor<Engine<D, T, UserFunctionEngine<Func, Expr> >,
  EngineView<Tag> >
{
  typedef LeafFunctor<Expr, EngineView<Tag> > LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t NewViewed_t;
  typedef Engine<D, T, UserFunctionEngine<Func, NewViewed_t> > Type_t;
  static
  Type_t apply(const Engine<D, T, UserFunctionEngine<Func, Expr> > &engine,
        const EngineView<Tag> &tag)
  {
    return Type_t(engine.userFunction(),
    LeafFunctor_t::apply(engine.expression(), tag));
  }
};
template <int D, class T, class Func, class Expr, class Tag>
struct LeafFunctor<Engine<D, T, UserFunctionEngine<Func, Expr> >,
  ExpressionApply<Tag> >
{
  typedef LeafFunctor<Expr, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  static
  Type_t apply(const Engine<D, T, UserFunctionEngine<Func, Expr> > &engine,
        const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(engine.expression(), tag);
  }
};
template<int D, class T, class E> class Array;
template<class M, class T, class E> class Field;
template<class ST> class Stencil;
template<class Function, class Expression>
struct StencilEngine
{
  typedef typename Expression::Element_t ViewedElement_t;
  typedef typename FunctorResult<Function,ViewedElement_t>::Type_t Element_t;
};
template<class Function, int D>
inline
Interval<D> insetDomain(const Function &f, const Interval<D> &domain)
{
  Interval<D> ret;
  int d;
  for (d = 0; d < D; ++d)
  {
    ret[d] = Interval<1>(domain[d].first() + f.lowerExtent(d),
    domain[d].last() - f.upperExtent(d));
  }
  return ret;
}
template<int D, class T, class Function, class Expression>
class Engine<D, T, StencilEngine<Function, Expression> >
{
public:
  typedef StencilEngine<Function, Expression> Tag_t;
  typedef Engine<D, T, Tag_t> This_t;
  typedef This_t Engine_t;
  typedef Interval<D> Domain_t;
  typedef DomainLayout<D> Layout_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  typedef typename Expression::Engine_t ExprEngine_t;
  enum { dimensions = D };
  enum { hasDataObject = ExprEngine_t::hasDataObject };
  enum { dynamic = false };
  enum { multiPatch = ExprEngine_t::multiPatch };
  enum { zeroBased = true };
  Engine()
    : function_m(), expression_m(), domain_m(Pooma::NoInit())
  {
  }
  template <class Layout2>
  explicit Engine(const Layout2 &layout)
    : function_m(), expression_m(), domain_m(layout.domain())
  {
  }
  Engine(const Function &f, const Expression &e)
    : function_m(f), expression_m(e), domain_m(Pooma::NoInit())
  {
    Interval<D> inset = insetDomain(f, e.domain());
    int d;
    for (d = 0; d < D; ++d)
    {
      domain_m[d] = Interval<1>(inset[d].length());
      offset_m[d] = function().lowerExtent(d);
    }
  }
  Engine(const Function &f, const Expression &e, const Interval<D> &domain)
    : function_m(f), expression_m(e), domain_m(Pooma::NoInit())
  {
    int d;
    for (d = 0; d < D; ++d)
    {
      domain_m[d] = Interval<1>(domain[d].length());
      offset_m[d] = domain[d].first();
    }
  }
  template<class OtherE>
  Engine(const Engine<D, T, StencilEngine<Function, OtherE> > &e,
  const INode<D> &node)
    : function_m(e.function()),
      expression_m(e.expression()(e.viewDomain(node))),
      domain_m(Pooma::NoInit())
  {
    int d;
    for (d = 0; d < D; ++d)
    {
      domain_m[d] = Interval<1>(node.domain()[d].length());
      offset_m[d] = function().lowerExtent(d);
    }
  }
  Engine(const Engine_t &e,
  const Interval<D> &domain)
    : function_m(e.function()),
      expression_m(e.expression()),
      domain_m(Pooma::NoInit())
  {
    int d;
    for (d = 0; d < D; ++d)
    {
      domain_m[d] = Interval<1>(domain[d].length());
      offset_m[d] = e.offset_m[d] + domain[d].first();
    }
  }
  template <int Dim, class Tx, class EngineTag>
  void initExpressionFromModel(const Array<Dim, Tx, EngineTag>& model)
  {
    expression_m.engine() = model.engine();
  }
  template <class Mesh, class Tx, class EngineTag>
  void initExpressionFromModel(const Field<Mesh, Tx, EngineTag>& model)
  {
    expression_m.fieldEngine() = model.fieldEngine();
  }
  This_t &operator=(const This_t &model)
  {
    domain_m = model.domain();
    function_m = model.function();
    initExpressionFromModel(model.expression());
    for (int d = 0; d < D; ++d)
    {
      domain_m[d] = model.domain()[d];
      offset_m[d] = model.offset(d);
    }
    return *this;
  }
  inline Element_t read(int i) const
  {
    return function()(expression_m,
        i + offset_m[0]);
  }
  inline Element_t read(int i, int j) const
  {
    return function()(expression_m,
        i + offset_m[0],
        j + offset_m[1]);
  }
  inline Element_t read(int i, int j, int k) const
  {
    return function()(expression_m,
        i + offset_m[0],
        j + offset_m[1],
        k + offset_m[2]);
  }
  inline Element_t read(const Loc<1> &loc) const
  {
    return function()(expression_m,
        loc[0].first() + offset_m[0]);
  }
  inline Element_t read(const Loc<2> &loc) const
  {
    return function()(expression_m,
        loc[0].first() + offset_m[0],
        loc[1].first() + offset_m[1]);
  }
  inline Element_t read(const Loc<3> &loc) const
  {
    return function()(expression_m,
        loc[0].first() + offset_m[0],
        loc[1].first() + offset_m[1],
        loc[2].first() + offset_m[2]);
  }
  inline Element_t operator()(int i) const
  {
    return read(i);
  }
  inline Element_t operator()(int i, int j) const
  {
    return read(i, j);
  }
  inline Element_t operator()(int i, int j, int k) const
  {
    return read(i, j, k);
  }
  inline const Domain_t &domain() const { return domain_m; }
  inline Layout_t layout() const { return Layout_t(domain_m); }
  inline int first(int i) const
  {
    return 0;
  }
  inline
  Interval<D> viewDomain(const Interval<D> &domain) const
  {
    Interval<D> ret;
    int d;
    for (d = 0; d < D; ++d)
    {
      ret[d] =
 Interval<1>(
      domain[d].first() + offset_m[d]
      - function().lowerExtent(d),
      domain[d].last() + offset_m[d] + function().upperExtent(d)
      );
    }
    return ret;
  }
  inline
  INode<D> viewDomain(const INode<D> &inode) const
  {
    return INode<D>(inode, viewDomain(inode.domain()));
  }
  inline
  Interval<D> intersectDomain() const
  {
    Interval<D> ret;
    int d;
    for (d = 0; d < D; ++d)
    {
      ret[d] =
 Interval<1>(
      domain_m[d].first() + offset_m[d],
      domain_m[d].last() + offset_m[d]
      );
    }
    return ret;
  }
  inline const Function &function() const { return function_m; }
  inline const Expression &expression() const { return expression_m; }
  int offset(int d) const { return offset_m[d]; }
private:
  Function function_m;
  Expression expression_m;
  Interval<D> domain_m;
  int offset_m[D];
};
template<class Function, int D, class T, class E>
struct View1<Stencil<Function>, Array<D, T, E> >
{
  typedef Array<D,T,E> ArrayIn_t;
  typedef StencilEngine<Function, ArrayIn_t> NewTag_t;
  typedef typename NewTag_t::Element_t NewT_t;
  typedef Engine<D, NewT_t, NewTag_t> NewEngine_t;
  typedef Array<D, NewT_t, NewTag_t> Type_t;
  static inline
  Type_t make(const Stencil<Function> &s, const ArrayIn_t &a)
  {
    return Type_t(NewEngine_t(s.function(), a,
         insetDomain(s.function(), a.domain())
         ));
  }
};
template<class Function, class ArrayIn, int Dim>
struct View2<Stencil<Function>,ArrayIn,Interval<Dim> >
{
  enum { dim = ArrayIn::dimensions };
  typedef Interval<Dim> ViewDom_t;
  typedef typename View1<ArrayIn,ViewDom_t>::Type_t Expression_t;
  typedef StencilEngine<Function, Expression_t> NewTag_t;
  typedef typename NewTag_t::Element_t NewT_t;
  typedef Engine<dim,NewT_t,NewTag_t> NewEngine_t;
  typedef Array<dim,NewT_t,NewTag_t> Type_t;
  static inline
  Type_t make(const Stencil<Function> &s, const ArrayIn &a,
       const Interval<Dim> &d)
  {
    return Type_t(NewEngine_t(s.function(), a(s.inputDomain(d))));
  }
};
template<class Function, class ArrayIn, class Dom>
struct View2<Stencil<Function>, ArrayIn, Dom>
{
  enum { dim2 = ArrayIn::dimensions };
  enum { dim = Dom::dimensions };
  typedef Interval<dim2> ViewDom_t;
  typedef typename View1<ArrayIn, ViewDom_t>::Type_t Expression_t;
  typedef StencilEngine<Function, Expression_t> StencilTag_t;
  typedef typename StencilTag_t::Element_t NewT_t;
  typedef ViewEngine<dim2, StencilTag_t> NewTag_t;
  typedef Engine<dim,NewT_t,NewTag_t> NewEngine_t;
  typedef Array<dim,NewT_t,NewTag_t> Type_t;
  static inline
  Type_t make(const Stencil<Function> &s, const ArrayIn &a, const Dom &dom)
  {
    ViewDom_t viewDom = s.inputDomain(dom);
    ViewDom_t insetDom = insetDomain(s.function(), viewDom);
    ViewIndexer<dim,dim2> indexer(insetDom);
    Dom stView;
    indexer.baseToLocal(dom,stView);
    typedef typename NewEngine_t::ViewedEngine_t ViewedEngine_t;
    ViewedEngine_t viewed(s.function(),a(viewDom));
    return Type_t(NewEngine_t(viewed,stView));
  }
};
template<class Function>
class Stencil
{
public:
  Stencil()
  { }
  Stencil(const Stencil<Function> &model)
    : function_m(model.function_m)
  { }
  ~Stencil() {}
  template<class Init>
  Stencil(const Init &init)
    : function_m(init)
  { }
  template<int D, class T, class E>
  typename View1<Stencil<Function>,Array<D,T,E> >::Type_t
  operator()(const Array<D,T,E>& expr) const
  {
    typedef View1<Stencil<Function>,Array<D,T,E> > Ret_t;
    return Ret_t::make(*this,expr);
  }
  template<int D, class T, class E,class Dom>
  typename View2<Stencil<Function>,Array<D,T,E>,Dom>::Type_t
  operator()(const Array<D,T,E>& expr,const Dom &domain) const
  {
    PoomaCTAssert<(D==Dom::dimensions)>::test();
    typedef View2<Stencil<Function>,Array<D,T,E>,Dom> Ret_t;
    return Ret_t::make(*this,expr,domain);
  }
  template<int D>
  inline
  Interval<D> insetDomain(const Interval<D> &domain)
  {
    return ::insetDomain(function(), domain);
  }
  template<int D, class DT>
  inline
  Interval<D> inputDomain(const Domain<D,DT> &domain) const
  {
    Interval<D> ret;
    int d;
    for (d = 0; d < D; ++d)
    {
      ret[d] =
 Interval<1>(
      domain[d].first() - function().lowerExtent(d),
      domain[d].last() + function().upperExtent(d)
      );
    }
    return ret;
  }
  inline Function &function() { return function_m; }
  inline const Function &function() const { return function_m; }
private:
  Function function_m;
};
template <int Dim, class T, class S, class E>
struct NewEngine<Engine<Dim, T, StencilEngine<S, E> >, Interval<Dim> >
{
  typedef Engine<Dim, T, StencilEngine<S, E> > Type_t;
};
template <int Dim, class T, class S, class E>
struct NewEngine<Engine<Dim, T, StencilEngine<S, E> >, INode<Dim> >
{
  typedef typename View1<E, INode<Dim> >::Type_t NewExpr_t;
  typedef StencilEngine<S, NewExpr_t> NewTag_t;
  typedef Engine<Dim, T, NewTag_t> Type_t;
};
template <int Dim, class T, class S, class E>
struct NewEngine<Engine<Dim, T, StencilEngine<S, E> >, Range<Dim> >
{
  typedef StencilEngine<S,E> SETag_t;
  typedef ViewEngine<Dim,SETag_t> NewTag_t;
  typedef Engine<Dim,T,NewTag_t> Type_t;
};
template <int Dim, class T, class S, class E, int SliceDim>
struct NewEngine< Engine<Dim,T,StencilEngine<S,E> >,
  SliceInterval<Dim,SliceDim> >
{
  typedef StencilEngine<S,E> SETag_t;
  typedef ViewEngine<Dim,SETag_t> NewTag_t;
  typedef Engine<SliceDim,T,NewTag_t> Type_t;
};
template <int Dim, class T, class S, class E, int SliceDim>
struct NewEngine< Engine<Dim,T,StencilEngine<S,E> >,
  SliceRange<Dim,SliceDim> >
{
  typedef StencilEngine<S,E> SETag_t;
  typedef ViewEngine<Dim,SETag_t> NewTag_t;
  typedef Engine<SliceDim,T,NewTag_t> Type_t;
};
template<class UserFunction,class Expression>
struct EvaluatorEngineTraits<StencilEngine<UserFunction,Expression> >
{
  typedef typename Expression::Engine_t Engine_t;
  typedef typename Engine_t::Tag_t Tag_t;
  typedef typename EvaluatorEngineTraits<Tag_t>::Evaluator_t Evaluator_t;
};
template<int Dim, class Intersect>
class StencilIntersector
{
public:
  typedef typename Intersect::IntersectorData_t IntersectorData_t;
  typedef StencilIntersector<Dim, Intersect> This_t;
  typedef typename IntersectorData_t::const_iterator const_iterator;
  typedef RefCountedPtr<IntersectorData_t> DataPtr_t;
  enum { dimensions = Intersect::dimensions };
  StencilIntersector(const This_t &model)
    : domain_m(model.domain_m),
      stencilExtent_m(model.stencilExtent_m),
      intersector_m(model.intersector_m)
  { }
  StencilIntersector(const Interval<Dim> &domain, const Intersect &intersect,
    const GuardLayers<Dim> &stencilExtent)
    : domain_m(domain),
      stencilExtent_m(stencilExtent),
      intersector_m(intersect)
  { }
  This_t &operator=(const This_t &model)
  {
    if (this != &model)
    {
      intersector_m = model.intersector_m;
      domain_m = model.domain_m;
      stencilExtent_m = model.stencilExtent_m;
    }
    return *this;
  }
  ~StencilIntersector() { }
  inline DataPtr_t &data() { return intersector_m.data(); }
  inline const DataPtr_t &data() const { return intersector_m.data(); }
  inline const_iterator begin() const { return data()->inodes_m.begin(); }
  inline const_iterator end() const { return data()->inodes_m.end(); }
  template<class Engine>
  inline
  void intersect(const Engine &engine)
  {
    typedef typename NewEngine<Engine,Interval<Dim> >::Type_t NewEngine_t;
    NewEngine_t newEngine(engine, domain_m);
    intersector_m.intersect(newEngine);
    data()->shared(engine.layout().ID(),newEngine.layout().ID());
  }
  template<class Engine, int Dim2>
  inline
  bool intersect(const Engine &engine, const GuardLayers<Dim2> &g,
    GuardLayers<Dim> &usedGuards)
  {
    intersect(engine);
    usedGuards = stencilExtent_m;
    return true;
  }
private:
  Interval<Dim> domain_m;
  GuardLayers<Dim> stencilExtent_m;
  Intersect intersector_m;
};
template <int D, class T, class S, class E, class Intersect>
struct LeafFunctor<Engine<D,T,StencilEngine<S,E> >,
  ExpressionApply<IntersectorTag<Intersect> > >
{
  typedef int Type_t;
  static
  Type_t apply(const Engine<D,T,StencilEngine<S,E> > &engine,
        const ExpressionApply<IntersectorTag<Intersect> > &tag)
  {
    typedef StencilIntersector<D, Intersect> NewIntersector_t;
    GuardLayers<D> stencilExtent;
    for (int i=0; i<D; ++i) {
      stencilExtent.lower(i) = engine.function().lowerExtent(i);
      stencilExtent.upper(i) = engine.function().upperExtent(i);
    }
    NewIntersector_t newIntersector(engine.intersectDomain(),
        tag.tag().intersector_m,
        stencilExtent);
    expressionApply(engine.expression(),
      IntersectorTag<NewIntersector_t>(newIntersector));
    return 0;
  }
};
template<class RequestType> class DataObjectRequest;
template <int D, class T, class S, class E, class RequestType>
struct EngineFunctor<Engine<D, T, StencilEngine<S, E> >,
  DataObjectRequest<RequestType> >
{
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  static Type_t
  apply(const Engine<D, T, StencilEngine<S, E> > &engine,
 const DataObjectRequest<RequestType> &tag)
  {
    return engineFunctor(engine.expression(), tag);
  }
};
template <int D, class T, class S, class E, class Tag>
struct LeafFunctor<Engine<D, T, StencilEngine<S, E> >, EngineView<Tag> >
{
  typedef LeafFunctor<E, EngineView<Tag> > LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t NewViewed_t;
  typedef Engine<D, T, StencilEngine<S, NewViewed_t> > Type_t;
  static
  Type_t apply(const Engine<D, T, StencilEngine<S, E> > &engine,
        const EngineView<Tag> &tag)
  {
    return Type_t(engine.function(),
    LeafFunctor_t::apply(engine.expression(), tag));
  }
};
template <int D, class T, class S, class E, class Tag>
struct LeafFunctor<Engine<D, T, StencilEngine<S, E> >, ExpressionApply<Tag> >
{
  typedef LeafFunctor<E, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  static
  Type_t apply(const Engine<D, T, StencilEngine<S, E> > &engine,
        const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(engine.expression(), tag);
  }
};
namespace Pooma {
namespace Algorithms {
template <bool type>
struct IsConcrete
{
inline IsConcrete() { }; inline IsConcrete(const IsConcrete &) { }; inline IsConcrete &operator=(const IsConcrete &) { return *this; };
};
template <class It, class It2>
inline It2 copy(It begin, It end, It2 dest)
{
  ;
  ;
  typedef typename std::iterator_traits<It>::value_type Value_t;
  typedef ElementProperties<Value_t> EP_t;
  typedef IsConcrete<EP_t::concrete> ConcreteType_t;
  return copy_special(begin, end, dest, ConcreteType_t());
}
template <class It, class It2>
inline It2 copy_special(It begin, It end, It2 dest, IsConcrete<true>)
{
  typedef std::iterator_traits<It> DataTraits_t;
  typedef typename DataTraits_t::difference_type Diff_t;
  typedef typename DataTraits_t::value_type Value_t;
  return std::copy(begin, end, dest);
}
template <class It, class It2>
inline It2 copy_special(It begin, It end, It2 dest, IsConcrete<false>)
{
  typedef typename std::iterator_traits<It>::value_type Value_t;
  while (begin < end)
    {
      ElementProperties<Value_t>::construct(dest++, *begin++);
    }
  return dest;
}
template <class DataIterator, class KillIterator>
inline
typename std::iterator_traits<DataIterator>::difference_type
delete_backfill(DataIterator data_begin, DataIterator data_end,
  const KillIterator kill_begin, const KillIterator kill_end,
  typename std::iterator_traits<DataIterator>::difference_type offset = 0)
{
  ;
  ;
  std::reverse_iterator<KillIterator> rk_pos(kill_end);
  std::reverse_iterator<KillIterator> rk_end(kill_begin);
  typedef std::iterator_traits<DataIterator> DataTraits_t;
  typedef typename DataTraits_t::difference_type Diff_t;
  Diff_t last = data_end - data_begin - 1;
  while (!(rk_pos == rk_end))
    {
      if ((*rk_pos - offset) != last) break;
      --last;
      ++rk_pos;
    }
  DataIterator last_pos = data_begin + last;
  while (!(rk_pos == rk_end))
    {
      *(data_begin + (*rk_pos++ - offset)) = *last_pos--;
    }
  return kill_end - kill_begin;
}
template <class DataIterator, class KillIterator>
inline
typename std::iterator_traits<DataIterator>::difference_type
delete_shiftup(DataIterator data_begin, DataIterator data_end,
  KillIterator kill_begin, KillIterator kill_end,
  typename std::iterator_traits<DataIterator>::difference_type offset = 0)
{
  DataIterator insert_pos = data_begin + (*kill_begin - offset);
  KillIterator kill_pos = kill_begin;
  typedef std::iterator_traits<DataIterator> DataTraits_t;
  typedef typename DataTraits_t::value_type Value_t;
  typedef typename DataTraits_t::difference_type Diff_t;
  while (kill_pos < kill_end)
  {
    Diff_t copy_index = *kill_pos + 1;
    while ( (kill_pos + 1) < kill_end && copy_index == *(kill_pos + 1) )
    {
      ++copy_index;
      ++kill_pos;
    }
    DataIterator copy_begin = data_begin + (copy_index - offset);
    DataIterator copy_end;
    if (copy_begin < data_end)
    {
      if (kill_pos + 1 < kill_end)
        copy_end = data_begin + (*(kill_pos + 1) - offset);
      else
        copy_end = data_end;
      const Diff_t length = copy_end - copy_begin;
      Pooma::Algorithms::copy(copy_begin, copy_end, insert_pos);
      insert_pos += length;
    }
    ++kill_pos;
  }
  return kill_end - kill_begin;
}
template<class DataIterator>
inline DataIterator
find_most_common(DataIterator dataBegin, DataIterator dataEnd)
{
  DataIterator checkValue, mostCommonValue = dataEnd;
  int checkCount, count = 0;
  while (dataBegin != dataEnd)
    {
      checkValue = dataBegin++;
      checkCount = 1;
      while (dataBegin != dataEnd && *dataBegin == *checkValue)
 {
   ++checkCount;
   ++dataBegin;
 }
      if (checkCount > count)
        {
   mostCommonValue = checkValue;
   count = checkCount;
 }
    }
  return mostCommonValue;
}
}
}
template<class Tag>
struct Remote
{ };
template <int Dim, class T, class Tag>
class Engine<Dim, T, Remote<Tag> >
{
public:
  typedef Engine<Dim, T, Remote<Tag> > This_t;
  typedef Engine<Dim, T, Remote<Tag> > Engine_t;
  typedef Engine<Dim, T, Tag> LocalEngine_t;
  typedef Interval<Dim> Domain_t;
  typedef T Element_t;
  typedef RemoteProxy<T> ElementRef_t;
  typedef Remote<Tag> Tag_t;
  typedef DomainLayout<Dim> Layout_t;
  enum { dimensions = Dim };
  enum { hasDataObject = true };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = false };
  typedef Shared<LocalEngine_t> LocalShared_t;
  typedef RefCountedPtr<LocalShared_t> LocalPtr_t;
  Engine();
  explicit
  Engine(const Domain_t &domain);
  Engine(int owningContext, const Domain_t &domain);
  Engine(const Domain_t &domain, const T &elementModel);
  explicit
  Engine(const Node<Domain_t> &node);
  explicit
  Engine(const Layout_t &layout);
  Engine(const Engine_t &model);
  Engine(const Engine_t &, const EngineConstructTag &);
  template<class OtherEngine, class Domain>
  Engine(const OtherEngine &otherEngine, const Domain &domain);
  template<class OtherEngine, int D2>
  Engine(const OtherEngine &otherEngine,
  const SliceRange<D2, Dim> &domain);
  ~Engine();
  Engine_t &operator=(const Engine_t &model);
  Element_t read(const Loc<Dim> &) const;
  ElementRef_t operator()(const Loc<Dim> &) const;
  Element_t read(int) const;
  Element_t read(int, int) const;
  Element_t read(int, int, int) const;
  Element_t read(int, int, int, int) const;
  Element_t read(int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int) const;
  Element_t read(int, int, int, int, int, int, int) const;
  ElementRef_t operator()(int) const;
  ElementRef_t operator()(int, int) const;
  ElementRef_t operator()(int, int, int) const;
  ElementRef_t operator()(int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int) const;
  ElementRef_t operator()(int, int, int, int, int, int, int) const;
  inline const Domain_t &domain() const
  {
    return domain_m;
  }
  inline
  bool engineIsLocal() const
  {
    return (Pooma::context() == owningContext_m);
  }
  inline
  int owningContext() const
  {
    return owningContext_m;
  }
  inline
  const LocalEngine_t &localEngine() const
  {
    ;
    ;
    return (*localEnginePtr_m).data();
  }
  inline
  LocalEngine_t &localEngine()
  {
    ;
    ;
    return (*localEnginePtr_m).data();
  }
  inline int first(int i) const
  {
    return domain_m[i].first();
  }
  inline
  Engine_t &makeOwnCopy()
  {
    if (engineIsLocal() && localEnginePtr_m.isValid())
    {
      LocalEngine_t engine(localEngine());
      engine.makeOwnCopy();
      localEnginePtr_m = LocalPtr_t(new LocalShared_t(engine));
    }
    return *this;
  }
protected:
  Domain_t domain_m;
private:
  int owningContext_m;
  LocalPtr_t localEnginePtr_m;
};
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(const Loc<Dim> &loc) const
{
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(loc);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2, int i3) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2, i3);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2, int i3, int i4) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2, i3, i4);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2, i3, i4, i5);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2, i3, i4, i5, i6);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline T Engine<Dim, T, Remote<Tag> >::
read(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  T value;
  if (engineIsLocal())
  {
    value = localEngine().read(i1, i2, i3, i4, i5, i6, i7);
  }
  return ElementRef_t(value, owningContext());
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(const Loc<Dim> &loc) const
{
  if (engineIsLocal())
  {
    T &value = localEngine()(loc);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2, int i3) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2, i3);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2, int i3, int i4) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2, i3, i4);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2, int i3, int i4, int i5) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2, i3, i4, i5);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2, int i3, int i4, int i5, int i6) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2, i3, i4, i5, i6);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
inline RemoteProxy<T> Engine<Dim, T, Remote<Tag> >::
operator()(int i1, int i2, int i3, int i4, int i5, int i6, int i7) const
{
  ;
  if (engineIsLocal())
  {
    T &value = localEngine()(i1, i2, i3, i4, i5, i6, i7);
    return ElementRef_t(value, owningContext());
  }
  else
  {
    T val;
    return ElementRef_t(val, owningContext());
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine()
  : owningContext_m(0)
{
  ;
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine(const Node<Domain_t> &node)
  : domain_m(node.allocated()),
    owningContext_m(node.context())
{
  ;
  if (engineIsLocal())
  {
    localEnginePtr_m = LocalPtr_t(new LocalShared_t(LocalEngine_t(node)));
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine(const Layout_t &layout)
  : domain_m(layout.node().allocated()),
    owningContext_m(0)
{
  ;
  if (engineIsLocal())
  {
    localEnginePtr_m = LocalPtr_t(new LocalShared_t(LocalEngine_t(layout.
          node())));
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine(const Domain_t &dom)
  : domain_m(dom), owningContext_m(0)
{
  if (engineIsLocal())
  {
    localEnginePtr_m = LocalPtr_t(new LocalShared_t(LocalEngine_t(domain_m)));
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine(int owningContext, const Domain_t &dom)
  : domain_m(dom),
    owningContext_m(owningContext)
{
  if (engineIsLocal())
  {
    localEnginePtr_m = LocalPtr_t(new LocalShared_t(LocalEngine_t(domain_m)));
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::Engine(const Domain_t &dom, const T& model)
  : domain_m(dom), owningContext_m(0)
{
  if (engineIsLocal())
  {
    localEnginePtr_m =
      LocalPtr_t(new LocalShared_t(LocalEngine_t(domain_m, model)));
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::
Engine(const Engine<Dim, T, Remote<Tag> > &modelEngine)
  : domain_m(modelEngine.domain()),
    owningContext_m(modelEngine.owningContext()),
    localEnginePtr_m(modelEngine.localEnginePtr_m)
{
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::
Engine(const Engine<Dim, T, Remote<Tag> > &modelEngine,
       const EngineConstructTag &)
  : domain_m(modelEngine.domain()),
    owningContext_m(modelEngine.owningContext()),
    localEnginePtr_m(modelEngine.localEnginePtr_m)
{
}
template <int Dim, class T, class Tag>
template<class OtherEngine, class Domain>
Engine<Dim, T, Remote<Tag> >::
Engine(const OtherEngine &otherEngine, const Domain &domain)
  : owningContext_m(otherEngine.owningContext())
{
  if (engineIsLocal())
  {
    localEnginePtr_m =
      LocalPtr_t(new LocalShared_t(LocalEngine_t(otherEngine.localEngine(),
       domain)));
  }
  int i;
  for (i = 0; i < Dim; ++i)
  {
    domain_m[i] = Interval<1>(domain[i].length());
  }
}
template <int Dim, class T, class Tag>
template<class OtherEngine, int D2>
Engine<Dim, T, Remote<Tag> >::
Engine(const OtherEngine &otherEngine, const SliceRange<D2, Dim> &domain)
  : owningContext_m(otherEngine.owningContext())
{
  if (engineIsLocal())
  {
    localEnginePtr_m =
      LocalPtr_t(new LocalShared_t(LocalEngine_t(otherEngine.localEngine(),
       domain)));
  }
  int i;
  for (i = 0; i < Dim; ++i)
  {
    domain_m[i] = Interval<1>(domain.totalDomain()[i].length());
  }
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> > &
Engine<Dim, T, Remote<Tag> >::
operator=(const Engine<Dim, T, Remote<Tag> > &modelEngine)
{
  if (this == &modelEngine)
    return *this;
  owningContext_m = modelEngine.owningContext_m;
  domain_m = modelEngine.domain_m;
  localEnginePtr_m = modelEngine.localEnginePtr_m;
  return *this;
}
template <int Dim, class T, class Tag>
Engine<Dim, T, Remote<Tag> >::~Engine()
{
}
template<int Dim, class T, class Tag, class Domain>
struct NewEngine<Engine<Dim, T, Remote<Tag> >, Domain>
{
  typedef typename NewEngine<Engine<Dim, T, Tag>, Domain>::Type_t Local_t;
  typedef typename Local_t::Tag_t NewTag_t;
  enum { newDim = Local_t::dimensions };
  typedef Engine<newDim, T, Remote<NewTag_t> > Type_t;
};
template<int Dim, class T, class Tag>
struct NewEngineDomain<Engine<Dim, T, Remote<Tag> >, INode<Dim> >
{
  typedef const Interval<Dim> &Type_t;
  static inline const Interval<Dim> &
  apply(const Engine<Dim, T, Remote<Tag> > &,
 const INode<Dim> &i)
  {
    return i.domain();
  }
};
struct RemoteView { };
template<>
struct EngineView<RemoteView>
{
  typedef TreeCombine Combine_t;
};
struct RemoteSend
{
  RemoteSend(int n) : toContext_m(n) { }
  inline int toContext() const { return toContext_m; }
  int toContext_m;
};
template<class Engine>
struct DefaultExpressionApply<Engine, RemoteSend >
{
  typedef Engine Subject_t;
  typedef int Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const ExpressionApply<RemoteSend> &)
  {
    return 0;
  }
};
template<class Engine>
struct DefaultEngineView<Engine, RemoteView>
{
  typedef Engine Subject_t;
  typedef Engine Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const EngineView<RemoteView> &)
  {
    return engine;
  }
};
template<int Dim, class T, class Tag>
struct LeafFunctor<Engine<Dim, T, Remote<Tag> >, ExpressionApply<RemoteSend> >
{
  typedef Engine<Dim, T, Remote<Tag> > Subject_t;
  typedef int Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const ExpressionApply<RemoteSend> &sendTag)
  {
    if (engine.engineIsLocal())
    {
      if (sendTag.tag().toContext() == -1)
      {
 for (int i = 0; i < Pooma::contexts(); i++)
   if (i != Pooma::context())
     SendReceive::send(engine.localEngine(), i);
      }
      else
      {
 if (Pooma::context() != sendTag.tag().toContext())
   SendReceive::send(engine.localEngine(), sendTag.tag().toContext());
      }
    }
    return 0;
  }
};
template<int Dim, class T, class Tag>
struct LeafFunctor<Engine<Dim, T, Remote<Tag> >, EngineView<RemoteView> >
{
};
template<int Dim, class T>
struct LeafFunctor<Engine<Dim, T, Remote<Brick> >, EngineView<RemoteView> >
{
  typedef Engine<Dim, T, Remote<Brick> > Subject_t;
  typedef Engine<Dim, T, Brick> Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const EngineView<RemoteView> &)
  {
    if (engine.engineIsLocal())
    {
      return engine.localEngine();
    }
    else
    {
      Type_t local(engine.domain());
      Receive<Type_t>::receive(local, engine.owningContext());
      return local;
    }
  }
};
template<int Dim, class T>
struct LeafFunctor<Engine<Dim, T, Remote<BrickView> >,
  EngineView<RemoteView> >
{
  typedef Engine<Dim, T, Remote<BrickView> > Subject_t;
  typedef Engine<Dim, T, Brick> IncomingView_t;
  typedef Engine<Dim, T, Brick> Brick_t;
  typedef Engine<Dim, T, BrickView> Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const EngineView<RemoteView> &)
  {
    if (engine.engineIsLocal())
    {
      return engine.localEngine();
    }
    else
    {
      Interval<Dim> dom = engine.domain();
      Brick_t local(dom);
      Type_t view(local, dom);
      Receive<IncomingView_t>::receive(view, engine.owningContext());
      return view;
    }
  }
};
template<int Dim, class T>
struct LeafFunctor<Engine<Dim, T, Remote<BrickViewU> >,
  EngineView<RemoteView> >
{
  typedef Engine<Dim, T, Remote<BrickViewU> > Subject_t;
  typedef Engine<Dim, T, Brick> IncomingView_t;
  typedef Engine<Dim, T, Brick> Brick_t;
  typedef Engine<Dim, T, BrickViewU> Type_t;
  static inline
  Type_t apply(const Subject_t &engine,
        const EngineView<RemoteView> &)
  {
    if (engine.engineIsLocal())
    {
      return engine.localEngine();
    }
    else
    {
      Interval<Dim> dom = engine.domain();
      Brick_t local(dom);
      Type_t view(local, dom);
      Receive<IncomingView_t>::receive(view, engine.owningContext());
      return view;
    }
  }
};
template<int Dim, class T>
struct LeafFunctor<Engine<Dim, T, Remote<CompressibleBrick> >,
  EngineView<RemoteView> >
{
  typedef Engine<Dim, T, Remote<CompressibleBrick> > Subject_t;
  typedef Engine<Dim, T, CompressibleBrick> Type_t;
  static inline
  Type_t apply(const Subject_t &engine, const EngineView<RemoteView> &)
  {
    if (engine.engineIsLocal())
    {
      return engine.localEngine();
    }
    else
    {
      Type_t local(engine.domain());
      Receive<Type_t>::receive(local, engine.owningContext());
      return local;
    }
  }
};
template<int Dim, class T>
struct LeafFunctor<Engine<Dim, T, Remote<CompressibleBrickView> >,
  EngineView<RemoteView> >
{
  typedef Engine<Dim, T, Remote<CompressibleBrickView> > Subject_t;
  typedef Engine<Dim, T, CompressibleBrick> CompBrick_t;
  typedef Engine<Dim, T, CompressibleBrickView> Type_t;
  static inline
  Type_t apply(const Subject_t &engine, const EngineView<RemoteView> &)
  {
    if (engine.engineIsLocal())
    {
      return engine.localEngine();
    }
    else
    {
      Interval<Dim> dom = engine.domain();
      CompBrick_t local(dom);
      Type_t view(local, dom);
      Receive<Type_t>::receive(view, engine.owningContext());
      return view;
    }
  }
};
struct EngineBlockSerialize
{
  template<class Op, class Eng>
  inline static /*__attribute__((leafify))*/
  int apply(Op &op, const Eng &engine)
    {
      typedef typename Eng::Domain_t Domain_t;
      return apply(op, engine, engine.domain(),
     WrappedInt<Domain_t::dimensions>());
    }
  template<class Op, class Eng, class Dom>
  inline static /*__attribute__((leafify))*/
  int apply(Op &op, const Eng &engine, const Dom &domain)
    {
      return apply(op, engine, domain,
     WrappedInt<Dom::dimensions>());
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain, WrappedInt<1>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int e0 = domain[0].last();
      for (int i0 = f0; i0<=e0; ++i0)
 op(engine(i0));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<2>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int f1 = domain[1].first();
      int e0 = domain[0].last();
      int e1 = domain[1].last();
      for (int i1 = f1; i1<=e1; ++i1)
 for (int i0 = f0; i0<=e0; ++i0)
   op(engine(i0,i1));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<3>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int f1 = domain[1].first();
      int f2 = domain[2].first();
      int e0 = domain[0].last();
      int e1 = domain[1].last();
      int e2 = domain[2].last();
      for (int i2 = f2; i2<=e2; ++i2)
 for (int i1 = f1; i1<=e1; ++i1)
   for (int i0 = f0; i0<=e0; ++i0)
     op(engine(i0,i1,i2));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<4>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int f1 = domain[1].first();
      int f2 = domain[2].first();
      int f3 = domain[3].first();
      int e0 = domain[0].last();
      int e1 = domain[1].last();
      int e2 = domain[2].last();
      int e3 = domain[3].last();
      for (int i3 = f3; i3<=e3; ++i3)
 for (int i2 = f2; i2<=e2; ++i2)
   for (int i1 = f1; i1<=e1; ++i1)
     for (int i0 = f0; i0<=e0; ++i0)
       op(engine(i0,i1,i2,i3));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<5>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int f1 = domain[1].first();
      int f2 = domain[2].first();
      int f3 = domain[3].first();
      int f4 = domain[4].first();
      int e0 = domain[0].last();
      int e1 = domain[1].last();
      int e2 = domain[2].last();
      int e3 = domain[3].last();
      int e4 = domain[4].last();
      for (int i4 = f4; i4<=e4; ++i4)
 for (int i3 = f3; i3<=e3; ++i3)
   for (int i2 = f2; i2<=e2; ++i2)
     for (int i1 = f1; i1<=e1; ++i1)
       for (int i0 = f0; i0<=e0; ++i0)
  op(engine(i0,i1,i2,i3,i4));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<6>)
    {
      PoomaCTAssert<(Domain::unitStride == 1)>::test();
      int f0 = domain[0].first();
      int f1 = domain[1].first();
      int f2 = domain[2].first();
      int f3 = domain[3].first();
      int f4 = domain[4].first();
      int f5 = domain[5].first();
      int e0 = domain[0].last();
      int e1 = domain[1].last();
      int e2 = domain[2].last();
      int e3 = domain[3].last();
      int e4 = domain[4].last();
      int e5 = domain[5].last();
      for (int i5 = f5; i5<=e5; ++i5)
 for (int i4 = f4; i4<=e4; ++i4)
   for (int i3 = f3; i3<=e3; ++i3)
     for (int i2 = f2; i2<=e2; ++i2)
       for (int i1 = f1; i1<=e1; ++i1)
  for (int i0 = f0; i0<=e0; ++i0)
    op(engine(i0,i1,i2,i3,i4,i5));
      return op.total_m;
    }
  template<class Op,class Eng,class Domain>
  inline static int apply(Op &op,const Eng &engine,
     const Domain &domain,WrappedInt<7>)
{
  PoomaCTAssert<(Domain::unitStride == 1)>::test();
  int f0 = domain[0].first();
  int f1 = domain[1].first();
  int f2 = domain[2].first();
  int f3 = domain[3].first();
  int f4 = domain[4].first();
  int f5 = domain[5].first();
  int f6 = domain[6].first();
  int e0 = domain[0].last();
  int e1 = domain[1].last();
  int e2 = domain[2].last();
  int e3 = domain[3].last();
  int e4 = domain[4].last();
  int e5 = domain[5].last();
  int e6 = domain[6].last();
  for (int i6 = f6; i6<=e6; ++i6)
    for (int i5 = f5; i5<=e5; ++i5)
      for (int i4 = f4; i4<=e4; ++i4)
 for (int i3 = f3; i3<=e3; ++i3)
   for (int i2 = f2; i2<=e2; ++i2)
     for (int i1 = f1; i1<=e1; ++i1)
       for (int i0 = f0; i0<=e0; ++i0)
  op(engine(i0,i1,i2,i3,i4,i5,i6));
  return op.total_m;
}
private:
};
template <int Dim, class T, class Tag>
long elementsCompressed(const Engine<Dim, T, Remote<Tag> > &engine)
{
  return elementsCompressed(engine.localEngine());
}
template <int Dim, class T, class Tag>
void compress(Engine<Dim, T, Remote<Tag> > &engine)
{
  compress(engine.localEngine());
}
template <int Dim, class T, class Tag>
void uncompress(Engine<Dim, T, Remote<Tag> > &engine)
{
  uncompress(engine.localEngine());
}
template <int Dim, class T, class Tag>
bool compressed(const Engine<Dim, T, Remote<Tag> > &engine)
{
  return compressed(engine.localEngine());
}
class GatherContexts
{
private:
  class GatherContextsData : public RefCounted
  {
  public:
    inline GatherContextsData() {}
    inline GatherContextsData(const GatherContextsData &model)
    : contexts_m(model.contexts_m) {}
    inline ~GatherContextsData() {}
    void addContext(int c) const
      {
        if (c != -1)
          {
            if (contexts_m.empty())
              contexts_m.reserve(4);
     contexts_m.push_back(c);
   }
      }
    int mostCommonContext() const
      {
        if (contexts_m.size() != 0)
          {
            std::sort(contexts_m.begin(), contexts_m.end());
            return
       *Pooma::Algorithms::find_most_common(contexts_m.begin(),
                    contexts_m.end());
     }
        else
          {
            return -1;
          }
      }
  private:
    mutable std::vector<int> contexts_m;
  };
public:
  typedef NullCombine Combine_t;
  inline GatherContexts()
  : data_m(new GatherContextsData) {}
  inline GatherContexts(const GatherContexts &model)
  : data_m(model.data_m) { }
  GatherContexts &operator=(const GatherContexts &rhs)
    {
      data_m = rhs.data_m;
      return *this;
    }
  inline ~GatherContexts() {}
  inline void addContext(int c) const
    { data_m->addContext(c); }
  inline int mostCommonContext() const
    { return data_m->mostCommonContext(); }
private:
  RefCountedPtr<GatherContextsData> data_m;
};
template<class T>
struct EngineFunctorScalar<T, GatherContexts>
{
  typedef int Type_t;
  static inline
  Type_t apply(const T &, const GatherContexts &)
    {
      return 0;
    }
};
template<class Engine>
struct EngineFunctorDefault<Engine, GatherContexts>
{
  typedef Engine Subject_t;
  typedef int Type_t;
  static inline
  Type_t apply(const Subject_t &, const GatherContexts &)
    {
      return 0;
    }
};
template<int Dim, class T, class Tag>
struct EngineFunctor<Engine<Dim, T, Remote<Tag> >, GatherContexts>
{
  typedef Engine<Dim, T, Remote<Tag> > Subject_t;
  typedef int Type_t;
  static inline
  Type_t apply(const Subject_t &engine, const GatherContexts &tag)
    {
      tag.addContext(engine.owningContext());
      return 0;
    }
};
template <>
struct Evaluator<RemoteSinglePatchEvaluatorTag>
{
  Evaluator() { }
  ~Evaluator() { }
  template <class LHS, class RHS, class Op>
  void evaluate(const LHS &lhs, const Op &op, const RHS &rhs) const
  {
    GatherContexts gtag;
    engineFunctor(lhs.engine(), gtag);
    int lhsContext = gtag.mostCommonContext();
    expressionApply(rhs, RemoteSend(lhsContext));
    if (lhsContext == -1 || Pooma::context() == lhsContext)
      {
 EngineView<RemoteView> view;
        Evaluator<SinglePatchEvaluatorTag>().
   evaluate(forEach(lhs, view, TreeCombine()), op,
     forEach(rhs, view, TreeCombine()));
      }
    else
      {
      }
  }
};
template <>
struct Evaluator<RemoteMultiPatchEvaluatorTag>
{
  Evaluator() { }
  ~Evaluator() { }
  template <class LHS, class RHS, class Op>
  void evaluate(const LHS &lhs, const Op &op, const RHS &rhs) const
  {
    typedef Intersector<LHS::dimensions> Inter_t;
    Inter_t inter;
    expressionApply(lhs, IntersectorTag<Inter_t>(inter));
    expressionApply(rhs, IntersectorTag<Inter_t>(inter));
    typename Inter_t::const_iterator i = inter.begin();
    while (i != inter.end())
      {
        Evaluator<RemoteSinglePatchEvaluatorTag>().
          evaluate(lhs(*i), op, rhs(*i));
        ++i;
      }
  }
};
template <>
struct Reduction<RemoteSinglePatchEvaluatorTag>
{
  Reduction() { }
  ~Reduction() { }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e) const
  {
    GatherContexts gtag;
    engineFunctor(e.engine(), gtag);
    int computationContext = gtag.mostCommonContext();
    Pooma::CountingSemaphore csem;
    csem.height(1);
    if (Pooma::context() != computationContext)
    {
      expressionApply(e, RemoteSend(computationContext));
      csem.incr();
    }
    else
    {
      EngineView<RemoteView> view;
      Reduction<SinglePatchEvaluatorTag>().
 evaluate(ret, op,
   forEach(e, view, TreeCombine()), csem);
    }
    csem.wait();
    Pooma::scheduler().endGeneration();
    Pooma::blockAndEvaluate();
    Pooma::scheduler().beginGeneration();
    RemoteProxy<T> globalRet(ret, computationContext);
    ret = globalRet;
  }
};
template <>
struct Reduction<RemoteMultiPatchEvaluatorTag>
{
  Reduction() { }
  ~Reduction() { }
  template<class T, class Op, class Expr>
  void evaluate(T &ret, const Op &op, const Expr &e) const
  {
    typedef Intersector<Expr::dimensions> Inter_t;
    Inter_t inter;
    expressionApply(e, IntersectorTag<Inter_t>(inter));
    std::vector<bool> present(inter.size());
    std::vector<int> computationalContext(inter.size());
    typename Inter_t::const_iterator i = inter.begin();
    int j, k, n = 0;
    for (j = 0; j < inter.size(); j++)
      {
        present[j] = i->contextParticipates(Pooma::context());
 if (present[j])
          {
            computationalContext[j] = i->context();
            if (computationalContext[j] == Pooma::context())
              ++n;
          }
 ++i;
      }
    Pooma::CountingSemaphore csem;
    csem.height(n);
    T *vals = new T[n];
    i = inter.begin();
    k = 0;
    for (j = 0; j < inter.size(); j++)
      {
 if (present[j])
   {
     if (computationalContext[j] == Pooma::context())
       {
  EngineView<RemoteView> view;
  Reduction<SinglePatchEvaluatorTag>().
    evaluate(vals[k++], op,
      forEach(e(*i).engine(), view, TreeCombine()), csem);
       }
     else
       {
         expressionApply(e(*i), RemoteSend(computationalContext[j]));
       }
   }
 ++i;
      }
    ;
    csem.wait();
    Pooma::scheduler().endGeneration();
    Pooma::blockAndEvaluate();
    Pooma::scheduler().beginGeneration();
    if (n > 0)
      {
 ret = vals[0];
 for (j = 1; j < n; j++)
   op(ret, vals[j]);
      }
    delete [] vals;
    ReduceOverContexts<T, Op> finalReduction(ret, 0, n > 0);
    if (Pooma::context() == 0)
      ret = finalReduction;
    RemoteProxy<T> broadcast(ret, 0);
    ret = broadcast;
  }
};
template <int Dim, class T, class LayoutTag, class Tag>
struct EngineFunctor<Engine<Dim, T, MultiPatch<LayoutTag, Remote<Tag> > >,
  EnginePatch >
{
  typedef Engine<Dim, T, MultiPatch<LayoutTag, Remote<Tag> > > Subject_t;
  typedef Engine<Dim, T, Tag> Type_t;
  static inline
  Type_t apply(const Subject_t &engine, const EnginePatch &tag)
  {
    return engine.localPatch(tag.patch_m).localEngine();
  }
};
template <int Dim, class T, class Eng>
struct ElementProperties<Engine<Dim, T, Remote<Eng> > >
  : public MakeOwnCopyProperties<Engine<Dim, T, Remote<Eng> > >
{ };
class Full;
template<int D1, int D2, class T, class E> class TinyMatrix;
template<int D1, int D2, class T, class E> class TinyMatrixEngine;
template<class V, int I, int J>
struct TinyMatrixElem
{
  typedef V Element_t;
  typedef const V& ConstElementRef_t;
  typedef V& ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x; }
  static ElementRef_t get( V& x) { return x; }
};
template<int D1, int D2, class T, class E, int I, int J>
struct TinyMatrixEngineElem
{
  typedef TinyMatrixEngine<D1,D2,T,E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::ConstElementRef_t ConstElementRef_t;
  typedef typename V::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x(I,J); }
  static ElementRef_t get( V& x) { return x(I,J); }
};
template<int D1, int D2, class T, class E, int I, int J>
struct TinyMatrixElem< TinyMatrix<D1,D2,T,E> , I , J>
{
  typedef TinyMatrix<D1,D2,T,E> V;
  typedef TinyMatrixEngineElem<D1,D2,T,E,I,J> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x.engine()); }
  static ElementRef_t get(V& x) { return TE::get(x.engine()); }
};
template<class T1, class T2, class Op, int B1, int L1, int B2, int L2>
struct TinyMatrixAssign
{
  enum { B11=B1 , L11=L1/2 , B12=B1+L1/2 , L12 = L1-L1/2 };
  enum { B21=B2 , L21=L2/2 , B22=B2+L2/2 , L22 = L2-L2/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TinyMatrixAssign<T1,T2,Op,B11,L11,B21,L21>::apply(x,y,op);
      TinyMatrixAssign<T1,T2,Op,B12,L12,B21,L21>::apply(x,y,op);
      TinyMatrixAssign<T1,T2,Op,B11,L11,B22,L22>::apply(x,y,op);
      TinyMatrixAssign<T1,T2,Op,B12,L12,B22,L22>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int L1, int B2>
struct TinyMatrixAssign<T1,T2,Op,B1,L1,B2,1>
{
  enum { B11=B1 , L11=L1/2 , B12=B1+L1/2 , L12 = L1-L1/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TinyMatrixAssign<T1,T2,Op,B11,L11,B2,1>::apply(x,y,op);
      TinyMatrixAssign<T1,T2,Op,B12,L12,B2,1>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int B2, int L2>
struct TinyMatrixAssign<T1,T2,Op,B1,1,B2,L2>
{
  enum { B21=B2 , L21=L2/2 , B22=B2+L2/2 , L22 = L2-L2/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TinyMatrixAssign<T1,T2,Op,B1,1,B21,L21>::apply(x,y,op);
      TinyMatrixAssign<T1,T2,Op,B1,1,B22,L22>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TinyMatrixAssign<T1,T2,Op,B1,1,B2,1>
{
  static void apply(T1& x, const T2& y,Op op=Op())
    {
      op(TinyMatrixElem<T1,B1,B2>::get(x), TinyMatrixElem<T2,B1,B2>::get(y));
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TinyMatrixAssign<T1,T2,Op,B1,2,B2,2>
{
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      op(TinyMatrixElem<T1,B1 ,B2 >::get(x), TinyMatrixElem<T2,B1 ,B2 >::get(y));
      op(TinyMatrixElem<T1,B1+1,B2 >::get(x), TinyMatrixElem<T2,B1+1,B2 >::get(y));
      op(TinyMatrixElem<T1,B1 ,B2+1>::get(x), TinyMatrixElem<T2,B1 ,B2+1>::get(y));
      op(TinyMatrixElem<T1,B1+1,B2+1>::get(x), TinyMatrixElem<T2,B1+1,B2+1>::get(y));
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TinyMatrixAssign<T1,T2,Op,B1,3,B2,3>
{
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      op(TinyMatrixElem<T1,B1 ,B2 >::get(x), TinyMatrixElem<T2,B1 ,B2 >::get(y));
      op(TinyMatrixElem<T1,B1+1,B2 >::get(x), TinyMatrixElem<T2,B1+1,B2 >::get(y));
      op(TinyMatrixElem<T1,B1+2,B2 >::get(x), TinyMatrixElem<T2,B1+2,B2 >::get(y));
      op(TinyMatrixElem<T1,B1 ,B2+1>::get(x), TinyMatrixElem<T2,B1 ,B2+1>::get(y));
      op(TinyMatrixElem<T1,B1+1,B2+1>::get(x), TinyMatrixElem<T2,B1+1,B2+1>::get(y));
      op(TinyMatrixElem<T1,B1+2,B2+1>::get(x), TinyMatrixElem<T2,B1+2,B2+1>::get(y));
      op(TinyMatrixElem<T1,B1 ,B2+2>::get(x), TinyMatrixElem<T2,B1 ,B2+2>::get(y));
      op(TinyMatrixElem<T1,B1+1,B2+2>::get(x), TinyMatrixElem<T2,B1+1,B2+2>::get(y));
      op(TinyMatrixElem<T1,B1+2,B2+2>::get(x), TinyMatrixElem<T2,B1+2,B2+2>::get(y));
    }
};
template<class V1, class V2, class Op>
class BinaryTinyMatrixOp;
template<int D1, int D2, class T, class V1, class V2, class Op>
class TinyMatrixEngine<D1,D2,T,BinaryTinyMatrixOp<V1,V2,Op> >
{
public:
  enum { dimensions=2 };
  typedef T Element_t;
  typedef BinaryTinyMatrixOp<V1,V2,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef TinyMatrixEngine<D1,D2,T, BinaryTinyMatrixOp<V1,V2,Op> > This_t;
  TinyMatrixEngine(const V1& v1, const V2& v2)
    : v1_m(v1), v2_m(v2) {}
  Element_t operator()(int i, int j) const
  {
    return Op()(v1_m(i,j), v2_m(i,j));
  }
  template<int DD1,int DD2, class TT, class EE, int I, int J>
    friend struct TinyMatrixEngineElem;
private:
  const V1& v1_m;
  const V2& v2_m;
};
template<int D1, int D2, class T, class V1, class V2, class Op, int I, int J>
struct TinyMatrixEngineElem<D1,D2,T,BinaryTinyMatrixOp<V1,V2,Op>, I, J >
{
  typedef TinyMatrixEngine<D1,D2,T,BinaryTinyMatrixOp<V1,V2,Op> > V;
  typedef typename TinyMatrixElem<V1,I,J>::Element_t T1;
  typedef typename TinyMatrixElem<V2,I,J>::Element_t T2;
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(
        TinyMatrixElem<V1,I,J>::get(x.v1_m),
        TinyMatrixElem<V2,I,J>::get(x.v2_m));
    }
};
template<class V1, class Op>
class UnaryTinyMatrixOp;
template<int D1, int D2, class T, class V1, class Op>
class TinyMatrixEngine<D1,D2,T,UnaryTinyMatrixOp<V1,Op> >
{
public:
  enum { dimensions=2 };
  typedef T Element_t;
  typedef UnaryTinyMatrixOp<V1,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef TinyMatrixEngine<D1,D2,T, UnaryTinyMatrixOp<V1,Op> > This_t;
  explicit TinyMatrixEngine(const V1& v1)
    : v1_m(v1) {}
  Element_t operator()(int i, int j) const
  {
    return Op()(v1_m(i,j));
  }
  template<int DD1, int DD2, class TT, class EE, int I, int J>
    friend struct TinyMatrixEngineElem;
private:
  const V1& v1_m;
};
template<int D1, int D2, class T, class V1, class Op, int I, int J>
struct TinyMatrixEngineElem<D1,D2,T,UnaryTinyMatrixOp<V1,Op>, I, J >
{
  typedef TinyMatrixEngine<D1,D2,T,UnaryTinyMatrixOp<V1,Op> > V;
  typedef typename TinyMatrixElem<V1,I,J>::Element_t T1;
  typedef typename UnaryReturn<T1,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(TinyMatrixElem<V1,I,J>::get(x.v1_m));
    }
};
template<int D1, int D2, class T, class E> class TinyMatrix;
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcCos > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnArcCos>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcCos >::Type_t acos( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnArcCos>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnArcCos> > Expr_t; typedef typename UnaryReturn<V1,FnArcCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcSin > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnArcSin>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcSin >::Type_t asin( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnArcSin>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnArcSin> > Expr_t; typedef typename UnaryReturn<V1,FnArcSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcTan > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnArcTan>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnArcTan >::Type_t atan( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnArcTan>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnArcTan> > Expr_t; typedef typename UnaryReturn<V1,FnArcTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnCeil > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnCeil>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnCeil >::Type_t ceil( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnCeil>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnCeil> > Expr_t; typedef typename UnaryReturn<V1,FnCeil>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnCos > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnCos>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnCos >::Type_t cos( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnCos>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnCos> > Expr_t; typedef typename UnaryReturn<V1,FnCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypCos > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnHypCos>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypCos >::Type_t cosh( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnHypCos>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnHypCos> > Expr_t; typedef typename UnaryReturn<V1,FnHypCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnExp > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnExp>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnExp >::Type_t exp( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnExp>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnExp> > Expr_t; typedef typename UnaryReturn<V1,FnExp>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnFabs > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnFabs>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnFabs >::Type_t fabs( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnFabs>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnFabs> > Expr_t; typedef typename UnaryReturn<V1,FnFabs>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnFloor > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnFloor>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnFloor >::Type_t floor( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnFloor>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnFloor> > Expr_t; typedef typename UnaryReturn<V1,FnFloor>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnLog > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnLog>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnLog >::Type_t log( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnLog>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnLog> > Expr_t; typedef typename UnaryReturn<V1,FnLog>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnLog10 > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnLog10>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnLog10 >::Type_t log10( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnLog10>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnLog10> > Expr_t; typedef typename UnaryReturn<V1,FnLog10>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnSin > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnSin>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnSin >::Type_t sin( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnSin>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnSin> > Expr_t; typedef typename UnaryReturn<V1,FnSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypSin > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnHypSin>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypSin >::Type_t sinh( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnHypSin>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnHypSin> > Expr_t; typedef typename UnaryReturn<V1,FnHypSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnSqrt > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnSqrt>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnSqrt >::Type_t sqrt( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnSqrt>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnSqrt> > Expr_t; typedef typename UnaryReturn<V1,FnSqrt>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnTan > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnTan>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnTan >::Type_t tan( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnTan>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnTan> > Expr_t; typedef typename UnaryReturn<V1,FnTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypTan > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,FnHypTan>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, FnHypTan >::Type_t tanh( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,FnHypTan>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,FnHypTan> > Expr_t; typedef typename UnaryReturn<V1,FnHypTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, OpUnaryMinus > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,OpUnaryMinus>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, OpUnaryMinus >::Type_t operator-( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,OpUnaryMinus>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,OpUnaryMinus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryMinus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, OpUnaryPlus > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,OpUnaryPlus>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, OpUnaryPlus >::Type_t operator+( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,OpUnaryPlus>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,OpUnaryPlus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryPlus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T, class E> struct UnaryReturn< TinyMatrix<D1,D2,T,E>, OpBitwiseNot > { typedef TinyMatrix< D1, D2, typename UnaryReturn<T,OpBitwiseNot>::Type_t, E > Type_t; }; template <int D1, int D2, class T, class E> inline typename UnaryReturn< TinyMatrix<D1,D2,T,E>, OpBitwiseNot >::Type_t operator~( const TinyMatrix<D1,D2,T,E>& v1 ) { typedef TinyMatrix<D1,D2,T,E> V1; typedef typename UnaryReturn<T,OpBitwiseNot>::Type_t T3; typedef TinyMatrix< D1, D2, T3, UnaryTinyMatrixOp<V1,OpBitwiseNot> > Expr_t; typedef typename UnaryReturn<V1,OpBitwiseNot>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpAdd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpAdd >::Type_t operator+( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpAdd>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpAdd> > Expr_t; typedef typename BinaryReturn<V1,V2,OpAdd>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpAdd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpAdd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpAdd >::Type_t operator+( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpAdd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpAdd >::Type_t operator+( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpAdd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpSubtract > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpSubtract >::Type_t operator-( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpSubtract>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpSubtract> > Expr_t; typedef typename BinaryReturn<V1,V2,OpSubtract>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpSubtract > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpSubtract > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpSubtract >::Type_t operator-( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpSubtract> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpSubtract >::Type_t operator-( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpSubtract> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpMultiply > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpMultiply >::Type_t operator*( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpMultiply> > Expr_t; typedef typename BinaryReturn<V1,V2,OpMultiply>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpMultiply > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpMultiply > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpMultiply >::Type_t operator*( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpMultiply> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpMultiply >::Type_t operator*( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpMultiply> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpDivide > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpDivide >::Type_t operator/( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpDivide>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpDivide> > Expr_t; typedef typename BinaryReturn<V1,V2,OpDivide>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpDivide > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpDivide > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpDivide >::Type_t operator/( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpDivide> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpDivide >::Type_t operator/( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpDivide> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpMod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpMod >::Type_t operator%( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpMod>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpMod> > Expr_t; typedef typename BinaryReturn<V1,V2,OpMod>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpMod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpMod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpMod >::Type_t operator%( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpMod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpMod >::Type_t operator%( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpMod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpBitwiseAnd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpBitwiseAnd >::Type_t operator&( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpBitwiseAnd> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseAnd>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseAnd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseAnd > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseAnd >::Type_t operator&( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseAnd >::Type_t operator&( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpBitwiseOr > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpBitwiseOr >::Type_t operator|( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpBitwiseOr> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseOr>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseOr > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseOr > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseOr >::Type_t operator|( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseOr >::Type_t operator|( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, OpBitwiseXor > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, OpBitwiseXor >::Type_t operator^( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,OpBitwiseXor> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseXor>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseXor > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseXor > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, OpBitwiseXor >::Type_t operator^( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, OpBitwiseXor >::Type_t operator^( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, FnLdexp > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, FnLdexp >::Type_t ldexp( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnLdexp>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,FnLdexp> > Expr_t; typedef typename BinaryReturn<V1,V2,FnLdexp>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnLdexp > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnLdexp > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnLdexp >::Type_t ldexp( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,FnLdexp> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnLdexp >::Type_t ldexp( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,FnLdexp> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, FnPow > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, FnPow >::Type_t pow( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnPow>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,FnPow> > Expr_t; typedef typename BinaryReturn<V1,V2,FnPow>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnPow > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnPow > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnPow >::Type_t pow( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,FnPow> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnPow >::Type_t pow( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,FnPow> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, FnFmod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, FnFmod >::Type_t fmod( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnFmod>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,FnFmod> > Expr_t; typedef typename BinaryReturn<V1,V2,FnFmod>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnFmod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnFmod > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnFmod >::Type_t fmod( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,FnFmod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnFmod >::Type_t fmod( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,FnFmod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, TinyMatrix<D1,D2,T2,E>, FnArcTan2 > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E1, class E2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>, TinyMatrix<D1,D2,T2,E2>, FnArcTan2 >::Type_t atan2( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> V1; typedef TinyMatrix<D1,D2,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnArcTan2>::Type_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,V2,FnArcTan2> > Expr_t; typedef typename BinaryReturn<V1,V2,FnArcTan2>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnArcTan2 > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class T2, class E> struct BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnArcTan2 > { typedef TinyMatrix< D1, D2, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D1, int D2, class T1, class E, class T2> inline typename BinaryReturn< TinyMatrix<D1,D2,T1,E>, T2, FnArcTan2 >::Type_t atan2( const TinyMatrix<D1,D2,T1,E>& v1, const T2& x ) { typedef TinyMatrix<D1,D2,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<V1,T2,FnArcTan2> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D1, int D2, class T1, class T2, class E> inline typename BinaryReturn< T1, TinyMatrix<D1,D2,T2,E>, FnArcTan2 >::Type_t atan2( const T1& x, const TinyMatrix<D1,D2,T2,E>& v2 ) { typedef TinyMatrix<D1,D2,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef TinyMatrix< D1, D2, T3, BinaryTinyMatrixOp<T1,V2,FnArcTan2> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template<int D1, int D2, class T, class V1, class V2>
class TinyMatrixEngine<D1,D2,T,BinaryTinyMatrixOp<V1,V2,FnDot> >
{
public:
  enum { dimensions=2 };
  typedef T Element_t;
  typedef FnDot Op;
  typedef BinaryTinyMatrixOp<V1,V2,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef TinyMatrixEngine<D1,D2,T, BinaryTinyMatrixOp<V1,V2,Op> > This_t;
  TinyMatrixEngine(const V1& v1, const V2& v2, Op op)
    : v1_m(v1), v2_m(v2), op_m(op) {}
  TinyMatrixEngine(const V1& v1, const V2& v2)
    : v1_m(v1), v2_m(v2) {}
  TinyMatrixEngine(const This_t& x)
    : v1_m(x.v1_m), v2_m(x.v2_m), op_m(x.op_m) {}
  ~TinyMatrixEngine() {}
  template<int DD1,int DD2, class TT, class EE, int I, int J>
    friend struct TinyMatrixEngineElem;
private:
  const V1& v1_m;
  const V2& v2_m;
  Op op_m;
};
template<class T1, class T2, int I, int J, int K, int L>
struct TinyMatrixDotTinyMatrix
{
  typedef typename TinyMatrixDotTinyMatrix<T1,T2,I,J,K,L/2>::Type_t Left_t;
  typedef typename TinyMatrixDotTinyMatrix<T1,T2,I,J,K+L/2,L-L/2>::Type_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpAdd>::Type_t Type_t;
  static Type_t get(const T1& x, const T2& y)
    {
      return
        TinyMatrixDotTinyMatrix<T1,T2,I,J,K,L/2>::get(x,y) +
        TinyMatrixDotTinyMatrix<T1,T2,I,J,K+L/2,L-L/2>::get(x,y);
    }
};
template<class T1, class T2, int I, int J, int K>
struct TinyMatrixDotTinyMatrix<T1,T2,I,J,K,1>
{
  typedef typename TinyMatrixElem<T1,I,K>::Element_t Left_t;
  typedef typename TinyMatrixElem<T2,K,J>::Element_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpMultiply>::Type_t Type_t;
  static Type_t get(const T1& x, const T2& y)
    {
      return TinyMatrixElem<T1,I,K>::get(x) * TinyMatrixElem<T2,K,J>::get(y);
    }
};
template<int D1, int D2, class T, class T1, class T2, int I, int J>
struct TinyMatrixEngineElem<D1,D2,T,BinaryTinyMatrixOp<T1,T2,FnDot>, I, J >
{
  typedef BinaryTinyMatrixOp<T1,T2,FnDot> E;
  typedef TinyMatrixEngine<D1,D2,T,E> T0;
  typedef typename TinyMatrixDotTinyMatrix<T1,T2,I,J,0,T1::d1>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const T0& x)
    {
      return TinyMatrixDotTinyMatrix<T1,T2,I,J,0,T1::d2>::get(x.v1_m,x.v2_m);
    }
};
template<int D1, int D2, int D3, class T1, class T2, class E1, class E2>
struct BinaryReturn< TinyMatrix<D1,D2,T1,E1> , TinyMatrix<D2,D3,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef TinyMatrix<D1,D3,T0,Full> Type_t;
};
template<int D1, int D2, int D3, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< TinyMatrix<D1,D2,T1,E1>,TinyMatrix<D2,D3,T2,E2> , FnDot >::Type_t
dot( const TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D2,D3,T2,E2>& v2 )
{
  typedef TinyMatrix<D1,D2,T1,E1> V1;
  typedef TinyMatrix<D2,D3,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef TinyMatrix<D1,D3,T3,BinaryTinyMatrixOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<int D1, int D2, class T1, class T2, class E1, class E2>
struct BinaryReturn< TinyMatrix<D1,D2,T1,E1>,TinyMatrix<D1,D2,T2,E2> , OpEQ >
{
  typedef bool Type_t;
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
struct BinaryReturn< TinyMatrix<D1,D2,T1,E1>,TinyMatrix<D1,D2,T2,E2> , OpNE >
{
  typedef bool Type_t;
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< TinyMatrix<D1,D2,T1,E1>,TinyMatrix<D1,D2,T2,E2> , OpEQ >::Type_t
operator==(const TinyMatrix<D1,D2,T1,E1>& t1, const TinyMatrix<D1,D2,T2,E2>& t2)
{
  for (int i = 0; i < D1; i++)
    for (int j = 0; j < D2; j++)
      if (t1(i,j) != t2(i,j)) return false;
  return true;
}
template<int D1, int D2, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< TinyMatrix<D1,D2,T1,E1>,TinyMatrix<D1,D2,T2,E2> , OpNE >::Type_t
operator!=(const TinyMatrix<D1,D2,T1,E1>& t1, const TinyMatrix<D1,D2,T2,E2>& t2)
{
  return !(t1 == t2);
}
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator+=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpAddAssign,0,D1,0,D2>::apply(v1,v2,OpAddAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator+=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpAddAssign,0,D1,0,D2>:: apply(v1,v2,OpAddAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator-=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpSubtractAssign,0,D1,0,D2>::apply(v1,v2,OpSubtractAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator-=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpSubtractAssign,0,D1,0,D2>:: apply(v1,v2,OpSubtractAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator*=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpMultiplyAssign,0,D1,0,D2>::apply(v1,v2,OpMultiplyAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator*=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpMultiplyAssign,0,D1,0,D2>:: apply(v1,v2,OpMultiplyAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator/=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpDivideAssign,0,D1,0,D2>::apply(v1,v2,OpDivideAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator/=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpDivideAssign,0,D1,0,D2>:: apply(v1,v2,OpDivideAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator%=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpModAssign,0,D1,0,D2>::apply(v1,v2,OpModAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator%=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpModAssign,0,D1,0,D2>:: apply(v1,v2,OpModAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator|=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpBitwiseOrAssign,0,D1,0,D2>::apply(v1,v2,OpBitwiseOrAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator|=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpBitwiseOrAssign,0,D1,0,D2>:: apply(v1,v2,OpBitwiseOrAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator&=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpBitwiseAndAssign,0,D1,0,D2>::apply(v1,v2,OpBitwiseAndAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator&=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpBitwiseAndAssign,0,D1,0,D2>:: apply(v1,v2,OpBitwiseAndAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator^=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpBitwiseXorAssign,0,D1,0,D2>::apply(v1,v2,OpBitwiseXorAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator^=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpBitwiseXorAssign,0,D1,0,D2>:: apply(v1,v2,OpBitwiseXorAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator<<=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpLeftShiftAssign,0,D1,0,D2>::apply(v1,v2,OpLeftShiftAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator<<=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpLeftShiftAssign,0,D1,0,D2>:: apply(v1,v2,OpLeftShiftAssign()); return v1; }
template <int D1, int D2, class T1, class T2, class E1, class E2> inline const TinyMatrix<D1,D2,T1,E1>& operator>>=( TinyMatrix<D1,D2,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 ) { typedef TinyMatrix<D1,D2,T1,E1> Left_t; typedef TinyMatrix<D1,D2,T2,E2> Right_t; TinyMatrixAssign<Left_t,Right_t,OpRightShiftAssign,0,D1,0,D2>::apply(v1,v2,OpRightShiftAssign()); return v1; } template <int D1, int D2, class T1, class T2, class E1> inline const TinyMatrix<D1,D2,T1,E1>& operator>>=( TinyMatrix<D1,D2,T1,E1>& v1, const T2& v2 ) { TinyMatrixAssign<TinyMatrix<D1,D2,T1,E1>,T2,OpRightShiftAssign,0,D1,0,D2>:: apply(v1,v2,OpRightShiftAssign()); return v1; }
template<int D1, int D2, class T, class E> class TinyMatrix;
template<int D1, int D2, class T, class E> class TinyMatrixEngine;
template <class T>
void reverseBytes(T&);
template<int D1, int D2=D1, class T=double, class EngineTag=Full>
class TinyMatrix
{
public:
  enum { dimensions=2 };
  enum { d1=D1, d2=D2 };
  typedef T Element_t;
  typedef EngineTag EngineTag_t;
  typedef TinyMatrixEngine<D1,D2,T,EngineTag> Engine_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef typename Engine_t::ConstElementRef_t ConstElementRef_t;
  typedef TinyMatrix<D1,D2,T,EngineTag> This_t;
  TinyMatrix() {}
  TinyMatrix(const This_t& x) : engine_m(x.engine_m) {}
  template<int D3, int D4, class T2, class EngineTag2>
  TinyMatrix(const TinyMatrix<D3, D4, T2, EngineTag2>& x) : engine_m(x) {}
  template<class X>
  explicit TinyMatrix(const X& x) : engine_m(x) {}
  template<class X1, class X2>
    TinyMatrix(const X1& x1, const X2& x2) : engine_m(x1,x2) {}
  template<class X1, class X2, class X3>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3)
    : engine_m(x1,x2,x3) {}
  template<class X1, class X2, class X3, class X4>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4)
    : engine_m(x1,x2,x3,x4) {}
  template<class X1, class X2, class X3, class X4, class X5>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5)
    : engine_m(x1,x2,x3,x4,x5) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6)
    : engine_m(x1,x2,x3,x4,x5,x6) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7)
    : engine_m(x1,x2,x3,x4,x5,x6,x7) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7, class X8>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7, const X8& x8)
    : engine_m(x1,x2,x3,x4,x5,x6,x7,x8) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7, class X8, class X9>
    TinyMatrix(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7, const X8& x8, const X9& x9)
    : engine_m(x1,x2,x3,x4,x5,x6,x7,x8,x9) {}
  ~TinyMatrix() {}
  This_t& operator=(const This_t& x)
    {
      if ( this != &x )
        engine() = x.engine();
      return *this;
    }
  template<class V>
    This_t& operator=(const V& x)
        {
          engine() = x;
          return *this;
        }
  ConstElementRef_t operator()(int i,int j) const
    {
      return engine()(i,j);
    }
  ElementRef_t operator()(int i,int j)
    {
      return engine()(i,j);
    }
  ConstElementRef_t operator()(int i) const { return engine()(i); }
  ElementRef_t operator()(int i) { return engine()(i); }
  const Engine_t& engine() const { return engine_m; }
  Engine_t& engine() { return engine_m; }
  template<class Out>
  void print(Out &out) const;
  inline void reverseBytes() { engine_m.reverseBytes(); }
private:
  Engine_t engine_m;
};
template<int D1, int D2, class T, class EngineTag>
template<class Out>
void TinyMatrix<D1, D2, T, EngineTag>::print(Out &out) const
{
  std::ios::fmtflags incomingFormatFlags = out.flags();
  long width = out.width();
  long precision = out.precision();
  out.width(0);
  out << "(";
  for (int i = 0; i < D1; i++) {
    out << "(";
    out.flags(incomingFormatFlags);
    out.width(width);
    out.precision(precision);
    out << (*this)(i, 0);
    for (int j = 1; j < D2; j++) {
      out << " ";
      out.flags(incomingFormatFlags);
      out.width(width);
      out.precision(precision);
      out << (*this)(i, j);
    }
    out << ")";
  }
  out << ")";
}
template<int D1, int D2, class T, class E>
std::ostream &operator<<(std::ostream &out, const TinyMatrix<D1,D2,T,E> &t)
{
  t.print(out);
  return out;
}
template <int D1, int D2, class T, class E>
struct ElementProperties< TinyMatrix<D1,D2,T,E> >
  : public TrivialElementProperties< TinyMatrix<D1,D2,T,E> >
{ };
template<int D1, int D2, class T>
class TinyMatrixEngine<D1,D2,T,Full>
{
public:
  enum { dimensions=2 };
  enum { d1=D1, d2=D2 };
  typedef T Element_t;
  typedef Full EngineTag_t;
  typedef T& ElementRef_t;
  typedef const T& ConstElementRef_t;
  typedef TinyMatrixEngine<D1,D2,T,Full> This_t;
  TinyMatrixEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
  }
  TinyMatrixEngine(const TinyMatrixEngine<D1,D2,T,Full>& x)
    {
      TinyMatrixAssign<This_t,This_t,OpAssign,0,D1,0,D2>
 ::apply(*this,x,OpAssign());
    }
  template<class X>
  explicit TinyMatrixEngine(const X& x)
      {
        TinyMatrixAssign<This_t,X,OpAssign,0,D1,0,D2>::apply(*this,x,OpAssign());
      }
  template<class X1, class X2>
    TinyMatrixEngine(const X1& x1, const X2& x2)
      {
        PoomaCTAssert<(D1*D2 == 2)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
      }
  template<class X1, class X2, class X3>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3)
      {
        PoomaCTAssert<(D1*D2 == 3)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
      }
  template<class X1, class X2, class X3, class X4>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4)
      {
        PoomaCTAssert<(D1*D2 == 4)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
      }
  template<class X1, class X2, class X3, class X4, class X5>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5)
      {
        PoomaCTAssert<(D1*D2 == 5)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
        (*this)(4) = x5;
      }
  template<class X1, class X2, class X3, class X4, class X5, class X6>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6)
      {
        PoomaCTAssert<(D1*D2 == 6)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
        (*this)(4) = x5;
        (*this)(5) = x6;
      }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7)
      {
        PoomaCTAssert<(D1*D2 == 7)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
        (*this)(4) = x5;
        (*this)(5) = x6;
        (*this)(6) = x7;
      }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7, class X8>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7, const X8& x8)
      {
        PoomaCTAssert<(D1*D2 == 8)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
        (*this)(4) = x5;
        (*this)(5) = x6;
        (*this)(6) = x7;
        (*this)(7) = x8;
      }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
           class X7, class X8, class X9>
    TinyMatrixEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
           const X5& x5, const X6& x6, const X7& x7, const X8& x8, const X9& x9)
      {
        PoomaCTAssert<(D1*D2 == 9)>::test();
        (*this)(0) = x1;
        (*this)(1) = x2;
        (*this)(2) = x3;
        (*this)(3) = x4;
        (*this)(4) = x5;
        (*this)(5) = x6;
        (*this)(6) = x7;
        (*this)(7) = x8;
        (*this)(8) = x9;
      }
  ~TinyMatrixEngine() {}
  const This_t&
    operator=(const This_t& x)
      {
        if ( this != &x )
          TinyMatrixAssign<This_t,This_t,OpAssign,0,D1,0,D2>
     ::apply(*this,x,OpAssign());
        return *this;
      }
  template<class V>
    const This_t&
      operator=(const V& x)
        {
          TinyMatrixAssign<This_t,V,OpAssign,0,D1,0,D2>::apply(*this,x,OpAssign());
          return *this;
        }
  ConstElementRef_t operator()(int i,int j) const
    {
      ;
      return x_m[i+D1*j];
    }
  ElementRef_t operator()(int i,int j)
    {
      ;
      return x_m[i+D1*j];
    }
  ConstElementRef_t operator()(int i) const
    {
      ;
      return x_m[i];
    }
  ElementRef_t operator()(int i)
    {
      ;
      return x_m[i];
    }
  inline void reverseBytes()
  {
    for (int d = 0; d < D1*D2; ++d) ::reverseBytes(x_m[d]);
  }
private:
  T x_m[D1*D2];
};
template<class T, class Components> struct ComponentAccess;
template<int D1, int D2, class T, class E, int N>
struct ComponentAccess< TinyMatrix<D1, D2, T, E>, Loc<N> >
{
  typedef TinyMatrix<D1, D2, T, E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::ElementRef_t ElementRef_t;
  static inline ElementRef_t indexRef(V &t, const Loc<N> &l)
    {
      PoomaCTAssert<(N==2)>::test();
      return t(l[0].first(), l[1].first());
    }
  static inline Element_t index(const V &t, const Loc<N> &l)
    {
      PoomaCTAssert<(N==2)>::test();
      return t(l[0].first(), l[1].first());
    }
};
template<int D1, int D2, class T, int I, int J>
struct TinyMatrixElem< TinyMatrixEngine<D1,D2,T,Full> , I , J>
{
  typedef TinyMatrixEngine<D1,D2,T,Full> V;
  typedef TinyMatrixEngineElem<D1,D2,T,Full,I,J> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x); }
  static ElementRef_t get(V& x) { return TE::get(x); }
};
template<int D, class T, class E> class Tensor;
template<int D, class T, class E> class TensorEngine;
class Antisymmetric;
class Symmetric;
class Diagonal;
struct Unwritable
{
public:
  template<class T>
  void operator=(const T&) { }
  void operator=(const Unwritable&) { }
};
template<int D, class E, int I, int J>
class Writable
{
public:
  enum { value = 1 };
};
template<int D, int I, int J>
class Writable<D, Antisymmetric, I, J>
{
public:
  enum { value = (I > J) };
};
template<int D, int I, int J>
class Writable<D, Symmetric, I, J>
{
public:
  enum { value = (I >= J) };
};
template<int D, int I, int J>
class Writable<D, Diagonal, I, J>
{
public:
  enum { value = (I == J) };
};
template<int D, class T, class E, int I, int J, int B=1>
struct TensorEngineElem;
template<int D, class T, class E, int I, int J>
struct TensorEngineElem<D, T, E, I, J, 1>
{
  typedef TensorEngine<D,T,E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::CTConstElementRef_t ConstElementRef_t;
  typedef typename V::CTElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x.template getIJ<I,J>(); }
  static ElementRef_t get( V& x) { return x.template getIJ<I,J>(); }
};
template<int D, class T, class E, int I, int J>
struct TensorEngineElem<D, T, E, I, J, 0>
{
  typedef TensorEngine<D,T,E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::CTConstElementRef_t ConstElementRef_t;
  typedef Unwritable ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x.template getIJ<I,J>(); }
  static ElementRef_t get( V& x) { return Unwritable(); }
};
template<class V, int I, int J>
struct TensorElem
{
  typedef V Element_t;
  typedef const V& ConstElementRef_t;
  typedef V& ElementRef_t;
  static ConstElementRef_t get(const V& x) { return x; }
  static ElementRef_t get( V& x) { return x; }
};
template<int D, class T, class E, int I, int J>
struct TensorElem< Tensor<D,T,E> , I , J>
{
  typedef Tensor<D,T,E> V;
  typedef TensorEngineElem<D,T,E,I,J,Writable<D,E,I,J>::value> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x.engine()); }
  static ElementRef_t get(V& x) { return TE::get(x.engine()); }
};
template<int D, class T, class E, int I, int J>
struct TensorElem< TensorEngine<D,T,E> , I , J>
{
};
template<class T1, class T2, class Op, int B1, int L1, int B2, int L2>
struct TensorAssign
{
  enum { B11=B1 , L11=L1/2 , B12=B1+L1/2 , L12 = L1-L1/2 };
  enum { B21=B2 , L21=L2/2 , B22=B2+L2/2 , L22 = L2-L2/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TensorAssign<T1,T2,Op,B11,L11,B21,L21>::apply(x,y,op);
      TensorAssign<T1,T2,Op,B12,L12,B21,L21>::apply(x,y,op);
      TensorAssign<T1,T2,Op,B11,L11,B22,L22>::apply(x,y,op);
      TensorAssign<T1,T2,Op,B12,L12,B22,L22>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int L1, int B2>
struct TensorAssign<T1,T2,Op,B1,L1,B2,1>
{
  enum { B11=B1 , L11=L1/2 , B12=B1+L1/2 , L12 = L1-L1/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TensorAssign<T1,T2,Op,B11,L11,B2,1>::apply(x,y,op);
      TensorAssign<T1,T2,Op,B12,L12,B2,1>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int B2, int L2>
struct TensorAssign<T1,T2,Op,B1,1,B2,L2>
{
  enum { B21=B2 , L21=L2/2 , B22=B2+L2/2 , L22 = L2-L2/2 };
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      TensorAssign<T1,T2,Op,B1,1,B21,L21>::apply(x,y,op);
      TensorAssign<T1,T2,Op,B1,1,B22,L22>::apply(x,y,op);
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TensorAssign<T1,T2,Op,B1,1,B2,1>
{
  static void apply(T1& x, const T2& y,Op op=Op())
    {
      op(TensorElem<T1,B1,B2>::get(x), TensorElem<T2,B1,B2>::get(y));
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TensorAssign<T1,T2,Op,B1,2,B2,2>
{
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      op(TensorElem<T1,B1 ,B2 >::get(x), TensorElem<T2,B1 ,B2 >::get(y));
      op(TensorElem<T1,B1+1,B2 >::get(x), TensorElem<T2,B1+1,B2 >::get(y));
      op(TensorElem<T1,B1 ,B2+1>::get(x), TensorElem<T2,B1 ,B2+1>::get(y));
      op(TensorElem<T1,B1+1,B2+1>::get(x), TensorElem<T2,B1+1,B2+1>::get(y));
    }
};
template<class T1, class T2, class Op, int B1, int B2>
struct TensorAssign<T1,T2,Op,B1,3,B2,3>
{
  static void apply(T1& x, const T2& y, Op op=Op())
    {
      op(TensorElem<T1,B1 ,B2 >::get(x), TensorElem<T2,B1 ,B2 >::get(y));
      op(TensorElem<T1,B1+1,B2 >::get(x), TensorElem<T2,B1+1,B2 >::get(y));
      op(TensorElem<T1,B1+2,B2 >::get(x), TensorElem<T2,B1+2,B2 >::get(y));
      op(TensorElem<T1,B1 ,B2+1>::get(x), TensorElem<T2,B1 ,B2+1>::get(y));
      op(TensorElem<T1,B1+1,B2+1>::get(x), TensorElem<T2,B1+1,B2+1>::get(y));
      op(TensorElem<T1,B1+2,B2+1>::get(x), TensorElem<T2,B1+2,B2+1>::get(y));
      op(TensorElem<T1,B1 ,B2+2>::get(x), TensorElem<T2,B1 ,B2+2>::get(y));
      op(TensorElem<T1,B1+1,B2+2>::get(x), TensorElem<T2,B1+1,B2+2>::get(y));
      op(TensorElem<T1,B1+2,B2+2>::get(x), TensorElem<T2,B1+2,B2+2>::get(y));
    }
};
template<class V1, class V2, class Op>
class BinaryTensorOp;
template<int D, class T, class V1, class V2, class Op>
class TensorEngine<D,T,BinaryTensorOp<V1,V2,Op> >
{
public:
  enum { dimensions=2 };
  typedef T Element_t;
  typedef BinaryTensorOp<V1,V2,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef TensorEngine<D,T, BinaryTensorOp<V1,V2,Op> > This_t;
  TensorEngine(const V1& v1, const V2& v2)
    : v1_m(v1), v2_m(v2) {}
  Element_t operator()(int i, int j) const
  {
    return Op()(v1_m(i,j), v2_m(i,j));
  }
  template<int DD, class TT, class EE, int I, int J, int BB>
  friend struct TensorEngineElem;
private:
  const V1& v1_m;
  const V2& v2_m;
};
template<int D, class T, class V1, class V2, class Op, int I, int J>
struct TensorEngineElem<D,T,BinaryTensorOp<V1,V2,Op>, I, J, 1>
{
  typedef TensorEngine<D,T,BinaryTensorOp<V1,V2,Op> > V;
  typedef typename TensorElem<V1,I,J>::Element_t T1;
  typedef typename TensorElem<V2,I,J>::Element_t T2;
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(
        TensorElem<V1,I,J>::get(x.v1_m),
        TensorElem<V2,I,J>::get(x.v2_m));
    }
};
template<class V1, class Op>
class UnaryTensorOp;
template<int D, class T, class V1, class Op>
class TensorEngine<D,T,UnaryTensorOp<V1,Op> >
{
public:
  enum { dimensions=2 };
  typedef T Element_t;
  typedef UnaryTensorOp<V1,Op> EngineTag_t;
  typedef T ConstElementRef_t;
  typedef T ElementRef_t;
  typedef TensorEngine<D,T, UnaryTensorOp<V1,Op> > This_t;
  explicit TensorEngine(const V1& v1)
    : v1_m(v1) {}
  Element_t operator()(int i, int j) const
  {
    return Op()(v1_m(i, j));
  }
  template<int DD, class TT, class EE, int I, int J, int BB>
  friend struct TensorEngineElem;
private:
  const V1& v1_m;
};
template<int D, class T, class V1, class Op, int I, int J>
struct TensorEngineElem<D,T,UnaryTensorOp<V1,Op>, I, J, 1>
{
  typedef TensorEngine<D,T,UnaryTensorOp<V1,Op> > V;
  typedef typename TensorElem<V1,I,J>::Element_t T1;
  typedef typename UnaryReturn<T1,Op>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const V& x)
    {
      return Op()(TensorElem<V1,I,J>::get(x.v1_m));
    }
};
template<int D, class T, class E> class Tensor;
class Full;
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnArcCos > { typedef Tensor< D, typename UnaryReturn<T,FnArcCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnArcCos >::Type_t acos( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnArcCos>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnArcCos> > Expr_t; typedef typename UnaryReturn<V1,FnArcCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnArcSin > { typedef Tensor< D, typename UnaryReturn<T,FnArcSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnArcSin >::Type_t asin( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnArcSin>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnArcSin> > Expr_t; typedef typename UnaryReturn<V1,FnArcSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnArcTan > { typedef Tensor< D, typename UnaryReturn<T,FnArcTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnArcTan >::Type_t atan( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnArcTan>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnArcTan> > Expr_t; typedef typename UnaryReturn<V1,FnArcTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnCeil > { typedef Tensor< D, typename UnaryReturn<T,FnCeil>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnCeil >::Type_t ceil( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnCeil>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnCeil> > Expr_t; typedef typename UnaryReturn<V1,FnCeil>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnCos > { typedef Tensor< D, typename UnaryReturn<T,FnCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnCos >::Type_t cos( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnCos>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnCos> > Expr_t; typedef typename UnaryReturn<V1,FnCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnHypCos > { typedef Tensor< D, typename UnaryReturn<T,FnHypCos>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnHypCos >::Type_t cosh( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnHypCos>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnHypCos> > Expr_t; typedef typename UnaryReturn<V1,FnHypCos>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnExp > { typedef Tensor< D, typename UnaryReturn<T,FnExp>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnExp >::Type_t exp( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnExp>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnExp> > Expr_t; typedef typename UnaryReturn<V1,FnExp>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnFabs > { typedef Tensor< D, typename UnaryReturn<T,FnFabs>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnFabs >::Type_t fabs( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnFabs>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnFabs> > Expr_t; typedef typename UnaryReturn<V1,FnFabs>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnFloor > { typedef Tensor< D, typename UnaryReturn<T,FnFloor>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnFloor >::Type_t floor( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnFloor>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnFloor> > Expr_t; typedef typename UnaryReturn<V1,FnFloor>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnLog > { typedef Tensor< D, typename UnaryReturn<T,FnLog>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnLog >::Type_t log( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnLog>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnLog> > Expr_t; typedef typename UnaryReturn<V1,FnLog>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnLog10 > { typedef Tensor< D, typename UnaryReturn<T,FnLog10>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnLog10 >::Type_t log10( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnLog10>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnLog10> > Expr_t; typedef typename UnaryReturn<V1,FnLog10>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnSin > { typedef Tensor< D, typename UnaryReturn<T,FnSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnSin >::Type_t sin( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnSin>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnSin> > Expr_t; typedef typename UnaryReturn<V1,FnSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnHypSin > { typedef Tensor< D, typename UnaryReturn<T,FnHypSin>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnHypSin >::Type_t sinh( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnHypSin>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnHypSin> > Expr_t; typedef typename UnaryReturn<V1,FnHypSin>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnSqrt > { typedef Tensor< D, typename UnaryReturn<T,FnSqrt>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnSqrt >::Type_t sqrt( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnSqrt>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnSqrt> > Expr_t; typedef typename UnaryReturn<V1,FnSqrt>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnTan > { typedef Tensor< D, typename UnaryReturn<T,FnTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnTan >::Type_t tan( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnTan>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnTan> > Expr_t; typedef typename UnaryReturn<V1,FnTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, FnHypTan > { typedef Tensor< D, typename UnaryReturn<T,FnHypTan>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, FnHypTan >::Type_t tanh( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,FnHypTan>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,FnHypTan> > Expr_t; typedef typename UnaryReturn<V1,FnHypTan>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, OpUnaryMinus > { typedef Tensor< D, typename UnaryReturn<T,OpUnaryMinus>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, OpUnaryMinus >::Type_t operator-( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,OpUnaryMinus>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,OpUnaryMinus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryMinus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, OpUnaryPlus > { typedef Tensor< D, typename UnaryReturn<T,OpUnaryPlus>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, OpUnaryPlus >::Type_t operator+( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,OpUnaryPlus>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,OpUnaryPlus> > Expr_t; typedef typename UnaryReturn<V1,OpUnaryPlus>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T, class E> struct UnaryReturn< Tensor<D,T,E>, OpBitwiseNot > { typedef Tensor< D, typename UnaryReturn<T,OpBitwiseNot>::Type_t, E > Type_t; }; template <int D, class T, class E> inline typename UnaryReturn< Tensor<D,T,E>, OpBitwiseNot >::Type_t operator~( const Tensor<D,T,E>& v1 ) { typedef Tensor<D,T,E> V1; typedef typename UnaryReturn<T,OpBitwiseNot>::Type_t T3; typedef Tensor< D, T3, UnaryTensorOp<V1,OpBitwiseNot> > Expr_t; typedef typename UnaryReturn<V1,OpBitwiseNot>::Type_t Return_t; return Return_t( Expr_t(v1) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpAdd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpAdd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpAdd >::Type_t operator+( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpAdd>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpAdd> > Expr_t; typedef typename BinaryReturn<V1,V2,OpAdd>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpAdd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpAdd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpAdd>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpAdd >::Type_t operator+( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpAdd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpAdd >::Type_t operator+( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpAdd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpAdd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpSubtract > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpSubtract > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpSubtract >::Type_t operator-( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpSubtract>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpSubtract> > Expr_t; typedef typename BinaryReturn<V1,V2,OpSubtract>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpSubtract > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpSubtract > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpSubtract>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpSubtract >::Type_t operator-( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpSubtract> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpSubtract >::Type_t operator-( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpSubtract>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpSubtract> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpMultiply > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpMultiply > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpMultiply >::Type_t operator*( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpMultiply> > Expr_t; typedef typename BinaryReturn<V1,V2,OpMultiply>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpMultiply > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpMultiply > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMultiply>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpMultiply >::Type_t operator*( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpMultiply> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpMultiply >::Type_t operator*( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMultiply>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpMultiply> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpDivide > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpDivide > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpDivide >::Type_t operator/( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpDivide>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpDivide> > Expr_t; typedef typename BinaryReturn<V1,V2,OpDivide>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpDivide > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpDivide > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpDivide>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpDivide >::Type_t operator/( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpDivide> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpDivide >::Type_t operator/( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpDivide>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpDivide> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpMod > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpMod > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpMod >::Type_t operator%( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpMod>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpMod> > Expr_t; typedef typename BinaryReturn<V1,V2,OpMod>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpMod > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpMod > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpMod>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpMod >::Type_t operator%( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpMod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpMod >::Type_t operator%( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpMod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpMod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpBitwiseAnd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseAnd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseAnd >::Type_t operator&( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpBitwiseAnd> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseAnd>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseAnd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseAnd > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseAnd>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseAnd >::Type_t operator&( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseAnd >::Type_t operator&( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseAnd>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpBitwiseAnd> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpBitwiseOr > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseOr > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseOr >::Type_t operator|( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpBitwiseOr> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseOr>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseOr > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseOr > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseOr>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseOr >::Type_t operator|( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseOr >::Type_t operator|( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseOr>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpBitwiseOr> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, OpBitwiseXor > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseXor > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpBitwiseXor >::Type_t operator^( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,OpBitwiseXor> > Expr_t; typedef typename BinaryReturn<V1,V2,OpBitwiseXor>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseXor > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseXor > { typedef Tensor< D, typename BinaryReturn<T1,T2,OpBitwiseXor>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, OpBitwiseXor >::Type_t operator^( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, OpBitwiseXor >::Type_t operator^( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,OpBitwiseXor>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,OpBitwiseXor> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, FnLdexp > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnLdexp > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnLdexp >::Type_t ldexp( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnLdexp>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,FnLdexp> > Expr_t; typedef typename BinaryReturn<V1,V2,FnLdexp>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, FnLdexp > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, FnLdexp > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnLdexp>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, FnLdexp >::Type_t ldexp( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,FnLdexp> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, FnLdexp >::Type_t ldexp( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnLdexp>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,FnLdexp> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, FnPow > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnPow > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnPow >::Type_t pow( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnPow>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,FnPow> > Expr_t; typedef typename BinaryReturn<V1,V2,FnPow>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, FnPow > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, FnPow > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnPow>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, FnPow >::Type_t pow( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,FnPow> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, FnPow >::Type_t pow( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnPow>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,FnPow> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, FnFmod > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnFmod > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnFmod >::Type_t fmod( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnFmod>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,FnFmod> > Expr_t; typedef typename BinaryReturn<V1,V2,FnFmod>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, FnFmod > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, FnFmod > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnFmod>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, FnFmod >::Type_t fmod( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,FnFmod> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, FnFmod >::Type_t fmod( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnFmod>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,FnFmod> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, Tensor<D,T2,E>, FnArcTan2 > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E1, class E2> struct BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnArcTan2 > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, Full > Type_t; }; template <int D, class T1, class T2, class E1, class E2> inline typename BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, FnArcTan2 >::Type_t atan2( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 ) { typedef Tensor<D,T1,E1> V1; typedef Tensor<D,T2,E2> V2; typedef typename BinaryReturn<T1,T2,FnArcTan2>::Type_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,V2,FnArcTan2> > Expr_t; typedef typename BinaryReturn<V1,V2,FnArcTan2>::Type_t Return_t; return Return_t( Expr_t(v1,v2) ); } template <int D, class T1, class T2, class E> struct BinaryReturn< Tensor<D,T1,E>, T2, FnArcTan2 > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class T2, class E> struct BinaryReturn< T1, Tensor<D,T2,E>, FnArcTan2 > { typedef Tensor< D, typename BinaryReturn<T1,T2,FnArcTan2>::Type_t, E > Type_t; }; template <int D, class T1, class E, class T2> inline typename BinaryReturn< Tensor<D,T1,E>, T2, FnArcTan2 >::Type_t atan2( const Tensor<D,T1,E>& v1, const T2& x ) { typedef Tensor<D,T1,E> V1; typedef typename BinaryReturn<V1,T2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<V1,T2,FnArcTan2> > Expr_t; return Return_t( Expr_t(v1,x) ); } template <int D, class T1, class T2, class E> inline typename BinaryReturn< T1, Tensor<D,T2,E>, FnArcTan2 >::Type_t atan2( const T1& x, const Tensor<D,T2,E>& v2 ) { typedef Tensor<D,T2,E> V2; typedef typename BinaryReturn<T1,V2,FnArcTan2>::Type_t Return_t; typedef typename Return_t::Element_t T3; typedef Tensor< D, T3, BinaryTensorOp<T1,V2,FnArcTan2> > Expr_t; return Return_t( Expr_t(x,v2) ); }
template<class T1, class T2, int I, int J, int K, int L>
struct TensorDotTensor
{
  typedef typename TensorDotTensor<T1,T2,I,J,K,L/2>::Type_t Left_t;
  typedef typename TensorDotTensor<T1,T2,I,J,K+L/2,L-L/2>::Type_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpAdd>::Type_t Type_t;
  static Type_t get(const T1& x, const T2& y)
    {
      return
        TensorDotTensor<T1,T2,I,J,K,L/2>::get(x,y) +
        TensorDotTensor<T1,T2,I,J,K+L/2,L-L/2>::get(x,y);
    }
};
template<class T1, class T2, int I, int J, int K>
struct TensorDotTensor<T1,T2,I,J,K,1>
{
  typedef typename TensorElem<T1,I,K>::Element_t Left_t;
  typedef typename TensorElem<T2,K,J>::Element_t Right_t;
  typedef typename BinaryReturn<Left_t,Right_t,OpMultiply>::Type_t Type_t;
  static Type_t get(const T1& x, const T2& y)
    {
      return TensorElem<T1,I,K>::get(x) * TensorElem<T2,K,J>::get(y);
    }
};
template<int D, class T, class T1, class T2, int I, int J>
struct TensorEngineElem<D,T,BinaryTensorOp<T1,T2,FnDot>, I, J,
  1>
{
  typedef BinaryTensorOp<T1,T2,FnDot> E;
  typedef TensorEngine<D,T,E> T0;
  typedef typename TensorDotTensor<T1,T2,I,J,0,T1::d>::Type_t Element_t;
  typedef Element_t ElementRef_t;
  typedef Element_t ConstElementRef_t;
  static Element_t get(const T0& x)
    {
      return TensorDotTensor<T1,T2,I,J,0,T1::d>::get(x.v1_m,x.v2_m);
    }
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Tensor<D,T1,E1> , Tensor<D,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef Tensor<D,T0,Full> Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< Tensor<D,T1,E1>,Tensor<D,T2,E2> , FnDot >::Type_t
dot( const Tensor<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 )
{
  typedef Tensor<D,T1,E1> V1;
  typedef Tensor<D,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef Tensor<D,T3,BinaryTensorOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<int D, class T, class E>
struct UnaryReturn< Tensor<D,T,E> , FnTrace >
{
  typedef T Type_t;
};
template<int D, class T, class E>
inline T
trace(const Tensor<D,T,E>& t)
{
  T result(0.0);
  for (int d = 0; d < D; d++) {
    result += t(d,d);
  }
  return result;
}
template<int D, class T>
inline T
trace(const Tensor<D,T,Diagonal>& t)
{
  T result(0.0);
  for (int d = 0; d < D; d++) {
    result += t(d);
  }
  return result;
}
template<int D, class T>
inline T
trace(const Tensor<D,T,Antisymmetric>& t)
{
  return T(0.0);
}
template<int D, class T, class E>
struct UnaryReturn< Tensor<D,T,E> , FnDet >
{
  typedef T Type_t;
};
template<int D, class T, class E>
inline T
det(const Tensor<D,T,E>& t)
{
  if (__builtin_expect(!!(D<4), true)) {} else Pooma::toss_cookies("Tensor det() function not implemented for D>3!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Tiny/TensorOperators.h", 405);
  return T(-999999.999999);
}
template<class T, class E>
inline T
det(const Tensor<3,T,E>& t)
{
  T result;
  result =
    t(0,0)*(t(1,1)*t(2,2) - t(1,2)*t(2,1)) +
    t(0,1)*(t(1,2)*t(2,0) - t(1,0)*t(2,2)) +
    t(0,2)*(t(1,0)*t(2,1) - t(1,1)*t(2,0));
  return result;
}
template<class T, class E>
inline T
det(const Tensor<2,T,E>& t)
{
  T result;
  result = t(0,0)*t(1,1) - t(0,1)*t(1,0);
  return result;
}
template<class T, class E>
inline T
det(const Tensor<1,T,E>& t)
{
  T result = t(0,0);
  return result;
}
template<class T>
inline T
det(const Tensor<3,T,Diagonal>& t)
{
  T result;
  result = t(0)*t(1)*t(2);
  return result;
}
template<class T>
inline T
det(const Tensor<2,T,Diagonal>& t)
{
  T result;
  result = t(0)*t(1);
  return result;
}
template<class T>
inline T
det(const Tensor<1,T,Diagonal>& t)
{
  T result = t(0);
  return result;
}
template<class T>
inline T
det(const Tensor<3,T,Antisymmetric>& t)
{
  return T(0.0);
}
template<class T>
inline T
det(const Tensor<2,T,Antisymmetric>& t)
{
  T result;
  result = t(0)*t(0);
  return result;
}
template<class T>
inline T
det(const Tensor<1,T,Antisymmetric>& t)
{
  return T(0.0);
}
template<int D, class T, class E>
struct UnaryReturn< Tensor<D,T,E> , FnTranspose >
{
  typedef Tensor<D,T,E> Type_t;
};
template<int D, class T, class E>
inline Tensor<D,T,E>
transpose(const Tensor<D,T,E>& t)
{
  Tensor<D,T,E> result;
  for (int i = 0; i < D; i++) {
    for (int j = 0; j < D; j++) {
      result(i,j) = t(j,i);
    }
  }
  return result;
}
template<int D, class T>
inline Tensor<D,T,Symmetric>
transpose(const Tensor<D,T,Symmetric>& t)
{
  Tensor<D,T,Symmetric> result;
  result = t;
  return result;
}
template<int D, class T>
inline Tensor<D,T,Antisymmetric>
transpose(const Tensor<D,T,Antisymmetric>& t)
{
  Tensor<D,T,Antisymmetric> result;
  result = -t;
  return result;
}
template<int D, class T>
inline Tensor<D,T,Diagonal>
transpose(const Tensor<D,T,Diagonal>& t)
{
  Tensor<D,T,Diagonal> result;
  result = t;
  return result;
}
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Tensor<D,T1,E1>,Tensor<D,T2,E2> , OpEQ >
{
  typedef bool Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Tensor<D,T1,E1>,Tensor<D,T2,E2> , OpNE >
{
  typedef bool Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpEQ >::Type_t
operator==(const Tensor<D,T1,E1>& t1, const Tensor<D,T2,E2>& t2)
{
  for (int i = 0; i < D; i++)
    for (int j = 0; j < D; j++)
      if (t1(i,j) != t2(i,j)) return false;
  return true;
}
template<int D, class T1, class T2, class E1, class E2>
inline typename
BinaryReturn< Tensor<D,T1,E1>, Tensor<D,T2,E2>, OpNE >::Type_t
operator!=(const Tensor<D,T1,E1>& t1, const Tensor<D,T2,E2>& t2)
{
  return !(t1 == t2);
}
template <int D, class T1, class T2, class E1> inline Tensor<D,T1,E1>& operator+=( Tensor<D,T1,E1>& v1, const Tensor<D,T2,E1>& v2 ) { typedef typename Tensor<D,T1,E1>::Engine_t Left_t; typedef typename Tensor<D,T2,E1>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Symmetric>& operator+=( Tensor<D,T1,Symmetric>& v1, const Tensor<D,T2,Symmetric>& v2 ) { typedef typename Tensor<D,T1,Symmetric>::Engine_t Left_t; typedef typename Tensor<D,T2,Symmetric>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Antisymmetric>& operator+=( Tensor<D,T1,Antisymmetric>& v1, const Tensor<D,T2,Antisymmetric>& v2 ) { typedef typename Tensor<D,T1,Antisymmetric>::Engine_t Left_t; typedef typename Tensor<D,T2,Antisymmetric>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Diagonal>& operator+=( Tensor<D,T1,Diagonal>& v1, const Tensor<D,T2,Diagonal>& v2 ) { typedef typename Tensor<D,T1,Diagonal>::Engine_t Left_t; typedef typename Tensor<D,T2,Diagonal>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Tensor<D,T1,E1>& operator+=( Tensor<D,T1,E1>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,E1>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Symmetric>& operator+=( Tensor<D,T1,Symmetric>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Symmetric>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Antisymmetric>& operator+=( Tensor<D,T1,Antisymmetric>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Antisymmetric>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Diagonal>& operator+=( Tensor<D,T1,Diagonal>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Diagonal>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpAddAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpAddAssign()); return v1; }
template <int D, class T1, class T2, class E1> inline Tensor<D,T1,E1>& operator-=( Tensor<D,T1,E1>& v1, const Tensor<D,T2,E1>& v2 ) { typedef typename Tensor<D,T1,E1>::Engine_t Left_t; typedef typename Tensor<D,T2,E1>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Symmetric>& operator-=( Tensor<D,T1,Symmetric>& v1, const Tensor<D,T2,Symmetric>& v2 ) { typedef typename Tensor<D,T1,Symmetric>::Engine_t Left_t; typedef typename Tensor<D,T2,Symmetric>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Antisymmetric>& operator-=( Tensor<D,T1,Antisymmetric>& v1, const Tensor<D,T2,Antisymmetric>& v2 ) { typedef typename Tensor<D,T1,Antisymmetric>::Engine_t Left_t; typedef typename Tensor<D,T2,Antisymmetric>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Diagonal>& operator-=( Tensor<D,T1,Diagonal>& v1, const Tensor<D,T2,Diagonal>& v2 ) { typedef typename Tensor<D,T1,Diagonal>::Engine_t Left_t; typedef typename Tensor<D,T2,Diagonal>::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2, class E1> inline Tensor<D,T1,E1>& operator-=( Tensor<D,T1,E1>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,E1>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Symmetric>& operator-=( Tensor<D,T1,Symmetric>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Symmetric>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Antisymmetric>& operator-=( Tensor<D,T1,Antisymmetric>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Antisymmetric>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; } template <int D, class T1, class T2> inline Tensor<D,T1,Diagonal>& operator-=( Tensor<D,T1,Diagonal>& v1, const T2& v2 ) { typedef typename Tensor<D,T1,Diagonal>::Engine_t Left_t; typedef typename T2::Engine_t Right_t; TensorAssign<Left_t,Right_t,OpSubtractAssign,0,D,0,D>:: apply(v1.engine(),v2.engine(),OpSubtractAssign()); return v1; }
template<int D, class T, class EngineTag> class Tensor;
template<int D, class T, class EngineTag> class TensorEngine;
template <class T>
void reverseBytes(T&);
class Full;
class Antisymmetric;
class Symmetric;
class Diagonal;
template<int D, class EngineTag>
class TensorStorageSize {};
template<int D>
class TensorStorageSize<D, Full>
{
public:
  enum { Size = D*D };
};
template<int D>
class TensorStorageSize<D, Antisymmetric>
{
public:
  enum { Size = (D*D - D)/2 + 1/D };
};
template<int D>
class TensorStorageSize<D, Symmetric>
{
public:
  enum { Size = (D*D - D)/2 + D };
};
template<int D>
class TensorStorageSize<D, Diagonal>
{
public:
  enum { Size = D };
};
template<int D, class T=double, class EngineTag=Full>
class Tensor
{
public:
  enum { dimensions=2 };
  enum { d=D };
  typedef T Element_t;
  typedef EngineTag EngineTag_t;
  typedef TensorEngine<D,T,EngineTag> Engine_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef typename Engine_t::ConstElementRef_t ConstElementRef_t;
  typedef Tensor<D,T,EngineTag> This_t;
  Tensor() {}
  Tensor(const This_t& x) : engine_m(x.engine_m) {}
  template<int D2, class T2, class EngineTag2>
  Tensor(const Tensor<D2, T2, EngineTag2>& x) : engine_m(x) {}
  template<class X>
  explicit Tensor(const X& x) : engine_m(x) {}
  template<class X1, class X2>
  Tensor(const X1& x, const X2& y) : engine_m(x,y) {}
  template<class X1, class X2, class X3>
  Tensor(const X1& x, const X2& y, const X3& z) : engine_m(x,y,z) {}
  template<class X1, class X2, class X3, class X4>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4)
    : engine_m(x1,x2,x3,x4) {}
  template<class X1, class X2, class X3, class X4, class X5>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
         const X5& x5)
    : engine_m(x1,x2,x3,x4,x5) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
         const X5& x5, const X6& x6)
    : engine_m(x1,x2,x3,x4,x5,x6) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
    class X7>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
         const X5& x5, const X6& x6, const X7& x7)
    : engine_m(x1,x2,x3,x4,x5,x6,x7) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
    class X7, class X8>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
         const X5& x5, const X6& x6, const X7& x7, const X8& x8)
    : engine_m(x1,x2,x3,x4,x5,x6,x7,x8) {}
  template<class X1, class X2, class X3, class X4, class X5, class X6,
    class X7, class X8, class X9>
  Tensor(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
         const X5& x5, const X6& x6, const X7& x7, const X8& x8, const X9& x9)
    : engine_m(x1,x2,x3,x4,x5,x6,x7,x8,x9) {}
  ~Tensor() {}
  This_t& operator=(const This_t& x)
  {
    if ( this != &x )
      engine() = x.engine();
    return *this;
  }
  template<class T1, class EngineTag1>
  This_t& operator=(const Tensor<d,T1,EngineTag1> &x)
  {
    engine() = x.engine();
    return *this;
  }
  template<class V>
  This_t&
  operator=(const V& x)
  {
    engine() = x;
    return *this;
  }
  ConstElementRef_t operator()(int i, int j) const
  {
    return engine()(i,j);
  }
  ElementRef_t operator()(int i, int j)
  {
    return engine()(i,j);
  }
  ConstElementRef_t operator()(int i) const { return engine()(i); }
  ElementRef_t operator()(int i) { return engine()(i); }
  const Engine_t& engine() const { return engine_m; }
  Engine_t& engine() { return engine_m; }
  template<class Out>
  void print(Out &out) const;
  inline void reverseBytes() { engine_m.reverseBytes(); }
private:
  Engine_t engine_m;
};
template<int D, class T, class EngineTag>
template<class Out>
void Tensor<D, T, EngineTag>::print(Out &out) const
{
  std::ios::fmtflags incomingFormatFlags = out.flags();
  long width = out.width();
  long precision = out.precision();
  out.width(0);
  out << "(";
  for (int i = 0; i < D; i++) {
    out << "(";
    out.flags(incomingFormatFlags);
    out.width(width);
    out.precision(precision);
    out << (*this)(i,0);
    for (int j = 1; j < D; j++) {
      out << " ";
      out.flags(incomingFormatFlags);
      out.width(width);
      out.precision(precision);
      out << (*this)(i,j);
    }
    out << ")";
  }
  out << ")";
}
template<int D, class T, class E>
std::ostream &operator<<(std::ostream &out, const Tensor<D,T,E> &t)
{
  t.print(out);
  return out;
}
template <int D, class T, class E>
struct ElementProperties< Tensor<D,T,E> >
  : public TrivialElementProperties< Tensor<D,T,E> >
{ };
template<int D, class T>
class TensorEngine<D, T, Full>
{
public:
  enum { dimensions=2 };
  enum { d=D };
  typedef T Element_t;
  typedef Full EngineTag_t;
  typedef T& ElementRef_t;
  typedef const T& ConstElementRef_t;
  typedef T& CTElementRef_t;
  typedef const T& CTConstElementRef_t;
  typedef TensorEngine<D,T,Full> This_t;
  TensorEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
  }
  TensorEngine(const TensorEngine<D,T,Full>& x)
  {
    TensorAssign<This_t,This_t,OpAssign,0,D,0,D>
      ::apply(*this,x,OpAssign());
  }
  template<class X>
  explicit TensorEngine(const X& x)
  {
    TensorAssign<This_t,X,OpAssign,0,D,0,D>::apply(*this,x,OpAssign());
  }
  explicit TensorEngine(const T& x)
  {
    for (int i = 0 ; i < D*D ; i++) {
      (*this)(i) = x;
    }
  }
  template<class X1, class X2, class X3, class X4>
  TensorEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4)
  {
    PoomaCTAssert<(D == 2)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
    class X7, class X8, class X9>
  TensorEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
               const X5& x5, const X6& x6, const X7& x7, const X8& x8,
               const X9& x9)
  {
    PoomaCTAssert<(D == 3)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
    (*this)(5) = x6;
    (*this)(6) = x7;
    (*this)(7) = x8;
    (*this)(8) = x9;
  }
  ~TensorEngine() {}
  This_t&
  operator=(const This_t& x)
  {
    if (this != &x) {
      TensorAssign<This_t,This_t,OpAssign,0,D,0,D>::apply(*this,x,OpAssign());
    }
    return *this;
  }
  template<class V>
  This_t&
  operator=(const V& x)
  {
    TensorAssign<This_t,V,OpAssign,0,D,0,D>::apply(*this,x,OpAssign());
    return *this;
  }
  template<int I, int J>
  CTConstElementRef_t getIJ() const
  {
    PoomaCTAssert<((I >= 0) && (I < D) && (J >= 0) && (J < D))>::test();
    return x_m[I + D*J];
  }
  template<int I, int J>
  CTElementRef_t getIJ()
  {
    PoomaCTAssert<((I >= 0) && (I < D) && (J >= 0) && (J < D))>::test();
    return x_m[I + D*J];
  }
  ConstElementRef_t operator()(int i,int j) const
  {
    ;
    return x_m[i + D*j];
  }
  ElementRef_t operator()(int i,int j)
  {
    ;
    return x_m[i + D*j];
  }
  ConstElementRef_t operator()(int i) const
  {
    ;
    return x_m[i];
  }
  ElementRef_t operator()(int i)
  {
    ;
    return x_m[i];
  }
  const T* data() const{
    return (const T*) &x_m[0];
  }
  T* data(){
    return (T*) &x_m[0];
  }
  inline void reverseBytes()
  {
    const int sz = TensorStorageSize<d, EngineTag_t>::Size;
    for (int i = 0; i < sz; ++i)
      ::reverseBytes(x_m[i]);
  }
private:
  T x_m[TensorStorageSize<d, EngineTag_t>::Size];
};
template<int D, class T>
class TensorEngine<D, T, Antisymmetric>
{
public:
  enum { dimensions=2 };
  enum { d=D };
  typedef T Element_t;
  typedef Antisymmetric EngineTag_t;
  class AssignProxy {
  public:
    AssignProxy(Element_t &elem, int where)
      : elem_m(elem), where_m(where) { }
    AssignProxy(const AssignProxy &model)
      // LLVM: Initialize where_m with model.where_m
      : elem_m(model.elem_m), where_m(model.where_m) { }
    AssignProxy &operator=(const AssignProxy &a) const
    {
      ;
      elem_m = where_m < 0 ? -a.elem_m : a.elem_m;
      return const_cast<AssignProxy &>(*this);
    }
    AssignProxy &operator=(const Element_t &e) const
    {
      ;
      elem_m = where_m < 0 ? -e : e;
      return const_cast<AssignProxy &>(*this);
    }
    operator Element_t() const
    {
      return (where_m < 0 ? -elem_m : elem_m);
    }
  private:
    // LLVM: Remove 'mutable' keyword from elem_m.
    Element_t &elem_m;
    mutable int where_m;
  };
  typedef AssignProxy ElementRef_t;
  typedef T ConstElementRef_t;
  typedef T& CTElementRef_t;
  typedef T CTConstElementRef_t;
  typedef TensorEngine<d,T,Antisymmetric> This_t;
  TensorEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
  }
  TensorEngine(const TensorEngine<d,T,Antisymmetric> &x)
  {
    TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
  }
  template<class X>
  explicit TensorEngine(const X& x)
  {
    TensorAssign<This_t,X,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
  }
  explicit TensorEngine(const T &x) {
    for (int i = 0; i < TensorStorageSize<d, EngineTag_t>::Size; i++) {
      x_m[i] = x;
    }
  }
  template<class X1, class X2, class X3>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3)
  {
    PoomaCTAssert<(D == 3)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  TensorEngine(const X1& x1, const X2& x2, const X3& x3, const X4& x4,
               const X5& x5, const X6& x6)
  {
    PoomaCTAssert<(D == 4)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
    (*this)(5) = x6;
  }
  ~TensorEngine() {}
  This_t&
  operator=(const This_t& x)
  {
    if (this != &x) {
      TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
        apply(*this,x,OpAssign());
    }
    return *this;
  }
  template<class V>
  This_t&
  operator=(const V& x)
  {
    TensorAssign<This_t,V,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
    return *this;
  }
  template<int I, int J>
  CTConstElementRef_t getIJ() const
  {
    PoomaCTAssert<((I >= 0) && (I < d) && (J >= 0) && (J < d))>::test();
    if (I == J) {
      return This_t::Zero;
    } else {
      int lo = I < J ? I : J;
      int hi = I > J ? I : J;
      int symmetrySign = I < J ? -1 : 1;
      return symmetrySign * x_m[((hi - 1)*hi/2) + lo];
    }
  }
  template<int I, int J>
  CTElementRef_t getIJ()
  {
    PoomaCTAssert<((I >= 0) && (I < d) && (J >= 0) && (J < d) && (I > J))>::test();
    return x_m[((I - 1)*I/2) + J];
  }
  ConstElementRef_t operator()(int i,int j) const
  {
    ;
    if (i == j) {
      return This_t::Zero;
    } else if (i < j) {
      return -x_m[((j - 1)*j/2) + i];
    } else {
      return x_m[((i - 1)*i/2) + j];
    }
  }
  ElementRef_t operator()(int i,int j)
  {
    ;
    if (i == j) {
      return AssignProxy(This_t::Zero, 0);
    } else {
      int lo = i < j ? i : j;
      int hi = i > j ? i : j;
      return AssignProxy(x_m[((hi-1)*hi/2) + lo], i - j);
    }
  }
  ConstElementRef_t operator()(int i) const
  {
    ;
    return x_m[i];
  }
  ElementRef_t operator()(int i)
  {
    ;
    return AssignProxy(x_m[i], 1);
  }
  const T* data() const{
    return (const T*) &x_m[0];
  }
  T* data(){
    return (T*) &x_m[0];
  }
  inline void reverseBytes()
  {
    const int sz = TensorStorageSize<d, EngineTag_t>::Size;
    for (int i = 0; i < sz; ++i)
      ::reverseBytes(x_m[i]);
  }
private:
  T x_m[TensorStorageSize<d, EngineTag_t>::Size];
  static T Zero;
};
template<int D, class T>
T TensorEngine<D,T,Antisymmetric>::Zero = 0.0;
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<1,T,Antisymmetric>,T2,Op,0,1,0,1>
{
  static void apply(TensorEngine<1,T,Antisymmetric> &x, const T2 &y,
                    Op op=Op())
  { }
};
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<2,T,Antisymmetric>,T2,Op,0,2,0,2>
{
  static void apply(TensorEngine<2,T,Antisymmetric> &x, const T2 &y,
                    Op op=Op())
  {
    TensorAssign<TensorEngine<2,T,Antisymmetric>,T2,Op,1,1,0,1>::apply(x,y,op);
  }
};
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<3,T,Antisymmetric>,T2,Op,0,3,0,3>
{
  static void apply(TensorEngine<3,T,Antisymmetric> &x, const T2 &y,
      Op op=Op())
  {
    TensorAssign<TensorEngine<3,T,Antisymmetric>,T2,Op,1,1,0,1>::apply(x,y,op);
    TensorAssign<TensorEngine<3,T,Antisymmetric>,T2,Op,2,1,0,2>::apply(x,y,op);
  }
};
template<int D, class T>
class TensorEngine<D, T, Symmetric>
{
public:
  enum { dimensions=2 };
  enum { d=D };
  typedef T Element_t;
  typedef Symmetric EngineTag_t;
  typedef T& ElementRef_t;
  typedef const T& ConstElementRef_t;
  typedef T& CTElementRef_t;
  typedef const T& CTConstElementRef_t;
  typedef TensorEngine<D,T,Symmetric> This_t;
  TensorEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
  }
  TensorEngine(const TensorEngine<D,T,Symmetric> &x)
  {
    TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
  }
  template<class X>
  explicit TensorEngine(const X &x)
  {
    *this = x;
  }
  explicit TensorEngine(const T &x) {
    for (int i = 0; i < TensorStorageSize<d, EngineTag_t>::Size; i++) {
      x_m[i] = x;
    }
  }
  template<class X1, class X2, class X3>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3)
  {
    PoomaCTAssert<(D == 2)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4,
               const X5 &x5, const X6 &x6)
  {
    PoomaCTAssert<(D == 3)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
    (*this)(5) = x6;
  }
  ~TensorEngine() {}
  This_t&
  operator=(const This_t &x)
  {
    if (this != &x) {
      TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
        apply(*this,x,OpAssign());
    }
    return *this;
  }
  template<class V>
  This_t&
  operator=(const V &x)
  {
    TensorAssign<This_t,V,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
    return *this;
  }
  template<int I, int J>
  CTConstElementRef_t getIJ() const
  {
    PoomaCTAssert<((I >= 0) && (I < D) && (J >= 0) && (J < D))>::test();
    int lo = I < J ? I : J;
    int hi = I > J ? I : J;
    return x_m[((hi + 1)*hi/2) + lo];
  }
  template<int I, int J>
  CTElementRef_t getIJ()
  {
    PoomaCTAssert<((I >= 0) && (I < D) && (J >= 0) && (J < D))>::test();
    int lo = I < J ? I : J;
    int hi = I > J ? I : J;
    return x_m[((hi + 1)*hi/2) + lo];
  }
  ConstElementRef_t operator()(int i,int j) const
  {
    ;
    int lo = i < j ? i : j;
    int hi = i > j ? i : j;
    return x_m[((hi + 1)*hi/2) + lo];
  }
  ElementRef_t operator()(int i,int j)
  {
    ;
    int lo = i < j ? i : j;
    int hi = i > j ? i : j;
    return x_m[((hi + 1)*hi/2) + lo];
  }
  ConstElementRef_t operator()(int i) const
  {
    ;
    return x_m[i];
  }
  ElementRef_t operator()(int i)
  {
    ;
    return x_m[i];
  }
  const T* data() const{
    return (const T*) &x_m[0];
  }
  T* data(){
    return (T*) &x_m[0];
  }
  inline void reverseBytes()
  {
    const int sz = TensorStorageSize<d, EngineTag_t>::Size;
    for (int i = 0; i < sz; ++i)
      ::reverseBytes(x_m[i]);
  }
private:
  T x_m[TensorStorageSize<d, EngineTag_t>::Size];
};
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<2,T,Symmetric>,T2,Op,0,2,0,2>
{
  static void apply(TensorEngine<2,T,Symmetric> &x, const T2 &y,
                    Op op=Op())
  {
    TensorAssign<TensorEngine<2,T,Symmetric>,T2,Op,0,1,0,1>::apply(x,y,op);
    TensorAssign<TensorEngine<2,T,Symmetric>,T2,Op,1,1,0,2>::apply(x,y,op);
  }
};
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<3,T,Symmetric>,T2,Op,0,3,0,3>
{
  static void apply(TensorEngine<3,T,Symmetric> &x, const T2 &y,
                    Op op=Op())
  {
    TensorAssign<TensorEngine<3,T,Symmetric>,T2,Op,0,1,0,1>::apply(x,y,op);
    TensorAssign<TensorEngine<3,T,Symmetric>,T2,Op,1,1,0,2>::apply(x,y,op);
    TensorAssign<TensorEngine<3,T,Symmetric>,T2,Op,2,1,0,3>::apply(x,y,op);
  }
};
template<int D, class T>
class TensorEngine<D, T, Diagonal>
{
public:
  enum { dimensions=2 };
  enum { d=D };
  typedef T Element_t;
  typedef Diagonal EngineTag_t;
  class AssignProxy {
  public:
    AssignProxy(Element_t &elem, int where)
      : elem_m(elem), where_m(where) { }
    AssignProxy(const AssignProxy &model)
      // LLVM: Initialize where_m with model.where_m
      : elem_m(model.elem_m), where_m(model.where_m) { }
    AssignProxy &operator=(const AssignProxy &a) const
    {
      ;
      elem_m = a.elem_m;
      return const_cast<AssignProxy &>(*this);
    }
    AssignProxy &operator=(const Element_t &e) const
    {
      ;
      elem_m = e;
      return const_cast<AssignProxy &>(*this);
    }
    operator Element_t() const
    {
      return (elem_m);
    }
  private:
    // LLVM: Remove 'mutable' keyword from elem_m.
    Element_t &elem_m;
    mutable int where_m;
  };
  typedef AssignProxy ElementRef_t;
  typedef T ConstElementRef_t;
  typedef T& CTElementRef_t;
  typedef T CTConstElementRef_t;
  typedef TensorEngine<D,T,Diagonal> This_t;
  TensorEngine()
  {
    PoomaCTAssert<(ElementProperties<T>::hasTrivialDefaultConstructor && ElementProperties<T>::hasTrivialDestructor && ElementProperties<T>::concrete)>::test();
  }
  TensorEngine(const TensorEngine<D,T,Diagonal> &x)
  {
    TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
  }
  template<class X>
  explicit TensorEngine(const X &x)
  {
    *this = x;
  }
  explicit TensorEngine(const T &x) {
    for (int i = 0; i < TensorStorageSize<d, EngineTag_t>::Size; i++) {
      x_m[i] = x;
    }
  }
  template<class X1, class X2>
  TensorEngine(const X1 &x1, const X2 &x2)
  {
    PoomaCTAssert<(D == 2)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
  }
  template<class X1, class X2, class X3>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3)
  {
    PoomaCTAssert<(D == 3)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
  }
  template<class X1, class X2, class X3, class X4>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4)
  {
    PoomaCTAssert<(D == 4)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
  }
  template<class X1, class X2, class X3, class X4, class X5>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4,
               const X5 &x5)
  {
    PoomaCTAssert<(D == 5)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4,
               const X5 &x5, const X6 &x6)
  {
    PoomaCTAssert<(D == 6)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
    (*this)(5) = x6;
  }
  template<class X1, class X2, class X3, class X4, class X5, class X6,
    class X7>
  TensorEngine(const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4,
               const X5 &x5, const X6 &x6, const X7 &x7)
  {
    PoomaCTAssert<(D == 7)>::test();
    (*this)(0) = x1;
    (*this)(1) = x2;
    (*this)(2) = x3;
    (*this)(3) = x4;
    (*this)(4) = x5;
    (*this)(5) = x6;
    (*this)(6) = x7;
  }
  ~TensorEngine() {}
  This_t&
  operator=(const This_t &x)
  {
    if (this != &x) {
      TensorAssign<This_t,This_t,OpAssign,0,d,0,d>::
        apply(*this,x,OpAssign());
    }
    return *this;
  }
  template<class V>
  This_t&
  operator=(const V &x)
  {
    TensorAssign<This_t,V,OpAssign,0,d,0,d>::
      apply(*this,x,OpAssign());
    return *this;
  }
  template<int I, int J>
  CTConstElementRef_t getIJ() const
  {
    PoomaCTAssert<((I >= 0) && (I < d) && (J >= 0) && (J < d))>::test();
    if (I != J) {
      return This_t::Zero;
    } else {
      return x_m[I];
    }
  }
  template<int I, int J>
  CTElementRef_t getIJ()
  {
    PoomaCTAssert<((I >= 0) && (I < d) && (J >= 0) && (J < d))>::test();
    PoomaCTAssert<(I == J)>::test();
    return x_m[I];
  }
  ConstElementRef_t operator()(int i, int j) const
  {
    ;
    if (i != j) {
      return This_t::Zero;
    } else {
      return x_m[i];
    }
  }
  ElementRef_t operator()(int i, int j)
  {
    ;
    if (i != j) {
      return AssignProxy(This_t::Zero, 0);
    } else {
      return AssignProxy(x_m[i], 1);
    }
  }
  ConstElementRef_t operator()(int i) const
  {
    ;
    return x_m[i];
  }
  ElementRef_t operator()(int i)
  {
    ;
    return AssignProxy(x_m[i], 1);
  }
  const T* data() const{
    return (const T*) &x_m[0];
  }
  T* data(){
    return (T*) &x_m[0];
  }
  inline void reverseBytes()
  {
    const int sz = TensorStorageSize<d, EngineTag_t>::Size;
    for (int i = 0; i < sz; ++i)
      ::reverseBytes(x_m[i]);
  }
private:
  T x_m[TensorStorageSize<d, EngineTag_t>::Size];
  static T Zero;
};
template<int D, class T>
T TensorEngine<D,T,Diagonal>::Zero = 0.0;
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<2,T,Diagonal>,T2,Op,0,2,0,2>
{
  static void apply(TensorEngine<2,T,Diagonal> &x, const T2 &y, Op op=Op())
  {
    TensorAssign<TensorEngine<2,T,Diagonal>,T2,Op,0,1,0,1>::apply(x,y,op);
    TensorAssign<TensorEngine<2,T,Diagonal>,T2,Op,1,1,1,1>::apply(x,y,op);
  }
};
template<class T, class T2, class Op>
struct TensorAssign<TensorEngine<3,T,Diagonal>,T2,Op,0,3,0,3>
{
  static void apply(TensorEngine<3,T,Diagonal> &x, const T2 &y, Op op=Op())
  {
    TensorAssign<TensorEngine<3,T,Diagonal>,T2,Op,0,1,0,1>::apply(x,y,op);
    TensorAssign<TensorEngine<3,T,Diagonal>,T2,Op,1,1,1,1>::apply(x,y,op);
    TensorAssign<TensorEngine<3,T,Diagonal>,T2,Op,2,1,2,1>::apply(x,y,op);
  }
};
template<class T, class Components> struct ComponentAccess;
template<int D, class T, class E, int N>
struct ComponentAccess< Tensor<D, T, E>, Loc<N> >
{
  typedef Tensor<D, T, E> V;
  typedef typename V::Element_t Element_t;
  typedef typename V::ElementRef_t ElementRef_t;
  static inline ElementRef_t indexRef(V &t, const Loc<N> &l)
  {
    PoomaCTAssert<(N==2)>::test();
    return t(l[0].first(), l[1].first());
  }
  static inline Element_t index(const V &t, const Loc<N> &l)
  {
    PoomaCTAssert<(N==2)>::test();
    return t(l[0].first(), l[1].first());
  }
};
template<int D, class T, int I, int J>
struct TensorElem< TensorEngine<D,T,Full> , I , J>
{
  typedef TensorEngine<D,T,Full> V;
  typedef TensorEngineElem<D,T,Full,I,J,
    Writable<D,Full,I,J>::value> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x); }
  static ElementRef_t get(V& x) { return TE::get(x); }
};
template<int D, class T, int I, int J>
struct TensorElem< TensorEngine<D,T,Antisymmetric> , I , J>
{
  typedef TensorEngine<D,T,Antisymmetric> V;
  typedef TensorEngineElem<D,T,Antisymmetric,I,J,
    Writable<D,Antisymmetric,I,J>::value> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x); }
  static ElementRef_t get(V& x) { return TE::get(x); }
};
template<int D, class T, int I, int J>
struct TensorElem< TensorEngine<D,T,Symmetric> , I , J>
{
  typedef TensorEngine<D,T,Symmetric> V;
  typedef TensorEngineElem<D,T,Symmetric,I,J,
    Writable<D,Symmetric,I,J>::value> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x); }
  static ElementRef_t get(V& x) { return TE::get(x); }
};
template<int D, class T, int I, int J>
struct TensorElem< TensorEngine<D,T,Diagonal> , I , J>
{
  typedef TensorEngine<D,T,Diagonal> V;
  typedef TensorEngineElem<D,T,Diagonal,I,J,
    Writable<D,Diagonal,I,J>::value> TE;
  typedef typename TE::Element_t Element_t;
  typedef typename TE::ConstElementRef_t ConstElementRef_t;
  typedef typename TE::ElementRef_t ElementRef_t;
  static ConstElementRef_t get(const V& x) { return TE::get(x); }
  static ElementRef_t get(V& x) { return TE::get(x); }
};
template<class OutputEngineTag, int D, class T, class EngineTag>
class Symmetrize;
template<class OutputEngineTag, int D, class T, class EngineTag>
Tensor<D, T, OutputEngineTag>
symmetrize(const Tensor<D, T, EngineTag> &x)
{
  Symmetrize<OutputEngineTag, D, T, EngineTag> s;
  return s.apply(x);
}
template<class OutputEngineTag, int D, class T, class E>
struct UnaryReturn< Tensor<D,T,E> , FnSymmetrize<OutputEngineTag> >
{
  typedef Tensor<D,T,OutputEngineTag> Type_t;
};
template<class OutputEngineTag, int D, class T, class EngineTag>
class Symmetrize
{
public:
  Symmetrize() {};
  Tensor<D, T, OutputEngineTag>
  apply(const Tensor<D, T, EngineTag> &x) {
    Tensor<D, T, OutputEngineTag> y(-99.99);
    return y;
  }
};
template<int D, class T, class EngineTag>
class Symmetrize<Symmetric, D, T, EngineTag>
{
public:
  Tensor<D, T, Symmetric>
  apply(const Tensor<D, T, EngineTag> &x)
  {
    Tensor<D, T, Symmetric> y;
    for (int i = 0; i < D; i++) {
      y(i,i) = x(i,i);
      for (int j = i + 1; j < D; j++) {
        y(i,j) = (x(i,j) + x(j,i))*0.5;
      }
    }
    return y;
  }
};
template<int D, class T>
class Symmetrize<Symmetric, D, T, Antisymmetric>
{
public:
  Tensor<D, T, Symmetric>
  apply(const Tensor<D, T, Antisymmetric> &x)
  {
    Tensor<D, T, Symmetric> y(0.0);
    return y;
  }
};
template<int D, class T>
class Symmetrize<Symmetric, D, T, Diagonal>
{
public:
  Tensor<D, T, Symmetric>
  apply(const Tensor<D, T, Diagonal> &x)
  {
    Tensor<D, T, Symmetric> y(0.0);
    for (int i = 0; i < D; i++) {
      y(i,i) = x(i,i);
    }
    return y;
  }
};
template<int D, class T, class EngineTag>
class Symmetrize<Antisymmetric, D, T, EngineTag>
{
public:
  Tensor<D, T, Antisymmetric>
  apply(const Tensor<D, T, EngineTag> &x)
  {
    Tensor<D, T, Antisymmetric> y;
    for (int i = 1; i < D; i++) {
      for (int j = 0; j < i; j++) {
        y(((i - 1)*i/2)+j) = (x(i,j) - x(j,i))*0.5;
      }
    }
    return y;
  }
};
template<int D, class T>
class Symmetrize<Antisymmetric, D, T, Symmetric>
{
public:
  Tensor<D, T, Antisymmetric>
  apply(const Tensor<D, T, Symmetric> &x)
  {
    Tensor<D, T, Antisymmetric> y(0.0);
    return y;
  }
};
template<int D, class T>
class Symmetrize<Antisymmetric, D, T, Diagonal>
{
public:
  Tensor<D, T, Antisymmetric>
  apply(const Tensor<D, T, Diagonal> &x)
  {
    Tensor<D, T, Antisymmetric> y(0.0);
    return y;
  }
};
template<int D, class T, class EngineTag>
class Symmetrize<Diagonal, D, T, EngineTag>
{
public:
  Tensor<D, T, Diagonal>
  apply(const Tensor<D, T, EngineTag> &x)
  {
    Tensor<D, T, Diagonal> y;
    for (int i = 0; i < D; i++) {
      y(i) = x(i,i);
    }
    return y;
  }
};
template<int D, class T>
class Symmetrize<Diagonal, D, T, Antisymmetric>
{
public:
  Tensor<D, T, Diagonal>
  apply(const Tensor<D, T, Antisymmetric> &x)
  {
    Tensor<D, T, Diagonal> y(0.0);
    return y;
  }
};
template<int D, class T>
class Symmetrize<Diagonal, D, T, Symmetric>
{
public:
  Tensor<D, T, Diagonal>
  apply(const Tensor<D, T, Symmetric> &x)
  {
    Tensor<D, T, Diagonal> y(0.0);
    for (int i = 0; i < D; i++) {
      y(i) = x(i,i);
    }
    return y;
  }
};
template<int D, class T, class EngineTag>
class Symmetrize<Full, D, T, EngineTag>
{
public:
  Tensor<D, T, Full>
  apply(const Tensor<D, T, EngineTag> &x)
  {
    Tensor<D, T, Full> y;
    for (int i = 0; i < D; i++) {
      for (int j = 0; j < D; j++) {
        y(i,j) = x(i,j);
      }
    }
    return y;
  }
};
template<int D, class T, class E> class Tensor;
template<int D, class T, class E> class TensorEngine;
template<int D, class T, class E> class Vector;
template<int D, class T, class E> class VectorEngine;
template<class V1, class T2, int I, int B, int L>
struct VectorDotTensor
{
  typedef typename VectorDotTensor<V1,T2,I,B,L/2>::Type_t E1;
  typedef typename VectorDotTensor<V1,T2,I,B+L/2,L-L/2>::Type_t E2;
  typedef typename BinaryReturn<E1,E2,OpAdd>::Type_t Type_t;
  static Type_t get(const V1& v1, const T2& t2)
    {
      return
        VectorDotTensor<V1,T2,I,B,L/2>::get(v1,t2) +
        VectorDotTensor<V1,T2,I,B+L/2,L-L/2>::get(v1,t2);
    }
};
template<class V1, class T2, int I, int B>
struct VectorDotTensor<V1,T2,I,B,1>
{
  typedef typename VectorElem<V1,B>::Element_t E1;
  typedef typename TensorElem<T2,B,I>::Element_t E2;
  typedef typename BinaryReturn<E1,E2,OpMultiply>::Type_t Type_t;
  static Type_t get(const V1& v1, const T2& t2)
    {
      return VectorElem<V1,B>::get(v1) * TensorElem<T2,B,I>::get(t2);
    }
};
template<int D, class T1, class T2, class T3, class E1, class E2, int I>
struct VectorEngineElem<D,T3,
  BinaryVectorOp<Vector<D,T1,E1>,Tensor<D,T2,E2>,FnDot>,I>
{
  typedef Vector<D,T1,E1> V1;
  typedef Tensor<D,T2,E2> V2;
  typedef VectorEngine<D,T3,BinaryVectorOp<V1,V2,FnDot> > V;
  typedef typename VectorDotTensor<V1,V2,I,0,D>::Type_t T0;
  typedef T0 Element_t;
  typedef T0 ConstElementRef_t;
  typedef T0 ElementRef_t;
  static T0 get(const V& x)
    {
      return VectorDotTensor<V1,V2,I,0,D>::get(x.v1_m,x.v2_m);
    }
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Tensor<D,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef Vector<D,T0,Full> Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< Vector<D,T1,E1>,Tensor<D,T2,E2> , FnDot >::Type_t
dot( const Vector<D,T1,E1>& v1, const Tensor<D,T2,E2>& v2 )
{
  typedef Vector<D,T1,E1> V1;
  typedef Tensor<D,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef Vector<D,T3,BinaryVectorOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<class T1, class V2, int I, int B, int L>
struct TensorDotVector
{
  typedef typename TensorDotVector<T1,V2,I,B,L/2>::Type_t E1;
  typedef typename TensorDotVector<T1,V2,I,B+L/2,L-L/2>::Type_t E2;
  typedef typename BinaryReturn<E1,E2,OpAdd>::Type_t Type_t;
  static Type_t get(const T1& t1, const V2& v2)
    {
      return
        TensorDotVector<T1,V2,I,B,L/2>::get(t1,v2) +
        TensorDotVector<T1,V2,I,B+L/2,L-L/2>::get(t1,v2);
    }
};
template<class T1, class V2, int I, int B>
struct TensorDotVector<T1,V2,I,B,1>
{
  typedef typename TensorElem<T1,I,B>::Element_t E1;
  typedef typename VectorElem<V2,B>::Element_t E2;
  typedef typename BinaryReturn<E1,E2,OpMultiply>::Type_t Type_t;
  static Type_t get(const T1& t1, const V2& v2)
    {
      return TensorElem<T1,I,B>::get(t1) * VectorElem<V2,B>::get(v2);
    }
};
template<int D, class T1, class T2, class T3, class E1, class E2, int I>
struct VectorEngineElem<D,T3,
  BinaryVectorOp<Tensor<D,T1,E1>,Vector<D,T2,E2>,FnDot>,I>
{
  typedef Tensor<D,T1,E1> V1;
  typedef Vector<D,T2,E2> V2;
  typedef VectorEngine<D,T3,BinaryVectorOp<V1,V2,FnDot> > V;
  typedef typename TensorDotVector<V1,V2,I,0,D>::Type_t T0;
  typedef T0 Element_t;
  typedef T0 ConstElementRef_t;
  typedef T0 ElementRef_t;
  static T0 get(const V& x)
    {
      return TensorDotVector<V1,V2,I,0,D>::get(x.v1_m,x.v2_m);
    }
};
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Tensor<D,T1,E1> , Vector<D,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef Vector<D,T0,Full> Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< Tensor<D,T1,E1> , Vector<D,T2,E2>, FnDot >::Type_t
dot( const Tensor<D,T1,E1>& v1 , const Vector<D,T2,E2>& v2 )
{
  typedef Tensor<D,T1,E1> V1;
  typedef Vector<D,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef Vector<D,T3,BinaryVectorOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Vector<D,T2,E2>, FnOuterProduct >
{
  typedef typename BinaryReturn<T1, T2, OpMultiply>::Type_t T0;
  typedef Tensor<D, T0> Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn<Vector<D,T1,E1>, Vector<D,T2,E2>, FnOuterProduct>::Type_t
outerProduct(const Vector<D,T1,E1> &v1, const Vector<D,T2,E2> &v2 )
{
  typedef typename
    BinaryReturn<Vector<D,T1,E1>, Vector<D,T2,E2>, FnOuterProduct>::Type_t
    Return_t;
  Return_t ret;
  for (int i = 0; i < D; ++i)
    for (int j = 0; j < D; ++j)
      ret(i, j) = v1(i) * v2(j);
  return ret;
}
template<int D1, int D2, class T, class E> class TinyMatrix;
template<int D1, int D2, class T, class E> class TinyMatrixEngine;
template<int D, class T, class E> class Vector;
template<int D, class T, class E> class VectorEngine;
template<class V1, class T2, int I, int B, int L>
struct VectorDotTinyMatrix
{
  typedef typename VectorDotTinyMatrix<V1,T2,I,B,L/2>::Type_t E1;
  typedef typename VectorDotTinyMatrix<V1,T2,I,B+L/2,L-L/2>::Type_t E2;
  typedef typename BinaryReturn<E1,E2,OpAdd>::Type_t Type_t;
  static Type_t get(const V1& v1, const T2& t2)
    {
      return
        VectorDotTinyMatrix<V1,T2,I,B,L/2>::get(v1,t2) +
        VectorDotTinyMatrix<V1,T2,I,B+L/2,L-L/2>::get(v1,t2);
    }
};
template<class V1, class T2, int I, int B>
struct VectorDotTinyMatrix<V1,T2,I,B,1>
{
  typedef typename VectorElem<V1,B>::Element_t E1;
  typedef typename TinyMatrixElem<T2,B,I>::Element_t E2;
  typedef typename BinaryReturn<E1,E2,OpMultiply>::Type_t Type_t;
  static Type_t get(const V1& v1, const T2& t2)
    {
      return VectorElem<V1,B>::get(v1) * TinyMatrixElem<T2,B,I>::get(t2);
    }
};
template<int D1, int D2, class T1, class T2, class T3, class E1, class E2, int I>
struct VectorEngineElem<D2,T3,
  BinaryVectorOp<Vector<D1,T1,E1>,TinyMatrix<D1,D2,T2,E2>,FnDot>,I>
{
  typedef Vector<D1,T1,E1> V1;
  typedef TinyMatrix<D1,D2,T2,E2> V2;
  typedef VectorEngine<D2,T3,BinaryVectorOp<V1,V2,FnDot> > V;
  typedef typename VectorDotTinyMatrix<V1,V2,I,0,D1>::Type_t T0;
  typedef T0 Element_t;
  typedef T0 ConstElementRef_t;
  typedef T0 ElementRef_t;
  static T0 get(const V& x)
    {
      return VectorDotTinyMatrix<V1,V2,I,0,D1>::get(x.v1_m,x.v2_m);
    }
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D1,T1,E1> , TinyMatrix<D1,D2,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef Vector<D2,T0,Full> Type_t;
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< Vector<D1,T1,E1>,TinyMatrix<D1,D2,T2,E2> , FnDot >::Type_t
dot( const Vector<D1,T1,E1>& v1, const TinyMatrix<D1,D2,T2,E2>& v2 )
{
  typedef Vector<D1,T1,E1> V1;
  typedef TinyMatrix<D1,D2,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef Vector<D2,T3,BinaryVectorOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<class T1, class V2, int I, int B, int L>
struct TinyMatrixDotVector
{
  typedef typename TinyMatrixDotVector<T1,V2,I,B,L/2>::Type_t E1;
  typedef typename TinyMatrixDotVector<T1,V2,I,B+L/2,L-L/2>::Type_t E2;
  typedef typename BinaryReturn<E1,E2,OpAdd>::Type_t Type_t;
  static Type_t get(const T1& t1, const V2& v2)
    {
      return
        TinyMatrixDotVector<T1,V2,I,B,L/2>::get(t1,v2) +
        TinyMatrixDotVector<T1,V2,I,B+L/2,L-L/2>::get(t1,v2);
    }
};
template<class T1, class V2, int I, int B>
struct TinyMatrixDotVector<T1,V2,I,B,1>
{
  typedef typename TinyMatrixElem<T1,I,B>::Element_t E1;
  typedef typename VectorElem<V2,B>::Element_t E2;
  typedef typename BinaryReturn<E1,E2,OpMultiply>::Type_t Type_t;
  static Type_t get(const T1& t1, const V2& v2)
    {
      return TinyMatrixElem<T1,I,B>::get(t1) * VectorElem<V2,B>::get(v2);
    }
};
template<int D1, int D2, class T1, class T2, class T3, class E1, class E2, int I>
struct VectorEngineElem<D1,T3,
  BinaryVectorOp<TinyMatrix<D1,D2,T1,E1>,Vector<D2,T2,E2>,FnDot>,I>
{
  typedef TinyMatrix<D1,D2,T1,E1> V1;
  typedef Vector<D2,T2,E2> V2;
  typedef VectorEngine<D1,T3,BinaryVectorOp<V1,V2,FnDot> > V;
  typedef typename TinyMatrixDotVector<V1,V2,I,0,D2>::Type_t T0;
  typedef T0 Element_t;
  typedef T0 ConstElementRef_t;
  typedef T0 ElementRef_t;
  static T0 get(const V& x)
    {
      return TinyMatrixDotVector<V1,V2,I,0,D2>::get(x.v1_m,x.v2_m);
    }
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
struct BinaryReturn< TinyMatrix<D1,D2,T1,E1> , Vector<D2,T2,E2> , FnDot >
{
  typedef typename BinaryReturn<T1,T2,OpMultiply>::Type_t T0;
  typedef Vector<D1,T0,Full> Type_t;
};
template<int D1, int D2, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn< TinyMatrix<D1,D2,T1,E1> , Vector<D2,T2,E2>, FnDot >::Type_t
dot( const TinyMatrix<D1,D2,T1,E1>& v1 , const Vector<D2,T2,E2>& v2 )
{
  typedef TinyMatrix<D1,D2,T1,E1> V1;
  typedef Vector<D2,T2,E2> V2;
  typedef typename BinaryReturn<V1,V2,FnDot>::Type_t Return_t;
  typedef typename Return_t::Element_t T3;
  typedef Vector<D1,T3,BinaryVectorOp<V1,V2,FnDot> > Expr_t;
  return Return_t( Expr_t(v1,v2) );
}
template<int D, class T1, class T2, class E1, class E2>
struct BinaryReturn< Vector<D,T1,E1> , Vector<D,T2,E2>, FnOuterProductAsTinyMatrix >
{
  typedef typename BinaryReturn<T1, T2, OpMultiply>::Type_t T0;
  typedef TinyMatrix<D, D, T0> Type_t;
};
template<int D, class T1, class T2, class E1, class E2>
inline
typename BinaryReturn<Vector<D,T1,E1>, Vector<D,T2,E2>, FnOuterProductAsTinyMatrix>::Type_t
outerProductAsTinyMatrix(const Vector<D,T1,E1> &v1, const Vector<D,T2,E2> &v2 )
{
  typedef typename
    BinaryReturn<Vector<D,T1,E1>, Vector<D,T2,E2>, FnOuterProduct>::Type_t
    Return_t;
  Return_t ret;
  for (int i = 0; i < D; ++i)
    for (int j = 0; j < D; ++j)
      ret(i, j) = v1(i) * v2(j);
  return ret;
}
template<int Dim, class T, class EngineTag, class Op>
inline T globalReduction(const Vector<Dim, T, EngineTag> &v,
  const Op &op)
{
  T val = v(0);
  for (int i = 1; i < Dim; i++)
    op(val, v(i));
  return val;
}
template<int Dim, class T, class EngineTag, class Op>
inline T globalReduction(const Tensor<Dim, T, EngineTag> &t,
  const Op &op)
{
  T val = t(0, 0);
  for (int k = 1; k < Dim; k++)
    op(val, t(k, 0));
  for (int j = 1; j < Dim; j++)
    for (int i = 0; i < Dim; i++)
      op(val, t(i, j));
  return val;
}
template<int Dim, class T, class Op>
inline T globalReduction(const Tensor<Dim, T, Full> &t,
  const Op &op)
{
  T val = t(0, 0);
  for (int i = 1; i < TensorStorageSize<Dim, Full>::Size; i++)
    op(val, t(i));
  return val;
}
template<int Dim, class T, class Op>
inline T globalReduction(const Tensor<Dim, T, Antisymmetric> &t,
  const Op &op)
{
  T val = t(0,0);
  for (int i = 0; i < TensorStorageSize<Dim, Antisymmetric>::Size - 1 / Dim; i++)
    {
      op(val, t(i));
      op(val, -t(i));
    }
  return val;
}
template<int Dim, class T, class Op>
inline T globalReduction(const Tensor<Dim, T, Diagonal> &t,
  const Op &op)
{
  T val = t(0);
  for (int i = 1; i < TensorStorageSize<Dim, Diagonal>::Size; i++)
    op(val, t(i));
  if (Dim > 1)
    op(val, T(0));
  return val;
}
template<int Dim1, int Dim2, class T, class EngineTag, class Op>
inline T globalReduction(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m,
  const Op &op)
{
  T val = m(0, 0);
  for (int k = 1; k < Dim1; k++)
    op(val, m(k, 0));
  for (int j = 1; j < Dim2; j++)
    for (int i = 0; i < Dim1; i++)
      op(val, m(i, j));
  return val;
}
template<int Dim1, int Dim2, class T, class Op>
inline T globalReduction(const TinyMatrix<Dim1, Dim2, T, Full> &m,
  const Op &op)
{
  T val = m(0, 0);
  for (int i = 1; i < Dim1 * Dim2; i++)
    op(val, m(i));
  return val;
}
template<int Dim, class T, class EngineTag>
T sum(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, OpAddAssign());
}
template<int Dim, class T, class EngineTag>
T prod(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, OpMultiplyAssign());
}
template<int Dim, class T, class EngineTag>
T min(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, FnMinAssign());
}
template<int Dim, class T, class EngineTag>
T max(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, FnMaxAssign());
}
template<int Dim, class T, class EngineTag>
bool all(const Vector<Dim, T, EngineTag> &v)
{
  for (int i = 0; i < Dim; i++)
    if (!v(i))
      return false;
  return true;
}
template<int Dim, class T, class EngineTag>
bool any(const Vector<Dim, T, EngineTag> &v)
{
  for (int i = 0; i < Dim; i++)
    if (v(i))
      return true;
  return false;
}
template<int Dim, class T, class EngineTag>
T bitOr(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, OpBitwiseOrAssign());
}
template<int Dim, class T, class EngineTag>
T bitAnd(const Vector<Dim, T, EngineTag> &v)
{
  return globalReduction(v, OpBitwiseAndAssign());
}
template<int Dim, class T, class EngineTag>
T sum(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, OpAddAssign());
}
template<int Dim, class T>
T sum(const Tensor<Dim, T, Antisymmetric> &t)
{
  return T(0);
}
template<int Dim, class T, class EngineTag>
T prod(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, OpMultiplyAssign());
}
template<int Dim, class T>
T prod(const Tensor<Dim, T, Antisymmetric> &t)
{
  return T(0);
}
template<int Dim, class T, class EngineTag>
T min(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, FnMinAssign());
}
template<int Dim, class T, class EngineTag>
T max(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, FnMaxAssign());
}
template<int Dim, class T, class EngineTag>
bool all(const Tensor<Dim, T, EngineTag> &t)
{
  for (int j = 0; j < Dim; j++)
    for (int i = 0; i < Dim; i++)
      if (!t(i, j))
        return false;
  return true;
}
template<int Dim, class T>
bool all(const Tensor<Dim, T, Antisymmetric> &t)
{
  return false;
}
template<int Dim, class T, class EngineTag>
bool any(const Tensor<Dim, T, EngineTag> &t)
{
  for (int j = 0; j < Dim; j++)
    for (int i = 0; i < Dim; i++)
      if (t(i, j))
        return true;
  return false;
}
template<int Dim, class T, class EngineTag>
T bitOr(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, OpBitwiseOrAssign());
}
template<int Dim, class T, class EngineTag>
T bitAnd(const Tensor<Dim, T, EngineTag> &t)
{
  return globalReduction(t, OpBitwiseAndAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
T sum(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, OpAddAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
T prod(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, OpMultiplyAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
T min(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, FnMinAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
T max(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, FnMaxAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
bool all(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  for (int j = 0; j < Dim2; j++)
    for (int i = 0; i < Dim1; i++)
      if (!m(i, j))
        return false;
  return true;
}
template<int Dim1, int Dim2, class T, class EngineTag>
bool any(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  for (int j = 0; j < Dim2; j++)
    for (int i = 0; i < Dim1; i++)
      if (m(i, j))
        return true;
  return false;
}
template<int Dim1, int Dim2, class T, class EngineTag>
T bitOr(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, OpBitwiseOrAssign());
}
template<int Dim1, int Dim2, class T, class EngineTag>
T bitAnd(const TinyMatrix<Dim1, Dim2, T, EngineTag> &m)
{
  return globalReduction(m, OpBitwiseAndAssign());
}
template<class T>
struct Zero
{
  operator T() const { return T(0); }
  bool operator==(const Zero<T>&) const { return true; }
  Zero() {}
  Zero(const Zero<T>&) {}
  Zero<T>& operator=(const Zero<T>&) { return *this; }
};
template<class T, class Op> struct UnaryReturn;
template<class T1, class T2, class Op> struct BinaryReturn;
template<class T>
  inline Zero<T> operator*(Zero<T>, const T&) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator*(const T&, Zero<T>) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator*(Zero<T>, Zero<T>) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator/(Zero<T>, const T&) { return Zero<T>(); }
template<class T>
struct BinaryReturn< Zero<T> , T , OpMultiply >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< T, Zero<T> , OpMultiply >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< Zero<T>, Zero<T> , OpMultiply >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< Zero<T> , T , OpDivide >
{
  typedef Zero<T> Type_t;
};
template<class T>
  inline const T& operator+(Zero<T>, const T& x) { return x; }
template<class T>
  inline const T& operator+(const T& x, Zero<T>) { return x; }
template<class T>
  inline Zero<T> operator+(Zero<T>, Zero<T>) { return Zero<T>(); }
template<class T>
  inline T operator-(Zero<T>, const T& x) { return -x; }
template<class T>
  inline const T& operator-(const T& x, Zero<T>) { return x; }
template<class T>
  inline Zero<T> operator-(Zero<T>, Zero<T>) { return Zero<T>(); }
template<class T>
struct BinaryReturn< Zero<T> , T , OpAdd >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< T, Zero<T> , OpAdd >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< Zero<T>, Zero<T> , OpAdd >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< Zero<T> , T , OpSubtract >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< T, Zero<T> , OpSubtract >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< Zero<T>, Zero<T> , OpSubtract >
{
  typedef Zero<T> Type_t;
};
template<class T>
  inline Zero<T> operator-(Zero<T>) { return Zero<T>(); }
template<class T>
struct UnaryReturn< Zero<T> , OpUnaryMinus >
{
  typedef Zero<T> Type_t;
};
template<class T>
  inline Zero<T> operator+(Zero<T>) { return Zero<T>(); }
template<class T>
struct UnaryReturn< Zero<T> , OpUnaryPlus >
{
  typedef Zero<T> Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< Zero<T1> , Zero<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2>
struct BinaryReturn< Zero<T1> , Zero<T2>, OpEQ >
{
  typedef typename BinaryReturn<T1,T2,OpEQ>::Type_t Type_t;
};
template<class T> struct Zero;
template<class T, class Op> struct UnaryReturn;
template<class T1, class T2, class Op> struct BinaryReturn;
template<class T>
struct One
{
  operator T() const { return T(1); }
  bool operator==(const One<T>&) const { return true; }
  One() {}
  One(const One<T>&) {}
  One<T>& operator=(const One<T>&) { return *this; }
};
template<class T>
struct MinusOne
{
  operator T() const { return T(-1); }
  bool operator==(const MinusOne<T>&) const { return true; }
  MinusOne() {}
  MinusOne(const One<T>&) {}
  MinusOne<T>& operator=(const MinusOne<T>&) { return *this; }
};
template<class T>
  inline MinusOne<T> operator-(One<T>) { return MinusOne<T>(); }
template<class T>
  inline One<T> operator-(MinusOne<T>) { return One<T>(); }
template<class T>
  inline T operator*(One<T>, const T& val) { return val; }
template<class T>
  inline T operator*(const T& val, One<T>) { return val; }
template<class T>
  inline One<T> operator*(One<T>, One<T>) { return One<T>(); }
template<class T>
  inline One<T> operator/(One<T>, One<T>) { return One<T>(); }
template<class T>
  inline T operator/(const T& val, One<T>) { return val; }
template<class T>
  inline T operator*(MinusOne<T>, const T& val) { return -val; }
template<class T>
  inline T operator*(const T& val, MinusOne<T>) { return -val; }
template<class T>
  inline One<T> operator*(MinusOne<T>, MinusOne<T>) { return One<T>(); }
template<class T>
  inline One<T> operator/(MinusOne<T>, MinusOne<T>) { return One<T>(); }
template<class T>
  inline T operator/(const T& val, MinusOne<T>) { return -val; }
template<class T>
  inline MinusOne<T> operator*(MinusOne<T>, One<T>) { return MinusOne<T>(); }
template<class T>
  inline MinusOne<T> operator*(One<T>, MinusOne<T>) { return MinusOne<T>(); }
template<class T>
  inline MinusOne<T> operator/(MinusOne<T>, One<T>) { return MinusOne<T>(); }
template<class T>
  inline MinusOne<T> operator/(One<T>, MinusOne<T>) { return MinusOne<T>(); }
template<class T>
  inline Zero<T> operator-(One<T>, One<T>) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator-(MinusOne<T>, MinusOne<T>) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator+(One<T>, MinusOne<T>) { return Zero<T>(); }
template<class T>
  inline Zero<T> operator+(MinusOne<T>, One<T>) { return Zero<T>(); }
template<class T>
  inline MinusOne<T> operator-(Zero<T>, One<T>) { return MinusOne<T>(); }
template<class T>
  inline One<T> operator-(Zero<T>, MinusOne<T>) { return One<T>(); }
template<class T>
struct UnaryReturn< One<T> , OpUnaryMinus >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct UnaryReturn< MinusOne<T> , OpUnaryMinus >
{
  typedef One<T> Type_t;
};
template<class T>
struct BinaryReturn< One<T> , T , OpMultiply >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< T, One<T> , OpMultiply >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< One<T>, One<T> , OpMultiply >
{
  typedef One<T> Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T> , T , OpMultiply >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< T, MinusOne<T> , OpMultiply >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, MinusOne<T> , OpMultiply >
{
  typedef One<T> Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, One<T> , OpMultiply >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct BinaryReturn< One<T>, MinusOne<T> , OpMultiply >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct BinaryReturn< T, One<T> , OpDivide >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< T, MinusOne<T> , OpDivide >
{
  typedef T Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, One<T> , OpDivide >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct BinaryReturn< One<T>, MinusOne<T> , OpDivide >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct BinaryReturn< One<T>, One<T> , OpSubtract >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, MinusOne<T> , OpSubtract >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< Zero<T>, One<T>, OpSubtract >
{
  typedef MinusOne<T> Type_t;
};
template<class T>
struct BinaryReturn< Zero<T>, MinusOne<T>, OpSubtract >
{
  typedef One<T> Type_t;
};
template<class T>
struct BinaryReturn< One<T>, MinusOne<T> , OpAdd >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, One<T> , OpAdd >
{
  typedef Zero<T> Type_t;
};
template<class T>
struct BinaryReturn< MinusOne<T>, MinusOne<T>, OpEQ>
{
  typedef bool Type_t;
};
template<class T>
struct BinaryReturn< One<T>, One<T>, OpEQ>
{
  typedef bool Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< One<T1> , One<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< MinusOne<T1> , MinusOne<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< One<T1>, Zero<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< Zero<T1>, One<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< MinusOne<T1>, Zero<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< Zero<T1>, MinusOne<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< One<T1>, MinusOne<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class T1, class T2, class Op>
struct BinaryReturn< MinusOne<T1>, One<T2>, Op >
{
  typedef typename BinaryReturn<T1,T2,Op>::Type_t Type_t;
};
template<class A1> struct MultiArg1;
template<class A1, class A2> struct MultiArg2;
template<class A1, class A2, class A3> struct MultiArg3;
template<class A1, class A2, class A3, class A4> struct MultiArg4;
template<class A1, class A2, class A3, class A4, class A5> struct MultiArg5;
template<class A1, class A2, class A3, class A4, class A5, class A6> struct MultiArg6;
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct MultiArg7;
template<class A1, class Dom>
struct MultiArgView1
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef MultiArg1<A1_t> Type_t;
};
template<class A1, class A2, class Dom>
struct MultiArgView2
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef MultiArg2<A1_t, A2_t> Type_t;
};
template<class A1, class A2, class A3, class Dom>
struct MultiArgView3
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef typename View1<A3, Dom>::Type_t A3_t;
  typedef MultiArg3<A1_t, A2_t, A3_t> Type_t;
};
template<class A1, class A2, class A3, class A4, class Dom>
struct MultiArgView4
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef typename View1<A3, Dom>::Type_t A3_t;
  typedef typename View1<A4, Dom>::Type_t A4_t;
  typedef MultiArg4<A1_t, A2_t, A3_t, A4_t> Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class Dom>
struct MultiArgView5
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef typename View1<A3, Dom>::Type_t A3_t;
  typedef typename View1<A4, Dom>::Type_t A4_t;
  typedef typename View1<A5, Dom>::Type_t A5_t;
  typedef MultiArg5<A1_t, A2_t, A3_t, A4_t, A5_t> Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class Dom>
struct MultiArgView6
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef typename View1<A3, Dom>::Type_t A3_t;
  typedef typename View1<A4, Dom>::Type_t A4_t;
  typedef typename View1<A5, Dom>::Type_t A5_t;
  typedef typename View1<A6, Dom>::Type_t A6_t;
  typedef MultiArg6<A1_t, A2_t, A3_t, A4_t, A5_t, A6_t> Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Dom>
struct MultiArgView7
{
  typedef typename View1<A1, Dom>::Type_t A1_t;
  typedef typename View1<A2, Dom>::Type_t A2_t;
  typedef typename View1<A3, Dom>::Type_t A3_t;
  typedef typename View1<A4, Dom>::Type_t A4_t;
  typedef typename View1<A5, Dom>::Type_t A5_t;
  typedef typename View1<A6, Dom>::Type_t A6_t;
  typedef typename View1<A7, Dom>::Type_t A7_t;
  typedef MultiArg7<A1_t, A2_t, A3_t, A4_t, A5_t, A6_t, A7_t> Type_t;
};
template<class A1, class Dom>
struct View1<MultiArg1<A1>, Dom>
{
  typedef typename MultiArgView1<A1, Dom>::Type_t Type_t;
};
template<class A1, class A2, class Dom>
struct View1<MultiArg2<A1, A2>, Dom>
{
  typedef typename MultiArgView2<A1, A2, Dom>::Type_t Type_t;
};
template<class A1, class A2, class A3, class Dom>
struct View1<MultiArg3<A1, A2, A3>, Dom>
{
  typedef typename MultiArgView3<A1, A2, A3, Dom>::Type_t Type_t;
};
template<class A1, class A2, class A3, class A4, class Dom>
struct View1<MultiArg4<A1, A2, A3, A4>, Dom>
{
  typedef typename MultiArgView4<A1, A2, A3, A4, Dom>::Type_t Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class Dom>
struct View1<MultiArg5<A1, A2, A3, A4, A5>, Dom>
{
  typedef typename MultiArgView5<A1, A2, A3, A4, A5, Dom>::Type_t Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class Dom>
struct View1<MultiArg6<A1, A2, A3, A4, A5, A6>, Dom>
{
  typedef typename MultiArgView6<A1, A2, A3, A4, A5, A6, Dom>::Type_t Type_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Dom>
struct View1<MultiArg7<A1, A2, A3, A4, A5, A6, A7>, Dom>
{
  typedef typename MultiArgView7<A1, A2, A3, A4, A5, A6, A7, Dom>::Type_t Type_t;
};
template<class A1>
struct MultiArg1
{
  enum { size = 1 };
  MultiArg1(const A1 &a1)
    : a1_m(a1)
  {
  }
  template<class Dom>
  typename View1<MultiArg1<A1>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg1<A1>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom));
  }
  A1 a1_m;
};
template<class A1, class A2>
struct MultiArg2
{
  enum { size = 2 };
  MultiArg2(const A1 &a1, const A2 &a2)
    : a1_m(a1), a2_m(a2)
  {
  }
  template<class Dom>
  typename View1<MultiArg2<A1, A2>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg2<A1, A2>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
};
template<class A1, class A2, class A3>
struct MultiArg3
{
  enum { size = 3 };
  MultiArg3(const A1 &a1, const A2 &a2, const A3 &a3)
    : a1_m(a1), a2_m(a2), a3_m(a3)
  {
  }
  template<class Dom>
  typename View1<MultiArg3<A1, A2, A3>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg3<A1, A2, A3>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom), a3_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
  A3 a3_m;
};
template<class A1, class A2, class A3, class A4>
struct MultiArg4
{
  enum { size = 4 };
  MultiArg4(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
    : a1_m(a1), a2_m(a2), a3_m(a3), a4_m(a4)
  {
  }
  template<class Dom>
  typename View1<MultiArg4<A1, A2, A3, A4>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg4<A1, A2, A3, A4>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom), a3_m(dom), a4_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
  A3 a3_m;
  A4 a4_m;
};
template<class A1, class A2, class A3, class A4, class A5>
struct MultiArg5
{
  enum { size = 5 };
  MultiArg5(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
    : a1_m(a1), a2_m(a2), a3_m(a3), a4_m(a4), a5_m(a5)
  {
  }
  template<class Dom>
  typename View1<MultiArg5<A1, A2, A3, A4, A5>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg5<A1, A2, A3, A4, A5>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom), a3_m(dom), a4_m(dom), a5_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
  A3 a3_m;
  A4 a4_m;
  A5 a5_m;
};
template<class A1, class A2, class A3, class A4, class A5, class A6>
struct MultiArg6
{
  enum { size = 6 };
  MultiArg6(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
    : a1_m(a1), a2_m(a2), a3_m(a3), a4_m(a4), a5_m(a5), a6_m(a6)
  {
  }
  template<class Dom>
  typename View1<MultiArg6<A1, A2, A3, A4, A5, A6>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg6<A1, A2, A3, A4, A5, A6>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom), a3_m(dom), a4_m(dom), a5_m(dom), a6_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
  A3 a3_m;
  A4 a4_m;
  A5 a5_m;
  A6 a6_m;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
struct MultiArg7
{
  enum { size = 7 };
  MultiArg7(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
    : a1_m(a1), a2_m(a2), a3_m(a3), a4_m(a4), a5_m(a5), a6_m(a6), a7_m(a7)
  {
  }
  template<class Dom>
  typename View1<MultiArg7<A1, A2, A3, A4, A5, A6, A7>, Dom>::Type_t
  operator()(const Dom &dom) const
  {
    typedef typename View1<MultiArg7<A1, A2, A3, A4, A5, A6, A7>, Dom>::Type_t Ret_t;
    return Ret_t(a1_m(dom), a2_m(dom), a3_m(dom), a4_m(dom), a5_m(dom), a6_m(dom), a7_m(dom));
  }
  A1 a1_m;
  A2 a2_m;
  A3 a3_m;
  A4 a4_m;
  A5 a5_m;
  A6 a6_m;
  A7 a7_m;
};
template<class A1, class Function>
void applyMultiArg(const MultiArg1<A1> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
}
template<class A1, class A2, class Function>
void applyMultiArg(const MultiArg2<A1, A2> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
}
template<class A1, class A2, class A3, class Function>
void applyMultiArg(const MultiArg3<A1, A2, A3> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
  f(node.a3_m, condition[2]);
}
template<class A1, class A2, class A3, class A4, class Function>
void applyMultiArg(const MultiArg4<A1, A2, A3, A4> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
  f(node.a3_m, condition[2]);
  f(node.a4_m, condition[3]);
}
template<class A1, class A2, class A3, class A4, class A5, class Function>
void applyMultiArg(const MultiArg5<A1, A2, A3, A4, A5> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
  f(node.a3_m, condition[2]);
  f(node.a4_m, condition[3]);
  f(node.a5_m, condition[4]);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class Function>
void applyMultiArg(const MultiArg6<A1, A2, A3, A4, A5, A6> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
  f(node.a3_m, condition[2]);
  f(node.a4_m, condition[3]);
  f(node.a5_m, condition[4]);
  f(node.a6_m, condition[5]);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Function>
void applyMultiArg(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &node,
     const Function &f,
     const std::vector<bool> &condition)
{
  f(node.a1_m, condition[0]);
  f(node.a2_m, condition[1]);
  f(node.a3_m, condition[2]);
  f(node.a4_m, condition[3]);
  f(node.a5_m, condition[4]);
  f(node.a6_m, condition[5]);
  f(node.a7_m, condition[6]);
}
template<class A1, class Function>
void applyMultiArg(const MultiArg1<A1> &node,
     const Function &f)
{
  f(node.a1_m);
}
template<class A1, class A2, class Function>
void applyMultiArg(const MultiArg2<A1, A2> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
}
template<class A1, class A2, class A3, class Function>
void applyMultiArg(const MultiArg3<A1, A2, A3> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
  f(node.a3_m);
}
template<class A1, class A2, class A3, class A4, class Function>
void applyMultiArg(const MultiArg4<A1, A2, A3, A4> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
  f(node.a3_m);
  f(node.a4_m);
}
template<class A1, class A2, class A3, class A4, class A5, class Function>
void applyMultiArg(const MultiArg5<A1, A2, A3, A4, A5> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
  f(node.a3_m);
  f(node.a4_m);
  f(node.a5_m);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class Function>
void applyMultiArg(const MultiArg6<A1, A2, A3, A4, A5, A6> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
  f(node.a3_m);
  f(node.a4_m);
  f(node.a5_m);
  f(node.a6_m);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Function>
void applyMultiArg(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &node,
     const Function &f)
{
  f(node.a1_m);
  f(node.a2_m);
  f(node.a3_m);
  f(node.a4_m);
  f(node.a5_m);
  f(node.a6_m);
  f(node.a7_m);
}
template<class A1, class Function>
void applyMultiArgIf(const MultiArg1<A1> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
}
template<class A1, class A2, class Function>
void applyMultiArgIf(const MultiArg2<A1, A2> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
}
template<class A1, class A2, class A3, class Function>
void applyMultiArgIf(const MultiArg3<A1, A2, A3> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
  if (condition[2])
    f(node.a3_m);
}
template<class A1, class A2, class A3, class A4, class Function>
void applyMultiArgIf(const MultiArg4<A1, A2, A3, A4> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
  if (condition[2])
    f(node.a3_m);
  if (condition[3])
    f(node.a4_m);
}
template<class A1, class A2, class A3, class A4, class A5, class Function>
void applyMultiArgIf(const MultiArg5<A1, A2, A3, A4, A5> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
  if (condition[2])
    f(node.a3_m);
  if (condition[3])
    f(node.a4_m);
  if (condition[4])
    f(node.a5_m);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class Function>
void applyMultiArgIf(const MultiArg6<A1, A2, A3, A4, A5, A6> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
  if (condition[2])
    f(node.a3_m);
  if (condition[3])
    f(node.a4_m);
  if (condition[4])
    f(node.a5_m);
  if (condition[5])
    f(node.a6_m);
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Function>
void applyMultiArgIf(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &node,
   const Function &f,
   const std::vector<bool> &condition)
{
  if (condition[0])
    f(node.a1_m);
  if (condition[1])
    f(node.a2_m);
  if (condition[2])
    f(node.a3_m);
  if (condition[3])
    f(node.a4_m);
  if (condition[4])
    f(node.a5_m);
  if (condition[5])
    f(node.a6_m);
  if (condition[6])
    f(node.a7_m);
}
struct LoopApplyEvaluator
{
  template<class Op, class Dom>
  static /*__attribute__((leafify))*/
  void evaluate(const Op &op, const Dom &domain)
  {
    PoomaCTAssert<(Dom::unitStride)>::test();
    evaluate(op, domain, WrappedInt<Dom::dimensions>());
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<1>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int e0 = domain[0].last();
;
#pragma omp parallel for if (e0-f0 > 512)
    for (int i0 = f0; i0 <= e0; ++i0)
      localOp(i0);
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<2>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
#pragma omp parallel for
    for (int i1 = f1; i1 <= e1; ++i1) {
;
      for (int i0 = f0; i0 <= e0; ++i0)
 localOp(i0, i1);
    }
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<3>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int f2 = domain[2].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
    int e2 = domain[2].last();
#pragma omp parallel for
    for (int i2 = f2; i2 <= e2; ++i2)
      for (int i1 = f1; i1 <= e1; ++i1) {
;
 for (int i0 = f0; i0 <= e0; ++i0)
   localOp(i0,i1,i2);
      }
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<4>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int f2 = domain[2].first();
    int f3 = domain[3].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
    int e2 = domain[2].last();
    int e3 = domain[3].last();
#pragma omp parallel for
    for (int i3 = f3; i3 <= e3; ++i3)
      for (int i2 = f2; i2 <= e2; ++i2)
 for (int i1 = f1; i1 <= e1; ++i1) {
;
   for (int i0 = f0; i0 <= e0; ++i0)
     localOp(i0,i1,i2,i3);
 }
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<5>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int f2 = domain[2].first();
    int f3 = domain[3].first();
    int f4 = domain[4].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
    int e2 = domain[2].last();
    int e3 = domain[3].last();
    int e4 = domain[4].last();
#pragma omp parallel for
    for (int i4 = f4; i4 <= e4; ++i4)
      for (int i3 = f3; i3 <= e3; ++i3)
 for (int i2 = f2; i2 <= e2; ++i2)
   for (int i1 = f1; i1 <= e1; ++i1) {
;
     for (int i0 = f0; i0 <= e0; ++i0)
       localOp(i0,i1,i2,i3,i4);
   }
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<6>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int f2 = domain[2].first();
    int f3 = domain[3].first();
    int f4 = domain[4].first();
    int f5 = domain[5].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
    int e2 = domain[2].last();
    int e3 = domain[3].last();
    int e4 = domain[4].last();
    int e5 = domain[5].last();
#pragma omp parallel for
    for (int i5 = f5; i5 <= e5; ++i5)
      for (int i4 = f4; i4 <= e4; ++i4)
 for (int i3 = f3; i3 <= e3; ++i3)
   for (int i2 = f2; i2 <= e2; ++i2)
     for (int i1 = f1; i1 <= e1; ++i1) {
;
       for (int i0 = f0; i0 <= e0; ++i0)
  localOp(i0,i1,i2,i3,i4,i5);
     }
  }
  template<class Op, class Domain>
  inline static void evaluate(const Op &op, const Domain &domain, WrappedInt<7>)
  {
    Op localOp(op);
    int f0 = domain[0].first();
    int f1 = domain[1].first();
    int f2 = domain[2].first();
    int f3 = domain[3].first();
    int f4 = domain[4].first();
    int f5 = domain[5].first();
    int f6 = domain[6].first();
    int e0 = domain[0].last();
    int e1 = domain[1].last();
    int e2 = domain[2].last();
    int e3 = domain[3].last();
    int e4 = domain[4].last();
    int e5 = domain[5].last();
    int e6 = domain[6].last();
#pragma omp parallel for
    for (int i6 = f6; i6 <= e6; ++i6)
      for (int i5 = f5; i5 <= e5; ++i5)
 for (int i4 = f4; i4 <= e4; ++i4)
   for (int i3 = f3; i3 <= e3; ++i3)
     for (int i2 = f2; i2 <= e2; ++i2)
       for (int i1 = f1; i1 <= e1; ++i1) {
;
  for (int i0 = f0; i0 <= e0; ++i0)
    localOp(i0,i1,i2,i3,i4,i5,i6);
       }
  }
};
template<class MultiArg, class Function>
class MultiArgKernel
  : public Pooma::Iterate_t
{
public:
  MultiArgKernel(const MultiArg &multiArg,
    const Function &function,
    std::vector<bool> &write,
    std::vector<bool> &read)
    : Pooma::Iterate_t(Pooma::scheduler()),
      multiArg_m(multiArg), function_m(function),
      write_m(write), read_m(read)
  {
    DataObjectRequest<BlockAffinity> getAffinity;
    hintAffinity(engineFunctor(multiArg.a1_m.engine(), getAffinity));
    typedef DataObjectRequest<WriteRequest> WriteRequest_t;
    typedef DataObjectRequest<ReadRequest> ReadRequest_t;
    WriteRequest_t writeReq(*this);
    applyMultiArgIf(multiArg, ExpressionApply<WriteRequest_t>(writeReq),
      write_m);
    ReadRequest_t readReq(writeReq);
    applyMultiArgIf(multiArg, ExpressionApply<ReadRequest_t>(readReq),
      read_m);
  }
  virtual ~MultiArgKernel()
  {
    typedef DataObjectRequest<WriteRelease> WriteRequest_t;
    typedef DataObjectRequest<ReadRelease> ReadRequest_t;
    WriteRequest_t writeReq;
    applyMultiArgIf(multiArg_m, ExpressionApply<WriteRequest_t>(writeReq),
      write_m);
    ReadRequest_t readReq(writeReq);
    applyMultiArgIf(multiArg_m, ExpressionApply<ReadRequest_t>(readReq),
      read_m);
  }
  virtual void /*__attribute__((leafify))*/ run()
  {
    function_m(multiArg_m);
  }
private:
  MultiArg multiArg_m;
  Function function_m;
  std::vector<bool> write_m;
  std::vector<bool> read_m;
};
template<int Dim>
class SimpleIntersectorData
  : public RefCounted
{
public:
  typedef SimpleIntersectorData<Dim> This_t;
  typedef INode<Dim> INode_t;
  typedef std::vector<INode_t> INodeContainer_t;
  typedef typename INodeContainer_t::const_iterator const_iterator;
  typedef Unique::Value_t LayoutID_t;
  enum { dimensions = Dim };
  inline SimpleIntersectorData(const Interval<Dim> &domain, const GuardLayers<Dim> &extent)
    : seenFirst_m(false), domain_m(domain), extent_m(extent)
  {
  }
  inline ~SimpleIntersectorData() { }
  template<class Engine>
  void intersect(const Engine &engine, bool useGuards)
  {
    typedef typename Engine::Layout_t Layout_t;
    typedef typename NewEngine<Engine, Interval<Dim> >::Type_t NewEngine_t;
    const Layout_t &layout(engine.layout());
    if (!seenFirst_m)
    {
      firstID_m = layout.ID();
      seenFirst_m = true;
      int key = GlobalIDDataBase::nullNodeKey();
      layout.touches(domain_m, std::back_inserter(inodes_m),
       TouchesConstructINode<Dim>(firstID_m, key, &gidStore_m));
    }
    else
    {
      shared(layout.ID(), firstID_m);
    }
    if (useGuards) {
      expressionApply(NewEngine_t(engine, grow(domain_m, extent_m)),
        IntersectorTag<Intersector<Dim> >(lhsi_m));
    } else {
      expressionApply(NewEngine_t(engine, domain_m),
        IntersectorTag<Intersector<Dim> >(lhsi_m));
    }
  }
  inline
  void shared(LayoutID_t id1, LayoutID_t id2)
  {
    gidStore_m.shared(id1,id2);
  }
  SimpleIntersectorData(const This_t &);
  This_t &operator=(const This_t &);
  LayoutID_t firstID_m;
  bool seenFirst_m;
  INodeContainer_t inodes_m;
  GlobalIDDataBase gidStore_m;
  Interval<Dim> domain_m;
  GuardLayers<Dim> extent_m;
  Intersector<Dim> lhsi_m;
};
template<int Dim>
class SimpleIntersector
{
public:
  typedef SimpleIntersectorData<Dim> SimpleIntersectorData_t;
  typedef SimpleIntersector<Dim> This_t;
  typedef typename SimpleIntersectorData_t::INode_t INode_t;
  typedef typename SimpleIntersectorData_t::INodeContainer_t INodeContainer_t;
  typedef typename SimpleIntersectorData_t::const_iterator const_iterator;
  typedef RefCountedPtr<SimpleIntersectorData_t> DataPtr_t;
  typedef NullCombine Combine_t;
  enum { dimensions = Dim };
  SimpleIntersector(const Interval<Dim> &domain, const GuardLayers<Dim> &extent)
    : pdata_m(new SimpleIntersectorData_t(domain, extent)), useGuards_m(true)
  { }
  SimpleIntersector(const This_t &model)
    : pdata_m(model.pdata_m), useGuards_m(model.useGuards())
  { }
  This_t &operator=(const This_t &model)
  {
    if (this != &model) {
      pdata_m = model.pdata_m;
      useGuards_m = model.useGuards_m;
    }
    return *this;
  }
  ~SimpleIntersector() { }
  inline DataPtr_t &data() { return pdata_m; }
  inline const DataPtr_t &data() const { return pdata_m; }
  inline const_iterator begin() const { return data()->inodes_m.begin(); }
  inline const_iterator end() const { return data()->inodes_m.end(); }
  inline int size() const { return data()->inodes_m.size(); }
  template<class Engine>
  inline
  void intersect(const Engine &l) const
  {
    data()->intersect(l, useGuards());
  }
  inline
  bool useGuards() const
  {
    return useGuards_m;
  }
  inline
  void useGuards(bool f) const
  {
    useGuards_m = f;
  }
  template<class A>
  void operator()(const A &a, bool f) const
  {
    useGuards(f);
    expressionApply(a, *this);
  }
private:
  DataPtr_t pdata_m;
  mutable bool useGuards_m;
};
template<class Eng, int Dim>
struct DefaultExpressionApply<Eng, SimpleIntersector<Dim> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const Eng &,
        const ExpressionApply<SimpleIntersector<Dim> > &)
  {
    PoomaCTAssert<(!(Eng::multiPatch))>::test();
    return true;
  }
};
template<class LT, class PT>
struct MultiPatch;
template <int Dim, class T, class LayoutTag, class PatchTag>
struct LeafFunctor<Engine<Dim, T, MultiPatch<LayoutTag,PatchTag> >,
  ExpressionApply<SimpleIntersector<Dim> > >
{
  typedef int Type_t;
  static Type_t
  apply(const Engine<Dim,T,MultiPatch<LayoutTag,PatchTag> > &engine,
 const ExpressionApply<SimpleIntersector<Dim> > &apply)
  {
    apply.tag().intersect(engine);
    if (apply.tag().useGuards())
      engine.fillGuards(apply.tag().data()->extent_m);
    return 0;
  }
};
template <int Dim, class T, class LT, class PatchTag, int BD>
struct LeafFunctor<Engine<Dim, T, MultiPatchView<LT,PatchTag,BD> >,
  ExpressionApply<SimpleIntersector<Dim> > >
{
  typedef int Type_t;
  static Type_t
  apply(const Engine<Dim,T,MultiPatchView<LT,PatchTag,BD> > &engine,
 const ExpressionApply<SimpleIntersector<Dim> > &apply)
  {
    apply.tag().intersect(engine);
    if (apply.tag().useGuards())
      engine.fillGuards(apply.tag().data()->extent_m);
    return 0;
  }
};
template <int Dim, int size>
class ScalarCodeInfo
{
public:
  enum { dimensions = Dim };
  enum { arguments = size };
  typedef std::vector<bool> BoolVector_t;
  ScalarCodeInfo()
    : extent_m(GuardLayers<Dim>(0)),
      useGuards_m(arguments, true),
      writers_m(arguments, false),
      readers_m(arguments, true)
  {
    useGuards_m[0] = false;
    writers_m[0] = true;
    readers_m[0] = true;
  }
  void extent(const GuardLayers<Dim> &g)
  {
    extent_m = g;
  }
  GuardLayers<Dim>& extent()
  {
    return extent_m;
  }
  const GuardLayers<Dim>& extent() const
  {
    return extent_m;
  }
  void write(int i, bool f, bool r = true)
  {
    writers_m[i] = f;
    readers_m[i] = r;
  }
  BoolVector_t &writers()
  {
    return writers_m;
  }
  BoolVector_t &readers()
  {
    return readers_m;
  }
  void useGuards(int i, bool f)
  {
    useGuards_m[i] = f;
  }
  BoolVector_t &useGuards()
  {
    return useGuards_m;
  }
  inline Interval<Dim> extendDomain(const Interval<Dim> &domain) const
  {
    return grow(domain, extent_m);
  }
  inline Interval<Dim> evaluationDomain(const Interval<Dim> &domain) const
  {
    Interval<Dim> ret;
    for (int d = 0; d < Dim; ++d)
    {
      ret[d] = Interval<1>(extent_m.lower(d),
      domain[d].last() - domain[d].first()
      + extent_m.lower(d));
    }
    return ret;
  }
  inline INode<Dim> extendDomain(const INode<Dim> &inode) const
  {
    return INode<Dim>(inode, extendDomain(inode.domain()));
  }
private:
  GuardLayers<Dim> extent_m;
  BoolVector_t useGuards_m;
  BoolVector_t writers_m;
  BoolVector_t readers_m;
};
template<class MultiArg> struct MultiArgEvaluatorTag;
template<class MeshTag, class T, class EngineTag> class Field;
template<int Dim, class T, class EngineTag> class Array;
template<class EvalTag>
struct MultiArgEvaluator
{
};
struct EngineWriteNotifier
{
  EngineWriteNotifier()
  {
  }
  template<class A>
  inline void dirtyRelations(const A &a, const WrappedInt<true>&) const
  {
    a.notifyPostWrite();
  }
  template<class A>
  inline void dirtyRelations(const A &, const WrappedInt<false>&) const
  {
  }
  template<class A>
  void operator()(const A &a) const
  {
    notifyEngineWrite(a.engine());
    dirtyRelations(a, WrappedInt<A::hasRelations>());
  }
  template<class MeshTag, class T, class Expr>
  void operator()(const Field<MeshTag, T, ExpressionTag<Expr> >&) const
  {
    if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("writing to expression engine?", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Evaluator/MultiArgEvaluator.h", 124);
  }
  template<int Dim, class T, class Expr>
  void operator()(const Array<Dim, T, ExpressionTag<Expr> >&) const
  {
    if (__builtin_expect(!!(false), true)) {} else Pooma::toss_cookies("writing to expression engine?", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Evaluator/MultiArgEvaluator.h", 130);
  }
};
struct UpdateNotifier
{
  UpdateNotifier()
  {
  }
  template<class A>
  void operator()(const A &a) const
  {
    forEach(a, PerformUpdateTag(), NullCombine());
  }
};
template <int Dim>
struct CheckDomain
{
  CheckDomain(const Interval<Dim>&d) : d_m(d) {}
  template <class A>
  void operator()(const A &a) const
  {
    a(d_m);
  }
  Interval<Dim> d_m;
};
template<>
struct MultiArgEvaluator<MainEvaluatorTag>
{
public:
  MultiArgEvaluator() {}
  ~MultiArgEvaluator() {}
  template<class MultiArg, class Function, int Dim, class Kernel>
  static void
  evaluate(const MultiArg &multiArg,
    const Function &function,
    const Interval<Dim> &domain,
    const Kernel &kernel)
  {
    typedef typename MultiArgEvaluatorTag<MultiArg>::Evaluator_t Evaluator_t;
    ScalarCodeInfo<Dim, MultiArg::size> info;
    function.scalarCodeInfo(info);
    Pooma::beginExpression();
    applyMultiArgIf(multiArg, UpdateNotifier(), info.readers());
    MultiArgEvaluator<Evaluator_t>::evaluate(multiArg, function,
          domain, info, kernel);
    applyMultiArgIf(multiArg, EngineWriteNotifier(), info.writers());
    Pooma::endExpression();
  }
  template<class A1, class Function, int Dim, class Kernel>
  static void
  createIterate(const A1& a1,
  const Function& function,
  const Interval<Dim> &domain,
  ScalarCodeInfo<Dim, A1::size> &info,
  const Kernel &)
  {
    Kernel kernelf(function, domain);
    Pooma::Iterate_t *iterate =
      new MultiArgKernel<A1, Kernel>(a1, kernelf,
         info.writers(), info.readers());
    Pooma::scheduler().handOff(iterate);
  }
};
template<>
struct MultiArgEvaluator<SinglePatchEvaluatorTag>
{
public:
  MultiArgEvaluator() {}
  ~MultiArgEvaluator() {}
  template<class MultiArg, class Function, int Dim, class Kernel>
  static void
  evaluate(const MultiArg& multiArg,
    const Function& function,
    Interval<Dim> domain,
    ScalarCodeInfo<Dim, MultiArg::size> &info,
    const Kernel &kernel)
  {
    Interval<Dim> newDom = info.extendDomain(domain);
    Interval<Dim> evalDom = info.evaluationDomain(domain);
    MultiArgEvaluator<MainEvaluatorTag>::createIterate(multiArg(newDom),
             function,
             evalDom, info,
             kernel);
  }
};
template<>
struct MultiArgEvaluator<MultiPatchEvaluatorTag>
{
public:
  MultiArgEvaluator() {}
  ~MultiArgEvaluator() {}
  template<class MultiArg, class Function, int Dim, class Kernel>
  static void
  evaluate(const MultiArg &multiArg,
    const Function &function,
    const Interval<Dim> &domain,
    ScalarCodeInfo<Dim, MultiArg::size> &info,
    const Kernel &kernel)
  {
    typedef SimpleIntersector<Dim> Inter_t;
    Inter_t inter(domain, info.extent());
    applyMultiArg(multiArg, inter, info.useGuards());
    typename Inter_t::const_iterator i = inter.begin();
    while (i != inter.end())
    {
      INode<Dim> inode = info.extendDomain(*i);
      Interval<Dim> evalDom = info.evaluationDomain((*i).domain());
      MultiArgEvaluator<MainEvaluatorTag>::createIterate(multiArg(inode),
        function,
        evalDom, info,
        kernel);
      ++i;
    }
  }
};
template <>
struct MultiArgEvaluator<RemoteSinglePatchEvaluatorTag>
{
  MultiArgEvaluator() { }
  ~MultiArgEvaluator() { }
  template<class MultiArg, class Function, int Dim, class Kernel>
  static void
  evaluate(const MultiArg &multiArg,
    const Function &function,
    const Interval<Dim> &domain,
    ScalarCodeInfo<Dim, MultiArg::size> &info,
    const Kernel &kernel)
  {
    GatherContexts gtag;
    engineFunctor(multiArg.a1_m.engine(), gtag);
    int lhsContext = gtag.mostCommonContext();
    expressionApply(multiArg, RemoteSend(lhsContext));
    EngineView<RemoteView> view;
    if (lhsContext == -1 || Pooma::context() == lhsContext)
    {
      MultiArgEvaluator<SinglePatchEvaluatorTag> speval;
      speval.evaluate(
        forEach(multiArg, view, TreeCombine()),
        function, domain, info, kernel
        );
    }
  }
};
template <>
struct MultiArgEvaluator<RemoteMultiPatchEvaluatorTag>
{
  MultiArgEvaluator() { }
  ~MultiArgEvaluator() { }
  template<class MultiArg, class Function, int Dim, class Kernel>
  static void
  evaluate(const MultiArg &multiArg,
    const Function &function,
    const Interval<Dim> &domain,
    ScalarCodeInfo<Dim, MultiArg::size> &info,
    const Kernel &kernel)
  {
    typedef SimpleIntersector<Dim> Inter_t;
    Inter_t inter(domain, info.extent());
    applyMultiArg(multiArg, inter, info.useGuards());
    typename Inter_t::const_iterator i = inter.begin();
    while (i != inter.end())
    {
      INode<Dim> inode = info.extendDomain(*i);
      Interval<Dim> evalDom = info.evaluationDomain((*i).domain());
      MultiArgEvaluator<RemoteSinglePatchEvaluatorTag>().
 evaluate(multiArg(inode),
   function, evalDom, info, kernel);
      ++i;
    }
  }
};
template<class A1>
struct MultiArgEvaluatorTag<MultiArg1<A1> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Evaluator_t;
};
template<class A1, class A2>
struct MultiArgEvaluatorTag<MultiArg2<A1, A2> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Evaluator_t;
};
template<class A1, class A2, class A3>
struct MultiArgEvaluatorTag<MultiArg3<A1, A2, A3> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorTag1<A3>::Evaluator_t Eval3_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Eval12_t;
  typedef typename EvaluatorCombine<Eval3_t, Eval12_t>::Evaluator_t
  Evaluator_t;
};
template<class A1, class A2, class A3, class A4>
struct MultiArgEvaluatorTag<MultiArg4<A1, A2, A3, A4> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorTag1<A3>::Evaluator_t Eval3_t;
  typedef typename EvaluatorTag1<A4>::Evaluator_t Eval4_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Eval12_t;
  typedef typename EvaluatorCombine<Eval3_t, Eval4_t>::Evaluator_t Eval34_t;
  typedef typename EvaluatorCombine<Eval12_t, Eval34_t>::Evaluator_t Evaluator_t;
};
template<class A1, class A2, class A3, class A4, class A5>
struct MultiArgEvaluatorTag<MultiArg5<A1, A2, A3, A4, A5> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorTag1<A3>::Evaluator_t Eval3_t;
  typedef typename EvaluatorTag1<A4>::Evaluator_t Eval4_t;
  typedef typename EvaluatorTag1<A5>::Evaluator_t Eval5_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Eval12_t;
  typedef typename EvaluatorCombine<Eval3_t, Eval4_t>::Evaluator_t Eval34_t;
  typedef typename EvaluatorCombine<Eval12_t, Eval34_t>::Evaluator_t Eval1234_t;
  typedef typename EvaluatorCombine<Eval1234_t, Eval5_t>::Evaluator_t Evaluator_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6>
struct MultiArgEvaluatorTag<MultiArg6<A1, A2, A3, A4, A5, A6> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorTag1<A3>::Evaluator_t Eval3_t;
  typedef typename EvaluatorTag1<A4>::Evaluator_t Eval4_t;
  typedef typename EvaluatorTag1<A5>::Evaluator_t Eval5_t;
  typedef typename EvaluatorTag1<A6>::Evaluator_t Eval6_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Eval12_t;
  typedef typename EvaluatorCombine<Eval3_t, Eval4_t>::Evaluator_t Eval34_t;
  typedef typename EvaluatorCombine<Eval5_t, Eval6_t>::Evaluator_t Eval56_t;
  typedef typename EvaluatorCombine<Eval12_t, Eval34_t>::Evaluator_t Eval1234_t;
  typedef typename EvaluatorCombine<Eval1234_t, Eval56_t>::Evaluator_t Evaluator_t;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7>
struct MultiArgEvaluatorTag<MultiArg7<A1, A2, A3, A4, A5, A6, A7> >
{
  typedef typename EvaluatorTag1<A1>::Evaluator_t Eval1_t;
  typedef typename EvaluatorTag1<A2>::Evaluator_t Eval2_t;
  typedef typename EvaluatorTag1<A3>::Evaluator_t Eval3_t;
  typedef typename EvaluatorTag1<A4>::Evaluator_t Eval4_t;
  typedef typename EvaluatorTag1<A5>::Evaluator_t Eval5_t;
  typedef typename EvaluatorTag1<A6>::Evaluator_t Eval6_t;
  typedef typename EvaluatorTag1<A7>::Evaluator_t Eval7_t;
  typedef typename EvaluatorCombine<Eval1_t, Eval2_t>::Evaluator_t Eval12_t;
  typedef typename EvaluatorCombine<Eval3_t, Eval12_t>::Evaluator_t Eval123_t;
  typedef typename EvaluatorCombine<Eval4_t, Eval123_t>::Evaluator_t Eval1234_t;
  typedef typename EvaluatorCombine<Eval5_t, Eval1234_t>::Evaluator_t Eval12345_t;
  typedef typename EvaluatorCombine<Eval6_t, Eval12345_t>::Evaluator_t Eval123456_t;
  typedef typename EvaluatorCombine<Eval7_t, Eval123456_t>::Evaluator_t
  Evaluator_t;
};
template<class A1, class Tag>
struct LeafFunctor<MultiArg1<A1>, ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg1<A1> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    return 0;
  }
};
template<class A1, class Tag>
struct LeafFunctor<MultiArg1<A1>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef MultiArg1<Type1_t> Type_t;
  inline static
  Type_t apply(const MultiArg1<A1> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag)
    );
  }
};
template<class A1, class A2, class Tag>
struct LeafFunctor<MultiArg2<A1, A2>, ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg2<A1, A2> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    return 0;
  }
};
template<class A1, class A2, class Tag>
struct LeafFunctor<MultiArg2<A1, A2>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef MultiArg2<Type1_t, Type2_t> Type_t;
  inline static
  Type_t apply(const MultiArg2<A1, A2> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag)
    );
  }
};
template<class A1, class A2, class A3, class Tag>
struct LeafFunctor<MultiArg3<A1, A2, A3>,
  ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg3<A1, A2, A3> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    leafFunctor(multiarg.a3_m, tag);
    return 0;
  }
};
template<class A1, class A2, class A3, class Tag>
struct LeafFunctor<MultiArg3<A1, A2, A3>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef typename LeafFunctor<A3, EngineView<Tag> >::Type_t Type3_t;
  typedef MultiArg3<Type1_t, Type2_t, Type3_t> Type_t;
  inline static
  Type_t apply(const MultiArg3<A1, A2, A3> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag),
    leafFunctor(multiarg.a3_m, tag)
    );
  }
};
template<class A1, class A2, class A3, class A4, class Tag>
struct LeafFunctor<MultiArg4<A1, A2, A3, A4>,
  ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg4<A1, A2, A3, A4> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    leafFunctor(multiarg.a3_m, tag);
    leafFunctor(multiarg.a4_m, tag);
    return 0;
  }
};
template<class A1, class A2, class A3, class A4, class Tag>
struct LeafFunctor<MultiArg4<A1, A2, A3, A4>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef typename LeafFunctor<A3, EngineView<Tag> >::Type_t Type3_t;
  typedef typename LeafFunctor<A4, EngineView<Tag> >::Type_t Type4_t;
  typedef MultiArg4<Type1_t, Type2_t, Type3_t, Type4_t> Type_t;
  inline static
  Type_t apply(const MultiArg4<A1, A2, A3, A4> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag),
    leafFunctor(multiarg.a3_m, tag),
    leafFunctor(multiarg.a4_m, tag)
    );
  }
};
template<class A1, class A2, class A3, class A4, class A5, class Tag>
struct LeafFunctor<MultiArg5<A1, A2, A3, A4, A5>,
  ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg5<A1, A2, A3, A4, A5> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    leafFunctor(multiarg.a3_m, tag);
    leafFunctor(multiarg.a4_m, tag);
    leafFunctor(multiarg.a5_m, tag);
    return 0;
  }
};
template<class A1, class A2, class A3, class A4, class A5, class Tag>
struct LeafFunctor<MultiArg5<A1, A2, A3, A4, A5>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef typename LeafFunctor<A3, EngineView<Tag> >::Type_t Type3_t;
  typedef typename LeafFunctor<A4, EngineView<Tag> >::Type_t Type4_t;
  typedef typename LeafFunctor<A5, EngineView<Tag> >::Type_t Type5_t;
  typedef MultiArg5<Type1_t, Type2_t, Type3_t, Type4_t, Type5_t> Type_t;
  inline static
  Type_t apply(const MultiArg5<A1, A2, A3, A4, A5> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag),
    leafFunctor(multiarg.a3_m, tag),
    leafFunctor(multiarg.a4_m, tag),
    leafFunctor(multiarg.a5_m, tag)
    );
  }
};
template<class A1, class A2, class A3, class A4, class A5,
  class A6, class Tag>
struct LeafFunctor<MultiArg6<A1, A2, A3, A4, A5, A6>,
  ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg6<A1, A2, A3, A4, A5, A6> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    leafFunctor(multiarg.a3_m, tag);
    leafFunctor(multiarg.a4_m, tag);
    leafFunctor(multiarg.a5_m, tag);
    leafFunctor(multiarg.a6_m, tag);
    return 0;
  }
};
template<class A1, class A2, class A3, class A4, class A5,
  class A6, class Tag>
struct LeafFunctor<MultiArg6<A1, A2, A3, A4, A5, A6>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef typename LeafFunctor<A3, EngineView<Tag> >::Type_t Type3_t;
  typedef typename LeafFunctor<A4, EngineView<Tag> >::Type_t Type4_t;
  typedef typename LeafFunctor<A5, EngineView<Tag> >::Type_t Type5_t;
  typedef typename LeafFunctor<A6, EngineView<Tag> >::Type_t Type6_t;
  typedef MultiArg6<Type1_t, Type2_t, Type3_t, Type4_t, Type5_t,
    Type6_t> Type_t;
  inline static
  Type_t apply(const MultiArg6<A1, A2, A3, A4, A5, A6> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag),
    leafFunctor(multiarg.a3_m, tag),
    leafFunctor(multiarg.a4_m, tag),
    leafFunctor(multiarg.a5_m, tag),
    leafFunctor(multiarg.a6_m, tag)
    );
  }
};
template<class A1, class A2, class A3, class A4, class A5,
  class A6, class A7, class Tag>
struct LeafFunctor<MultiArg7<A1, A2, A3, A4, A5, A6, A7>,
  ExpressionApply<Tag> >
{
  typedef int Type_t;
  inline static
  Type_t apply(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &multiarg,
        const ExpressionApply<Tag> &tag)
  {
    leafFunctor(multiarg.a1_m, tag);
    leafFunctor(multiarg.a2_m, tag);
    leafFunctor(multiarg.a3_m, tag);
    leafFunctor(multiarg.a4_m, tag);
    leafFunctor(multiarg.a5_m, tag);
    leafFunctor(multiarg.a6_m, tag);
    leafFunctor(multiarg.a7_m, tag);
    return 0;
  }
};
template<class A1, class A2, class A3, class A4, class A5,
  class A6, class A7, class Tag>
struct LeafFunctor<MultiArg7<A1, A2, A3, A4, A5, A6, A7>, EngineView<Tag> >
{
  typedef typename LeafFunctor<A1, EngineView<Tag> >::Type_t Type1_t;
  typedef typename LeafFunctor<A2, EngineView<Tag> >::Type_t Type2_t;
  typedef typename LeafFunctor<A3, EngineView<Tag> >::Type_t Type3_t;
  typedef typename LeafFunctor<A4, EngineView<Tag> >::Type_t Type4_t;
  typedef typename LeafFunctor<A5, EngineView<Tag> >::Type_t Type5_t;
  typedef typename LeafFunctor<A6, EngineView<Tag> >::Type_t Type6_t;
  typedef typename LeafFunctor<A7, EngineView<Tag> >::Type_t Type7_t;
  typedef MultiArg7<Type1_t, Type2_t, Type3_t, Type4_t, Type5_t,
    Type6_t, Type7_t> Type_t;
  inline static
  Type_t apply(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &multiarg,
        const EngineView<Tag> &tag)
  {
    return Type_t(
    leafFunctor(multiarg.a1_m, tag),
    leafFunctor(multiarg.a2_m, tag),
    leafFunctor(multiarg.a3_m, tag),
    leafFunctor(multiarg.a4_m, tag),
    leafFunctor(multiarg.a5_m, tag),
    leafFunctor(multiarg.a6_m, tag),
    leafFunctor(multiarg.a7_m, tag)
    );
  }
};
template<class MA, class Function>
struct ApplyMultiArgLoc;
template<class A1, class Function>
struct ApplyMultiArgLoc<MultiArg1<A1>, Function>
{
  ApplyMultiArgLoc(const MultiArg1<A1> &multiArg, const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg1<A1> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class Function>
struct ApplyMultiArgLoc<MultiArg2<A1, A2>, Function>
{
  ApplyMultiArgLoc(const MultiArg2<A1, A2> &multiArg,const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg2<A1, A2> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class A3, class Function>
struct ApplyMultiArgLoc<MultiArg3<A1, A2, A3>, Function>
{
  ApplyMultiArgLoc(const MultiArg3<A1, A2, A3> &multiArg,
     const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
        Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
        Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
        Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
        Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg3<A1, A2, A3> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class Function>
struct ApplyMultiArgLoc<MultiArg7<A1, A2, A3, A4, A5, A6, A7>, Function>
{
  ApplyMultiArgLoc(const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &multiArg,
     const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               multiArg_m.a7_m, Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               multiArg_m.a7_m, Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               multiArg_m.a7_m, Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               multiArg_m.a7_m, Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg7<A1, A2, A3, A4, A5, A6, A7> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class A3, class A4, class A5, class A6, class Function>
struct ApplyMultiArgLoc<MultiArg6<A1, A2, A3, A4, A5, A6>, Function>
{
  ApplyMultiArgLoc(const MultiArg6<A1, A2, A3, A4, A5, A6> &multiArg,
     const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
                Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m, multiArg_m.a6_m,
               Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg6<A1, A2, A3, A4, A5, A6> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class A3, class A4, class Function>
struct ApplyMultiArgLoc<MultiArg4<A1, A2, A3, A4>, Function>
{
  ApplyMultiArgLoc(const MultiArg4<A1, A2, A3, A4> &multiArg,
     const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m,
               Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m,
                Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m,
               Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m,
               Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg4<A1, A2, A3, A4> &multiArg_m;
  const Function &function_m;
};
template<class A1, class A2, class A3, class A4, class A5, class Function>
struct ApplyMultiArgLoc<MultiArg5<A1, A2, A3, A4, A5>, Function>
{
  ApplyMultiArgLoc(const MultiArg5<A1, A2, A3, A4, A5> &multiArg,
     const Function &function)
    : multiArg_m(multiArg), function_m(function)
  {
  }
  void operator()(int i0) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m,
               Loc<1>(i0));
  }
  void operator()(int i0, int i1) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m,
                Loc<2>(i0, i1));
  }
  void operator()(int i0, int i1, int i2) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m,
               Loc<3>(i0, i1, i2));
  }
  void operator()(int i0, int i1, int i2, int i3) const
  {
    function_m(multiArg_m.a1_m, multiArg_m.a2_m, multiArg_m.a3_m,
               multiArg_m.a4_m, multiArg_m.a5_m,
               Loc<4>(i0, i1, i2, i3));
  }
  const MultiArg5<A1, A2, A3, A4, A5> &multiArg_m;
  const Function &function_m;
};
template<class Function, int Dim>
struct EvaluateLocLoop
{
  EvaluateLocLoop()
  {
  }
  EvaluateLocLoop(const Function &function, const Interval<Dim> &domain)
    : function_m(function), domain_m(domain)
  {
  }
  template<class MultiArg>
  void operator()(MultiArg &multiArg) const
  {
    ApplyMultiArgLoc<MultiArg, Function> op(multiArg, function_m);
    LoopApplyEvaluator::evaluate(op, domain_m);
  }
  Function function_m;
  Interval<Dim> domain_m;
};
template<class Function>
struct ScalarCode
{
  ScalarCode()
  {
  }
  ScalarCode(const Function &function)
    : function_m(function)
  {
  }
  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>)
  {
    return true;
  }
  template<class F>
  static inline bool checkValidity(const F& f, WrappedInt<true>)
  {
    return f.centeringSize() == 1 && f.numMaterials() == 1;
  }
  template<class F1>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom) const
  {
    ;
    MultiArg1<F1> multiArg(f1);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1>
  inline void operator()(const F1 &f1) const
  {
    (*this)(f1, f1.physicalDomain());
  }
  template<class F1, class F2>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
                  const F2 &f2) const
  {
    ;
    MultiArg2<F1, F2> multiArg(f1, f2);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2>
  inline void operator()(const F1 &f1, const F2 &f2) const
  {
    (*this)(f1, f1.physicalDomain(), f2);
  }
  template<class F1, class F2, class F3>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
                  const F2 &f2, const F3 &f3) const
  {
    ;
    MultiArg3<F1, F2, F3> multiArg(f1, f2, f3);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2, class F3>
  inline void operator()(const F1 &f1, const F2 &f2, const F3 &f3) const
  {
    (*this)(f1, f1.physicalDomain(), f2, f3);
  }
  template<class F1, class F2, class F3, class F4>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
    const F2 &f2, const F3 &f3, const F4 &f4) const
  {
    ;
    MultiArg4<F1, F2, F3, F4> multiArg(f1, f2, f3, f4);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2, class F3, class F4>
  inline void operator()(const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4) const
  {
    (*this)(f1, f1.physicalDomain(), f2, f3, f4);
  }
  template<class F1, class F2, class F3, class F4, class F5>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
    const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5) const
  {
    ;
    MultiArg5<F1, F2, F3, F4, F5> multiArg(f1, f2, f3, f4, f5);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2, class F3, class F4, class F5>
  inline void operator()(const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4,
    const F5 &f5) const
  {
    (*this)(f1, f1.physicalDomain(), f2, f3, f4, f5);
  }
  template<class F1, class F2, class F3, class F4, class F5, class F6>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
    const F2 &f2, const F3 &f3, const F4 &f4, const F5 &f5,
    const F6 &f6) const
  {
    ;
    MultiArg6<F1, F2, F3, F4, F5, F6> multiArg(f1, f2, f3, f4, f5, f6);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2, class F3, class F4, class F5, class F6>
  inline void operator()(const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4,
    const F5 &f5, const F6 &f6) const
  {
    (*this)(f1, f1.physicalDomain(), f2, f3, f4, f5, f6);
  }
  template<class F1, class F2, class F3, class F4, class F5, class F6, class F7>
  void operator()(const F1 &f1, const Interval<F1::dimensions> &evalDom,
    const F2 &f2, const F3 &f3, const F4 &f4,
    const F5 &f5, const F6 &f6, const F7 &f7) const
  {
    ;
    MultiArg7<F1, F2, F3, F4, F5, F6, F7> multiArg(f1, f2, f3, f4, f5, f6, f7);
    EvaluateLocLoop<Function, F1::dimensions> kernel(function_m, evalDom);
    MultiArgEvaluator<MainEvaluatorTag>::
      evaluate(multiArg, function_m, evalDom, kernel);
  }
  template<class F1, class F2, class F3, class F4, class F5, class F6, class F7>
  inline void operator()(const F1 &f1, const F2 &f2, const F3 &f3, const F4 &f4,
    const F5 &f5, const F6 &f6, const F7 &f7) const
  {
    (*this)(f1, f1.physicalDomain(), f2, f3, f4, f5, f6, f7);
  }
  Function function_m;
};
template<class InputField>
struct PackLocalPatches
{
  typedef typename InputField::Element_t Element_t;
  PackLocalPatches(RefCountedBlockPtr<Element_t> block)
    : block_m(block)
  {
  }
  inline void operator()(const Element_t &t)
  {
    *block_m = t;
    ++block_m;
  }
  RefCountedBlockPtr<Element_t> block_m;
  int total_m;
};
template<class InputField>
RefCountedBlockPtr<typename InputField::Element_t>
pack(const InputField &field)
{
  Pooma::blockAndEvaluate();
  typedef typename InputField::Element_t Element_t;
  int size, i;
  size = 0;
  for (i = 0; i < field.numPatchesLocal(); ++i)
  {
    size += field.patchLocal(i).domain().size();
  }
  RefCountedBlockPtr<Element_t> ret(size);
  RefCountedBlockPtr<Element_t> current = ret;
  for (i = 0; i < field.numPatchesLocal(); ++i)
  {
    typedef typename Patch<InputField>::Type_t PatchField_t;
    PatchField_t patch = field.patchLocal(i);
    PackLocalPatches<PatchField_t> packFunctor(current);
    EngineBlockSerialize::apply(packFunctor, patch, patch.domain());
    current += patch.domain().size();
  }
  return ret;
}
template<class InputField>
struct UnPackLocalPatches
{
  typedef typename InputField::Element_t Element_t;
  UnPackLocalPatches(RefCountedBlockPtr<Element_t> block)
    : block_m(block)
  {
  }
  inline void operator()(Element_t &t)
  {
    t = *block_m;
    ++block_m;
  }
  RefCountedBlockPtr<Element_t> block_m;
  int total_m;
};
template<class InputField, class T>
void
unpack(const InputField &field, RefCountedBlockPtr<T> block)
{
  Pooma::blockAndEvaluate();
  int i;
  RefCountedBlockPtr<T> current = block;
  for (i = 0; i < field.numPatchesLocal(); ++i)
  {
    typedef typename Patch<InputField>::Type_t PatchField_t;
    PatchField_t patch = field.patchLocal(i);
    UnPackLocalPatches<PatchField_t> unpackFunctor(current);
    EngineBlockSerialize::apply(unpackFunctor, patch, patch.physicalDomain());
    current += patch.physicalDomain().size();
  }
}
struct FarLeftTag;
template<class G, class T, class E> class Field;
template<class Expr>
struct MakeFieldReturn;
template<class Op, class Leaf>
struct MakeFieldReturn<UnaryNode<Op, Leaf> >
{
  typedef UnaryNode<Op, Leaf> Tree_t;
  typedef typename
    ForEach<Tree_t, DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename ForEach<Tree_t, EvalLeaf<dim>, OpCombine>::Type_t T_t;
  typedef Engine<dim, T_t, ExpressionTag<Tree_t> > Engine_t;
  typedef typename ForEach<Tree_t, FarLeftTag, FarLeftTag>::
    Type_t::MeshTag_t MeshTag_t;
  typedef Field<MeshTag_t, T_t, ExpressionTag<Tree_t> > Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class Op, class Left, class Right>
struct MakeFieldReturn<BinaryNode<Op, Left, Right> >
{
  typedef BinaryNode<Op, Left, Right> Tree_t;
  typedef typename
    ForEach<Tree_t, DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename ForEach<Tree_t, EvalLeaf<dim>, OpCombine>::Type_t T_t;
  typedef Engine<dim, T_t, ExpressionTag<Tree_t> > Engine_t;
  typedef typename ForEach<Tree_t, FarLeftTag, FarLeftTag>::
    Type_t::MeshTag_t MeshTag_t;
  typedef Field<MeshTag_t, T_t, ExpressionTag<Tree_t> >
    Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class Op, class Left, class Middle, class Right>
struct MakeFieldReturn<TrinaryNode<Op, Left, Middle, Right> >
{
  typedef TrinaryNode<Op, Left, Middle, Right> Tree_t;
  typedef typename
    ForEach<Tree_t, DomainFunctorTag, DomainFunctorTag>::Type_t Domain_t;
  enum { dim = Domain_t::dimensions };
  typedef typename ForEach<Tree_t, EvalLeaf<dim>, OpCombine>::Type_t T_t;
  typedef Engine<dim, T_t, ExpressionTag<Tree_t> > Engine_t;
  typedef typename ForEach<Tree_t, FarLeftTag, FarLeftTag>::
    Type_t::MeshTag_t MeshTag_t;
  typedef Field<MeshTag_t, T_t, ExpressionTag<Tree_t> > Expression_t;
  inline static
  Expression_t make(const Tree_t &tree)
    {
      return Expression_t(Engine_t(tree));
    }
};
template<class G, class T, class E> class Field;
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnArcCos,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
acos(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnArcCos,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnArcSin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
asin(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnArcSin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnArcTan,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
atan(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnArcTan,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnCeil,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
ceil(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnCeil,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnCos,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
cos(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnCos,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnHypCos,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
cosh(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnHypCos,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnExp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
exp(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnExp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnFabs,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
fabs(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnFabs,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnFloor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
floor(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnFloor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnLog,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
log(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnLog,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnLog10,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
log10(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnLog10,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnSin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
sin(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnSin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnHypSin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
sinh(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnHypSin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnSqrt,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
sqrt(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnSqrt,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnTan,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
tan(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnTan,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnHypTan,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
tanh(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnHypTan,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<OpUnaryMinus,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<OpUnaryMinus,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<OpUnaryPlus,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<OpUnaryPlus,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<OpBitwiseNot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
operator~(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<OpBitwiseNot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<OpIdentity,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
PETE_identity(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<OpIdentity,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<OpNot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
operator!(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<OpNot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<UnaryNode<OpCast<T1>,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
peteCast(const T1&, const Field<G2,T2,E2> & l)
{
  typedef UnaryNode<OpCast<T1>,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G2,T2,E2> >::make(l)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLeftShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<<(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLeftShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpRightShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>>(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpRightShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpLT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpLE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<=(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpGT,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpGE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>=(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator&&(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator||(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLeftShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator<<(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLeftShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpLeftShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator<<(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLeftShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpRightShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
operator>>(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpRightShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpRightShift,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
operator>>(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpRightShift,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator<=(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator>=(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAnd,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAnd,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&&(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAnd,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpOr,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpOr,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator||(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpOr,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2,class T3>
inline typename MakeFieldReturn<TrinaryNode<FnWhere,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t,
  typename CreateLeaf<T3 >::Leaf_t> >::Expression_t
where(const Field<G1,T1,E1> & c,const T2 & t,const T3 & f)
{
  typedef TrinaryNode<FnWhere,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t,
    typename CreateLeaf<T3 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(c),
    CreateLeaf<T2 >::make(t),
    CreateLeaf<T3 >::make(f)));
}
template<int D, class T, class EngineTag> class Tensor;
template<class OutputEngineTag, int D, class T, class EngineTag>
Tensor<D, T, OutputEngineTag>
symmetrize(const Tensor<D, T, EngineTag> &x);
template<class G, class T, class E> class Field;
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnReal,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
real(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnReal,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnImag,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
imag(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnImag,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnAbs,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
abs(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnAbs,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnArg,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
arg(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnArg,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnNorm,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
norm(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnNorm,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnConj,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
conj(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnConj,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnPow2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
pow2(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnPow2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnPow3,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
pow3(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnPow3,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnPow4,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
pow4(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnPow4,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnMagnitude,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
magnitude(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnMagnitude,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnTrace,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
trace(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnTrace,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnDet,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
det(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnDet,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnTranspose,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
transpose(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnTranspose,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class OutputSymmetry,class G1,class T1,class E1>
inline typename MakeFieldReturn<UnaryNode<FnSymmetrize<OutputSymmetry>,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> >::Expression_t
symmetrize(const Field<G1,T1,E1> & l)
{
  typedef UnaryNode<FnSymmetrize<OutputSymmetry>,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
polar(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
min(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMax,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
max(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LT(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LE(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GT(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GE(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
NE(const Field<G1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
polar(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
polar(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
outerProduct(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
dotdot(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
min(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnMin,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
min(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMax,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
max(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<FnMax,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
max(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LT(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
LT(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
LE(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
LE(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GT(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
GT(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
GE(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
GE(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
EQ(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> >::Expression_t
NE(const Field<G1,T1,E1> & l,const Array<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Array<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Array<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,class T2>
inline typename MakeFieldReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<T2 >::Leaf_t> >::Expression_t
NE(const Field<G1,T1,E1> & l,const T2 & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<T2 >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<T2 >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPolar,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
polar(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPolar,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
polar(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPolar,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProduct,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProduct(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProduct,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnOuterProductAsTinyMatrix,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
outerProductAsTinyMatrix(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnOuterProductAsTinyMatrix,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDotDot,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dotdot(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDotDot,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMin,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
min(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMin,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
min(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMax,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
max(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnMax,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
max(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LT(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLT2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LT(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLT2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LE(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpLE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
LE(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpLE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GT(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGT2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GT(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGT2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GE(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpGE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
GE(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpGE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
EQ(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE2,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
NE(const Array<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class T1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE2,
  typename CreateLeaf<T1 >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
NE(const T1 & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE2,
    typename CreateLeaf<T1 >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<T1 >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<class G, class T, class E> class Field;
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const Vector<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Vector<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Vector<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int D2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const Tensor<D2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Tensor<D2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<Tensor<D2,T2,E2> >::make(r)));
}
template<class G1,class T1,class E1,int DR2,int DC2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
  typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Field<G1,T1,E1> & l,const TinyMatrix<DR2,DC2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Field<G1,T1,E1> >::Leaf_t,
    typename CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<G1,T1,E1> >::make(l),
    CreateLeaf<TinyMatrix<DR2,DC2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpAdd,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator+(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpAdd,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpSubtract,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator-(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpSubtract,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMultiply,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator*(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMultiply,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpDivide,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator/(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpDivide,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpMod,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator%(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpMod,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseAnd,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator&(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseAnd,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseOr,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator|(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseOr,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpBitwiseXor,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator^(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpBitwiseXor,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnDot,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
dot(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnDot,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnLdexp,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
ldexp(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnLdexp,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnPow,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
pow(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnPow,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnFmod,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
fmod(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnFmod,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<FnArcTan2,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
atan2(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<FnArcTan2,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpEQ,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator==(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpEQ,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Vector<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Vector<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Vector<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int D1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const Tensor<D1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<Tensor<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Tensor<D1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
template<int DR1,int DC1,class T1,class E1,class G2,class T2,class E2>
inline typename MakeFieldReturn<BinaryNode<OpNE,
  typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> >::Expression_t
operator!=(const TinyMatrix<DR1,DC1,T1,E1> & l,const Field<G2,T2,E2> & r)
{
  typedef BinaryNode<OpNE,
    typename CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<G2,T2,E2> >::Leaf_t> Tree_t;
  return MakeFieldReturn<Tree_t>::make(Tree_t(
    CreateLeaf<TinyMatrix<DR1,DC1,T1,E1> >::make(l),
    CreateLeaf<Field<G2,T2,E2> >::make(r)));
}
struct FarLeftTag;
template<class G, class T, class E> class Field;
template<class GeometryTag, class T, class Expr>
struct CreateLeaf<Field<GeometryTag, T, ExpressionTag<Expr> > >
{
  typedef Field<GeometryTag, T, ExpressionTag<Expr> > Input_t;
  typedef Expr Leaf_t;
  typedef const Leaf_t &Return_t;
  inline static
  Return_t make(const Input_t &f)
    {
      return f.engine().expression();
    }
};
template<class GeometryTag, class T, class EngineTag>
struct CreateLeaf<Field<GeometryTag, T, EngineTag> >
{
  typedef Field<GeometryTag, T, EngineTag> Input_t;
  typedef Reference<Input_t> Leaf_t;
  typedef Leaf_t Return_t;
  inline static
  Return_t make(const Input_t &f)
    {
      return Leaf_t(f);
    }
};
template<class GeometryTag, class T, class EngineTag>
struct CreateLeaf<Scalar<Field<GeometryTag, T, EngineTag> > >
{
  typedef Scalar<Field<GeometryTag, T, EngineTag> > Input_t;
  typedef Scalar<ErrorType> Leaf_t;
  typedef Leaf_t Return_t;
  inline static
  Return_t make(const Input_t &)
    {
      return ErrorType();
    }
};
template <int Dim>
class Centering;
template <int Dim>
class CanonicalCentering;
enum CenteringType {
 VertexType,
 EdgeType,
 FaceType,
 CellType
};
enum ContinuityType {
 Continuous = 0,
 Discontinuous
};
enum {
 XDim = 1,
 YDim = XDim << 1,
 ZDim = YDim << 1,
 AllDim = XDim | YDim | ZDim
};
template <int Dim>
class Centering
{
public:
  typedef Loc<Dim> Orientation;
  typedef Vector<Dim> Position;
  typedef std::vector<Orientation> Orientations;
  typedef std::vector<Position> Positions;
  Centering(CenteringType cent = CellType, ContinuityType cont = Continuous)
    : centering_type_m(cent), discontinuous_m(cont),
      orientations_m(0), positions_m(0)
    { }
  Centering(CenteringType cent, ContinuityType cont,
     const Orientations &orientations, const Positions &positions)
    : centering_type_m(cent), discontinuous_m(cont),
      orientations_m(orientations), positions_m(positions)
  {
      return;
  }
  Centering(const Centering<Dim>& model, int c)
    : centering_type_m(model.centering_type_m),
      discontinuous_m(model.discontinuous_m),
      orientations_m(1, model.orientations_m[c]),
      positions_m(1, model.positions_m[c])
    { }
  Centering<Dim> operator[](int iSubField) const
  {
    return Centering<Dim>(*this, iSubField);
  }
  ~Centering() { }
  inline CenteringType centeringType() const
    {
      return centering_type_m;
    }
  inline ContinuityType continuityType() const
    {
      return discontinuous_m;
    }
  inline bool discontinuous() const
  {
    return discontinuous_m == Discontinuous;
  }
  inline bool continuous() const
  {
    return discontinuous_m == Continuous;
  }
  inline const Orientations &orientations() const
  {
    return orientations_m;
  }
  inline const Positions &positions() const
  {
    return positions_m;
  }
  inline const Orientation &orientation(int i) const
  {
    return orientations_m[i];
  }
  inline const Position &position(int i) const
  {
    return positions_m[i];
  }
  inline int size() const
  {
    return orientations_m.size();
  }
  inline void
  addValue(const Orientation &orientation,
    const Position &position)
    {
      orientations_m.push_back(orientation);
      positions_m.push_back(position);
      return;
    }
private:
  CenteringType centering_type_m;
  ContinuityType discontinuous_m;
  Orientations orientations_m;
  Positions positions_m;
};
template <int Dim>
class CanonicalCentering {
public:
  CanonicalCentering();
  ~CanonicalCentering () {
    if (--class_count_m == 0) {
      for (int i = 0; i <= CellType; ++i) {
 for (int j = 0; j < 2; ++j)
   delete [] centering_table_m[i][j];
 delete [] centering_table_m[i];
      }
      delete [] centering_table_m;
    }
  }
  inline Centering<Dim> operator()
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     int dimension = 0) const
  {
    if (dimension == 0)
      dimension = AllDim;
    dimension %= (1<<Dim);
    return centering_table_m[type][discontinuous][dimension];
  }
private:
  inline static void addValue(typename Centering<Dim>::Orientations &os,
         typename Centering<Dim>::Positions &pos,
         const typename Centering<Dim>::Orientation &o,
         const typename Centering<Dim>::Position &p)
  {
    os.push_back(o);
    pos.push_back(p);
    return;
  }
  template <class T>
  inline static
  T combine(const T &op1, const T &op2)
  {
    T answer(op1);
    answer.insert(answer.end(), op2.begin(), op2.end());
    return answer;
  }
  static int class_count_m;
  static Centering<Dim>*** centering_table_m;
};
template <int Dim>
std::ostream &operator<<(std::ostream &o,
                         const Centering<Dim> &centering)
{
  switch (centering.centeringType())
  {
  case VertexType:
    o << "Vertex";
    break;
  case EdgeType:
    o << "Edge";
    break;
  case FaceType:
    o << "Face";
    break;
  case CellType:
    o << "Cell";
    break;
  }
  o << "," << (centering.continuous() ? "Continuous" : "Discontinuous")
    << ",{";
  for (int i = 0; i < centering.size();)
  {
    o << "[" << centering.orientation(i)
      << "," << centering.position(i) << "]";
    ++i;
    if (i < centering.size())
      o << ",";
  }
  o << "}";
  return o;
}
template <int Dim>
bool operator==(const Centering<Dim> &centering1, const Centering<Dim> &centering2)
{
  return
    centering1.centeringType() == centering2.centeringType() &&
    centering1.discontinuous() == centering2.discontinuous() &&
    centering1.orientations() == centering2.orientations() &&
    centering1.positions() == centering2.positions();
}
template <int Dim>
bool operator!=(const Centering<Dim> &centering1, const Centering<Dim> &centering2)
{
  return !(centering1 == centering2);
}
template <int Dim>
int CanonicalCentering<Dim>::class_count_m = 0;
template <int Dim>
Centering<Dim>*** CanonicalCentering<Dim>::centering_table_m = 0;
extern const CanonicalCentering<1> canonicalCenteringOne_g;
extern const CanonicalCentering<2> canonicalCenteringTwo_g;
extern const CanonicalCentering<3> canonicalCenteringThree_g;
template <int Dim>
const Centering<Dim> canonicalCentering
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension = 0);
template <>
const Centering<1> canonicalCentering<1>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension);
template <>
const Centering<2> canonicalCentering<2>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension);
template <>
const Centering<3> canonicalCentering<3>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension);
template<int Dim>
inline Interval<Dim>
cellDomainToCenteringDomain(const Interval<Dim> &cellDom,
                            const Centering<Dim> &centering, int i)
{
  if (centering.discontinuous())
  {
    return cellDom;
  }
  else
  {
    return shrinkRight(growRight(cellDom, 1), centering.orientation(i));
  }
}
template<int Dim>
inline Interval<Dim>
centeringDomainToCellDomain(const Interval<Dim> &cDom,
                            const Centering<Dim> &centering, int i)
{
  if (centering.discontinuous())
  {
    return cDom;
  }
  else
  {
    return shrinkRight(growRight(cDom, centering.orientation(i)), 1);
  }
}
template <int Dim>
class FieldOffset;
template <int Dim>
class FieldOffsetList;
template <int Dim>
class FieldOffset {
public:
  FieldOffset(const Loc<Dim> &loc, const int subFieldNumber = 0)
    : cell_offset_m(loc), subfield_number_m(subFieldNumber)
  {
    return;
  }
  FieldOffset()
    : cell_offset_m(Loc<Dim>()), subfield_number_m(0)
  {}
  inline void setSubFieldNumber(int subFieldNumber)
    {
      subfield_number_m = subFieldNumber;
      return;
    }
  inline Loc<Dim> &modifyCellOffset()
    {
      return cell_offset_m;
    }
  inline const Loc<Dim> &cellOffset() const
    {
      return cell_offset_m;
    }
  inline int subFieldNumber() const
    {
      return subfield_number_m;
    }
private:
  Loc<Dim> cell_offset_m;
  int subfield_number_m;
};
template <int Dim>
std::ostream &operator<<(std::ostream &o,
    const FieldOffset<Dim> &fieldOffset)
{
  return o << "FieldOffset: (" << fieldOffset.cellOffset()
    << ", " << fieldOffset.subFieldNumber() << ")";
}
template <int Dim>
inline bool
operator==(const FieldOffset<Dim> &fieldOffset1,
    const FieldOffset<Dim> &fieldOffset2)
{
  return
    fieldOffset1.cellOffset() == fieldOffset2.cellOffset() &&
    fieldOffset1.subFieldNumber() == fieldOffset2.subFieldNumber();
}
template <int Dim>
inline bool
operator!=(const FieldOffset<Dim> &fieldOffset1,
    const FieldOffset<Dim> &fieldOffset2)
{
  return !(fieldOffset1 == fieldOffset2);
}
template <int Dim>
class FieldOffsetList
{
public:
  typedef size_t size_type;
  typedef FieldOffset<Dim>& reference;
  typedef const FieldOffset<Dim>& const_reference;
  size_type size() const
  {
    return v_m.size();
  }
  const_reference operator[](const size_type n) const
  {
    return v_m[n];
  }
  FieldOffsetList() {}
  FieldOffsetList(const size_type sz)
  {
    v_m.reserve(sz);
  }
  FieldOffsetList(const std::vector<FieldOffset<Dim> > &v) {
    v_m.resize(v.size());
    std::copy(v.begin(), v.end(), v_m.begin());
  }
  FieldOffsetList &operator=(const std::vector<FieldOffset<Dim> > &v)
  {
    v_m.resize(v.size());
    std::copy(v.begin(), v.end(), v_m.begin());
    return *this;
  }
  reference operator[](const size_type n)
  {
    return v_m[n];
  }
private:
  std::vector<FieldOffset<Dim> > v_m;
};
template <int Dim>
std::ostream &operator<<(std::ostream &o,
    const FieldOffsetList<Dim> &fieldOffsetList)
{
  o << "FieldOffsetList:\n";
  for (int index = 0; index < fieldOffsetList.size(); ++index)
    o << fieldOffsetList[index] << std::endl;
  return o;
}
template<class GeometryTag, class T, class Expr, int Dim,
         class BinaryFunction>
inline
T
accumulate(BinaryFunction binary_op,
    const Field<GeometryTag, T, Expr>& field,
    const FieldOffsetList<Dim> &lst,
    const Loc<Dim> &loc)
{
  typedef typename Field<GeometryTag, T, Expr>::T_t T_t;
  typedef typename FieldOffsetList<Dim>::size_type size_type;
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  const size_type lstLength = lst.size();
  if (__builtin_expect(!!(lstLength > 0), true)) {} else Pooma::toss_cookies("accumulate must be given a nonempty list.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/FieldOffset.h", 334);
  T_t init = field(lst[0], loc);
  for (size_type i = 1; i < lstLength ; ++i)
    init = binary_op(init, field(lst[i], loc));
  return init;
}
template<class GeometryTag, class T, class Expr, int Dim>
inline
T
sum(const Field<GeometryTag, T, Expr>& field,
    const FieldOffsetList<Dim> &lst,
    const Loc<Dim> &loc)
{
  typedef typename Field<GeometryTag, T, Expr>::T_t T_t;
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  return accumulate(std::plus<T_t>(), field, lst, loc);
}
template<class GeometryTag, class T, class Expr, int Dim>
inline
T
av(const Field<GeometryTag, T, Expr>& field,
   const FieldOffsetList<Dim> &lst,
   const Loc<Dim> &loc)
{
  typedef typename Field<GeometryTag, T, Expr>::T_t T_t;
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  return sum(field, lst, loc) / lst.size();
}
template <class T>
struct fomin : public std::binary_function<T, T, T>
{
  T operator()(const T &op1, const T &op2) const {
    return std::min(op1, op2);
  }
};
template<class GeometryTag, class T, class Expr, int Dim>
inline
T
min(const Field<GeometryTag, T, Expr>& field,
    const FieldOffsetList<Dim> &lst,
    const Loc<Dim> &loc)
{
  typedef typename Field<GeometryTag, T, Expr>::T_t T_t;
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  return accumulate(fomin<T_t>(), field, lst, loc);
}
template <class T>
struct fomax : public std::binary_function<T, T, T>
{
  T operator()(const T &op1, const T &op2) const {
    return std::max(op1, op2);
  }
};
template<class GeometryTag, class T, class Expr, int Dim>
inline
T
max(const Field<GeometryTag, T, Expr>& field,
    const FieldOffsetList<Dim> &lst,
    const Loc<Dim> &loc)
{
  typedef typename Field<GeometryTag, T, Expr>::T_t T_t;
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  return accumulate(fomax<T_t>(), field, lst, loc);
}
template <class GeometryTag, class T, class Expr, int Dim>
inline
typename
View2<Field<GeometryTag, T, Expr>, std::vector<FieldOffset<Dim> >,
      Centering<Dim> >::Type_t
replicate(const Field<GeometryTag, T, Expr>& field,
          const std::vector<FieldOffsetList<Dim> > &vec,
          const Centering<Dim> &centering)
{
  PoomaCTAssert<((Field<GeometryTag, T, Expr>::dimensions == Dim))>::test();
  typedef typename std::vector<FieldOffsetList<Dim> >::size_type vsize_type;
  if (__builtin_expect(!!(vec.size() > 0), true)) {} else Pooma::toss_cookies("Cannot replicate no values.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/FieldOffset.h", 445);
  if (__builtin_expect(!!(vec.size() == centering.size()), true)) {} else Pooma::toss_cookies("Vector and output centering sizes must match.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/FieldOffset.h", 447);
  std::vector<FieldOffset<Dim> > vecFO(vec.size());
  for (vsize_type i = 0; i < vec.size(); ++i) {
    if (__builtin_expect(!!(vec[i].size() == 1), true)) {} else Pooma::toss_cookies("Can replicate only one value.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/FieldOffset.h", 451);
    vecFO[i] = vec[i][0];
  }
  return field(vecFO, centering);
}
#include <numeric>
template <int Dim, bool IntraCellOnly = false>
class NearestNeighborClass {
public:
  typedef FieldOffset<Dim> FieldOffset_t;
  typedef FieldOffsetList<Dim> FieldOffsetList_t;
  typedef std::vector<FieldOffset_t> FieldOffset_vt;
  typedef std::vector<FieldOffsetList_t> Answer_t;
  typedef Centering<Dim> Center;
  typedef typename Center::Positions Positions;
  typedef typename Center::Position Position;
  typedef std::pair<int, Position> MinimumPair;
  typedef std::vector<MinimumPair> MinimumSet;
  NearestNeighborClass() {}
  inline Answer_t
  operator()(const Center &inputCentering, const Center &outputCentering)
  {
    if (__builtin_expect(!!(inputCentering.size() > 0), true)) {} else Pooma::toss_cookies("The input centering must be non-empty.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 95);
    Answer_t answer;
    answer.resize(outputCentering.size());
    const Positions inputPositions = inputCentering.positions();
    const Positions outputPositions = outputCentering.positions();
    for (typename Answer_t::size_type outputIndex = 0;
  outputIndex < outputCentering.size();
  ++outputIndex)
      answer[outputIndex] = nearestNeighbors(inputPositions,
          outputPositions[outputIndex]);
    return answer;
  }
  inline FieldOffsetList_t
  operator()(const Center &inputCentering,
      const FieldOffset_t &fieldOffset,
      const Center &outputCentering)
  {
    if (__builtin_expect(!!(inputCentering.size() > 0), true)) {} else Pooma::toss_cookies("The input centering must be non-empty.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 122);
    if (__builtin_expect(!!(fieldOffset.subFieldNumber() < outputCentering.size()), true)) {} else Pooma::toss_cookies("The field offset must correspond to the output centering.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 124);
    return nearestNeighbors(inputCentering.positions(),
       outputCentering.position(fieldOffset.subFieldNumber()));
  }
  inline std::vector<FieldOffsetList_t>
  operator()(const Center &inputCentering,
      const FieldOffsetList_t &fieldOffsetList,
      const Center &outputCentering)
  {
    if (__builtin_expect(!!(inputCentering.size() > 0), true)) {} else Pooma::toss_cookies("The input centering must be non-empty.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 140);
    Answer_t answer;
    answer.resize(fieldOffsetList.size());
    const Positions inputPositions = inputCentering.positions();
    for (typename FieldOffsetList_t::size_type folIndex = 0;
  folIndex < outputCentering.size();
  ++folIndex) {
      if (__builtin_expect(!!(fieldOffsetList[folIndex].subFieldNumber() < outputCentering.size()), true)) {} else Pooma::toss_cookies("The field offset must correspond to the output centering.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 152);
      answer[folIndex] =
 nearestNeighbors(inputPositions,
    outputCentering.position(fieldOffsetList[folIndex].subFieldNumber()));
    }
    return answer;
  }
private:
  inline FieldOffsetList_t
  nearestNeighbors(const Positions &inputPositions,
     const Position outputValue)
  {
    MinimumSet minimumSet;
    typename Positions::size_type inputIndex = 0;
    Position positionDifference = inputPositions[inputIndex] - outputValue;
    double minimumDistance =
      (IntraCellOnly ?
       manhattanDistance<Manhattan>(positionDifference) :
       manhattanDistance<ManhattanGrid>(positionDifference));
    minimumSet.push_back(std::make_pair(inputIndex, positionDifference));
    for (++inputIndex;
  inputIndex < inputPositions.size();
  ++inputIndex) {
      positionDifference = inputPositions[inputIndex] - outputValue;
      const double distance =
 (IntraCellOnly ?
  manhattanDistance<Manhattan>(positionDifference) :
  manhattanDistance<ManhattanGrid>(positionDifference));
      if (distance < minimumDistance + epsilon) {
 if (distance < minimumDistance) {
   minimumSet.clear();
   minimumDistance = distance;
 }
 minimumSet.push_back(std::make_pair(inputIndex,
         positionDifference));
      }
    }
    FieldOffset_vt answerHolder;
    if (IntraCellOnly) {
      for (typename MinimumSet::size_type minIndex = 0;
    minIndex < minimumSet.size();
    ++minIndex)
 answerHolder.push_back(FieldOffset_t(Loc<Dim>(0),
          minimumSet[minIndex].first));
    }
    else {
      FieldOffset_vt partialAnswer;
      for (typename MinimumSet::size_type minIndex = 0;
    minIndex < minimumSet.size();
    ++minIndex)
 {
   partialAnswer = computeCellOffsets(minimumSet[minIndex].first,
          minimumSet[minIndex].second);
   answerHolder.insert(answerHolder.end(),
         partialAnswer.begin(), partialAnswer.end());
 }
      std::sort(answerHolder.begin(), answerHolder.end(),
  CompareFieldOffset());
      answerHolder.erase(std::unique(answerHolder.begin(),
         answerHolder.end(),
         EqualFieldOffset()),
    answerHolder.end());
    }
    return answerHolder;
  }
  struct ManhattanGrid : public std::binary_function<double, double, double>
  {
    double operator()(const double totalSoFar, double coordinate) const {
      const double absCoordinate = std::abs(coordinate);
      return totalSoFar + std::min(absCoordinate, 1-absCoordinate);
    }
  };
  struct Manhattan : public std::binary_function<double, double, double>
  {
    double operator()(const double totalSoFar, double coordinate) const {
      return totalSoFar + std::abs(coordinate);
    }
  };
  template <class Distance>
  inline static
  double manhattanDistance(const Position &difference)
  {
    double answer = 0.0;;
    for (int coordinate = Dim-1; coordinate >= 0; --coordinate)
      answer = Distance()(answer, difference(coordinate));
    return answer;
  }
  inline static const FieldOffset_vt
  computeCellOffsets(const int inputValueIndex, const Position &difference)
  {
    FieldOffset_vt answer(1);
    int numTuples = 1;
    int cellOffsetCoordinates[2];
    int numOffsets;
    for (int dimension = 0; dimension < Dim; ++dimension) {
      numOffsets =
 convertDifferenceToCellOffsets(difference(dimension),
           cellOffsetCoordinates);
      if (__builtin_expect(!!(numOffsets >= 1 && numOffsets <= 2), true)) {} else Pooma::toss_cookies("Incorrect number of cell offsets", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 309);
      if (numOffsets == 2)
 answer.insert(answer.end(), answer.begin(), answer.end());
      for (int coc = 0; coc < numOffsets; ++coc)
 for (int tuple = 0; tuple < numTuples; ++tuple)
   answer[numTuples * coc + tuple].modifyCellOffset()[dimension] =
     cellOffsetCoordinates[coc];
      numTuples *= numOffsets;
    }
    for (int i = numTuples-1; i >= 0; --i)
      answer[i].setSubFieldNumber(inputValueIndex);
    return answer;
  }
  inline static
  int convertDifferenceToCellOffsets(const double difference,
         int cellOffsetCoordinate[])
  {
    if (difference < -0.5 - epsilon) {
      cellOffsetCoordinate[0] = +1;
      return 1;
    }
    else if (std::abs(difference + 0.5) < epsilon) {
      cellOffsetCoordinate[0] = +1;
      cellOffsetCoordinate[1] = 0;
      return 2;
    }
    else if (difference <= 0.5 - epsilon) {
      cellOffsetCoordinate[0] = 0;
      return 1;
    }
    else if (std::abs(difference - 0.5) < epsilon) {
      cellOffsetCoordinate[0] = 0;
      cellOffsetCoordinate[1] = -1;
      return 2;
    }
    else if (difference < 1.0 + epsilon) {
      cellOffsetCoordinate[0] = -1;
      return 1;
    }
    else {
      if (__builtin_expect(!!(0), true)) {} else Pooma::toss_cookies("Out of range difference", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/NearestNeighbors.h", 361);
      return 0;
    }
  }
  struct CompareFieldOffset :
    public std::binary_function<FieldOffset_t, FieldOffset_t, bool> {
    bool operator()(const FieldOffset_t &op1, const FieldOffset_t &op2) {
      return (op1.cellOffset() < op2.cellOffset()) ||
 (op1.cellOffset() == op2.cellOffset() &&
  op1.subFieldNumber() < op2.subFieldNumber());
    }
  };
  struct EqualFieldOffset :
    public std::binary_function<FieldOffset_t, FieldOffset_t, bool> {
    bool operator()(const FieldOffset_t &op1, const FieldOffset_t &op2) {
      return op1.cellOffset() == op2.cellOffset() &&
 op1.subFieldNumber() == op2.subFieldNumber();
    }
  };
  static const double epsilon;
};
template <int Dim, bool IntraCellOnly>
const double
NearestNeighborClass<Dim, IntraCellOnly>::epsilon = 1.0e-08;
template <int Dim>
inline
std::vector<FieldOffsetList<Dim> >
nearestNeighbors(const Centering<Dim> &inputCentering,
   const Centering<Dim> &outputCentering)
{
  return NearestNeighborClass<Dim>()(inputCentering, outputCentering);
}
template <int Dim>
inline
std::vector<FieldOffsetList<Dim> >
nearestNeighbors(const Centering<Dim> &inputCentering,
   const Centering<Dim> &outputCentering,
   const bool)
{
  return NearestNeighborClass<Dim, true>()(inputCentering, outputCentering);
}
template <int Dim>
inline
std::vector<FieldOffsetList<Dim> >
nearestNeighbors(const Centering<Dim> &inputCentering,
   const FieldOffsetList<Dim> &fOL,
   const Centering<Dim> &outputCentering)
{
  return NearestNeighborClass<Dim>()(inputCentering, fOL, outputCentering);
}
template <int Dim>
inline
std::vector<FieldOffsetList<Dim> >
nearestNeighbors(const Centering<Dim> &inputCentering,
   const FieldOffsetList<Dim> &fOL,
   const Centering<Dim> &outputCentering,
   const bool)
{
  return NearestNeighborClass<Dim, true>()
    (inputCentering, fOL, outputCentering);
}
template <int Dim>
inline
FieldOffsetList<Dim>
nearestNeighbors(const Centering<Dim> &inputCentering,
   const FieldOffset<Dim> &fieldOffset,
   const Centering<Dim> &outputCentering)
{
  return NearestNeighborClass<Dim>()
    (inputCentering, fieldOffset, outputCentering);
}
template <int Dim>
inline
FieldOffsetList<Dim>
nearestNeighbors(const Centering<Dim> &inputCentering,
   const FieldOffset<Dim> &fieldOffset,
   const Centering<Dim> &outputCentering,
   const bool)
{
  return NearestNeighborClass<Dim, true>()
    (inputCentering, fieldOffset, outputCentering);
}
template<int Dim>
inline Vector<Dim, double>
inputPosition(const Centering<Dim> &inputCentering,
              const FieldOffset<Dim> &fieldOffset)
{
  Vector<Dim, double> ret =
    inputCentering.position(fieldOffset.subFieldNumber());
  for (int i = 0; i < Dim; ++i)
    ret(i) += fieldOffset.cellOffset()[i].first();
  return ret;
}
class PrintField;
template<int Dim>
struct PerformPrintField
{
  template <class S, class A>
  static void print(const PrintField &, S &, const A &);
};
template<>
struct PerformPrintField<1>
{
  template<class S, class A>
  static void print(const PrintField &, S &, const A &);
};
class PrintField
{
public:
  PrintField(int domainWidth = 3, int dataWidth = 10,
      int dataPrecision = 4, int carReturn = -1,
      bool scientific = false, int spacing = 1)
    : domainwidth_m(domainWidth), datawidth_m(dataWidth),
      dataprecision_m(dataPrecision), carreturn_m(carReturn),
      spacing_m(spacing), scientific_m(scientific)
    {
      ;
      ;
      ;
      ;
    }
  PrintField(const PrintField &a)
    : domainwidth_m(a.domainwidth_m), datawidth_m(a.datawidth_m),
      dataprecision_m(a.dataprecision_m), carreturn_m(a.carreturn_m),
      scientific_m(a.scientific_m)
    {
    }
  ~PrintField()
    {
    }
  template<class S, class A>
  void print(S &s, const A &a) const
    {
      forEach(a, PerformUpdateTag(), NullCombine());
      Pooma::blockAndEvaluate();
      for (int m = 0; m < a.numMaterials(); m++)
        for (int c = 0; c < a.centeringSize(); c++)
          {
            s << "Material #" << m << ", Centering #" << c << " " << a.centering(c)
              << "\n"<< "-------------\n";
            PerformPrintField<A::dimensions>::print(*this, s, a.subField(m, c));
          }
    }
  int domainWidth() const
    {
      return domainwidth_m;
    }
  void setDomainWidth(int val)
    {
      domainwidth_m = val;
      ;
    }
  int dataWidth() const
    {
      return datawidth_m;
    }
  void setDataWidth(int val)
    {
      datawidth_m = val;
      ;
    }
  int dataPrecision() const
    {
      return dataprecision_m;
    }
  void setDataPrecision(int val)
    {
      dataprecision_m = val;
      ;
    }
  int carReturn() const
    {
      return carreturn_m;
    }
  void setCarReturn(int val)
    {
      carreturn_m = val;
    }
  bool scientific() const
    {
      return scientific_m;
    }
  void setScientific(bool val)
    {
      scientific_m = val;
    }
  int spacing() const
    {
      return spacing_m;
    }
  void setSpacing(int val)
    {
      spacing_m = val;
      ;
    }
private:
  int domainwidth_m;
  int datawidth_m;
  int dataprecision_m;
  int carreturn_m;
  int spacing_m;
  bool scientific_m;
};
template<class S, class A>
void
PerformPrintField<1>::print(const PrintField &p, S &s, const A &a)
{
  PoomaCTAssert<(A::dimensions == 1)>::test();
  typedef typename A::Domain_t Domain_t;
  typedef typename Domain_t::const_iterator Iterator_t;
  Iterator_t griditer = a.domain().begin();
  Iterator_t enditer = a.domain().end();
  s << "[";
  if (a.domain()[0].first() < 0)
    s.fill(' ');
  else
    s.fill('0');
  s.width(p.domainWidth());
  s << a.domain()[0].first() << ":";
  if (a.domain()[0].last() < 0)
    s.fill(' ');
  else
    s.fill('0');
  s.width(p.domainWidth());
  s << a.domain()[0].last() << "] = ";
  s.fill(' ');
  int i, printed = 0;
  while (griditer != enditer)
    {
      int spacing = 0;
      if (printed > 0)
     {
       spacing = p.spacing();
       if (p.carReturn() >= 0 && printed >= p.carReturn())
            {
              s << "\n";
           spacing = 2*p.domainWidth() + 6;
           printed = 0;
         }
     }
      for (i=0; i < spacing; ++i)
        s << " ";
      if (p.scientific())
        s.setf(std::ios::scientific);
      s.precision(p.dataPrecision());
      s.width(p.dataWidth());
      s << a.read(*griditer);
      ++griditer;
      ++printed;
    }
  s << "\n";
}
template<int Dim>
template<class S, class A>
void
PerformPrintField<Dim>::print(const PrintField &p, S &s, const A &a)
{
  int i, j, k;
  PoomaCTAssert<(A::dimensions == Dim && Dim > 1)>::test();
  typedef typename A::Domain_t Domain_t;
  typedef typename Domain_t::Element_t Element_t;
  typedef typename Domain_t::const_iterator Iterator_t;
  Iterator_t griditer = a.domain().begin();
  Iterator_t enditer = a.domain().end();
  Element_t x0 = a.domain()[0].first();
  Element_t x1 = a.domain()[0].last();
  Element_t xs = a.domain()[0].stride();
  Element_t y0 = a.domain()[1].first();
  Element_t y1 = a.domain()[1].last();
  Element_t ys = a.domain()[1].stride();
  while (griditer != enditer)
    {
      if (Dim > 2)
     {
       s << '\n' << a.domain()[0] << a.domain()[1];
       for (i=2; i < Dim; ++i)
         s << "[" << (*griditer)[i].first() << "]";
       s << ":" << '\n';
       s << "----------------------------------------------------\n";
        }
      for (j=y0; j <= y1; j += ys)
     {
       s << "[";
          if (x0 < 0)
            s.fill(' ');
          else
            s.fill('0');
          s.width(p.domainWidth());
          s << x0 << ":";
          if (x1 < 0)
            s.fill(' ');
          else
            s.fill('0');
          s.width(p.domainWidth());
       s << x1 << "]";
       for (i=1; i < Dim; ++i)
         {
           s << "[";
              if ((*griditer)[i].first() < 0)
                s.fill(' ');
              else
                s.fill('0');
              s.width(p.domainWidth());
           s << (*griditer)[i].first() << "]";
         }
       s.fill(' ');
          s << " = ";
       int printed = 0;
       for (i=x0; i <= x1; i += xs)
         {
           int spacing = 0;
           if (printed > 0)
          {
            spacing = p.spacing();
            if (p.carReturn() >= 0 && printed >= p.carReturn())
              {
                s << '\n';
                spacing = (Dim + 1)*(p.domainWidth() + 2) + 4;
                printed = 0;
              }
          }
           for (k=0; k < spacing; ++k)
          s << ' ';
           if (p.scientific())
          s.setf(std::ios::scientific);
           s.precision(p.dataPrecision());
           s.width(p.dataWidth());
           s << a.read(*griditer);
           ++griditer;
           ++printed;
         }
       s << '\n';
        }
    }
}
template<int Dim>
struct FieldEnginePatch
{
  FieldEnginePatch(int patch, Interval<Dim> domain)
    : patch_m(patch), domain_m(domain)
  { }
  int patch_m;
  Interval<Dim> domain_m;
};
namespace Pooma {
  unsigned int activeRelationGroups();
  bool isRelationGroupActive(unsigned int groups);
  void activateRelationGroup(unsigned int group);
  void deactivateRelationGroup(unsigned int group);
  unsigned int newRelationGroup();
}
class RelationListItem {
public:
  RelationListItem()
  : priority_m(0),
    groups_m(Pooma::activeRelationGroups()),
    dirty_m(true)
    { }
  RelationListItem(const RelationListItem &model)
  : priority_m(model.priority_m),
    groups_m(model.groups_m),
    dirty_m(model.dirty_m)
    { }
  virtual ~RelationListItem() { }
  virtual void apply() = 0;
  virtual void notifyPreRead()
    {
      if (Pooma::isRelationGroupActive(groups_m) && dirty_m)
        {
          apply();
          clearDirty();
        }
    }
  virtual void notifyPostWrite()
    {
      setDirty();
    }
  inline bool dirty() const { return dirty_m; }
  inline unsigned int priority() const { return priority_m; }
  virtual void setDirty()
    {
      dirty_m = true;
    }
  virtual void clearDirty()
    {
      dirty_m = false;
    }
  inline void setPriority(unsigned int p)
    {
      priority_m = p;
    }
private:
  unsigned int priority_m;
  unsigned int groups_m;
  bool dirty_m;
};
namespace Pooma {
  struct DontCopyRelations { };
}
template<class Target>
class RelationRetargetBase : public RelationListItem {
public:
  RelationRetargetBase(const Target &target)
  : target_m(target, Pooma::DontCopyRelations())
    { }
  RelationRetargetBase(const RelationRetargetBase<Target> &model)
  : RelationListItem(model),
    target_m(model.target_m)
    { }
  virtual ~RelationRetargetBase() { }
  Target &target() { return target_m; }
  const Target &target() const { return target_m; }
  virtual RelationListItem *retarget(const Target &target) const = 0;
protected:
  Target target_m;
};
template<class Target, class Functor>
class RelationBase : public RelationRetargetBase<Target> {
public:
  RelationBase(const Target &t, const Functor &f)
  : RelationRetargetBase<Target>(t),
    functor_m(f, t)
    { }
  RelationBase(const RelationBase<Target, Functor> &model)
  : RelationRetargetBase<Target>(model),
    functor_m(model.functor_m)
    { }
  virtual ~RelationBase() { }
  Functor &functor() { return functor_m; }
  const Functor &functor() const { return functor_m; }
protected:
  Functor functor_m;
};
class RelationListData : public RefCounted
{
public:
  RelationListData()
    { }
  RelationListData(const RelationListData &model)
  : data_m(model.data_m)
    { }
  RelationListData &operator=(const RelationListData &rhs)
    {
      data_m = rhs.data_m;
      return *this;
    }
  ~RelationListData()
    {
      typedef List_t::size_type size_type;
      for (size_type i = 0; i < data_m.size(); i++)
        delete data_m[i];
    }
  inline int size() const
    {
      return data_m.size();
    }
  inline RelationListItem *elem(int i) const
    {
      return data_m[i];
    }
  inline RelationListItem* &elem(int i)
    {
      return data_m[i];
    }
  void add(RelationListItem *item)
    {
      data_m.push_back(item);
      int i = size() - 1;
      while (i > 0)
        {
          if (data_m[i]->priority() <= data_m[i]->priority())
            break;
          data_m[i] = data_m[i - 1];
          data_m[i - 1] = item;
          --i;
        }
    }
private:
  typedef std::vector<RelationListItem *> List_t;
  List_t data_m;
};
class RelationList {
public:
  RelationList()
  : list_m(new RelationListData)
    { }
  RelationList(const RelationList &model)
  : list_m(model.list_m)
    { }
  ~RelationList() { }
  template<class Target>
  void makeOwnCopy(const Target &t)
    {
      list_m = new RelationListData(*list_m);
      for (int i = 0; i < list_m->size(); i++)
        {
          RelationRetargetBase<Target> *u =
            dynamic_cast<RelationRetargetBase<Target> *>(list_m->elem(i));
          if (u != NULL)
            list_m->elem(i) = u->retarget(t);
        }
    }
  inline void erase()
    {
     list_m = new RelationListData;
    }
  void addRelation(RelationListItem *item)
    {
      list_m->add(item);
    }
  void notifyPreRead() const
    {
      for (int i = 0; i < list_m->size(); ++i)
        list_m->elem(i)->notifyPreRead();
    }
  void notifyPostWrite() const
    {
      for (int i = 0; i < list_m->size(); ++i)
        list_m->elem(i)->notifyPostWrite();
    }
  void setDirty() const
    {
      for (int i = 0; i < list_m->size(); ++i)
        list_m->elem(i)->setDirty();
    }
  void clearDirty() const
    {
      for (int i = 0; i < list_m->size(); ++i)
        list_m->elem(i)->clearDirty();
    }
  bool dirty() const
    {
      for (int i = 0; i < list_m->size(); ++i)
        if (list_m->elem(i)->dirty())
   return true;
      return false;
    }
  inline RelationListItem *operator()(int i) const
    {
      return list_m->elem(i);
    }
  inline RelationListItem *operator()(int i)
    {
      return list_m->elem(i);
    }
  inline int size() const { return list_m->size(); }
private:
  RefCountedPtr<RelationListData> list_m;
};
template<int Dim, class T, class EngineTag> class Engine;
template<class Components> class ComponentWrapper;
namespace Pooma {
  struct MaterialViewTag {};
  struct CenteringViewTag {};
}
template <int Dim, class T, class EngineTag>
class FieldEngineBaseData
{
public:
  FieldEngineBaseData()
    : engine_m()
  { }
  template<class Initializer>
  FieldEngineBaseData(const Initializer &init)
    : engine_m(init)
  { }
  FieldEngineBaseData(const Pooma::NoInit &)
    : engine_m()
  { }
  template<class Initializer>
  FieldEngineBaseData(const Initializer &init, const RelationList &l)
    : engine_m(init),
      relations_m(l)
  { }
  template<class Engine, class Domain>
  FieldEngineBaseData(const Engine &e,
                      const Domain &d, const RelationList &l)
    : engine_m(NewEngineEngine<Engine, Domain>::apply(e, d),
               NewEngineDomain<Engine, Domain>::apply(e, d)),
      relations_m(l)
  {
  }
  const Engine<Dim, T, EngineTag> &engine() const { return engine_m; }
  Engine<Dim, T, EngineTag> &engine() { return engine_m; }
  RelationList &relations() const { return relations_m; }
private:
  Engine<Dim, T, EngineTag> engine_m;
  mutable RelationList relations_m;
};
template<class Mesh, class T, class EngineTag>
class FieldEngine
{
public:
  enum { dimensions = Mesh::dimensions };
  enum { Dim = dimensions };
  typedef FieldEngine<Mesh, T, EngineTag> This_t;
  typedef FieldEngineBaseData<Dim, T, EngineTag> Data_t;
  typedef Engine<Dim, T, EngineTag> Engine_t;
  typedef typename Engine_t::Domain_t Domain_t;
  typedef typename Engine_t::Layout_t Layout_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  FieldEngine()
    : num_materials_m(0),
      physicalCellDomain_m(Pooma::NoInit()),
      guards_m(0)
  { }
  template<class Layout2>
  FieldEngine(const Centering<Dim> &centering, const Layout2 &layout,
              const Mesh &mesh, int materials = 1)
    : num_materials_m(materials),
      centering_m(centering),
      stride_m(centering.size()),
      physicalCellDomain_m(layout.domain()),
      guards_m(layout.externalGuards()),
      mesh_m(mesh)
  {
    physicalCellDomain_m = shrinkRight(shrink(physicalCellDomain_m, guards_m), 1);
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering.size(); ++ c)
      {
        data(m, c) = Data_t(layout);
      }
    }
  }
  FieldEngine(const This_t &model)
    : num_materials_m(model.num_materials_m),
      centering_m(model.centering_m),
      stride_m(model.stride_m),
      data_m(model.data_m),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guards_m),
      mesh_m(model.mesh_m)
  {
  }
  FieldEngine(const This_t &model, int subField)
    : num_materials_m(1),
      centering_m(model.centering_m, subField % model.centeringSize()),
      stride_m(model.stride_m),
      data_m(model.data_m + subField),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guards_m),
      mesh_m(model.mesh_m)
  {
  }
  FieldEngine(const This_t &model, int m, int c)
    : num_materials_m(1),
      centering_m(model.centering_m, c),
      stride_m(model.stride_m),
      data_m(model.data_m + model.stride_m * m + c),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guards_m),
      mesh_m(model.mesh_m)
  {
  }
  FieldEngine(const This_t &model, int c, const Pooma::CenteringViewTag&)
    : num_materials_m(model.num_materials_m),
      centering_m(model.centering_m, c),
      stride_m(model.stride_m),
      data_m(model.data_m + c),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guards_m),
      mesh_m(model.mesh_m)
  {
  }
  FieldEngine(const This_t &model, int m, const Pooma::MaterialViewTag&)
    : num_materials_m(1),
      centering_m(model.centering_m),
      stride_m(model.stride_m),
      data_m(model.data_m + m * model.stride_m),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guards_m),
      mesh_m(model.mesh_m)
  {
  }
  template<class T2, class EngineTag2>
  FieldEngine(const FieldEngine<Mesh, T2, EngineTag2> &model,
              const Domain_t &d)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      guards_m(0),
      mesh_m(model.mesh(), inputDomainToVertexDomain(d))
  {
    addSubFields();
    physicalCellDomain_m = d;
    if (centeringSize() == 1)
    {
      physicalCellDomain_m =
        centeringDomainToCellDomain(physicalCellDomain_m, centering_m, 0);
    }
    for (int c = 0; c < centeringSize(); ++c)
    {
      Domain_t dc(cellDomainToCenteringDomain(physicalCellDomain_m, centering_m, c));
      for (int m = 0; m < numMaterials(); ++m)
      {
        data(m, c) = Data_t(model.data(m, c).engine(), dc, model.data(m, c).relations());
      }
    }
    physicalCellDomain_m -= d.firsts();
  }
  template<class Mesh2, class T2, class EngineTag2, class Domain>
  FieldEngine(const FieldEngine<Mesh2, T2, EngineTag2> &model,
              const Domain &d)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      guards_m(0)
  {
    addSubFields();
    ;
    for (int m = 0; m < numMaterials(); ++m)
    {
      data(m, 0) = Data_t(model.data(m, 0).engine(), d,
                          model.data(m, 0).relations());
    }
    mesh_m = Mesh(DomainLayout<Dim>(inputDomainToVertexDomain(data(0,0).engine().domain())));
    physicalCellDomain_m = mesh_m.physicalCellDomain();
  }
  template<class Mesh2, class EngineTag2>
  FieldEngine(const FieldEngine<Mesh2, T, EngineTag2> &model,
              const SliceInterval<Mesh2::dimensions, Dim> &d)
  {
    initSlice(model, d);
  }
  template<class Mesh2, class EngineTag2>
  FieldEngine(const FieldEngine<Mesh2, T, EngineTag2> &model,
              const SliceRange<Mesh2::dimensions, Dim> &d)
  {
    initSlice(model, d);
  }
  template<class Mesh2, class EngineTag2>
  FieldEngine(const FieldEngine<Mesh2, T, EngineTag2> &model,
       const SliceInterval<Dim, Mesh2::dimensions> &d,
       const Interval<Dim>& totalDomain)
  {
    initSlice(model, d, totalDomain);
  }
  template<class T2, class EngineTag2>
  FieldEngine(const FieldEngine<Mesh, T2, EngineTag2> &model,
              const INode<Dim> &i)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      guards_m(0),
      mesh_m(model.mesh(),
             inputDomainToVertexDomain(i.domain()))
  {
    addSubFields();
    physicalCellDomain_m = i.domain();
    if (centeringSize() == 1)
    {
      physicalCellDomain_m =
        centeringDomainToCellDomain(physicalCellDomain_m, centering_m, 0);
    }
    for (int c = 0; c < centeringSize(); ++ c)
    {
      INode<Dim> ic(i, cellDomainToCenteringDomain(physicalCellDomain_m, centering_m, c));
      for (int m = 0; m < numMaterials(); ++m)
      {
        data(m, c) = Data_t(model.data(m, c).engine(), ic, model.data(m, c).relations());
      }
    }
    physicalCellDomain_m -= i.domain().firsts();
  }
  template<class Mesh2, class T2, class EngineTag2, class Tag>
  FieldEngine(const FieldEngine<Mesh2, T2, EngineTag2> &model,
              const EngineView<Tag> &ev)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      physicalCellDomain_m(model.physicalCellDomain()),
      guards_m(model.guardLayers()),
      mesh_m(model.mesh())
  {
    typedef typename FieldEngine<Mesh2, T2, EngineTag2>::Engine_t EngIn_t;
    typedef LeafFunctor<EngIn_t, EngineView<Tag> > Functor_t;
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centeringSize(); ++c)
      {
        data(m, c)
          = Data_t(Functor_t::apply(model.data(m, c).engine(), ev),
                   model.data(m, c).relations());
      }
    }
  }
  template<class EngineTag2>
  FieldEngine(const FieldEngine<Mesh, T, EngineTag2> &model,
              const FieldEnginePatch<Dim> &p)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      guards_m(model.guardLayers()),
      mesh_m(model.mesh())
  {
    ;
    addSubFields();
    data(0, 0) = Data_t(engineFunctor(model.engine(), EnginePatch(p.patch_m)));
    physicalCellDomain_m =
      centeringDomainToCellDomain(p.domain_m, centering_m, 0);
  }
  template<class Mesh2, class T2, class EngineTag2, class Components>
  FieldEngine(const FieldEngine<Mesh2, T2, EngineTag2> &model,
              const ComponentWrapper<Components> &cw)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      physicalCellDomain_m(model.physicalCellDomain()),
      guards_m(model.guardLayers()),
      mesh_m(model.mesh())
  {
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centeringSize(); ++ c)
      {
        data(m, c) =
          Data_t(Engine_t(model.data(m, c).engine(), cw.components()),
                 model.data(m, c).relations());
      }
    }
  }
  FieldEngine(const This_t &model,
              const Pooma::DontCopyRelations &d)
    : num_materials_m(model.numMaterials()),
      centering_m(model.centering()),
      stride_m(model.centeringSize()),
      physicalCellDomain_m(model.physicalCellDomain_m),
      guards_m(model.guardLayers()),
      mesh_m(model.mesh())
  {
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centeringSize(); ++ c)
      {
        data(m, c) = Data_t(model.data(m, c).engine());
      }
    }
  }
  void initialize(const This_t &model)
  {
    num_materials_m = model.num_materials_m;
    stride_m = model.stride_m;
    centering_m = model.centering_m;
    data_m = model.data_m;
    physicalCellDomain_m = model.physicalCellDomain_m;
    guards_m = model.guards_m;
    mesh_m = model.mesh_m;
  }
  void addSubFields()
  {
    ;
    int size = numMaterials() * centeringSize();
    data_m.reserve(size);
    data_m.resize(size);
  }
  int numSubFields() const
  {
    return numMaterials() * centeringSize();
  }
  Engine_t &engine()
  {
    ;
    return data_m->engine();
  }
  const Engine_t &engine() const
  {
    ;
    return data_m->engine();
  }
  Engine_t &engine(int m, int c)
  {
    ;
    return data(m,c).engine();
  }
  const Engine_t &engine(int m, int c) const
  {
    ;
    return data(m,c).engine();
  }
  RelationList &relations() const
  {
    ;
    return data_m->relations();
  }
  RelationList &relations(int m, int c) const
  {
    ;
    return data(m, c).relations();
  }
  const GuardLayers_t &guardLayers() const
  {
    return guards_m;
  }
  GuardLayers_t &guardLayers()
  {
    return guards_m;
  }
  int numMaterials() const
  {
    return num_materials_m;
  }
  Domain_t &physicalCellDomain()
  {
    return physicalCellDomain_m;
  }
  const Domain_t &physicalCellDomain() const
  {
    return physicalCellDomain_m;
  }
  Domain_t totalCellDomain() const
  {
    return grow(physicalCellDomain_m, guards_m);
  }
  Domain_t physicalDomain() const
  {
    if (centeringSize() == 1)
      return cellDomainToCenteringDomain(physicalCellDomain_m, centering_m, 0);
    else
      return physicalCellDomain_m;
  }
  Domain_t physicalDomain(int i) const
  {
    return cellDomainToCenteringDomain(physicalCellDomain_m, centering_m, i);
  }
  Domain_t totalDomain() const
  {
    if (centeringSize() == 1)
      return cellDomainToCenteringDomain(totalCellDomain(), centering_m, 0);
    else
      return totalCellDomain();
  }
  Domain_t totalDomain(int i) const
  {
    return cellDomainToCenteringDomain(totalCellDomain(), centering_m, i);
  }
  const Centering<Dim> &centering() const
  {
    return centering_m;
  }
  int centeringSize() const
  {
    return centering_m.size();
  }
  Mesh &mesh()
  {
    return mesh_m;
  }
  const Mesh &mesh() const
  {
    return mesh_m;
  }
  template<class Subject>
  void makeOwnCopy(const Subject &s)
  {
    ;
    RefCountedBlockPtr<Data_t> model = data_m;
    data_m = RefCountedBlockPtr<Data_t>();
    stride_m = centeringSize();
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centeringSize(); ++ c)
      {
        data(m, c) = model[m*stride_m + c];
        data(m, c).engine().makeOwnCopy();
        data(m, c).relations().makeOwnCopy(s.subField(m, c));
      }
    }
  }
  Domain_t
  inputDomainToVertexDomain(const Domain_t &d) const
  {
    if (centeringSize() == 1)
      return growRight(centeringDomainToCellDomain(d, centering(), 0), 1);
    else
      return growRight(d, 1);
  }
  inline Data_t &
  data(int material, int centering)
  {
    ;
    return data_m[material * stride_m + centering];
  }
  inline const Data_t &
  data(int material, int centering) const
  {
    ;
    return data_m[material * stride_m + centering];
  }
private:
  template <class FE, class Domain>
  void initSlice(const FE& model, const Domain& d)
  {
    ;
    num_materials_m = model.numMaterials();
    stride_m = 1;
    typename Centering<Dim>::Orientation orientation;
    typename Centering<Dim>::Position position;
    int j=0;
    for (int i=0; i<FE::dimensions; ++i)
      {
 if (d.ignorable(i))
   continue;
 orientation[j] = model.centering().orientation(0)[i];
 position(j) = model.centering().position(0)(i);
 guards_m.lower(j) = model.guardLayers().lower(i);
 guards_m.upper(j) = model.guardLayers().upper(i);
 physicalCellDomain_m[j] = model.physicalCellDomain()[i];
 ++j;
      }
    centering_m.addValue(orientation, position);
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      data(m, 0) = Data_t(model.data(m, 0).engine(), d,
                          model.data(m, 0).relations());
    }
    mesh_m = Mesh(DomainLayout<Dim>(growRight(physicalCellDomain(), 1),
        guardLayers()));
  }
  template <class FE>
  void initSlice(const FE& model,
   const SliceInterval<Dim, FE::dimensions>& d,
   const Interval<Dim>& totalDomain)
  {
    ;
    num_materials_m = model.numMaterials();
    stride_m = 1;
    typename Centering<Dim>::Orientation orientation;
    typename Centering<Dim>::Position position;
    int j=0;
    for (int i=0; i<Dim; ++i)
      {
 if (d.ignorable(i)) {
   if (model.centering().centeringType() == CellType) {
     orientation[i] = 1;
     position(i) = 0.5;
   } else {
     orientation[i] = 0;
     position(i) = 0.0;
   }
   guards_m.lower(i) = 0;
   guards_m.upper(i) = 0;
   physicalCellDomain_m[i] = totalDomain[i];
 } else {
   orientation[i] = model.centering().orientation(0)[j];
   position(i) = model.centering().position(0)(j);
   guards_m.lower(i) = model.guardLayers().lower(j);
   guards_m.upper(i) = model.guardLayers().upper(j);
   physicalCellDomain_m[i] = model.physicalCellDomain()[j];
   ++j;
 }
      }
    centering_m.addValue(orientation, position);
    addSubFields();
    for (int m = 0; m < numMaterials(); ++m)
    {
      typedef typename NewEngine<typename FE::Engine_t, SliceInterval<Dim, FE::dimensions> >::Type_t NewEngine_t;
      data(m, 0) = Data_t(NewEngine_t(model.data(m, 0).engine(), d, totalDomain),
                          model.data(m, 0).relations());
    }
    mesh_m = Mesh(DomainLayout<Dim>(growRight(physicalCellDomain(), 1),
        guardLayers()));
  }
  unsigned int num_materials_m;
  Centering<Dim> centering_m;
  int stride_m;
  RefCountedBlockPtr<Data_t> data_m;
  Domain_t physicalCellDomain_m;
  GuardLayers_t guards_m;
  Mesh mesh_m;
};
template<class Mesh, class T, class EngineTag, class Tag>
struct LeafFunctor<FieldEngine<Mesh, T, EngineTag>,
                   ExpressionApply<Tag> >
{
  typedef FieldEngine<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef LeafFunctor<Engine_t, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Subject_t &fieldEngineBase,
        const ExpressionApply<Tag> &tag)
  {
    for (int m = 0; m < fieldEngineBase.numMaterials(); ++m)
    {
      for (int c = 0; c < fieldEngineBase.centeringSize(); ++ c)
      {
        LeafFunctor_t::apply(fieldEngineBase.data(m, c).engine(), tag);
      }
    }
    return 0;
  }
};
struct CompressibleBrick;
template<class Mesh, class T, class EngineTag>
class Field;
template<class LTag, class EngineTag>
struct MultiPatch;
template<int Dim> struct NoMesh;
struct Brick;
template<class Subject> class SubFieldView;
template<class Subject, class Domain, bool SV>
struct View1Implementation;
template <class Subject, class Domain>
struct ReverseSliceView;
class RelationListItem;
template <int Dim>
class FieldOffset;
template <int Dim>
class FieldOffsetList;
template<class Mesh, class T, class EngineTag,
  class MeshTag2, class T2, class EngineTag2, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const Field<MeshTag2, T2, EngineTag2> &rhs,
       const Op &op);
template<class Mesh, class T, class EngineTag,
 int Dim2, class T2, class EngineTag2, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const Array<Dim2, T2, EngineTag2> &rhs, const Op &op);
template<class Mesh, class T, class EngineTag, class T1, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const T1 &rhs, const Op &op);
template<class Mesh, class T, class EngineTag,
 int Dim2, class T2, class EngineTag2, class Op>
const Array<Dim2, T2, EngineTag2> &
assign(const Array<Dim2, T2, EngineTag2> &lhs,
       const Field<Mesh, T, EngineTag> &rhs, const Op &op);
template<class Mesh, class T, class EngineTag,
 class F, class B, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const WhereProxy<F, B> &rhs,
       const Op &op);
struct SubFieldViewFunctorTag;
template<class Mesh, class T, class EngineTag>
class SubFieldView<Field<Mesh, T, EngineTag> > {
public:
  typedef Field<Mesh, T, EngineTag> Type_t;
  inline static Type_t make(const Type_t &s, int iSubField)
    {
      ;
      return Type_t(s, iSubField);
    }
  inline static Type_t make(const Type_t &s, int m, int c)
  {
    ;
    return Type_t(s, m, c);
  }
  inline static Type_t make(const Type_t &s, int c, const Pooma::CenteringViewTag &tag)
  {
    ;
    return Type_t(s, c, tag);
  }
  inline static Type_t make(const Type_t &s, int m, const Pooma::MaterialViewTag &tag)
  {
    ;
    return Type_t(s, m, tag);
  }
};
template<class Mesh, class T, class Expr>
class SubFieldView<Field<Mesh, T, ExpressionTag<Expr> > > {
public:
  typedef Field<Mesh, T, ExpressionTag<Expr> > Subject_t;
  typedef
    typename ForEach<Expr, SubFieldViewFunctorTag, TreeCombine>::Type_t
      Expr_t;
  typedef Field<Mesh, T, ExpressionTag<Expr_t> > Type_t;
  inline static Type_t make(const Subject_t &s, int iSubField)
    {
      ;
      return Type_t(s, iSubField);
    }
  inline static Type_t make(const Subject_t &s, int m, int c)
  {
    ;
    return Type_t(s, m, c);
  }
  inline static Type_t make(const Subject_t &s, int c, const Pooma::CenteringViewTag &tag)
  {
    ;
    return Type_t(s, c, tag);
  }
  inline static Type_t make(const Subject_t &s, int m, const Pooma::MaterialViewTag &tag)
  {
    ;
    return Type_t(s, m, tag);
  }
};
template<class Mesh, class T, class EngineTag, class Domain>
struct View1Implementation<Field<Mesh, T, EngineTag>, Domain, true>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  template<class S1, class Combine>
  inline static
  Type_t make(const Subject_t &f, const S1 &s1,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1));
      ;
      return f.engine()(s);
    }
  template<class S1, class S2, class Combine>
  inline static
  Type_t make(const Subject_t &f,
       const S1 &s1, const S2 &s2,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1, s2));
      ;
      return f.engine()(s);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  Type_t make(const Subject_t &f,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1, s2, s3));
      ;
      return f.engine()(s);
    }
  template<class S1, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &f, const S1 &s1,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1));
      ;
      return f.engine().read(s);
    }
  template<class S1, class S2, class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &f,
       const S1 &s1, const S2 &s2,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1, s2));
      ;
      return f.engine().read(s);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  ReadType_t makeRead(const Subject_t &f,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const Combine &)
    {
      ;
      Domain s(Combine::make(f, s1, s2, s3));
      ;
      return f.engine().read(s);
    }
};
template<int Dim, class Mesh, class Domain>
struct NewMeshTag
{
  typedef NoMesh<Dim> Type_t;
};
template<int Dim, class Mesh>
struct NewMeshTag<Dim, Mesh, Interval<Dim> >
{
  typedef Mesh Type_t;
};
template<int Dim, class Mesh>
struct NewMeshTag<Dim, Mesh, INode<Dim> >
{
  typedef Mesh Type_t;
};
template<class Mesh, class T, class EngineTag, class Domain>
struct View1Implementation<Field<Mesh, T, EngineTag>, Domain, false>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef typename NewEngine<Engine_t, Domain>::Type_t NewEngine_t;
  typedef typename NewEngine_t::Element_t NewT_t;
  typedef typename NewEngine_t::Tag_t NewEngineTag_t;
  typedef typename
    NewMeshTag<NewEngine_t::dimensions, Mesh, Domain>::Type_t
      NewMeshTag_t;
  typedef Field<NewMeshTag_t, NewT_t, NewEngineTag_t> ReadType_t;
  typedef Field<NewMeshTag_t, NewT_t, NewEngineTag_t> Type_t;
  template<class S1, class Combine>
  static
  Type_t make(const Subject_t &f, const S1 &s1,
       const Combine &)
    {
      Domain s(Combine::make(f, s1));
      ;
      return Type_t(f, s);
    }
  template<class S1, class S2, class Combine>
  static
  Type_t make(const Subject_t &f, const S1 &s1,
       const S2 &s2, const Combine &)
    {
      Domain s(Combine::make(f, s1, s2));
      ;
      return Type_t(f, s);
    }
  template<class S1, class S2, class S3,
    class Combine>
  static
  Type_t make(const Subject_t &f,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const Combine &)
    {
      Domain s(Combine::make(f, s1, s2, s3));
      ;
      return Type_t(f, s);
    }
  template<class S1, class Combine>
  inline static
  Type_t makeRead(const Subject_t &f, const S1 &s1,
       const Combine &c)
    {
      return make(f, s1, c);
    }
  template<class S1, class S2, class Combine>
  inline static
  Type_t makeRead(const Subject_t &f, const S1 &s1,
       const S2 &s2, const Combine &c)
    {
      return make(f, s1, s2, c);
    }
  template<class S1, class S2, class S3,
    class Combine>
  inline static
  Type_t makeRead(const Subject_t &f,
       const S1 &s1, const S2 &s2, const S3 &s3,
       const Combine &c)
    {
      return make(f, s1, s2, s3, c);
    }
};
template<class Mesh, class T, class EngineTag, class Sub1>
struct View1<Field<Mesh, T, EngineTag>, Sub1>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef TemporaryNewDomain1<Domain_t, Sub1> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  typedef typename Dispatch_t::Type_t Type_t;
  inline static
  Type_t make(const Subject_t &f, const Sub1 &s1)
    {
      return Dispatch_t::make(f, s1, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, const Sub1 &s1)
    {
      return Dispatch_t::makeRead(f, s1, Combine_t());
    }
};
template<class Mesh, class T, class EngineTag>
struct View1<Field<Mesh, T, EngineTag>, int>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &f, int s1)
    {
      ;
      ;
      return f.engine()(s1);
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, int s1)
    {
      ;
      ;
      return f.engine().read(s1);
    }
};
template<class Mesh, class T, class EngineTag>
struct View1<Field<Mesh, T, EngineTag>, Loc<Mesh::dimensions> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &f, const Loc<Mesh::dimensions>& s1)
    {
      ;
      return f.engine()(s1);
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, const Loc<Mesh::dimensions>& s1)
    {
      ;
      return f.engine().read(s1);
    }
};
template<class Mesh, class T, class EngineTag,
  class Sub1, class Sub2>
struct View2<Field<Mesh, T, EngineTag>, Sub1, Sub2>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain2<Sub1, Sub2> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  typedef typename Dispatch_t::Type_t Type_t;
  inline static
  Type_t make(const Subject_t &f, const Sub1 &s1, const Sub2 &s2)
    {
      return Dispatch_t::make(f, s1, s2, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, const Sub1 &s1, const Sub2 &s2)
    {
      return Dispatch_t::makeRead(f, s1, s2, Combine_t());
    }
};
template<class Mesh, class T, class EngineTag>
struct View2<Field<Mesh, T, EngineTag>, int, int>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &f, int s1, int s2)
    {
      ;
      ;
      return f.engine()(s1, s2);
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, int s1, int s2)
    {
      ;
      ;
      return f.engine().read(s1, s2);
    }
};
template<class Mesh, class T, class EngineTag, int Dim>
struct View2<Field<Mesh, T, EngineTag>,
             FieldOffset<Dim>,
             Loc<Dim> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  enum { dimensions = Subject_t::dimensions };
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &f,
       const FieldOffset<dimensions> &fo,
       const Loc<dimensions> &loc)
    {
      PoomaCTAssert<(dimensions == Dim)>::test();
      if (f.numSubFields() > 1) {
 ;
 return f[fo.subFieldNumber()].engine()(loc + fo.cellOffset());
      }
      else {
 ;
 return f.engine()(loc + fo.cellOffset());
      }
    }
  inline static
  ReadType_t makeRead(const Subject_t &f,
        const FieldOffset<dimensions> &fo,
        const Loc<dimensions> &loc)
    {
      if (f.numSubFields() > 1) {
 ;
 return f[fo.subFieldNumber()].engine().read(loc + fo.cellOffset());
      }
      else {
 ;
 return f.engine().read(loc + fo.cellOffset());
      }
    }
};
template<class Mesh, class T, class EngineTag,
  class Sub1, class Sub2, class Sub3>
struct View3<Field<Mesh, T, EngineTag>, Sub1, Sub2, Sub3>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Domain_t Domain_t;
  typedef NewDomain3<Sub1, Sub2, Sub3> NewDomain_t;
  typedef typename NewDomain_t::SliceType_t SDomain_t;
  enum { sv = DomainTraits<SDomain_t>::singleValued };
  typedef View1Implementation<Subject_t, SDomain_t, sv> Dispatch_t;
  typedef CombineDomainOpt<NewDomain_t, sv> Combine_t;
  typedef typename Dispatch_t::ReadType_t ReadType_t;
  typedef typename Dispatch_t::Type_t Type_t;
  inline static
  Type_t make(const Subject_t &f, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3)
    {
      return Dispatch_t::make(f, s1, s2, s3, Combine_t());
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, const Sub1 &s1, const Sub2 &s2,
    const Sub3 &s3)
    {
      return Dispatch_t::makeRead(f, s1, s2, s3, Combine_t());
    }
};
template<class Mesh, class T, class EngineTag>
struct View3<Field<Mesh, T, EngineTag>, int, int, int>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Element_t ReadType_t;
  typedef typename Subject_t::ElementRef_t Type_t;
  inline static
  Type_t make(const Subject_t &f, int s1, int s2, int s3)
    {
      ;
      ;
      return f.engine()(s1, s2, s3);
    }
  inline static
  ReadType_t makeRead(const Subject_t &f, int s1, int s2, int s3)
    {
      ;
      ;
      return f.engine().read(s1, s2, s3);
    }
};
template <int SliceDim, class Mesh, class T, class EngineTag, int Dim>
struct ReverseSliceView<Field<Mesh, T, EngineTag>, SliceInterval<Dim, SliceDim> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef SliceInterval<Dim, SliceDim> Domain_t;
  typedef typename NewEngine<typename Subject_t::Engine_t, Domain_t>::Type_t NewEngine_t;
  typedef Field<NoMesh<Dim>, T, typename NewEngine_t::Tag_t> Type_t;
  inline static
  Type_t make(const Subject_t &a, const SliceInterval<Dim, SliceDim>& dom,
       const Interval<Dim>& totalDom)
  {
    PoomaCTAssert<(Mesh::dimensions == SliceDim)>::test();
    ;
    return Type_t(typename Type_t::FieldEngine_t(a.fieldEngine(), dom, totalDom));
  }
};
template<class Subject> struct Patch;
template<class Mesh, class T, class EngineTag>
struct Patch<Field<Mesh, T, EngineTag> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t OldEngine_t;
  typedef typename EngineFunctor<OldEngine_t, EnginePatch>::Type_t Engine_t;
  typedef Field<Mesh, T, typename Engine_t::Tag_t> Type_t;
  enum { dim = OldEngine_t::dimensions };
  inline static
  Type_t make(const Subject_t &f, int i)
  {
    ;
    return Type_t(f, FieldEnginePatch<dim>(i, f.physicalDomain()));
  }
};
template<class Mesh, class T, class LTag, class EngineTag>
struct Patch<Field<Mesh, T, MultiPatch<LTag, EngineTag> > >
{
  typedef Field<Mesh, T, MultiPatch<LTag, EngineTag> > Subject_t;
  typedef typename Subject_t::Engine_t OldEngine_t;
  typedef typename EngineFunctor<OldEngine_t, EnginePatch>::Type_t Engine_t;
  typedef Field<Mesh, T, typename Engine_t::Tag_t> Type_t;
  enum { dim = OldEngine_t::dimensions };
  typedef typename OldEngine_t::Layout_t Layout_t;
  typedef typename Layout_t::Value_t Node_t;
  inline static
  Type_t make(const Subject_t &f, int i)
  {
    ;
    Node_t *node = f.engine().layout().nodeListLocal()[i];
    return Type_t(f, FieldEnginePatch<dim>(i, intersect(f.physicalDomain(),
                                                        node->domain())));
  }
};
template<class Components, class Subject> struct ComponentView;
template<class Components, class Mesh, class T, class EngineTag>
struct ComponentView<Components, Field<Mesh, T, EngineTag> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef Engine<Mesh::dimensions, T, EngineTag> Engine_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename ComponentAccess<Element_t, Components>::Element_t NewT_t;
  typedef CompFwd<Engine_t, Components> NewEngineTag_t;
  typedef Field<Mesh, NewT_t, NewEngineTag_t> Type_t;
  inline static
  Type_t make(const Subject_t &f, const Components &c)
    {
      return Type_t(f, ComponentWrapper<Components>(c));
    }
};
template<class Mesh,
         class T = double,
         class EngineTag = Brick>
class Field {
public:
  typedef Mesh MeshTag_t;
  typedef Mesh Mesh_t;
  typedef T T_t;
  typedef EngineTag EngineTag_t;
  typedef Field<Mesh, T, EngineTag> This_t;
  typedef FieldEngine<Mesh, T, EngineTag> FieldEngine_t;
  enum { dimensions = FieldEngine_t::dimensions };
  enum { coordinateDimensions = MeshTag_t::coordinateDimensions };
  typedef Engine<dimensions, T, EngineTag> Engine_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef typename Engine_t::Layout_t Layout_t;
  typedef typename Engine_t::Domain_t Domain_t;
  typedef Centering<dimensions> Centering_t;
  enum { hasRelations = true };
  Field()
  : fieldEngine_m()
    { }
  template<class I1>
  explicit Field(const I1 &i1)
    : fieldEngine_m(i1)
  { }
  template<class Layout2>
  Field(const Centering_t &centering, const Layout2 &layout, const Mesh_t &mesh)
    : fieldEngine_m(centering, layout, mesh)
  { }
  template<class Layout2>
  Field(int materials, const Centering_t &centering, const Layout2 &layout, const Mesh_t &mesh)
    : fieldEngine_m(centering, layout, mesh, materials)
  { }
  template<class I1, class I2>
  Field(const Centering_t &centering, const Layout_t &layout, const I1 &i1, const I2 &i2)
    : fieldEngine_m(centering, layout, Mesh_t(layout, i1, i2))
  { }
  Field(const Centering_t &centering, const Layout_t &layout)
    : fieldEngine_m(centering, layout, Mesh_t(layout))
  { }
  template<class I1, class I2>
  Field(int materials, const Centering_t &centering, const Layout_t &layout,
        const I1 &i1, const I2 &i2)
    : fieldEngine_m(centering, layout, Mesh_t(layout, i1, i2), materials)
  { }
  Field(const This_t &model)
  : fieldEngine_m(model.fieldEngine())
  { }
  void initialize(const This_t &model)
  {
    fieldEngine_m = model.fieldEngine();
  }
  template<class Layout2>
  void
  initialize(const Centering_t &centering, const Layout2 &layout,
             const Mesh_t &mesh)
  {
    fieldEngine_m = FieldEngine_t(centering, layout, mesh);
  }
  template<class Layout2>
  void
  initialize(int materials, const Centering_t &centering,
             const Layout2 &layout, const Mesh_t &mesh)
  {
    fieldEngine_m = FieldEngine_t(centering, layout, mesh, materials);
  }
  void
  initialize(const Centering_t &centering, const Layout_t &layout)
  {
    fieldEngine_m = FieldEngine_t(centering, layout, Mesh_t(layout));
  }
  template<class GT2, class T2, class ET2, class Initializer>
  Field(const Field<GT2, T2, ET2> &model, const Initializer &i)
  : fieldEngine_m(model.fieldEngine(), i)
  { }
  template<class ET2>
  Field(const Field<Mesh, T, ET2> &model, int m, int c)
    : fieldEngine_m(model.fieldEngine(), m, c)
  { }
  template<class ET2>
  Field(const Field<Mesh, T, ET2> &model, int c, const Pooma::CenteringViewTag &tag)
    : fieldEngine_m(model.fieldEngine(), c, tag)
  { }
  template<class ET2>
  Field(const Field<Mesh, T, ET2> &model, int m, const Pooma::MaterialViewTag &tag)
    : fieldEngine_m(model.fieldEngine(), m, tag)
  { }
  ~Field() { }
  inline const Engine_t &engine() const
    {
      return fieldEngine_m.engine();
    }
  inline Engine_t &engine()
    {
      return fieldEngine_m.engine();
    }
  inline const FieldEngine_t &fieldEngine() const
    {
      return fieldEngine_m;
    }
  inline FieldEngine_t &fieldEngine()
    {
      return fieldEngine_m;
    }
  inline int numSubFields() const
    {
      return fieldEngine_m.numSubFields();
    }
  const Centering<dimensions> &centering() const
  {
    return fieldEngine().centering();
  }
  const Centering<dimensions> centering(int c) const
  {
    return fieldEngine().centering()[c];
  }
  inline int centeringSize() const
  {
    return fieldEngine().centeringSize();
  }
  inline int numMaterials() const
    {
      return fieldEngine().numMaterials();
    }
  inline const Domain_t& physicalCellDomain() const
    {
      return fieldEngine_m.physicalCellDomain();
    }
  inline Domain_t totalCellDomain() const
    {
      return fieldEngine_m.totalCellDomain();
    }
  Domain_t physicalDomain(int iSubfield) const
    {
      return fieldEngine_m.physicalDomain(iSubfield);
    }
  Domain_t totalDomain(int iSubfield) const
    {
      return fieldEngine_m.totalDomain(iSubfield);
    }
  Domain_t physicalDomain() const
    {
      return fieldEngine_m.physicalDomain();
    }
  Domain_t totalDomain() const
    {
      return fieldEngine_m.totalDomain();
    }
  Domain_t domain() const
    {
      return fieldEngine_m.physicalDomain();
    }
  inline
  const Mesh_t &mesh() const
  {
    return fieldEngine_m.mesh();
  }
  inline Layout_t layout() const
  {
    return fieldEngine_m.engine(0, 0).layout();
  }
  void makeOwnCopy()
  {
    fieldEngine_m.makeOwnCopy(*this);
  }
  inline typename SubFieldView<This_t>::Type_t
  operator[](int iSubfield) const
    {
      typedef SubFieldView<This_t> Ret_t;
      return Ret_t::make(*this, iSubfield);
    }
  inline typename SubFieldView<This_t>::Type_t
  subField(int m, int c) const
  {
    typedef SubFieldView<This_t> Ret_t;
    return Ret_t::make(*this, m, c);
  }
  inline typename SubFieldView<This_t>::Type_t
  center(int c) const
  {
    typedef SubFieldView<This_t> Ret_t;
    return Ret_t::make(*this, c, Pooma::CenteringViewTag());
  }
  inline typename SubFieldView<This_t>::Type_t
  material(int m) const
  {
    ;
    typedef SubFieldView<This_t> Ret_t;
    return Ret_t::make(*this, m, Pooma::MaterialViewTag());
  }
  inline typename View1<This_t, Domain_t>::ReadType_t
  read() const
    {
      typedef View1<This_t, Domain_t> Ret_t;
      return Ret_t::makeRead(*this, physicalDomain());
    }
  inline typename View1<This_t, Domain_t>::ReadType_t
  readAll() const
    {
      typedef View1<This_t, Domain_t> Ret_t;
      return Ret_t::makeRead(*this, totalDomain());
    }
  template<class Sub1>
  inline typename View1<This_t, Sub1>::ReadType_t
  read(const Sub1 &s1) const
    {
      typedef View1<This_t, Sub1> Ret_t;
      return Ret_t::makeRead(*this, s1);
    }
  template<class Sub1, class Sub2>
  inline typename View2<This_t, Sub1, Sub2>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2) const
    {
      typedef View2<This_t, Sub1, Sub2> Ret_t;
      return Ret_t::makeRead(*this, s1, s2);
    }
  template<class Sub1, class Sub2, class Sub3>
  inline typename View3<This_t, Sub1, Sub2, Sub3>::ReadType_t
  read(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3) const
    {
      typedef View3<This_t, Sub1, Sub2, Sub3> Ret_t;
      return Ret_t::makeRead(*this, s1, s2, s3);
    }
  inline typename View1<This_t, Domain_t>::Type_t
  operator()() const
    {
      typedef View1<This_t, Domain_t> Ret_t;
      return Ret_t::make(*this, physicalDomain());
    }
  inline typename View1<This_t, Domain_t>::Type_t
  all() const
    {
      typedef View1<This_t, Domain_t> Ret_t;
      return Ret_t::make(*this, totalDomain());
    }
  template<class Sub1>
  inline typename View1<This_t, Sub1>::Type_t
  operator()(const Sub1 &s1) const
    {
      typedef View1<This_t, Sub1> Ret_t;
      return Ret_t::make(*this, s1);
    }
  template<class Sub1, class Sub2>
  inline typename View2<This_t, Sub1, Sub2>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2) const
    {
      typedef View2<This_t, Sub1, Sub2> Ret_t;
      return Ret_t::make(*this, s1, s2);
    }
  template<class Sub1, class Sub2, class Sub3>
  inline typename View3<This_t, Sub1, Sub2, Sub3>::Type_t
  operator()(const Sub1 &s1, const Sub2 &s2, const Sub3 &s3) const
    {
      typedef View3<This_t, Sub1, Sub2, Sub3> Ret_t;
      return Ret_t::make(*this, s1, s2, s3);
    }
  inline typename ComponentView<Loc<1>, This_t>::Type_t
  comp(int i1) const
  {
    return ComponentView<Loc<1>, This_t>::make(*this, Loc<1>(i1));
  }
  inline typename ComponentView<Loc<2>, This_t>::Type_t
  comp(int i1, int i2) const
  {
    return ComponentView<Loc<2>, This_t>::make(*this, Loc<2>(i1, i2));
  }
  template<class Components>
  inline typename ComponentView<Components, This_t>::Type_t
  comp(const Components &loc) const
  {
    return ComponentView<Components, This_t>::make(*this, loc);
  }
  inline typename Patch<This_t>::Type_t
  patchLocal(EnginePatch::PatchID_t i) const
    {
      return Patch<This_t>::make(*this, i);
    }
  inline int
  numPatchesLocal() const
  {
    return engineFunctor(engine(), EngineNumPatches());
  }
  This_t &operator=(const This_t &rhs)
    {
      assign(*this, rhs, OpAssign());
      return *this;
    }
  const This_t &operator=(const This_t &rhs) const
    {
      return assign(*this, rhs, OpAssign());
    }
  template<class T1>
  const This_t &operator=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpAssign());
    }
  template<class T1>
  const This_t &operator+=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpAddAssign());
    }
  template<class T1>
  const This_t &operator-=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpSubtractAssign());
    }
  template<class T1>
  const This_t &operator*=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpMultiplyAssign());
    }
  template<class T1>
  const This_t &operator/=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpDivideAssign());
    }
  template<class T1>
  const This_t &operator%=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpModAssign());
    }
  template<class T1>
  const This_t &operator|=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseOrAssign());
    }
  template<class T1>
  const This_t &operator&=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseAndAssign());
    }
  template<class T1>
  const This_t &operator^=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpBitwiseXorAssign());
    }
  template<class T1>
  const This_t &operator<<=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpLeftShiftAssign());
    }
  template<class T1>
  const This_t &operator>>=(const T1 &rhs) const
    {
      return assign(*this, rhs, OpRightShiftAssign());
    }
  void addRelation(RelationListItem *item) const
  {
    ;
    fieldEngine_m.relations().addRelation(item);
  }
  void removeRelations()
  {
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering().size(); ++ c)
      {
        fieldEngine_m.data(m, c).relations().erase();
      }
    }
  }
  void applyRelations(bool makeDirty = false) const
  {
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering().size(); ++ c)
      {
        if (makeDirty)
          fieldEngine_m.data(m, c).relations().setDirty();
        fieldEngine_m.data(m, c).relations().notifyPreRead();
      }
    }
  }
  void notifyPreRead() const
  {
    for (int m = 0; m < numMaterials(); ++m)
      for (int c = 0; c < centering().size(); ++c)
        fieldEngine_m.data(m, c).relations().notifyPreRead();
  }
  void notifyPostWrite() const
  {
    for (int m = 0; m < numMaterials(); ++m)
      for (int c = 0; c < centering().size(); ++c)
        fieldEngine_m.data(m, c).relations().notifyPostWrite();
  }
  void setDirty() const
  {
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering().size(); ++ c)
      {
        fieldEngine_m.data(m, c).relations().setDirty();
      }
    }
  }
  void clearDirty() const
  {
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering().size(); ++ c)
      {
        fieldEngine_m.data(m, c).relations().clearDirty();
      }
    }
  }
  bool isDirty() const
  {
    for (int m = 0; m < numMaterials(); ++m)
    {
      for (int c = 0; c < centering().size(); ++ c)
      {
        if (fieldEngine_m.data(m, c).relations().dirty())
   return true;
      }
    }
    return false;
  }
private:
  FieldEngine_t fieldEngine_m;
};
template<class Op>
struct AssignOpReadWriteTraits
{
  enum { readLHS = true };
};
template<>
struct AssignOpReadWriteTraits<OpAssign>
{
  enum { readLHS = false };
};
template<class Mesh, class T, class EngineTag, int Dim>
struct LeafFunctor<Field<Mesh, T, EngineTag>, ConformTag<Dim> >
{
  typedef bool Type_t;
  static Type_t apply1(const Interval<Dim> &d,
    const ConformTag<Dim> &ct)
    {
      return conforms(d, ct);
    }
  template<int Dim2>
  static Type_t apply1(const Interval<Dim2> &d,
    const ConformTag<Dim> &ct)
    {
      return false;
    }
  static Type_t apply(const Field<Mesh, T, EngineTag> &f,
    const ConformTag<Dim> &ct)
    {
      return apply1(f.physicalDomain(), ct);
    }
};
template<class Mesh, class T, class EngineTag, class RequestType>
struct LeafFunctor<Field<Mesh, T, EngineTag>,
  DataObjectRequest<RequestType> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::FieldEngine_t FieldEngine_t;
  typedef LeafFunctor<FieldEngine_t, DataObjectRequest<RequestType> >
    LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t Type_t;
  enum { dataObject = LeafFunctor_t::dataObject };
  inline static
  Type_t apply(const Subject_t &f,
            const DataObjectRequest<RequestType> &functor)
    {
      return LeafFunctor_t::apply(f.fieldEngine(), functor);
    }
};
template<class Mesh, class T, class EngineTag, class RequestType>
struct LeafFunctor<FieldEngine<Mesh, T, EngineTag>,
  DataObjectRequest<RequestType> >
{
  typedef typename FieldEngine<Mesh, T, EngineTag>::Engine_t
    Engine_t;
  enum { dataObject = Engine_t::dataObject };
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  inline static
  Type_t apply(const FieldEngine<Mesh, T, EngineTag> &f,
            const DataObjectRequest<RequestType> &functor)
    {
      return DataObjectApply<dataObject>::apply(f.engine(), functor);
    }
};
template<class Mesh, class T, class EngineTag>
struct LeafFunctor<Field<Mesh, T, EngineTag>, DomainFunctorTag>
{
  typedef typename Field<Mesh, T, EngineTag>::Domain_t Type_t;
  inline static Type_t apply(const Field<Mesh, T, EngineTag> &f,
    const DomainFunctorTag &)
    {
      return f.physicalDomain() - f.physicalDomain().firsts();
    }
};
template<class Mesh, class T, class EngineTag, class Tag>
struct LeafFunctor<Field<Mesh, T, EngineTag>, ExpressionApply<Tag> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::FieldEngine_t FieldEngine_t;
  typedef LeafFunctor<FieldEngine_t, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Subject_t &field,
        const ExpressionApply<Tag> &tag)
    {
      return LeafFunctor_t::apply(field.fieldEngine(), tag);
    }
};
template<class Mesh, class T, class EngineTag, class Tag>
struct LeafFunctor<Field<Mesh, T, EngineTag>, EngineView<Tag> >
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef typename LeafFunctor<Engine_t, EngineView<Tag> >::Type_t NewEngine_t;
  typedef typename NewEngine_t::Tag_t NewEngineTag_t;
  typedef Field<Mesh, T, NewEngineTag_t> Type_t;
  inline static
  Type_t apply(const Subject_t &field,
        const EngineView<Tag> &tag)
  {
    return Type_t(field, tag);
  }
};
template<class Mesh, class T, class EngineTag, class Tag>
struct LeafFunctor<Field<Mesh, T, EngineTag>, EngineFunctorTag<Tag> >
{
  typedef typename Field<Mesh,T,EngineTag>::Engine_t Engine_t;
  typedef typename EngineFunctor<Engine_t,Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Field<Mesh, T, EngineTag> &field,
        const EngineFunctorTag<Tag> &tag)
  {
    return EngineFunctor<Engine_t,Tag>::apply(field.engine(), tag.tag());
  }
};
template<class Mesh, class T, class EngineTag, class Tag>
struct EngineFunctor<Field<Mesh, T, EngineTag>, Tag>
{
  typedef typename Field<Mesh, T, EngineTag>::Engine_t Engine_t;
  typedef typename EngineFunctor<Engine_t, Tag>::Type_t Type_t;
  inline static
  Type_t apply(const Field<Mesh, T, EngineTag> &field,
            const Tag &tag)
    {
      return engineFunctor(field.engine(), tag);
    }
};
template<class Mesh, class T, class EngineTag, int Dim>
struct LeafFunctor<Field<Mesh, T, EngineTag>, EvalLeaf<Dim> >
{
  typedef typename Field<Mesh, T, EngineTag>::Element_t Type_t;
  inline static
  Type_t apply(const Field<Mesh, T, EngineTag> &f,
    const EvalLeaf<Dim> &t)
    {
      return t.eval(f.engine());
    }
};
template<class Mesh, class T, class EngineTag>
struct LeafFunctor<Field<Mesh, T, EngineTag>,
  PerformUpdateTag>
{
  typedef Field<Mesh, T, EngineTag> Subject_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Subject_t &f, const PerformUpdateTag &)
    {
      f.notifyPreRead();
      return 0;
    }
};
template<class Mesh, class T, class Expr>
struct LeafFunctor<Field<Mesh, T, ExpressionTag<Expr> >,
  PerformUpdateTag>
{
  typedef Field<Mesh, T, ExpressionTag<Expr> > Subject_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Subject_t &f, const PerformUpdateTag &tag)
    {
      forEach(f.engine().expression(), tag, NullCombine());
      return 0;
    }
};
template<class Mesh, class T, class EngineTag>
struct LeafFunctor<Field<Mesh, T, EngineTag>, SubFieldViewFunctorTag>
{
  typedef Field<Mesh, T, EngineTag> Type_t;
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, SubFieldViewFunctorTag>
{
  typedef Array<Dim, T, EngineTag> Type_t;
};
template<class T>
struct LeafFunctor<Scalar<T>, SubFieldViewFunctorTag>
{
  typedef Scalar<T> Type_t;
};
template<class Mesh, class T, class EngineTag, class Domain>
struct LeafFunctor<Field<Mesh, T, EngineTag>, ViewFunctorTag<Domain> >
{
  typedef typename View1<Field<Mesh, T, EngineTag>, Domain>::Type_t
    Type_t;
};
template <class Mesh, class T, class EngineTag>
std::ostream &operator<<(std::ostream &o,
  const Field<Mesh, T, EngineTag> &cf)
{
  Pooma::blockAndEvaluate();
  PrintField().print(o, cf);
  return o;
}
template <class Mesh, class T, class EngineTag>
std::fstream &operator<<(std::fstream &f,
  const Field<Mesh, T, EngineTag> &cf)
{
  Pooma::blockAndEvaluate();
  PrintField().print(f, cf);
  return f;
}
struct ExpressionIsField { };
template<class Mesh, class T, class EngineTag>
struct ExpressionTraits<Field<Mesh, T, EngineTag> >
{
  typedef ExpressionIsField Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsField, ExpressionIsField>
{
  typedef ExpressionIsField Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsField, ExpressionIsScalar>
{
  typedef ExpressionIsField Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsScalar, ExpressionIsField>
{
  typedef ExpressionIsField Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsField, ExpressionIsArray>
{
  typedef ExpressionIsField Type_t;
};
template<>
struct CombineExpressionTraits<ExpressionIsArray, ExpressionIsField>
{
  typedef ExpressionIsField Type_t;
};
template<class Mesh, class T, class EngineTag,
 int Dim2, class T2, class EngineTag2, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const Array<Dim2, T2, EngineTag2> &rhs, const Op &op)
{
  for (int m = 0; m < lhs.numMaterials(); ++m)
    {
      for (int c = 0; c < lhs.centeringSize(); ++c)
        {
          const Field<Mesh, T, EngineTag> &l = lhs.subField(m, c);
          if (AssignOpReadWriteTraits<Op>::readLHS)
            l.notifyPreRead();
          Evaluator<MainEvaluatorTag>().evaluate(l, op, rhs);
          l.notifyPostWrite();
        }
    }
  return lhs;
}
template<class Mesh, class T, class EngineTag,
  class Mesh2, class T2, class EngineTag2, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const Field<Mesh2, T2, EngineTag2> &rhs,
       const Op &op)
{
  ;
  for (int m = 0; m < lhs.numMaterials(); ++m)
    {
      for (int c = 0; c < lhs.centeringSize(); ++c)
        {
          const Field<Mesh, T, EngineTag> &l = lhs.subField(m, c);
          const typename SubFieldView<Field<Mesh2, T2, EngineTag2> >::Type_t &r =
            rhs.subField(m, c);
          forEach(r, PerformUpdateTag(), NullCombine());
          if (AssignOpReadWriteTraits<Op>::readLHS)
            l.notifyPreRead();
          Evaluator<MainEvaluatorTag>().evaluate(l, op, r);
          l.notifyPostWrite();
        }
    }
  return lhs;
}
template<class Mesh, class T, class EngineTag, class T1, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs, const T1 &rhs,
       const Op &op)
{
  for (int m = 0; m < lhs.numMaterials(); ++m)
    {
      for (int c = 0; c < lhs.centeringSize(); ++c)
        {
          const Field<Mesh, T, EngineTag> &l = lhs.subField(m, c);
          if (AssignOpReadWriteTraits<Op>::readLHS)
            l.notifyPreRead();
          typedef Field<Mesh, T, EngineTag> LHS_t;
          Array<LHS_t::dimensions, T1, ConstantFunction> rhsExpr(l.physicalDomain());
          rhsExpr.engine().setConstant(rhs);
          Evaluator<MainEvaluatorTag>().evaluate(l, op, rhsExpr);
          l.notifyPostWrite();
        }
    }
  return lhs;
}
template<class Mesh, class T, class EngineTag,
 int Dim2, class T2, class EngineTag2, class Op>
const Array<Dim2, T2, EngineTag2> &
assign(const Array<Dim2, T2, EngineTag2> &lhs,
       const Field<Mesh, T, EngineTag> &rhs, const Op &op)
{
  ;
  forEach(rhs, PerformUpdateTag(), NullCombine());
  Evaluator<MainEvaluatorTag>().evaluate(lhs, op, rhs);
  return lhs;
}
template<class Tree>
struct ConvertWhereProxy<ExpressionIsField, Tree>
{
  typedef MakeFieldReturn<Tree> Make_t;
};
template<class Mesh, class T, class EngineTag,
 class F, class B, class Op>
const Field<Mesh, T, EngineTag> &
assign(const Field<Mesh, T, EngineTag> &lhs,
       const WhereProxy<F, B> &rhs, const Op &op)
{
  assign(lhs, rhs.whereMask(), rhs.opMask(op));
  return lhs;
}
template<class Mesh, class T, class EngineTag>
inline bool compressed(const Field<Mesh, T, EngineTag> &f)
{
  ;
  return compressed(f.engine());
}
template<class Mesh, class T, class EngineTag>
inline long elementsCompressed(const Field<Mesh, T, EngineTag> &f)
{
  ;
  return elementsCompressed(f.engine());
}
template<class Mesh, class T, class LTag>
void
compress(Field<Mesh, T, MultiPatch<LTag,CompressibleBrick> > &f)
{
  for (int m = 0; m < f.numMaterials(); ++m)
  {
    for (int c = 0; c < f.centeringSize(); ++c)
    {
      compress(f.fieldEngine().data(m, c).engine());
    }
  }
}
template<class Mesh, class T, class LTag>
void
uncompress(Field<Mesh, T, MultiPatch<LTag,CompressibleBrick> > &f)
{
  for (int m = 0; m < f.numMaterials(); ++m)
  {
    for (int c = 0; c < f.centeringSize(); ++c)
    {
      uncompress(f.fieldEngine().data(m, c).engine());
    }
  }
}
template<int Dim, class T, class EngineTag>
inline int numMaterials(const Array<Dim, T, EngineTag> &a)
{
  return 1;
}
template<class Mesh, class T, class EngineTag>
inline int numMaterials(const Field<Mesh, T, EngineTag> &f)
{
  return f.numMaterials();
}
template<int Dim, class T, class EngineTag>
inline int centeringSize(const Array<Dim, T, EngineTag> &a)
{
  return 1;
}
template<class Mesh, class T, class EngineTag>
inline int centeringSize(const Field<Mesh, T, EngineTag> &f)
{
  return f.centeringSize();
}
template<int Dim, class T, class EngineTag>
inline Array<Dim, T, EngineTag> &subField(Array<Dim, T, EngineTag> &a, int, int)
{
  return a;
}
template<class Mesh, class T, class EngineTag>
inline typename SubFieldView<Field<Mesh, T, EngineTag> >::Type_t
subField(Field<Mesh, T, EngineTag> &f, int m, int c)
{
  return f.subField(m, c);
}
template<class Mesh, class T, class EngineTag> class Field;
struct FarLeftTag
{
 
};
template<class G1, class T1, class E1, class Op>
struct Combine1<Field<G1, T1, E1>, Op, FarLeftTag>
{
  typedef Field<G1, T1, E1> Type_t;
  inline static
  const Type_t &combine(const Field<G1, T1, E1> &a,
   const FarLeftTag &)
    {
      return a;
    }
};
template<class G1, class T1, class E1, class G2, class T2, class E2,
  class Op>
struct Combine2<Field<G1, T1, E1>, Field<G2, T2, E2>, Op, FarLeftTag>
{
  typedef Field<G1, T1, E1> Type_t;
  inline static
  const Type_t &combine(const Field<G1, T1, E1> &a,
                        const Field<G2, T2, E2> &, FarLeftTag)
    {
      return a;
    }
};
template<class T, class G2, class T2, class E2, class Op>
struct Combine2<T, Field<G2, T2, E2>, Op, FarLeftTag>
{
  typedef Field<G2, T2, E2> Type_t;
  inline static
  const Type_t &combine(const T &,
                        const Field<G2, T2, E2> &b, FarLeftTag)
    {
      return b;
    }
};
template<class G1, class T1, class E1, class T, class Op>
struct Combine2<Field<G1, T1, E1>, T, Op, FarLeftTag>
{
  typedef Field<G1, T1, E1> Type_t;
  inline static
  const Type_t &combine(const Field<G1, T1, E1> &a,
                        const T &, FarLeftTag)
    {
      return a;
    }
};
template<class T, class Op>
struct Combine2<ErrorType, T, Op, FarLeftTag>
{
  typedef T Type_t;
  inline static
  const Type_t &combine(const ErrorType& e, const T& t,
          FarLeftTag)
  {
    return t;
  }
};
template<class T, class Op>
struct Combine2<T, ErrorType, Op, FarLeftTag>
{
  typedef T Type_t;
  inline static
  const Type_t &combine(const T& t, const ErrorType& e,
          FarLeftTag)
  {
    return t;
  }
};
template<class A,class B,class C,class Op>
struct Combine3<A, B, C, Op, FarLeftTag>
{
  typedef typename Combine2<A, B, Op, FarLeftTag>::Type_t Type1_t;
  typedef typename Combine2<Type1_t, C, Op, FarLeftTag>::Type_t Type_t;
  inline static
  const Type_t &combine(const A& a, const B& b, const C& c,
   const FarLeftTag& t)
  {
    return
      Combine2<Type1_t, C,
      Op, FarLeftTag>::combine(Combine2<A, B, Op,
          FarLeftTag>::combine(a, b, t), c, t);
  }
};
template<class GeometryTag, class T, class EngineTag>
struct LeafFunctor<Field<GeometryTag, T, EngineTag>, FarLeftTag>
{
  typedef Field<GeometryTag, T, EngineTag> Type_t;
  inline static
  const Type_t &apply(const Field<GeometryTag, T, EngineTag> &f,
    const FarLeftTag &)
    {
      return f;
    }
};
template<int Dim, class T, class EngineTag>
struct LeafFunctor<Array<Dim, T, EngineTag>, FarLeftTag>
{
  typedef ErrorType Type_t;
  inline static
  const Type_t &apply(const Array<Dim, T, EngineTag> &a,
    const FarLeftTag &)
    {
      return Type_t();
    }
};
template<class T>
struct LeafFunctor<Scalar<T>, FarLeftTag>
{
  typedef Scalar<T> Type_t;
  inline static
  const Type_t &apply(const Scalar<T> &s, const FarLeftTag &)
    {
      return s;
    }
};
template<class Mesh, class T, class Expr>
class FieldEngine<Mesh, T, ExpressionTag<Expr> >
{
public:
  enum { dimensions = Mesh::dimensions };
  enum { Dim = dimensions };
  typedef ExpressionTag<Expr> EngineTag_t;
  typedef FieldEngine<Mesh, T, EngineTag_t> This_t;
  typedef Engine<Dim, T, EngineTag_t> Engine_t;
  typedef typename Engine_t::Domain_t Domain_t;
  typedef typename Engine_t::Layout_t Layout_t;
  typedef typename Engine_t::Element_t Element_t;
  typedef typename Engine_t::ElementRef_t ElementRef_t;
  typedef GuardLayers<Dim> GuardLayers_t;
  typedef typename ForEach<Expr, FarLeftTag, FarLeftTag>::Type_t
    ReferenceField_t;
  FieldEngine(const Engine_t &e)
  : engine_m(e),
    referenceField_m(
      forEachRef(engine_m.expression(), FarLeftTag(), FarLeftTag()))
    { }
  template<class Expr2, class Domain>
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr2> > &model,
    const Domain &d)
  : engine_m(NewEngineEngine<Engine<Dim, T, ExpressionTag<Expr2> >, Domain>::apply(model.engine(), d),
      NewEngineDomain<Engine<Dim, T, ExpressionTag<Expr2> >, Domain>::apply(model.engine(), d)
      ),
    referenceField_m(
      forEachRef(engine_m.expression(), FarLeftTag(), FarLeftTag()))
    { }
  template<class Expr2>
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr2> > &model, int m, int c)
    : engine_m(Expr(model.engine().expression(), m, c)),
      referenceField_m(forEachRef(engine_m.expression(),
                                  FarLeftTag(), FarLeftTag()))
  { }
  template<class Expr2>
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr2> > &model, int m,
       const Pooma::MaterialViewTag& tag)
    : engine_m(Expr(model.engine().expression(), m, tag)),
      referenceField_m(forEachRef(engine_m.expression(),
                                  FarLeftTag(), FarLeftTag()))
  { }
  template<class Expr2>
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr2> > &model, int c,
       const Pooma::CenteringViewTag& tag)
    : engine_m(Expr(model.engine().expression(), c, tag)),
      referenceField_m(forEachRef(engine_m.expression(),
                                  FarLeftTag(), FarLeftTag()))
  { }
  template<class Expr2>
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr2> > &model, int iSubField)
    : engine_m(Expr(model.engine().expression, iSubField)),
      referenceField_m(forEachRef(engine_m.expression(),
                                  FarLeftTag(), FarLeftTag()))
  { }
  FieldEngine(const FieldEngine<Mesh, T, ExpressionTag<Expr> > &other)
  : engine_m(other.engine()),
    referenceField_m(forEachRef(engine_m.expression(),
    FarLeftTag(), FarLeftTag()))
  { }
  int numSubFields() const
    {
      return referenceField().numSubFields();
    }
  const Engine_t &engine() const
    {
      return engine_m;
    }
  Engine_t &engine()
    {
      return engine_m;
    }
  const ReferenceField_t &referenceField() const
  {
    return referenceField_m;
  }
  const Domain_t &physicalCellDomain() const
    {
      return referenceField().physicalCellDomain();
    }
  Domain_t totalCellDomain() const
    {
      return referenceField().totalCellDomain();
    }
  Domain_t physicalDomain() const
    {
      return referenceField().physicalDomain();
    }
  Domain_t totalDomain() const
    {
      return referenceField().totalDomain();
    }
  Domain_t physicalDomain(int iSubField) const
    {
      return referenceField().physicalDomain(iSubField);
    }
  Domain_t totalDomain(int iSubField) const
    {
      return referenceField().totalDomain(iSubField);
    }
  const Centering<Dim> &centering() const
  {
    return referenceField().centering();
  }
  int centeringSize() const
    {
      return referenceField().centeringSize();
    }
  int numMaterials() const
    {
      return referenceField().numMaterials();
    }
  Mesh &mesh()
  {
    return referenceField().mesh();
  }
  const Mesh &mesh() const
  {
    return referenceField().mesh();
  }
private:
  This_t &operator=(const This_t &other);
  Engine_t engine_m;
  const ReferenceField_t &referenceField_m;
};
template<class Mesh, class T, class Expr, class Tag>
struct LeafFunctor<FieldEngine<Mesh, T, ExpressionTag<Expr> >,
  ExpressionApply<Tag> >
{
  typedef FieldEngine<Mesh, T, ExpressionTag<Expr> > Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef LeafFunctor<Engine_t, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  inline static
  Type_t apply(const Subject_t &fieldEngineBase,
        const ExpressionApply<Tag> &tag)
  {
    LeafFunctor_t::apply(fieldEngineBase.engine(), tag);
    return 0;
  }
};
struct RectilinearTag {};
struct UniformRectilinearTag {};
struct CartesianTag {
  enum { x = 0, y = 1, z = 2 };
};
struct CylindricalTag {
  enum { r = 0, z = 1, phi = 2 };
};
struct SphericalTag {
  enum { r = 0, theta = 1, phi = 2};
};
template<class MeshTraits> struct CartesianRM;
template<class MeshTraits> struct CartesianURM;
template<class MeshTraits> struct CylindricalRM;
template<class MeshTraits> struct CylindricalURM;
template<class MeshTraits> struct SphericalRM;
template<class MeshTraits> struct SphericalURM;
template<class MeshTraits> class RectilinearMeshData;
template<class MeshTraits> class RectilinearMesh;
template<class MeshTraits> class UniformRectilinearMeshData;
template<class MeshTraits> class UniformRectilinearMesh;
template <int Dim, typename T = double, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag, int CDim = Dim>
struct MeshTraits;
template <int Dim, typename T, class MeshTag, class CoordinateSystemTag, int CDim>
struct MeshTraitsBase
{
  typedef MeshTraits<Dim, T, MeshTag, CoordinateSystemTag, CDim> MeshTraits_t;
  typedef MeshTag MeshTag_t;
  typedef CoordinateSystemTag CoordinateSystemTag_t;
  typedef T T_t;
  enum { dimensions = Dim };
  enum { coordinateDimensions = CDim };
  typedef T Scalar_t;
  typedef Loc<Dim> Loc_t;
  typedef Interval<Dim> Domain_t;
  typedef Vector<CDim, T> PointType_t;
  typedef Vector<CDim, T> VectorType_t;
  typedef Vector<CDim, int> CIndexType_t;
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, RectilinearTag, CartesianTag, CDim>
  : MeshTraitsBase<Dim, T, RectilinearTag, CartesianTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, RectilinearTag, CartesianTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef CartesianRM<MeshTraits_t> CoordinateSystem_t;
  typedef RectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef RectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Array<1, T, Brick> SpacingsType_t[CDim];
  typedef Array<1, T, Brick> PositionsType_t[CDim];
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, UniformRectilinearTag, CartesianTag, CDim>
  : public MeshTraitsBase<Dim, T, UniformRectilinearTag, CartesianTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, UniformRectilinearTag, CartesianTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef CartesianURM<MeshTraits_t> CoordinateSystem_t;
  typedef UniformRectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef UniformRectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Vector<CDim, T> SpacingsType_t;
  typedef Vector<CDim, T> PositionsType_t;
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, RectilinearTag, CylindricalTag, CDim>
  : public MeshTraitsBase<Dim, T, RectilinearTag, CylindricalTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, RectilinearTag, CylindricalTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef CylindricalRM<MeshTraits_t> CoordinateSystem_t;
  typedef RectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef RectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Array<1, T, Brick> SpacingsType_t[CDim];
  typedef Array<1, T, Brick> PositionsType_t[CDim];
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, UniformRectilinearTag, CylindricalTag, CDim>
  : public MeshTraitsBase<Dim, T, UniformRectilinearTag, CylindricalTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, UniformRectilinearTag, CylindricalTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef CylindricalURM<MeshTraits_t> CoordinateSystem_t;
  typedef UniformRectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef UniformRectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Vector<CDim, T> SpacingsType_t;
  typedef Vector<CDim, T> PositionsType_t;
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, RectilinearTag, SphericalTag, CDim>
  : MeshTraitsBase<Dim, T, RectilinearTag, SphericalTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, RectilinearTag, SphericalTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef SphericalRM<MeshTraits_t> CoordinateSystem_t;
  typedef RectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef RectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Array<1, T, Brick> SpacingsType_t[CDim];
  typedef Array<1, T, Brick> PositionsType_t[CDim];
};
template <int Dim, typename T, int CDim>
struct MeshTraits<Dim, T, UniformRectilinearTag, SphericalTag, CDim>
  : MeshTraitsBase<Dim, T, UniformRectilinearTag, SphericalTag, CDim>
{
  typedef typename MeshTraitsBase<Dim, T, UniformRectilinearTag, SphericalTag, CDim>::MeshTraits_t MeshTraits_t;
  typedef SphericalURM<MeshTraits_t> CoordinateSystem_t;
  typedef UniformRectilinearMeshData<MeshTraits_t> MeshData_t;
  typedef UniformRectilinearMesh<MeshTraits_t> Mesh_t;
  typedef Vector<CDim, T> SpacingsType_t;
  typedef Vector<CDim, T> PositionsType_t;
};
template <int Dim>
class NoMeshData : public RefCounted
{
public:
  NoMeshData()
    {
    }
  template<class Layout>
  explicit NoMeshData(const Layout &layout)
  : physicalVertexDomain_m(layout.innerDomain()),
    physicalCellDomain_m(shrinkRight(physicalVertexDomain_m, 1)),
    totalVertexDomain_m(layout.domain()),
    totalCellDomain_m(shrinkRight(totalVertexDomain_m, 1))
    {
    }
  NoMeshData(const NoMeshData<Dim> &model)
  : physicalVertexDomain_m(model.physicalVertexDomain_m),
    physicalCellDomain_m(model.physicalCellDomain_m),
    totalVertexDomain_m(model.totalVertexDomain_m),
    totalCellDomain_m(model.totalCellDomain_m)
    {
    }
  NoMeshData(const Interval<Dim> &d)
  : physicalVertexDomain_m(d - d.firsts()),
    physicalCellDomain_m(shrinkRight(physicalVertexDomain_m, 1)),
    totalVertexDomain_m(d - d.firsts()),
    totalCellDomain_m(shrinkRight(totalVertexDomain_m, 1))
    {
    }
  NoMeshData(const NoMeshData<Dim> &model, const FieldEnginePatch<Dim> &p)
  : physicalVertexDomain_m(p.domain_m),
    physicalCellDomain_m(shrinkRight(physicalVertexDomain_m, 1)),
    totalVertexDomain_m(p.domain_m),
    totalCellDomain_m(shrinkRight(totalVertexDomain_m, 1))
    {
    }
  NoMeshData<Dim> &operator=(const NoMeshData<Dim> &rhs)
    {
      if (this != &rhs)
        {
          physicalVertexDomain_m = rhs.physicalVertexDomain_m;
          physicalCellDomain_m = rhs.physicalCellDomain_m;
          totalVertexDomain_m = rhs.totalVertexDomain_m;
          totalCellDomain_m = rhs.totalCellDomain_m;
        }
      return *this;
    }
  ~NoMeshData()
    {
    }
  inline const Interval<Dim> &physicalVertexDomain() const
    {
      return physicalVertexDomain_m;
    }
  inline const Interval<Dim> &physicalCellDomain() const
    {
      return physicalCellDomain_m;
    }
  inline const Interval<Dim> &totalVertexDomain() const
    {
      return totalVertexDomain_m;
    }
  inline const Interval<Dim> &totalCellDomain() const
    {
      return totalCellDomain_m;
    }
private:
  Interval<Dim> physicalVertexDomain_m, physicalCellDomain_m;
  Interval<Dim> totalVertexDomain_m, totalCellDomain_m;
};
template<int Dim>
class NoMesh
{
public:
  enum { dimensions = Dim };
  enum { coordinateDimensions = Dim };
  inline NoMesh()
  : data_m(new NoMeshData<Dim>)
    {
    }
  template<class Layout>
  inline explicit NoMesh(const Layout &layout)
  : data_m(new NoMeshData<Dim>(layout))
    {
    }
  inline explicit NoMesh(const NoMeshData<Dim> &data)
  : data_m(new NoMeshData<Dim>(data))
    {
    }
  inline NoMesh(const NoMesh<Dim> &model)
  : data_m(model.data_m)
    {
    }
  inline NoMesh(const NoMesh<Dim> &model, const Interval<Dim> &d)
  : data_m(new NoMeshData<Dim>(d))
    {
    }
  NoMesh(const NoMesh<Dim> &model, const INode<Dim> &i)
  : data_m(new NoMeshData<Dim>(i.domain()))
    {
    }
  inline NoMesh(const NoMesh<Dim> &model, const FieldEnginePatch<Dim> &p)
  : data_m(new NoMeshData<Dim>(*model.data_m, p))
    {
    }
  template<class Mesh, class Domain>
  inline NoMesh(const Mesh &, const Domain &d)
    {
      Interval<Dim> dom;
      for (int i = 0; i < Dim; i++)
        dom[i] = d[i].size();
      data_m = new NoMeshData<Dim>(dom);
    }
  ~NoMesh() { }
  const NoMeshData<Dim>& data() const
    {
      return *data_m;
    }
  NoMesh<Dim> &
  operator=(const NoMesh<Dim> &rhs)
    {
      if (&rhs != this)
        {
          data_m = rhs.data_m;
        }
      return *this;
    }
  inline const Interval<Dim> &physicalVertexDomain() const
    {
      return data_m->physicalVertexDomain();
    }
  inline const Interval<Dim> &physicalCellDomain() const
    {
      return data_m->physicalCellDomain();
    }
  inline const Interval<Dim> &totalVertexDomain() const
    {
      return data_m->totalVertexDomain();
    }
  inline const Interval<Dim> &totalCellDomain() const
    {
      return data_m->totalCellDomain();
    }
private:
  RefCountedPtr<NoMeshData<Dim> > data_m;
};
template <class MeshTraits>
class UniformRectilinearMeshData : public NoMeshData<MeshTraits::dimensions>
{
public:
  typedef typename MeshTraits::MeshData_t MeshData_t;
  typedef typename MeshTraits::Domain_t Domain_t;
  typedef typename MeshTraits::Scalar_t Scalar_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  UniformRectilinearMeshData()
    {
    }
  template<class Layout>
  UniformRectilinearMeshData(
    const Layout &layout,
    const PointType_t &origin,
    const SpacingsType_t &spacings)
  : NoMeshData<dimensions>(layout),
    origin_m(origin),
    spacings_m(spacings)
    {
    }
  UniformRectilinearMeshData(const MeshData_t &model)
  : NoMeshData<dimensions>(model),
    origin_m(model.origin_m),
    spacings_m(model.spacings_m)
    {
    }
  UniformRectilinearMeshData(const MeshData_t &model,
                             const Domain_t &d)
  : NoMeshData<dimensions>(d),
    origin_m(model.origin_m),
    spacings_m(model.spacings_m)
    {
      for (int i = 0; i < dimensions; i++)
        origin_m(i) +=
          spacings_m(i) *
            (d[i].first() - model.physicalCellDomain()[i].first());
    }
  MeshData_t &
  operator=(const MeshData_t &rhs)
    {
      if (this != &rhs)
        {
          NoMeshData<dimensions>::operator=(rhs);
          origin_m = rhs.origin_m;
          spacings_m = rhs.spacings_m;
        }
      return *this;
    }
  ~UniformRectilinearMeshData() { }
  inline const SpacingsType_t &spacings() const
    {
      return spacings_m;
    }
  inline const PointType_t &origin() const
    {
      return origin_m;
    }
private:
  PointType_t origin_m;
  SpacingsType_t spacings_m;
};
template<class MeshTraits>
class UniformRectilinearMesh : public MeshTraits::CoordinateSystem_t
{
public:
  typedef MeshTraits MeshTraits_t;
  typedef typename MeshTraits::CoordinateSystem_t CoordinateSystem_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::MeshData_t MeshData_t;
  typedef typename MeshTraits::Loc_t Loc_t;
  typedef typename MeshTraits::Domain_t Domain_t;
  typedef typename MeshTraits::Scalar_t Scalar_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::T_t T_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  UniformRectilinearMesh()
  : data_m(new MeshData_t())
    {
    }
  template<class Layout>
  inline UniformRectilinearMesh(const Layout &layout,
                                const PointType_t &origin,
                                const SpacingsType_t &spacings)
  : data_m(new MeshData_t(layout, origin, spacings))
    {
    }
  template<class Layout>
  inline explicit UniformRectilinearMesh(const Layout &layout)
  : data_m(new MeshData_t(layout,
                                                  PointType_t(0),
                                                  SpacingsType_t(1)))
    {
    }
  inline UniformRectilinearMesh(const Mesh_t &model)
  : data_m(model.data_m)
    {
    }
  inline UniformRectilinearMesh(const Mesh_t &model,
                                const Domain_t &d)
  : data_m(new MeshData_t(*model.data_m, d))
    {
    }
  inline UniformRectilinearMesh(const Mesh_t &model,
                                const INode<dimensions> &i)
  : data_m(new MeshData_t(*model.data_m, i.domain()))
    {
    }
  inline Mesh_t &
  operator=(const Mesh_t &rhs)
    {
      if (&rhs != this)
        {
          data_m = rhs.data_m;
        }
      return *this;
    }
  ~UniformRectilinearMesh()
    {
    }
  const MeshData_t& data() const
    {
      return *data_m;
    }
  inline const Domain_t &physicalVertexDomain() const
    {
      return data_m->physicalVertexDomain();
    }
  inline const Domain_t &physicalCellDomain() const
    {
      return data_m->physicalCellDomain();
    }
  inline const Domain_t &totalVertexDomain() const
    {
      return data_m->totalVertexDomain();
    }
  inline const Domain_t &totalCellDomain() const
    {
      return data_m->totalCellDomain();
    }
  inline const PointType_t &origin() const
    {
      return data_m->origin();
    }
  inline const SpacingsType_t &spacings() const
    {
      return data_m->spacings();
    }
  inline Loc_t cellContaining(const PointType_t &point) const
    {
      Loc_t loc((Pooma::NoInit()));
      for (int i = 0; i < dimensions; i++)
        loc[i] =
          Loc<1>(static_cast<int>((point(i) - origin()(i)) / spacings()(i)));
      return loc;
    }
  inline PointType_t vertexPosition(const Loc_t &loc) const
    {
      PointType_t point;
      for (int i = 0; i < dimensions; i++)
        point(i) = origin()(i) + spacings()(i) *
          (loc[i].first() - physicalCellDomain()[i].first());
      return point;
    }
  inline Scalar_t vertexPosition(int dim, int i) const
    {
      return origin()(dim) + spacings()(dim)
              * (i - physicalCellDomain()[dim].first());
    }
  inline PointType_t cellPosition(const Loc_t &loc) const
    {
      PointType_t point;
      for (int i=0; i<dimensions; i++)
 point(i) = origin()(i) + spacings()(i)
   * (loc[i].first() - physicalCellDomain()[i].first() + 0.5);
      return point;
    }
  inline Scalar_t cellPosition(int dim, int i) const
    {
      return origin()(dim) + spacings()(dim)
               * (i - physicalCellDomain()[dim].first() + 0.5);
    }
  inline VectorType_t vertexSpacing(const Loc_t &loc) const
    {
      return spacings();
    }
  inline Scalar_t vertexSpacing(int dim, int = 0) const
    {
      return spacings()(dim);
    }
  inline VectorType_t cellSpacing(const Loc_t &loc) const
    {
      return spacings();
    }
  inline Scalar_t cellSpacing(int dim, int = 0) const
    {
      return spacings()(dim);
    }
private:
  RefCountedPtr<MeshData_t > data_m;
};
template <class MeshTraits>
struct GenericURM {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::Loc_t Loc_t;
  typedef typename MeshTraits::CIndexType_t CIndexType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  class PositionsFunctor {
  public:
    PositionsFunctor() { }
    PositionsFunctor(const Mesh_t &m,
                     const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
      {
        for (int i = 0; i < dimensions; i++)
          origin_m(i) += spacings_m(i) *
            (c.position(0)(i) - m.physicalCellDomain()[i].first());
      }
    inline PointType_t operator()(int i0) const
      {
 CIndexType_t i(0);
 i(0) = i0;
        return origin_m + i * spacings_m;
      }
    inline PointType_t operator()(int i0, int i1) const
      {
 CIndexType_t i(0);
 i(0) = i0;
 i(1) = i1;
        return origin_m + i * spacings_m;
      }
    inline PointType_t operator()(int i0, int i1, int i2) const
      {
 CIndexType_t i(0);
 i(0) = i0;
 i(1) = i1;
 i(2) = i2;
        return origin_m + i * spacings_m;
      }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  typedef IndexFunction<PositionsFunctor> PositionsEngineTag_t;
  template <class PositionsEngineTag>
  void initializePositions(
    Engine<dimensions, PointType_t, PositionsEngineTag> &e,
    const Centering<dimensions> &c) const
    {
      e.setFunctor(typename PositionsEngineTag::Functor_t(static_cast<const Mesh_t&>(*this), c));
    }
  typedef ConstantFunction SpacingsEngineTag_t;
  void initializeSpacings(
    Engine<dimensions, VectorType_t, SpacingsEngineTag_t> &e,
    const Centering<dimensions> &) const
    {
      e.setConstant(static_cast<const Mesh_t&>(*this).spacings());
    }
  typedef ConstantFunction NormalsEngineTag_t;
  void initializeNormals(
    Engine<dimensions, VectorType_t, NormalsEngineTag_t> &e,
    const Centering<dimensions> &c,
    bool outward = true) const
    {
      ;
      ;
      VectorType_t normal;
      for (int i = 0; i < dimensions; i++)
        {
          normal(i) = static_cast<T_t>(1 - c.orientation(0)[i].first());
          if (outward && c.position(0)(i) == 0.0)
            normal(i) *= static_cast<T_t>(-1);
        }
      e.setConstant(normal);
    }
  inline T_t DDX0(int) const { return 0.5; }
  inline T_t DDX0(const Loc_t&) const { return 0.5; }
  inline T_t DDX1(int) const { return 0.5; }
  inline T_t DDX1(const Loc_t&) const { return 0.5; }
  inline T_t DDY0(int) const { return 0.5; }
  inline T_t DDY0(const Loc_t&) const { return 0.5; }
  inline T_t DDY1(int) const { return 0.5; }
  inline T_t DDY1(const Loc_t&) const { return 0.5; }
  inline T_t DDZ0(int) const { return 0.5; }
  inline T_t DDZ0(const Loc_t&) const { return 0.5; }
  inline T_t DDZ1(int) const { return 0.5; }
  inline T_t DDZ1(const Loc_t&) const { return 0.5; }
};
template <class MeshTraits>
class RectilinearMeshData : public NoMeshData<MeshTraits::dimensions>
{
public:
  typedef typename MeshTraits::Domain_t Domain_t;
  typedef typename MeshTraits::MeshData_t MeshData_t;
  typedef typename MeshTraits::Scalar_t Scalar_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  RectilinearMeshData()
    {
    }
  template<class Layout>
  RectilinearMeshData(
    const Layout &layout,
    const PointType_t &origin,
    const SpacingsType_t &spacings)
  : NoMeshData<dimensions>(layout),
    origin_m(origin)
    {
      typedef Engine<1, Scalar_t, Brick> Engine_t;
      for (int i=0; i<dimensions; i++) {
 Interval<1> dom(layout.domain()[i]), idom(layout.innerDomain()[i]);
 spacings_m[i].engine() = Engine_t(dom);
 spacings_m[i] = spacings[i];
 Pooma::blockAndEvaluate();
 positions_m[i].engine() = Engine_t(dom);
 positions_m[i](idom.min()) = origin_m(i);
 for (int j=idom.min()-1; j>=dom.min(); j--)
   positions_m[i](j) = positions_m[i].read(j+1) - spacings_m[i].read(j);
 for (int j=idom.min()+1; j<=dom.max(); j++)
   positions_m[i](j) = positions_m[i].read(j-1) + spacings_m[i].read(j-1);
      }
    }
  template<class Layout>
  RectilinearMeshData(
    const Layout &layout,
    const PointType_t &origin,
    const VectorType_t &spacings)
  : NoMeshData<dimensions>(layout),
    origin_m(origin)
    {
      for (int i=0; i<dimensions; i++) {
 Interval<1> dom(layout.domain()[i]), idom(layout.innerDomain()[i]);
 spacings_m[i].engine() = Engine<1, Scalar_t, Brick>(dom, spacings(i));
 positions_m[i].engine() = Engine<1, Scalar_t, Brick>(dom);
 positions_m[i](idom.min()) = origin_m(i);
 for (int j=idom.min()-1; j>=dom.min(); j--)
   positions_m[i](j) = positions_m[i].read(j+1) - spacings_m[i].read(j);
 for (int j=idom.min()+1; j<=dom.max(); j++)
   positions_m[i](j) = positions_m[i].read(j-1) + spacings_m[i].read(j-1);
      }
    }
  RectilinearMeshData(const MeshData_t &model)
  : NoMeshData<dimensions>(model),
    origin_m(model.origin_m)
    {
      for (int i=0; i<dimensions; i++) {
 spacings_m[i].engine() = model.spacings_m[i].engine();
 positions_m[i].engine() = model.positions_m[i].engine();
      }
    }
  RectilinearMeshData(const MeshData_t &model,
        const Interval<dimensions> &d)
  : NoMeshData<dimensions>(d)
    {
      typedef Engine<1, Scalar_t, Brick> Engine_t;
      for (int i = 0; i < dimensions; i++) {
 Interval<1> dom(d[i]);
 Interval<1> viewdom(dom.size());
 spacings_m[i].engine() = Engine_t(&model.spacings_m[i](dom)(0),
       viewdom);
 positions_m[i].engine() = Engine_t(&model.positions_m[i](dom)(0),
        viewdom);
 origin_m(i) = model.positions_m[i].read(dom.min());
      }
    }
  MeshData_t &
  operator=(const MeshData_t &rhs)
    {
      if (this != &rhs)
        {
          NoMeshData<dimensions>::operator=(rhs);
          origin_m = rhs.origin_m;
   for (int i=0; i<dimensions; i++) {
     spacings_m[i].engine() = rhs.spacings_m[i].engine();
     positions_m[i].engine() = rhs.positions_m[i].engine();
   }
        }
      return *this;
    }
  ~RectilinearMeshData() { }
  inline const SpacingsType_t &spacings() const
    {
      return spacings_m;
    }
  inline const PositionsType_t &positions() const
    {
      return positions_m;
    }
  inline const PointType_t &origin() const
    {
      return origin_m;
    }
private:
  PointType_t origin_m;
  SpacingsType_t spacings_m;
  PositionsType_t positions_m;
};
template<class MeshTraits>
class RectilinearMesh : public MeshTraits::CoordinateSystem_t
{
public:
  typedef MeshTraits MeshTraits_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::MeshData_t MeshData_t;
  typedef typename MeshTraits::CoordinateSystem_t CoordinateSystem_t;
  typedef typename MeshTraits::Domain_t Domain_t;
  typedef typename MeshTraits::Loc_t Loc_t;
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Scalar_t Scalar_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  RectilinearMesh()
  : data_m(new MeshData_t)
    {
    }
  template<class Layout>
  inline RectilinearMesh(const Layout &layout,
    const PointType_t &origin,
    const SpacingsType_t &spacings)
  : data_m(new MeshData_t(layout, origin, spacings))
    {
    }
  template<class Layout>
  inline RectilinearMesh(const Layout &layout,
    const PointType_t &origin,
    const PointType_t &spacings)
  : data_m(new MeshData_t(layout, origin, spacings))
    {
    }
  template<class Layout>
  inline explicit RectilinearMesh(const Layout &layout)
  : data_m(new MeshData_t(layout,
        PointType_t(0),
        PointType_t(1)))
    {
    }
  inline RectilinearMesh(const Mesh_t &model)
  : data_m(model.data_m)
    {
    }
  inline RectilinearMesh(const Mesh_t &model,
    const Domain_t &d)
  : data_m(new MeshData_t(*model.data_m, d))
    {
    }
  inline RectilinearMesh(const Mesh_t &model,
    const INode<dimensions> &i)
  : data_m(new MeshData_t(*model.data_m, i.domain()))
    {
    }
  inline Mesh_t &
  operator=(const Mesh_t &rhs)
    {
      if (&rhs != this)
        {
          data_m = rhs.data_m;
        }
      return *this;
    }
  ~RectilinearMesh()
    {
    }
  const MeshData_t& data() const
    {
      return *data_m;
    }
  inline const Domain_t &physicalVertexDomain() const
    {
      return data_m->physicalVertexDomain();
    }
  inline const Domain_t &physicalCellDomain() const
    {
      return data_m->physicalCellDomain();
    }
  inline const Domain_t &totalVertexDomain() const
    {
      return data_m->totalVertexDomain();
    }
  inline const Domain_t &totalCellDomain() const
    {
      return data_m->totalCellDomain();
    }
  inline const PointType_t &origin() const
    {
      return data_m->origin();
    }
  inline const SpacingsType_t &spacings() const
    {
      return data_m->spacings();
    }
  inline const PositionsType_t &positions() const
    {
      return data_m->positions();
    }
  inline Loc_t cellContaining(const PointType_t &point) const
    {
      Loc_t loc((Pooma::NoInit()));
      for (int i = 0; i < dimensions; i++)
 {
   const T_t *start = &positions()[i](0);
   const T_t *finish = start + positions()[i].physicalDomain()[i].length();
   const T_t *p = std::lower_bound(start, finish, point(i));
   int j = static_cast<int>(std::distance(start, p));
   if (*p == point(i))
     loc[i] = j;
   else
     loc[i] = j-1;
 }
      return loc;
    }
  inline PointType_t vertexPosition(const Loc_t &loc) const
    {
      PointType_t point;
      for (int i = 0; i < dimensions; i++)
        point(i) = positions()[i](loc[i]);
      return point;
    }
  inline Scalar_t vertexPosition(int dim, int i) const
    {
      return positions()[dim](i);
    }
  inline PointType_t cellPosition(const Loc_t &loc) const
    {
      PointType_t point;
      for (int i=0; i<dimensions; i++)
 point(i) = positions()[i](loc[i]) + 0.5*spacings()[i](loc[i]);
      return point;
    }
  inline Scalar_t cellPosition(int dim, int i) const
    {
      return positions()[dim](i) + 0.5*spacings()[dim](i);
    }
  inline VectorType_t vertexSpacing(const Loc_t &loc) const
    {
      VectorType_t delta;
      for (int i=0; i<dimensions; i++)
 delta(i) = spacings()[i](loc[i]);
      return delta;
    }
  inline Scalar_t vertexSpacing(int dim, int i) const
    {
      return spacings()[dim](i);
    }
  inline VectorType_t cellSpacing(const Loc_t &loc) const
    {
      VectorType_t delta;
      for (int i=0; i<dimensions; i++)
 delta(i) = 0.5 * (spacings()[i](loc[i]) + spacings()[i](loc[i]+1));
      return delta;
    }
  inline Scalar_t cellSpacing(int dim, int i) const
    {
      return 0.5*(spacings()[dim](i) + spacings()[dim](i+1));
    }
private:
  RefCountedPtr<MeshData_t> data_m;
};
template <class MeshTraits>
struct GenericRM {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  typedef typename MeshTraits::Loc_t Loc_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  class PositionsFunctor {
  public:
    PositionsFunctor() { }
    PositionsFunctor(const Mesh_t &m,
                     const Centering<dimensions> &c)
      : centering_m(c.position(0))
      {
 for (int i=0; i<dimensions; i++) {
   positions_m[i].engine() = m.positions()[i].engine();
   spacings_m[i].engine() = m.spacings()[i].engine();
 }
      }
    PositionsFunctor(const PositionsFunctor &m)
      : centering_m(m.centering_m)
    {
      for (int i=0; i<dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
    }
    PositionsFunctor& operator=(const PositionsFunctor &m)
    {
      centering_m = m.centering_m;
      for (int i=0; i<dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
      {
        return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
      }
    inline PointType_t operator()(int i0, int i1) const
      {
        return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
      }
    inline PointType_t operator()(int i0, int i1, int i2) const
      {
        return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  typedef IndexFunction<PositionsFunctor> PositionsEngineTag_t;
  template <class PositionsEngineTag>
  void initializePositions(
    Engine<dimensions, PointType_t, PositionsEngineTag> &e,
    const Centering<dimensions> &c) const
    {
      e.setFunctor(typename PositionsEngineTag::Functor_t(static_cast<const Mesh_t&>(*this), c));
    }
  class SpacingsFunctor {
  public:
    SpacingsFunctor() { }
    SpacingsFunctor(const Mesh_t &m,
      const Centering<dimensions> &c)
      : centering_m(c.position(0))
      {
 for (int i=0; i<dimensions; i++)
   spacings_m[i].engine() = m.spacings()[i].engine();
      }
    SpacingsFunctor(const SpacingsFunctor &m)
      : centering_m(m.centering_m)
    {
      for (int i=0; i<dimensions; i++)
 spacings_m[i].engine() = m.spacings_m[i].engine();
    }
    SpacingsFunctor& operator=(const SpacingsFunctor &m)
    {
      centering_m = m.centering_m;
      for (int i=0; i<dimensions; i++)
 spacings_m[i].engine() = m.spacings_m[i].engine();
      return *this;
    }
    inline VectorType_t operator()(int i0) const
      {
        return VectorType_t(spacings_m[0].read(i0)
      + (spacings_m[0].read(i0+1)-spacings_m[0].read(i0))*centering_m(0));
      }
    inline VectorType_t operator()(int i0, int i1) const
      {
        return VectorType_t(spacings_m[0].read(i0)
      + (spacings_m[0].read(i0+1)-spacings_m[0].read(i0))*centering_m(0),
      spacings_m[1].read(i1)
      + (spacings_m[1].read(i1+1)-spacings_m[1].read(i1))*centering_m(1));
      }
    inline VectorType_t operator()(int i0, int i1, int i2) const
      {
        return VectorType_t(spacings_m[0].read(i0)
      + (spacings_m[0].read(i0+1)-spacings_m[0].read(i0))*centering_m(0),
      spacings_m[1].read(i1)
      + (spacings_m[1].read(i1+1)-spacings_m[1].read(i1))*centering_m(1),
      spacings_m[2].read(i2)
      + (spacings_m[2].read(i2+1)-spacings_m[2].read(i2))*centering_m(2));
      }
  private:
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  typedef IndexFunction<SpacingsFunctor> SpacingsEngineTag_t;
  void initializeSpacings(
    Engine<dimensions, PointType_t, SpacingsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      e.setFunctor(SpacingsFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef ConstantFunction NormalsEngineTag_t;
  void initializeNormals(
    Engine<dimensions, VectorType_t, NormalsEngineTag_t> &e,
    const Centering<dimensions> &c,
    bool outward = true) const
    {
      ;
      ;
      VectorType_t normal;
      for (int i = 0; i < dimensions; i++)
        {
          normal(i) = static_cast<T_t>(1 - c.orientation(0)[i].first());
          if (outward && c.position(0)(i) == 0.0)
            normal(i) *= static_cast<T_t>(-1);
        }
      e.setConstant(normal);
    }
  inline T_t DDX0(int i) const
  {
    return (static_cast<const Mesh_t&>(*this).cellPosition( 0, i)
     - static_cast<const Mesh_t&>(*this).vertexPosition( 0, i))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 0, i-1);
  }
  inline T_t DDX0(const Loc_t& l) const { return DDX0(l[0].first()); }
  inline T_t DDX1(int i) const
  {
    return (static_cast<const Mesh_t&>(*this).vertexPosition( 0, i)
     - static_cast<const Mesh_t&>(*this).cellPosition( 0, i-1))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 0, i-1);
  }
  inline T_t DDX1(const Loc_t& l) const { return DDX0(l[0].first()); }
  inline T_t DDY0(int j) const
  {
    return (static_cast<const Mesh_t&>(*this).cellPosition( 1, j)
     - static_cast<const Mesh_t&>(*this).vertexPosition( 1, j))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 1, j-1);
  }
  inline T_t DDY0(const Loc_t& l) const { return DDX0(l[0].first()); }
  inline T_t DDY1(int j) const
  {
    return (static_cast<const Mesh_t&>(*this).vertexPosition( 1, j)
     - static_cast<const Mesh_t&>(*this).cellPosition( 1, j-1))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 1, j-1);
  }
  inline T_t DDY1(const Loc_t& l) const { return DDX0(l[0].first()); }
  inline T_t DDZ0(int k) const
  {
    return (static_cast<const Mesh_t&>(*this).cellPosition( 2, k)
     - static_cast<const Mesh_t&>(*this).vertexPosition( 2, k))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 2, k-1);
  }
  inline T_t DDZ0(const Loc_t& l) const { return DDX0(l[0].first()); }
  inline T_t DDZ1(int k) const
  {
    return (static_cast<const Mesh_t&>(*this).vertexPosition( 1, k)
     - static_cast<const Mesh_t&>(*this).cellPosition( 1, k-1))
      / static_cast<const Mesh_t&>(*this).cellSpacing( 1, k-1);
  }
  inline T_t DDZ1(const Loc_t& l) const { return DDX0(l[0].first()); }
};
template <class MeshTraits>
struct CartesianRM : public GenericRM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  class GeneralVolumesFunctor {
  public:
    GeneralVolumesFunctor() { }
    GeneralVolumesFunctor(const Mesh_t &m,
     const Centering<dimensions> &c)
      : orientation_m(c.orientation(0))
      {
 for (int i=0; i<dimensions; i++)
   spacings_m[i].engine() = m.spacings()[i].engine();
      }
    GeneralVolumesFunctor(const GeneralVolumesFunctor &m)
      : orientation_m(m.orientation_m)
      {
 for (int i=0; i<dimensions; i++)
   spacings_m[i].engine() = m.spacings_m[i].engine();
      }
    GeneralVolumesFunctor& operator=(const GeneralVolumesFunctor &m)
    {
      orientation_m = m.orientation_m;
      for (int i=0; i<dimensions; i++)
 spacings_m[i].engine() = m.spacings_m[i].engine();
      return *this;
    }
    inline T_t operator()(int i0) const
      {
 return spacings_m[0].read(i0);
      }
    inline T_t operator()(int i0, int i1) const
      {
 if (orientation_m[0].first() == 0)
   return spacings_m[1].read(i1);
 else if (orientation_m[1].first() == 0)
   return spacings_m[0].read(i0);
 else
   return spacings_m[0].read(i0) * spacings_m[1].read(i1);
      }
    inline T_t operator()(int i0, int i1, int i2) const
      {
 T_t volume = static_cast<T_t>(1);
 if (orientation_m[0].first() != 0)
   volume *= spacings_m[0].read(i0);
 if (orientation_m[1].first() != 0)
   volume *= spacings_m[1].read(i1);
 if (orientation_m[2].first() != 0)
   volume *= spacings_m[2].read(i2);
 return volume;
      }
  private:
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Orientation orientation_m;
  };
  typedef IndexFunction<GeneralVolumesFunctor> CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  class SphericalPositionsFunctor {
  public:
    SphericalPositionsFunctor() {}
    SphericalPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    SphericalPositionsFunctor& operator=(const SphericalPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t x(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
      return PointType_t(norm(x),
    atan2(x(0), x(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t x(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      T_t r = norm(x);
      return PointType_t(r,
    acos(x(2)/r),
    atan2(x(1), x(0)));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  class CylindricalPositionsFunctor {
  public:
    CylindricalPositionsFunctor() {}
    CylindricalPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    CylindricalPositionsFunctor& operator=(const CylindricalPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
    positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t x(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      return PointType_t(norm(Vector<2, T_t>(x(0), x(1))),
    x(2),
    atan2(x(1), x(0)));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  typedef IndexFunction<typename GenericRM<MeshTraits>::PositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<CylindricalPositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<SphericalPositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 0, i);
  }
  inline T_t VOLXA(const Loc<dimensions>& l) const { return VOLXA(l[0].first()); }
  inline T_t VOLYA(int j) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 1, j);
  }
  inline T_t VOLYA(const Loc<dimensions>& l) const { return VOLYA(l[1].first()); }
  inline T_t VOLZA(int k) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 2, k);
  }
  inline T_t VOLZA(const Loc<dimensions>& l) const { return VOLZA(l[2].first()); }
  inline T_t VOLXB(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 0, i);
  }
  inline T_t VOLXB(const Loc<dimensions>& l) const { return VOLXB(l[0].first()); }
  inline T_t VOLYB(int j) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 1, j);
  }
  inline T_t VOLYB(const Loc<dimensions>& l) const { return VOLYB(l[1].first()); }
  inline T_t VOLZB(int k) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 2, k);
  }
  inline T_t VOLZB(const Loc<dimensions>& l) const { return VOLZB(l[2].first()); }
  inline One<T_t> SURXA(int) const { return One<T_t>(); }
  inline One<T_t> SURXA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURYA(int) const { return One<T_t>(); }
  inline One<T_t> SURYA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURXB(int) const { return One<T_t>(); }
  inline One<T_t> SURXB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURYB(int) const { return One<T_t>(); }
  inline One<T_t> SURYB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCXA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> GEOXG(int) const { return One<T_t>(); }
  inline One<T_t> GEOXG(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXH(int) const { return One<T_t>(); }
  inline One<T_t> GEOXH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOYH(int) const { return One<T_t>(); }
  inline One<T_t> GEOYH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXHA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(const Loc<dimensions>&) const { return One<T_t>(); }
};
template <class MeshTraits>
struct CartesianURM : public GenericURM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  inline void initializeGeneralVolume(
    Engine<dimensions, T_t, ConstantFunction> &e,
    const Centering<dimensions> &c) const
    {
      T_t volume = static_cast<T_t>(1);
      for (int i = 0; i < dimensions; i++)
        {
          if (c.orientation(0)[i].first() != 0)
            volume *= static_cast<const Mesh_t&>(*this).spacings()(i);
        }
      e.setConstant(volume);
    }
  typedef ConstantFunction CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      initializeGeneralVolume(e, c);
    }
  typedef ConstantFunction FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      initializeGeneralVolume(e, c);
    }
  typedef ConstantFunction EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      initializeGeneralVolume(e, c);
    }
  class SphericalPositionsFunctor {
  public:
    SphericalPositionsFunctor() {}
    SphericalPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
 origin_m(i) += spacings_m(i) *
   (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t x(origin_m + PointType_t(i0, i1) * spacings_m);
      return PointType_t(norm(x),
    atan2(x(0), x(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t x(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      T_t r = norm(x);
      return PointType_t(r,
    acos(x(2)/r),
    atan2(x(1), x(0)));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  class CylindricalPositionsFunctor {
  public:
    CylindricalPositionsFunctor() {}
    CylindricalPositionsFunctor(const Mesh_t &m,
           const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
 origin_m(i) += spacings_m(i) *
   (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      return origin_m + PointType_t(i0, i1) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t x(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      return PointType_t(norm(Vector<2, T_t>(x(0), x(1))),
    x(2),
    atan2(x(1), x(0)));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  typedef IndexFunction<typename GenericURM<MeshTraits>::PositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<CylindricalPositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<SphericalPositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(0);
  }
  inline T_t VOLXA(const Loc<dimensions>&) const { return VOLXA(0); }
  inline T_t VOLYA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(1);
  }
  inline T_t VOLYA(const Loc<dimensions>&) const { return VOLYA(0); }
  inline T_t VOLZA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZA(const Loc<dimensions>&) const { return VOLZA(0); }
  inline T_t VOLXB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(0);
  }
  inline T_t VOLXB(const Loc<dimensions>&) const { return VOLXB(0); }
  inline T_t VOLYB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(1);
  }
  inline T_t VOLYB(const Loc<dimensions>&) const { return VOLYB(0); }
  inline T_t VOLZB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZB(const Loc<dimensions>&) const { return VOLZB(0); }
  inline One<T_t> SURXA(int) const { return One<T_t>(); }
  inline One<T_t> SURXA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURYA(int) const { return One<T_t>(); }
  inline One<T_t> SURYA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURXB(int) const { return One<T_t>(); }
  inline One<T_t> SURXB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURYB(int) const { return One<T_t>(); }
  inline One<T_t> SURYB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCXA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCXB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> GEOXG(int) const { return One<T_t>(); }
  inline One<T_t> GEOXG(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXH(int) const { return One<T_t>(); }
  inline One<T_t> GEOXH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOYH(int) const { return One<T_t>(); }
  inline One<T_t> GEOYH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXHA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(const Loc<dimensions>&) const { return One<T_t>(); }
};
template <class MeshTraits>
struct CylindricalRM : public GenericRM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  class GeneralVolumesFunctor {
  public:
    GeneralVolumesFunctor() { }
    GeneralVolumesFunctor(const Mesh_t &m,
     const Centering<dimensions> &c)
      : orientation_m(c.orientation(0))
      {
 for (int i=0; i<dimensions; i++) {
   spacings_m[i].engine() = m.spacings()[i].engine();
   positions_m[i].engine() = m.positions()[i].engine();
 }
      }
    GeneralVolumesFunctor(const GeneralVolumesFunctor &m)
      : orientation_m(m.orientation_m)
      {
 for (int i=0; i<dimensions; i++) {
   spacings_m[i].engine() = m.spacings_m[i].engine();
   positions_m[i].engine() = m.positions_m[i].engine();
 }
      }
    GeneralVolumesFunctor& operator=(const GeneralVolumesFunctor &m)
    {
      orientation_m = m.orientation_m;
      for (int i=0; i<dimensions; i++) {
 spacings_m[i].engine() = m.spacings_m[i].engine();
 positions_m[i].engine() = m.positions_m[i].engine();
      }
      return *this;
    }
    inline T_t r(int i0) const
      {
 return positions_m[0].read(i0);
      }
    inline T_t operator()(int i0) const
      {
 return spacings_m[0].read(i0);
      }
    inline T_t operator()(int i0, int i1) const
      {
 if (orientation_m[0].first() == 0)
   return spacings_m[1].read(i1);
 else if (orientation_m[1].first() == 0)
   return spacings_m[0].read(i0);
 else
   return spacings_m[0].read(i0) * spacings_m[1].read(i1);
      }
    inline T_t operator()(int i0, int i1, int i2) const
      {
 if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0
     && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m[1].read(i1) * spacings_m[2].read(i2);
 } else if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0)
   return spacings_m[0].read(i0)*spacings_m[1].read(i1);
 else if (orientation_m[0].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m[2].read(i2);
 } else if (orientation_m[1].first() != 0
     && orientation_m[2].first() != 0)
   return r(i0)*spacings_m[1].read(i1)*spacings_m[2].read(i2);
 else if (orientation_m[0].first() != 0)
   return spacings_m[0].read(i0);
 else if (orientation_m[1].first() != 0)
   return spacings_m[1].read(i1);
 else if (orientation_m[2].first() != 0)
   return r(i0)*spacings_m[2].read(i2);
      }
  private:
    SpacingsType_t spacings_m;
    PositionsType_t positions_m;
    typename Centering<dimensions>::Orientation orientation_m;
  };
  typedef IndexFunction<GeneralVolumesFunctor> CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  class CartesianPositionsFunctor {
  public:
    CartesianPositionsFunctor() {}
    CartesianPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    CartesianPositionsFunctor& operator=(const CartesianPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
    positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      return PointType_t(r(0)*cos(r(2)),
                         r(0)*sin(r(2)),
                         r(1));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  class SphericalPositionsFunctor {
  public:
    SphericalPositionsFunctor() {}
    SphericalPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    SphericalPositionsFunctor& operator=(const SphericalPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
      T_t R = hypot(r(0), r(1));
      return PointType_t(R,
    acos(r(1)/R));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      T_t R = hypot(r(0), r(1));
      return PointType_t(R,
    acos(r(1)/R),
                         r(2));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  typedef IndexFunction<CartesianPositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<typename GenericRM<MeshTraits>::PositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<SphericalPositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int i) const
  {
    return 0.5*(std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 2)
  - std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i-1), 2));
  }
  inline T_t VOLXA(const Loc<dimensions>& l) const { return VOLXA(l[0].first()); }
  inline T_t VOLYA(int j) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 1, j);
  }
  inline T_t VOLYA(const Loc<dimensions>& l) const { return VOLYA(l[1].first()); }
  inline T_t VOLZA(int k) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 2, k);
  }
  inline T_t VOLZA(const Loc<dimensions>& l) const { return VOLZA(l[2].first()); }
  inline T_t VOLXB(int i) const
  {
    return 0.5*(std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i+1), 2)
  - std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i), 2));
  }
  inline T_t VOLXB(const Loc<dimensions>& l) const { return VOLXB(l[0].first()); }
  inline T_t VOLYB(int j) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 1, j);
  }
  inline T_t VOLYB(const Loc<dimensions>& l) const { return VOLYB(l[1].first()); }
  inline T_t VOLZB(int k) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 2, k);
  }
  inline T_t VOLZB(const Loc<dimensions>& l) const { return VOLZB(l[2].first()); }
  inline T_t SURXA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t SURXA(const Loc<dimensions>& l) const { return SURXA(l[0].first()); }
  inline One<T_t> SURYA(int) const { return One<T_t>(); }
  inline One<T_t> SURYA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t SURXB(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t SURXB(const Loc<dimensions>& l) const { return SURXB(l[0].first()); }
  inline One<T_t> SURYB(int) const { return One<T_t>(); }
  inline One<T_t> SURYB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> CCXA(int) const { return One<T_t>(); }
  inline One<T_t> CCXA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCYA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> CCXB(int) const { return One<T_t>(); }
  inline One<T_t> CCXB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCYB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> GEOXG(int) const { return One<T_t>(); }
  inline One<T_t> GEOXG(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t GEOXH(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXH(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline One<T_t> GEOYH(int) const { return One<T_t>(); }
  inline One<T_t> GEOYH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t GEOXHA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXHA(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline One<T_t> GEOYHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(const Loc<dimensions>&) const { return One<T_t>(); }
};
template <class MeshTraits>
struct CylindricalURM : public GenericURM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  enum { dimensions = MeshTraits::dimensions };
  enum { coordinateDimensions = MeshTraits::coordinateDimensions };
  class GeneralVolumesFunctor {
  public:
    GeneralVolumesFunctor() { }
    GeneralVolumesFunctor(const Mesh_t &m,
     const Centering<dimensions> &c)
      : spacings_m(m.spacings()),
        orientation_m(c.orientation(0)),
        origin_m(m.origin())
      {
      }
    inline T_t r(int i0) const
      {
 return origin_m(0)+i0*spacings_m(0);
      }
    inline T_t operator()(int i0) const
      {
 return spacings_m(0);
      }
    inline T_t operator()(int i0, int i1) const
      {
 if (orientation_m[0].first() == 0)
   return spacings_m(1);
 else if (orientation_m[1].first() == 0)
   return spacings_m(0);
 else
   return spacings_m(0) * spacings_m(1);
      }
    inline T_t operator()(int i0, int i1, int i2) const
      {
 if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0
     && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m(1) * spacings_m(2);
 } else if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0)
   return spacings_m(0) * spacings_m(1);
 else if (orientation_m[0].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m(2);
 } else if (orientation_m[1].first() != 0
     && orientation_m[2].first() != 0)
   return r(i0)*spacings_m(1) * spacings_m(2);
 else if (orientation_m[0].first() != 0)
   return spacings_m(0);
 else if (orientation_m[1].first() != 0)
   return spacings_m(1);
 else if (orientation_m[2].first() != 0)
   return r(i0)*spacings_m(2);
      }
  private:
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Orientation orientation_m;
    PointType_t origin_m;
  };
  typedef IndexFunction<GeneralVolumesFunctor> CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  class CartesianPositionsFunctor {
  public:
    CartesianPositionsFunctor() {}
    CartesianPositionsFunctor(const Mesh_t &m,
                              const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
        origin_m(i) += spacings_m(i) *
          (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      return origin_m + PointType_t(i0, i1) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      return PointType_t(r(0)*cos(r(2)),
                         r(0)*sin(r(2)),
                         r(1));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  class SphericalPositionsFunctor {
  public:
    SphericalPositionsFunctor() {}
    SphericalPositionsFunctor(const Mesh_t &m,
                              const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
        origin_m(i) += spacings_m(i) *
          (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1) * spacings_m);
      T_t R = hypot(r(0), r(1));
      return PointType_t(R,
    acos(r(1)/R));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      T_t R = hypot(r(0), r(1));
      return PointType_t(R,
    acos(r(1)/R),
                         r(2));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  typedef IndexFunction<CartesianPositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<typename GenericURM<MeshTraits>::PositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<SphericalPositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int i) const
  {
    return 0.5*(std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 2)
  - std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i-1), 2));
  }
  inline T_t VOLXA(const Loc<dimensions>& l) const { return VOLXA(l[0].first()); }
  inline T_t VOLYA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(1);
  }
  inline T_t VOLYA(const Loc<dimensions>&) const { return VOLYA(0); }
  inline T_t VOLZA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZA(const Loc<dimensions>&) const { return VOLZA(0); }
  inline T_t VOLXB(int i) const
  {
    return 0.5*(std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i+1), 2)
  - std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i), 2));
  }
  inline T_t VOLXB(const Loc<dimensions>& l) const { return VOLXB(l[0].first()); }
  inline T_t VOLYB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(1);
  }
  inline T_t VOLYB(const Loc<dimensions>&) const { return VOLYB(0); }
  inline T_t VOLZB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZB(const Loc<dimensions>&) const { return VOLZB(0); }
  inline T_t SURXA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t SURXA(const Loc<dimensions>& l) const { return SURXA(l[0].first()); }
  inline One<T_t> SURYA(int) const { return One<T_t>(); }
  inline One<T_t> SURYA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t SURXB(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t SURXB(const Loc<dimensions>& l) const { return SURXB(l[0].first()); }
  inline One<T_t> SURYB(int) const { return One<T_t>(); }
  inline One<T_t> SURYB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> CCXA(int) const { return One<T_t>(); }
  inline One<T_t> CCXA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCYA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> CCXB(int) const { return One<T_t>(); }
  inline One<T_t> CCXB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline Zero<T_t> CCYB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCYB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline One<T_t> GEOXG(int) const { return One<T_t>(); }
  inline One<T_t> GEOXG(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t GEOXH(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXH(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline One<T_t> GEOYH(int) const { return One<T_t>(); }
  inline One<T_t> GEOYH(const Loc<dimensions>&) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(int) const { return One<T_t>(); }
  inline One<T_t> GEOXGA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t GEOXHA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXHA(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline One<T_t> GEOYHA(int) const { return One<T_t>(); }
  inline One<T_t> GEOYHA(const Loc<dimensions>&) const { return One<T_t>(); }
};
template <class MeshTraits>
struct SphericalRM : public GenericRM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  typedef typename MeshTraits::PositionsType_t PositionsType_t;
  enum { dimensions = MeshTraits::dimensions };
  class GeneralVolumesFunctor {
  public:
    GeneralVolumesFunctor() { }
    GeneralVolumesFunctor(const Mesh_t &m,
     const Centering<dimensions> &c)
      : orientation_m(c.orientation(0))
      {
 for (int i=0; i<dimensions; i++) {
   spacings_m[i].engine() = m.spacings()[i].engine();
   positions_m[i].engine() = m.positions()[i].engine();
 }
      }
    GeneralVolumesFunctor(const GeneralVolumesFunctor &m)
      : orientation_m(m.orientation_m)
      {
 for (int i=0; i<dimensions; i++) {
   spacings_m[i].engine() = m.spacings_m[i].engine();
   positions_m[i].engine() = m.positions_m[i].engine();
 }
      }
    GeneralVolumesFunctor& operator=(const GeneralVolumesFunctor &m)
    {
      orientation_m = m.orientation_m;
      for (int i=0; i<dimensions; i++) {
 spacings_m[i].engine() = m.spacings_m[i].engine();
 positions_m[i].engine() = m.positions_m[i].engine();
      }
      return *this;
    }
    inline T_t r(int i0) const
      {
 return positions_m[0].read(i0);
      }
    inline T_t theta(int i1) const
      {
 return positions_m[1].read(i1);
      }
    inline T_t phi(int i2) const
      {
 return positions_m[2].read(i2);
      }
    inline T_t operator()(int i0) const
      {
 return spacings_m[0].read(i0);
      }
    inline T_t operator()(int i0, int i1) const
      {
 if (orientation_m[0].first() == 0)
   return r(i0)*spacings_m[1].read(i1);
 else if (orientation_m[1].first() == 0)
   return spacings_m[0].read(i0);
 else {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m[1].read(i1);
 }
      }
    inline T_t operator()(int i0, int i1, int i2) const
      {
 if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0
     && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return (r2*r2*r2 - r1*r1*r1)/3.0
     * (cos(theta(i1)) - cos(theta(i1+1)))
     * spacings_m[2].read(i2);
 } else if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m[1].read(i1);
 } else if (orientation_m[0].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1)*sin(theta(i1)) * spacings_m[2].read(i2);
 } else if (orientation_m[1].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   return - r1*r1 * spacings_m[2].read(i2) * (cos(theta(i1+1)) - cos(theta(i1)));
 } else if (orientation_m[0].first() != 0)
   return spacings_m[0].read(i0);
 else if (orientation_m[1].first() != 0)
   return r(i0)*spacings_m[1].read(i1);
 else if (orientation_m[2].first() != 0)
   return r(i0)*sin(theta(i1)) * spacings_m[2].read(i2);
      }
  private:
    SpacingsType_t spacings_m;
    SpacingsType_t positions_m;
    typename Centering<dimensions>::Orientation orientation_m;
  };
  typedef IndexFunction<GeneralVolumesFunctor> CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  class CartesianPositionsFunctor {
  public:
    CartesianPositionsFunctor() {}
    CartesianPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    CartesianPositionsFunctor& operator=(const CartesianPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      return PointType_t(r(0)*sin(r(1))*cos(r(2)),
    r(0)*sin(r(1))*sin(r(2)),
    r(0)*cos(r(1)));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  class CylindricalPositionsFunctor {
  public:
    CylindricalPositionsFunctor() {}
    CylindricalPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : centering_m(c.position(0))
    {
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions()[i].engine();
 spacings_m[i].engine() = m.spacings()[i].engine();
      }
    }
    CylindricalPositionsFunctor& operator=(const CylindricalPositionsFunctor& m)
    {
      centering_m = m.centering_m;
      for (int i = 0; i < dimensions; i++) {
 positions_m[i].engine() = m.positions_m[i].engine();
 spacings_m[i].engine() = m.spacings_m[i].engine();
      }
      return *this;
    }
    inline PointType_t operator()(int i0) const
    {
      return PointType_t(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0));
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1));
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(positions_m[0].read(i0) + spacings_m[0].read(i0)*centering_m(0),
      positions_m[1].read(i1) + spacings_m[1].read(i1)*centering_m(1),
      positions_m[2].read(i2) + spacings_m[2].read(i2)*centering_m(2));
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)),
    r(2));
    }
  private:
    PositionsType_t positions_m;
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Position centering_m;
  };
  typedef IndexFunction<CartesianPositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<CylindricalPositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<typename GenericRM<MeshTraits>::PositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int i) const
  {
    return (1.0/3.0)*(std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 3)
        - std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i-1), 3));
  }
  inline T_t VOLXA(const Loc<dimensions>& l) const { return VOLXA(l[0].first()); }
  inline T_t VOLYA(int j) const
  {
    return std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j-1))
      - std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t VOLYA(const Loc<dimensions>& l) const { return VOLYA(l[1].first()); }
  inline T_t VOLZA(int k) const
  {
    return static_cast<const Mesh_t&>(*this).cellSpacing( 2, k-1);
  }
  inline T_t VOLZA(const Loc<dimensions>& l) const { return VOLZA(l[2].first()); }
  inline T_t VOLXB(int i) const
  {
    return (1.0/3.0)*(std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i+1), 3)
        - std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 3));
  }
  inline T_t VOLXB(const Loc<dimensions>& l) const { return VOLXB(l[0].first()); }
  inline T_t VOLYB(int j) const
  {
    return std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j))
      - std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j+1));
   }
  inline T_t VOLYB(const Loc<dimensions>& l) const { return VOLYB(l[1].first()); }
  inline T_t VOLZB(int k) const
  {
    return static_cast<const Mesh_t&>(*this).vertexSpacing( 2, k);
  }
  inline T_t VOLZB(const Loc<dimensions>& l) const { return VOLZB(l[2].first()); }
  inline T_t SURXA(int i) const
  {
    return std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i), 2);
  }
  inline T_t SURXA(const Loc<dimensions>& l) const { return SURXA(l[0].first()); }
  inline T_t SURYA(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t SURYA(const Loc<dimensions>& l) const { return SURYA(l[1].first()); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t SURXB(int i) const
  {
    return std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 2);
  }
  inline T_t SURXB(const Loc<dimensions>& l) const { return SURXB(l[0].first()); }
  inline T_t SURYB(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t SURYB(const Loc<dimensions>& l) const { return SURYB(l[1].first()); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t CCXA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t CCXA(const Loc<dimensions>& l) const { return CCXA(l[0].first()); }
  inline T_t CCYA(int j) const
  {
    return 0.5*std::cos(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t CCYA(const Loc<dimensions>& l) const { return CCYA(l[1].first()); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline T_t CCXB(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t CCXB(const Loc<dimensions>& l) const { return CCXB(l[0].first()); }
  inline T_t CCYB(int j) const
  {
    return 0.5*std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t CCYB(const Loc<dimensions>& l) const { return CCYB(l[1].first()); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline T_t GEOXG(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXG(const Loc<dimensions>& l) const { return GEOXG(l[0].first()); }
  inline T_t GEOXH(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXH(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline T_t GEOYH(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t GEOYH(const Loc<dimensions>& l) const { return GEOYH(l[1].first()); }
  inline T_t GEOXGA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXGA(const Loc<dimensions>& l) const { return GEOXG(l[0].first()); }
  inline T_t GEOXHA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXHA(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline T_t GEOYHA(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t GEOYHA(const Loc<dimensions>& l) const { return GEOYH(l[1].first()); }
};
template <class MeshTraits>
struct SphericalURM : public GenericURM<MeshTraits> {
  typedef typename MeshTraits::T_t T_t;
  typedef typename MeshTraits::Mesh_t Mesh_t;
  typedef typename MeshTraits::PointType_t PointType_t;
  typedef typename MeshTraits::VectorType_t VectorType_t;
  typedef typename MeshTraits::SpacingsType_t SpacingsType_t;
  enum { dimensions = MeshTraits::dimensions };
  class GeneralVolumesFunctor {
  public:
    GeneralVolumesFunctor() { }
    GeneralVolumesFunctor(const Mesh_t &m,
     const Centering<dimensions> &c)
      : spacings_m(m.spacings()),
        orientation_m(c.orientation(0)),
        origin_m(m.origin())
      {
      }
    inline T_t r(int i0) const
      {
 return origin_m(0)+i0*spacings_m(0);
      }
    inline T_t theta(int i1) const
      {
 return origin_m(1)+i1*spacings_m(1);
      }
    inline T_t operator()(int i0) const
      {
 return spacings_m(0);
      }
    inline T_t operator()(int i0, int i1) const
      {
 if (orientation_m[0].first() == 0)
   return r(i0)*spacings_m(1);
 else if (orientation_m[1].first() == 0)
   return spacings_m(0);
 else {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1) * spacings_m(1);
 }
      }
    inline T_t operator()(int i0, int i1, int i2) const
      {
 if (orientation_m[0].first() != 0
     && orientation_m[1].first() != 0
     && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r1 + spacings_m(0);
   return (r2*r2*r2 - r1*r1*r1)/3.0
     * (cos(theta(i1)) - cos(theta(i1+1)))
     * spacings_m(2);
 } else if (orientation_m[0].first() != 0
   && orientation_m[1].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r1 + spacings_m(0);
   return 0.5*(r2*r2 - r1*r1) * spacings_m(1);
 } else if (orientation_m[0].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   T_t r2 = r(i0+1);
   return 0.5*(r2*r2 - r1*r1)*sin(theta(i1)) * spacings_m(2);
 } else if (orientation_m[1].first() != 0
   && orientation_m[2].first() != 0) {
   T_t r1 = r(i0);
   return - r1*r1 * spacings_m(2) * (cos(theta(i1+1)) - cos(theta(i1)));
 } else if (orientation_m[0].first() != 0)
   return spacings_m(0);
 else if (orientation_m[1].first() != 0)
   return r(i0)*spacings_m(1);
 else if (orientation_m[2].first() != 0)
   return r(i0)*sin(theta(i1)) * spacings_m(2);
      }
  private:
    SpacingsType_t spacings_m;
    typename Centering<dimensions>::Orientation orientation_m;
    PointType_t origin_m;
  };
  typedef IndexFunction<GeneralVolumesFunctor> CellVolumesEngineTag_t;
  void initializeCellVolumes(
    Engine<dimensions, T_t, CellVolumesEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> FaceAreasEngineTag_t;
  void initializeFaceAreas(
    Engine<dimensions, T_t, FaceAreasEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  typedef IndexFunction<GeneralVolumesFunctor> EdgeLengthsEngineTag_t;
  void initializeEdgeLengths(
    Engine<dimensions, T_t, EdgeLengthsEngineTag_t> &e,
    const Centering<dimensions> &c) const
    {
      ;
      ;
      e.setFunctor(GeneralVolumesFunctor(static_cast<const Mesh_t&>(*this), c));
    }
  class CartesianPositionsFunctor {
  public:
    CartesianPositionsFunctor() {}
    CartesianPositionsFunctor(const Mesh_t &m,
         const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
 origin_m(i) += spacings_m(i) *
   (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1) * spacings_m);
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      return PointType_t(r(0)*sin(r(1))*cos(r(2)),
    r(0)*sin(r(1))*sin(r(2)),
    r(0)*cos(r(1)));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  class CylindricalPositionsFunctor {
  public:
    CylindricalPositionsFunctor() {}
    CylindricalPositionsFunctor(const Mesh_t &m,
           const Centering<dimensions> &c)
      : origin_m(m.origin()), spacings_m(m.spacings())
    {
      for (int i = 0; i < dimensions; i++)
 origin_m(i) += spacings_m(i) *
   (c.position(0)(i) - m.physicalCellDomain()[i].first());
    }
    inline PointType_t operator()(int i0) const
    {
      return origin_m + PointType_t(i0) * spacings_m;
    }
    inline PointType_t operator()(int i0, int i1) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1) * spacings_m);
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)));
    }
    inline PointType_t operator()(int i0, int i1, int i2) const
    {
      PointType_t r(origin_m + PointType_t(i0, i1, i2) * spacings_m);
      return PointType_t(r(0)*sin(r(1)),
    r(0)*cos(r(1)),
    r(2));
    }
  private:
    PointType_t origin_m;
    SpacingsType_t spacings_m;
  };
  typedef IndexFunction<CartesianPositionsFunctor> CartesianPositionsEngineTag_t;
  typedef IndexFunction<CylindricalPositionsFunctor> CylindricalPositionsEngineTag_t;
  typedef IndexFunction<typename GenericURM<MeshTraits>::PositionsFunctor> SphericalPositionsEngineTag_t;
  inline T_t VOLXA(int i) const
  {
    return (std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 3)
     - std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i-1), 3))
      / 3.0;
  }
  inline T_t VOLXA(const Loc<dimensions>& l) const { return VOLXA(l[0].first()); }
  inline T_t VOLYA(int j) const
  {
    return std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j-1))
      - std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t VOLYA(const Loc<dimensions>& l) const { return VOLYA(l[1].first()); }
  inline T_t VOLZA(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZA(const Loc<dimensions>&) const { return VOLZA(0); }
  inline T_t VOLXB(int i) const
  {
    return (std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i+1), 3)
     - std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i), 3))
      / 3.0;
  }
  inline T_t VOLXB(const Loc<dimensions>& l) const { return VOLXB(l[0].first()); }
  inline T_t VOLYB(int j) const
  {
    return std::cos(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j))
      - std::cos(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j+1));
  }
  inline T_t VOLYB(const Loc<dimensions>& l) const { return VOLYB(l[1].first()); }
  inline T_t VOLZB(int) const
  {
    return static_cast<const Mesh_t&>(*this).spacings()(2);
  }
  inline T_t VOLZB(const Loc<dimensions>&) const { return VOLZB(0); }
  inline T_t SURXA(int i) const
  {
    return std::pow(static_cast<const Mesh_t&>(*this).vertexPosition( 0, i), 2);
  }
  inline T_t SURXA(const Loc<dimensions>& l) const { return SURXA(l[0].first()); }
  inline T_t SURYA(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t SURYA(const Loc<dimensions>& l) const { return SURYA(l[1].first()); }
  inline One<T_t> SURZA(int) const { return One<T_t>(); }
  inline One<T_t> SURZA(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t SURXB(int i) const
  {
    return std::pow(static_cast<const Mesh_t&>(*this).cellPosition( 0, i), 2);
  }
  inline T_t SURXB(const Loc<dimensions>& l) const { return SURXB(l[0].first()); }
  inline T_t SURYB(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t SURYB(const Loc<dimensions>& l) const { return SURYB(l[1].first()); }
  inline One<T_t> SURZB(int) const { return One<T_t>(); }
  inline One<T_t> SURZB(const Loc<dimensions>&) const { return One<T_t>(); }
  inline T_t CCXA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t CCXA(const Loc<dimensions>& l) const { return CCXA(l[0].first()); }
  inline T_t CCYA(int j) const
  {
    return 0.5*std::cos(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t CCYA(const Loc<dimensions>& l) const { return CCYA(l[1].first()); }
  inline Zero<T_t> CCZA(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZA(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline T_t CCXB(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t CCXB(const Loc<dimensions>& l) const { return CCXB(l[0].first()); }
  inline T_t CCYB(int j) const
  {
    return 0.5*std::cos(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t CCYB(const Loc<dimensions>& l) const { return CCYB(l[1].first()); }
  inline Zero<T_t> CCZB(int) const { return Zero<T_t>(); }
  inline Zero<T_t> CCZB(const Loc<dimensions>&) const { return Zero<T_t>(); }
  inline T_t GEOXG(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXG(const Loc<dimensions>& l) const { return GEOXG(l[0].first()); }
  inline T_t GEOXH(int i) const
  {
    return static_cast<const Mesh_t&>(*this).cellPosition( 0, i);
  }
  inline T_t GEOXH(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline T_t GEOYH(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).cellPosition( 1, j));
  }
  inline T_t GEOYH(const Loc<dimensions>& l) const { return GEOYH(l[1].first()); }
  inline T_t GEOXGA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXGA(const Loc<dimensions>& l) const { return GEOXG(l[0].first()); }
  inline T_t GEOXHA(int i) const
  {
    return static_cast<const Mesh_t&>(*this).vertexPosition( 0, i);
  }
  inline T_t GEOXHA(const Loc<dimensions>& l) const { return GEOXH(l[0].first()); }
  inline T_t GEOYHA(int j) const
  {
    return std::sin(static_cast<const Mesh_t&>(*this).vertexPosition( 1, j));
  }
  inline T_t GEOYHA(const Loc<dimensions>& l) const { return GEOYH(l[1].first()); }
};
template<class Mesh, class T, class EngineTag> class Field;
namespace Pooma {
template<class Mesh>
struct PositionsTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::PointType_t,
    typename Mesh::PositionsEngineTag_t> Type_t;
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::PointType_t,
    typename Mesh::CartesianPositionsEngineTag_t> CartesianType_t;
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::PointType_t,
    typename Mesh::CylindricalPositionsEngineTag_t> CylindricalType_t;
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::PointType_t,
    typename Mesh::SphericalPositionsEngineTag_t> SphericalType_t;
};
template<class Mesh, class T, class EngineTag>
typename PositionsTraits<Mesh>::Type_t
positions(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  typename PositionsTraits<Mesh>::Type_t
    of(f.numMaterials(), f.centering(), f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializePositions(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh, int Dim>
typename PositionsTraits<Mesh>::Type_t
positions(const Mesh &mesh, Centering<Dim> c)
{
  GuardLayers<Mesh::dimensions> g;
  for (int i = 0; i < Mesh::dimensions; ++i) {
    g.lower(i) = mesh.physicalVertexDomain()[i].min() - mesh.totalVertexDomain()[i].min();
    g.upper(i) = mesh.totalVertexDomain()[i].max() - mesh.physicalVertexDomain()[i].max();
  }
  DomainLayout<Mesh::dimensions> layout(mesh.physicalVertexDomain(), g);
  NoMesh<Mesh::dimensions> m(layout);
  typename PositionsTraits<Mesh>::Type_t
    of(1, c, layout, m);
  for (int j = 0; j < of.centeringSize(); j++)
    mesh.initializePositions(of.subField(0, j).engine(), of.centering(j));
  return of;
}
template<class Mesh, class T, class EngineTag>
typename PositionsTraits<Mesh>::CartesianType_t
cartesianPositions(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  typename PositionsTraits<Mesh>::CartesianType_t
    of(f.numMaterials(), f.centering(), f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializePositions(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh, class T, class EngineTag>
typename PositionsTraits<Mesh>::CylindricalType_t
cylindricalPositions(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  typename PositionsTraits<Mesh>::CylindricalType_t
    of(f.numMaterials(), f.centering(), f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializePositions(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh, class T, class EngineTag>
typename PositionsTraits<Mesh>::SphericalType_t
sphericalPositions(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  typename PositionsTraits<Mesh>::SphericalType_t
    of(f.numMaterials(), f.centering(), f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializePositions(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh>
struct SpacingsTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::VectorType_t,
    typename Mesh::SpacingsEngineTag_t> Type_t;
};
template<class Mesh, class T, class EngineTag>
typename SpacingsTraits<Mesh>::Type_t
spacings(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  typename SpacingsTraits<Mesh>::Type_t
    of(f.numMaterials(), f.centering(), f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializeSpacings(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh, int Dim>
typename SpacingsTraits<Mesh>::Type_t
spacings(const Mesh &mesh, Centering<Dim> c)
{
  GuardLayers<Mesh::dimensions> g;
  for (int i = 0; i < Mesh::dimensions; ++i) {
    g.lower(i) = mesh.physicalVertexDomain()[i].min() - mesh.totalVertexDomain()[i].min();
    g.upper(i) = mesh.totalVertexDomain()[i].max() - mesh.physicalVertexDomain()[i].max();
  }
  DomainLayout<Mesh::dimensions> layout(mesh.physicalVertexDomain(), g);
  NoMesh<Mesh::dimensions> m(layout);
  typename SpacingsTraits<Mesh>::Type_t
    of(1, c, layout, m);
  for (int j = 0; j < of.centeringSize(); j++)
    mesh.initializeSpacings(of.subField(0, j).engine(), of.centering(j));
  return of;
}
template<class Mesh>
struct NormalsTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::VectorType_t,
    typename Mesh::NormalsEngineTag_t> Type_t;
};
template<class Mesh, class T, class EngineTag>
typename NormalsTraits<Mesh>::Type_t
outwardNormals(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  Centering<Mesh::dimensions> c =
    canonicalCentering<Mesh::dimensions>(FaceType, Discontinuous);
  typename NormalsTraits<Mesh>::Type_t
    of(f.numMaterials(), c, f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializeNormals(of.subField(i, j).engine(), of.centering(j), true);
  return of;
}
template<class Mesh, class T, class EngineTag>
typename NormalsTraits<Mesh>::Type_t
coordinateNormals(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  Centering<Mesh::dimensions> c =
    canonicalCentering<Mesh::dimensions>(FaceType, Continuous);
  typename NormalsTraits<Mesh>::Type_t
    of(f.numMaterials(), c, f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializeNormals(of.subField(i, j).engine(), of.centering(j), false);
  return of;
}
template<class Mesh>
struct CellVolumesTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::Scalar_t,
    typename Mesh::CellVolumesEngineTag_t> Type_t;
};
template<class Mesh, class T, class EngineTag>
typename CellVolumesTraits<Mesh>::Type_t
cellVolumes(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  Centering<Mesh::dimensions> c =
    canonicalCentering<Mesh::dimensions>(CellType, Continuous);
  typename CellVolumesTraits<Mesh>::Type_t
    of(f.numMaterials(), c, f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    f.mesh().initializeCellVolumes(of.subField(i, 0).engine(), of.centering(0));
  return of;
}
template<class Mesh>
struct FaceAreasTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::Scalar_t,
    typename Mesh::FaceAreasEngineTag_t> Type_t;
};
template<class Mesh, class T, class EngineTag>
typename FaceAreasTraits<Mesh>::Type_t
faceAreas(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  Centering<Mesh::dimensions> c =
    canonicalCentering<Mesh::dimensions>(FaceType, Continuous);
  typename FaceAreasTraits<Mesh>::Type_t
    of(f.numMaterials(), c, f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializeFaceAreas(of.subField(i, j).engine(), of.centering(j));
  return of;
}
template<class Mesh>
struct EdgeLengthsTraits {
  typedef Field<NoMesh<Mesh::dimensions>,
    typename Mesh::Scalar_t,
    typename Mesh::EdgeLengthsEngineTag_t> Type_t;
};
template<class Mesh, class T, class EngineTag>
typename EdgeLengthsTraits<Mesh>::Type_t
edgeLengths(const Field<Mesh, T, EngineTag> &f)
{
  NoMesh<Mesh::dimensions> m(f.layout());
  Centering<Mesh::dimensions> c =
    canonicalCentering<Mesh::dimensions>(EdgeType, Continuous);
  typename EdgeLengthsTraits<Mesh>::Type_t
    of(f.numMaterials(), c, f.layout(), m);
  for (int i = 0; i < of.numMaterials(); i++)
    for (int j = 0; j < of.centeringSize(); j++)
      f.mesh().initializeEdgeLengths(of.subField(i, j).engine(), of.centering(j));
  return of;
}
}
using Pooma::PositionsTraits;
using Pooma::positions;
using Pooma::NormalsTraits;
using Pooma::outwardNormals;
using Pooma::coordinateNormals;
using Pooma::CellVolumesTraits;
using Pooma::cellVolumes;
using Pooma::FaceAreasTraits;
using Pooma::faceAreas;
using Pooma::EdgeLengthsTraits;
using Pooma::edgeLengths;
class InfluenceRelation : public RelationListItem
{
public:
  template<class Target>
  InfluenceRelation(const Target &t)
  : RelationListItem(),
    list_m(const_cast<RelationList*>(&t.fieldEngine().relations()))
    {
      setPriority(100u);
    }
  InfluenceRelation(const InfluenceRelation &model)
  : RelationListItem(model), list_m(model.list_m)
    { }
  InfluenceRelation() { }
  void setDirty()
    {
      if (!dirty())
        {
          RelationListItem::setDirty();
          list_m->setDirty();
        }
    }
  void apply() { }
private:
  RelationList *list_m;
};
template<class Target, class RelationFunctor>
class Relation0: public RelationBase<Target, RelationFunctor>
{
public:
  Relation0(const Target &t, const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f)
  { }
  ~Relation0()
  { }
  void apply()
  {
    this->functor_m(this->target_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    return new Relation0<Target, RelationFunctor>(target, this->functor_m);
  }
};
template<class Target, class R1, class RelationFunctor>
class Relation1: public RelationBase<Target, RelationFunctor>
{
public:
  Relation1(const Target &t, const R1 &r,
    const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f), r1_m(r)
  { }
  ~Relation1()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    return new Relation1<Target, R1, RelationFunctor>
                 (target, r1_m, this->functor_m);
  }
protected:
  R1 r1_m;
};
template<class Target, class R1, class R2, class RelationFunctor>
class Relation2: public RelationBase<Target, RelationFunctor>
{
public:
  Relation2(const Target &t, const R1 &r1, const R2 &r2,
    const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f), r1_m(r1), r2_m(r2)
  { }
  ~Relation2()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m, r2_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    r2_m.addRelation(new InfluenceRelation(target));
    return new Relation2<Target, R1, R2, RelationFunctor>
                 (target, r1_m, r2_m, this->functor_m);
  }
protected:
  R1 r1_m;
  R2 r2_m;
};
template<class Target, class R1, class R2, class R3, class RelationFunctor>
class Relation3: public RelationBase<Target, RelationFunctor>
{
public:
  Relation3(const Target &t, const R1 &r1, const R2 &r2, const R3 &r3,
            const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f),
    r1_m(r1),
    r2_m(r2),
    r3_m(r3)
  { }
  ~Relation3()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m, r2_m, r3_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    r2_m.addRelation(new InfluenceRelation(target));
    r3_m.addRelation(new InfluenceRelation(target));
    return new Relation3<Target, R1, R2, R3, RelationFunctor>
      (target, r1_m, r2_m, r3_m, this->functor_m);
  }
protected:
  R1 r1_m;
  R2 r2_m;
  R3 r3_m;
};
template<class Target, class R1, class R2, class R3, class R4,
         class RelationFunctor>
class Relation4: public RelationBase<Target, RelationFunctor>
{
public:
  Relation4(const Target &t, const R1 &r1, const R2 &r2, const R3 &r3,
            const R4 &r4, const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f),
    r1_m(r1),
    r2_m(r2),
    r3_m(r3),
    r4_m(r4)
  { }
  ~Relation4()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m, r2_m, r3_m, r4_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    r2_m.addRelation(new InfluenceRelation(target));
    r3_m.addRelation(new InfluenceRelation(target));
    r4_m.addRelation(new InfluenceRelation(target));
    return new Relation4<Target, R1, R2, R3, R4, RelationFunctor>
      (target, r1_m, r2_m, r3_m, r4_m, this->functor_m);
  }
protected:
  R1 r1_m;
  R2 r2_m;
  R3 r3_m;
  R4 r4_m;
};
template<class Target, class R1, class R2, class R3, class R4, class R5,
         class RelationFunctor>
class Relation5: public RelationBase<Target, RelationFunctor>
{
public:
  Relation5(const Target &t, const R1 &r1, const R2 &r2, const R3 &r3,
            const R4 &r4, const R5 &r5, const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f),
    r1_m(r1),
    r2_m(r2),
    r3_m(r3),
    r4_m(r4),
    r5_m(r5)
  { }
  ~Relation5()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m, r2_m, r3_m, r4_m, r5_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    r2_m.addRelation(new InfluenceRelation(target));
    r3_m.addRelation(new InfluenceRelation(target));
    r4_m.addRelation(new InfluenceRelation(target));
    r5_m.addRelation(new InfluenceRelation(target));
    return new Relation5<Target, R1, R2, R3, R4, R5, RelationFunctor>
      (target, r1_m, r2_m, r3_m, r4_m, r5_m, this->functor_m);
  }
protected:
  R1 r1_m;
  R2 r2_m;
  R3 r3_m;
  R4 r4_m;
  R5 r5_m;
};
template<class Target, class R1, class R2, class R3, class R4, class R5,
         class R6, class RelationFunctor>
class Relation6: public RelationBase<Target, RelationFunctor>
{
public:
  Relation6(const Target &t, const R1 &r1, const R2 &r2, const R3 &r3,
            const R4 &r4, const R5 &r5, const R6 &r6, const RelationFunctor &f)
  : RelationBase<Target, RelationFunctor>(t, f),
    r1_m(r1),
    r2_m(r2),
    r3_m(r3),
    r4_m(r4),
    r5_m(r5),
    r6_m(r6)
  { }
  ~Relation6()
  { }
  void apply()
  {
    this->functor_m(this->target_m, r1_m, r2_m, r3_m, r4_m, r5_m, r6_m);
  }
  virtual RelationListItem *retarget(const Target &target) const
  {
    r1_m.addRelation(new InfluenceRelation(target));
    r2_m.addRelation(new InfluenceRelation(target));
    r3_m.addRelation(new InfluenceRelation(target));
    r4_m.addRelation(new InfluenceRelation(target));
    r5_m.addRelation(new InfluenceRelation(target));
    r6_m.addRelation(new InfluenceRelation(target));
    return new Relation6<Target, R1, R2, R3, R4, R5, R6, RelationFunctor>
      (target, r1_m, r2_m, r3_m, r4_m, r5_m, r6_m, this->functor_m);
  }
protected:
  R1 r1_m;
  R2 r2_m;
  R3 r3_m;
  R4 r4_m;
  R5 r5_m;
  R6 r6_m;
};
template<class L>
class RelationFunctionPtr0 {
public:
  RelationFunctionPtr0(void (*f)(const L &))
  : f_m(f)
  { }
  RelationFunctionPtr0(const RelationFunctionPtr0<L> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l)
  {
    f_m(l);
  }
private:
  void (*f_m)(const L &);
};
template<class L, class R1>
class RelationFunctionPtr1 {
public:
  RelationFunctionPtr1(void (*f)(const L &, const R1 &))
  : f_m(f)
  { }
  RelationFunctionPtr1(const RelationFunctionPtr1<L, R1> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1)
  {
    f_m(l, r1);
  }
private:
  void (*f_m)(const L &, const R1 &);
};
template<class L, class R1, class R2>
class RelationFunctionPtr2 {
public:
  RelationFunctionPtr2(void (*f)(const L &, const R1 &, const R2 &))
  : f_m(f)
  { }
  RelationFunctionPtr2(const RelationFunctionPtr2<L, R1, R2> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2)
  {
    f_m(l, r1, r2);
  }
private:
  void (*f_m)(const L &, const R1 &, const R2 &);
};
template<class L, class R1, class R2, class R3>
class RelationFunctionPtr3 {
public:
  RelationFunctionPtr3(void (*f)(const L &,
    const R1 &, const R2 &, const R3 &))
  : f_m(f)
  { }
  RelationFunctionPtr3(
    const RelationFunctionPtr3<L, R1, R2, R3> &model)
  : f_m(model.f_m)
  { }
  RelationFunctionPtr3(
    const RelationFunctionPtr3<L, R1, R2, R3> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3)
  {
    f_m(l, r1, r2, r3);
  }
private:
  void (*f_m)(const L &, const R1 &, const R2 &, const R3 &);
};
template<class L, class R1, class R2, class R3, class R4>
class RelationFunctionPtr4 {
public:
  RelationFunctionPtr4(void (*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &))
  : f_m(f)
  { }
  RelationFunctionPtr4(
    const RelationFunctionPtr4<L, R1, R2, R3, R4> &model)
  : f_m(model.f_m)
  { }
  RelationFunctionPtr4(
    const RelationFunctionPtr4<L, R1, R2, R3, R4> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4)
  {
    f_m(l, r1, r2, r3, r4);
  }
private:
  void (*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &);
};
template<class L,
  class R1, class R2, class R3, class R4, class R5>
class RelationFunctionPtr5 {
public:
  RelationFunctionPtr5(void (*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &, const R5 &))
  : f_m(f)
  { }
  RelationFunctionPtr5(
    const RelationFunctionPtr5<L, R1, R2, R3, R4, R5> &model)
  : f_m(model.f_m)
  { }
  RelationFunctionPtr5(
    const RelationFunctionPtr5<L, R1, R2, R3, R4, R5> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4, const R5 &r5)
  {
    f_m(l, r1, r2, r3, r4, r5);
  }
private:
  void (*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &, const R5 &);
};
template<class L,
  class R1, class R2, class R3, class R4, class R5, class R6>
class RelationFunctionPtr6 {
public:
  RelationFunctionPtr6(void (*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &, const R5 &, const R6 &))
  : f_m(f)
  { }
  RelationFunctionPtr6(
    const RelationFunctionPtr6<L, R1, R2, R3, R4, R5, R6> &model)
  : f_m(model.f_m)
  { }
  RelationFunctionPtr6(
    const RelationFunctionPtr6<L, R1, R2, R3, R4, R5, R6> &init, const L &)
  : f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4, const R5 &r5, const R6 &r6)
  {
    f_m(l, r1, r2, r3, r4, r5, r6);
  }
private:
  void (*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &, const R5 &, const R6 &);
};
template<class C, class L>
class RelationMemberPtr0 {
public:
  RelationMemberPtr0(const C &obj, void (C::*f)(const L &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr0(const RelationMemberPtr0<C, L> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr0(const RelationMemberPtr0<C, L> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l)
  {
    (obj_m.*f_m)(l);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &);
};
template<class C, class L, class R1>
class RelationMemberPtr1 {
public:
  RelationMemberPtr1(const C &obj, void (C::*f)(const L &,
    const R1 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr1(const RelationMemberPtr1<C, L, R1> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr1(const RelationMemberPtr1<C, L, R1> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1)
  {
    (obj_m.*f_m)(l, r1);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &);
};
template<class C, class L, class R1, class R2>
class RelationMemberPtr2 {
public:
  RelationMemberPtr2(const C &obj, void (C::*f)(const L &,
    const R1 &, const R2 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr2(const RelationMemberPtr2<C, L, R1, R2> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr2(const RelationMemberPtr2<C, L, R1, R2> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2)
  {
    (obj_m.*f_m)(l, r1, r2);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &, const R2 &);
};
template<class C, class L, class R1, class R2, class R3>
class RelationMemberPtr3 {
public:
  RelationMemberPtr3(const C &obj, void (C::*f)(const L &,
    const R1 &, const R2 &, const R3 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr3(
    const RelationMemberPtr3<C, L, R1, R2, R3> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr3(
    const RelationMemberPtr3<C, L, R1, R2, R3> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3)
  {
    (obj_m.*f_m)(l, r1, r2, r3);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &, const R2 &, const R3 &);
};
template<class C, class L, class R1, class R2, class R3, class R4>
class RelationMemberPtr4 {
public:
  RelationMemberPtr4(const C &obj, void (C::*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr4(
    const RelationMemberPtr4<C, L, R1, R2, R3, R4> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr4(
    const RelationMemberPtr4<C, L, R1, R2, R3, R4> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4)
  {
    (obj_m.*f_m)(l, r1, r2, r3, r4);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &);
};
template<class C, class L,
  class R1, class R2, class R3, class R4, class R5>
class RelationMemberPtr5 {
public:
  RelationMemberPtr5(const C &obj, void (C::*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &, const R5 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr5(
    const RelationMemberPtr5<C, L, R1, R2, R3, R4, R5> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr5(
    const RelationMemberPtr5<C, L, R1, R2, R3, R4, R5> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4, const R5 &r5)
  {
    (obj_m.*f_m)(l, r1, r2, r3, r4, r5);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &, const R5 &);
};
template<class C, class L,
  class R1, class R2, class R3, class R4, class R5, class R6>
class RelationMemberPtr6 {
public:
  RelationMemberPtr6(const C &obj, void (C::*f)(const L &,
    const R1 &, const R2 &, const R3 &, const R4 &, const R5 &, const R6 &))
  : obj_m(obj), f_m(f)
  { }
  RelationMemberPtr6(
    const RelationMemberPtr6<C, L, R1, R2, R3, R4, R5, R6> &model)
  : obj_m(model.obj_m), f_m(model.f_m)
  { }
  RelationMemberPtr6(
    const RelationMemberPtr6<C, L, R1, R2, R3, R4, R5, R6> &init, const L &)
  : obj_m(init.obj_m), f_m(init.f_m)
  { }
  inline void operator()(const L &l, const R1 &r1, const R2 &r2,
    const R3 &r3, const R4 &r4, const R5 &r5, const R6 &r6)
  {
    (obj_m.*f_m)(l, r1, r2, r3, r4, r5, r6);
  }
private:
  C obj_m;
  void (C::*f_m)(const L &, const R1 &, const R2 &,
    const R3 &, const R4 &, const R5 &, const R6 &);
};
template<class RelationFunctor>
struct RelationFunctorTraits {
  enum { defaultPriority = 0 };
};
namespace Pooma {
  template<class RelationFunctor, class L>
  void newRelation(const RelationFunctor &f, const L &l)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            RelationListItem *r = new Relation0<L, RelationFunctor>(lsub, f);
            r->setPriority(RelationFunctorTraits<RelationFunctor>::defaultPriority);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r = new
              Relation1<L, R1, RelationFunctor>
                (lsub, r1sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1, class R2>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1, const R2 &r2)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            const R2 &r2sub = r2.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            r2sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r =
              new Relation2<L, R1, R2, RelationFunctor>(lsub, r1sub, r2sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1, class R2, class R3>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1, const R2 &r2, const R3 &r3)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            const R2 &r2sub = r2.subField(m, c);
            const R3 &r3sub = r3.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            r2sub.addRelation(new InfluenceRelation(lsub));
            r3sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r = new
              Relation3<L, R1, R2, R3, RelationFunctor>
                (lsub, r1sub, r2sub, r3sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1, class R2, class R3,
    class R4>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1, const R2 &r2,
                   const R3 &r3, const R4 &r4)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            const R2 &r2sub = r2.subField(m, c);
            const R3 &r3sub = r3.subField(m, c);
            const R4 &r4sub = r4.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            r2sub.addRelation(new InfluenceRelation(lsub));
            r3sub.addRelation(new InfluenceRelation(lsub));
            r4sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r = new
              Relation4<L, R1, R2, R3, R4, RelationFunctor>
                (lsub, r1sub, r2sub, r3sub, r4sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1, class R2, class R3,
    class R4, class R5>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1, const R2 &r2,
                   const R3 &r3, const R4 &r4, const R5 &r5)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            const R2 &r2sub = r2.subField(m, c);
            const R3 &r3sub = r3.subField(m, c);
            const R4 &r4sub = r4.subField(m, c);
            const R5 &r5sub = r5.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            r2sub.addRelation(new InfluenceRelation(lsub));
            r3sub.addRelation(new InfluenceRelation(lsub));
            r4sub.addRelation(new InfluenceRelation(lsub));
            r5sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r = new
              Relation5<L, R1, R2, R3, R4, R5, RelationFunctor>
                (lsub, r1sub, r2sub, r3sub, r4sub, r5sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class RelationFunctor, class L, class R1, class R2, class R3,
    class R4, class R5, class R6>
  void newRelation(const RelationFunctor &f, const L &l,
                   const R1 &r1, const R2 &r2,
                   const R3 &r3, const R4 &r4, const R5 &r5, const R6 &r6)
  {
    for (int m = 0; m < l.numMaterials(); ++m)
      {
        for (int c = 0; c < l.centeringSize(); ++c)
          {
            const L &lsub = l.subField(m, c);
            const R1 &r1sub = r1.subField(m, c);
            const R2 &r2sub = r2.subField(m, c);
            const R3 &r3sub = r3.subField(m, c);
            const R4 &r4sub = r4.subField(m, c);
            const R5 &r5sub = r5.subField(m, c);
            const R6 &r6sub = r6.subField(m, c);
            r1sub.addRelation(new InfluenceRelation(lsub));
            r2sub.addRelation(new InfluenceRelation(lsub));
            r3sub.addRelation(new InfluenceRelation(lsub));
            r4sub.addRelation(new InfluenceRelation(lsub));
            r5sub.addRelation(new InfluenceRelation(lsub));
            r6sub.addRelation(new InfluenceRelation(lsub));
            RelationListItem *r = new
              Relation6<L, R1, R2, R3, R4, R5, R6, RelationFunctor>
                (lsub, r1sub, r2sub, r3sub, r4sub, r5sub, r6sub, f);
            lsub.addRelation(r);
          }
      }
  }
  template<class L>
  RelationFunctionPtr0<L>
  functionPtr(void (*f)(const L &))
  {
    return RelationFunctionPtr0<L>(f);
  }
  template<class L, class R1>
  RelationFunctionPtr1<L, R1>
  functionPtr(void (*f)(const L &, const R1 &))
  {
    return RelationFunctionPtr1<L, R1>(f);
  }
  template<class L, class R1, class R2>
  RelationFunctionPtr2<L, R1, R2>
  functionPtr(void (*f)(const L &, const R1 &, const R2 &))
  {
    return RelationFunctionPtr2<L, R1, R2>(f);
  }
  template<class L, class R1, class R2, class R3>
  RelationFunctionPtr3<L, R1, R2, R3>
  functionPtr(void (*f)(const L &, const R1 &, const R2 &, const R3 &))
  {
    return RelationFunctionPtr3<L, R1, R2, R3>(f);
  }
  template<class L, class R1, class R2, class R3, class R4>
  RelationFunctionPtr4<L, R1, R2, R3, R4>
  functionPtr(void (*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4))
  {
    return RelationFunctionPtr4<L, R1, R2, R3, R4>(f);
  }
  template<class L, class R1, class R2, class R3,
    class R4, class R5>
  RelationFunctionPtr5<L, R1, R2, R3, R4, R5>
  functionPtr(void (*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4, const R5 &r5))
  {
    return RelationFunctionPtr5<L, R1, R2, R3, R4, R5>(f);
  }
  template<class L, class R1, class R2, class R3,
    class R4, class R5, class R6>
  RelationFunctionPtr6<L, R1, R2, R3, R4, R5, R6>
  functionPtr(void (*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4, const R5 &r5, const R6 &r6))
  {
    return RelationFunctionPtr6<L, R1, R2, R3, R4, R5, R6>(f);
  }
  template<class C, class L>
  RelationMemberPtr0<C, L>
  memberPtr(const C &obj, void (C::*f)(const L &))
  {
    return RelationMemberPtr0<C, L>(obj, f);
  }
  template<class C, class L, class R1>
  RelationMemberPtr1<C, L, R1>
  memberPtr(const C &obj, void (C::*f)(const L &, const R1 &))
  {
    return RelationMemberPtr1<C, L, R1>(obj, f);
  }
  template<class C, class L, class R1, class R2>
  RelationMemberPtr2<C, L, R1, R2>
  memberPtr(const C &obj, void (C::*f)(const L &, const R1 &, const R2 &))
  {
    return RelationMemberPtr2<C, L, R1, R2>(obj, f);
  }
  template<class C, class L, class R1, class R2, class R3>
  RelationMemberPtr3<C, L, R1, R2, R3>
  memberPtr(const C &obj,
    void (C::*f)(const L &, const R1 &, const R2 &, const R3 &))
  {
    return RelationMemberPtr3<C, L, R1, R2, R3>(obj, f);
  }
  template<class C, class L, class R1, class R2, class R3,
    class R4>
  RelationMemberPtr4<C, L, R1, R2, R3, R4>
  memberPtr(const C &obj,
    void (C::*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4))
  {
    return RelationMemberPtr4<C, L, R1, R2, R3, R4>(obj, f);
  }
  template<class C, class L, class R1, class R2, class R3,
    class R4, class R5>
  RelationMemberPtr5<C, L, R1, R2, R3, R4, R5>
  memberPtr(const C &obj,
    void (C::*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4, const R5 &r5))
  {
    return RelationMemberPtr5<C, L, R1, R2, R3, R4, R5>(obj, f);
  }
  template<class C, class L, class R1, class R2, class R3,
    class R4, class R5, class R6>
  RelationMemberPtr6<C, L, R1, R2, R3, R4, R5, R6>
  memberPtr(const C &obj,
    void (C::*f)(const L &, const R1 &, const R2 &, const R3 &,
    const R4 &r4, const R5 &r5, const R6 &r6))
  {
    return RelationMemberPtr6<C, L, R1, R2, R3, R4, R5, R6>(obj, f);
  }
}
template<int Dim, class T>
class ConstantFaceBC
{
public:
  ConstantFaceBC(int face, const T &constant,
    bool enforceConstantBoundary = false)
  : domain_m(Pooma::NoInit()),
    face_m(face),
    constant_m(constant),
    enforceConstantBoundary_m(enforceConstantBoundary)
    { }
  ConstantFaceBC(const ConstantFaceBC<Dim, T> &model)
  : domain_m(model.domain_m),
    face_m(model.face_m),
    constant_m(model.constant_m),
    enforceConstantBoundary_m(model.enforceConstantBoundary_m)
    { }
  template<class Target>
  ConstantFaceBC(const ConstantFaceBC<Dim, T> &init, const Target &t)
  : domain_m(t.totalDomain()),
    face_m(init.face_m),
    constant_m(init.constant_m),
    enforceConstantBoundary_m(init.enforceConstantBoundary_m)
  {
    ;
    int d = face_m / 2;
    int adjust;
    if (enforceConstantBoundary_m &&
        t.centering().orientation(0)[d].min() == 0)
      adjust = 0;
    else
      adjust = 1;
    if (face_m & 1)
      {
        int nGuards = t.fieldEngine().guardLayers().upper(d);
        domain_m[d] = Interval<1>(domain_m[d].max() - nGuards + adjust,
             domain_m[d].max());
      }
    else
      {
        int nGuards = t.fieldEngine().guardLayers().lower(d);
        domain_m[d] = Interval<1>(domain_m[d].min(),
      domain_m[d].min() + nGuards - adjust);
      }
  }
  ConstantFaceBC<Dim, T> &operator=(const ConstantFaceBC<Dim, T> &rhs)
  {
    domain_m = rhs.domain_m;
    face_m = rhs.face_m;
    constant_m = rhs.constant_m;
    enforceConstantBoundary_m = rhs.enforceConstantBoundary_m;
    return *this;
  }
  T constant() const { return constant_m; }
  void setConstant(T newConstant) { constant_m = newConstant; }
  int face() const { return face_m; }
  template<class Target>
  void operator()(const Target &t) const
  {
    t(domain_m) = constant_m;
  }
private:
  Interval<Dim> domain_m;
  int face_m;
  T constant_m;
  bool enforceConstantBoundary_m;
};
template<int Dim, class T>
struct RelationFunctorTraits<ConstantFaceBC<Dim, T> > {
  enum { defaultPriority = 100 };
};
namespace Pooma {
  template<class Target, class T>
  void addConstantFaceBC(const Target &f, int face, const T &constant,
    bool enforceConstantBoundary = false)
  {
    newRelation(ConstantFaceBC<Target::dimensions, T>
      (face, constant, enforceConstantBoundary), f);
  }
  template<class Target, class T>
  void addAllConstantFaceBC(const Target &f, const T &constant,
    bool enforceConstantBoundary = false)
  {
    for (int i = 0; i < 2 * Target::dimensions; i++)
      {
        addConstantFaceBC(f, i, constant, enforceConstantBoundary);
      }
  }
}
template<int Dim>
class ReflectFaceBase
{
public:
  ReflectFaceBase(int face, bool enforceZeroBoundary = false)
  : domain_m(Pooma::NoInit()),
    vertFaceDomain_m(Pooma::NoInit()),
    srcRange_m(Pooma::NoInit()),
    face_m(face),
    enforceZeroBoundary_m(enforceZeroBoundary)
    { }
  ReflectFaceBase(const ReflectFaceBase<Dim> &model)
  : domain_m(model.domain_m),
    vertFaceDomain_m(model.vertFaceDomain_m),
    srcRange_m(model.srcRange_m),
    face_m(model.face_m),
    enforceZeroBoundary_m(model.enforceZeroBoundary_m)
    { }
  template<class Target>
  ReflectFaceBase(const ReflectFaceBase<Dim> &init, const Target &t)
  : domain_m(t.totalDomain()),
    vertFaceDomain_m(t.totalDomain()),
    srcRange_m(Pooma::NoInit()),
    face_m(init.face_m),
    enforceZeroBoundary_m(init.enforceZeroBoundary_m)
  {
    ;
    for (int dd = 0; dd < Dim; ++dd)
      {
        srcRange_m[dd] =
          Range<1>(domain_m[dd].min(), domain_m[dd].max(), 1);
      }
    int d = face_m / 2;
    int adjust = 1 - t.centering().orientation(0)[d].min();
    if (face_m & 1)
      {
        int nGuards = t.fieldEngine().guardLayers().upper(d);
 if (adjust == 1)
   {
            vertFaceDomain_m[d] =
       Interval<1>(t.physicalDomain()[d].max(),
     t.physicalDomain()[d].max());
          }
        srcRange_m[d] =
          Range<1>(t.physicalDomain()[d].max() - adjust,
     t.physicalDomain()[d].max() - adjust - (nGuards - 1),
     -1);
        domain_m[d] = Interval<1>(domain_m[d].max() - (nGuards - 1),
      domain_m[d].max());
      }
    else
      {
        int nGuards = t.fieldEngine().guardLayers().lower(d);
 if (adjust == 1)
   {
            vertFaceDomain_m[d] =
              Interval<1>(t.physicalDomain()[d].min(),
     t.physicalDomain()[d].min());
    }
        srcRange_m[d] =
          Range<1>(t.physicalDomain()[d].min() + adjust +
     (nGuards - 1),
     t.physicalDomain()[d].min() + adjust, -1);
 domain_m[d] = Interval<1>(domain_m[d].min(),
      domain_m[d].min() + (nGuards - 1));
      }
  }
  ReflectFaceBase<Dim> &operator=(const ReflectFaceBase<Dim> &rhs)
  {
    domain_m = rhs.domain_m;
    vertFaceDomain_m = rhs.vertFaceDomain_m;
    srcRange_m = rhs.srcRange_m;
    face_m = rhs.face_m;
    enforceZeroBoundary_m = rhs.enforceZeroBoundary_m;
    return *this;
  }
  int face() const { return face_m; }
  bool enforceZeroBoundary() const { return enforceZeroBoundary_m; }
protected:
  Interval<Dim> domain_m, vertFaceDomain_m;
  Range<Dim> srcRange_m;
  int face_m;
  bool enforceZeroBoundary_m;
};
template<int Dim>
class PosReflectFaceBC : public ReflectFaceBase<Dim>
{
public:
  PosReflectFaceBC(int face, bool enforceZeroBoundary = false)
    : ReflectFaceBase<Dim>(face, enforceZeroBoundary)
  {}
  template<class Target>
  PosReflectFaceBC(const PosReflectFaceBC<Dim>& init, const Target &t)
    : ReflectFaceBase<Dim>(init, t)
  {}
  template<class Target>
  void operator()(const Target &t) const
  {
    t(this->domain_m) = t(this->srcRange_m);
    if (this->enforceZeroBoundary_m &&
        t.centering().orientation(0)[this->face_m / 2].min() == 0)
      {
        typedef typename Target::Element_t T;
        t(this->vertFaceDomain_m) = T(0.0);
      }
  }
};
template<int Dim>
class NegReflectFaceBC : public ReflectFaceBase<Dim>
{
public:
  NegReflectFaceBC(int face, bool enforceZeroBoundary = false)
    : ReflectFaceBase<Dim>(face, enforceZeroBoundary)
  {}
  template<class Target>
  NegReflectFaceBC(const NegReflectFaceBC<Dim>& init, const Target &t)
    : ReflectFaceBase<Dim>(init, t)
  {}
  template<class Target>
  void operator()(const Target &t) const
  {
    t(this->domain_m) = -t(this->srcRange_m);
    if (this->enforceZeroBoundary_m &&
        t.centering().orientation(0)[this->face_m / 2].min() == 0)
      {
        typedef typename Target::Element_t T;
        t(this->vertFaceDomain_m) = T(0.0);
      }
  }
};
template<int Dim>
struct RelationFunctorTraits<PosReflectFaceBC<Dim> > {
  enum { defaultPriority = 100 };
};
template<int Dim>
struct RelationFunctorTraits<NegReflectFaceBC<Dim> > {
  enum { defaultPriority = 100 };
};
namespace Pooma {
  template<class Target>
  void addPosReflectFaceBC(const Target &f, int face,
    bool enforceZeroBoundary = false)
  {
      newRelation(PosReflectFaceBC<Target::dimensions>
        (face, enforceZeroBoundary), f);
  }
  template<class Target>
  void addAllPosReflectFaceBC(const Target &f, bool enforceZeroBoundary = false)
  {
    for (int i = 0; i < 2 * Target::dimensions; i++)
      {
        addPosReflectFaceBC(f, i, enforceZeroBoundary);
      }
  }
  template<class Target>
  void addNegReflectFaceBC(const Target &f, int face,
    bool enforceZeroBoundary = false)
  {
      newRelation(NegReflectFaceBC<Target::dimensions>
        (face, enforceZeroBoundary), f);
  }
  template<class Target>
  void addAllNegReflectFaceBC(const Target &f, bool enforceZeroBoundary = false)
  {
    for (int i = 0; i < 2 * Target::dimensions; i++)
      {
        addNegReflectFaceBC(f, i, enforceZeroBoundary);
      }
  }
}
template<int Dim>
class PeriodicFaceBC
{
public:
  PeriodicFaceBC(int face)
  : domain_m(Pooma::NoInit()),
    srcDomain_m(Pooma::NoInit()),
    face_m(face)
    { }
  PeriodicFaceBC(const PeriodicFaceBC<Dim> &model)
  : domain_m(model.domain_m),
    srcDomain_m(model.srcDomain_m),
    face_m(model.face_m)
    { }
  template<class Target>
  PeriodicFaceBC(const PeriodicFaceBC<Dim> &init, const Target &t)
  : domain_m(t.totalDomain()),
    srcDomain_m(t.totalDomain()),
    face_m(init.face_m)
  {
    ;
    int d = face_m / 2;
    int adjust = 1 - t.centering().orientation(0)[d].min();
    if (face_m & 1)
      {
        int nGuards = t.fieldEngine().guardLayers().upper(d);
 domain_m[d] =
          Interval<1>(domain_m[d].max() - nGuards,
               domain_m[d].max());
 srcDomain_m[d] =
   Interval<1>(domain_m[d].min() -
        (t.physicalDomain()[d].length() - 1 - adjust),
         domain_m[d].max() -
         (t.physicalDomain()[d].length() - 1 - adjust));
      }
    else
      {
        int nGuards = t.fieldEngine().guardLayers().lower(d);
 domain_m[d] = Interval<1>(domain_m[d].min(),
      domain_m[d].min() + (nGuards - 1) + adjust);
 srcDomain_m[d] =
   Interval<1>(domain_m[d].min() +
        (t.physicalDomain()[d].length() - 1 - adjust),
        domain_m[d].max() +
         (t.physicalDomain()[d].length() - 1 - adjust));
      }
  }
  PeriodicFaceBC<Dim> &operator=(const PeriodicFaceBC<Dim> &rhs)
  {
    if (&rhs != this)
      {
        domain_m = rhs.domain_m;
        srcDomain_m = rhs.srcDomain_m;
        face_m = rhs.face_m;
      }
    return *this;
  }
  int face() const { return face_m; }
  template<class Target>
  void operator()(const Target &t) const
  {
    t(domain_m) = t(srcDomain_m);
  }
private:
  Interval<Dim> domain_m, srcDomain_m;
  int face_m;
};
template<int Dim>
struct RelationFunctorTraits<PeriodicFaceBC<Dim> > {
  enum { defaultPriority = 100 };
};
namespace Pooma {
  template<class Target>
  void addPeriodicFaceBC(const Target &f, int face)
  {
    newRelation(PeriodicFaceBC<Target::dimensions>(face), f);
  }
  template<class Target>
  void addAllPeriodicFaceBC(const Target &f)
  {
    for (int i = 0; i < 2 * Target::dimensions; i++)
      {
        addPeriodicFaceBC(f, i);
      }
  }
}
template<int Dim>
class ZeroGradientFaceBC
{
public:
  ZeroGradientFaceBC(int face)
  : srcDomain_m(Pooma::NoInit()),
    face_m(face)
    { }
  ZeroGradientFaceBC(const ZeroGradientFaceBC<Dim> &model)
  : srcDomain_m(model.srcDomain_m),
    domains_m(model.domains_m),
    face_m(model.face_m)
    { }
  template<class Target>
  ZeroGradientFaceBC(const ZeroGradientFaceBC<Dim> &init, const Target &t)
  : srcDomain_m(t.totalDomain()),
    face_m(init.face_m)
  {
    ;
    int d = face_m / 2;
    int adjust = 1 - t.centering().orientation(0)[d].min();
    if (face_m & 1)
      {
        int nGuards = t.fieldEngine().guardLayers().upper(d);
 domains_m.resize(nGuards+adjust, t.totalDomain());
 srcDomain_m[d] =
          Interval<1>(t.physicalDomain()[d].max() - adjust,
               t.physicalDomain()[d].max() - adjust);
 for (int i=0; i<nGuards+adjust; i++)
   domains_m[i][d] =
     Interval<1>(t.physicalDomain()[d].max() -adjust + i + 1,
   t.physicalDomain()[d].max() -adjust + i + 1);
      }
    else
      {
        int nGuards = t.fieldEngine().guardLayers().lower(d);
 domains_m.resize(nGuards+adjust, t.totalDomain());
 srcDomain_m[d] = Interval<1>(t.physicalDomain()[d].min()+adjust,
          t.physicalDomain()[d].min()+adjust);
 for (int i=0; i<nGuards+adjust; i++)
   domains_m[i][d] =
     Interval<1>(t.physicalDomain()[d].min() +adjust - i - 1,
   t.physicalDomain()[d].min() +adjust - i - 1);
      }
  }
  ZeroGradientFaceBC<Dim> &operator=(const ZeroGradientFaceBC<Dim> &rhs)
  {
    if (&rhs != this)
      {
        domains_m = rhs.domains_m;
        srcDomain_m = rhs.srcDomain_m;
        face_m = rhs.face_m;
      }
    return *this;
  }
  int face() const { return face_m; }
  template<class Target>
  void operator()(const Target &t) const
  {
    for (int i=0; i<domains_m.size(); i++) {
      t(domains_m[i]) = t(srcDomain_m);
    }
  }
private:
  Interval<Dim> srcDomain_m;
  std::vector<Interval<Dim> > domains_m;
  int face_m;
};
template<int Dim>
struct RelationFunctorTraits<ZeroGradientFaceBC<Dim> > {
  enum { defaultPriority = 100 };
};
namespace Pooma {
  template<class Target>
  void addZeroGradientFaceBC(const Target &f, int face)
  {
    newRelation(ZeroGradientFaceBC<Target::dimensions>(face), f);
  }
  template<class Target>
  void addAllZeroGradientFaceBC(const Target &f)
  {
    for (int i = 0; i < 2 * Target::dimensions; i++)
      {
        addZeroGradientFaceBC(f, i);
      }
  }
}
template<class Functor, class Expression>
struct FieldStencilSimple
{
  typedef typename Expression::MeshTag_t MeshTag_t;
  enum { outputDim = Expression::dimensions };
  typedef typename Functor::OutputElement_t OutputElement_t;
  typedef StencilEngine<Functor, Expression> OutputEngineTag_t;
  typedef Field<MeshTag_t, OutputElement_t, OutputEngineTag_t> Type_t;
  typedef Engine<outputDim, OutputElement_t, OutputEngineTag_t> SEngine_t;
  static inline
  Type_t make(const Functor &stencil, const Expression &f)
  {
 return make(stencil, f, f.physicalDomain());
  }
  static inline
  Type_t make(const Functor &stencil, const Expression &f, const Interval<outputDim> &domain)
  {
 Type_t h(stencil.outputCentering(), f.layout(), f.mesh());
 h.fieldEngine().engine() = SEngine_t(stencil, f, domain);
 return h;
  }
  template<class Accumulate>
  static inline
  Type_t make(const Expression &f,
              const std::vector<FieldOffsetList<outputDim> > &nn,
              const Centering<outputDim> &outputCentering,
              Accumulate accumulate = Accumulate())
  {
    ;
    Type_t h(outputCentering, f.layout(), f.mesh());
    h.fieldEngine().physicalCellDomain() = f.fieldEngine().physicalCellDomain();
    h.fieldEngine().guardLayers() = f.fieldEngine().guardLayers();
    if (outputCentering.size() == 1)
    {
      h.fieldEngine().engine()
        = SEngine_t(Functor(nn[0], outputCentering, f.centering(),
                            accumulate),
                    f, h.physicalDomain());
    }
    else
    {
      int oc;
      for (oc = 0; oc < nn.size(); ++oc)
      {
        h[oc].fieldEngine().guardLayers() = f.fieldEngine().guardLayers();
        h[oc].fieldEngine().engine()
          = SEngine_t(Functor(nn[oc], outputCentering[oc], f.centering(),
                              accumulate),
                      f, h[oc].physicalDomain());
      }
    }
    return h;
  }
};
template<class T2, class Mesh>
class DivVertToCell;
template<class T2, int Dim, class TM>
class DivVertToCell<Vector<Dim, T2>, UniformRectilinearMesh<MeshTraits<Dim, TM, UniformRectilinearTag, CartesianTag> > >
{
public:
  typedef T2 OutputElement_t;
  Centering<Dim> outputCentering() const
  {
    return canonicalCentering<Dim>(CellType, Continuous, AllDim);
  }
  Centering<Dim> inputCentering() const
  {
    return canonicalCentering<Dim>(VertexType, Continuous, AllDim);
  }
  DivVertToCell()
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 1.0;
    }
  }
  template<class FE>
  DivVertToCell(const FE &fieldEngine)
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 1 / fieldEngine.mesh().spacings()(d);
    }
  }
  int lowerExtent(int d) const { return 0; }
  int upperExtent(int d) const { return 1; }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1) const
  {
    return OutputElement_t
      (fact_m(0)*(f.read(i1+1)(0) - f.read(i1)(0)));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2) const
  {
    return OutputElement_t
      (0.5*(fact_m(0)*(f.read(i1+1,i2)(0) - f.read(i1,i2)(0)
       + f.read(i1+1,i2+1)(0) - f.read(i1,i2+1)(0))
   + fact_m(1)*(f.read(i1, i2+1)(1) - f.read(i1, i2)(1)
       + f.read(i1+1,i2+1)(1) - f.read(i1+1,i2)(1))));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2, int i3) const
  {
    return OutputElement_t
      (0.25*(fact_m(0)*(f.read(i1+1,i2, i3)(0) - f.read(i1,i2, i3)(0)
        + f.read(i1+1,i2+1,i3)(0) - f.read(i1,i2+1,i3)(0)
        + f.read(i1+1,i2, i3+1)(0) - f.read(i1,i2, i3+1)(0)
        + f.read(i1+1,i2+1,i3+1)(0) - f.read(i1,i2+1,i3+1)(0))
    + fact_m(1)*(f.read(i1, i2+1,i3)(1) - f.read(i1, i2,i3)(1)
        + f.read(i1+1,i2+1,i3)(1) - f.read(i1+1,i2,i3)(1)
        + f.read(i1, i2+1,i3+1)(1) - f.read(i1, i2,i3+1)(1)
        + f.read(i1+1,i2+1,i3+1)(1) - f.read(i1+1,i2,i3+1)(1))
    + fact_m(2)*(f.read(i1, i2, i3+1)(2) - f.read(i1, i2, i3)(2)
        + f.read(i1+1,i2, i3+1)(2) - f.read(i1+1,i2, i3)(2)
        + f.read(i1, i2+1,i3+1)(2) - f.read(i1, i2+1,i3)(2)
        + f.read(i1+1,i2+1,i3+1)(2) - f.read(i1+1,i2+1,i3)(2))));
  }
private:
  Vector<Dim, TM> fact_m;
};
template<class T2, class Mesh>
class DivCellToVert;
template<class T2, int Dim, class TM>
class DivCellToVert<Vector<Dim, T2>, UniformRectilinearMesh<MeshTraits<Dim, TM> > >
{
public:
  typedef T2 OutputElement_t;
  Centering<Dim> outputCentering() const
  {
    return canonicalCentering<Dim>(CellType, Continuous, AllDim);
  }
  Centering<Dim> inputCentering() const
  {
    return canonicalCentering<Dim>(VertexType, Continuous, AllDim);
  }
  DivCellToVert()
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 1.0;
    }
  }
  template<class FE>
  DivCellToVert(const FE &fieldEngine)
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 1 / fieldEngine.mesh().spacings()(d);
    }
  }
  int lowerExtent(int d) const { return 0; }
  int upperExtent(int d) const { return 1; }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1) const
  {
    return OutputElement_t
      (fact_m(0)*(f.read(i1)(0) - f.read(i1-1)(0)));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2) const
  {
    return OutputElement_t
      (0.5*(fact_m(0)*(f.read(i1,i2-1)(0) - f.read(i1-1,i2-1)(0)
       + f.read(i1,i2)(0) - f.read(i1-1,i2)(0))
   + fact_m(1)*(f.read(i1-1,i2)(1) - f.read(i1-1,i2-1)(1)
       + f.read(i1, i2)(1) - f.read(i1, i2-1)(1))));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2, int i3) const
  {
    return OutputElement_t
      (0.25*(fact_m(0)*(f.read(i1,i2-1,i3-1)(0) - f.read(i1-1,i2-1,i3-1)(0)
        + f.read(i1,i2, i3-1)(0) - f.read(i1-1,i2, i3-1)(0)
        + f.read(i1,i2-1,i3)(0) - f.read(i1-1,i2-1,i3)(0)
        + f.read(i1,i2, i3)(0) - f.read(i1-1,i2, i3)(0))
    + fact_m(1)*(f.read(i1-1,i2,i3-1)(1) - f.read(i1-1,i2-1,i3-1)(1)
        + f.read(i1, i2,i3-1)(1) - f.read(i1, i2-1,i3-1)(1)
        + f.read(i1-1,i2,i3)(1) - f.read(i1-1,i2-1,i3)(1)
        + f.read(i1, i2,i3)(1) - f.read(i1, i2-1,i3)(1))
    + fact_m(2)*(f.read(i1-1,i2-1,i3)(2) - f.read(i1-1,i2-1,i3-1)(2)
        + f.read(i1, i2-1,i3)(2) - f.read(i1, i2-1,i3-1)(2)
        + f.read(i1-1,i2, i3)(2) - f.read(i1-1,i2, i3-1)(2)
        + f.read(i1, i2, i3)(2) - f.read(i1, i2, i3-1)(2))));
  }
private:
  Vector<Dim, TM> fact_m;
};
template<class T2, class Mesh, CenteringType OC>
class DivSameToSame;
template<class T2, int Dim, class TM, CenteringType OC>
class DivSameToSame<Vector<Dim, T2>, UniformRectilinearMesh<MeshTraits<Dim, TM, UniformRectilinearTag, CartesianTag> >, OC>
{
public:
  typedef T2 OutputElement_t;
  Centering<Dim> outputCentering() const
  {
    return canonicalCentering<Dim>(OC, Continuous);
  }
  Centering<Dim> inputCentering() const
  {
    return canonicalCentering<Dim>(OC, Continuous);
  }
  DivSameToSame()
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 0.5;
    }
  }
  template<class FE>
  DivSameToSame(const FE &fieldEngine)
  {
    for (int d = 0; d < Dim; ++d)
    {
      fact_m(d) = 0.5 / fieldEngine.mesh().spacings()(d);
    }
  }
  int lowerExtent(int d) const { return 1; }
  int upperExtent(int d) const { return 1; }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1) const
  {
    return OutputElement_t
      (fact_m(0)*(f.read(i1+1)(0) - f.read(i1-1)(0)));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2) const
  {
    return OutputElement_t
      (fact_m(0)*(f.read(i1+1,i2)(0) - f.read(i1-1,i2)(0))
     + fact_m(1)*(f.read(i1, i2+1)(1) - f.read(i1, i2-1)(1)));
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2, int i3) const
  {
    return OutputElement_t
      (fact_m(0)*(f.read(i1+1,i2, i3)(0) - f.read(i1-1,i2, i3)(0))
     + fact_m(1)*(f.read(i1, i2+1,i3)(1) - f.read(i1, i2-1,i3)(1))
     + fact_m(2)*(f.read(i1, i2, i3+1)(2) - f.read(i1, i2, i3-1)(2)));
  }
private:
  Vector<Dim, TM> fact_m;
};
template<class T2, class Mesh>
class DivCellToVert;
template<class T2, class Mesh>
class DivVertToCell;
template<class T2, class Mesh, CenteringType OC>
class DivSameToSame;
template<class Mesh, class T, class EngineTag>
typename
FieldStencilSimple<DivSameToSame<T, Mesh, CellType>,
  Field<Mesh, T, EngineTag> >::Type_t
divCellToCell(const Field<Mesh, T, EngineTag> &f)
{
  typedef DivSameToSame<T, Mesh, CellType> Div_t;
  typedef FieldStencilSimple<Div_t, Field<Mesh, T, EngineTag> > Ret_t;
  return Ret_t::make(Div_t(f.fieldEngine()), f);
}
template<class Mesh, class T, class EngineTag>
typename
FieldStencilSimple<DivVertToCell<T, Mesh>,
  Field<Mesh, T, EngineTag> >::Type_t
divVertToCell(const Field<Mesh, T, EngineTag> &f)
{
  typedef DivVertToCell<T, Mesh> Div_t;
  typedef FieldStencilSimple<Div_t, Field<Mesh, T, EngineTag> > Ret_t;
  return Ret_t::make(Div_t(f.fieldEngine()), f);
}
template<class Mesh, class T, class EngineTag>
typename
FieldStencilSimple<DivCellToVert<T, Mesh>,
  Field<Mesh, T, EngineTag> >::Type_t
divCellToVert(const Field<Mesh, T, EngineTag> &f)
{
  typedef DivCellToVert<T, Mesh> Div_t;
  typedef FieldStencilSimple<Div_t, Field<Mesh, T, EngineTag> > Ret_t;
  return Ret_t::make(Div_t(f.fieldEngine()), f);
}
template<class Mesh, class T, class EngineTag>
typename
FieldStencilSimple<DivSameToSame<T, Mesh, VertexType>,
  Field<Mesh, T, EngineTag> >::Type_t
divVertToVert(const Field<Mesh, T, EngineTag> &f)
{
  typedef DivSameToSame<T, Mesh, VertexType> Div_t;
  typedef FieldStencilSimple<Div_t, Field<Mesh, T, EngineTag> > Ret_t;
  return Ret_t::make(Div_t(f.fieldEngine()), f);
}
template<class D1,class T1,class E1>
inline typename MakeReturn<BinaryNode<FnMin,
  typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t> >::Expression_t
min(const Field<D1,T1,E1> & l,const Field<D1,T1,E1> & r)
{
  typedef BinaryNode<FnMin,
    typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<D1,T1,E1> >::make(l),
    CreateLeaf<Field<D1,T1,E1> >::make(r)));
}
template<class D1,class T1,class E1>
inline typename MakeReturn<BinaryNode<FnMax,
  typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t,
  typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t> >::Expression_t
max(const Field<D1,T1,E1> & l,const Field<D1,T1,E1> & r)
{
  typedef BinaryNode<FnMax,
    typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t,
    typename CreateLeaf<Field<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<D1,T1,E1> >::make(l),
    CreateLeaf<Field<D1,T1,E1> >::make(r)));
}
template <int Dim>
class DomainLayout;
template<class Functor> class FieldShift;
template <class Expression>
struct FieldShift;
template<int Dim, class T, class Expression>
class Engine<Dim, T, FieldShift<Expression> >
{
public:
  typedef FieldShift<Expression> Tag_t;
  typedef Expression Expression_t;
  typedef Engine<Dim, T, Tag_t> This_t;
  typedef This_t Engine_t;
  typedef Interval<Dim> Domain_t;
  typedef T Element_t;
  typedef ErrorType ElementRef_t;
  typedef typename Expression_t::Engine_t ExprEngine_t;
  typedef DomainLayout<Dim> Layout_t;
  enum { dimensions = Dim };
  enum { hasDataObject = ExprEngine_t::hasDataObject };
  enum { dynamic = false };
  enum { zeroBased = false };
  enum { multiPatch = ExprEngine_t::multiPatch };
  Engine()
    : domain_m(Pooma::NoInit()), exprEngine_m()
  {
  }
  template<class Layout>
  explicit Engine(const Layout &layout)
    : domain_m(layout.domain()), exprEngine_m()
  {
  }
  Engine(const Expression_t &f, const Loc<Dim> &offset, Domain_t domain)
    : domain_m(domain),
      offset_m(offset),
      exprEngine_m(f)
  {
  }
  Engine(const This_t &model)
    : domain_m(model.domain()),
      offset_m(model.offset_m),
      exprEngine_m(model.exprEngine())
  {
  }
  This_t &operator=(const This_t &model)
  {
    domain_m = model.domain();
    offset_m = model.offset_m;
    exprEngine_m = model.exprEngine();
    return *this;
  }
  inline Element_t read(int i) const
  {
    return exprEngine()(i + offset_m[0].first());
  }
  inline Element_t read(int i, int j) const
  {
    return exprEngine()(i + offset_m[0].first(),
                        j + offset_m[1].first());
  }
  inline Element_t read(int i, int j, int k) const
  {
    return exprEngine()(i + offset_m[0].first(),
                        j + offset_m[1].first(),
                        k + offset_m[2].first());
  }
  inline Element_t read(const Loc<Dim> &loc) const
  {
    return exprEngine()(loc + offset_m);
  }
  inline Element_t operator()(int i) const
  {
    return read(i);
  }
  inline Element_t operator()(int i, int j) const
  {
    return read(i, j);
  }
  inline Element_t operator()(int i, int j, int k) const
  {
    return read(i, j, k);
  }
  inline Element_t operator()(const Loc<Dim> &loc) const
  {
    return read(loc);
  }
  inline const Domain_t &domain() const { return domain_m; }
  inline Loc<Dim> offset() const
  {
    return offset_m;
  }
  inline const Expression_t &exprEngine() const { return exprEngine_m; }
  template<class RequestType>
  inline
  typename DataObjectRequest<RequestType>::Type_t
  dataObjectRequest(const DataObjectRequest<RequestType> &req) const
  {
    return exprEngine().engine().dataObjectRequest(req);
  }
  inline
  Interval<Dim> viewDomain(const Interval<Dim> &domain) const
  {
    Interval<Dim> ret;
    int d;
    for (d = 0; d < Dim; ++d)
    {
      ret[d] =
 Interval<1>(
      domain[d].first() + offset_m[d].first(),
      domain[d].last() + offset_m[d].first()
      );
    }
    return ret;
  }
  inline
  INode<Dim> viewDomain(const INode<Dim> &inode) const
  {
    return INode<Dim>(inode, viewDomain(inode.domain()));
  }
  inline
  Interval<Dim> intersectDomain() const
  {
    Interval<Dim> ret;
    int d;
    for (d = 0; d < Dim; ++d)
    {
      ret[d] =
 Interval<1>(
      domain_m[d].first() + offset_m[d].first(),
                    domain_m[d].last() + offset_m[d].first()
      );
    }
    return ret;
  }
private:
  Interval<Dim> domain_m;
  Loc<Dim> offset_m;
  Expression_t exprEngine_m;
};
template <int Dim, class T, class E>
struct NewEngine<Engine<Dim, T, FieldShift<E> >, Interval<Dim> >
{
  typedef typename NewEngine<E, Interval<Dim> >::Type_t Type_t;
};
template <int Dim, class T, class E>
struct NewEngineEngine<Engine<Dim, T, FieldShift<E> >, Interval<Dim> >
{
  typedef typename NewEngineEngine<E, Interval<Dim> >::Type_t Type_t;
  static inline
  Type_t apply(const Engine<Dim, T, FieldShift<E> > &e, const Interval<Dim> &d)
  {
    return NewEngineEngine<E, Interval<Dim> >::apply(e.exprEngine(),
                                                     e.viewDomain(d));
  }
};
template <int Dim, class T, class E>
struct NewEngineDomain<Engine<Dim, T, FieldShift<E> >, Interval<Dim> >
{
  typedef typename NewEngineDomain<E, Interval<Dim> >::Type_t Type_t;
  static inline
  Type_t apply(const Engine<Dim, T, FieldShift<E> > &e, const Interval<Dim> &d)
  {
    return NewEngineDomain<E, Interval<Dim> >::apply(e.exprEngine(),
                                                     e.viewDomain(d));
  }
};
template <int Dim, class T, class E>
struct NewEngine<Engine<Dim, T, FieldShift<E> >, INode<Dim> >
{
  typedef typename NewEngine<E, INode<Dim> >::Type_t Type_t;
};
template <int Dim, class T, class E>
struct NewEngineEngine<Engine<Dim, T, FieldShift<E> >, INode<Dim> >
{
  typedef typename NewEngineEngine<E, INode<Dim> >::Type_t Type_t;
  static inline
  Type_t apply(const Engine<Dim, T, FieldShift<E> > &e, const INode<Dim> &d)
  {
    return NewEngineEngine<E, INode<Dim> >::apply(e.exprEngine(),
                                                  e.viewDomain(d));
  }
};
template <int Dim, class T, class E>
struct NewEngineDomain<Engine<Dim, T, FieldShift<E> >, INode<Dim> >
{
  typedef typename NewEngineDomain<E, INode<Dim> >::Type_t Type_t;
  static inline
  Type_t apply(const Engine<Dim, T, FieldShift<E> > &e, const INode<Dim> &d)
  {
    return NewEngineDomain<E, INode<Dim> >::apply(e.exprEngine(),
                                                  e.viewDomain(d));
  }
};
template<class Expression>
struct FieldShiftSimple
{
  typedef typename Expression::MeshTag_t MeshTag_t;
  typedef typename Expression::Element_t OutputElement_t;
  enum { outputDim = Expression::dimensions };
  typedef typename Expression::Engine_t InputEngine_t;
  typedef FieldShift<InputEngine_t> OutputEngineTag_t;
  typedef Field<MeshTag_t, OutputElement_t, OutputEngineTag_t> Type_t;
  typedef Engine<outputDim, OutputElement_t, OutputEngineTag_t> SEngine_t;
  static inline
  Type_t make(const Expression &f,
       const FieldOffset<outputDim> &s1,
              const Centering<outputDim> &centering)
  {
    Type_t h(centering, f.layout(), f.mesh());
    h.fieldEngine().physicalCellDomain() = f.fieldEngine().physicalCellDomain();
    Expression fld =
      (f.numSubFields() > 1) ? f[s1.subFieldNumber()] : f;
    const Loc<outputDim> &offset = s1.cellOffset();
    GuardLayers<outputDim> og(fld.fieldEngine().guardLayers());
    for (int d = 0; d < outputDim; d++)
      {
 og.lower(d) += offset[d].first();
 og.upper(d) -= offset[d].first();
      }
    h.fieldEngine().guardLayers() = og;
    h.fieldEngine().engine() = SEngine_t(fld.engine(), offset, fld.domain());
    return h;
  }
  static inline
  Type_t make(const Expression &f,
       const std::vector<FieldOffset<outputDim> > &vs1,
              const Centering<outputDim> &centering)
  {
    typedef typename std::vector<FieldOffset<outputDim> >::size_type size_type;
    Type_t h(centering, f.layout(), f.mesh());
    h.fieldEngine().physicalCellDomain() = f.fieldEngine().physicalCellDomain();
    if (__builtin_expect(!!(vs1.size() == centering.size()), true)) {} else Pooma::toss_cookies("The FieldOffset vector's length must match the centering's size.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/DiffOps/FieldShiftEngine.h", 433);
    for (size_type s1Index = 0; s1Index < vs1.size(); ++s1Index) {
      const FieldOffset<outputDim> s1 = vs1[s1Index];
      Type_t hField = (h.numSubFields() > 1) ? h[s1Index] : h;
      Expression fld =
 (f.numSubFields() > 1) ? f[s1.subFieldNumber()] : f;
      const Loc<outputDim> &offset = s1.cellOffset();
      GuardLayers<outputDim> og(fld.fieldEngine().guardLayers());
      for (int d = 0; d < outputDim; d++)
 {
   og.lower(d) += offset[d].first();
   og.upper(d) -= offset[d].first();
 }
      hField.fieldEngine().guardLayers() = og;
      hField.fieldEngine().engine() =
 SEngine_t(fld.engine(), offset, fld.domain());
    }
    return h;
  }
};
template<class Expression>
struct EvaluatorEngineTraits<FieldShift<Expression> >
{
  typedef typename CreateLeaf<Expression>::Leaf_t Expr_t;
  typedef typename
    ForEach<Expr_t, EvaluatorTypeTag, EvaluatorCombineTag>::Type_t
      Evaluator_t;
};
template<int Dim, class Intersect>
class FieldShiftIntersector
{
public:
  typedef typename Intersect::IntersectorData_t IntersectorData_t;
  typedef FieldShiftIntersector<Dim, Intersect> This_t;
  typedef typename IntersectorData_t::const_iterator const_iterator;
  typedef RefCountedPtr<IntersectorData_t> DataPtr_t;
  typedef Interval<Dim> Domain_t;
  enum { dimensions = Intersect::dimensions };
  FieldShiftIntersector(const This_t &model)
    : domain_m(model.domain_m), intersector_m(model.intersector_m)
  { }
  FieldShiftIntersector(const Domain_t &dom, const Intersect &intersect)
    : domain_m(dom), intersector_m(intersect)
  { }
  This_t &operator=(const This_t &model)
  {
    if (this != &model)
    {
      domain_m = model.domain_m;
      intersector_m = model.intersector_m;
    }
    return *this;
  }
  ~FieldShiftIntersector() { }
  inline DataPtr_t &data() { return intersector_m.data(); }
  inline const DataPtr_t &data() const { return intersector_m.data(); }
  inline const_iterator begin() const { return data()->inodes_m.begin(); }
  inline const_iterator end() const { return data()->inodes_m.end(); }
  template<class Engine>
  inline void intersect(const Engine &engine)
  {
    typedef typename NewEngine<Engine, Interval<Dim> >::Type_t NewEngine_t;
    NewEngine_t newEngine(engine, domain_m);
    intersector_m.intersect(newEngine);
    data()->shared(engine.layout().ID(), newEngine.layout().ID());
  }
  template<class Engine, int Dim2>
  inline bool intersect(const Engine &engine, const GuardLayers<Dim2> &)
  {
    intersect(engine);
    return true;
  }
private:
  Interval<Dim> domain_m;
  Intersect intersector_m;
};
template <int Dim, class T, class Expression, class Intersect>
struct LeafFunctor<Engine<Dim, T, FieldShift<Expression> >,
  ExpressionApply<IntersectorTag<Intersect> > >
{
  typedef int Type_t;
  static
  int apply(const Engine<Dim, T, FieldShift<Expression> >
     &engine, const ExpressionApply<IntersectorTag<Intersect> > &tag)
  {
    typedef FieldShiftIntersector<Dim, Intersect> NewIntersector_t;
    NewIntersector_t newIntersector(engine.intersectDomain(),
        tag.tag().intersector_m);
    expressionApply(engine.field(),
      IntersectorTag<NewIntersector_t>(newIntersector));
    return 0;
  }
};
template<class RequestType> class DataObjectRequest;
template <int Dim, class T, class Expression, class RequestType>
struct EngineFunctor<Engine<Dim, T, FieldShift<Expression> >,
  DataObjectRequest<RequestType> >
{
  typedef typename DataObjectRequest<RequestType>::Type_t Type_t;
  static Type_t
  apply(const Engine<Dim, T, FieldShift<Expression> > &engine,
 const DataObjectRequest<RequestType> &tag)
  {
    return engineFunctor(engine.field().engine(), tag);
  }
};
template <int Dim, class T, class Expression, class Tag>
struct LeafFunctor<Engine<Dim, T, FieldShift<Expression> >,
  EngineView<Tag> >
{
  typedef LeafFunctor<Expression, EngineView<Tag> > LeafFunctor_t;
  typedef typename LeafFunctor_t::Type_t NewViewed_t;
  typedef Engine<Dim, T, FieldShift<NewViewed_t> > Type_t;
  static
  Type_t apply(const Engine<Dim, T,
        FieldShift<Expression> > &engine,
        const EngineView<Tag> &tag)
  {
    return Type_t(LeafFunctor_t::apply(engine.field(), tag), engine);
  }
};
template <int Dim, class T, class Expression, class Tag>
struct LeafFunctor<Engine<Dim, T, FieldShift<Expression> >,
                   ExpressionApply<Tag> >
{
  typedef LeafFunctor<Expression, ExpressionApply<Tag> > LeafFunctor_t;
  typedef int Type_t;
  static
  Type_t apply(const Engine<Dim, T,
        FieldShift<Expression> > &engine,
        const ExpressionApply<Tag> &tag)
  {
    return LeafFunctor_t::apply(engine.field(), tag);
  }
};
template<class MeshTag, class T, class EngineTag, int Dim>
struct View2<Field<MeshTag, T, EngineTag>, FieldOffset<Dim>,
             Centering<Dim> >
{
  typedef Field<MeshTag, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef Field<MeshTag, T, FieldShift<Engine_t> > ReadType_t;
  typedef Field<MeshTag, T, FieldShift<Engine_t> > Type_t;
  inline static
  Type_t make(const Subject_t &f, const FieldOffset<Dim> &s1,
              const Centering<Dim> &c)
  {
    PoomaCTAssert<(Dim == Subject_t::dimensions)>::test();
    return FieldShiftSimple<Subject_t>::make(f, s1, c);
  }
  inline static
  ReadType_t makeRead(const Subject_t &f, const FieldOffset<Dim> &s1,
                      const Centering<Dim> &c)
  {
    PoomaCTAssert<(Dim == Subject_t::dimensions)>::test();
    return FieldShiftSimple<Subject_t>::make(f, s1, c);
  }
};
template<class MeshTag, class T, class EngineTag, int Dim>
struct View2<Field<MeshTag, T, EngineTag>, std::vector<FieldOffset<Dim> >,
             Centering<Dim> >
{
  typedef Field<MeshTag, T, EngineTag> Subject_t;
  typedef typename Subject_t::Engine_t Engine_t;
  typedef Field<MeshTag, T, FieldShift<Engine_t> > ReadType_t;
  typedef Field<MeshTag, T, FieldShift<Engine_t> > Type_t;
  inline static
  Type_t make(const Subject_t &f,
       const std::vector<FieldOffset<Dim> > &s1,
              const Centering<Dim> &c)
  {
    PoomaCTAssert<(Dim == Subject_t::dimensions)>::test();
    return FieldShiftSimple<Subject_t>::make(f, s1, c);
  }
  inline static
  ReadType_t makeRead(const Subject_t &f,
        const std::vector<FieldOffset<Dim> > &s1,
                      const Centering<Dim> &c)
  {
    PoomaCTAssert<(Dim == Subject_t::dimensions)>::test();
    return FieldShiftSimple<Subject_t>::make(f, s1, c);
  }
};
template<class T, int Dim, class Accumulate>
class FieldOffsetReduction
{
public:
  typedef T OutputElement_t;
  const Centering<Dim> &outputCentering() const
  {
    return outputCentering_m;
  }
  const Centering<Dim> &inputCentering() const
  {
    return inputCentering_m;
  }
  int lowerExtent(int d) const { return lower_m[d]; }
  int upperExtent(int d) const { return upper_m[d]; }
  FieldOffsetReduction()
  {
  }
  FieldOffsetReduction(const FieldOffsetList<Dim> &neighbors,
                       const Centering<Dim> &outputCentering,
                       const Centering<Dim> &inputCentering,
                       Accumulate accumulate = Accumulate())
    : neighbors_m(neighbors),
      outputCentering_m(outputCentering),
      inputCentering_m(inputCentering),
      accumulate_m(accumulate)
  {
    if (__builtin_expect(!!(neighbors.size() > 0), true)) {} else Pooma::toss_cookies("no support for empty accumulation", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Field/DiffOps/FieldOffsetReduction.h", 115);
    ;
    int d, i;
    for (d = 0; d < Dim; ++d)
    {
      upper_m[d] = 0;
      lower_m[d] = 0;
    }
    for (i = 0; i < neighbors_m.size(); ++i)
    {
      for (d = 0; d < Dim; ++d)
      {
        if (-neighbors_m[i].cellOffset()[d].first() > lower_m[d])
        {
          lower_m[d] = -neighbors_m[i].cellOffset()[d].first();
        }
        if (neighbors_m[i].cellOffset()[d].first() > upper_m[d])
        {
          upper_m[d] = neighbors_m[i].cellOffset()[d].first();
        }
      }
    }
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1) const
  {
    T ret = f(neighbors_m[0], Loc<1>(i1));
    for (int i = 1; i < neighbors_m.size(); ++i)
    {
      ret = accumulate_m(ret, f(neighbors_m[i], Loc<1>(i1)));
    }
    return ret;
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2) const
  {
    T ret = f(neighbors_m[0], Loc<2>(i1, i2));
    for (int i = 1; i < neighbors_m.size(); ++i)
    {
      ret = accumulate_m(ret, f(neighbors_m[i], Loc<2>(i1, i2)));
    }
    return ret;
  }
  template<class F>
  inline OutputElement_t
  operator()(const F &f, int i1, int i2, int i3) const
  {
    T ret = f(neighbors_m[0], Loc<3>(i1, i2, i3));
    for (int i = 1; i < neighbors_m.size(); ++i)
    {
      ret = accumulate_m(ret, f(neighbors_m[i], Loc<3>(i1, i2, i3)));
    }
    return ret;
  }
private:
  FieldOffsetList<Dim> neighbors_m;
  Centering<Dim> outputCentering_m;
  Centering<Dim> inputCentering_m;
  Accumulate accumulate_m;
  int lower_m[Dim];
  int upper_m[Dim];
};
template<class GeometryTag, class T, class EngineTag, int Dim>
typename FieldStencilSimple<FieldOffsetReduction<T, Dim, OpAdd>,
                            Field<GeometryTag, T, EngineTag> >::Type_t
sum(const Field<GeometryTag, T, EngineTag> &f,
    const std::vector<FieldOffsetList<Dim> > &nn,
    const Centering<Dim> &outputCentering)
{
  typedef FieldOffsetReduction<T, Dim, OpAdd> Functor_t;
  typedef Field<GeometryTag, T, EngineTag> Field_t;
  return FieldStencilSimple<Functor_t, Field_t>::make(f, nn, outputCentering,
                                                      OpAdd());
}
template <int Dim>
struct Deltas
{
  static const DomainDelta<Dim, 0> dX;
  static const DomainDelta<Dim, 1> dY;
  static const DomainDelta<Dim, 2> dZ;
};
template <int Dim>
const DomainDelta<Dim, 0> Deltas<Dim>::dX;
template <int Dim>
const DomainDelta<Dim, 1> Deltas<Dim>::dY;
template <int Dim>
const DomainDelta<Dim, 2> Deltas<Dim>::dZ;
static const DomainDelta<3, 0> dX;
static const DomainDelta<3, 1> dY;
static const DomainDelta<3, 2> dZ;
template <int dim, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag>
struct SerialTraits {
  typedef MeshTag MeshTag_t;
  typedef CoordinateSystemTag CoordinateSystemTag_t;
  enum { Dim = dim };
  typedef DomainLayout<dim> Layout_t;
  typedef MeshTraits<dim, double, MeshTag, CoordinateSystemTag> MeshTraits_t;
  typedef typename MeshTraits_t::Mesh_t Mesh_t;
  typedef Brick Engine_t;
  typedef CompressibleBrick CompressibleEngine_t;
  static void createLayout(DomainLayout<Dim>& l,
      const Grid<Dim>&, const Interval<Dim>& domain,
      const GuardLayers<Dim>&, const GuardLayers<Dim>& egc)
  {
    l = DomainLayout<Dim>(domain, egc);
  }
};
template <int dim, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag>
struct ParallelTraits {
  typedef MeshTag MeshTag_t;
  typedef CoordinateSystemTag CoordinateSystemTag_t;
  enum { Dim = dim };
  typedef GridLayout<dim> Layout_t;
  typedef MeshTraits<dim, double, MeshTag, CoordinateSystemTag> MeshTraits_t;
  typedef typename MeshTraits_t::Mesh_t Mesh_t;
  typedef MultiPatch<GridTag, Remote<Brick> > Engine_t;
  typedef MultiPatch<GridTag, Remote<CompressibleBrick> > CompressibleEngine_t;
  static void createLayout(GridLayout<Dim>& l,
      const Grid<Dim>& grid, const Interval<Dim>&,
      const GuardLayers<Dim>& igc, const GuardLayers<Dim>& egc)
  {
    l = GridLayout<Dim>(grid, igc, egc, DistributedTag());
  }
};
template <int dim, class MeshTag = UniformRectilinearTag, class CoordinateSystemTag = CartesianTag>
struct SerialMPTraits {
  typedef MeshTag MeshTag_t;
  typedef CoordinateSystemTag CoordinateSystemTag_t;
  enum { Dim = dim };
  typedef GridLayout<dim> Layout_t;
  typedef MeshTraits<dim, double, MeshTag, CoordinateSystemTag> MeshTraits_t;
  typedef typename MeshTraits_t::Mesh_t Mesh_t;
  typedef MultiPatch<GridTag, Brick> Engine_t;
  typedef MultiPatch<GridTag, CompressibleBrick> CompressibleEngine_t;
  static void createLayout(GridLayout<Dim>& l,
      const Grid<Dim>& grid, const Interval<Dim>&,
      const GuardLayers<Dim>& igc, const GuardLayers<Dim>& egc)
  {
    l = GridLayout<Dim>(grid, igc, egc, DistributedTag());
  }
};
template <class ComputeTraits>
struct RhalkTraits : public ComputeTraits {
  typedef ComputeTraits ComputeTraits_t;
  typedef typename ComputeTraits::Layout_t Layout_t;
  typedef typename ComputeTraits::Mesh_t Mesh_t;
  typedef typename ComputeTraits::Engine_t Engine_t;
  typedef typename ComputeTraits::CompressibleEngine_t CompressibleEngine_t;
  enum { Dim = ComputeTraits::Dim };
  typedef Centering<Dim> Centering_t;
  typedef typename Mesh_t::PositionsType_t Positions_t;
  typedef typename Mesh_t::SpacingsType_t Spacings_t;
  typedef Interval<Dim> Domain_t;
  typedef Loc<Dim> Loc_t;
  typedef Field<Mesh_t, double, Engine_t> Scalar_t;
  typedef Field<Mesh_t, Vector<Dim, double>, Engine_t> Vector_t;
};
enum { Dim = 3 };
typedef RhalkTraits<ParallelTraits<Dim, UniformRectilinearTag, CartesianTag> > Traits_t;
extern GuardLayers<Dim> corr_v[Dim];
extern bool a_dump_debug_f;
inline void enable_fp_exceptions(void)
{
  fexcept_t f;
  fegetexceptflag(&f, FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW);
  fesetexceptflag(&f, FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW);
}
inline void disable_fp_exceptions(void)
{
  feclearexcept((FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID));
}
#include <fstream>
namespace Pooma {
Inform pinfo("Pooma");
Inform pwarn("Warning", std::cerr, Inform::allContexts);
Inform perr("Error", std::cerr, Inform::allContexts);
Inform pdebug("** Debug **", std::cerr, Inform::allContexts);
Context_t myContext_g = 0;
int numContexts_g = 1;
int expression_g = 0;
  namespace {
    bool initialized_s = false;
    bool weInitializedRTS_s = false, weInitializedArch_s = false;
    Options options_s;
    Scheduler_t mainScheduler_s;
    Statistics statistics_s;
    std::ofstream *logstream_s = 0;
    Inform::ID_t pinfoLogID_s;
    Inform::ID_t pwarnLogID_s;
    Inform::ID_t perrLogID_s;
    Inform::ID_t pdebugLogID_s;
    void defAbortHandler_s()
    {
      std::cerr << "In default abort handler." << std::endl;
    }
    AbortHandler_t currentAbortHandler_s = defAbortHandler_s;
    long reductionFilter_s(long val)
    {
      ReduceOverContexts<long, OpAddAssign> reduce(val, 0);
      return reduce;
    }
    void cleanup_s()
    {
      if (printStats())
        statistics_s.print(pinfo, reductionFilter_s);
      logMessages(0);
      infoMessages(false);
      warnMessages(false);
      errorMessages(false);
      debugLevel(Inform::off);
    }
  }
namespace { Pooma::StatisticsData *statNumExpressions_s = statistics_s.add("Number of expressions evaluated"); } void incrementNumExpressions(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumExpressions_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumZBExpressions_s = statistics_s.add("Number of zero-based expressions evaluated"); } void incrementNumZBExpressions(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumZBExpressions_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumMultiPatchExpressions_s = statistics_s.add("Number of multi-patch expressions evaluated"); } void incrementNumMultiPatchExpressions(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumMultiPatchExpressions_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumCompressedAssigns_s = statistics_s.add("Number of fully compressed assignments"); } void incrementNumCompressedAssigns(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumCompressedAssigns_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumAssignsRequiringUnCompression_s = statistics_s.add("Number of assignments requiring uncompression"); } void incrementNumAssignsRequiringUnCompression(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumAssignsRequiringUnCompression_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumInlineEvaluations_s = statistics_s.add("Number of assignments using the inline evaluator"); } void incrementNumInlineEvaluations(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumInlineEvaluations_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumLocalPatchesEvaluated_s = statistics_s.add("Number of local patches evaluated"); } void incrementNumLocalPatchesEvaluated(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumLocalPatchesEvaluated_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumReductions_s = statistics_s.add("Number of reductions performed"); } void incrementNumReductions(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumReductions_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumUnCompresses_s = statistics_s.add("Number of times a compressible block uncompresses"); } void incrementNumUnCompresses(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumUnCompresses_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumUnsuccessfulTryCompresses_s = statistics_s.add("Number of times a compression attempt fails"); } void incrementNumUnsuccessfulTryCompresses(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumUnsuccessfulTryCompresses_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumSuccessfulTryCompresses_s = statistics_s.add("Number of times a compression attempt succeeds"); } void incrementNumSuccessfulTryCompresses(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumSuccessfulTryCompresses_s->increment(val); mutex.unlock(); }
namespace { Pooma::StatisticsData *statNumPolls_s = statistics_s.add("Number of calls to Pooma::poll()"); } void incrementNumPolls(long val) { static Pooma::Mutex_t mutex; mutex.lock(); statNumPolls_s->increment(val); mutex.unlock(); }
bool initialize(int &argc, char ** &argv, bool initRTS, bool getCLArgsArch,
  bool initArch)
{
  if (getCLArgsArch)
    Pooma::Arch::getCommandLineArguments(argc, argv);
  Options opts(argc, argv);
  return initialize(opts, initRTS, initArch);
}
bool initialize(Options &opts, bool initRTS, bool initArch)
{
  if (__builtin_expect(!!(!initialized_s), true)) {} else Pooma::toss_cookies("You can only call Pooma::initialize once.", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Pooma/Pooma.cmpl.cpp", 306);
  initialized_s = true;
  weInitializedRTS_s = initRTS;
  weInitializedArch_s = initArch;
  if (initArch)
    Pooma::Arch::initialize();
  debugLevel(opts.debug());
  options_s = opts;
  if (initRTS)
  {
    Smarts::concurrency(opts.concurrency());
  }
  myContext_g = 0;
  numContexts_g = 1;
  logstream_s = 0;
  logMessages(opts.logfile().c_str());
  infoMessages(opts.printInfo());
  warnMessages(opts.printWarnings());
  errorMessages(opts.printErrors());
  Inform::setContext(myContext_g);
  Inform::setNumContexts(numContexts_g);
  return true;
}
bool finalize()
{
  return finalize(weInitializedRTS_s, weInitializedArch_s);
}
bool finalize(bool quitRTS, bool quitArch)
{
  Pooma::blockAndEvaluate();
  if (initialized_s)
  {
    Smarts::wait();
    cleanup_s();
    if (quitRTS)
    {
    }
  }
  if (quitArch)
    Pooma::Arch::finalize();
  return true;
}
void pAbort(int errorcode)
{
  pAbort("Pooma::pAbort called.", errorcode);
}
void pAbort(const char *msg, int)
{
  if (msg != 0)
    std::cerr << msg << std::endl;
  currentAbortHandler_s();
  if (initialized_s)
  {
    cleanup_s();
  }
  ::abort();
}
AbortHandler_t abortHandler()
{
  return currentAbortHandler_s;
}
AbortHandler_t abortHandler(AbortHandler_t ah)
{
  AbortHandler_t oldah = currentAbortHandler_s;
  currentAbortHandler_s = ah;
  return oldah;
}
AbortHandler_t resetAbortHandler()
{
  return abortHandler(defAbortHandler_s);
}
const char *version()
{
  ;
  return "FreePOOMA 2.4.devel";
}
int majorVersion()
{
  ;
  return 2;
}
int minorVersion()
{
  ;
  return 4;
}
const char *buildDate()
{
  ;
  return "Wed Mar 23 16:19:43 CET 2005";
}
bool printStats()
{
  ;
  return options_s.printStats();
}
void printStats(bool on)
{
  ;
  options_s.printStats(on);
}
bool infoMessages()
{
  ;
  return (pinfo.outputLevel() >= 0);
}
void infoMessages(bool on)
{
  ;
  pinfo.setOutputLevel(on ? Inform::on : Inform::off);
}
bool warnMessages()
{
  ;
  return (pwarn.outputLevel() >= 0);
}
void warnMessages(bool on)
{
  ;
  pwarn.setOutputLevel(on ? Inform::on : Inform::off);
}
bool errorMessages()
{
  ;
  return (perr.outputLevel() >= 0);
}
void errorMessages(bool on)
{
  ;
  perr.setOutputLevel(on ? Inform::on : Inform::off);
}
void logMessages(const char *filename)
{
  ;
  if (logstream_s != 0)
    {
      pinfo.close(pinfoLogID_s);
      pwarn.close(pwarnLogID_s);
      perr.close(perrLogID_s);
      pdebug.close(pdebugLogID_s);
      delete logstream_s;
      logstream_s = 0;
    }
  if (filename != 0 && *filename != 0)
    {
      logstream_s = new std::ofstream(filename, std::ios::out);
      pinfoLogID_s = pinfo.open(*logstream_s);
      pwarnLogID_s = pwarn.open(*logstream_s);
      perrLogID_s = perr.open(*logstream_s);
      pdebugLogID_s = pdebug.open(*logstream_s);
      pinfo.setOutputLevel(pinfo.outputLevel());
      pwarn.setOutputLevel(pwarn.outputLevel());
      perr.setOutputLevel(perr.outputLevel());
      pdebug.setOutputLevel(pdebug.outputLevel());
    }
}
int debugLevel()
{
  ;
  return pdebug.outputLevel();
}
void debugLevel(int level)
{
  ;
  pdebug.setOutputLevel(level);
}
bool neverCompress()
{
  ;
  return options_s.neverCompress();
}
void neverCompress(bool p)
{
  ;
  options_s.neverCompress(p);
}
bool deferredGuardFills()
{
  ;
  return options_s.deferredGuardFills();
}
void deferredGuardFills(bool p)
{
  ;
  options_s.deferredGuardFills(p);
}
Scheduler_t &scheduler()
{
  ;
  return mainScheduler_s;
}
void blockAndEvaluate()
{
  ;
  mainScheduler_s.blockingEvaluate();
}
bool hardInit()
{
  ;
  return options_s.hardInit();
}
void hardInit(bool on)
{
  ;
  options_s.hardInit(on);
}
bool hardRun()
{
  ;
  return options_s.hardRun();
}
void hardRun(bool on)
{
  ;
  options_s.hardRun(on);
}
bool lockThreads()
{
  ;
  return options_s.lockThreads();
}
void lockThreads(bool on)
{
  ;
  options_s.lockThreads(on);
}
bool blockingExpressions()
{
  ;
  return options_s.blockingExpressions();
}
void blockingExpressions(bool on)
{
  ;
  options_s.blockingExpressions(on);
}
}
extern "C" void pooma_stop_here();
void Pooma::stopHere()
{
  ::pooma_stop_here();
}
extern "C" void pooma_stop_here()
{
}
namespace Pooma {
class PatchSizeSyncer
{
public:
  typedef Grid<1> Grid_t;
  PatchSizeSyncer(int contextKey, Grid_t &localGrid);
  ~PatchSizeSyncer();
 void calcGlobalGrid(Grid_t &globalGrid);
private:
  int myContext_m;
  int numContexts_m;
  int localKey_m;
  Grid_t localGrid_m;
  typedef std::pair<int,Grid_t *> Elem_t;
  std::vector<Elem_t> gridList_m;
  PatchSizeSyncer(const PatchSizeSyncer &);
  PatchSizeSyncer &operator=(const PatchSizeSyncer &);
  static int tag_s;
};
}
template<class T>
class CollectFromContexts
{
public:
  CollectFromContexts(const T &val, int context = 0, bool valid = true)
    {
      ;
      ;
      value_m = val;
    }
  T &operator[](int i)
    {
      ;
      return value_m;
    }
  T operator[](int i) const
    {
      ;
      return value_m;
    }
private:
  T value_m;
};
namespace Pooma {
PatchSizeSyncer::PatchSizeSyncer(int contextKey, Grid_t &localGrid)
  : myContext_m(Pooma::context()),
    numContexts_m(Pooma::contexts()),
    localKey_m(contextKey),
    localGrid_m(localGrid)
{
  if (myContext_m == 0) gridList_m.reserve(numContexts_m);
}
PatchSizeSyncer::~PatchSizeSyncer()
{
  ;
  for (int i = 0; i < gridList_m.size(); ++i)
    delete gridList_m[i].second;
}
namespace {
struct ElemCompare
{
  typedef std::pair<int,Grid<1>*> Elem_t;
  inline bool operator()(const Elem_t &l, const Elem_t &r)
  {
    return l.first < r.first;
  }
};
}
void PatchSizeSyncer::calcGlobalGrid(Grid_t &globalGrid)
{
  globalGrid = localGrid_m;
}
}
TagGenerator tagGenerator_g;
namespace Pooma {
int expectedMessages_g = 0;
void initializeCheetahHelpers(int contexts)
{
  tagGenerator_g = TagGenerator(contexts);
  expectedMessages_g = 0;
}
void finalizeCheetahHelpers()
{
  ;
}
int sendTag(int context)
{
  return tagGenerator_g.send(context);
}
int receiveTag(int context)
{
  return tagGenerator_g.receive(context);
}
}
const unsigned int Inform::bufSize = 32000;
Pooma::Mutex_t Inform::outputMutex_s;
Inform::Context_t Inform::context_s = 0;
Inform::Context_t Inform::nContexts_s = 1;
class InformStream
{
public:
  InformStream(std::ostream *s, Inform::Context_t oc)
    : stream_m(s), close_m(false), outputContext_m(oc), level_m(0)
  {
    ;
  }
  InformStream(const char *fname, int mode, Inform::Context_t oc)
    : stream_m(0), close_m(true), outputContext_m(oc), level_m(0)
  {
    ;
    ;
    if (oc < 0 || oc == Inform::context()) {
      if (mode == Inform::out)
 stream_m = new std::ofstream(fname, std::ios::out);
      else
 stream_m = new std::ofstream(fname, std::ios::app);
    }
  }
  ~InformStream()
  {
    if (close_m && stream_m != 0)
      delete stream_m;
  }
  Inform::Context_t outputContext() const
  {
    return outputContext_m;
  }
  void setOutputContext(Inform::Context_t val)
  {
    outputContext_m = val;
  }
  Inform::Level_t outputLevel() const
  {
    return level_m;
  }
  void setOutputLevel(Inform::Level_t val)
  {
    level_m = val;
  }
  void print(Inform::Level_t l, const std::string &prefix, const char *msg)
  {
    if (shouldPrint(l))
      {
        if (prefix.length() > 0)
          {
            *stream_m << prefix;
            if (Inform::numContexts() > 1)
              {
                if ((outputContext_m == Inform::allContexts) ||
                    (outputContext_m == Inform::context()))
                  {
                    *stream_m << "{" << Inform::context() << "}";
                  }
              }
            *stream_m << "> ";
          }
        *stream_m << msg << "\n";
        stream_m->flush();
      }
  }
private:
  std::ostream *stream_m;
  bool close_m;
  Inform::Context_t outputContext_m;
  Inform::Level_t level_m;
  bool shouldPrint(Inform::Level_t level)
  {
    ;
    if (stream_m == 0)
      return false;
    return (level <= level_m &&
     (outputContext_m == Inform::context() ||
      outputContext_m == Inform::allContexts));
  }
};
namespace std {
  Inform &endl(Inform &inf)
  {
    inf.flush();
    return inf;
  }
  Inform &flush(Inform &inf)
  {
    inf.flush();
    return inf;
  }
  Inform &lock(Inform &inf)
  {
    inf.lock();
    return inf;
  }
  Inform &unlock(Inform &inf)
  {
    inf.unlock();
    return inf;
  }
}
Inform::Inform(const char *prefix, Context_t outputContext)
  : prefix_m(""), outputContext_m(outputContext), level_m(0),
    message_m(0), buffer_m(0), nextID_m(0)
{
  open(outputContext);
  setup(prefix);
}
Inform::Inform(const char *prefix, const char *fname, int writemode,
        Context_t outputContext)
  : prefix_m(""), outputContext_m(outputContext), level_m(0),
    message_m(0), buffer_m(0), nextID_m(0)
{
  open(fname, writemode, outputContext);
  setup(prefix);
}
Inform::Inform(const char *prefix, std::ostream &outstream,
               Context_t outputContext)
  : prefix_m(""), outputContext_m(outputContext), level_m(0),
    message_m(0), buffer_m(0), nextID_m(0)
{
  open(outstream, outputContext);
  setup(prefix);
}
Inform::~Inform()
{
  close();
  delete message_m;
  if (buffer_m != 0)
    delete [] buffer_m;
}
Inform::ID_t Inform::open(Context_t oc)
{
  streams_m.insert(Value_t(nextID_m, new InformStream(&std::cout, oc)));
  return nextID_m++;
}
Inform::ID_t Inform::open(const char *fname, int mode, Context_t oc)
{
  streams_m.insert(Value_t(nextID_m, new InformStream(fname, mode, oc)));
  return nextID_m++;
}
Inform::ID_t Inform::open(std::ostream &outstream, Context_t oc)
{
  streams_m.insert(Value_t(nextID_m, new InformStream(&outstream, oc)));
  return nextID_m++;
}
void Inform::close(ID_t id)
{
  iterator s = streams_m.find(id);
  ;
  delete ((*s).second);
  streams_m.erase(s);
}
void Inform::close()
{
  for (iterator a = streams_m.begin(); a != streams_m.end(); ++a)
    delete ((*a).second);
  streams_m.erase(streams_m.begin(), streams_m.end());
}
Inform::Level_t Inform::outputLevel(ID_t id) const
{
  InformStream *s = findStream(id);
  ;
  return s->outputLevel();
}
void Inform::setOutputLevel(Level_t newval, ID_t id)
{
  InformStream *s = findStream(id);
  ;
  s->setOutputLevel(newval);
}
void Inform::setOutputLevel(Level_t newval)
{
  for (iterator a = streams_m.begin(); a != streams_m.end(); ++a)
    (*a).second->setOutputLevel(newval);
}
Inform::Context_t Inform::outputContext(ID_t id) const
{
  InformStream *s = findStream(id);
  ;
  return s->outputContext();
}
void Inform::setOutputContext(Context_t outputContext, ID_t id)
{
  InformStream *s = findStream(id);
  ;
  s->setOutputContext(outputContext);
}
void Inform::setOutputContext(Context_t outputContext)
{
  for (iterator a = streams_m.begin(); a != streams_m.end(); ++a)
    (*a).second->setOutputContext(outputContext);
}
void Inform::flush()
{
  *message_m << std::ends;
  outputMutex_s.lock();
  std::string formatstr = message_m->str();
  char *outputbuf = new char[formatstr.length() + 2];
  char *endbuf = outputbuf;
  char *begbuf = outputbuf;
  const char *formatbuf = formatstr.c_str();
  do {
    while (*formatbuf != '\n' && *formatbuf != '\0')
      *endbuf++ = *formatbuf++;
    *endbuf = '\0';
    if (*formatbuf == '\n')
      ++formatbuf;
    for (iterator a = streams_m.begin(); a != streams_m.end(); ++a)
      (*a).second->print(level_m, prefix_m, begbuf);
    begbuf = endbuf;
  } while (*formatbuf != '\0');
  message_m->str( std::string() );
  delete [] outputbuf;
  outputMutex_s.unlock();
}
InformStream *Inform::findStream(ID_t id) const
{
  const_iterator s = streams_m.find(id);
  if (s != streams_m.end())
    return (*s).second;
  else
    return 0;
}
void Inform::setup(const char *prefix)
{
  setPrefix(prefix);
  buffer_m = 0;
  message_m = new std::ostringstream(std::ios::out);
}
void Inform::setPrefix(const char *prefix)
{
  if (prefix == 0 || *prefix == '\0')
    prefix_m = "";
  else
    prefix_m = prefix;
}
Pool::Pool(size_t sz)
  :
  head_m(0),
  outstandingAllocs_m(0),
  bsize_m(roundToAlign(sz)),
  nblock_m(blocksInPage(bsize_m))
{
}
Pool::Pool()
  :
  head_m(0),
  outstandingAllocs_m(0),
  bsize_m(0),
  nblock_m(0)
{
}
Pool::~Pool()
{
  if (__builtin_expect(!!(outstandingAllocs_m==0), true)) {} else Pooma::toss_cookies("Not all of the pooled memory was freed!", "/home/rguenth/ix86/pooma/tat-serial/pooma/linux/src/Utilities/Pool.cmpl.cpp", 73);
  for (std::vector<char*>::iterator p=chunks_m.begin(); p!=chunks_m.end(); ++p)
    delete [] *p;
}
void Pool::grow()
{
  size_t alloc_this;
  if ( bsize_m>page )
    alloc_this = bsize_m;
  else
    alloc_this = page;
  char *start = new char[alloc_this];
  chunks_m.push_back(start);
  char *last = start + (nblock_m-1)*bsize_m;
  for (char *p=start; p!=last; p+=bsize_m)
    ((Link*)p)->next_m = (Link*)(p+bsize_m);
  ((Link*)last)->next_m = head_m;
  head_m = (Link*)start;
}
//#include <execinfo.h>
namespace Pooma {
Assertion::Assertion(const char *msg, const char *file, int line)
{
  msg_m = new char[strlen(msg) + 1];
  strcpy(msg_m, msg);
  file_m = new char[strlen(file) + 1];
  strcpy(file_m, file);
  line_m = line;
}
Assertion::Assertion(const Assertion &a)
{
  msg_m = new char[strlen(a.what())+1];
  strcpy(msg_m, a.what());
  file_m = new char[strlen(a.file())+1];
  strcpy(file_m, a.file());
  line_m = a.line();
}
Assertion &Assertion::operator=(const Assertion &a)
{
  msg_m = new char[strlen(a.what())+1];
  strcpy(msg_m, a.what());
  file_m = new char[strlen(a.file())+1];
  strcpy(file_m, a.file());
  line_m = a.line();
  return *this;
}
void toss_cookies(const char *msg, const char *file, int line ...)
{
  va_list ap;
  va_start(ap,line);
  char buf[256];
  vsprintf(buf, msg, ap);
  va_end(ap);
  Assertion a(buf, file, line);
  Pooma::stopHere();
  fprintf(stderr, "### POOMA Assertion Failure on context %i ###\n", Pooma::context());
  fprintf(stderr, "### %s\n", a.what());
  fprintf(stderr, "### File %s; Line %d.\n", a.file(), a.line());
  Pooma::pAbort();
}
}
Unique::Value_t Unique::next_s = 0;
Pooma::Mutex_t Unique::mutex_s;
bool findLeftCommonEndpoint(int a0, int a1, int s, int b0, int b1, int t,
       int &endpoint)
{
  ;
  if (s < 0) s = -s;
  if (t < 0) t = -t;
  if (a0 > b0) {
    int tmp;
    tmp = a0; a0 = b0; b0 = tmp;
    tmp = a1; a1 = b1; b1 = tmp;
    tmp = s; s = t; t = tmp;
  }
  int i1 = b0 - ((b0 - a0) % s);
  int i2 = b0;
  int maxdiff = 0;
  int minright = a1;
  if (b1 < a1)
    minright = b1;
  while (i1 <= minright && i2 <= minright) {
    while (i1 < i2)
      i1 += s;
    int newdiff = i1 - i2;
    if (i1 == i2 || newdiff == maxdiff) {
      break;
    } else if (newdiff > maxdiff) {
      maxdiff = newdiff;
    }
    i2 += t;
  }
  if (i1 == i2 && i1 <= minright) {
    endpoint = i1;
    return true;
  } else {
    return false;
  }
}
int findLCM(int s, int t)
{
  ;
  int i1 = s, i2 = t;
  if (s > t) {
    s = t;
    t = i1;
    i1 = s;
    i2 = t;
  }
  while (i1 != i2) {
    while (i1 < i2)
      i1 += s;
    if (i1 > i2)
      i2 += t;
  }
  return i1;
}
bool findIntersectionEndpoints(int a0, int a1, int s, int b0, int b1, int t,
                               int &left, int &right, int &stride)
{
  ;
  if (s < 0) s = -s;
  if (t < 0) t = -t;
  if (!findLeftCommonEndpoint(a0, a1, s, b0, b1, t, left))
    return false;
  stride = findLCM(s, t);
  int m = a1;
  if (b1 < a1)
    m = b1;
  right = m - ((m - left) % stride);
  return true;
}
GlobalIDDataBase::NodeKey_t
GlobalIDDataBase::push(LayoutID_t layoutID, int context, GlobalID_t globalID)
{
  int ret = data_m.size();
  data_m.push_back(Pack(layoutID, context, globalID, nullNodeKey()));
  return ret;
}
GlobalIDDataBase::NodeKey_t
GlobalIDDataBase::push(LayoutID_t layoutID,
         int context,
         GlobalID_t globalID,
         NodeKey_t parentNode)
{
  int ret = data_m.size();
  data_m.push_back(Pack(layoutID, context, globalID, parentNode));
  return ret;
}
void
GlobalIDDataBase::shared(LayoutID_t idNew, LayoutID_t idOld)
{
  Shared_t::const_iterator p = shared_m.find(idOld);
  if (p != shared_m.end())
  {
    idOld = p->second;
  }
  Shared_t::value_type i(idNew, idOld);
  shared_m.insert(i);
}
GlobalIDDataBase::GlobalID_t
GlobalIDDataBase::globalID(LayoutID_t layoutID, NodeKey_t key) const
{
  Shared_t::const_iterator p = shared_m.find(layoutID);
  if (p != shared_m.end())
  {
    layoutID = p->second;
  }
  while( key != nullNodeKey() )
  {
    if (data_m[key].layoutID() == layoutID)
    {
      return data_m[key].globalID();
    }
    else
    {
      key = data_m[key].parent();
    }
  }
  ;
  return -1;
}
int
GlobalIDDataBase::context(LayoutID_t layoutID, NodeKey_t key) const
{
  Shared_t::const_iterator p = shared_m.find(layoutID);
  if (p != shared_m.end())
  {
    layoutID = p->second;
  }
  while( key != nullNodeKey() )
  {
    if (data_m[key].layoutID() == layoutID)
    {
      return data_m[key].context();
    }
    else
    {
      key = data_m[key].parent();
    }
  }
  ;
  return -1;
}
int
GlobalIDDataBase::context(NodeKey_t key) const
{
  ;
  return data_m[key].context();
}
bool
GlobalIDDataBase::contextParticipates(int context, NodeKey_t key) const
{
  while( key != nullNodeKey() )
  {
    if (data_m[key].context() == context)
    {
      return true;
    }
    else
    {
      key = data_m[key].parent();
    }
  }
  return false;
}
namespace Pooma {
  namespace {
    unsigned int activeGroups_g = 1;
    unsigned int numGroups_g = 1;
  }
  unsigned int activeRelationGroups()
    {
      return activeGroups_g;
    }
  bool isRelationGroupActive(unsigned int groups)
    {
      return (groups & activeGroups_g) != 0;
    }
  void activateRelationGroup(unsigned int group)
    {
      blockAndEvaluate();
      activeGroups_g |= group;
    }
  void deactivateRelationGroup(unsigned int group)
    {
      blockAndEvaluate();
      activeGroups_g &= ~group;
    }
  unsigned int newRelationGroup()
    {
      unsigned int n = (1 << numGroups_g++);
      activateRelationGroup(n);
      return n;
    }
}
template <int Dim>
CanonicalCentering<Dim>::CanonicalCentering()
{
  Centering<Dim> centering;
  typename Centering<Dim>::Orientation orientation;
  typename Centering<Dim>::Position position;
  typename Centering<Dim>::Orientations orientations[Dim][2];
  typename Centering<Dim>::Positions positions[Dim][2];
  enum { x = 0, y, z };
  if (class_count_m == 0) {
    centering_table_m = new Centering<Dim>**[CellType+1];
    for (int i = 0; i <= CellType; ++i) {
      centering_table_m[i] = new Centering<Dim>*[2];
      for (int j = 0; j < 2; ++j)
 centering_table_m[i][j] = new Centering<Dim>[1<<Dim];
    }
  }
  ++class_count_m;
  centering = Centering<Dim>(CellType, Continuous);
  orientation = 1;
  position = 0.5;
  centering.addValue(orientation, position);
  centering_table_m[CellType][Continuous][AllDim%(1<<Dim)] = centering;
  orientation = 0; orientation[0] = 1;
  position = 0.0; position(0) = 0.5;
  addValue(orientations[x][Continuous],
    positions[x][Continuous],
    orientation, position);
  orientations[x][Discontinuous] =
    orientations[x][Continuous];
  positions[x][Discontinuous] =
    positions[x][Continuous];
  if (Dim > 1) {
    position(1) = 1.0;
    addValue(orientations[x][Discontinuous],
      positions[x][Discontinuous],
      orientation, position);
    if (Dim > 2) {
      position(2) = 1.0;
      addValue(orientations[x][Discontinuous],
        positions[x][Discontinuous],
        orientation, position);
      position(1) = 0.0;
      addValue(orientations[x][Discontinuous],
        positions[x][Discontinuous],
        orientation, position);
    }
  }
  if (Dim > 1) {
    orientation = 0; orientation[1] = 1;
    position = 0.0; position(1) = 0.5;
    addValue(orientations[y][Continuous],
      positions[y][Continuous],
      orientation, position);
    orientations[y][Discontinuous] =
      orientations[y][Continuous];
    positions[y][Discontinuous] =
      positions[y][Continuous];
    position(0) = 1.0;
    addValue(orientations[y][Discontinuous],
      positions[y][Discontinuous],
      orientation, position);
    if (Dim > 2) {
      position(2) = 1.0;
      addValue(orientations[y][Discontinuous],
        positions[y][Discontinuous],
        orientation, position);
      position(0) = 0.0;
      addValue(orientations[y][Discontinuous],
        positions[y][Discontinuous],
        orientation, position);
    }
  }
  if (Dim > 2) {
    orientation = 0; orientation[2] = 1;
    position = 0.0; position(2) = 0.5;
    addValue(orientations[z][Continuous],
      positions[z][Continuous],
      orientation, position);
    orientations[z][Discontinuous] =
      orientations[z][Continuous];
    positions[z][Discontinuous] =
      positions[z][Continuous];
    position(0) = 1.0;
    addValue(orientations[z][Discontinuous],
      positions[z][Discontinuous],
      orientation, position);
    position(1) = 1.0;
    addValue(orientations[z][Discontinuous],
      positions[z][Discontinuous],
      orientation, position);
    position(0) = 0.0;
    addValue(orientations[z][Discontinuous],
      positions[z][Discontinuous],
      orientation, position);
  }
  for (int cont = 0; cont < 2; ++cont) {
    centering_table_m[EdgeType][cont][XDim] =
      Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
       orientations[x][cont], positions[x][cont]);
    if (Dim > 1) {
      centering_table_m[EdgeType][cont][YDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         orientations[y][cont], positions[y][cont]);
      centering_table_m[EdgeType][cont][XDim|YDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],orientations[y][cont]),
         combine(positions[x][cont], positions[y][cont]));
    }
    if (Dim > 2) {
      centering_table_m[EdgeType][cont][ZDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         orientations[z][cont], positions[z][cont]);
      centering_table_m[EdgeType][cont][XDim|ZDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],orientations[z][cont]),
         combine(positions[x][cont], positions[z][cont]));
      centering_table_m[EdgeType][cont][YDim|ZDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         combine(orientations[y][cont],orientations[z][cont]),
         combine(positions[y][cont], positions[z][cont]));
      centering_table_m[EdgeType][cont][XDim|YDim|ZDim] =
 Centering<Dim>(EdgeType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],
          combine(orientations[y][cont],orientations[z][cont])),
         combine(positions[x][cont],
          combine(positions[y][cont], positions[z][cont])));
    }
  }
  for (int dim = 0; dim < Dim; ++dim)
    for (int cont = 0; cont < 2; ++cont)
      {
 orientations[dim][cont].clear();
 positions[dim][cont].clear();
      }
  orientation = 1; orientation[0] = 0;
  position = 0.5; position(0) = 0.0;
  addValue(orientations[x][Continuous],
    positions[x][Continuous],
    orientation, position);
  orientations[x][Discontinuous] =
    orientations[x][Continuous];
  positions[x][Discontinuous] =
    positions[x][Continuous];
  position(0) = 1.0;
  addValue(orientations[x][Discontinuous],
    positions[x][Discontinuous],
    orientation, position);
  if (Dim > 1) {
    orientation = 1; orientation[1] = 0;
    position = 0.5; position(1) = 0.0;
    addValue(orientations[y][Continuous],
      positions[y][Continuous],
      orientation, position);
    orientations[y][Discontinuous] =
      orientations[y][Continuous];
    positions[y][Discontinuous] =
      positions[y][Continuous];
    position(1) = 1.0;
    addValue(orientations[y][Discontinuous],
      positions[y][Discontinuous],
      orientation, position);
  }
  if (Dim > 2) {
    orientation = 1; orientation[2] = 0;
    position = 0.5; position(2) = 0.0;
    addValue(orientations[z][Continuous],
      positions[z][Continuous],
      orientation, position);
    orientations[z][Discontinuous] =
      orientations[z][Continuous];
    positions[z][Discontinuous] =
      positions[z][Continuous];
    position(2) = 1.0;
    addValue(orientations[z][Discontinuous],
      positions[z][Discontinuous],
      orientation, position);
  }
  for (int cont = 0; cont < 2; ++cont) {
    centering_table_m[FaceType][cont][XDim] =
      Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
       orientations[x][cont], positions[x][cont]);
    if (Dim > 1) {
      centering_table_m[FaceType][cont][XDim|YDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],orientations[y][cont]),
         combine(positions[x][cont], positions[y][cont]));
      centering_table_m[FaceType][cont][YDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         orientations[y][cont], positions[y][cont]);
    }
    if (Dim > 2) {
      centering_table_m[FaceType][cont][ZDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         orientations[z][cont], positions[z][cont]);
      centering_table_m[FaceType][cont][XDim|ZDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],orientations[z][cont]),
         combine(positions[x][cont], positions[z][cont]));
      centering_table_m[FaceType][cont][YDim|ZDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         combine(orientations[y][cont],orientations[z][cont]),
         combine(positions[y][cont], positions[z][cont]));
      centering_table_m[FaceType][cont][XDim|YDim|ZDim] =
 Centering<Dim>(FaceType, static_cast<enum ContinuityType>(cont),
         combine(orientations[x][cont],
          combine(orientations[y][cont],orientations[z][cont])),
         combine(positions[x][cont],
          combine(positions[y][cont], positions[z][cont])));
    }
  }
  for (int dim = 0; dim < Dim; ++dim)
    for (int cont = 0; cont < 2; ++cont)
      {
 orientations[dim][cont].clear();
 positions[dim][cont].clear();
      }
  centering = Centering<Dim>(VertexType, Continuous);
  orientation = 0;
  position = 0.0;
  centering.addValue(orientation, position);
  centering_table_m[VertexType][Continuous][AllDim%(1<<Dim)] =
    centering;
  centering = Centering<Dim>(VertexType, Discontinuous);
  orientation = 0;
  position = 0.0;
  centering.addValue(orientation, position);
  position(0) = 1.0; centering.addValue(orientation, position);
  if (Dim > 1) {
    position(1) = 1.0; centering.addValue(orientation, position);
    position(0) = 0.0; centering.addValue(orientation, position);
    if (Dim > 2) {
      position(2) = 1.0; centering.addValue(orientation, position);
      position(0) = 1.0; centering.addValue(orientation, position);
      position(1) = 0.0; centering.addValue(orientation, position);
      position(0) = 0.0; centering.addValue(orientation, position);
    }
  }
  centering_table_m[VertexType][Discontinuous][AllDim%(1<<Dim)] =
    centering;
  return;
}
const CanonicalCentering<1> canonicalCenteringOne_g;
const CanonicalCentering<2> canonicalCenteringTwo_g;
const CanonicalCentering<3> canonicalCenteringThree_g;
template <int Dim>
const Centering<Dim> canonicalCentering
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension);
template <>
const Centering<1> canonicalCentering<1>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension)
{
  return canonicalCenteringOne_g(type, discontinuous, dimension);
}
template <>
const Centering<2> canonicalCentering<2>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension)
{
  return canonicalCenteringTwo_g(type, discontinuous, dimension);
}
template <>
const Centering<3> canonicalCentering<3>
    (const enum CenteringType type,
     const enum ContinuityType discontinuous,
     const int dimension)
{
  return canonicalCenteringThree_g(type, discontinuous, dimension);
}
template class CanonicalCentering<1>;
template class CanonicalCentering<2>;
template class CanonicalCentering<3>;
void UniformMapper::map(const List_t& templist) const
{
  int contexts = Pooma::contexts();
  int npc = blocks_m.first() / contexts;
  int remainder = blocks_m.first() % contexts;
  int index = 0;
  for (int c=0; c<contexts; ++c)
  {
    for (int i=0; i<npc; ++i)
      templist[index++]->context() = c;
    if (c < remainder)
      templist[index++]->context() = c;
  }
  setAffinity(templist);
}
namespace Pooma {
Options::Options()
{
  reset();
}
Options::Options(int &argc, char ** argv)
{
  reset();
  parse(argc, argv);
}
Options::Options(const Options &opts)
{
  *this = opts;
}
Options &Options::operator=(const Options &opts)
{
  concurrency_m = opts.concurrency();
  info_m = opts.printInfo();
  warn_m = opts.printWarnings();
  err_m = opts.printErrors();
  logfile_m = opts.logfile();
  stats_m = opts.printStats();
  debug_m = opts.debug();
  neverCompress_m = opts.neverCompress();
  deferredFills_m = opts.deferredGuardFills();
  hardinit_m = opts.hardInit();
  hardrun_m = opts.hardRun();
  lockthreads_m = opts.lockThreads();
  blockingExpressions_m = opts.blockingExpressions();
  return *this;
}
Options::~Options()
{
}
void Options::usage()
{
  Inform msg("POOMA Usage", std::cerr);
  msg << ">>>-----------------------------------<<<\n";
  msg << ">>> POOMA command-line option summary <<<\n";
  msg << ">>>-----------------------------------<<<\n";
  msg << "Standard options:\n";
  msg << "--pooma-threads <N> ......... set concurrency level (N >= 1)\n";
  msg << "--pooma-info ................ turn on output of info messages\n";
  msg << "--pooma-warn ................ turn on output of warning messages\n";
  msg << "--pooma-err ................. turn on output of error messages\n";
  msg << "--pooma-log <file> .......... turn on logging of output to <file>\n";
  msg << "--pooma-stats ............... turn on output of stats at end\n";
  msg << "--pooma-nocompress .......... disable compression of\n";
  msg << "                              compressible brick-engines\n";
  msg << "--pooma-help ................ print out this summary\n";
  msg << "Developer options:\n";
  msg << "--pooma-debug <N> ........... set debug output level to <N>\n";
  msg << "--pooma-smarts-hardinit\n";
  msg << "--pooma-smarts-hardrun\n";
  msg << "--pooma-smarts-lockthreads\n";
  msg << "--pooma-blocking-expressions\n";
  msg << "All options exist as \"yes\" and \"no\" pairs.\n";
  msg << "For example --pooma-info and --pooma-noinfo.\n";
  msg << "The \"no\" versions listed above imply that \"yes\" is the default.";
  msg << std::endl;
}
void Options::reset()
{
  concurrency_m = 1;
  info_m = true;
  warn_m = true;
  err_m = true;
  logfile_m = "";
  stats_m = false;
  debug_m = Inform::off;
  neverCompress_m = false;
  deferredFills_m = true;
  hardinit_m = true;
  hardrun_m = false;
  lockthreads_m = false;
  blockingExpressions_m = false;
}
void Options::parse(int &argc, char ** &argv)
{
  if (argc < 2)
    return;
  int retargc = 1;
  char **retargv = new char *[argc];
  retargv[0] = argv[0];
  int i = 1;
  while (i < argc)
    {
      bool argok = true;
      bool argvalerr = false;
      std::string word(argv[i]);
      if (word == "--pooma-threads")
 {
   argok = intArgument(argc, argv, i+1, concurrency_m);
   argvalerr = (concurrency_m < 1);
   ++i;
 }
      else if (word == "--pooma-nothreads")
 {
   concurrency_m = 1;
 }
      else if (word == "--pooma-info" || word == "--pooma-noinfo")
 {
   info_m = (word == "--pooma-info");
 }
      else if (word == "--pooma-nocompress" || word == "--pooma-compress")
 {
   neverCompress_m = (word == "--pooma-nocompress");
 }
      else if (word == "--pooma-nodeferred-guardfills" ||
               word == "--pooma-deferred-guardfills")
 {
   deferredFills_m = (word == "--pooma-deferred-guardfills");
 }
      else if (word == "--pooma-warn" || word == "--pooma-nowarn")
 {
   warn_m = (word == "--pooma-warn");
 }
      else if (word == "--pooma-err" || word == "--pooma-noerr")
 {
   err_m = (word == "--pooma-err");
 }
      else if (word == "--pooma-stats" || word == "--pooma-nostats")
 {
   stats_m = (word == "--pooma-stats");
 }
      else if (word == "--pooma-log")
 {
   argok = stringArgument(argc, argv, i+1, logfile_m);
   ++i;
 }
      else if (word == "--pooma-debug")
 {
   argok = intArgument(argc, argv, i+1, debug_m);
   ++i;
 }
      else if (word == "--pooma-nodebug")
 {
   debug_m = Inform::off;
 }
      else if (word == "--pooma-smarts-hardinit")
 {
   hardinit_m = true;
 }
      else if (word == "--pooma-smarts-nohardinit")
 {
   hardinit_m = false;
 }
      else if (word == "--pooma-smarts-hardrun")
 {
   hardrun_m = true;
 }
      else if (word == "--pooma-smarts-nohardrun")
 {
   hardrun_m = false;
 }
      else if (word == "--pooma-smarts-lockthreads")
 {
   lockthreads_m = true;
 }
      else if (word == "--pooma-smarts-nolockthreads")
 {
   lockthreads_m = false;
 }
      else if (word == "--pooma-blocking-expressions")
 {
   blockingExpressions_m = true;
 }
      else if (word == "--pooma-noblocking-expressions")
 {
   blockingExpressions_m = false;
 }
      else if (word == "--pooma-help")
 {
   usage();
   exit(0);
 }
      else
 {
   retargv[retargc++] = argv[i];
 }
      if (!argok)
 {
   std::cerr << "\nERROR: Bad format for POOMA command-line option '";
   std::cerr << word.c_str() << "'.\n" << std::endl;
   usage();
   exit(0);
 }
      if (argvalerr)
 {
   std::cerr << "\n";
   std::cerr << "ERROR: Illegal value for POOMA command-line option '";
   std::cerr << word.c_str() << "'.\n" << std::endl;
   usage();
   exit(0);
 }
      ++i;
    }
  argc = retargc;
  for (i = 0; i < retargc; ++i) argv[i] = retargv[i];
  delete [] retargv;
}
bool intArgument(int argc, char **argv, int pos, int &val)
{
  if (pos >= argc)
    return false;
  char firstchar = argv[pos][0];
  if (firstchar < '0' || firstchar > '9')
    {
      if ((firstchar != '-' && firstchar != '+') || argv[pos][1] == 0 ||
   (argv[pos][1] < '0' || argv[pos][1] > '9'))
 return false;
    }
  val = atoi(argv[pos]);
  return true;
}
bool stringArgument(int argc, char **argv, int pos, std::string &val)
{
  if (pos >= argc)
    return false;
  val = argv[pos];
  return true;
}
bool doubleArgument(int argc, char **argv, int pos, double &val)
{
  if (pos >= argc)
    return false;
  val = atof(argv[pos]);
  return true;
}
}
namespace Pooma {
Statistics::Statistics()
{
}
Statistics::~Statistics()
{
  for (int i = 0; i < statList_m.size(); ++i)
    {
      delete statList_m[i];
    }
}
long Statistics::defaultFilter(long val)
{
  return val;
}
void Statistics::print(Inform &o, long (*filter)(long))
{
  int i, j;
  if (statList_m.size() == 0)
    return;
  o << "Runtime statistics summary:" << std::endl;
  for (i = 0; i < statList_m.size(); ++i)
    {
      o << statList_m[i]->description() << " ";
      int numperiods = 53 - strlen(statList_m[i]->description().c_str());
      if (numperiods < 2)
        numperiods = 2;
      for (j = 0; j < numperiods; ++j)
        o << ".";
      o << " " << std::setw(12) << filter(statList_m[i]->value()) << std::endl;
    }
}
}
namespace EOS {
  typedef enum {
    IdealAdiabatic = 0,
    Last = 4
  } Eos_t;
  struct pg_ig
  {
    pg_ig() {}
    template <class F1>
    pg_ig(const pg_ig& f, const F1&) {}
    template <class F1, class F2, class F3, class F4>
    void operator()(const F1& pg, const F2& T, const F3& rh, const F4& xmue) const
    {
      Interval<F1::dimensions> I = pg.totalDomain();
      pg(I) = (T*rh/xmue)(I);
    }
  };
  struct cs_adiabatic
  {
    cs_adiabatic() {}
    cs_adiabatic(double gamma) : gamma_m(gamma) {}
    template <class F>
    cs_adiabatic(const cs_adiabatic& f, const F&)
      : gamma_m(f.gamma_m) {}
    template <class F1, class F2, class F3>
    void operator()(const F1& cs, const F2& pg, const F3& rh) const
    {
      Interval<F1::dimensions> I = cs.totalDomain();
      cs(I) = (sqrt(gamma_m * pg/rh))(I);
    }
    double gamma_m;
  };
}
namespace Hacks {
  struct limit_rh
  {
    limit_rh() {}
    limit_rh(double rhomin) : rhomin_m(rhomin) {}
    template <class F>
    limit_rh(const limit_rh& l, const F&) : rhomin_m(l.rhomin_m) {}
    template <class F>
    void operator()(const F& rh);
    double rhomin_m;
  };
  template <class F>
  void checkRegularity(const F& f);
};
namespace Hacks {
  template <class F>
  void limit_rh::operator()(const F& rh)
  {
    Interval<F::dimensions> I = rh.physicalDomain();
    rh(I) = where(rh(I) < rhomin_m, rhomin_m);
  }
  template <int Dim>
  struct CheckRegularity {
    CheckRegularity() {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 1> &i) const
    {
      i.write(0, false);
      i.useGuards(0, false);
    }
    template <class F1>
    inline void operator()(const F1 &f, const Loc<Dim>& I) const
    {
      if (std::isnan(f(I)))
 Pooma::pAbort("NaN detected");
      if (std::isinf(f(I)))
 Pooma::pAbort("Inf detected");
    }
  };
  template <class F>
  void checkRegularity(const F& f)
  {
    ScalarCode<CheckRegularity<F::dimensions> >()(f);
  }
};
namespace CFL {
  template <int Dim>
  struct CflFunctor : public Deltas<Dim> {
    CflFunctor(double omrot, bool vis) : omrot_m(omrot), vis_m(vis) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
    {
      for (int d=0; d<Dim; ++d)
 i.extent().upper(d) = 1;
      i.write(0, true, false);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.useGuards(1, false);
      i.useGuards(2, false);
      i.useGuards(3, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4>
    inline void operator()(const F1 &dt, const F2 &cs, const F3 &nue, const F4 &v,
      const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = dt.mesh();
      double dtmin = m.vertexSpacing(0, I[0].first()+1)
 / (std::max(fabs(v.fieldEngine().engine(0, 0).read(I)), fabs(v.fieldEngine().engine(0, 0).read(I+dX)))
    + cs.read(I));
      if (Dim > 1)
 dtmin = std::min(dtmin,
    m.vertexSpacing(1, I[1].first()+1)
    / (std::max(fabs(v.fieldEngine().engine(0, 1).read(I)), fabs(v.fieldEngine().engine(0, 1).read(I+dY)))
       + cs.read(I)/m.GEOXG(I)));
      if (Dim > 2)
 dtmin = std::min(dtmin,
    m.vertexSpacing(2, I[2].first()+1)
    / (std::max(fabs(v.fieldEngine().engine(0, 2).read(I))+omrot_m, fabs(v.fieldEngine().engine(0, 2).read(I+dZ))+omrot_m)
       + cs.read(I)/(m.GEOXH(I)*m.GEOYH(I))));
 dt(I) = dtmin;
    }
    const double omrot_m;
    const bool vis_m;
  };
  template <int Dim, class F1, class F2, class F3, class F4>
  double schritt(const F1 &v, const F2 &cs, const F3 &nue,
   const F4 &scratch, double omrot, bool vis_f)
  {
    Interval<Dim> I(cs.physicalDomain());
    ScalarCode<CflFunctor<Dim> >(CflFunctor<Dim>(omrot, vis_f))(scratch, I, cs, nue, v);
    return min(scratch(I));
  }
}
GuardLayers<Dim> corr_v[Dim];
Interval<Dim> vertexDomain;
Vector<Dim> origin;
Traits_t::Spacings_t spacings;
double gamma_, K, cartvis_nr, cartvis_av;
Vector<2> smooth;
std::string commandline;
Vector<Dim, int> periodicity;
std::vector<Loc<Dim> > dump_points;
EOS::Eos_t eos;
bool a_nr_f = false;
int a_nr = std::numeric_limits<int>::max();
bool a_end_t_f = false;
double a_end_t = std::numeric_limits<double>::max();
bool a_blocks_f = false;
Loc<Dim> a_blocks;
bool a_cfl_f = false;
double a_cfl = 0.5;
bool a_constant_timestep_f = false;
double dt;
bool a_min_dt_f = false;
double a_min_dt = 0.0;
bool a_max_dt_f = false;
double a_max_dt = std::numeric_limits<double>::max();
bool a_cartvis_f = false;
bool a_eos_f = false;
EOS::Eos_t a_eos;
bool a_rhomin_f = false;
double a_rhomin = 1e-6;
namespace Adv5 {
  template<class F1, class F2, class F3, class F4, class F5, class F6, class F7, class F8, class F9>
  void advect(double dt,
       const F1 &rh, const F2 &v, double omrot_, const F3 &T,
       const F4 &flm, const F5 &fle, const F6 &flvv,
       const F7 &flvc, const F8 &cv, const F9 &ekin,
       bool eeq, bool ietot);
}
namespace Adv5 {
  template <int Dim>
  struct Ekin : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &ekin, const F2 &v, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = ekin.mesh();
      double ek = (v.fieldEngine().engine(0, 0).read(I)+v.fieldEngine().engine(0, 0).read(I+dX)) * (v.fieldEngine().engine(0, 0).read(I)+v.fieldEngine().engine(0, 0).read(I+dX));
      if (Dim > 1)
 ek += (v.fieldEngine().engine(0, 1).read(I)+v.fieldEngine().engine(0, 1).read(I+dY)) * (v.fieldEngine().engine(0, 1).read(I)+v.fieldEngine().engine(0, 1).read(I+dY)) * std::pow(m.GEOXG(I), 2);
      if (Dim > 2)
 ek += (v.fieldEngine().engine(0, 2).read(I)+v.fieldEngine().engine(0, 2).read(I+dZ)) * (v.fieldEngine().engine(0, 2).read(I)+v.fieldEngine().engine(0, 2).read(I+dZ)) * std::pow(m.GEOXH(I)*m.GEOYH(I), 2);
      ekin(I) = ek / 8.0;
    }
  };
  template <int Dim>
  struct VelupdX : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent().lower(0) = 1;
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &vx, const F2 &rh, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vx(I) = vx(I)
 / (m.DDX1(I)*rh(I)+m.DDX0(I)*rh(I-dX));
    }
  };
  template <int Dim>
  struct VelupdY : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent().lower(1) = 1;
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &vy, const F2 &rh, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vy(I) = vy(I)
 / ((m.DDY1(I)*rh(I)+m.DDY0(I)*rh(I-dY))
    * std::pow(m.GEOXG(I), 2));
    }
  };
  template <int Dim>
  struct VelupdZ : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent().lower(2) = 1;
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &vz, const F2 &rh, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vz(I) = vz(I)
 / ((m.DDZ1(I)*rh(I)+m.DDZ0(I)*rh(I-dZ))
    * std::pow(m.GEOXH(I),2) * std::pow(m.GEOYH(I),2));
    }
  };
  namespace X {
    template <int Dim>
    struct Massflow : public Deltas<Dim> {
      Massflow(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(0) = 2;
 i.extent().upper(0) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flmx, const F2 &rh, const F3 &vx, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 double s = vx(I)*dt;
 Loc<Dim> IND = s > 0.0 ? I-dX : I;
 double grad1 = (rh(IND)-rh(IND-dX)) * (rh(IND+dX)-rh(IND));
 double grad = grad1 > 0.0
   ? 2.0*grad1 / ((rh(IND)-rh(IND-dX))*m.cellSpacing(IND+dX)(0)
    + (rh(IND+dX)-rh(IND))*m.cellSpacing(IND)(0))
   : 0.0;
 flmx(I) = (m.SURXA(I)-m.CCXA(I)*s) * s
   * (rh(IND)
      + (m.vertexPosition(I)(0) - m.cellPosition(IND)(0) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux : public Deltas<Dim> {
      Energyflux(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(0) = 2;
 i.extent().upper(0) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
 i.useGuards(3, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flex, const F2 &T, const F3 &vx, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = vx(I)*dt;
 IND = s > 0.0 ? I-dX : I;
 ddm1 = T(IND-dX);
 dd = T(IND);
 ddp1 = T(IND+dX);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(0)
    + (dd-ddm1)*m.cellSpacing(IND+dX)(0))
   : 0.0;
 flex(I) = flmx(I)
   * (dd + (m.vertexPosition(I)(0) - m.cellPosition(IND)(0) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxX : public Deltas<Dim> {
      MomentumfluxX(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(0) = 1;
 i.extent().upper(0) = 2;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flx, const F2 &vx, const F3 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (vx(I) + vx(I+dX)) * 0.5*dt;
 IND = s > 0.0 ? I : I+dX;
 ddm1 = vx(IND-dX);
 dd = vx(IND);
 ddp1 = vx(IND+dX);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.vertexSpacing(IND)(0)
    + (dd-ddm1)*m.vertexSpacing(IND+dX)(0))
   : 0.0;
 flx(I) = 0.5*(flmx(I) + flmx(I+dX))
   * (dd + (m.cellPosition(I)(0) - m.vertexPosition(IND)(0) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxY : public Deltas<Dim> {
      MomentumfluxY(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(0) = 2;
 i.extent().upper(0) = 1;
 i.extent().lower(1) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vx, const F3 &vy, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDY1(I)*vx(I) + m.DDY0(I)*vx(I-dY)) * dt;
 IND = s > 0.0 ? I-dX : I;
 ddm1 = vy(IND-dX) * std::pow(m.GEOXG(IND-dX), 2);
 dd = vy(IND) * std::pow(m.GEOXG(IND), 2);
 ddp1 = vy(IND+dX) * std::pow(m.GEOXG(IND+dX), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(0)
    + (dd-ddm1)*m.cellSpacing(IND+dX)(0))
   : 0.0;
 flx(I) = (m.DDY1(I)*flmx(I) + m.DDY0(I)*flmx(I-dY))
   * (dd + (m.vertexPosition(I)(0) - m.cellPosition(IND)(0) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxZ : public Deltas<Dim> {
      MomentumfluxZ(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(0) = 2;
 i.extent().upper(0) = 1;
 i.extent().lower(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vx, const F3 &vz, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDZ1(I)*vx(I)
      + m.DDZ0(I)*vx(I-dZ)) * dt;
 IND = s > 0.0 ? I-dX : I;
 ddm1 = vz.read(IND-dX)
   * std::pow(m.GEOXH(IND-dX), 2) * std::pow(m.GEOYH(I), 2);
 dd = vz.read(IND)
   * std::pow(m.GEOXH(IND), 2) * std::pow(m.GEOYH(I), 2);
 ddp1 = vz.read(IND+dX)
   * std::pow(m.GEOXH(IND+dX), 2) * std::pow(m.GEOYH(I), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(0)
    + (dd-ddm1)*m.cellSpacing(IND+dX)(0))
   : 0.0;
 flx(I) = (m.DDZ1(I)*flmx(I) + m.DDZ0(I)*flmx(I-dZ))
   * (dd + (m.vertexPosition(I)(0) - m.cellPosition(IND)(0) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux2 : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(0) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, false);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &T, const F2 &rh, const F3 &flex,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 T(I) = T(I)*rh(I)
   - (flex(I+dX) - flex(I)) / m.VOLXB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2X : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(0) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vx, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vx(I) = vx(I)
   * (m.DDX1(I)*rh(I)+m.DDX0(I)*rh(I-dX))
   - (flx(I) - flx(I-dX)) / m.VOLXA(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Y : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(0) = 1;
 i.extent().lower(1) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vy, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vy(I) = vy(I) * std::pow(m.GEOXG(I), 2)
   * (m.DDY1(I)*rh(I)+m.DDY0(I)*rh(I-dY))
   - (flx(I+dX) - flx(I)) / m.VOLXB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Z : public Deltas<Dim> {
      Momentumflux2Z(double omrot) : omrot_m(omrot) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(0) = 1;
 i.extent().lower(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vz, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vz(I) = (vz(I) + omrot_m) * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2)
   * (m.DDZ1(I)*rh(I)+m.DDZ0(I)*rh(I-dZ))
   - (flx(I+dX) - flx(I)) / m.VOLXB(I);
      }
      const double omrot_m;
    };
    template <int Dim>
    struct Densupd : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
      {
 i.extent().upper(0) = 1;
 i.write(0, true);
 i.write(1, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
      }
      using Deltas<Dim>::dX;
      template <class F1, class F2>
      inline void operator()(const F1 &rh, const F2 &flmx, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 rh(I) = rh(I) - (flmx(I+dX)-flmx(I))/m.VOLXB(I);
      }
    };
    template<int Dim, class F1, class F2, class F3, class F4, class F5, class F6, class F7, class F8, class F9>
    inline
    void advect(double dt,
  const F1 &rh, const F2 &v, const F3 &T,
  const F4 &flm, const F5 &fle, const F6 &flvv, const F7 &flvc,
  const F8 &cv, const F9 &ekin,
  double omrot, bool eeq, bool ietot)
    {
      (ScalarCode<Massflow<Dim> >(dt))(flm.center(0),
           rh, v.center(0));
      if (eeq) {
 if (ietot) {
   Interval<Dim> I(T.physicalDomain());
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = (cv*T + ekin)(I);
 }
 (ScalarCode<Energyflux<Dim> >(dt))(fle.center(0),
        T, v.center(0), flm.center(0));
 ScalarCode<Energyflux2<Dim> >()(T, T.physicalDomain(),
     rh, fle.center(0));
      }
      (ScalarCode<MomentumfluxX<Dim> >(dt))(flvc,
         v.center(0), flm.center(0));
      if (Dim > 1)
 (ScalarCode<MomentumfluxY<Dim> >(dt))(flvv.comp(1), shrink(flvv.physicalDomain(), corr_v[1]),
           v.center(0), v.center(1), flm.center(0));
      if (Dim > 2)
 (ScalarCode<MomentumfluxZ<Dim> >(dt))(flvv.comp(2), shrink(flvv.physicalDomain(), corr_v[2]),
           v.center(0), v.center(2)+omrot, flm.center(0));
      ScalarCode<Momentumflux2X<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
      rh, flvc);
      if (Dim > 1)
 ScalarCode<Momentumflux2Y<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
        rh, flvv.comp(1));
      if (Dim > 2)
 (ScalarCode<Momentumflux2Z<Dim> >(omrot))(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
        rh, flvv.comp(2));
      ScalarCode<Densupd<Dim> >()(rh, rh.physicalDomain(), flm.center(0));
      ScalarCode<VelupdX<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]), rh);
      if (Dim > 1)
 ScalarCode<VelupdY<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]), rh);
      if (Dim > 2) {
 ScalarCode<VelupdZ<Dim> >()(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]), rh);
 if (omrot != 0.0)
   v.center(2)(shrink(v.center(2).physicalDomain(), corr_v[2])) -= omrot;
      }
      if (eeq) {
 Interval<Dim> I(T.physicalDomain());
 if (!ietot)
   T(I) = (T / rh)(I);
 else {
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = ((T / rh - ekin)/cv)(I);
 }
      }
    }
  };
  namespace Y {
    template <int Dim>
    struct Massflow : public Deltas<Dim> {
      Massflow(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(1) = 2;
 i.extent().upper(1) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flmx, const F2 &rh, const F3 &vy, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 double s = vy(I)*dt;
 Loc<Dim> IND = s > 0.0 ? I-dY : I;
 double grad1 = (rh(IND)-rh(IND-dY)) * (rh(IND+dY)-rh(IND));
 double grad = grad1 > 0.0
   ? 2.0*grad1 / ((rh(IND)-rh(IND-dY))*m.cellSpacing(IND+dY)(1)
    + (rh(IND+dY)-rh(IND))*m.cellSpacing(IND)(1))
   : 0.0;
 flmx(I) = (m.SURYA(I)+m.CCYA(I)*s) * s
   * (rh(IND)
      + (m.vertexPosition(I)(1) - m.cellPosition(IND)(1) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux : public Deltas<Dim> {
      Energyflux(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(1) = 2;
 i.extent().upper(1) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
 i.useGuards(3, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flex, const F2 &T, const F3 &vy, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = vy(I)*dt;
 IND = s > 0.0 ? I-dY : I;
 ddm1 = T(IND-dY);
 dd = T(IND);
 ddp1 = T(IND+dY);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(1)
    + (dd-ddm1)*m.cellSpacing(IND+dY)(1))
   : 0.0;
 flex(I) = flmx(I)
   * (dd + (m.vertexPosition(I)(1) - m.cellPosition(IND)(1) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxX : public Deltas<Dim> {
      MomentumfluxX(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(0) = 1;
 i.extent().lower(1) = 2;
 i.extent().upper(1) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vy, const F3 &vx, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDX1(I)*vy(I) + m.DDX0(I)*vy(I-dX)) * dt;
 IND = s > 0.0 ? I-dY : I;
 ddm1 = vx(IND-dY);
 dd = vx(IND);
 ddp1 = vx(IND+dY);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(1)
    + (dd-ddm1)*m.cellSpacing(IND+dY)(1))
   : 0.0;
 flx(I) = (m.DDX1(I)*flmx(I) + m.DDX0(I)*flmx(I-dX))
   * (dd + (m.vertexPosition(I)(1) - m.cellPosition(IND)(1) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxY : public Deltas<Dim> {
      MomentumfluxY(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(1) = 1;
 i.extent().upper(1) = 2;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flx, const F2 &vy, const F3 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (vy(I) + vy(I+dY)) * 0.5 * dt;
 IND = s > 0.0 ? I : I+dY;
 ddm1 = vy(IND-dY) * std::pow(m.GEOXG(I), 2);
 dd = vy(IND) * std::pow(m.GEOXG(I), 2);
 ddp1 = vy(IND+dY) * std::pow(m.GEOXG(I), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.vertexSpacing(IND)(1)
    + (dd-ddm1)*m.vertexSpacing(IND+dY)(1))
   : 0.0;
 flx(I) = 0.5*(flmx(I) + flmx(I+dY))
   * (dd + (m.cellPosition(I)(1) - m.vertexPosition(IND)(1) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxZ : public Deltas<Dim> {
      MomentumfluxZ(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(1) = 2;
 i.extent().upper(1) = 1;
 i.extent().lower(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vy, const F3 &vz, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDZ1(I)*vy(I)
      + m.DDZ0(I)*vy(I-dZ)) * dt;
 IND = s > 0.0 ? I-dY : I;
 ddm1 = vz.read(IND-dY)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(IND-dY), 2);
 dd = vz.read(IND)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(IND), 2);
 ddp1 = vz.read(IND+dY)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(IND+dY), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(1)
    + (dd-ddm1)*m.cellSpacing(IND+dY)(1))
   : 0.0;
 flx(I) = (m.DDZ1(I)*flmx(I) + m.DDZ0(I)*flmx(I-dZ))
   * (dd + (m.vertexPosition(I)(1) - m.cellPosition(IND)(1) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux2 : public Deltas<Dim> {
      Energyflux2() {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(1) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, false);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dY;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &T, const F2 &rh, const F3 &flex,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 T(I) = T(I)*rh(I)
   - (flex(I+dY) - flex(I)) / m.VOLYB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2X : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(0) = 1;
 i.extent().upper(1) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vx, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vx(I) = vx(I)
   * (m.DDX1(I)*rh(I)+m.DDX0(I)*rh(I-dX))
   - (flx(I+dY) - flx(I)) / m.VOLYB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Y : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(1) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vy, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vy(I) = vy(I) * std::pow(m.GEOXG(I), 2)
   * (m.DDY1(I)*rh(I)+m.DDY0(I)*rh(I-dY))
   - (flx(I) - flx(I-dY)) / m.VOLYA(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Z : public Deltas<Dim> {
      Momentumflux2Z(double omrot) : omrot_m(omrot) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(1) = 1;
 i.extent().lower(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vz, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vz(I) = (vz(I)+omrot_m) * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2)
   * (m.DDZ1(I)*rh(I)+m.DDZ0(I)*rh(I-dZ))
   - (flx(I+dY) - flx(I)) / m.VOLYB(I);
      }
      const double omrot_m;
    };
    template <int Dim>
    struct Densupd : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
      {
 i.extent().upper(1) = 1;
 i.write(0, true);
 i.write(1, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
      }
      using Deltas<Dim>::dY;
      template <class F1, class F2>
      inline void operator()(const F1 &rh, const F2 &flmx, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 rh(I) = rh(I) - (flmx(I+dY)-flmx(I))/m.VOLYB(I);
      }
    };
    template<int Dim, class F1, class F2, class F3, class F4, class F5, class F6, class F7, class F8, class F9>
    inline
    void advect(double dt,
  const F1 &rh, const F2 &v, const F3 &T,
  const F4 &flm, const F5 &fle, const F6 &flvv, const F7 &flvc,
  const F8 &cv, const F9 &ekin,
  double omrot, bool eeq, bool ietot)
    {
      (ScalarCode<Massflow<Dim> >(dt))(flm.center(1),
           rh, v.center(1));
      if (eeq) {
 if (ietot) {
   Interval<Dim> I(T.physicalDomain());
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = (cv*T + ekin)(I);
 }
 (ScalarCode<Energyflux<Dim> >(dt))(fle.center(1),
        T, v.center(1), flm.center(1));
 ScalarCode<Energyflux2<Dim> >()(T, T.physicalDomain(),
     rh, fle.center(1));
      }
      (ScalarCode<MomentumfluxX<Dim> >(dt))(flvv.comp(0), shrink(flvv.physicalDomain(), corr_v[0]),
         v.center(1), v.center(0), flm.center(1));
      if (Dim > 1)
 (ScalarCode<MomentumfluxY<Dim> >(dt))(flvc,
           v.center(1), flm.center(1));
      if (Dim > 2)
 (ScalarCode<MomentumfluxZ<Dim> >(dt))(flvv.comp(2), shrink(flvv.physicalDomain(), corr_v[2]),
           v.center(1), v.center(2)+omrot, flm.center(1));
      ScalarCode<Momentumflux2X<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
      rh, flvv.comp(0));
      if (Dim > 1)
 ScalarCode<Momentumflux2Y<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
        rh, flvc);
      if (Dim > 2)
 (ScalarCode<Momentumflux2Z<Dim> >(omrot))(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
        rh, flvv.comp(2));
      ScalarCode<Densupd<Dim> >()(rh, rh.physicalDomain(), flm.center(1));
      ScalarCode<VelupdX<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]), rh);
      if (Dim > 1)
 ScalarCode<VelupdY<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]), rh);
      if (Dim > 2) {
 ScalarCode<VelupdZ<Dim> >()(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]), rh);
 if (omrot != 0.0)
   v.center(2)(shrink(v.center(2).physicalDomain(), corr_v[2])) -= omrot;
      }
      if (eeq) {
 Interval<Dim> I(T.physicalDomain());
 if (!ietot)
   T(I) = (T / rh)(I);
 else {
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = ((T / rh - ekin)/cv)(I);
 }
      }
    }
  };
  namespace Z {
    template <int Dim>
    struct Massflow : public Deltas<Dim> {
      Massflow(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(2) = 2;
 i.extent().upper(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flmx, const F2 &rh, const F3 &vz, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 double s = vz(I)*dt;
 Loc<Dim> IND = s > 0.0 ? I-dZ : I;
 double grad1 = (rh(IND)-rh(IND-dZ)) * (rh(IND+dZ)-rh(IND));
 double grad = grad1 > 0.0
   ? 2.0*grad1 / ((rh(IND)-rh(IND-dZ))*m.cellSpacing(IND+dZ)(2)
    + (rh(IND+dZ)-rh(IND))*m.cellSpacing(IND)(2))
   : 0.0;
 flmx(I) = (m.SURZA(I)-m.CCZA(I)*s) * s
   * (rh(IND)
      + (m.vertexPosition(I)(2) - m.cellPosition(IND)(2) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux : public Deltas<Dim> {
      Energyflux(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(2) = 2;
 i.extent().upper(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, false);
 i.useGuards(3, false);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flex, const F2 &T, const F3 &vz, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = vz(I)*dt;
 IND = s > 0.0 ? I-dZ : I;
 ddm1 = T(IND-dZ);
 dd = T(IND);
 ddp1 = T(IND+dZ);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(2)
    + (dd-ddm1)*m.cellSpacing(IND+dZ)(2))
   : 0.0;
 flex(I) = flmx(I)
   * (dd + (m.vertexPosition(I)(2) - m.cellPosition(IND)(2) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxX : public Deltas<Dim> {
      MomentumfluxX(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(0) = 1;
 i.extent().lower(2) = 2;
 i.extent().upper(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vz, const F3 &vx, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDX1(I)*vz(I) + m.DDX0(I)*vz(I-dX)) * dt;
 IND = s > 0.0 ? I-dZ : I;
 ddm1 = vx(IND-dZ);
 dd = vx(IND);
 ddp1 = vx(IND+dZ);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(2)
    + (dd-ddm1)*m.cellSpacing(IND+dZ)(2))
   : 0.0;
 flx(I) = (m.DDX1(I)*flmx(I) + m.DDX0(I)*flmx(I-dX))
   * (dd + (m.vertexPosition(I)(2) - m.cellPosition(IND)(2) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxY : public Deltas<Dim> {
      MomentumfluxY(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
      {
 i.extent().lower(1) = 1;
 i.extent().lower(2) = 2;
 i.extent().upper(2) = 1;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.write(3, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
 i.useGuards(3, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3, class F4>
      inline void operator()(const F1 &flx, const F2 &vz, const F3 &vy, const F4 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (m.DDY1(I)*vz(I)
      + m.DDY0(I)*vz(I-dY)) * dt;
 IND = s > 0.0 ? I-dZ : I;
 ddm1 = vy(IND-dZ) * std::pow(m.GEOXG(I), 2);
 dd = vy(IND) * std::pow(m.GEOXG(I), 2);
 ddp1 = vy(IND+dZ) * std::pow(m.GEOXG(I), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.cellSpacing(IND)(2)
    + (dd-ddm1)*m.cellSpacing(IND+dZ)(2))
   : 0.0;
 flx(I) = (m.DDY1(I)*flmx(I) + m.DDY0(I)*flmx(I-dY))
   * (dd + (m.vertexPosition(I)(2) - m.cellPosition(IND)(2) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct MomentumfluxZ : public Deltas<Dim> {
      MomentumfluxZ(double dt_) : dt(dt_) {}
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(2) = 1;
 i.extent().upper(2) = 2;
 i.write(0, true, false);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      double dt;
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &flx, const F2 &vz, const F3 &flmx,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = flx.mesh();
 Loc<Dim> IND = Pooma::NoInit();
 double s, ddm1, dd, ddp1, grad1, grad;
 s = (vz(I) + vz(I+dZ)) * 0.5*dt;
 IND = s > 0.0 ? I : I+dZ;
 ddm1 = vz(IND-dZ)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2);
 dd = vz(IND)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2);
 ddp1 = vz(IND+dZ)
   * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2);
 grad1 = (dd-ddm1)*(ddp1-dd);
 grad = grad1 > 0.0
   ? 2.0*grad1 / ((ddp1-dd)*m.vertexSpacing(IND)(2)
    + (dd-ddm1)*m.vertexSpacing(IND+dZ)(2))
   : 0.0;
 flx(I) = 0.5*(flmx(I) + flmx(I+dZ))
   * (dd + (m.cellPosition(I)(2) - m.vertexPosition(IND)(2) - 0.5*s) * grad);
      }
    };
    template <int Dim>
    struct Energyflux2 : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().upper(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, false);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &T, const F2 &rh, const F3 &flex,
        const Loc<Dim>& I) const
      {
 const typename F3::Mesh_t &m = T.mesh();
 T(I) = T(I)*rh(I)
   - (flex(I+dZ) - flex(I)) / m.VOLZB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2X : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(0) = 1;
 i.extent().upper(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vx, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vx(I) = vx(I)
   * (m.DDX1(I)*rh(I)+m.DDX0(I)*rh(I-dX))
   - (flx(I+dZ) - flx(I)) / m.VOLZA(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Y : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(1) = 1;
 i.extent().upper(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vy, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vy(I) = vy(I) * std::pow(m.GEOXG(I), 2)
   * (m.DDY1(I)*rh(I)+m.DDY0(I)*rh(I-dY))
   - (flx(I+dZ) - flx(I)) / m.VOLZB(I);
      }
    };
    template <int Dim>
    struct Momentumflux2Z : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 3> &i) const
      {
 i.extent().lower(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.write(2, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
 i.useGuards(2, true);
      }
      using Deltas<Dim>::dX;
      using Deltas<Dim>::dY;
      using Deltas<Dim>::dZ;
      template <class F1, class F2, class F3>
      inline void operator()(const F1 &vz, const F2 &rh, const F3 &flx,
        const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 vz(I) = vz(I) * std::pow(m.GEOXH(I), 2) * std::pow(m.GEOYH(I), 2)
   * (m.DDZ1(I)*rh(I)+m.DDZ0(I)*rh(I-dZ))
   - (flx(I) - flx(I-dZ)) / m.VOLZB(I);
      }
    };
    template <int Dim>
    struct Densupd : public Deltas<Dim> {
      inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
      {
 i.extent().upper(2) = 1;
 i.write(0, true);
 i.write(1, false);
 i.useGuards(0, false);
 i.useGuards(1, true);
      }
      using Deltas<Dim>::dZ;
      template <class F1, class F2>
      inline void operator()(const F1 &rh, const F2 &flmx, const Loc<Dim>& I) const
      {
 const typename F1::Mesh_t &m = rh.mesh();
 rh(I) = rh(I) - (flmx(I+dZ)-flmx(I))/m.VOLZB(I);
      }
    };
    template<int Dim, class F1, class F2, class F3, class F4, class F5, class F6, class F7, class F8, class F9>
    inline
    void advect(double dt,
  const F1 &rh, const F2 &v, const F3 &T,
  const F4 &flm, const F5 &fle, const F6 &flvv, const F7 &flvc,
  const F8 &cv, const F9 &ekin,
  bool eeq, bool ietot)
    {
      (ScalarCode<Massflow<Dim> >(dt))(flm.center(2),
           rh, v.center(2));
      if (eeq) {
 if (ietot) {
   Interval<Dim> I(T.physicalDomain());
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = (cv*T + ekin)(I);
 }
 (ScalarCode<Energyflux<Dim> >(dt))(fle.center(2),
        T, v.center(2), flm.center(2));
 ScalarCode<Energyflux2<Dim> >()(T, T.physicalDomain(), rh, fle.center(2));
      }
      (ScalarCode<MomentumfluxX<Dim> >(dt))(flvv.comp(0), shrink(flvv.physicalDomain(), corr_v[0]),
         v.center(2), v.center(0), flm.center(2));
      if (Dim > 1)
 (ScalarCode<MomentumfluxY<Dim> >(dt))(flvv.comp(1), shrink(flvv.physicalDomain(), corr_v[1]),
           v.center(2), v.center(1), flm.center(2));
      if (Dim > 2)
 (ScalarCode<MomentumfluxZ<Dim> >(dt))(flvc,
           v.center(2), flm.center(2));
      ScalarCode<Momentumflux2X<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
      rh, flvv.comp(0));
      if (Dim > 1)
 ScalarCode<Momentumflux2Y<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
        rh, flvv.comp(1));
      if (Dim > 2)
 ScalarCode<Momentumflux2Z<Dim> >()(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
        rh, flvc);
      ScalarCode<Densupd<Dim> >()(rh, rh.physicalDomain(), flm.center(2));
      ScalarCode<VelupdX<Dim> >()(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]), rh);
      if (Dim > 1)
 ScalarCode<VelupdY<Dim> >()(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]), rh);
      if (Dim > 2)
 ScalarCode<VelupdZ<Dim> >()(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]), rh);
      if (eeq) {
 Interval<Dim> I(T.physicalDomain());
 if (!ietot)
   T(I) = (T / rh)(I);
 else {
   ScalarCode<Ekin<Dim> >()(ekin, v);
   T(I) = ((T / rh - ekin)/cv)(I);
 }
      }
    }
  };
  template <class CoordinateSystemTag>
  double omrotForAdvect(double omrot) { return omrot; }
  template <>
  double omrotForAdvect<CartesianTag>(double omrot) { return 0.0; }
  template<class F1, class F2, class F3, class F4, class F5, class F6, class F7, class F8, class F9>
  void advect(double dt,
       const F1 &rh, const F2 &v, double omrot_, const F3 &T,
       const F4 &flm, const F5 &fle, const F6 &flvv,
       const F7 &flvc, const F8 &cv, const F9 &ekin,
       bool eeq, bool ietot)
  {
    static int it = 0;
    enum { Dim = F1::dimensions };
    double omrot = omrotForAdvect<typename F1::Mesh_t::MeshTraits_t::CoordinateSystemTag_t>(omrot_);
    if (it++ % 2 == 0) {
      X::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, omrot, eeq, ietot);
      Y::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, omrot, eeq, ietot);
      Z::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, eeq, ietot);
    } else {
      Z::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, eeq, ietot);
      Y::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, omrot, eeq, ietot);
      X::advect<Dim>(dt, rh, v, T, flm, fle, flvv, flvc, cv, ekin, omrot, eeq, ietot);
    }
  }
};
namespace Forgas {
  template <class F1, class F2, class F3, class F4, class F5,
     class F6, class F7, class F8, class F9, class F10,
     class F11, class F12, class F13,
     class F14, class F15, class F16, class F17>
  void force(double dt, const F1 &rh, F2 &T, F3 &v, double omrot, F4 &pg, const F5 &ph,
      const F11& cs, const F6 &cv, const F7 &dlmdlt, const F8 &xmue,
      const F9 &vint, F10 &cent, const F12 &a_pg, const F13 &gradv,
      const F14 &Tii, const F15 &Tij, const F16 &fvis, const F17 &eta, bool vis,
      double c_nr, bool cartvis_f, bool eeq);
  template <class F1, class F2, class F3, class F4, class F5,
     class F6, class F7, class F8, class F9, class F10, class F11,
     class F12, class F13, class F14, class F15>
  void force(double dt, const F1 &rh, const F2 &T, const F3 &v, double omrot, F4 &pg, const F5 &ph,
      const F11 &cs, const F6 &cv, const F7 &dlmdlt, const F8 &xmue,
      const F9 &vint, const F10 &cent,
      const F12 &Tii, const F13 &Tij, const F14 &fvis, const F15 &eta, bool vis,
      double c_nr, double c_av, bool cartvis_f, bool eeq);
}
namespace Forgas {
template <class F>
struct IsSpherical {
  enum { result = false };
};
template <template <class> class Mesh, int Dim, class MeshTag, class T, class E>
struct IsSpherical<Field<Mesh<MeshTraits<Dim, T, MeshTag, SphericalTag> >, T, E> > {
  enum { result = true };
};
template <class F>
static bool isSpherical()
{
  return IsSpherical<F>::result;
}
template <class F>
struct IsNotCartesian {
  enum { result = true };
};
template <template <class> class Mesh, int Dim, class MeshTag, class T, class E>
struct IsNotCartesian<Field<Mesh<MeshTraits<Dim, T, MeshTag, CartesianTag> >, T, E> > {
  enum { result = false };
};
template <class F>
static bool isNotCartesian()
{
  return IsNotCartesian<F>::result;
}
template <class CAV>
struct ViscTii : public Deltas<3> {
  ViscTii(const CAV& av) : c_av(av) {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 4> &i) const
  {
    i.extent(GuardLayers<3>(Loc<3>(0), Loc<3>(1)));
    i.write(0, true);
    i.write(1, false);
    i.write(2, false);
    i.write(3, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
    i.useGuards(2, false);
    i.useGuards(3, false);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2, class F3, class F4>
  inline void operator()(const F1 &T, const F2 &v, const F4 &rh, const F3 &eta,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = T.mesh();
    double divu = ((m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX) - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I))/m.VOLXB(I)
     + (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY) - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I))/m.VOLYB(I)
     + (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ) - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I))/m.VOLZB(I));
    T(I)(0) = 2.0 * eta.read(I) * rh.read(I)
      * ((v.fieldEngine().engine(0, 0).read(I+dX) - v.fieldEngine().engine(0, 0).read(I))/m.vertexSpacing(I+dX)(0)
  - 1.0/3.0 * divu)
      - rh.read(I)*c_av*std::pow(std::min(divu, 0.0)*m.vertexSpacing(I)(0), 2);
    T(I)(1) = 2.0 * eta.read(I) * rh.read(I)
      * ((v.fieldEngine().engine(0, 1).read(I+dY) - v.fieldEngine().engine(0, 1).read(I))/m.vertexSpacing(I+dY)(1)
  + (isSpherical<F1>() ? (v.fieldEngine().engine(0, 0).read(I) + v.fieldEngine().engine(0, 0).read(I+dX))/(2.0*m.cellPosition(I)(0)) : 0.0)
  - 1.0/3.0 * divu)
      - rh.read(I)*c_av*std::pow(std::min(divu, 0.0)*m.vertexSpacing(I)(0), 2);
    T(I)(2) = 2.0 * eta.read(I) * rh.read(I)
      * ((v.fieldEngine().engine(0, 2).read(I+dZ) - v.fieldEngine().engine(0, 2).read(I))/m.vertexSpacing(I+dZ)(2)
  + (isNotCartesian<F1>() ? 0.5 * (v.fieldEngine().engine(0, 0).read(I) + v.fieldEngine().engine(0, 0).read(I+dX))/m.cellPosition(I)(0) : 0.0)
  - (isSpherical<F1>() ? 0.5 * (v.fieldEngine().engine(0, 1).read(I) + v.fieldEngine().engine(0, 1).read(I+dY))/tan(m.cellPosition(I)(1)) : 0.0)
  - 1.0/3.0 * divu)
      - rh.read(I)*c_av*std::pow(std::min(divu, 0.0)*m.vertexSpacing(I)(0), 2);
  }
  CAV c_av;
};
struct Txy : public Deltas<3> {
  Txy() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 2> &i) const
  {
    i.extent().lower(0) = 1;
    i.extent().lower(1) = 1;
    i.write(0, true);
    i.write(1, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2>
  inline void operator()(const F1 &T, const F2 &v,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = T.mesh();
    T(I) = (v.fieldEngine().engine(0, 1).read(I) - v.fieldEngine().engine(0, 1).read(I-dX)) * m.GEOXGA(I) / m.cellSpacing(I)(0)
      + (v.fieldEngine().engine(0, 0).read(I) - v.fieldEngine().engine(0, 0).read(I-dY)) / (m.GEOXGA(I) * m.cellSpacing(I)(1));
  }
};
struct Txz : public Deltas<3> {
  Txz() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 2> &i) const
  {
    i.extent().lower(0) = 1;
    i.extent().lower(2) = 1;
    i.write(0, true);
    i.write(1, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2>
  inline void operator()(const F1 &T, const F2 &v,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = T.mesh();
    T(I) = (v.fieldEngine().engine(0, 2).read(I) - v.fieldEngine().engine(0, 2).read(I-dX)) * m.GEOXH(I) * m.GEOYH(I) / m.cellSpacing(I)(0)
      + (v.fieldEngine().engine(0, 0).read(I) - v.fieldEngine().engine(0, 0).read(I-dZ)) / (m.GEOXH(I) * m.GEOYH(I) * m.cellSpacing(I)(2));
  }
};
struct Tyz : public Deltas<3> {
  Tyz() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 2> &i) const
  {
    i.extent().lower(1) = 1;
    i.extent().lower(2) = 1;
    i.write(0, true);
    i.write(1, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2>
  inline void operator()(const F1 &T, const F2 &v,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = T.mesh();
    T(I) = (v.fieldEngine().engine(0, 2).read(I) - v.fieldEngine().engine(0, 2).read(I-dY)) * m.GEOYHA(I) / m.cellSpacing(I)(1)
      + (v.fieldEngine().engine(0, 1).read(I) - v.fieldEngine().engine(0, 1).read(I-dZ)) / (m.GEOYHA(I) * m.cellSpacing(I)(2));
  }
};
struct ViscForceX : public Deltas<3> {
  ViscForceX() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 3> &i) const
  {
    i.extent().lower(0) = 1;
    i.extent().upper(1) = 1;
    i.extent().upper(2) = 1;
    i.write(0, true);
    i.write(1, false);
    i.write(2, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
    i.useGuards(2, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2, class F3>
  inline void operator()(const F1 &f, const F2 &Tii, const F3 &Tij,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = f.mesh();
    f(I) = (Tii(I)(0) * m.SURXB(I) - Tii(I-dX)(0) * m.SURXB(I-dX)) / m.VOLXA(I-dX)
      + (Tij.fieldEngine().engine(0, 0).read(I+dY) * m.SURYA(I+dY) - Tij.fieldEngine().engine(0, 0).read(I) * m.SURYA(I)) / (m.VOLYB(I)*m.GEOXHA(I))
      + (Tij.fieldEngine().engine(0, 1).read(I+dZ) * m.SURZA(I+dZ) - Tij.fieldEngine().engine(0, 1).read(I) * m.SURZA(I)) / (m.VOLZB(I)*m.GEOXHA(I)*m.GEOYH(I))
      - (isNotCartesian<F1>() ? ((isSpherical<F1>() ? Tii(I-dX)(1) + Tii(I)(1) : 0.0)
     + Tii(I-dX)(2) + Tii(I)(2)) / (2.0*m.vertexPosition(I)(0))
  : 0.0);
  }
};
struct ViscForceY : public Deltas<3> {
  ViscForceY() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 3> &i) const
  {
    i.extent().lower(1) = 1;
    i.extent().upper(0) = 1;
    i.extent().upper(2) = 1;
    i.write(0, true);
    i.write(1, false);
    i.write(2, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
    i.useGuards(2, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2, class F3>
  inline void operator()(const F1 &f, const F2 &Tii, const F3 &Tij,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = f.mesh();
    f(I) = (Tij.fieldEngine().engine(0, 0).read(I+dX) * m.SURXA(I+dX) - Tij.fieldEngine().engine(0, 0).read(I) * m.SURXA(I)) / m.VOLXB(I)
      + (Tii(I)(1) * m.SURYB(I) - Tii(I-dY)(1) * m.SURYB(I-dY)) / (m.VOLYA(I-dY)*m.GEOXG(I))
      + (Tij.fieldEngine().engine(0, 2).read(I+dZ) * m.SURZA(I+dZ) - Tij.fieldEngine().engine(0, 2).read(I) * m.SURZA(I)) / (m.VOLZB(I)*m.GEOXH(I)*m.GEOYHA(I))
      + (isSpherical<F1>() ? (Tij.fieldEngine().engine(0, 0).read(I) + Tij.fieldEngine().engine(0, 0).read(I+dX)
         + (Tii(I-dY)(2) + Tii(I)(2)) / tan(m.cellPosition(I)(1))) / (2.0*m.cellPosition(I)(0))
  : 0.0);
  }
};
struct ViscForceZ : public Deltas<3> {
  ViscForceZ() {}
  inline void scalarCodeInfo(ScalarCodeInfo<3, 3> &i) const
  {
    i.extent().lower(2) = 1;
    i.extent().upper(0) = 1;
    i.extent().upper(1) = 1;
    i.write(0, true);
    i.write(1, false);
    i.write(2, false);
    i.useGuards(0, false);
    i.useGuards(1, true);
    i.useGuards(2, true);
  }
  using Deltas<3>::dX;
  using Deltas<3>::dY;
  using Deltas<3>::dZ;
  template <class F1, class F2, class F3>
  inline void operator()(const F1 &f, const F2 &Tii, const F3 &Tij,
    const Loc<3>& I) const
  {
    const typename F1::Mesh_t &m = f.mesh();
    f(I) = (Tij.fieldEngine().engine(0, 1).read(I+dX) * m.SURXA(I+dX) - Tij.fieldEngine().engine(0, 1).read(I) * m.SURXA(I)) / m.VOLXB(I)
      + (Tij.fieldEngine().engine(0, 2).read(I+dY) * m.SURYA(I+dY) - Tij.fieldEngine().engine(0, 2).read(I) * m.SURYA(I)) / (m.VOLYB(I)*m.GEOXG(I))
      + (Tii(I)(2) * m.SURZB(I) - Tii(I-dZ)(2) * m.SURZB(I-dZ)) / (m.VOLZA(I)*m.GEOXH(I)*m.GEOYH(I))
      + (isNotCartesian<F1>() ? ((Tij.fieldEngine().engine(0, 1).read(I) + Tij.fieldEngine().engine(0, 1).read(I+dX)
      - (isSpherical<F1>() ? (Tij.fieldEngine().engine(0, 2).read(I) + Tij.fieldEngine().engine(0, 2).read(I+dY))
         / tan(m.cellPosition(I)(1))
         : 0.0))
     / (2.0*m.cellPosition(I)(0)))
  : 0.0);
  }
};
  template <int Dim>
  struct TGuess : public Deltas<Dim> {
    TGuess(double dt_) : dt(dt_) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 7> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.write(4, false);
      i.write(5, false);
      i.write(6, false);
      i.useGuards(0, false);
      i.useGuards(1, false);
      i.useGuards(2, false);
      i.useGuards(3, true);
      i.useGuards(4, false);
      i.useGuards(5, false);
      i.useGuards(6, false);
    }
    double dt;
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4, class F5, class F6, class F7>
    inline void operator()(const F1 &pg, const F2 &T, const F3 &rh, const F4 &v,
      const F5 &cv, const F6 &dlmdlt, const F7 &xmue, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = pg.mesh();
      double g = (m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX)
    - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I)) / m.VOLXB(I);
      if (Dim > 1)
 g += (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY)
       - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I)) / m.VOLYB(I);
      if (Dim > 2)
 g += (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ)
       - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I)) / m.VOLZB(I);
      double tguess = T(I)
 - (dt
    * pg(I) / rh(I) / cv.read(I)
    * (1.0 - dlmdlt.read(I))
    * g);
      pg(I) = tguess * rh(I) / xmue.read(I);
    }
  };
  template <int Dim>
  struct CentX : public Deltas<Dim> {
    CentX(double omrot) : omrot_m(omrot) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
    {
      i.extent().lower(0) = 1;
      i.extent().upper(1) = 1;
      if (Dim > 2)
 i.extent().upper(2) = 1;
      i.write(0, true, false);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.useGuards(0, false);
      i.useGuards(1, false);
      i.useGuards(2, true);
      if (Dim > 2)
 i.useGuards(3, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, CartesianTag> >,
                  T, EngineTag> &centx,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      const typename MeshTraits<Dim, T, MeshTag, CartesianTag>::Mesh_t &m = centx.mesh();
      centx(I) = omrot_m*omrot_m*m.vertexPosition(I)(0);
    }
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, CylindricalTag> >,
                  T, EngineTag> &centx,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      const typename MeshTraits<Dim, T, MeshTag, CylindricalTag>::Mesh_t &m = centx.mesh();
      double hq = 0.5*(m.DDX0(I)*(vz(I-dX) + vz(I-dX+dZ))
         + m.DDX1(I)*(vz(I) + vz(I+dZ))) + omrot_m;
      centx(I) = m.vertexPosition(I)(0) * std::pow(hq, 2);
    }
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, SphericalTag> >,
                  T, EngineTag> &centx,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      const typename MeshTraits<Dim, T, MeshTag, SphericalTag>::Mesh_t &m = centx.mesh();
      double hq = 0.5*(m.DDX0(I)*(vz(I-dX) + vz(I-dX+dZ))
         + m.DDX1(I)*(vz(I) + vz(I+dZ))) + omrot_m;
      double gq = 0.5*(m.DDX0(I)*(vy(I-dX+dY) + vy(I-dX))
         + m.DDX1(I)*(vy(I+dY) + vy(I)));
      centx(I) = m.vertexPosition(I)(0)
 * (std::pow(gq, 2) + std::pow(hq*sin(m.cellPosition(I)(1)), 2));
    }
    const double omrot_m;
  };
  template <int Dim>
  struct CentY : public Deltas<Dim> {
    CentY(double omrot) : omrot_m(omrot) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
    {
      i.extent().upper(0) = 1;
      i.extent().lower(1) = 1;
      if (Dim > 2)
 i.extent().upper(2) = 1;
      i.write(0, true, false);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
      i.useGuards(2, false);
      if (Dim > 2)
 i.useGuards(3, true);
    }
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, CartesianTag> >,
                  T, EngineTag> &centy,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      const typename MeshTraits<Dim, T, MeshTag, CartesianTag>::Mesh_t &m = centy.mesh();
      centy(I) = - omrot_m*omrot_m*m.vertexPosition(I)(1);
    }
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, CylindricalTag> >,
                  T, EngineTag> &centy,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      centy(I) = 0.0;
    }
    template <template <class> class Mesh, class MeshTag, class T, class EngineTag,
       class F2, class F3, class F4>
    inline void operator()(const Field<Mesh<MeshTraits<Dim, T, MeshTag, SphericalTag> >,
                  T, EngineTag> &centy,
      const F4 &vx, const F2 &vy, const F3 &vz,
      const Loc<Dim>& I) const
    {
      const typename MeshTraits<Dim, T, MeshTag, SphericalTag>::Mesh_t &m = centy.mesh();
      double hq = 0.5*(m.DDY0(I)*(vz(I-dY) + vz(I-dY+dZ))
         + m.DDY1(I)*(vz(I) + vz(I+dZ))) + omrot_m;
      centy(I) = -cos(m.vertexPosition(I)(1)) * sin(m.vertexPosition(I)(1)) * std::pow(hq, 2)
 * m.cellPosition(I)(0);
    }
    const double omrot_m;
  };
  template <int Dim>
  struct VXUpd : public Deltas<Dim> {
    VXUpd(double dt_) : dt(dt_) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 6> &i) const
    {
      i.extent().lower(0) = 1;
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.write(4, false);
      i.write(5, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
      i.useGuards(2, true);
      i.useGuards(3, true);
      i.useGuards(4, false);
      i.useGuards(5, false);
    }
    double dt;
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4, class F5, class F6>
    inline void operator()(const F1 &vx, const F2 &rh, const F3 &pg, const F4 &ph,
      const F5 &centx, const F6 &fvisx, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vx(I) = vx(I)
 + dt * ((-(pg.read(I)-pg.read(I-dX)) / m.cellSpacing(I)(0)
   + fvisx(I))
  / (m.DDX1(I)*rh(I)+m.DDX0(I)*rh(I-dX))
  - (ph(I)-ph(I-dX)) / m.cellSpacing(I)(0)
  + centx(I));
    }
  };
  template <int Dim>
  struct VYUpd : public Deltas<Dim> {
    VYUpd(double dt_) : dt(dt_) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 6> &i) const
    {
      i.extent().lower(1) = 1;
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.write(4, false);
      i.write(5, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
      i.useGuards(2, true);
      i.useGuards(3, true);
      i.useGuards(4, false);
      i.useGuards(5, false);
    }
    double dt;
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4, class F5, class F6>
    inline void operator()(const F1 &vy, const F2 &rh, const F3 &pg, const F4 &ph,
      const F5 &centy, const F6 &fvisy, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vy(I) = vy(I)
 + (dt * ((-(pg.read(I)-pg.read(I-dY)) / (m.cellSpacing(I)(1) * m.GEOXG(I))
    + fvisy(I))
   / (m.DDY1(I)*rh(I)+m.DDY0(I)*rh(I-dY))
   -((ph(I)-ph(I-dY))
     / (m.cellSpacing(I)(1) * m.GEOXG(I)))
   - centy(I))
    / m.GEOXG(I));
    }
  };
  template <int Dim>
  struct VZUpd : public Deltas<Dim> {
    VZUpd(double dt_) : dt(dt_) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 5> &i) const
    {
      i.extent().lower(2) = 1;
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.write(4, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
      i.useGuards(2, true);
      i.useGuards(3, true);
      i.useGuards(4, true);
    }
    double dt;
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4, class F5>
    inline void operator()(const F1 &vz, const F2 &rh, const F3 &pg, const F4 &ph,
      const F5 &fvisz, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = rh.mesh();
      vz(I) = vz(I)
 + (dt * ((-(pg.read(I)-pg.read(I-dZ)) / (m.cellSpacing(I)(2)*m.GEOXH(I)*m.GEOYH(I))
    + fvisz(I))
   / (m.DDZ1(I)*rh(I)+m.DDZ0(I)*rh(I-dZ))
   -((ph(I)-ph(I-dZ))
     / (m.cellSpacing(I)(2)*m.GEOXH(I)*m.GEOYH(I)))
                          )
    / (m.GEOXH(I)*m.GEOYH(I)));
    }
  };
  template <int Dim>
  struct TUpd : public Deltas<Dim> {
    TUpd(double dt_) : dt(dt_) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 6> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.write(4, false);
      i.write(5, false);
      i.useGuards(0, false);
      i.useGuards(1, false);
      i.useGuards(2, true);
      i.useGuards(3, false);
      i.useGuards(4, false);
      i.useGuards(5, false);
    }
    double dt;
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4, class F5, class F6>
    inline void operator()(const F1 &T, const F2 &rh, const F3 &v, const F4 &pg,
      const F5 &cv, const F6 &dlmdlt, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = T.mesh();
      double g = (m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX)
    - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I)) / m.VOLXB(I);
      if (Dim > 1)
 g += (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY)
       - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I)) / m.VOLYB(I);
      if (Dim > 2)
 g += (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ)
       - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I)) / m.VOLZB(I);
      T(I) = T(I)
 - (dt
    * pg.read(I) / rh(I) / cv.read(I)
    * (1.0 - dlmdlt.read(I))
    * g);
    }
  };
  template <int Dim>
  struct GradV : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true, false);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &grad_v, const F2 &v, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = grad_v.mesh();
      grad_v(I)(0) = (m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX)
        - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I))/m.VOLXB(I);
      if (Dim > 1)
 grad_v(I)(1) = (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY)
   - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I))/m.VOLYB(I);
      if (Dim > 2)
 grad_v(I)(2) = (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ)
   - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I))/m.VOLZB(I);
    }
  };
  template <int Dim>
  struct GradVdX : public Deltas<Dim> {
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true, false);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2>
    inline void operator()(const F1 &grad_v, const F2 &v, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = grad_v.mesh();
      grad_v(I)(0) = (m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX)
        - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I));
      if (Dim > 1)
 grad_v(I)(1) = (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY)
   - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I));
      if (Dim > 2)
 grad_v(I)(2) = (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ)
   - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I));
    }
  };
  template <int Dim>
  struct APressure : public Deltas<Dim> {
    APressure(double cnr, double cav) : c_nr(cnr), c_av(cav) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 4> &i) const
    {
      i.extent(GuardLayers<Dim>(Loc<Dim>(0), Loc<Dim>(1)));
      i.write(0, true);
      i.write(1, false);
      i.write(2, false);
      i.write(3, false);
      i.useGuards(0, false);
      i.useGuards(1, false);
      i.useGuards(2, true);
      i.useGuards(3, false);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    using Deltas<Dim>::dZ;
    template <class F1, class F2, class F3, class F4>
    inline void operator()(const F1 &pg, const F2 &rh, const F3 &v, const F4 &cs,
      const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = pg.mesh();
      double q = (m.SURXA(I+dX)*v.fieldEngine().engine(0, 0).read(I+dX)
    - m.SURXA(I)*v.fieldEngine().engine(0, 0).read(I))/m.VOLXB(I);
      if (Dim > 1)
 q += (m.SURYA(I+dY)*v.fieldEngine().engine(0, 1).read(I+dY)
       - m.SURYA(I)*v.fieldEngine().engine(0, 1).read(I))/m.VOLYB(I);
      if (Dim > 2)
 q += (m.SURZA(I+dZ)*v.fieldEngine().engine(0, 2).read(I+dZ)
       - m.SURZA(I)*v.fieldEngine().engine(0, 2).read(I))/m.VOLZB(I);
      if (q >= 0.0)
 return;
      q *= m.vertexSpacing(I)(0);
      pg(I) += c_nr * q * q * rh(I);
      pg(I) -= c_av * rh(I) * cs(I) * q;
    }
  private:
    const double c_nr, c_av;
  };
  template <class CoordinateSystemTag>
  struct ApplyCoriolis
  {
    template <class F1, class F2>
    static void applyCoriolis(const F1&, const F2&, double) {}
  };
  template <int Dim>
  struct CoriolisX : public Deltas<Dim> {
    CoriolisX(double dphi) : sin2o_m(sin(2*dphi)), cos2o_m(cos(2*dphi)) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent().lower(0) = 1;
      i.extent().upper(1) = 1;
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    template <class F1, class F2>
    inline void operator()(const F1 &vx, const F2 &v, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = v.mesh();
      double vyx = 0.5*(m.DDX0(I)*(v.fieldEngine().engine(0, 1).read(I-dX)
       + v.fieldEngine().engine(0, 1).read(I-dX+dY))
   + m.DDX1(I)*(v.fieldEngine().engine(0, 1).read(I)
         + v.fieldEngine().engine(0, 1).read(I+dY)));
      vx(I) = v.fieldEngine().engine(0, 0).read(I)*cos2o_m + vyx*sin2o_m;
    }
  private:
    const double sin2o_m, cos2o_m;
  };
  template <int Dim>
  struct CoriolisY : public Deltas<Dim> {
    CoriolisY(double dphi) : sin2o_m(sin(2*dphi)), cos2o_m(cos(2*dphi)) {}
    inline void scalarCodeInfo(ScalarCodeInfo<Dim, 2> &i) const
    {
      i.extent().lower(1) = 1;
      i.extent().upper(0) = 1;
      i.write(0, true);
      i.write(1, false);
      i.useGuards(0, false);
      i.useGuards(1, true);
    }
    using Deltas<Dim>::dX;
    using Deltas<Dim>::dY;
    template <class F1, class F2>
    inline void operator()(const F1 &vy, const F2 &v, const Loc<Dim>& I) const
    {
      const typename F1::Mesh_t &m = v.mesh();
      double vxy = 0.5*(m.DDY1(I)*(v.fieldEngine().engine(0, 0).read(I)
       + v.fieldEngine().engine(0, 0).read(I+dX))
   + m.DDY0(I)*(v.fieldEngine().engine(0, 0).read(I-dY)
         + v.fieldEngine().engine(0, 0).read(I-dY+dX)));
      vy(I) = -vxy*sin2o_m + v.fieldEngine().engine(0, 1).read(I)*cos2o_m;
    }
  private:
    const double sin2o_m, cos2o_m;
  };
  template <>
  struct ApplyCoriolis<CartesianTag>
  {
    template <class F1, class F2>
    static void applyCoriolis(const F1& v, const F2& scratchv, double dphi)
    {
      (ScalarCode<CoriolisX<Dim> >(dphi))(scratchv.center(0), v);
      (ScalarCode<CoriolisY<Dim> >(dphi))(scratchv.center(1), v);
      v.center(0) = scratchv.center(0);
      v.center(1) = scratchv.center(1);
    }
  };
  template <class F1, class F2>
  void applyCoriolis(const F1& v, const F2& scratchv, double omrot, double dt)
  {
    ApplyCoriolis<typename F1::Mesh_t::MeshTraits_t::CoordinateSystemTag_t>
      ::applyCoriolis(v, scratchv, omrot*dt);
  }
template <class Tag, class T>
struct FnSave
{
  inline T
  operator()(const T &a) const
  {
    val = a;
    return a;
  }
  static T val;
};
template <class Tag, class T>
T FnSave<Tag, T>::val;
template<class Tag, int D1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnSave<Tag, T1>,
  typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> >::Expression_t
save(const Array<D1,T1,E1> & l)
{
  typedef UnaryNode<FnSave<Tag, T1>,
    typename CreateLeaf<Array<D1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Array<D1,T1,E1> >::make(l)));
}
template<class Tag, class M1,class T1,class E1>
inline typename MakeReturn<UnaryNode<FnSave<Tag, T1>,
  typename CreateLeaf<Field<M1,T1,E1> >::Leaf_t> >::Expression_t
save(const Field<M1,T1,E1> & l)
{
  typedef UnaryNode<FnSave<Tag, T1>,
    typename CreateLeaf<Field<M1,T1,E1> >::Leaf_t> Tree_t;
  return MakeReturn<Tree_t>::make(Tree_t(
    CreateLeaf<Field<M1,T1,E1> >::make(l)));
}
template <class Tag, class T>
struct SaveRef
{
  SaveRef() {}
  inline
  operator T() const
  {
    return FnSave<Tag, T>::val;
  }
};
template<class Tag, class T>
inline Expression<Scalar<SaveRef<Tag, T> > >
ref()
{
  return Expression<Scalar<SaveRef<Tag, T> > >(SaveRef<Tag, T>());
}
struct DivV {};
  template <class F1, class F2, class F3, class F4, class F5,
     class F6, class F7, class F8, class F9, class F10,
     class F11, class F12, class F13,
     class F14, class F15, class F16, class F17>
  void force(double dt, const F1 &rh, F2 &T, F3 &v, double omrot, F4 &pg, const F5 &ph,
      const F11& cs, const F6 &cv, const F7 &dlmdlt, const F8 &xmue,
      const F9 &vint, F10 &cent, const F12 &a_pg, const F13 &gradv,
      const F14 &Tii, const F15 &Tij, const F16 &fvis, const F17 &eta, bool vis,
      double c_nr, bool cartvis_f, bool eeq)
  {
    enum { Dim = F1::dimensions };
    if (Dim == 3) {
      (ScalarCode<CentX<Dim> >(omrot))(cent.center(0), shrink(cent.center(0).physicalDomain(), corr_v[0]),
           v.center(0), v.center(1), v.center(2));
      (ScalarCode<CentY<Dim> >(omrot))(cent.center(1), shrink(cent.center(1).physicalDomain(), corr_v[1]),
           v.center(0), v.center(1), v.center(2));
    } else if (Dim == 2) {
      (ScalarCode<CentX<Dim> >(omrot))(cent.center(0), shrink(cent.center(0).physicalDomain(), corr_v[0]),
           v.center(0), v.center(1), v.center(0));
      (ScalarCode<CentY<Dim> >(omrot))(cent.center(1), shrink(cent.center(1).physicalDomain(), corr_v[1]),
           v.center(0), v.center(1), v.center(0));
    }
    if ((cartvis_f && !vis) || eeq) {
      Interval<Dim> I(grow(a_pg.physicalDomain(), GuardLayers<Dim>(1)));
      ScalarCode<GradV<Dim> >()(gradv, I, v);
    }
    if (cartvis_f && !vis) {
      Interval<Dim> I(grow(a_pg.physicalDomain(), GuardLayers<Dim>(1)));
      a_pg(I) = where(save<DivV>(dot(gradv, Vector<Dim>(1))(I)) < 0.0,
        (c_nr * rh * pow2(Pooma::spacings(rh).comp(0)) * ref<DivV, double>())(I),
        0.0);
    }
    if (eeq) {
      Interval<Dim> I(grow(a_pg.physicalDomain(), GuardLayers<Dim>(1)));
      pg(I) = (T(I) - (0.5*dt * pg(I)
         / rh(I) / cv.read(I)
         * (1.0 - dlmdlt.read(I)) * dot(gradv(I), Vector<Dim>(1)))) * rh(I) / xmue.read(I);
      pg.clearDirty();
    }
    if (eeq) {
      vint.all() = v.all();
    }
      fvis.all() = 0.0;
    if (cartvis_f && !vis) {
      (ScalarCode<VXUpd<Dim> >(dt))(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
        rh,
        pg + a_pg * min(gradv.comp(0), 0.0),
        ph, cent.center(0), fvis.center(0));
      if (Dim > 1)
 (ScalarCode<VYUpd<Dim> >(dt))(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
          rh,
          pg + a_pg * min(gradv.comp(1), 0.0),
          ph, cent.center(1), fvis.center(1));
      if (Dim > 2)
 (ScalarCode<VZUpd<Dim> >(dt))(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
          rh,
          pg + a_pg * min(gradv.comp(2), 0.0),
          ph, fvis.center(2));
    } else {
      (ScalarCode<VXUpd<Dim> >(dt))(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
        rh, pg, ph, cent.center(0), fvis.center(0));
      if (Dim > 1)
 (ScalarCode<VYUpd<Dim> >(dt))(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
          rh, pg, ph, cent.center(1), fvis.center(1));
      if (Dim > 2)
 (ScalarCode<VZUpd<Dim> >(dt))(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
          rh, pg, ph, fvis.center(2));
    }
    if (omrot != 0.0)
      applyCoriolis(v, cent, omrot, dt);
    if (eeq) {
      for (int i=0; i<Dim; ++i)
 vint.center(i).all() = 0.5*(vint.center(i).all() + v.center(i).all());
      if (cartvis_f && !vis)
 (ScalarCode<TUpd<Dim> >(dt))(T, T.physicalDomain(), rh, vint,
         pg + a_pg * dot(gradv, Vector<Dim>(1)), cv, dlmdlt);
      else
 (ScalarCode<TUpd<Dim> >(dt))(T, T.physicalDomain(), rh, vint, pg, cv, dlmdlt);
    }
  }
  template <class F1, class F2, class F3, class F4, class F5,
     class F6, class F7, class F8, class F9, class F10, class F11,
     class F12, class F13, class F14, class F15>
  void force(double dt, const F1 &rh, const F2 &T, const F3 &v, double omrot, F4 &pg, const F5 &ph,
      const F11 &cs, const F6 &cv, const F7 &dlmdlt, const F8 &xmue,
      const F9 &vint, const F10 &cent,
      const F12 &Tii, const F13 &Tij, const F14 &fvis, const F15 &eta, bool vis,
      double c_nr, double c_av, bool cartvis_f, bool eeq)
  {
    enum { Dim = F1::dimensions };
    if (Dim == 3) {
      (ScalarCode<CentX<Dim> >(omrot))(cent.center(0), shrink(cent.center(0).physicalDomain(), corr_v[0]),
           v.center(0), v.center(1), v.center(2));
      (ScalarCode<CentY<Dim> >(omrot))(cent.center(1), shrink(cent.center(1).physicalDomain(), corr_v[1]),
           v.center(0), v.center(1), v.center(2));
    } else if (Dim == 2) {
      (ScalarCode<CentX<Dim> >(omrot))(cent.center(0), shrink(cent.center(0).physicalDomain(), corr_v[0]),
           v.center(0), v.center(1), v.center(0));
      (ScalarCode<CentY<Dim> >(omrot))(cent.center(1), shrink(cent.center(1).physicalDomain(), corr_v[1]),
           v.center(0), v.center(1), v.center(0));
    }
    if (eeq) {
      (ScalarCode<TGuess<Dim> >(0.5*dt))(pg, pg.physicalDomain(),
      T, rh, v, cv, dlmdlt, xmue);
      pg.clearDirty();
      vint.all() = v.all();
    }
    if (cartvis_f && !vis) {
      (ScalarCode<APressure<Dim> >(APressure<Dim>(c_nr, c_av)))(pg, pg.physicalDomain(), rh, v, cs);
      pg.clearDirty();
    }
      fvis.all() = 0.0;
    (ScalarCode<VXUpd<Dim> >(dt))(v.center(0), shrink(v.center(0).physicalDomain(), corr_v[0]),
      rh, pg, ph, cent.center(0), fvis.center(0));
    if (Dim > 1)
      (ScalarCode<VYUpd<Dim> >(dt))(v.center(1), shrink(v.center(1).physicalDomain(), corr_v[1]),
        rh, pg, ph, cent.center(1), fvis.center(1));
    if (Dim > 2)
      (ScalarCode<VZUpd<Dim> >(dt))(v.center(2), shrink(v.center(2).physicalDomain(), corr_v[2]),
        rh, pg, ph, fvis.center(2));
    if (omrot != 0.0)
      applyCoriolis(v, cent, omrot, dt);
    if (eeq) {
      for (int i=0; i<Dim; ++i)
 vint.center(i).all() = 0.5*(vint.center(i).all() + v.center(i).all());
      (ScalarCode<TUpd<Dim> >(dt))(T, T.physicalDomain(), rh, vint, pg, cv, dlmdlt);
    }
  }
};
Loc<Dim> vdom(64, 64, 64);
void usage(int ret)
{
  std::cerr
    << "Usage: tramp3d-v4\n"
    << "  --help|-h|-?        show this command line help\n"
    << "  --num-iter|-n       number of iterations to perform [Inf]\n"
    << "  --end-t|-t          time to stop simulation [Inf]\n"
    << "  --cfl               cfl number [0.6]\n"
    << "  --dt                constant timestep, used with cfl number [off]\n"
    << "  --min-dt            minimum timestep allowed\n"
    << "  --max-dt            maximum timestep allowed\n"
    << "  --blocks nx ny nz   processor setup [automatic]\n"
    << "  --cartvis nr av     artificial viscosity NR AV [off]\n"
    << "  --eos n             choose eos\n"
    << "  --rhomin rho        density floor [off]\n"
    << "  --blocking-expressions  set blocking expressions [off]\n"
    << "  --domain x y z      computational vertex domain [64x64x64]\n\n"
    << "A particularly benchmarky and checky command-line includes\n"
    << "both artificial viscosity and density minimum via f.i.\n"
    << "  ./tramp3d-v4 --cartvis 1.0 0.0 --rhomin 1e-8\n"
    << std::flush;
  Pooma::finalize();
  exit(ret);
}
void handle_cmd_args(int argc, char** argv)
{
  int i = 1;
  while (i < argc) {
    if (strcmp(argv[i], "--help") == 0
 || strcmp(argv[i], "-h") == 0
 || strcmp(argv[i], "-?") == 0) {
      usage(0);
    } else if (argc > i+1
        && (strcmp(argv[i], "--num-iter") == 0
     || strcmp(argv[i], "-n") == 0)) {
      a_nr_f = true;
      a_nr = atoi(argv[i+1]);
      i += 1;
    } else if (argc > i+1
        && (strcmp(argv[i], "--end-t") == 0
     || strcmp(argv[i], "-t") == 0)) {
      a_end_t_f = true;
      a_end_t = atof(argv[i+1]);
      i += 1;
    } else if (argc > i+Dim
      && strcmp(argv[i], "--blocks") == 0) {
      a_blocks_f = true;
      a_blocks[0] = Loc<1>(atoi(argv[i+1]));
      if (Dim > 1)
 a_blocks[1] = Loc<1>(atoi(argv[i+2]));
      if (Dim > 2)
 a_blocks[2] = Loc<1>(atoi(argv[i+3]));
      i += 3;
    } else if (argc > i+Dim
      && strcmp(argv[i], "--domain") == 0) {
      vdom[0] = Loc<1>(atoi(argv[i+1]));
      if (Dim > 1)
 vdom[1] = Loc<1>(atoi(argv[i+2]));
      if (Dim > 2)
 vdom[2] = Loc<1>(atoi(argv[i+3]));
      i += 3;
    } else if (argc > i+1
        && strcmp(argv[i], "--cfl") == 0) {
      a_cfl_f = true;
      a_cfl = atof(argv[i+1]);
      i += 1;
    } else if (argc > i+1
        && strcmp(argv[i], "--dt") == 0) {
      a_constant_timestep_f = true;
      dt = atof(argv[i+1]);
      i += 1;
    } else if (argc > i+1
        && strcmp(argv[i], "--min-dt") == 0) {
      a_min_dt_f = true;
      a_min_dt = atof(argv[i+1]);
      i += 1;
    } else if (argc > i+1
        && strcmp(argv[i], "--max-dt") == 0) {
      a_max_dt_f = true;
      a_max_dt = atof(argv[i+1]);
      i += 1;
    } else if (argc > i+2
        && strcmp(argv[i], "--cartvis") == 0) {
      a_cartvis_f = true;
      cartvis_nr = atof(argv[i+1]);
      cartvis_av = atof(argv[i+2]);
      i += 2;
    } else if (argc > i+1
        && strcmp(argv[i], "--rhomin") == 0) {
      a_rhomin_f = true;
      a_rhomin = atof(argv[i+1]);
      i += 1;
    } else if (strcmp(argv[i], "--blocking-expressions") == 0) {
      Pooma::blockingExpressions(true);
    } else {
      std::cerr << "Unknown option " << argv[i] << ".\n\n";
      usage(1);
    }
    ++i;
  }
  commandline.append(argv[0]);
  for (int i=1; i<argc; ++i) {
    commandline.append(" ");
    commandline.append(argv[i]);
  }
}
static void initSpacings(Array<1, double, Brick> s[Dim], const Interval<Dim>& dom)
{
  for (int i=0; i<Dim; ++i)
    s[i].engine() = Engine<1, double, Brick>(grow(dom[i], 2));
}
static void initSpacings(Vector<Dim>& s, const Interval<Dim>&)
{
}
int main(int argc, char** argv)
{
    Pooma::initialize(argc,argv);
    Pooma::blockingExpressions(false);
  Inform out;
  if (argc == 1)
    usage(1);
  handle_cmd_args(argc, argv);
  origin = Vector<Dim>(-1.0);
  for (int i=0; i<Dim; ++i) {
    vertexDomain[i] = Interval<1>(vdom[i].min());
    spacings(i) = 2.0/(vertexDomain[i].size()-1);
  }
  periodicity = Vector<Dim, int>(1);
  if (a_blocks[0].min() == 0)
    a_blocks = makeRBlocks(vertexDomain, Pooma::contexts());
  Grid<Dim> grid = makeRGrid(vertexDomain, a_blocks);
  for (int i=0; i<Dim; ++i) {
    corr_v[i] = GuardLayers<Dim>(0);
    corr_v[i].lower(i) = 1;
    corr_v[i].upper(i) = 1;
  }
  Traits_t::Layout_t layout;
  Traits_t::createLayout(layout, grid, vertexDomain,
    GuardLayers<Dim>(2),
    GuardLayers<Dim>(2));
  Traits_t::Mesh_t mesh(layout, origin, spacings);
  Traits_t::Layout_t layout1;
  Traits_t::createLayout(layout1, grid, vertexDomain,
    GuardLayers<Dim>(1),
    GuardLayers<Dim>(1));
  Traits_t::Mesh_t mesh1(layout1, origin, spacings);
  Traits_t::Layout_t layout0;
  Traits_t::createLayout(layout0, grid, vertexDomain,
    GuardLayers<Dim>(0),
    GuardLayers<Dim>(0));
  Traits_t::Mesh_t mesh0(layout0, origin, spacings);
  Traits_t::Centering_t cell = canonicalCentering<Traits_t::Dim>(CellType, Continuous);
  Traits_t::Centering_t face = canonicalCentering<Traits_t::Dim>(FaceType, Continuous);
  Traits_t::Centering_t edge = canonicalCentering<Traits_t::Dim>(EdgeType, Continuous);
  Traits_t::Centering_t vertex = canonicalCentering<Traits_t::Dim>(VertexType, Continuous);
  Traits_t::Scalar_t rh(cell, layout, mesh);
  Traits_t::Scalar_t v(face, layout, mesh);
  Traits_t::Scalar_t T;
  Traits_t::Scalar_t pg(cell, layout, mesh);
  Traits_t::Scalar_t ph(cell, layout, mesh);
  Traits_t::Scalar_t cs(cell, layout, mesh);
  rh.all() = std::numeric_limits<double>::signaling_NaN();
  for (int i=0; i<Dim; ++i)
    v.center(i).all() = std::numeric_limits<double>::signaling_NaN();
  pg.all() = std::numeric_limits<double>::signaling_NaN();
  ph.all() = std::numeric_limits<double>::signaling_NaN();
  cs.all() = std::numeric_limits<double>::signaling_NaN();
  double t;
  Traits_t::Scalar_t scratchv(vertex, layout, mesh);
  Traits_t::Scalar_t scratchc(cell, layout, mesh);
  Traits_t::Vector_t scratchc_v(cell, layout, mesh);
  Traits_t::Vector_t scratchc_v2;
  Traits_t::Scalar_t flm(face, layout1, mesh1);
  Traits_t::Scalar_t fle;
  Traits_t::Vector_t flvv(vertex, layout0, mesh0);
  Traits_t::Scalar_t flvc(cell, layout0, mesh0);
  Traits_t::Scalar_t Tij;
  scratchv.all() = std::numeric_limits<double>::signaling_NaN();
  scratchc.all() = std::numeric_limits<double>::signaling_NaN();
  scratchc_v.all() = Vector<Dim>(std::numeric_limits<double>::signaling_NaN());
  for (int i=0; i<Dim; ++i)
    flm.center(i).all() = std::numeric_limits<double>::signaling_NaN();
  flvc.all() = std::numeric_limits<double>::signaling_NaN();
  flvv.all() = Vector<Dim>(std::numeric_limits<double>::signaling_NaN());
  Field<Traits_t::Mesh_t, double, ConstantFunction> cv(cell, layout, mesh);
  Field<Traits_t::Mesh_t, Zero<double>, ConstantFunction> dlmdlt(cell, layout, mesh);
  Field<Traits_t::Mesh_t, double, ConstantFunction> xmue(cell, layout, mesh);
  Field<Traits_t::Mesh_t, double, ConstantFunction> nue(cell, layout, mesh);
  int it;
    it = 0;
  it++;
    t = 0.0;
    T.initialize(cell, layout, mesh);
  bool eeq = true;
  if (eeq) {
    fle.initialize(face, layout0, mesh0);
    for (int i=0; i<Dim; ++i)
      fle.center(i).all() = std::numeric_limits<double>::signaling_NaN();
  }
  bool ietot = true;
    gamma_ = 1.33;
    K = 4.0*3.14159265358979323846/(1.0/(gamma_-1.0)+1.0);
    if (! a_cartvis_f) {
    cartvis_nr = 0.0;
    cartvis_av = 0.0;
    }
  xmue.engine().setConstant(2.3);
  cv.engine().setConstant(1.0/(xmue.engine().constant()*(gamma_-1.0)));
  nue.engine().setConstant(0.0);
  {
    Interval<Dim> I(rh.physicalDomain());
    rh(I) = 0.1;
    v.all() = 0.0;
    T(I) = 99.0/exp(100.0*pow(norm(positions(T)(I)-Vector<Dim>(0.25)), 2.0))+1.0;
    Pooma::addAllPeriodicFaceBC(rh);
    Pooma::addAllPeriodicFaceBC(T);
    Pooma::addAllPeriodicFaceBC(v);
  }
  Traits_t::Scalar_t vint(v);
  vint.makeOwnCopy();
  vint.all() = std::numeric_limits<double>::signaling_NaN();
  Traits_t::Scalar_t cent(face, layout0, mesh0);
  cent.all() = 0.0;
    ph.initialize(rh);
    ph.makeOwnCopy();
    ph.all() = 0.0;
  eos = EOS::IdealAdiabatic;
  double rh0 = sum(rh);
  double T0 = sum(rh*T);
  out << "Using\n"
      << "  using " << a_blocks << " block setup for computation on domain " << vertexDomain << "\n"
      << "  " << (eeq ? "" : "not ") << "solving eeq\n";
  if (a_constant_timestep_f)
    out << "  time increments fixed at " << dt << ", cfl " << a_cfl << "\n";
  else
    out << "  time increments from [" << a_min_dt << ", " << a_max_dt << "], cfl " << a_cfl << "\n";
  out << "  starting at t = " << t << ", i = " << it << "\n"
      << "  cell physical/total domain " << rh.physicalDomain() << ", " << rh.totalDomain() << "\n"
      << "  face  physical/total domain " << v.physicalDomain() << ", " << v.totalDomain() << "\n";
  if (periodicity(0)
      || (Dim > 1 && periodicity(1))
      || (Dim > 2 && periodicity(2))) {
    out << "  periodic boundaries in";
    if (periodicity(0))
      out << " X";
    if (Dim > 1 && periodicity(1))
      out << " Y";
    if (Dim > 2 && periodicity(2))
      out << " Z";
    out << "\n";
  }
  out << std::flush;
  struct timeval end_time, start_time;
  gettimeofday(&start_time, NULL);
  
  // LLVM: disable timing.
  end_time = start_time;
  
  if (a_rhomin_f)
    Pooma::newRelation(Hacks::limit_rh(a_rhomin), rh);
  switch (eos) {
  case EOS::IdealAdiabatic:
    Pooma::newRelation(EOS::pg_ig(), pg, T, rh, xmue);
    Pooma::newRelation(EOS::cs_adiabatic(gamma_), cs, pg, rh);
    break;
  }
  double iteration_time = 0.0;
  for (; it<=a_nr && t<=a_end_t; it++) {
    if (!a_constant_timestep_f) {
      double dt_ = CFL::schritt<Dim>(v, cs, nue,
                       scratchc,
                       0.0, false);
      if (dt_ <= 0.0 || std::isnan(dt_) || std::isinf(dt_)) {
 out << "dt is " << dt_ << std::endl;
 Pooma::pAbort("Blowup.");
      }
      dt = std::min(a_max_dt, std::max(a_min_dt, a_cfl*dt_));
    }
    t += dt;

    // LLVM: disable timing.
    //gettimeofday(&end_time, NULL);
    out << "i = " << it << "\t t = " << t << "\t dt = " << dt;
 //<< " (" << end_time.tv_sec + end_time.tv_usec/1000000.0 - start_time.tv_sec - start_time.tv_usec/1000000.0 << "s/it)" << std::endl;
    iteration_time += end_time.tv_sec + end_time.tv_usec/1000000.0 - start_time.tv_sec - start_time.tv_usec/1000000.0;
    start_time = end_time;
    Adv5::advect(dt, rh, v, 0.0, T, flm, fle, flvv, flvc, cv, scratchc, eeq, ietot);
    Forgas::force(dt,
    rh, T, v, 0.0, pg, ph,
    cs, cv, dlmdlt, xmue, vint, cent,
    scratchc_v , Tij, flm , nue*rh, false,
    cartvis_nr, cartvis_av, a_cartvis_f,
    eeq);
      Hacks::checkRegularity(rh);
      Hacks::checkRegularity(v.center(0));
      if (Dim > 1)
 Hacks::checkRegularity(v.center(1));
      if (Dim > 2)
 Hacks::checkRegularity(v.center(2));
  }
  // LLVM: disable timing.
  //out << "Time spent in iteration: " << iteration_time << std::endl;
  out << "Correctness:"
      << "\n\tsum(rh) difference = " << sum(rh)-rh0
      << "\n\tsum(vx) = " << sum(v.center(0))
      << "\n\tsum(vy) = " << sum(v.center(1))
      << "\n\tsum(vz) = " << sum(v.center(2))
      << "\n\tsum(rh*T) difference = " << sum(rh*T)-T0 << std::endl;
  Pooma::finalize();
  return 0;
}
