Listing 3: The multiprocessor program

#include "Pooma/Arrays.h"
int main(int argc, char* argv[])
{
  Pooma::initialize(argc,argv);
  Inform output;
  int nuProcessors, n, nuDiffusions;
  double alpha;
  const double beta =
    2.0 /* 2 created */ - 1.0 /* one consumed */;
  if (!processCommandLine(argc, argv, output,
              nuProcessors, n, nuDiffusions, alpha))
    return EXIT_FAILURE;

  Interval<1> N(0, n-1);
  Interval<2> vertDomain(N, N);
  Interval<1> I(1,n-2);
  Interval<2> interiorDomain(I,I);

  UniformGridPartition<2> partition
    (Loc<2>(nuProcessors, nuProcessors),
     GuardLayers<2>(1),
     GuardLayers<2>(0));
  UniformGridLayout<2> layout
    (vertDomain, partition, DistributedTag());

  Array<2, double, MultiPatch<UniformTag, Remote<Brick> > > Na
    (layout);
  Array<2, double, MultiPatch<UniformTag, Remote<Brick> > > Nb
    (layout);

  Na = Nb = 0.0;
  Pooma::blockAndEvaluate();
  Nb(n/2,n/2) = 1.0e+7;

  Fisher fisher(alpha, beta);
  Stencil<Fisher> stencil(fisher);

  for (int k = 0; k < nuDiffusions; k += 2) {
    Na(interiorDomain) = stencil(Nb, interiorDomain);
    Nb(interiorDomain) = stencil(Na, interiorDomain);
  }

  Pooma::blockAndEvaluate();
  output << (nuDiffusions % 2 ? Na(n/2,n/2) : Nb(n/2,n/2)) 
         << std::endl;

  Pooma::finalize();
  return EXIT_SUCCESS;
}
— End of Listing —