83 const char * yo =
"Zoltan2_Directory::allocate";
90 size_t array[3], max_array[3], min_array[3];
91 array[0] =
sizeof(lid_t);
92 array[1] =
sizeof(gid_t);
94 Teuchos::reduceAll<int,size_t>(
95 *
comm, Teuchos::REDUCE_MAX, 3, array, max_array);
96 Teuchos::reduceAll<int,size_t>(
97 *
comm, Teuchos::REDUCE_MIN, 3, array, min_array);
98 if (max_array[0] != min_array[0] || max_array[1] != min_array[1]
99 || max_array[2] != min_array[2]) {
100 throw std::invalid_argument(
101 "Zoltan2_Directory() LID, GID, USER data lengths differ globally");
112 size_t size =
sizeof(gid_t) + (
use_lid?
sizeof(lid_t):0) + user_base_size;
118 size =
sizeof(gid_t);
135 max_id_size = std::max(
sizeof(gid_t),
sizeof(lid_t));
164 size_t count,
const gid_t * gid,
const lid_t * lid,
165 const user_t * user,
const int * partition,
170 this->
mode = update_mode;
172 const char * yo =
"Zoltan2_Directory::update";
181 for(
size_t n = 0; n <
node_map.size(); ++n) {
193 Teuchos::ArrayRCP<int> procs;
195 procs = Teuchos::arcp(
new int[count], 0, count,
true);
199 Teuchos::ArrayRCP<int> msg_sizes;
200 int sum_msg_size = 0;
202 msg_sizes = Teuchos::arcp(
new int[count], 0, count,
true);
203 for (
size_t i = 0; i < count; i++) {
205 sum_msg_size += msg_size;
206 msg_sizes[i] = msg_size;
213 Teuchos::ArrayRCP<char> sbuff;
215 sbuff = Teuchos::arcp(
new char[sum_msg_size], 0, sum_msg_size,
true);
221 int track_offset = 0;
222 char * trackptr = sbuff.getRawPtr();
223 for (
size_t i = 0; i < count; i++) {
229 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
232 ptr->lid_flag = lid ? 1 : 0;
233 ptr->user_flag = user ? 1 : 0;
234 ptr->partition_flag = partition ? 1 : 0;
235 ptr->partition = partition ? partition[i] : -1;
236 ptr->owner =
comm->getRank();
239 gid_t * pgid = ptr->adjData;
245 throw std::logic_error(
246 "Did not pass lid values but directory was created to use them!");
248 lid_t * plid =
reinterpret_cast<lid_t*
>(ptr->adjData + 1);
253 throw std::logic_error(
254 "Passed lid values but directory was created not to use them!");
260 reinterpret_cast<char*
>(ptr->adjData) +
sizeof(gid_t) +
277 size_t new_update_msg_size =
279 track_offset += new_update_msg_size;
280 trackptr += new_update_msg_size;
285 if(track_offset != sum_msg_size) {
286 throw std::logic_error(
"Bad summing!");
298 int nrec = directoryComm.
getNRec();
301 throw std::logic_error(
"Zoltan2_Directory::update() Comm_Create error");
308 int sum_recv_sizes = 0;
311 err = directoryComm.
resize(msg_sizes,
319 throw std::logic_error(
"directoryComm.execute_resize error");
326 if(nrec &&
static_cast<int>(
node_map.size()) < nrec) {
332 rehash_node_map(nrec);
336 Teuchos::ArrayRCP<char> rbuff;
337 if(sum_recv_sizes > 0) {
338 rbuff = Teuchos::arcp(
339 new char[sum_recv_sizes], 0, sum_recv_sizes,
true);
347 sbuff, nbytes, rbuff);
350 throw std::logic_error(
"Zoltan2_Directory::update() Comm_Do error");
361 trackptr = rbuff.getRawPtr();
362 for (
int i = 0; i < nrec; i++) {
363 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
365 user_t * puser = (ptr->user_flag) ?
366 (
user_t*)(
reinterpret_cast<char*
>(ptr->adjData) +
367 sizeof(gid_t) + (
use_lid?
sizeof(lid_t):0)) : NULL;
370 (ptr->lid_flag) ?
reinterpret_cast<lid_t*
>(ptr->adjData + 1) : NULL,
372 (ptr->partition_flag) ? (ptr->partition) : -1,
382 trackptr += delta_msg_size;
383 track_offset += delta_msg_size;
388 if(track_offset != sum_recv_sizes) {
389 throw std::logic_error(
"Did not sum!");
399 err = (errcount) ? 1 : 0;
404 sprintf (str,
"Processed %lu GIDs (%d local), %d GID errors", count,
575 bool throw_if_missing)
577 const char * yo =
"Zoltan2_Directory::find";
586 Teuchos::ArrayRCP<int> procs;
588 procs = Teuchos::arcp(
589 new int[count], 0, count,
true);
593 for (
size_t i = 0; i < count; i++) {
600 int nrec = directoryComm.
getNRec();
607 throw std::logic_error(
"Zoltan2_Directory::find() error");
610 Teuchos::ArrayRCP<char> sbuff;
619 char *trackptr = sbuff.getRawPtr();
620 for (
size_t i = 0; i < count; i++) {
621 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
623 ptr->proc = procs[i];
624 *(ptr->adjData) = gid[i];
633 throw std::logic_error(
"directoryComm.execute_resize error");
637 Teuchos::ArrayRCP<char> rbuff;
649 throw std::logic_error(
"Zoltan2_Directory::find() error");
658 Teuchos::ArrayRCP<int> rmsg_sizes_resized;
660 rmsg_sizes_resized = Teuchos::arcp(
new int[nrec], 0, nrec,
true);
662 Teuchos::ArrayRCP<int>::size_type sum_rmsg_sizes_resized = 0;
664 char *track_ptr = rbuff.getRawPtr();
665 for (
int i = 0; i < nrec; i++) {
666 msg_t *msg =
reinterpret_cast<msg_t*
>(track_ptr);
670 rmsg_sizes_resized[i] = find_rmsg_size_resized;
671 sum_rmsg_sizes_resized += find_rmsg_size_resized;
674 Teuchos::ArrayRCP<char>::size_type track_offset_resized = 0;
676 Teuchos::ArrayRCP<char> rbuff_resized_build;
680 if(sum_rmsg_sizes_resized > 0) {
681 rbuff_resized_build = Teuchos::arcp(
new char[sum_rmsg_sizes_resized],
682 0, sum_rmsg_sizes_resized,
true);
685 track_ptr = rbuff.getRawPtr();
686 char * track_ptr_resized = rbuff_resized_build.getRawPtr();
687 for (
int i = 0; i < nrec; i++) {
690 track_ptr_resized += rmsg_sizes_resized[i];
697 rbuff_resized_build : rbuff;
700 track_offset_resized = 0;
701 track_ptr = rbuff_resized.getRawPtr();
702 for (
int i = 0; i < nrec; i++) {
704 find_msg_t *ptr =
reinterpret_cast<find_msg_t*
>(track_ptr);
706 reinterpret_cast<char*
>(ptr->adjData) +
max_id_size);
712 err =
find_local(ptr->adjData, (lid_t*)ptr->adjData,
713 puser, &ptr->partition, &ptr->proc, throw_if_missing);
715 const size_t & size_shift = rmsg_sizes_resized[i];
716 track_offset_resized += size_shift;
717 track_ptr += size_shift;
720 if(track_offset_resized != sum_rmsg_sizes_resized) {
721 throw std::logic_error(
"Bad sum!");
727 Teuchos::ArrayRCP<char> sbuff_resized;
729 sbuff_resized = sbuff;
734 rbuff_resized, size_scale, rmsg_sizes_resized, sbuff_resized);
738 rbuff_resized, size_scale, Teuchos::null, sbuff_resized);
742 throw std::logic_error(
"Zoltan2_Directory::find() do reverse failed");
750 track_offset_resized = 0;
753 char * trackptr_resized = sbuff_resized.getRawPtr();
754 for (
size_t i = 0; i < count; i++) {
756 if(track_offset_resized >= sbuff_resized.size()) {
758 "%d has gid.size() %d track_offset_resized: %d sbuff_resized: %d\n",
760 (
int) count, (
int) track_offset_resized, (
int) sbuff_resized.size());
761 throw std::logic_error(
"Bad buffer overflow! Internal error.");
764 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr_resized);
767 owner[ptr->index] = ptr->proc;
769 partition[ptr->index] = ptr->partition ;
771 memcpy (&lid[ptr->index], ptr->adjData,
sizeof(lid_t));
775 reinterpret_cast<char*
>(ptr->adjData) +
max_id_size);
783 if(ptr->proc != -1 && user) {
790 trackptr_resized += incoming_size;
791 track_offset_resized += incoming_size;
794 if(track_offset_resized != sbuff_resized.size()) {
795 throw std::logic_error(
"Bad buffer sum!");
803 Teuchos::reduceAll<int>(*
comm, Teuchos::REDUCE_SUM, 1, &errcount, &err);
809 sprintf(str,
"Processed %lu GIDs, GIDs not found: %d", count, errcount);
int find(size_t length, const gid_t *gid, lid_t *lid, user_t *user, int *partition, int *owner, bool throw_if_missing=true)
Can be Replace, Add, or Aggregate.