Epetra Package Browser (Single Doxygen Collection) Development
Loading...
Searching...
No Matches
Epetra_CrsGraph.h
Go to the documentation of this file.
1/*
2//@HEADER
3// ************************************************************************
4//
5// Epetra: Linear Algebra Services Package
6// Copyright 2011 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
39//
40// ************************************************************************
41//@HEADER
42*/
43
44#ifndef EPETRA_CRSGRAPH_H
45#define EPETRA_CRSGRAPH_H
46
47#include "Epetra_ConfigDefs.h"
48#include "Epetra_DistObject.h"
49#include "Epetra_CrsGraphData.h"
50class Epetra_BlockMap;
51class Epetra_Util;
52class Epetra_Time;
53class Epetra_Import;
54class Epetra_Export;
57
59
213class EPETRA_LIB_DLL_EXPORT Epetra_CrsGraph: public Epetra_DistObject {
214
215 public:
216
218
219
232 Epetra_CrsGraph(Epetra_DataAccess CV, const Epetra_BlockMap& RowMap, const int* NumIndicesPerRow, bool StaticProfile = false);
233
235
248 Epetra_CrsGraph(Epetra_DataAccess CV, const Epetra_BlockMap& RowMap, int NumIndicesPerRow, bool StaticProfile = false);
249
251
266 const Epetra_BlockMap& ColMap, const int* NumIndicesPerRow, bool StaticProfile = false);
267
269
286 const Epetra_BlockMap& ColMap, int NumIndicesPerRow, bool StaticProfile = false);
287
289
292 Epetra_CrsGraph(const Epetra_CrsGraph& Graph);
293
295 virtual ~Epetra_CrsGraph();
297
299
300
315#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
316 int InsertGlobalIndices(int GlobalRow, int NumIndices, int* Indices);
317#endif
318#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
319 int InsertGlobalIndices(long long GlobalRow, int NumIndices, long long* Indices);
320#endif
321
323
332#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
333 int RemoveGlobalIndices(int GlobalRow, int NumIndices, int* Indices);
334#endif
335#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
336 int RemoveGlobalIndices(long long GlobalRow, int NumIndices, long long* Indices);
337#endif
338
340
347 int RemoveGlobalIndices(long long Row);
348
349
351
366 int InsertMyIndices(int LocalRow, int NumIndices, int* Indices);
367
369
378 int RemoveMyIndices(int LocalRow, int NumIndices, int* Indices);
379
381
388 int RemoveMyIndices(int Row);
390
392
393
395
402 int FillComplete();
403
405
417 int FillComplete(const Epetra_BlockMap& DomainMap, const Epetra_BlockMap& RangeMap);
418
420
434 int OptimizeStorage();
435
437
439
440
442
450#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
451 int ExtractGlobalRowCopy(int GlobalRow, int LenOfIndices, int& NumIndices, int* Indices) const;
452#endif
453#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
454 int ExtractGlobalRowCopy(long long GlobalRow, int LenOfIndices, int& NumIndices, long long* Indices) const;
455#endif
456
458
468 int ExtractMyRowCopy(int LocalRow, int LenOfIndices, int& NumIndices, int* Indices) const;
469
471
481#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
482 int ExtractGlobalRowView(int GlobalRow, int& NumIndices, int*& Indices) const;
483#endif
484#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
485 int ExtractGlobalRowView(long long GlobalRow, int& NumIndices, long long*& Indices) const;
486#endif
487
489
499 int ExtractMyRowView(int LocalRow, int& NumIndices, int*& Indices) const;
501
503
504
505 bool Filled() const {return(CrsGraphData_->Filled_);}
506
508 bool StorageOptimized() const {return(CrsGraphData_->StorageOptimized_);}
509
511 bool IndicesAreGlobal() const {return(CrsGraphData_->IndicesAreGlobal_);}
512
514 bool IndicesAreLocal() const {return(CrsGraphData_->IndicesAreLocal_);}
515
517
520 bool LowerTriangular() const {return(CrsGraphData_->LowerTriangular_);}
521
523
526 bool UpperTriangular() const {return(CrsGraphData_->UpperTriangular_);}
527
529
532 bool NoDiagonal() const {return(CrsGraphData_->NoDiagonal_);}
533
535#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
536 bool MyGlobalRow(int GID) const {return(RowMap().MyGID(GID));}
537#endif
538
539#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
540 bool MyGlobalRow(long long GID) const {return(RowMap().MyGID(GID));}
541#endif
542
544
548 bool HaveColMap() const {return(CrsGraphData_->HaveColMap_);}
550
552
553
555 int NumMyRows() const {return(CrsGraphData_->NumMyRows_);}
556
558#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
559 int NumGlobalRows() const {
560 if(RowMap().GlobalIndicesInt())
561 return (int) NumGlobalRows64();
562 throw "Epetra_CrsGraph::NumGlobalRows: GlobalIndices not int.";
563 }
564#endif
565 long long NumGlobalRows64() const {return(CrsGraphData_->NumGlobalRows_);}
566
568
572 int NumMyCols() const {return(CrsGraphData_->NumMyCols_);}
573
575
578#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
579 int NumGlobalCols() const {
580 if(RowMap().GlobalIndicesInt())
581 return (int) NumGlobalCols64();
582 throw "Epetra_CrsGraph::NumGlobalCols: GlobalIndices not int.";
583 }
584#endif
585 long long NumGlobalCols64() const {return(CrsGraphData_->NumGlobalCols_);}
586
588
594#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
595 int NumGlobalNonzeros() const {
596 if(RowMap().GlobalIndicesInt())
597 return (int) NumGlobalNonzeros64();
598 throw "Epetra_CrsGraph::NumGlobalNonzeros: GlobalIndices not int.";
599 }
600#endif
601 long long NumGlobalNonzeros64() const {return(CrsGraphData_->NumGlobalNonzeros_);}
602
604
607#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
608 int NumGlobalDiagonals() const {
609 if(RowMap().GlobalIndicesInt())
610 return (int) NumGlobalDiagonals64();
611 throw "Epetra_CrsGraph::NumGlobalDiagonals: GlobalIndices not int.";
612 }
613#endif
614 long long NumGlobalDiagonals64() const {return(CrsGraphData_->NumGlobalDiagonals_);}
615
617
620 int NumMyDiagonals() const {return(CrsGraphData_->NumMyDiagonals_);}
621
623 int NumMyBlockRows() const {return(CrsGraphData_->NumMyBlockRows_);}
624
626#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
627 int NumGlobalBlockRows() const {
628 if(RowMap().GlobalIndicesInt())
629 return (int) NumGlobalBlockRows64();
630 throw "Epetra_CrsGraph::NumGlobalBlockRows: GlobalIndices not int.";
631 }
632#endif
633 long long NumGlobalBlockRows64() const {return(CrsGraphData_->NumGlobalBlockRows_);}
634
636
639 int NumMyBlockCols() const {return(CrsGraphData_->NumMyBlockCols_);}
640
642
645#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
646 int NumGlobalBlockCols() const {
647 if(RowMap().GlobalIndicesInt())
648 return (int) NumGlobalBlockCols64();
649 throw "Epetra_CrsGraph::NumGlobalBlockCols: GlobalIndices not int.";
650 }
651#endif
652 long long NumGlobalBlockCols64() const {return(CrsGraphData_->NumGlobalBlockCols_);}
653
655
658 int NumMyBlockDiagonals() const {return(CrsGraphData_->NumMyBlockDiagonals_);}
659
661
664#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
666 if(RowMap().GlobalIndicesInt())
667 return (int) NumGlobalBlockDiagonals64();
668 throw "Epetra_CrsGraph::NumGlobalBlockDiagonals: GlobalIndices not int.";
669 }
670#endif
671 long long NumGlobalBlockDiagonals64() const {return(CrsGraphData_->NumGlobalBlockDiagonals_);}
672
674
677#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
678 int NumGlobalEntries() const {
679 if(RowMap().GlobalIndicesInt())
680 return (int) NumGlobalEntries64();
681 throw "Epetra_CrsGraph::NumGlobalEntries: GlobalIndices not int.";
682 }
683#endif
684 long long NumGlobalEntries64() const {return(CrsGraphData_->NumGlobalEntries_);}
685
687
690 int NumMyEntries() const {return(CrsGraphData_->NumMyEntries_);}
692
695 int MaxRowDim() const {return(CrsGraphData_->MaxRowDim_);}
696
698
701 int GlobalMaxRowDim() const {return(CrsGraphData_->GlobalMaxRowDim_);}
702
704
707 int MaxColDim() const {return(CrsGraphData_->MaxColDim_);}
708
710
713 int GlobalMaxColDim() const {return(CrsGraphData_->GlobalMaxColDim_);}
714
716
719 int NumMyNonzeros() const {return(CrsGraphData_->NumMyNonzeros_);}
720
722 int NumGlobalIndices(long long Row) const;
723
725 int NumAllocatedGlobalIndices(long long Row) const;
726
728
731 int MaxNumIndices() const {return(CrsGraphData_->MaxNumIndices_);}
732
734
737 int GlobalMaxNumIndices() const {return(CrsGraphData_->GlobalMaxNumIndices_);}
738
740
749 int MaxNumNonzeros() const {return(CrsGraphData_->MaxNumNonzeros_);}
750
752
756 int GlobalMaxNumNonzeros() const {return(CrsGraphData_->GlobalMaxNumNonzeros_);}
757
759 int NumMyIndices(int Row) const {if (Row<0 || Row >= NumMyRows()) return(0);
760 if (StorageOptimized()) return(CrsGraphData_->IndexOffset_[Row+1] - CrsGraphData_->IndexOffset_[Row]);
761 else return(CrsGraphData_->NumIndicesPerRow_[Row]);}
762
764 int NumAllocatedMyIndices(int Row) const {if (Row<0 || Row >= NumMyRows()) return(0);
765 if (StorageOptimized()) return(CrsGraphData_->IndexOffset_[Row+1] - CrsGraphData_->IndexOffset_[Row]);
766 else return(CrsGraphData_->NumAllocatedIndicesPerRow_[Row]);}
767
769#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
771 int IndexBase() const {
772 if(RowMap().GlobalIndicesInt())
773 return (int) IndexBase64();
774 throw "Epetra_CrsGraph::IndexBase: GlobalIndices not int.";
775 }
776#endif
777 long long IndexBase64() const {return(CrsGraphData_->IndexBase_);};
778
781
788 int ReplaceRowMap(const Epetra_BlockMap& newmap);
789
798 int ReplaceColMap(const Epetra_BlockMap& newmap);
799
801
809 int ReplaceDomainMapAndImporter(const Epetra_BlockMap& NewDomainMap, const Epetra_Import * NewImporter);
810
812
823 int RemoveEmptyProcessesInPlace(const Epetra_BlockMap * NewMap);
824
825
827
830 const Epetra_BlockMap& ColMap() const {return(CrsGraphData_->ColMap_);}
831
833
836 const Epetra_BlockMap& DomainMap() const {return(CrsGraphData_->DomainMap_);}
837
839
842 const Epetra_BlockMap& RangeMap() const {return(CrsGraphData_->RangeMap_);}
843
845 const Epetra_Import* Importer() const {return(CrsGraphData_->Importer_);}
846
848 const Epetra_Export* Exporter() const {return(CrsGraphData_->Exporter_);}
849
851 const Epetra_Comm& Comm() const {return(Epetra_DistObject::Comm());}
853
855
856
858#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
859 int LRID(int GRID_in) const {return(RowMap().LID(GRID_in));}
860#endif
861
862#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
863 int LRID(long long GRID_in) const {return(RowMap().LID(GRID_in));}
864#endif
865
866#if defined(EPETRA_NO_32BIT_GLOBAL_INDICES) && defined(EPETRA_NO_64BIT_GLOBAL_INDICES)
867 // default implementation so that no compiler/linker error in case neither 32 nor 64
868 // bit indices present.
869 int LRID(long long GRID_in) const {return(RowMap().LID(GRID_in));}
870#endif
871
873#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
874 int GRID(int LRID_in) const {
875 if(RowMap().GlobalIndicesInt())
876 return (int) GRID64(LRID_in);
877 throw "Epetra_CrsGraph::GRID: GlobalIndices not int.";
878 }
879#endif
880 long long GRID64(int LRID_in) const {return(RowMap().GID64(LRID_in));}
881
883
886#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
887 int LCID(int GCID_in) const
888 {
889 return( CrsGraphData_->HaveColMap_ ? ColMap().LID(GCID_in) : -1 );
890 }
891#endif
892
893#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
894 int LCID(long long GCID_in) const
895 {
896 return( CrsGraphData_->HaveColMap_ ? ColMap().LID(GCID_in) : -1 );
897 }
898#endif
899
901
904#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
905 int GCID(int LCID_in) const {
906 if(RowMap().GlobalIndicesInt())
907 return (int) GCID64(LCID_in);
908 throw "Epetra_CrsGraph::GCID: GlobalIndices not int.";
909 }
910#endif
911 long long GCID64(int LCID_in) const
912 {
913 return( CrsGraphData_->HaveColMap_ ? ColMap().GID64(LCID_in) : -1 );
914 }
915
917#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
918 bool MyGRID(int GRID_in) const {return(LRID(GRID_in) != -1);}
919#endif
920
921#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
922 bool MyGRID(long long GRID_in) const {return(LRID(GRID_in) != -1);}
923#endif
924
926 bool MyLRID(int LRID_in) const {return(GRID64(LRID_in) != IndexBase64() - 1);}
927
929
932#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
933 bool MyGCID(int GCID_in) const {return(LCID(GCID_in) != -1);}
934#endif
935
936#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
937 bool MyGCID(long long GCID_in) const {return(LCID(GCID_in) != -1);}
938#endif
939
941
944 bool MyLCID(int LCID_in) const {return(GCID64(LCID_in) != IndexBase64() - 1);}
946
948
949
951
957 inline int* operator[]( int Loc ) {
958 if (StorageOptimized()){ return(CrsGraphData_->data->All_Indices_.Values() + CrsGraphData_->IndexOffset_[Loc]);}
959 else return(CrsGraphData_->data->Indices_[Loc]); }
960
961 inline int* operator[]( int Loc ) const {
962 if (StorageOptimized()) { return(CrsGraphData_->data->All_Indices_.Values() +CrsGraphData_->IndexOffset_[Loc]);}
963 else return(CrsGraphData_->data->Indices_[Loc]); }
964
966
968
972
974
975
977 virtual void Print(std::ostream& os) const;
978
979 void PrintGraphData(std::ostream& os) const {CrsGraphData_->Print(os);}
980 void PrintGraphData(std::ostream& os, int level) const {CrsGraphData_->Print(os, level);}
982
984
985
987 const Epetra_BlockMap& ImportMap() const {return(CrsGraphData_->ColMap_);}
988
990 int TransformToLocal();
991
993 int TransformToLocal(const Epetra_BlockMap* DomainMap, const Epetra_BlockMap* RangeMap);
994
996
998
999
1001
1002 int ReferenceCount() const {return(CrsGraphData_->ReferenceCount());}
1003
1005
1006 const Epetra_CrsGraphData* DataPtr() const {return(CrsGraphData_);}
1007
1008
1010
1013 Epetra_IntSerialDenseVector& ExpertExtractIndexOffset();
1014
1016
1019 Epetra_IntSerialDenseVector& ExpertExtractIndices();
1020
1021
1023
1032 void SortGhostsAssociatedWithEachProcessor(bool Flag) {CrsGraphData_->SortGhostsAssociatedWithEachProcessor_ = Flag;}
1033
1035
1036 // functions listed in protected are the ones used by CrsMatrix and VbrMatrix.
1037 // functions listed in private are the ones that are really private.
1038 // (just pretend CrsMatrix and VbrMatrix derive from CrsGraph to understand the distinction.)
1039 friend class Epetra_CrsMatrix;
1040 friend class Epetra_VbrMatrix;
1041 friend class Epetra_FECrsGraph;
1045
1046 protected:
1047 int *All_Indices() const {
1048 if (!StorageOptimized()) throw ReportError("This method: int *All_Indices() cannot be called when StorageOptimized()==false", -1);
1049 else return(CrsGraphData_->data->All_Indices_.Values());}
1050#if defined(Epetra_ENABLE_MKL_SPARSE) && !defined(Epetra_DISABLE_MKL_SPARSE_MM)
1051 int *All_IndicesPlus1() const;
1052#endif
1053 int *IndexOffset() const {
1054 if (!StorageOptimized()) throw ReportError("This method: int *IndexOffset() cannot be called when StorageOptimized()==false", -1);
1055 else return(CrsGraphData_->IndexOffset_.Values());}
1056 int* NumIndicesPerRow() const {
1057 if (StorageOptimized()) throw ReportError("This method: int* NumIndicesPerRow() cannot be called when StorageOptimized()==true", -1);
1058 else return(CrsGraphData_->NumIndicesPerRow_.Values());}
1060 if (StorageOptimized()) throw ReportError("This method: int* NumAllocatedIndicesPerRow() cannot be called when StorageOptimized()==true", -1);
1061 else return(CrsGraphData_->NumAllocatedIndicesPerRow_.Values());}
1062 int** Indices() const {
1063 if (StorageOptimized()) throw ReportError("This method: int** Indices() cannot be called when StorageOptimized()==true", -1);
1064 else return(CrsGraphData_->data->Indices_);}
1065 int* Indices(int LocalRow) const {
1066 if (StorageOptimized()) return(CrsGraphData_->data->All_Indices_.Values()+CrsGraphData_->IndexOffset_[LocalRow]);
1067 else return(CrsGraphData_->data->Indices_[LocalRow]);}
1068
1069 template<typename int_type>
1070 int_type** TIndices() const {
1071 if (StorageOptimized()) throw ReportError("This method: int_type** TIndices() cannot be called when StorageOptimized()==true", -1);
1072 else return(CrsGraphData_->Data<int_type>().Indices_);}
1073
1074 template<typename int_type>
1075 int_type* TIndices(int LocalRow) const {
1076 if (StorageOptimized()) return(CrsGraphData_->Data<int_type>().All_Indices_.Values()+CrsGraphData_->IndexOffset_[LocalRow]);
1077 else return(CrsGraphData_->Data<int_type>().Indices_[LocalRow]);}
1078
1079 // If column indices are stored in one long array (via a call to OptimizeStorage),
1080 // IndicesAreContiguous returns true, otherwise it returns false.
1081 bool IndicesAreContiguous() const {return(CrsGraphData_->IndicesAreContiguous_);}
1082 bool StaticProfile() const {return(CrsGraphData_->StaticProfile_);}
1083 bool GlobalConstantsComputed() const;
1084#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
1085 bool FindGlobalIndexLoc(int LocalRow, int Index, int Start, int& Loc) const;
1086 bool FindGlobalIndexLoc(int NumIndices, const int* Indices, int Index, int Start, int& Loc) const;
1087#endif
1088#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
1089 bool FindGlobalIndexLoc(int LocalRow, long long Index, int Start, int& Loc) const;
1090 bool FindGlobalIndexLoc(int NumIndices, const long long* Indices, long long Index, int Start, int& Loc) const;
1091#endif
1092
1093 bool FindMyIndexLoc(int LocalRow, int Index, int Start, int& Loc) const;
1094 bool FindMyIndexLoc(int NumIndices, const int* Indices, int Index, int Start, int& Loc) const;
1095
1096 int InsertIndices(int Row, int NumIndices, int* Indices);
1097 int InsertIndicesIntoSorted(int Row, int NumIndices, int* Indices);
1098
1099 int InsertIndices(int Row, int NumIndices, long long* Indices);
1100 int InsertIndicesIntoSorted(int Row, int NumIndices, long long* Indices);
1101
1102 int MakeIndicesLocal(const Epetra_BlockMap& DomainMap, const Epetra_BlockMap& RangeMap);
1103 void SetIndicesAreLocal(bool Flag) {CrsGraphData_->IndicesAreLocal_ = Flag;}
1104 void SetIndicesAreGlobal(bool Flag) {CrsGraphData_->IndicesAreGlobal_ = Flag;}
1105 void SetSorted(bool Flag) {CrsGraphData_->Sorted_ = Flag;}
1106
1107
1109
1112 int SortIndices();
1113
1115 bool Sorted() const {return(CrsGraphData_->Sorted_);}
1116
1118
1121 int RemoveRedundantIndices();
1122 int DetermineTriangular();
1123
1125 bool NoRedundancies() const {return(CrsGraphData_->NoRedundancies_);}
1126
1127 private:
1128 void SetGlobalConstantsComputed(bool Flag) {CrsGraphData_->GlobalConstantsComputed_ = Flag;}
1129 void SetIndicesAreContiguous(bool Flag) {CrsGraphData_->IndicesAreContiguous_ = Flag;}
1130 void SetNoRedundancies(bool Flag) {CrsGraphData_->NoRedundancies_ = Flag;}
1131 void ComputeIndexState();
1132 int MakeColMap(const Epetra_BlockMap& DomainMap, const Epetra_BlockMap& RangeMap);
1133#ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
1134 int MakeColMap_int(const Epetra_BlockMap& DomainMap, const Epetra_BlockMap& RangeMap);
1135#endif
1136#ifndef EPETRA_NO_64BIT_GLOBAL_INDICES
1137 int MakeColMap_LL (const Epetra_BlockMap& DomainMap, const Epetra_BlockMap& RangeMap);
1138#endif
1139 int Allocate(const int* NumIndicesPerRow, int Inc, bool StaticProfile);
1140 //int ReAllocate();
1141 int ComputeGlobalConstants();
1142 void SetFilled(bool Flag) {CrsGraphData_->Filled_ = Flag;}
1143 bool Allocated() const {return(CrsGraphData_->Allocated_);}
1144 void SetAllocated(bool Flag) {CrsGraphData_->Allocated_ = Flag;}
1145
1146 int CheckSizes(const Epetra_SrcDistObject& A);
1147
1148 int CopyAndPermute(const Epetra_SrcDistObject& Source,
1149 int NumSameIDs,
1150 int NumPermuteIDs,
1151 int* PermuteToLIDs,
1152 int* PermuteFromLIDs,
1153 const Epetra_OffsetIndex * Indexor,
1154 Epetra_CombineMode CombineMode = Zero);
1155 int CopyAndPermuteRowMatrix(const Epetra_RowMatrix& A,
1156 int NumSameIDs,
1157 int NumPermuteIDs,
1158 int* PermuteToLIDs,
1159 int* PermuteFromLIDs,
1160 const Epetra_OffsetIndex * Indexor,
1161 Epetra_CombineMode CombineMode);
1162
1163 template<typename int_type>
1164 int CopyAndPermuteRowMatrix(const Epetra_RowMatrix& A,
1165 int NumSameIDs,
1166 int NumPermuteIDs,
1167 int* PermuteToLIDs,
1168 int* PermuteFromLIDs,
1169 const Epetra_OffsetIndex * Indexor,
1170 Epetra_CombineMode CombineMode);
1171
1172 int CopyAndPermuteCrsGraph(const Epetra_CrsGraph& A,
1173 int NumSameIDs,
1174 int NumPermuteIDs,
1175 int* PermuteToLIDs,
1176 int* PermuteFromLIDs,
1177 const Epetra_OffsetIndex * Indexor,
1178 Epetra_CombineMode CombineMode);
1179
1180 template<typename int_type>
1181 int CopyAndPermuteCrsGraph(const Epetra_CrsGraph& A,
1182 int NumSameIDs,
1183 int NumPermuteIDs,
1184 int* PermuteToLIDs,
1185 int* PermuteFromLIDs,
1186 const Epetra_OffsetIndex * Indexor,
1187 Epetra_CombineMode CombineMode);
1188
1189 int PackAndPrepare(const Epetra_SrcDistObject& Source,
1190 int NumExportIDs,
1191 int* ExportLIDs,
1192 int& LenExports,
1193 char*& Exports,
1194 int& SizeOfPacket,
1195 int * Sizes,
1196 bool & VarSizes,
1197 Epetra_Distributor& Distor);
1198 int PackAndPrepareCrsGraph(const Epetra_CrsGraph& A,
1199 int NumExportIDs,
1200 int* ExportLIDs,
1201 int& LenExports,
1202 char*& Exports,
1203 int& SizeOfPacket,
1204 int* Sizes,
1205 bool& VarSizes,
1206 Epetra_Distributor& Distor);
1207 int PackAndPrepareRowMatrix(const Epetra_RowMatrix& A,
1208 int NumExportIDs,
1209 int* ExportLIDs,
1210 int& LenExports,
1211 char*& Exports,
1212 int& SizeOfPacket,
1213 int* Sizes,
1214 bool& VarSizes,
1215 Epetra_Distributor& Distor);
1216
1217 int UnpackAndCombine(const Epetra_SrcDistObject& Source,
1218 int NumImportIDs,
1219 int* ImportLIDs,
1220 int LenImports,
1221 char* Imports,
1222 int& SizeOfPacket,
1223 Epetra_Distributor& Distor,
1224 Epetra_CombineMode CombineMode,
1225 const Epetra_OffsetIndex * Indexor);
1226
1227 void CleanupData();
1228
1230
1231private:
1232
1233 template<typename int_type>
1234 int TAllocate(const int* numIndicesPerRow, int Inc, bool staticProfile);
1235
1236 template<typename int_type>
1237 int InsertGlobalIndices(int_type GlobalRow, int NumIndices, int_type* Indices);
1238
1239 template<typename int_type>
1240 int TInsertIndices(int Row, int NumIndices, int_type* Indices);
1241
1242 template<typename int_type>
1243 int TInsertIndicesIntoSorted(int Row, int NumIndices, int_type* Indices);
1244
1245 template<typename int_type>
1246 int RemoveGlobalIndices(int_type GlobalRow, int NumIndices, int_type* Indices);
1247
1248 template<typename int_type>
1249 int TRemoveGlobalIndices(long long Row);
1250
1251 template<typename int_type>
1252 bool FindGlobalIndexLoc(int LocalRow, int_type Index, int Start, int& Loc) const;
1253
1254 template<typename int_type>
1255 bool FindGlobalIndexLoc(int NumIndices, const int_type* Indices, int_type Index, int Start, int& Loc) const;
1256
1257 template<typename int_type>
1258 int ExtractGlobalRowCopy(int_type Row, int LenOfIndices, int& NumIndices, int_type* Indices) const;
1259
1260 template<typename int_type>
1261 int ExtractMyRowCopy(int Row, int LenOfIndices, int& NumIndices, int_type* targIndices) const;
1262};
1263#endif /* EPETRA_CRSGRAPH_H */
Epetra_CombineMode
@ Zero
Epetra_DataAccess
Epetra_BlockMap: A class for partitioning block element vectors and matrices.
Epetra_Comm: The Epetra Communication Abstract Base Class.
Definition: Epetra_Comm.h:73
Epetra_CrsGraphData: The Epetra CrsGraph Data Class.
Epetra_CrsGraph: A class for constructing and using sparse compressed row graphs.
bool Filled() const
If FillComplete() has been called, this query returns true, otherwise it returns false.
int MaxNumNonzeros() const
Returns the maximum number of nonzero points across all rows on this processor.
const Epetra_Export * Exporter() const
Returns the Exporter associated with this graph.
int MaxNumIndices() const
Returns the maximum number of nonzero entries across all rows on this processor.
int NumGlobalBlockRows() const
Returns the number of Block matrix rows in global matrix.
int NumMyBlockCols() const
Returns the number of Block matrix columns on this processor.
const Epetra_BlockMap & DomainMap() const
Returns the DomainMap associated with this graph.
bool StaticProfile() const
int IndexBase() const
Returns the index base for row and column indices for this graph.
bool IndicesAreLocal() const
If column indices are in local range, this query returns true, otherwise it returns false.
bool StorageOptimized() const
If OptimizeStorage() has been called, this query returns true, otherwise it returns false.
int * NumIndicesPerRow() const
const Epetra_BlockMap & RowMap() const
Returns the RowMap associated with this graph.
int NumMyDiagonals() const
Returns the number of diagonal entries in the local graph, based on global row/column index compariso...
bool IndicesAreContiguous() const
int NumAllocatedMyIndices(int Row) const
Returns the allocated number of nonzero entries in specified local row on this processor.
int GlobalMaxRowDim() const
Returns the max row dimension of block entries across all processors.
bool MyGRID(long long GRID_in) const
long long NumGlobalEntries64() const
int GlobalMaxNumNonzeros() const
Returns the maximun number of nonzero points across all rows across all processors.
const Epetra_CrsGraphData * DataPtr() const
Returns a pointer to the CrsGraphData instance this CrsGraph uses.
int ReferenceCount() const
Returns the reference count of CrsGraphData.
void SetIndicesAreLocal(bool Flag)
int * All_Indices() const
void SetIndicesAreContiguous(bool Flag)
bool MyLCID(int LCID_in) const
Returns true if the LRID passed in belongs to the calling processor in this map, otherwise returns fa...
int MaxColDim() const
Returns the max column dimension of block entries on the processor.
int GCID(int LCID_in) const
Returns the global column index for give local column index, returns IndexBase-1 if we don't have thi...
int ** Indices() const
int_type ** TIndices() const
int * IndexOffset() const
int GlobalMaxNumIndices() const
Returns the maximun number of nonzero entries across all rows across all processors.
bool LowerTriangular() const
If graph is lower triangular in local index space, this query returns true, otherwise it returns fals...
long long GCID64(int LCID_in) const
Epetra_CrsGraphData * CrsGraphData_
bool HaveColMap() const
Returns true if we have a well-defined ColMap, and returns false otherwise.
long long NumGlobalDiagonals64() const
bool Sorted() const
If SortIndices() has been called, this query returns true, otherwise it returns false.
void SetNoRedundancies(bool Flag)
bool IndicesAreGlobal() const
If column indices are in global range, this query returns true, otherwise it returns false.
int NumGlobalEntries() const
Returns the number of entries in the global graph.
void SetSorted(bool Flag)
long long NumGlobalBlockRows64() const
void SetAllocated(bool Flag)
bool MyLRID(int LRID_in) const
Returns true if the LRID passed in belongs to the calling processor in this map, otherwise returns fa...
bool UpperTriangular() const
If graph is upper triangular in local index space, this query returns true, otherwise it returns fals...
long long NumGlobalBlockDiagonals64() const
const Epetra_Comm & Comm() const
Returns a pointer to the Epetra_Comm communicator associated with this graph.
void PrintGraphData(std::ostream &os) const
int GlobalMaxColDim() const
Returns the max column dimension of block entries across all processors.
bool NoRedundancies() const
If RemoveRedundantIndices() has been called, this query returns true, otherwise it returns false.
int NumMyIndices(int Row) const
Returns the current number of nonzero entries in specified local row on this processor.
int_type * TIndices(int LocalRow) const
bool Allocated() const
void SetFilled(bool Flag)
int NumMyEntries() const
Returns the number of entries on this processor.
int * Indices(int LocalRow) const
bool MyGRID(int GRID_in) const
Returns true if the GRID passed in belongs to the calling processor in this map, otherwise returns fa...
int GRID(int LRID_in) const
Returns the global row index for give local row index, returns IndexBase-1 if we don't have this loca...
bool MyGCID(long long GCID_in) const
int NumMyBlockRows() const
Returns the number of block matrix rows on this processor.
int LCID(long long GCID_in) const
int NumGlobalBlockCols() const
Returns the number of Block matrix columns in global matrix.
int NumGlobalDiagonals() const
Returns the number of diagonal entries in the global graph, based on global row/column index comparis...
long long NumGlobalRows64() const
int NumMyRows() const
Returns the number of matrix rows on this processor.
int NumGlobalNonzeros() const
Returns the number of indices in the global graph.
void SetIndicesAreGlobal(bool Flag)
int NumGlobalRows() const
Returns the number of matrix rows in global matrix.
int NumMyCols() const
Returns the number of entries in the set of column-indices that appear on this processor.
long long NumGlobalNonzeros64() const
void PrintGraphData(std::ostream &os, int level) const
const Epetra_BlockMap & ImportMap() const
Use ColMap() instead.
long long GRID64(int LRID_in) const
int NumMyBlockDiagonals() const
Returns the number of Block diagonal entries in the local graph, based on global row/column index com...
int NumGlobalBlockDiagonals() const
Returns the number of Block diagonal entries in the global graph, based on global row/column index co...
int * operator[](int Loc) const
int LRID(long long GRID_in) const
long long NumGlobalBlockCols64() const
bool MyGlobalRow(int GID) const
Returns true of GID is owned by the calling processor, otherwise it returns false.
int * NumAllocatedIndicesPerRow() const
int MaxRowDim() const
Returns the max row dimension of block entries on the processor.
void SetGlobalConstantsComputed(bool Flag)
void SortGhostsAssociatedWithEachProcessor(bool Flag)
Forces FillComplete() to locally order ghostnodes associated with each remote processor in ascending ...
const Epetra_BlockMap & RangeMap() const
Returns the RangeMap associated with this graph.
const Epetra_BlockMap & ColMap() const
Returns the Column Map associated with this graph.
bool MyGlobalRow(long long GID) const
long long IndexBase64() const
long long NumGlobalCols64() const
int NumMyNonzeros() const
Returns the number of indices in the local graph.
bool MyGCID(int GCID_in) const
Returns true if the GCID passed in belongs to the calling processor in this map, otherwise returns fa...
int * operator[](int Loc)
Inlined bracket operator for fast access to data. (Const and Non-const versions)
const Epetra_Import * Importer() const
Returns the Importer associated with this graph.
int NumGlobalCols() const
Returns the number of matrix columns in global matrix.
int LRID(int GRID_in) const
Returns the local row index for given global row index, returns -1 if no local row for this global ro...
bool NoDiagonal() const
If graph has no diagonal entries in global index space, this query returns true, otherwise it returns...
int LCID(int GCID_in) const
Returns the local column index for given global column index, returns -1 if no local column for this ...
Epetra_CrsMatrix: A class for constructing and using real-valued double-precision sparse compressed r...
Epetra_DistObject: A class for constructing and using dense multi-vectors, vectors and matrices in pa...
const Epetra_BlockMap & Map() const
Returns the address of the Epetra_BlockMap for this multi-vector.
virtual int CheckSizes(const Epetra_SrcDistObject &Source)=0
Allows the source and target (this) objects to be compared for compatibility, return nonzero if not.
virtual int UnpackAndCombine(const Epetra_SrcDistObject &Source, int NumImportIDs, int *ImportLIDs, int LenImports, char *Imports, int &SizeOfPacket, Epetra_Distributor &Distor, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor)=0
Perform any unpacking and combining after call to DoTransfer().
virtual int PackAndPrepare(const Epetra_SrcDistObject &Source, int NumExportIDs, int *ExportLIDs, int &LenExports, char *&Exports, int &SizeOfPacket, int *Sizes, bool &VarSizes, Epetra_Distributor &Distor)=0
Perform any packing or preparation required for call to DoTransfer().
virtual int CopyAndPermute(const Epetra_SrcDistObject &Source, int NumSameIDs, int NumPermuteIDs, int *PermuteToLIDs, int *PermuteFromLIDs, const Epetra_OffsetIndex *Indexor, Epetra_CombineMode CombineMode=Zero)=0
Perform ID copies and permutations that are on processor.
Epetra_DistObject & operator=(const Epetra_DistObject &src)
const Epetra_Comm & Comm() const
Returns the address of the Epetra_Comm for this multi-vector.
virtual void Print(std::ostream &os) const
Print method.
Epetra_Distributor: The Epetra Gather/Scatter Setup Base Class.
Epetra_Export: This class builds an export object for efficient exporting of off-processor elements.
Definition: Epetra_Export.h:62
Epetra Finite-Element CrsGraph.
Epetra Finite-Element CrsMatrix.
Epetra Finite-Element VbrMatrix.
Epetra_Import: This class builds an import object for efficient importing of off-processor elements.
Definition: Epetra_Import.h:63
Epetra_IntSerialDenseVector: A class for constructing and using dense vectors.
virtual int ReportError(const std::string Message, int ErrorCode) const
Error reporting method.
Epetra_OffsetIndex: This class builds index for efficient mapping of data from one Epetra_CrsGraph ba...
Epetra_RowMatrix: A pure virtual class for using real-valued double-precision row matrices.
Epetra_SrcDistObject: A class for supporting flexible source distributed objects for import/export op...
Epetra_Time: The Epetra Timing Class.
Definition: Epetra_Time.h:75
Epetra_Util: The Epetra Util Wrapper Class.
Definition: Epetra_Util.h:79
Epetra_VbrMatrix: A class for the construction and use of real-valued double-precision variable block...