MCPcopy Create free account
hub / github.com/NanoComp/meep / collapse_array

Function collapse_array

src/array_slice.cpp:554–597  ·  view source on GitHub ↗

data_size = 1,2 for real,complex-valued array

Source from the content-addressed store, hash-verified

552
553// data_size = 1,2 for real,complex-valued array
554realnum *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
599complex<realnum> *collapse_array(complex<realnum> *array, int *rank, size_t dims[3],
600 direction dirs[3], volume where) {

Callers 4

get_dft_arrayMethod · 0.85
output_dft_componentsMethod · 0.85
do_get_array_sliceMethod · 0.85
get_source_sliceMethod · 0.85

Calls 3

reduce_array_dimensionsFunction · 0.85
abortFunction · 0.85
incrementFunction · 0.85

Tested by

no test coverage detected