39 double const coord[3]) {
41 size_t const * cell_to_vertex =
48 double min_distance = DBL_MAX;
49 size_t min_vertex = SIZE_MAX;
50 yac_int min_vertex_id = XT_INT_MAX;
52 for (
size_t i = 0; i < num_vertices; ++i) {
53 size_t curr_vertex = cell_to_vertex[i];
54 double curr_distance =
56 if (curr_distance < min_distance) {
57 min_distance = curr_distance;
58 min_vertex = curr_vertex;
59 min_vertex_id = vertex_ids[curr_vertex];
60 }
else if ((curr_distance == min_distance) &&
61 (vertex_ids[curr_vertex] < min_vertex_id)) {
63 min_vertex = curr_vertex;
64 min_vertex_id = vertex_ids[curr_vertex];
72 size_t * tgt_points,
size_t count,
79 "ERROR(do_search_ncc): invalid number of source fields")
83 "ERROR(do_search_ncc): unsupported source field location type "
89 interp_grid, tgt_points, count, tgt_coords);
91 size_t * size_t_buffer =
xmalloc(3 * count *
sizeof(*size_t_buffer));
92 size_t * src_cells = size_t_buffer;
93 size_t * src_corners = src_cells;
94 size_t * reorder_idx = size_t_buffer + count;
95 size_t * interp_flag = size_t_buffer + 2 * count;
99 interp_grid, tgt_coords, count, src_cells);
103 for (
size_t i = 0; i < count; ++i) reorder_idx[i] = i;
106 size_t result_count = 0;
107 for (result_count = 0; result_count < count; ++result_count)
108 if (src_cells[result_count] == SIZE_MAX)
break;
109 for (
size_t i = result_count; i < count; ++i)
110 interp_flag[reorder_idx[i]] = SIZE_MAX;
116 for (
size_t i = 0; i < result_count; ++i)
119 src_grid_data, src_cells[i], tgt_coords[reorder_idx[i]]);
124 src_corners, result_count, reorder_idx);
127 size_t num_unique_src_corners = 0;
128 for (
size_t i = 0, prev_src_corner = SIZE_MAX; i < result_count; ++i) {
129 size_t curr_src_corner = src_corners[i];
130 if (prev_src_corner != curr_src_corner) {
131 prev_src_corner = curr_src_corner;
132 ++num_unique_src_corners;
138 size_t * num_tgt_per_corner =
139 xcalloc(num_unique_src_corners,
sizeof(*num_tgt_per_corner));
140 num_unique_src_corners = 0;
141 for (
size_t i = 0, prev_src_corner = SIZE_MAX; i < result_count; ++i) {
142 size_t curr_src_corner = src_corners[i];
143 if (prev_src_corner != curr_src_corner) {
144 prev_src_corner = curr_src_corner;
145 src_corners[num_unique_src_corners] = curr_src_corner;
146 ++num_unique_src_corners;
148 num_tgt_per_corner[num_unique_src_corners-1]++;
153 size_t * src_corner_cells = NULL;
154 size_t * num_cells_per_corner =
155 xmalloc(num_unique_src_corners *
sizeof(*num_cells_per_corner));
157 interp_grid, src_corners, num_unique_src_corners, &src_corner_cells,
158 num_cells_per_corner);
161 size_t max_num_cell_per_corner = 0;
162 size_t total_num_weights = 0;
163 for (
size_t i = 0; i < num_unique_src_corners; ++i) {
164 if (max_num_cell_per_corner < num_cells_per_corner[i])
165 max_num_cell_per_corner = num_cells_per_corner[i];
166 total_num_weights += num_cells_per_corner[i] * num_tgt_per_corner[i];
175 xmalloc(max_num_cell_per_corner *
sizeof(*src_coord_buffer));
177 (src_field_mask != NULL)?
178 xmalloc(max_num_cell_per_corner *
sizeof(*mask_buffer)):NULL;
179 double * w =
xmalloc(total_num_weights *
sizeof(*w));
180 size_t * src_points =
xmalloc(total_num_weights *
sizeof(*src_points));
181 size_t * num_weights_per_tgt =
182 xmalloc(result_count *
sizeof(*num_weights_per_tgt));
187 total_num_weights = 0;
189 for (
size_t i = 0, l = 0, src_corner_cell_offset = 0;
190 i < num_unique_src_corners; ++i) {
192 size_t curr_num_cells = num_cells_per_corner[i];
195 src_corner_cells + src_corner_cell_offset;
196 src_corner_cell_offset += curr_num_cells;
199 for (
size_t j = 0; j < curr_num_cells; ++j) {
200 size_t const curr_src_cell = curr_src_corner_cells[j];
201 for (
size_t k = 0; k < 3; ++k)
202 src_coord_buffer[j][k] = src_field_coordinates[curr_src_cell][k];
203 if (src_field_mask != NULL)
204 mask_buffer[j] = src_field_mask[curr_src_cell];
207 for (
size_t j = 0; j < num_tgt_per_corner[i]; ++j, ++l) {
211 tgt_coords[reorder_idx[l]], curr_num_cells,
213 mask_buffer, w + total_num_weights)) {
215 interp_flag[reorder_idx[l]] = result_count;
217 src_points + total_num_weights, curr_src_corner_cells,
218 curr_num_cells *
sizeof(*src_points));
219 num_weights_per_tgt[result_count] = curr_num_cells;
220 total_num_weights += curr_num_cells;
223 interp_flag[reorder_idx[l]] = SIZE_MAX;
228 free(src_corner_cells);
229 free(num_tgt_per_corner);
230 free(num_cells_per_corner);
238 free(src_coord_buffer);
244 interp_grid, tgt_points, result_count),
245 .count = result_count};
248 interp_grid, 0, src_points, total_num_weights);
252 weights, &tgts, num_weights_per_tgt, srcs, w);
257 free(num_weights_per_tgt);