ExaFMM 1
Fast-multipole Method for exascale systems
unit_test/ewald_fmm.cxx
Go to the documentation of this file.
00001 #include "serialfmm.h"
00002 
00003 int main() {
00004   const int numBodies = 1000;
00005   const real xmax = 100.0;
00006   const real ksize = 11.0;
00007   const real alpha = 0.1;
00008   const real sigma = .25 / M_PI;
00009   IMAGES = 3;
00010   THETA = 1 / sqrt(4);
00011   Bodies bodies(numBodies);
00012   Bodies jbodies;
00013   Cells cells, jcells;
00014   SerialFMM<Laplace> FMM;
00015   FMM.initialize();
00016   FMM.printNow = true;
00017 
00018   FMM.startTimer("Set bodies   ");
00019   srand48(2);
00020   real average = 0;
00021   for( B_iter B=bodies.begin(); B!=bodies.end(); ++B ) {
00022     for( int d=0; d!=3; ++d ) {
00023       B->X[d] = drand48() * xmax;
00024     }
00025     B->SRC = drand48();
00026     average += B->SRC;
00027     B->TRG = 0;
00028   }
00029   average /= numBodies;
00030   for( B_iter B=bodies.begin(); B!=bodies.end(); ++B ) {
00031     B->SRC -= average;
00032   }
00033   FMM.stopTimer("Set bodies   ",FMM.printNow);
00034   FMM.eraseTimer("Set bodies   ");
00035 
00036   FMM.startTimer("Set domain   ");
00037   FMM.setDomain(bodies,xmax/2,xmax/2);
00038   FMM.stopTimer("Set domain   ",FMM.printNow);
00039   FMM.eraseTimer("Set domain   ");
00040 
00041   FMM.bottomup(bodies,cells);
00042   FMM.setEwald(ksize,alpha,sigma);
00043   jcells = cells;
00044   FMM.Ewald(bodies,cells,jcells);
00045 
00046   Bodies bodies2 = bodies;
00047   FMM.initTarget(bodies);
00048   FMM.startTimer("Downward     ");
00049   FMM.downward(cells,jcells);
00050   FMM.stopTimer("Downward     ",FMM.printNow);
00051   FMM.eraseTimer("Downward     ");
00052 
00053   real diff1 = 0, norm1 = 0, diff2 = 0, norm2 = 0;
00054   FMM.evalError(bodies,bodies2,diff1,norm1,diff2,norm2,true);
00055   FMM.printError(diff1,norm1,diff2,norm2);
00056   FMM.finalize();
00057 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines