Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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);
}