ExaFMM 1
Fast-multipole Method for exascale systems
|
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 = 2; 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 FMM.startTimer("Set periodic "); 00047 jbodies = FMM.periodicBodies(bodies); 00048 FMM.stopTimer("Set periodic ",FMM.printNow); 00049 FMM.eraseTimer("Set periodic "); 00050 00051 FMM.startTimer("Direct sum "); 00052 FMM.buffer = bodies; 00053 FMM.initTarget(FMM.buffer); 00054 FMM.evalP2P(FMM.buffer,jbodies); 00055 FMM.stopTimer("Direct sum ",FMM.printNow); 00056 FMM.eraseTimer("Direct sum "); 00057 00058 real diff1 = 0, norm1 = 0, diff2 = 0, norm2 = 0; 00059 FMM.evalError(bodies,FMM.buffer,diff1,norm1,diff2,norm2,true); 00060 FMM.printError(diff1,norm1,diff2,norm2); 00061 FMM.finalize(); 00062 }