73 size_t * tgt_points,
size_t count,
75 int * interpolation_complete) {
77 if (*interpolation_complete)
return 0;
83 "ERROR(do_search_ncc): invalid number of source fields")
87 "ERROR(do_search_ncc): unsupported source field location type "
93 interp_grid, tgt_points, count, tgt_coords);
95 size_t * size_t_buffer =
xmalloc(3 * count *
sizeof(*size_t_buffer));
96 size_t * src_cells = size_t_buffer;
97 size_t * src_corners = src_cells;
98 size_t * reorder_idx = size_t_buffer + count;
99 size_t * interp_flag = size_t_buffer + 2 * count;
103 interp_grid, tgt_coords, count, src_cells);
107 for (
size_t i = 0; i < count; ++i) reorder_idx[i] = i;
110 size_t result_count = 0;
111 for (result_count = 0; result_count < count; ++result_count)
112 if (src_cells[result_count] == SIZE_MAX)
break;
113 for (
size_t i = result_count; i < count; ++i)
114 interp_flag[reorder_idx[i]] = SIZE_MAX;
120 for (
size_t i = 0; i < result_count; ++i)
123 src_grid_data, src_cells[i], tgt_coords[reorder_idx[i]]);
128 src_corners, result_count, reorder_idx);
131 size_t num_unique_src_corners = 0;
132 for (
size_t i = 0, prev_src_corner = SIZE_MAX; i < result_count; ++i) {
133 size_t curr_src_corner = src_corners[i];
134 if (prev_src_corner != curr_src_corner) {
135 prev_src_corner = curr_src_corner;
136 ++num_unique_src_corners;
142 size_t * num_tgt_per_corner =
143 xcalloc(num_unique_src_corners,
sizeof(*num_tgt_per_corner));
144 num_unique_src_corners = 0;
145 for (
size_t i = 0, prev_src_corner = SIZE_MAX; i < result_count; ++i) {
146 size_t curr_src_corner = src_corners[i];
147 if (prev_src_corner != curr_src_corner) {
148 prev_src_corner = curr_src_corner;
149 src_corners[num_unique_src_corners] = curr_src_corner;
150 ++num_unique_src_corners;
152 num_tgt_per_corner[num_unique_src_corners-1]++;
157 size_t * src_corner_cells = NULL;
158 size_t * num_cells_per_corner =
159 xmalloc(num_unique_src_corners *
sizeof(*num_cells_per_corner));
161 interp_grid, src_corners, num_unique_src_corners, &src_corner_cells,
162 num_cells_per_corner);
165 size_t max_num_cell_per_corner = 0;
166 size_t total_num_weights = 0;
167 for (
size_t i = 0; i < num_unique_src_corners; ++i) {
168 if (max_num_cell_per_corner < num_cells_per_corner[i])
169 max_num_cell_per_corner = num_cells_per_corner[i];
170 total_num_weights += num_cells_per_corner[i] * num_tgt_per_corner[i];
179 xmalloc(max_num_cell_per_corner *
sizeof(*src_coord_buffer));
181 (src_field_mask != NULL)?
182 xmalloc(max_num_cell_per_corner *
sizeof(*mask_buffer)):NULL;
183 double * w =
xmalloc(total_num_weights *
sizeof(*w));
184 size_t * src_points =
xmalloc(total_num_weights *
sizeof(*src_points));
185 size_t * num_weights_per_tgt =
186 xmalloc(result_count *
sizeof(*num_weights_per_tgt));
191 total_num_weights = 0;
193 for (
size_t i = 0, l = 0, src_corner_cell_offset = 0;
194 i < num_unique_src_corners; ++i) {
196 size_t curr_num_cells = num_cells_per_corner[i];
199 src_corner_cells + src_corner_cell_offset;
200 src_corner_cell_offset += curr_num_cells;
203 for (
size_t j = 0; j < curr_num_cells; ++j) {
204 size_t const curr_src_cell = curr_src_corner_cells[j];
205 for (
size_t k = 0; k < 3; ++k)
206 src_coord_buffer[j][k] = src_field_coordinates[curr_src_cell][k];
207 if (src_field_mask != NULL)
208 mask_buffer[j] = src_field_mask[curr_src_cell];
211 for (
size_t j = 0; j < num_tgt_per_corner[i]; ++j, ++l) {
215 tgt_coords[reorder_idx[l]], curr_num_cells,
217 mask_buffer, w + total_num_weights)) {
219 interp_flag[reorder_idx[l]] = result_count;
221 src_points + total_num_weights, curr_src_corner_cells,
222 curr_num_cells *
sizeof(*src_points));
223 num_weights_per_tgt[result_count] = curr_num_cells;
224 total_num_weights += curr_num_cells;
227 interp_flag[reorder_idx[l]] = SIZE_MAX;
232 free(src_corner_cells);
233 free(num_tgt_per_corner);
234 free(num_cells_per_corner);
242 free(src_coord_buffer);
248 interp_grid, tgt_points, result_count),
249 .count = result_count};
252 interp_grid, 0, src_points, total_num_weights);
256 weights, &tgts, num_weights_per_tgt, srcs, w);
261 free(num_weights_per_tgt);