xref: /petsc/src/vec/is/ao/tests/ex3d/ex3.cxx (revision 327415f76d85372a4417cf1aaa14db707d4d6c04)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "AO test contributed by Sebastian Steiger <steiger@purdue.edu>, March 2011\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown /*
5c4762a1bSJed Brown   Example of usage:
6c4762a1bSJed Brown     mpiexec -n 12 ./ex3
7c4762a1bSJed Brown     mpiexec -n 30 ./ex3 -ao_type basic
8c4762a1bSJed Brown */
9c4762a1bSJed Brown 
10c4762a1bSJed Brown #include <iostream>
11c4762a1bSJed Brown #include <fstream>
12c4762a1bSJed Brown #include <vector>
13c4762a1bSJed Brown #include <petscvec.h>
14c4762a1bSJed Brown #include <petscao.h>
15c4762a1bSJed Brown 
16c4762a1bSJed Brown using namespace std;
17c4762a1bSJed Brown 
18c4762a1bSJed Brown int main(int argc, char** argv)
19c4762a1bSJed Brown {
20c4762a1bSJed Brown   AO             ao;
21c4762a1bSJed Brown   IS             isapp;
22c4762a1bSJed Brown   char           infile[PETSC_MAX_PATH_LEN],datafiles[PETSC_MAX_PATH_LEN];
23c4762a1bSJed Brown   PetscBool      flg;
24c4762a1bSJed Brown   PetscMPIInt    size,rank;
25c4762a1bSJed Brown 
26*327415f7SBarry Smith   PetscFunctionBeginUser;
27b8abcfdeSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, (char*)0, help));
28b8abcfdeSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
29b8abcfdeSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
30c4762a1bSJed Brown 
31b8abcfdeSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL,NULL,"-datafiles",datafiles,sizeof(datafiles),&flg));
3254c59aa7SJacob Faibussowitsch   PetscCheck(flg,PETSC_COMM_WORLD,PETSC_ERR_USER,"Must specify -datafiles ${DATAFILESPATH}/ao");
33c4762a1bSJed Brown 
34c4762a1bSJed Brown   // read in application indices
35b8abcfdeSJacob Faibussowitsch   PetscCall(PetscSNPrintf(infile,sizeof(infile),"%s/AO%dCPUs/ao_p%d_appindices.txt",datafiles,size,rank));
36c4762a1bSJed Brown   ifstream fin(infile);
3754c59aa7SJacob Faibussowitsch   PetscCheck(fin,PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"File not found: %s",infile);
38c4762a1bSJed Brown   vector<PetscInt>  myapp;
39c4762a1bSJed Brown   int tmp=-1;
40c4762a1bSJed Brown   while (!fin.eof()) {
41c4762a1bSJed Brown     tmp=-1;
42c4762a1bSJed Brown     fin >> tmp;
43c4762a1bSJed Brown     if (tmp==-1) break;
44c4762a1bSJed Brown     myapp.push_back(tmp);
45c4762a1bSJed Brown   }
4605d37114SJacob Faibussowitsch #if __cplusplus >= 201103L // c++11
4705d37114SJacob Faibussowitsch   static_assert(is_same<decltype(myapp.size()),size_t>::value,"");
4805d37114SJacob Faibussowitsch #endif
49b8abcfdeSJacob Faibussowitsch   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] has %zu indices.\n",rank,myapp.size()));
50b8abcfdeSJacob Faibussowitsch   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT));
51c4762a1bSJed Brown 
52b8abcfdeSJacob Faibussowitsch   PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, myapp.size(), &(myapp[0]), PETSC_USE_POINTER, &isapp));
53c4762a1bSJed Brown 
54b8abcfdeSJacob Faibussowitsch   PetscCall(AOCreate(PETSC_COMM_WORLD, &ao));
55b8abcfdeSJacob Faibussowitsch   PetscCall(AOSetIS(ao, isapp, NULL));
56b8abcfdeSJacob Faibussowitsch   PetscCall(AOSetType(ao, AOMEMORYSCALABLE));
57b8abcfdeSJacob Faibussowitsch   PetscCall(AOSetFromOptions(ao));
58c4762a1bSJed Brown 
59c4762a1bSJed Brown   if (rank==0) cout << "AO has been set up." << endl;
60c4762a1bSJed Brown 
61b8abcfdeSJacob Faibussowitsch   PetscCall(AODestroy(&ao));
62b8abcfdeSJacob Faibussowitsch   PetscCall(ISDestroy(&isapp));
63c4762a1bSJed Brown 
64c4762a1bSJed Brown   if (rank==0) cout << "AO is done." << endl;
65c4762a1bSJed Brown 
66b8abcfdeSJacob Faibussowitsch   PetscCall(PetscFinalize());
67b8abcfdeSJacob Faibussowitsch   return 0;
68c4762a1bSJed Brown }
69c4762a1bSJed Brown 
70c4762a1bSJed Brown /*TEST
71c4762a1bSJed Brown 
72c4762a1bSJed Brown    build:
73dfd57a17SPierre Jolivet      requires: !defined(PETSC_USE_64BIT_INDICES)
74c4762a1bSJed Brown 
75c4762a1bSJed Brown    test:
76c4762a1bSJed Brown       nsize: 12
77c4762a1bSJed Brown       requires: double !complex datafilespath
78c4762a1bSJed Brown       args: -datafiles ${DATAFILESPATH}/ao
79c4762a1bSJed Brown       output_file: output/ex3_1.out
80c4762a1bSJed Brown 
81c4762a1bSJed Brown    test:
82c4762a1bSJed Brown       suffix: 2
83c4762a1bSJed Brown       nsize: 12
84c4762a1bSJed Brown       requires: double !complex datafilespath
85c4762a1bSJed Brown       args: -ao_type basic -datafiles ${DATAFILESPATH}/ao
86c4762a1bSJed Brown       output_file: output/ex3_1.out
87c4762a1bSJed Brown 
88c4762a1bSJed Brown    test:
89c4762a1bSJed Brown       suffix: 3
90c4762a1bSJed Brown       nsize: 30
91c4762a1bSJed Brown       requires: double !complex datafilespath
92c4762a1bSJed Brown       args: -datafiles ${DATAFILESPATH}/ao
93c4762a1bSJed Brown 
94c4762a1bSJed Brown    test:
95c4762a1bSJed Brown       suffix: 4
96c4762a1bSJed Brown       nsize: 30
97c4762a1bSJed Brown       requires: double !complex datafilespath
98c4762a1bSJed Brown       args: -ao_type basic -datafiles ${DATAFILESPATH}/ao
99c4762a1bSJed Brown       output_file: output/ex3_3.out
100c4762a1bSJed Brown 
101c4762a1bSJed Brown TEST*/
102