// FIXME long long Epetra_Map Epetra_Util::Create_OneToOne_Map(const Epetra_Map& usermap, bool high_rank_proc_owns_shared) { //if usermap is already 1-to-1 then we'll just return a copy of it. if (usermap.IsOneToOne()) { Epetra_Map newmap(usermap); return(newmap); } int myPID = usermap.Comm().MyPID(); Epetra_Directory* directory = usermap.Comm().CreateDirectory(usermap); int numMyElems = usermap.NumMyElements(); const int* myElems = usermap.MyGlobalElements(); int* owner_procs = new int[numMyElems]; directory->GetDirectoryEntries(usermap, numMyElems, myElems, owner_procs, 0, 0, high_rank_proc_owns_shared); //we'll fill a list of map-elements which belong on this processor int* myOwnedElems = new int[numMyElems]; int numMyOwnedElems = 0; for(int i=0; i<numMyElems; ++i) { int GID = myElems[i]; int owner = owner_procs[i]; if (myPID == owner) { myOwnedElems[numMyOwnedElems++] = GID; } } Epetra_Map one_to_one_map(-1, numMyOwnedElems, myOwnedElems, usermap.IndexBase(), usermap.Comm()); delete [] myOwnedElems; delete [] owner_procs; delete directory; return(one_to_one_map); }