150 size_t * tgt_points,
size_t count,
152 int * interpolation_complete) {
154 if (*interpolation_complete)
return 0;
158 char const * routine =
"do_search_callback";
164 int comm_rank, comm_size;
171 interp_grid, tgt_points, count, tgt_coords);
174 size_t * src_cells =
xmalloc(count *
sizeof(*src_cells));
176 interp_grid, tgt_coords, count, src_cells);
185 size_t num_unique_src_cells = 0;
186 size_t * src_to_unique_src =
187 xmalloc(temp_result_count *
sizeof(*src_to_unique_src));
188 for (
size_t i = 0, prev_src_cell = SIZE_MAX; i < temp_result_count; ++i) {
189 size_t curr_src_cell = src_cells[i];
190 if (curr_src_cell != prev_src_cell) {
191 src_cells[num_unique_src_cells++] = curr_src_cell;
192 prev_src_cell = curr_src_cell;
194 src_to_unique_src[i] = num_unique_src_cells - 1;
200 interp_grid,
YAC_LOC_CELL, src_cells, num_unique_src_cells);
204 int * orig_src_cell_ranks =
205 xmalloc(num_unique_src_cells *
sizeof(*orig_src_cell_ranks));
206 size_t * orig_src_cell_pos =
207 xmalloc(num_unique_src_cells *
sizeof(*orig_src_cell_pos));
208 for (
size_t i = 0; i < num_unique_src_cells; ++i)
210 src_remote_points + i, orig_src_cell_ranks + i, orig_src_cell_pos + i);
213 size_t * sendcounts, * recvcounts, * sdispls, * rdispls;
215 1, &sendcounts, &recvcounts, &sdispls, &rdispls, comm);
217 for (
size_t i = 0; i < temp_result_count; ++i)
218 sendcounts[orig_src_cell_ranks[src_to_unique_src[i]]]++;
220 1, sendcounts, recvcounts, sdispls, rdispls, comm);
221 size_t request_count = recvcounts[comm_size - 1] + rdispls[comm_size - 1];
227 xmalloc((temp_result_count + request_count) *
sizeof(*request_buffer));
230 request_buffer + temp_result_count;
231 size_t * new_tgt_points =
232 xmalloc(temp_result_count *
sizeof(*new_tgt_points));
233 for (
size_t i = 0; i < temp_result_count; ++i) {
234 size_t unique_src_cell_idx = src_to_unique_src[i];
235 size_t pos = sdispls[orig_src_cell_ranks[unique_src_cell_idx] + 1]++;
237 orig_src_cell_pos[unique_src_cell_idx];
239 src_remote_points[unique_src_cell_idx].
global_id;
240 memcpy(request_send_buffer[pos].
tgt_coord, tgt_field_coords[tgt_points[i]],
242 new_tgt_points[pos] = tgt_points[i];
244 free(src_remote_points);
245 free(orig_src_cell_pos);
246 free(src_to_unique_src);
247 free(orig_src_cell_ranks);
250 memcpy(tgt_points, new_tgt_points, temp_result_count *
sizeof(*tgt_points));
251 free(new_tgt_points);
256 request_send_buffer, sendcounts, sdispls,
257 request_recv_buffer, recvcounts, rdispls,
258 sizeof(*request_recv_buffer), request_data_dt, comm, routine, __LINE__);
265 uint64_t * uint64_t_buffer =
266 xmalloc(num_src_fields * (request_count + temp_result_count) *
267 sizeof(*uint64_t_buffer));
268 uint64_t * temp_num_results_per_src_field_per_tgt = uint64_t_buffer;
269 uint64_t * num_results_per_src_field_per_tgt_uint64 =
270 uint64_t_buffer + num_src_fields * request_count;
271 yac_int * temp_global_ids = NULL;
272 size_t temp_global_ids_array_size = 0;
273 double * temp_w = NULL;
274 size_t temp_w_array_size = 0;
275 size_t temp_weights_count = 0;
280 (request_count == 0) || (compute_weights != NULL),
281 "no callback routine defined on source process")
284 for (
size_t i = 0, k = 0; i < request_count; ++i) {
287 int const * curr_global_result_points[num_src_fields];
288 double * curr_result_weights[num_src_fields];
289 size_t curr_result_counts[num_src_fields];
291 (
double const *)(request_recv_buffer[i].
tgt_coord),
294 curr_global_result_points, curr_result_weights, curr_result_counts,
298 for (
size_t j = 0; j < num_src_fields; ++j, ++k) {
299 size_t curr_count = curr_result_counts[j];
300 temp_num_results_per_src_field_per_tgt[k] = (uint64_t)curr_count;
302 temp_global_ids, temp_global_ids_array_size,
303 temp_weights_count + curr_count);
305 temp_w, temp_w_array_size,
306 temp_weights_count + curr_count);
307 for (
size_t l = 0; l < curr_count; ++l)
308 temp_global_ids[temp_weights_count + l] =
309 (
yac_int)(curr_global_result_points[j][l]);
310 memcpy(temp_w + temp_weights_count, curr_result_weights[j],
311 curr_count *
sizeof(*curr_result_weights));
312 temp_weights_count += curr_count;
315 free(request_buffer);
318 for (
int i = 0; i < comm_size; ++i) {
319 sendcounts[i] *= num_src_fields;
320 recvcounts[i] *= num_src_fields;
321 sdispls[i] *= num_src_fields;
322 rdispls[i] *= num_src_fields;
324 yac_alltoallv_uint64_p2p(
325 temp_num_results_per_src_field_per_tgt, recvcounts, rdispls,
326 num_results_per_src_field_per_tgt_uint64, sendcounts, sdispls, comm,
331 size_t num_weights = 0;
332 size_t * total_num_results_per_src_field =
333 xcalloc(num_src_fields,
sizeof(*total_num_results_per_src_field));
335 uint64_t * curr_num_send_results = temp_num_results_per_src_field_per_tgt;
336 uint64_t * curr_num_recv_results = num_results_per_src_field_per_tgt_uint64;
337 size_t saccu = 0, raccu = 0;
338 for (
int i = 0; i < comm_size; ++i) {
339 size_t num_send_results = recvcounts[i] / num_src_fields;
340 size_t num_recv_results = sendcounts[i] / num_src_fields;
341 size_t num_send_weights = 0;
342 size_t num_recv_weights = 0;
343 for (
size_t j = 0; j < num_send_results; ++j)
344 for (
size_t k = 0; k < num_src_fields; ++k, ++curr_num_send_results)
345 num_send_weights += (
size_t)*curr_num_send_results;
346 for (
size_t j = 0; j < num_recv_results; ++j) {
347 for (
size_t k = 0; k < num_src_fields; ++k, ++curr_num_recv_results) {
348 size_t curr_count = (size_t)*curr_num_recv_results;
349 num_recv_weights += curr_count;
350 total_num_results_per_src_field[k] += curr_count;
355 sendcounts[i] = num_send_weights;
356 recvcounts[i] = num_recv_weights;
357 saccu += num_send_weights;
358 raccu += num_recv_weights;
359 num_weights += num_recv_weights;
363 double * w =
xmalloc(num_weights *
sizeof(*w));
364 yac_int * global_ids =
xmalloc(num_weights *
sizeof(*global_ids));
367 yac_alltoallv_dble_p2p(
368 temp_w, sendcounts, sdispls, w, recvcounts, rdispls, comm,
370 yac_alltoallv_yac_int_p2p(
371 temp_global_ids, sendcounts, sdispls,
372 global_ids, recvcounts, rdispls, comm, routine, __LINE__);
375 free(temp_global_ids);
378 size_t * interpolated_flag =
379 xmalloc(temp_result_count *
sizeof(*interpolated_flag));
380 size_t result_count = 0;
381 for (
size_t i = 0, k = 0; i < temp_result_count; ++i) {
383 for (
size_t j = 0; j < num_src_fields; ++j, ++k)
384 flag |= (num_results_per_src_field_per_tgt_uint64[k] > 0);
386 if (result_count != i)
388 num_results_per_src_field_per_tgt_uint64 + result_count * num_src_fields,
389 num_results_per_src_field_per_tgt_uint64 + i * num_src_fields,
390 num_src_fields *
sizeof(*num_results_per_src_field_per_tgt_uint64));
391 interpolated_flag[i] = result_count++;
393 interpolated_flag[i] = SIZE_MAX;
400 interpolated_flag, temp_result_count, tgt_points);
401 free(interpolated_flag);
404 size_t * global_id_reorder_idx =
405 xmalloc((num_weights + num_src_fields) *
sizeof(*global_id_reorder_idx));
406 size_t * src_field_displ = global_id_reorder_idx + num_weights;
407 size_t max_num_results_per_src_field = 0;
408 size_t * num_results_per_src_field_per_tgt =
409 xmalloc(result_count * num_src_fields *
410 sizeof(*num_results_per_src_field_per_tgt));
411 for (
size_t i = 0, accu = 0; i < num_src_fields; ++i) {
412 src_field_displ[i] = accu;
413 accu += total_num_results_per_src_field[i];
414 if (max_num_results_per_src_field < total_num_results_per_src_field[i])
415 max_num_results_per_src_field = total_num_results_per_src_field[i];
417 for (
size_t i = 0, k = 0, l = 0; i < result_count; ++i) {
418 for (
size_t j = 0; j < num_src_fields; ++j, ++k) {
419 num_results_per_src_field_per_tgt[k] =
420 (size_t)(num_results_per_src_field_per_tgt_uint64[k]);
422 (size_t)(num_results_per_src_field_per_tgt_uint64[k]);
423 for (
size_t m = 0; m < curr_count; ++m, ++l)
424 global_id_reorder_idx[l] = src_field_displ[j]++;
428 global_id_reorder_idx, num_weights, global_ids);
429 free(uint64_t_buffer);
430 free(global_id_reorder_idx);
434 size_t * result_point_buffer =
435 xmalloc(max_num_results_per_src_field *
sizeof(*result_point_buffer));
436 for (
size_t i = 0, offset = 0; i < num_src_fields; ++i) {
437 size_t curr_count = total_num_results_per_src_field[i];
439 interp_grid, i, global_ids + offset, curr_count, result_point_buffer);
442 interp_grid, i, result_point_buffer, curr_count);
443 offset += curr_count;
445 free(result_point_buffer);
447 free(total_num_results_per_src_field);
452 interp_grid, tgt_points, result_count),
453 .count = result_count};
457 weights, &tgts, num_results_per_src_field_per_tgt, srcs_per_field, w,
461 for (
size_t i = 0; i < num_src_fields; ++i) free(srcs_per_field[i]);
462 free(num_results_per_src_field_per_tgt);