#include "pdeov.h"
#include "pdeov_decl.h"
#if defined(AUTO)
#include "pdeov_auto.cc"
#elif defined(AUTO2)
#include "pdeov_auto2.cc"
#endif

// no loops, matrix dim, cpux, cpuy
// delt delx dely D ; stability : 2D*delt / delx^2 <= 1 
Config mcfg = {100, 64, 2, 2, 2, 2, .1, .5, .5, .4};  

#include "pde-common.cc"

void top(Env &env)
{
  Alias (int, pe, env.pre.pe);
  Alias (Config, cfg, env.cfg);
  Alias (RangeNP, ppen, env.pre.PPEn[pe]);
  Alias (RangeNP, alln, env.pre.ALLn[pe]);

  Alloc (env.cell2, alln); Alloc (env.border, alln); 
  Alloc (env.sw_chm, ppen); Alloc (env.sw_ca, ppen);

  int sz = cfg.size; Range2D *rbd;
  init_common(env, rbd);

  // cell2
  makePart2DTile(env.cell2, sz, cfg.nopy, cfg.tly, sz, cfg.nopx, cfg.tlx, -1);

  // border
  for (int p=0; p<env.cell.getNP(); p++) 
  {
    Range2D cl = env.cell[p];
    int sr=cl.s1, er=cl.e1, sc=cl.s2, ec=cl.e2;
    env.border.setNo(p,4);
    env.border[p].set(sr, er, sc, ec);
    env.border.idx(p,0).set(sr, er, sc, sc);
    env.border.idx(p,1).set(sr, er, ec, ec);
    env.border.idx(p,2).set(sr, sr, sc+1, ec-1);
    env.border.idx(p,3).set(er, er, sc+1, ec-1);
  }

  computeSwap (env.cell, env.halom, env.sw_chm);
  computeSwap (env.cell, env.fullone, env.sw_ca);

  foo(env);
}

