get the dimensions of reduced arrays (i.e., arrays collapsed along empty dimensions of original volume)
| 523 | // get the dimensions of reduced arrays (i.e., arrays collapsed along empty dimensions of original |
| 524 | // volume) |
| 525 | void reduce_array_dimensions(volume where, int rank, size_t dims[3], direction dirs[3], |
| 526 | size_t stride[3], int &reduced_rank, size_t reduced_dims[3], |
| 527 | direction reduced_dirs[3], size_t reduced_stride[3]) { |
| 528 | |
| 529 | reduced_rank = 0; |
| 530 | reduced_dims[0] = reduced_dims[1] = reduced_dims[2] = stride[0] = stride[1] = stride[2] = |
| 531 | reduced_stride[0] = reduced_stride[1] = reduced_stride[2] = 1; |
| 532 | for (int r = 0; r < rank; r++) { |
| 533 | if (where.in_direction(dirs[r]) == 0.0) |
| 534 | reduced_stride[r] = 0; // degenerate dimension, to be collapsed |
| 535 | else { |
| 536 | reduced_dirs[reduced_rank] = dirs[r]; |
| 537 | reduced_dims[reduced_rank++] = |
| 538 | dims[r]; // reduced_dims is the size of the array after collapsing |
| 539 | } |
| 540 | } |
| 541 | /*--------------------------------------------------------------*/ |
| 542 | /*- set up strides into full and reduced arrays */ |
| 543 | /*--------------------------------------------------------------*/ |
| 544 | if (rank == 2) |
| 545 | stride[0] = dims[1]; // rstride is already all set in this case |
| 546 | else if (rank == 3) { |
| 547 | stride[0] = dims[1] * dims[2]; |
| 548 | stride[1] = dims[2]; |
| 549 | if (reduced_rank == 2) reduced_stride[reduced_stride[0] != 0 ? 0 : 1] = reduced_dims[1]; |
| 550 | } |
| 551 | } |
| 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, |
no test coverage detected