10int main (
int argc,
char** argv)
12 MPI_Init(&argc, &argv);
17 std::cout <<
"usage: " << argv[0] <<
" <in_file (ASCII)> <out_file (binary)> <n_x> <n_y> <n_z>" << std::endl;
23 dim[0] = atoi(argv[3]);
24 dim[1] = atoi(argv[4]);
25 dim[2] = atoi(argv[5]);
34 err = MPI_File_open(MPI_COMM_WORLD, argv[2], MPI_MODE_CREATE | MPI_MODE_RDWR, MPI_INFO_NULL, &outfile);
45 while(infile.getline(line,256))
47 if(infile.eof())
break;
48 std::string str(line);
49 std::istringstream istr(str);
51 istr >> blockID >> values[0] >> values[1] >> values[2] >> values[3];
52 for (
int i = 0; i < 3; ++i)
53 if (max[i] < values[i]) max[i] = values[i];
58 infile.seekg(0,infile.beg);
62 for (
int i = 0; i < 3; ++i)
65 max[i] = (double)((
int)max[i] - ((
int)max[i] % 10) + 10);
66 cell_size[i] = max[i] / (double)dim[i];
69 std::cout <<
"domain layout: " << dim[0] <<
" " << dim[1] <<
" " << dim[2] << std::endl;
70 std::cout <<
"system size: " << max[0] <<
" " << max[1] <<
" " << max[2] << std::endl;
71 std::cout <<
"domain size: " << cell_size[0] <<
" " << cell_size[1] <<
" " << cell_size[2] << std::endl;
74 const int n_procs = dim[0] * dim[1] * dim[2];
76 std::vector<long> loc_parts(dim[0]*dim[1]*dim[2]);
77 std::vector<long> offset_domain(dim[0]*dim[1]*dim[2]);
78 std::vector<int> curr_index(dim[0]*dim[1]*dim[2]);
80 for (
int i = 0; i < dim[0] * dim[1] * dim[2]; ++i)
83 offset_domain.at(i) = 0;
88 while(infile.getline(line,256))
90 if(infile.eof())
break;
91 std::string str(line);
92 std::istringstream istr(str);
93 istr >> blockID >> values[0] >> values[1] >> values[2] >> values[3];
97 for (
int i = 0; i < 3; ++i)
98 cell[i] = (
int)(values[i] / cell_size[i]);
100 loc_parts.at(cell[0]*dim[1]*dim[2]+cell[1]*dim[2]+cell[2])++;
103 std::partial_sum(loc_parts.begin(),loc_parts.end(),offset_domain.begin());
106 for (
int i = 0; i < dim[0] * dim[1] * dim[2]; ++i)
108 offset_domain.at(i) -= loc_parts.at(i);
109 int n_loc = (int)loc_parts.at(i);
110 MPI_File_write_at_all(outfile,(MPI_Offset)(i*
sizeof(
long)),&offset_domain.at(i),1,MPI_LONG,MPI_STATUS_IGNORE);
111 MPI_File_write_at_all(outfile,(MPI_Offset)(n_procs *
sizeof(
long) + i *
sizeof(
int)),&n_loc,1,MPI_INT,MPI_STATUS_IGNORE);
116 infile.seekg(0,infile.beg);
119 while(infile.getline(line,256))
121 if(infile.eof())
break;
122 std::string str(line);
123 std::istringstream istr(str);
124 istr >> blockID >> values[0] >> values[1] >> values[2] >> values[3];
128 for (
int i = 0; i < 3; ++i)
129 cell[i] = (
int)(values[i] / cell_size[i]);
131 int domain = cell[0] * dim[1] * dim[2] + cell[1] * dim[2] + cell[2];
133 long block_size =
sizeof(long) + 4*
sizeof(
double);
135 MPI_File_write_at_all(
138 (n_procs*(
sizeof(
int) +
sizeof(
long))+(offset_domain.at(domain)+curr_index.at(domain))*block_size),
145 MPI_File_write_at_all(
148 (n_procs*(
sizeof(
int) +
sizeof(
long))+(offset_domain.at(domain)+curr_index.at(domain))*block_size+
sizeof(
long)),
155 curr_index.at(domain)++;
192 MPI_File_close(&outfile);