本文整理汇总了C++中Epetra_Comm类的典型用法代码示例。如果您正苦于以下问题:C++ Epetra_Comm类的具体用法?C++ Epetra_Comm怎么用?C++ Epetra_Comm使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Epetra_Comm类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: random_distribution_1D
void random_distribution_1D(
itype nrows, // Number of global matrix rows
Epetra_Comm &comm, // Epetra communicator to be used in maps
Epetra_Map **rowMap, // OUTPUT: pointer to row map to be created
long long offsetEpetra64
)
{
// Randomly assign matrix rows to processor's row Map.
int me = comm.MyPID();
int np = comm.NumProc();
vector<itype> myGlobalElements(1.2 * (nrows / np) + 1);
int nMyRows = 0;
srandom(1);
double denom = (double) RAND_MAX + 1.;
for (itype i = 0; i < nrows; i++) {
int p = (int) ((double) np * (double) random() / denom);
if (p == me) {
if (nMyRows >= myGlobalElements.size())
myGlobalElements.resize(1.5*myGlobalElements.size());
myGlobalElements[nMyRows] = i + offsetEpetra64;
nMyRows++;
}
}
*rowMap = new Epetra_Map(nrows, nMyRows, &myGlobalElements[0], 0, comm);
}
示例2: global_check_for_flag_on_proc_0
bool global_check_for_flag_on_proc_0(const char* flag,
int numargs,
char** strargs,
const Epetra_Comm& comm)
{
int mypid = comm.MyPID();
int numprocs = comm.NumProc();
int flag_found = 0;
if (mypid==0) {
for(int i=0; i<numargs; ++i) {
if (strargs[i]==0) continue;
if (strcmp(flag, strargs[i]) == 0) {
flag_found = 1;
break;
}
}
}
if (numprocs > 1) {
comm.Broadcast(&flag_found, 1, 0);
}
bool return_value = flag_found==1 ? true : false;
return( return_value );
}
示例3: fevec6
int fevec6(Epetra_Comm& Comm, bool verbose)
{
int NumElements = 4;
Epetra_Map Map(NumElements, 0, Comm);
Epetra_FEVector x1(Map);
x1.PutScalar (0);
// let all processors set global entry 0 to 1
const int GID = 0;
const double value = 1;
x1.ReplaceGlobalValues(1, &GID, &value);
x1.GlobalAssemble (Insert);
if (Comm.MyPID()==0)
std::cout << "Entry " << GID << " after construct & set: "
<< x1[0][0] << std::endl;
x1.PutScalar(0);
// re-apply 1 to the vector, but only on the
// owning processor. should be enough to set
// the value (as non-local data in x1 should
// have been eliminated after calling
// GlobalAssemble).
if (Comm.MyPID()==0)
x1.ReplaceGlobalValues(1, &GID, &value);
x1.GlobalAssemble (Insert);
if (Comm.MyPID()==0) {
std::cout << "Entry " << GID << " after PutScalar & set: "
<< x1[0][0] << std::endl;
if (x1[0][0] != value) return -1;
}
return 0;
}
示例4: ML_Read_Matrix_Dimensions
void ML_Read_Matrix_Dimensions(const char *filename, int *numGlobalRows, Epetra_Comm &Comm)
{
char line[35], token1[35], token2[35], token3[35], token4[35], token5[35];
int lineLength = 1025;
FILE *fid = fopen(filename,"r");
int N, NZ;
if(fgets(line, lineLength, fid)==0) {
if (fid!=0) fclose(fid);
ML_Exit(Comm.MyPID(),"error opening matrix file", EXIT_FAILURE);
}
if(sscanf(line, "%s %s %s %s %s", token1, token2, token3, token4, token5 )==0) {
if (fid!=0) fclose(fid);
ML_Exit(Comm.MyPID(),"error reading matrix file header", EXIT_FAILURE);
}
if (strcmp(token1, "%%MatrixMarket") || strcmp(token2, "matrix") ||
strcmp(token3, "coordinate") || strcmp(token4, "real") ||
strcmp(token5, "general"))
{
if (fid!=0) fclose(fid);
ML_Exit(Comm.MyPID(),"error reading matrix file header", EXIT_FAILURE);
}
// Next, strip off header lines (which start with "%")
do {
if(fgets(line, lineLength, fid)==0) {
if (fid!=0) fclose(fid);
ML_Exit(Comm.MyPID(),"error reading matrix file comments", EXIT_FAILURE);
}
} while (line[0] == '%');
// Next get problem dimensions: M, N, NZ
if(sscanf(line, "%d %d %d", numGlobalRows, &N, &NZ)==0) {
if (fid!=0) fclose(fid);
ML_Exit(Comm.MyPID(),"error reading matrix file dimensions", EXIT_FAILURE);
}
} //ML_Read_Matrix_Dimensions()
示例5: show_matrix
void show_matrix(const char *txt, const Epetra_RowMatrix &matrix, const Epetra_Comm &comm)
{
int me = comm.MyPID();
if (comm.NumProc() > 10){
if (me == 0){
std::cout << txt << std::endl;
std::cout << "Printed matrix format only works for 10 or fewer processes" << std::endl;
}
return;
}
int numRows = matrix.NumGlobalRows();
int numCols = matrix.NumGlobalCols();
if ((numRows > 200) || (numCols > 500)){
if (me == 0){
std::cerr << txt << std::endl;
std::cerr << "show_matrix: problem is too large to display" << std::endl;
}
return;
}
int *myA = new int [numRows * numCols];
make_my_A(matrix, myA, comm);
printMatrix(txt, myA, NULL, NULL, numRows, numCols, comm);
delete [] myA;
}
示例6: generateHyprePrintOut
int generateHyprePrintOut(const char *filename, const Epetra_Comm &comm){
int MyPID = comm.MyPID();
int NumProc = comm.NumProc();
int N = 100;
int ilower = MyPID * N;
int iupper = (MyPID+1)*N-1;
double filePID = (double)MyPID/(double)100000;
std::ostringstream stream;
// Using setprecision() puts it in the std::string
stream << std::setiosflags(std::ios::fixed) << std::setprecision(5) << filePID;
// Then just ignore the first character
std::string fileName(filename);
fileName += stream.str().substr(1,7);
std::ofstream myfile(fileName.c_str());
if(myfile.is_open()){
myfile << ilower << " " << iupper << " " << ilower << " " << iupper << std::endl;
for(int i = ilower; i <= iupper; i++){
for(int j=i-5; j <= i+5; j++){
if(j >= 0 && j < N*NumProc)
myfile << i << " " << j << " " << (double)rand()/(double)RAND_MAX << std::endl;
}
}
myfile.close();
return 0;
} else {
std::cout << "\nERROR:\nCouldn't open file.\n";
return -1;
}
}
示例7: special_submap_import_test
int special_submap_import_test(Epetra_Comm& Comm)
{
int localProc = Comm.MyPID();
//set up ids_source and ids_target such that ids_source are only
//a subset of ids_target, and furthermore that ids_target are ordered
//such that the LIDs don't match up. In other words, even if gid 2 does
//exist in both ids_source and ids_target, it will correspond to different
//LIDs on at least 1 proc.
//
//This is to test a certain bug-fix in Epetra_Import where the 'RemoteLIDs'
//array wasn't being calculated correctly on all procs.
long long ids_source[1];
ids_source[0] = localProc*2+2;
long long ids_target[3];
ids_target[0] = localProc*2+2;
ids_target[1] = localProc*2+1;
ids_target[2] = localProc*2+0;
Epetra_Map map_source((long long) -1, 1, &ids_source[0], 0LL, Comm);
Epetra_Map map_target((long long) -1, 3, &ids_target[0], 0LL, Comm);
Epetra_Import importer(map_target, map_source);
Epetra_LongLongVector vec_source(map_source);
Epetra_LongLongVector vec_target(map_target);
vec_target.PutValue(0);
//set vec_source's contents so that entry[i] == GID[i].
long long* GIDs = map_source.MyGlobalElements64();
for(int i=0; i<map_source.NumMyElements(); ++i) {
vec_source[i] = GIDs[i];
}
//Import vec_source into vec_target. This should result in the contents
//of vec_target remaining 0 for the entries that don't exist in vec_source,
//and other entries should be equal to the corresponding GID in the map.
vec_target.Import(vec_source, importer, Insert);
GIDs = map_target.MyGlobalElements64();
int test_failed = 0;
//the test passes if the i-th entry in vec_target equals either 0 or
//GIDs[i].
for(int i=0; i<vec_target.MyLength(); ++i) {
if (vec_target[i] != GIDs[i] && vec_target[i] != 0) test_failed = 1;
}
int global_result;
Comm.MaxAll(&test_failed, &global_result, 1);
//If test didn't fail on any procs, global_result should be 0.
//If test failed on any proc, global_result should be 1.
return global_result;
}
示例8:
//==============================================================================
Poisson2dOperator::Poisson2dOperator(int nx, int ny, const Epetra_Comm & comm)
: nx_(nx),
ny_(ny),
useTranspose_(false),
comm_(comm),
map_(0),
numImports_(0),
importIDs_(0),
importMap_(0),
importer_(0),
importX_(0),
Label_(0) {
Label_ = "2D Poisson Operator";
int numProc = comm.NumProc(); // Get number of processors
int myPID = comm.MyPID(); // My rank
if (2*numProc > ny) { // ny must be >= 2*numProc (to avoid degenerate cases)
ny = 2*numProc;
ny_ = ny;
std::cout << " Increasing ny to " << ny << " to avoid degenerate distribution on " << numProc << " processors." << std::endl;
}
int chunkSize = ny/numProc;
int remainder = ny%numProc;
if (myPID+1 <= remainder) chunkSize++; // add on remainder
myny_ = chunkSize;
map_ = new Epetra_Map(-1LL, ((long long)nx)*chunkSize, 0, comm_);
if (numProc>1) {
// Build import GID list to build import map and importer
if (myPID>0) numImports_ += nx;
if (myPID+1<numProc) numImports_ += nx;
if (numImports_>0) importIDs_ = new long long[numImports_];
long long * ptr = importIDs_;
long long minGID = map_->MinMyGID64();
long long maxGID = map_->MaxMyGID64();
if (myPID>0) for (int i=0; i< nx; i++) *ptr++ = minGID - nx + i;
if (myPID+1<numProc) for (int i=0; i< nx; i++) *ptr++ = maxGID + i +1;
// At the end of the above step importIDs_ will have a list of global IDs that are needed
// to compute the matrix multiplication operation on this processor. Now build import map
// and importer
importMap_ = new Epetra_Map(-1LL, numImports_, importIDs_, 0LL, comm_);
importer_ = new Epetra_Import(*importMap_, *map_);
}
}
示例9: alternate_import_constructor_test
int alternate_import_constructor_test(Epetra_Comm& Comm) {
int rv=0;
int nodes_per_proc=10;
int numprocs = Comm.NumProc();
int mypid = Comm.MyPID();
// Only run if we have multiple procs & MPI
if(numprocs==0) return 0;
#ifndef HAVE_MPI
return 0;
#endif
// Build Map 1 - linear
Epetra_Map Map1((long long)-1,nodes_per_proc,(long long)0,Comm);
// Build Map 2 - mod striped
std::vector<long long> MyGIDs(nodes_per_proc);
for(int i=0; i<nodes_per_proc; i++)
MyGIDs[i] = (mypid*nodes_per_proc + i) % numprocs;
Epetra_Map Map2((long long)-1,nodes_per_proc,&MyGIDs[0],(long long)0,Comm);
// For testing
Epetra_LongLongVector Source(Map1), Target(Map2);
// Build Import 1 - normal
Epetra_Import Import1(Map2,Map1);
rv = rv|| test_import_gid("Alt test: 2 map constructor",Source,Target, Import1);
// Build Import 2 - no-comm constructor
int Nremote=Import1.NumRemoteIDs();
const int * RemoteLIDs = Import1.RemoteLIDs();
std::vector<int> RemotePIDs(Nremote+1); // I hate you, stl vector....
std::vector<int> AllPIDs;
Epetra_Util::GetPids(Import1,AllPIDs,true);
for(int i=0; i<Nremote; i++) {
RemotePIDs[i]=AllPIDs[RemoteLIDs[i]];
}
Epetra_Import Import2(Import1.TargetMap(),Import1.SourceMap(),Nremote,&RemotePIDs[0],Import1.NumExportIDs(),Import1.ExportLIDs(),Import1.ExportPIDs());
rv = rv || test_import_gid("Alt test: no comm constructor",Source,Target,Import2);
// Build Import 3 - Remotes only
Epetra_Import Import3(Import1.TargetMap(),Import1.SourceMap(),Nremote,&RemotePIDs[0]);
rv = rv || test_import_gid("Alt test: remote only constructor",Source,Target, Import3);
return rv;
}
示例10: combine_mode_test
int combine_mode_test(Epetra_Comm& Comm)
{
int localProc = Comm.MyPID();
long long ids_source[1];
ids_source[0] = localProc*2+2;
long long ids_target[3];
ids_target[0] = localProc*2+2;
ids_target[1] = localProc*2+1;
ids_target[2] = localProc*2+0;
Epetra_Map map_source((long long) -1, 1, &ids_source[0], 0LL, Comm);
Epetra_Map map_target((long long) -1, 3, &ids_target[0], 0LL, Comm);
Epetra_Import importer(map_target, map_source);
Epetra_LongLongVector vec_source(map_source);
Epetra_LongLongVector vec_target(map_target);
vec_target.PutValue(0);
//set vec_source's contents so that entry[i] == GID[i].
long long* GIDs = map_source.MyGlobalElements64();
for(int i=0; i<map_source.NumMyElements(); ++i) {
vec_source[i] = GIDs[i];
}
//Import vec_source into vec_target. This should result in the contents
//of vec_target remaining 0 for the entries that don't exist in vec_source,
//and other entries should be equal to the corresponding GID in the map.
vec_target.Import(vec_source, importer, Insert);
GIDs = map_target.MyGlobalElements64();
int test_failed = 0;
//the test passes if the i-th entry in vec_target equals either 0 or
//GIDs[i].
for(int i=0; i<vec_target.MyLength(); ++i) {
if (vec_target[i] != GIDs[i] && vec_target[i] != 0) test_failed = 1;
}
int global_result;
Comm.MaxAll(&test_failed, &global_result, 1);
//If test didn't fail on any procs, global_result should be 0.
//If test failed on any proc, global_result should be 1.
return global_result;
}
示例11: ConstructAutoUniform
//==============================================================================
// Epetra_BlockMap constructor function for a Epetra-defined uniform linear distribution of constant size elements.
void Epetra_BlockMap::ConstructAutoUniform(long long NumGlobal_Elements, int Element_Size, int Index_Base, const Epetra_Comm& comm, bool IsLongLong)
{
// Each processor gets roughly numGlobalPoints/p points
// This routine automatically defines a linear partitioning of a
// map with numGlobalPoints across the processors
// specified in the given Epetra_Comm
if (NumGlobal_Elements < 0)
throw ReportError("NumGlobal_Elements = " + toString(NumGlobal_Elements) + ". Should be >= 0.", -1);
if (Element_Size <= 0)
throw ReportError("ElementSize = " + toString(Element_Size) + ". Should be > 0.", -2);
BlockMapData_ = new Epetra_BlockMapData(NumGlobal_Elements, Element_Size, Index_Base, comm, IsLongLong);
int NumProc = comm.NumProc();
BlockMapData_->ConstantElementSize_ = true;
BlockMapData_->LinearMap_ = true;
int MyPID = comm.MyPID();
if(BlockMapData_->NumGlobalElements_ / NumProc > (long long) std::numeric_limits<int>::max())
throw ReportError("Epetra_BlockMap::ConstructAutoUniform: Error. Not enough space for elements on each processor", -99);
BlockMapData_->NumMyElements_ = (int) (BlockMapData_->NumGlobalElements_ / NumProc);
int remainder = (int) (BlockMapData_->NumGlobalElements_ % NumProc); // remainder will fit int
int start_index = MyPID * (BlockMapData_->NumMyElements_ + 1);
if (MyPID < remainder)
BlockMapData_->NumMyElements_++;
else
start_index -= (MyPID - remainder);
BlockMapData_->NumGlobalPoints_ = BlockMapData_->NumGlobalElements_ * BlockMapData_->ElementSize_;
BlockMapData_->NumMyPoints_ = BlockMapData_->NumMyElements_ * BlockMapData_->ElementSize_;
BlockMapData_->MinMyElementSize_ = BlockMapData_->ElementSize_;
BlockMapData_->MaxMyElementSize_ = BlockMapData_->ElementSize_;
BlockMapData_->MinElementSize_ = BlockMapData_->ElementSize_;
BlockMapData_->MaxElementSize_ = BlockMapData_->ElementSize_;
BlockMapData_->MinAllGID_ = BlockMapData_->IndexBase_;
BlockMapData_->MaxAllGID_ = BlockMapData_->MinAllGID_ + BlockMapData_->NumGlobalElements_ - 1;
BlockMapData_->MinMyGID_ = start_index + BlockMapData_->IndexBase_;
BlockMapData_->MaxMyGID_ = BlockMapData_->MinMyGID_ + BlockMapData_->NumMyElements_ - 1;
BlockMapData_->DistributedGlobal_ = IsDistributedGlobal(BlockMapData_->NumGlobalElements_, BlockMapData_->NumMyElements_);
EndOfConstructorOps();
}
示例12: rebalanceEpetraProblem
int rebalanceEpetraProblem( RCP<Epetra_Map> &Map,
RCP<Epetra_CrsMatrix> &A,
RCP<Epetra_MultiVector> &B,
RCP<Epetra_MultiVector> &X,
Epetra_Comm &Comm
)
{
// Rebalance linear system across multiple processors.
if ( Comm.NumProc() > 1 ) {
RCP<Epetra_Map> newMap = rcp( new Epetra_Map( Map->NumGlobalElements(), Map->IndexBase(), Comm ) );
RCP<Epetra_Import> newImport = rcp( new Epetra_Import( *newMap, *Map ) );
// Create rebalanced versions of the linear system.
RCP<Epetra_CrsMatrix> newA = rcp( new Epetra_CrsMatrix( BELOSEPETRACOPY, *newMap, 0 ) );
newA->Import( *A, *newImport, Insert );
newA->FillComplete();
RCP<Epetra_MultiVector> newB = rcp( new Epetra_MultiVector( *newMap, B->NumVectors() ) );
newB->Import( *B, *newImport, Insert );
RCP<Epetra_MultiVector> newX = rcp( new Epetra_MultiVector( *newMap, X->NumVectors() ) );
newX->Import( *X, *newImport, Insert );
// Set the pointers to the new rebalance linear system.
A = newA;
B = newB;
X = newX;
Map = newMap;
}
return (0);
}
示例13: buildMatrix
Teuchos::RCP<Epetra_CrsMatrix> buildMatrix(int nx, Epetra_Comm & comm)
{
Epetra_Map map(nx*comm.NumProc(),0,comm);
Teuchos::RCP<Epetra_CrsMatrix> mat = Teuchos::rcp(new Epetra_CrsMatrix(Copy,map,3));
int offsets[3] = {-1, 0, 1 };
double values[3] = { -1, 2, -1};
int maxGid = map.MaxAllGID();
for(int lid=0;lid<nx;lid++) {
int gid = mat->GRID(lid);
int numEntries = 3, offset = 0;
int indices[3] = { gid+offsets[0],
gid+offsets[1],
gid+offsets[2] };
if(gid==0) { // left end point
numEntries = 2;
offset = 1;
} // right end point
else if(gid==maxGid)
numEntries = 2;
// insert rows
mat->InsertGlobalValues(gid,numEntries,values+offset,indices+offset);
}
mat->FillComplete();
return mat;
}
示例14: fevec4
int fevec4(Epetra_Comm& Comm, bool verbose)
{
int NumElements = 4;
Epetra_Map Map(NumElements, 0, Comm);
Epetra_FEVector x1(Map);
const double value = 1.;
x1.PutScalar (value);
// replace one element by itself. processor 0
// does not own this element
const int GID = 3;
x1.ReplaceGlobalValues(1, &GID, &value);
x1.GlobalAssemble (Insert);
if (Map.MyGID(3)) {
//insist that the value for GID==3 is 1:
if (std::abs(x1.Values()[Map.LID(3)] - 1) > 1.e-9) return -1;
}
std::cout << x1;
Comm.Barrier();
// re-apply GlobalAssemble. Nothing should
// happen
x1.GlobalAssemble (Insert);
std::cout << x1;
if (Map.MyGID(3)) {
//insist that the value for GID==3 is 1:
if (std::abs(x1.Values()[Map.LID(3)] - 1) > 1.e-9) return -1;
}
return 0;
}
示例15: HypreFileToCrsMatrix
int HypreFileToCrsMatrix(const char *filename, const Epetra_Comm &comm, Epetra_CrsMatrix *&Matrix){
int MyPID = comm.MyPID();
// This double will be in the format we want for the extension besides the leading zero
double filePID = (double)MyPID/(double)100000;
std::ostringstream stream;
// Using setprecision() puts it in the string
stream << std::setiosflags(std::ios::fixed) << std::setprecision(5) << filePID;
// Then just ignore the first character
std::string fileName(filename);
fileName += stream.str().substr(1,7);
// Open the file
std::ifstream file(fileName.c_str());
string line;
if(file.is_open()){
std::getline(file, line);
int ilower, iupper;
std::istringstream istream(line);
// The first line of the file has the beginning and ending rows
istream >> ilower;
istream >> iupper;
// Using those we can create a row map
Epetra_Map RowMap(-1, iupper-ilower+1, 0, comm);
Matrix = new Epetra_CrsMatrix(Copy, RowMap, 0);
int currRow = -1;
int counter = 0;
std::vector<int> indices;
std::vector<double> values;
while(!file.eof()){
std::getline(file, line);
std::istringstream lineStr(line);
int row, col;
double val;
lineStr >> row;
lineStr >> col;
lineStr >> val;
if(currRow == -1) currRow = row; // First line
if(row == currRow){
// add to the vector
counter = counter + 1;
indices.push_back(col);
values.push_back(val);
} else {
Matrix->InsertGlobalValues(currRow, counter, &values[0], &indices[0]);
indices.clear();
values.clear();
counter = 0;
currRow = row;
// make a new vector
indices.push_back(col);
values.push_back(val);
counter = counter + 1;
}
}
Matrix->InsertGlobalValues(currRow, counter, &values[0], &indices[0]);
Matrix->Comm().Barrier();
Matrix->FillComplete();
file.close();
return 0;
} else {