void MultisphereParallel::writeRestart(FILE *fp) { double *sendbuf = 0, *recvbuf = 0; double xbnd[3]; bool dummy = false; double nba = static_cast<double>(n_body_all()); int sizeLocal = n_body() * (customValues_.elemBufSize(OPERATION_RESTART,dummy,dummy,dummy) + 4); int sizeGlobal = 0, sizeOne = 0; // allocate send buffer and pack element data // all local elements are in list memory->create(sendbuf,sizeLocal,"MultiNodeMeshParallel::writeRestart:sendbuf"); sizeLocal = 0; for(int i = 0; i < n_body(); i++) { x_bound(xbnd,i); sizeOne = customValues_.pushElemToBuffer(i,&(sendbuf[sizeLocal+4]),OPERATION_RESTART,dummy,dummy,dummy); sendbuf[sizeLocal] = static_cast<double>(sizeOne+4); sendbuf[sizeLocal+1] = xbnd[0]; sendbuf[sizeLocal+2] = xbnd[1]; sendbuf[sizeLocal+3] = xbnd[2]; sizeLocal += (sizeOne+4); } // gather the per-element data sizeGlobal = MPI_Gather0_Vector(sendbuf,sizeLocal,recvbuf,world); // write data to file if(comm->me == 0) { // size with 1 extra value (nba) int size = (1+sizeGlobal) * sizeof(double); // write size fwrite(&size,sizeof(int),1,fp); // write extra value fwrite(&nba,sizeof(double),1,fp); // write per-element data fwrite(recvbuf,sizeof(double),sizeGlobal,fp); } // clean up memory->destroy(sendbuf); if(recvbuf) delete []recvbuf; }
TEST(NBodyParallelTest, ComplexConstructor) { mila::nbody::parallel::NBodyParallel n_body(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, cl_float2{7.0f, 8.0f}, 9, 10.0f, 11.0f, 12, 13); EXPECT_EQ(n_body.active_repulsion_force(), 1.0f); EXPECT_EQ(n_body.active_repulsion_min_distance(), 2.0f); EXPECT_EQ(n_body.passive_repulsion_force(), 3.0f); EXPECT_EQ(n_body.passive_repulsion_min_distance(), 4.0f); EXPECT_EQ(n_body.damping_force(), 5.0f); EXPECT_EQ(n_body.central_force(), 6.0f); EXPECT_EQ(n_body.center().x, 7.0f); EXPECT_EQ(n_body.center().y, 8.0f); EXPECT_EQ(n_body.number_of_particles(), 9); EXPECT_EQ(n_body.min_position(), 10.0f); EXPECT_EQ(n_body.max_position(), 11.0f); EXPECT_EQ(n_body.platform_id(), 12); EXPECT_EQ(n_body.device_id(), 13); }
TEST(NBodyParallelTest, NumberOfParticlesConstructor) { mila::nbody::parallel::NBodyParallel n_body(100, 1, 2); EXPECT_EQ(n_body.active_repulsion_force(), 300.0f); EXPECT_EQ(n_body.active_repulsion_min_distance(), 100.0f); EXPECT_EQ(n_body.passive_repulsion_force(), 4.0f); EXPECT_EQ(n_body.passive_repulsion_min_distance(), 50.0f); EXPECT_EQ(n_body.damping_force(), 0.8f); EXPECT_EQ(n_body.central_force(), 0.01f); EXPECT_EQ(n_body.center().x, 512.0f); EXPECT_EQ(n_body.center().y, 512.0f); EXPECT_EQ(n_body.number_of_particles(), 100); EXPECT_EQ(n_body.min_position(), 0.0f); EXPECT_EQ(n_body.max_position(), 1024.0f); EXPECT_EQ(n_body.platform_id(), 1); EXPECT_EQ(n_body.device_id(), 2); }