data_size = 1,2 for real,complex-valued array
| 552 | |
| 553 | // data_size = 1,2 for real,complex-valued array |
| 554 | realnum *collapse_array(realnum *array, int *rank, size_t dims[3], direction dirs[3], volume where, |
| 555 | int data_size = 1) { |
| 556 | |
| 557 | /*--------------------------------------------------------------*/ |
| 558 | /*- detect empty dimensions and compute rank and strides for */ |
| 559 | /*- collapsed array */ |
| 560 | /*--------------------------------------------------------------*/ |
| 561 | int full_rank = *rank; |
| 562 | size_t reduced_dims[3], reduced_stride[3], stride[3]; // the latter for non-reduced array strides |
| 563 | direction reduced_dirs[3]; |
| 564 | size_t reduced_grid_size; |
| 565 | int reduced_rank; |
| 566 | reduce_array_dimensions(where, full_rank, dims, dirs, stride, reduced_rank, reduced_dims, |
| 567 | reduced_dirs, reduced_stride); |
| 568 | |
| 569 | if (full_rank == 0) return array; |
| 570 | if (reduced_rank == full_rank) return array; // nothing to collapse |
| 571 | |
| 572 | /*--------------------------------------------------------------*/ |
| 573 | /*- allocate reduced array and compress full array into it -*/ |
| 574 | /*--------------------------------------------------------------*/ |
| 575 | reduced_grid_size = reduced_dims[0] * reduced_dims[1] * reduced_dims[2]; |
| 576 | size_t reduced_array_size = data_size * reduced_grid_size; |
| 577 | realnum *reduced_array = new realnum[reduced_array_size]; |
| 578 | if (!reduced_array) |
| 579 | meep::abort("%s:%i: out of memory (%zu)", __FILE__, __LINE__, reduced_array_size); |
| 580 | memset(reduced_array, 0, reduced_array_size * sizeof(realnum)); |
| 581 | |
| 582 | size_t n[3] = {0, 0, 0}; |
| 583 | do { |
| 584 | size_t index = n[0] * stride[0] + n[1] * stride[1] + n[2] * stride[2]; |
| 585 | size_t rindex = n[0] * reduced_stride[0] + n[1] * reduced_stride[1] + n[2] * reduced_stride[2]; |
| 586 | for (int i = 0; i < data_size; i++) |
| 587 | reduced_array[data_size * rindex + i] += array[data_size * index + i]; |
| 588 | } while (!increment(n, dims, full_rank)); |
| 589 | |
| 590 | *rank = reduced_rank; |
| 591 | for (int r = 0; r < reduced_rank; r++) { |
| 592 | dims[r] = reduced_dims[r]; |
| 593 | dirs[r] = reduced_dirs[r]; |
| 594 | } |
| 595 | delete[] array; |
| 596 | return reduced_array; |
| 597 | } |
| 598 | |
| 599 | complex<realnum> *collapse_array(complex<realnum> *array, int *rank, size_t dims[3], |
| 600 | direction dirs[3], volume where) { |
no test coverage detected