99 this->initialized =
true;
102 this->N = s.cells * s.points_dst;
109 n =
new ptrdiff_t[dim];
110 for(
int i = 0; i < dim - 1; i++)
112 n[dim - 1] = N / 2 + 1;
115 ptrdiff_t local_elements = 0;
116 alloc_local = fftw_mpi_local_size(dim, n, comm, &local_elements, &local_start);
117 local_end = local_start + local_elements;
120 int * global_elements =
new int[size];
121 MPI_Allgather(&local_elements, 1, MPI_INTEGER, global_elements, 1, MPI_INTEGER, comm);
124 _indices_proc_rows =
new int[N];
126 for(
int i = 0, c = 0; i < size; i++)
127 for(
int j = 0; j < global_elements[i]; j++, c++)
128 _indices_proc_rows[c] = i;
131 delete[] global_elements;
138 u_real = fftw_alloc_real(2 * alloc_local * dim);
140 this->bsize = 2 * alloc_local;
143 for(
int i = 0; i < 2 * alloc_local * dim; i++)
147 v_real = u_real + 2 * alloc_local;
150 u_comp = fftw_alloc_complex(alloc_local);
151 v_comp = fftw_alloc_complex(alloc_local);
156 w_real = v_real + 2 * alloc_local;
157 w_comp = fftw_alloc_complex(alloc_local);
161 this->e =
new double[N];
162 this->E =
new double[N];
163 this->k =
new double[N];
164 this->K =
new double[N];
165 this->c =
new double[N];
166 this->C =
new double[N];
206 fftw_plan pu = fftw_mpi_plan_dft_r2c(dim, n, u_real, u_comp, comm, FFTW_ESTIMATE);
208 fftw_destroy_plan(pu);
211 fftw_plan pv = fftw_mpi_plan_dft_r2c(dim, n, v_real, v_comp, comm, FFTW_ESTIMATE);
213 fftw_destroy_plan(pv);
218 fftw_plan pw = fftw_mpi_plan_dft_r2c(dim, n, w_real, w_comp, comm, FFTW_ESTIMATE);
220 fftw_destroy_plan(pw);
261 e_spectral += u_comp3(MIN(i, N - i), j, k_)[0] * u_comp3(MIN(i, N - i), j, k_)[0] +
262 u_comp3(MIN(i, N - i), j, k_)[1] * u_comp3(MIN(i, N - i), j, k_)[1] +
263 v_comp3(MIN(i, N - i), j, k_)[0] * v_comp3(MIN(i, N - i), j, k_)[0] +
264 v_comp3(MIN(i, N - i), j, k_)[1] * v_comp3(MIN(i, N - i), j, k_)[1] +
265 w_comp3(MIN(i, N - i), j, k_)[0] * w_comp3(MIN(i, N - i), j, k_)[0] +
266 w_comp3(MIN(i, N - i), j, k_)[1] * w_comp3(MIN(i, N - i), j, k_)[1];
281 MPI_Reduce(&e_physical, &this->e_d, 1, MPI_DOUBLE, MPI_SUM, 0, comm);
282 MPI_Reduce(&e_spectral, &this->e_s, 1, MPI_DOUBLE, MPI_SUM, 0, comm);
291 double scaling = pow(N, dim);
294 for(
int i = 0; i < N; i++)
304 for(
int j = local_start; j < local_end; j++)
306 for(
int i = 0; i < N; i++)
309 double r = sqrt(pow(MIN(i, N - i), 2.0) + pow(MIN(j, N - j), 2.0));
311 int p =
static_cast<int>(std::round(r));
313 e[p] += u_comp2(MIN(i, N - i), j)[0] * u_comp2(MIN(i, N - i), j)[0] +
314 u_comp2(MIN(i, N - i), j)[1] * u_comp2(MIN(i, N - i), j)[1] +
315 v_comp2(MIN(i, N - i), j)[0] * v_comp2(MIN(i, N - i), j)[0] +
316 v_comp2(MIN(i, N - i), j)[1] * v_comp2(MIN(i, N - i), j)[1];
326 for(
int k_ = local_start; k_ < local_end; k_++)
328 for(
int j = 0; j < N; j++)
330 for(
int i = 0; i < N; i++)
334 sqrt(pow(MIN(i, N - i), 2.0) + pow(MIN(j, N - j), 2.0) + pow(MIN(k_, N - k_), 2.0));
336 int p =
static_cast<int>(std::round(r));
338 e[p] += u_comp3(MIN(i, N - i), j, k_)[0] * u_comp3(MIN(i, N - i), j, k_)[0] +
339 u_comp3(MIN(i, N - i), j, k_)[1] * u_comp3(MIN(i, N - i), j, k_)[1] +
340 v_comp3(MIN(i, N - i), j, k_)[0] * v_comp3(MIN(i, N - i), j, k_)[0] +
341 v_comp3(MIN(i, N - i), j, k_)[1] * v_comp3(MIN(i, N - i), j, k_)[1] +
342 w_comp3(MIN(i, N - i), j, k_)[0] * w_comp3(MIN(i, N - i), j, k_)[0] +
343 w_comp3(MIN(i, N - i), j, k_)[1] * w_comp3(MIN(i, N - i), j, k_)[1];
354 MPI_Reduce(e, E, N, MPI_DOUBLE, MPI_SUM, 0, comm);
355 MPI_Reduce(k, K, N, MPI_DOUBLE, MPI_SUM, 0, comm);
356 MPI_Reduce(c, C, N, MPI_DOUBLE, MPI_SUM, 0, comm);
359 for(
int i = 0; i < N; i++)
364 E[i] /= scaling * scaling;
396 int start = local_start;
398 int delta = 2 * (N / 2 + 1) * dealii::Utilities::pow(N, dim - 2);
399 int delta_all = 2 * (N / 2 + 1) * dealii::Utilities::pow(N, dim - 1) *
sizeof(double);
402 int dofs = (end - start) * delta;
403 MPI_Offset disp = 8 *
sizeof(int) + start * delta *
sizeof(
double);
407 MPI_Type_contiguous(dofs, MPI_DOUBLE, &stype);
408 MPI_Type_commit(&stype);
412 MPI_File_open(comm, filename, MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
414 MPI_File_set_view(fh, disp + delta_all * 0, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
415 MPI_File_write_all(fh, u_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
417 MPI_File_set_view(fh, disp + delta_all * 1, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
418 MPI_File_write_all(fh, v_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
422 MPI_File_set_view(fh, disp + delta_all * 2, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
423 MPI_File_write_all(fh, w_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
427 MPI_Type_free(&stype);
438 int start = local_start;
440 int delta = 2 * (N / 2 + 1) * dealii::Utilities::pow(N, dim - 2);
441 int delta_all = 2 * (N / 2 + 1) * dealii::Utilities::pow(N, dim - 1) *
sizeof(double);
444 int dofs = (end - start) * delta;
445 MPI_Offset disp = 8 *
sizeof(int) + start * delta *
sizeof(
double);
449 MPI_Type_contiguous(dofs, MPI_DOUBLE, &stype);
450 MPI_Type_commit(&stype);
454 MPI_File_open(comm, filename, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
456 MPI_File_set_view(fh, disp + delta_all * 0, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
457 MPI_File_read_all(fh, u_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
459 MPI_File_set_view(fh, disp + delta_all * 1, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
460 MPI_File_read_all(fh, v_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
464 MPI_File_set_view(fh, disp + delta_all * 2, MPI_DOUBLE, MPI_DOUBLE,
"native", MPI_INFO_NULL);
465 MPI_File_read_all(fh, w_real, dofs, MPI_DOUBLE, MPI_STATUSES_IGNORE);
469 MPI_Type_free(&stype);