| 746 | } |
| 747 | |
| 748 | complex<realnum> *fields::get_source_slice(const volume &where, component source_slice_component, |
| 749 | complex<realnum> *slice) { |
| 750 | size_t dims[3]; |
| 751 | direction dirs[3]; |
| 752 | vec min_max_loc[2]; |
| 753 | int rank = get_array_slice_dimensions(where, dims, dirs, false, false, min_max_loc); |
| 754 | size_t slice_size = dims[0] * (rank >= 2 ? dims[1] : 1) * (rank == 3 ? dims[2] : 1); |
| 755 | |
| 756 | source_slice_data data; |
| 757 | data.source_component = source_slice_component; |
| 758 | data.slice_imin = gv.round_vec(min_max_loc[0]); |
| 759 | data.slice_imax = gv.round_vec(min_max_loc[1]); |
| 760 | data.slice = new complex<realnum>[slice_size]; |
| 761 | if (!data.slice) meep::abort("%s:%i: out of memory (%zu)", __FILE__, __LINE__, slice_size); |
| 762 | |
| 763 | loop_in_chunks(get_source_slice_chunkloop, (void *)&data, where, Centered, true, false); |
| 764 | |
| 765 | complex<realnum> *slice_collapsed = collapse_array(data.slice, &rank, dims, dirs, where); |
| 766 | rank = get_array_slice_dimensions(where, dims, dirs, true, false); |
| 767 | slice_size = dims[0] * (rank >= 2 ? dims[1] : 1) * (rank == 3 ? dims[2] : 1); |
| 768 | |
| 769 | if (slice) { |
| 770 | memcpy(slice, slice_collapsed, 2 * slice_size * sizeof(realnum)); |
| 771 | delete[] (complex<realnum> *)slice_collapsed; |
| 772 | } |
| 773 | else |
| 774 | slice = slice_collapsed; |
| 775 | |
| 776 | array_to_all(slice, slice_size); |
| 777 | |
| 778 | return slice; |
| 779 | } |
| 780 | |
| 781 | /***************************************************************/ |
| 782 | /***************************************************************/ |
no test coverage detected