46 const char * yo =
"Zoltan2_Directory::allocate";
53 size_t array[3], max_array[3], min_array[3];
54 array[0] =
sizeof(lid_t);
55 array[1] =
sizeof(gid_t);
57 Teuchos::reduceAll<int,size_t>(
58 *
comm, Teuchos::REDUCE_MAX, 3, array, max_array);
59 Teuchos::reduceAll<int,size_t>(
60 *
comm, Teuchos::REDUCE_MIN, 3, array, min_array);
61 if (max_array[0] != min_array[0] || max_array[1] != min_array[1]
62 || max_array[2] != min_array[2]) {
63 throw std::invalid_argument(
64 "Zoltan2_Directory() LID, GID, USER data lengths differ globally");
75 size_t size =
sizeof(gid_t) + (
use_lid?
sizeof(lid_t):0) + user_base_size;
98 max_id_size = std::max(
sizeof(gid_t),
sizeof(lid_t));
127 size_t count,
const gid_t * gid,
const lid_t * lid,
128 const user_t * user,
const int * partition,
133 this->
mode = update_mode;
135 const char * yo =
"Zoltan2_Directory::update";
144 for(
size_t n = 0; n <
node_map.size(); ++n) {
156 Teuchos::ArrayRCP<int> procs;
158 procs = Teuchos::arcp(
new int[count], 0, count,
true);
162 Teuchos::ArrayRCP<int> msg_sizes;
163 int sum_msg_size = 0;
165 msg_sizes = Teuchos::arcp(
new int[count], 0, count,
true);
166 for (
size_t i = 0; i < count; i++) {
168 sum_msg_size += msg_size;
169 msg_sizes[i] = msg_size;
176 Teuchos::ArrayRCP<char> sbuff;
178 sbuff = Teuchos::arcp(
new char[sum_msg_size], 0, sum_msg_size,
true);
184 int track_offset = 0;
185 char * trackptr = sbuff.getRawPtr();
186 for (
size_t i = 0; i < count; i++) {
192 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
195 ptr->lid_flag = lid ? 1 : 0;
196 ptr->user_flag = user ? 1 : 0;
197 ptr->partition_flag = partition ? 1 : 0;
198 ptr->partition = partition ? partition[i] : -1;
199 ptr->owner =
comm->getRank();
202 gid_t * pgid = ptr->adjData;
208 throw std::logic_error(
209 "Did not pass lid values but directory was created to use them!");
211 lid_t * plid =
reinterpret_cast<lid_t*
>(ptr->adjData + 1);
216 throw std::logic_error(
217 "Passed lid values but directory was created not to use them!");
223 reinterpret_cast<char*
>(ptr->adjData) +
sizeof(gid_t) +
240 size_t new_update_msg_size =
242 track_offset += new_update_msg_size;
243 trackptr += new_update_msg_size;
248 if(track_offset != sum_msg_size) {
249 throw std::logic_error(
"Bad summing!");
261 int nrec = directoryComm.
getNRec();
264 throw std::logic_error(
"Zoltan2_Directory::update() Comm_Create error");
271 int sum_recv_sizes = 0;
274 err = directoryComm.
resize(msg_sizes,
282 throw std::logic_error(
"directoryComm.execute_resize error");
289 if(nrec &&
static_cast<int>(
node_map.size()) < nrec) {
295 rehash_node_map(nrec);
299 Teuchos::ArrayRCP<char> rbuff;
300 if(sum_recv_sizes > 0) {
301 rbuff = Teuchos::arcp(
302 new char[sum_recv_sizes], 0, sum_recv_sizes,
true);
310 sbuff, nbytes, rbuff);
313 throw std::logic_error(
"Zoltan2_Directory::update() Comm_Do error");
324 trackptr = rbuff.getRawPtr();
325 for (
int i = 0; i < nrec; i++) {
326 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
328 user_t * puser = (ptr->user_flag) ?
329 (
user_t*)(
reinterpret_cast<char*
>(ptr->adjData) +
330 sizeof(gid_t) + (
use_lid?
sizeof(lid_t):0)) : NULL;
333 (ptr->lid_flag) ?
reinterpret_cast<lid_t*
>(ptr->adjData + 1) : NULL,
335 (ptr->partition_flag) ? (ptr->partition) : -1,
345 trackptr += delta_msg_size;
346 track_offset += delta_msg_size;
351 if(track_offset != sum_recv_sizes) {
352 throw std::logic_error(
"Did not sum!");
362 err = (errcount) ? 1 : 0;
367 sprintf (str,
"Processed %lu GIDs (%d local), %d GID errors", count,
538 bool throw_if_missing)
540 const char * yo =
"Zoltan2_Directory::find";
549 Teuchos::ArrayRCP<int> procs;
551 procs = Teuchos::arcp(
552 new int[count], 0, count,
true);
556 for (
size_t i = 0; i < count; i++) {
563 int nrec = directoryComm.
getNRec();
570 throw std::logic_error(
"Zoltan2_Directory::find() error");
573 Teuchos::ArrayRCP<char> sbuff;
582 char *trackptr = sbuff.getRawPtr();
583 for (
size_t i = 0; i < count; i++) {
584 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr);
586 ptr->proc = procs[i];
587 *(ptr->adjData) = gid[i];
596 throw std::logic_error(
"directoryComm.execute_resize error");
600 Teuchos::ArrayRCP<char> rbuff;
612 throw std::logic_error(
"Zoltan2_Directory::find() error");
621 Teuchos::ArrayRCP<int> rmsg_sizes_resized;
623 rmsg_sizes_resized = Teuchos::arcp(
new int[nrec], 0, nrec,
true);
625 Teuchos::ArrayRCP<int>::size_type sum_rmsg_sizes_resized = 0;
627 char *track_ptr = rbuff.getRawPtr();
628 for (
int i = 0; i < nrec; i++) {
629 msg_t *msg =
reinterpret_cast<msg_t*
>(track_ptr);
633 rmsg_sizes_resized[i] = find_rmsg_size_resized;
634 sum_rmsg_sizes_resized += find_rmsg_size_resized;
637 Teuchos::ArrayRCP<char>::size_type track_offset_resized = 0;
639 Teuchos::ArrayRCP<char> rbuff_resized_build;
643 if(sum_rmsg_sizes_resized > 0) {
644 rbuff_resized_build = Teuchos::arcp(
new char[sum_rmsg_sizes_resized],
645 0, sum_rmsg_sizes_resized,
true);
648 track_ptr = rbuff.getRawPtr();
649 char * track_ptr_resized = rbuff_resized_build.getRawPtr();
650 for (
int i = 0; i < nrec; i++) {
653 track_ptr_resized += rmsg_sizes_resized[i];
660 rbuff_resized_build : rbuff;
663 track_offset_resized = 0;
664 track_ptr = rbuff_resized.getRawPtr();
665 for (
int i = 0; i < nrec; i++) {
667 find_msg_t *ptr =
reinterpret_cast<find_msg_t*
>(track_ptr);
669 reinterpret_cast<char*
>(ptr->adjData) +
max_id_size);
675 err =
find_local(ptr->adjData, (lid_t*)ptr->adjData,
676 puser, &ptr->partition, &ptr->proc, throw_if_missing);
678 const size_t & size_shift = rmsg_sizes_resized[i];
679 track_offset_resized += size_shift;
680 track_ptr += size_shift;
683 if(track_offset_resized != sum_rmsg_sizes_resized) {
684 throw std::logic_error(
"Bad sum!");
690 Teuchos::ArrayRCP<char> sbuff_resized;
692 sbuff_resized = sbuff;
697 rbuff_resized, size_scale, rmsg_sizes_resized, sbuff_resized);
701 rbuff_resized, size_scale, Teuchos::null, sbuff_resized);
705 throw std::logic_error(
"Zoltan2_Directory::find() do reverse failed");
713 track_offset_resized = 0;
716 char * trackptr_resized = sbuff_resized.getRawPtr();
717 for (
size_t i = 0; i < count; i++) {
719 if(track_offset_resized >= sbuff_resized.size()) {
721 "%d has gid.size() %d track_offset_resized: %d sbuff_resized: %d\n",
723 (
int) count, (
int) track_offset_resized, (
int) sbuff_resized.size());
724 throw std::logic_error(
"Bad buffer overflow! Internal error.");
727 msg_t *ptr =
reinterpret_cast<msg_t*
>(trackptr_resized);
730 owner[ptr->index] = ptr->proc;
732 partition[ptr->index] = ptr->partition ;
734 memcpy (&lid[ptr->index], ptr->adjData,
sizeof(lid_t));
738 reinterpret_cast<char*
>(ptr->adjData) +
max_id_size);
746 if(ptr->proc != -1 && user) {
753 trackptr_resized += incoming_size;
754 track_offset_resized += incoming_size;
757 if(track_offset_resized != sbuff_resized.size()) {
758 throw std::logic_error(
"Bad buffer sum!");
766 Teuchos::reduceAll<int>(*
comm, Teuchos::REDUCE_SUM, 1, &errcount, &err);
772 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.