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