1e5c89e4eSSatish Balay 2c6db04a5SJed Brown #include <petscsys.h> 3e5c89e4eSSatish Balay 4e5c89e4eSSatish Balay /*@C 5e5c89e4eSSatish Balay PetscOptionsGetenv - Gets an environmental variable, broadcasts to all 6811af0c4SBarry Smith processors in communicator from MPI rank zero 7e5c89e4eSSatish Balay 8d083f849SBarry Smith Collective 9e5c89e4eSSatish Balay 10e5c89e4eSSatish Balay Input Parameters: 11e5c89e4eSSatish Balay + comm - communicator to share variable 12e5c89e4eSSatish Balay . name - name of environmental variable 13e5c89e4eSSatish Balay - len - amount of space allocated to hold variable 14e5c89e4eSSatish Balay 15e5c89e4eSSatish Balay Output Parameters: 160298fd71SBarry Smith + flag - if not NULL tells if variable found or not 17e5c89e4eSSatish Balay - env - value of variable 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay Level: advanced 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay Notes: 22e5c89e4eSSatish Balay You can also "set" the environmental variable by setting the options database value 23e5c89e4eSSatish Balay -name "stringvalue" (with name in lower case). If name begins with PETSC_ this is 24811af0c4SBarry Smith discarded before checking the database. For example, `PETSC_VIEWER_SOCKET_PORT` would 25e5c89e4eSSatish Balay be given as -viewer_socket_port 9000 26e5c89e4eSSatish Balay 27f98cea2cSBarry Smith If comm does not contain the 0th process in the MPIEXEC it is likely on 28e5c89e4eSSatish Balay many systems that the environmental variable will not be set unless you 29e5c89e4eSSatish Balay put it in a universal location like a .chsrc file 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay @*/ 329371c9d4SSatish Balay PetscErrorCode PetscOptionsGetenv(MPI_Comm comm, const char name[], char env[], size_t len, PetscBool *flag) { 33e5c89e4eSSatish Balay PetscMPIInt rank; 34e5c89e4eSSatish Balay char *str, work[256]; 35ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE, spetsc; 36e5c89e4eSSatish Balay 37e5c89e4eSSatish Balay PetscFunctionBegin; 38e5c89e4eSSatish Balay /* first check options database */ 399566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(name, "PETSC_", 6, &spetsc)); 40e5c89e4eSSatish Balay 419566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(work, "-")); 42e5c89e4eSSatish Balay if (spetsc) { 439566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name + 6, sizeof(work))); 44e5c89e4eSSatish Balay } else { 459566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name, sizeof(work))); 46e5c89e4eSSatish Balay } 479566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(work)); 48e5c89e4eSSatish Balay if (env) { 499566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, work, env, len, &flg)); 50e5c89e4eSSatish Balay if (flg) { 51e5c89e4eSSatish Balay if (flag) *flag = PETSC_TRUE; 52e5c89e4eSSatish Balay } else { /* now check environment */ 539566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(env, len)); 54e5c89e4eSSatish Balay 559566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 56dd400576SPatrick Sanan if (rank == 0) { 57e5c89e4eSSatish Balay str = getenv(name); 58e5c89e4eSSatish Balay if (str) flg = PETSC_TRUE; 599566063dSJacob Faibussowitsch if (str && env) PetscCall(PetscStrncpy(env, str, len)); 60e5c89e4eSSatish Balay } 619566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&flg, 1, MPIU_BOOL, 0, comm)); 629566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(env, len, MPI_CHAR, 0, comm)); 63e5c89e4eSSatish Balay if (flag) *flag = flg; 64e5c89e4eSSatish Balay } 65e5c89e4eSSatish Balay } else { 669566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, work, flag)); 67e5c89e4eSSatish Balay } 68e5c89e4eSSatish Balay PetscFunctionReturn(0); 69e5c89e4eSSatish Balay } 70e5c89e4eSSatish Balay 71e5c89e4eSSatish Balay /* 72e1dfdf8eSBarry Smith PetscSetDisplay - Tries to set the X Windows display variable for all processors. 73811af0c4SBarry Smith The variable `PetscDisplay` contains the X Windows display variable. 74e5c89e4eSSatish Balay 75e5c89e4eSSatish Balay */ 76e5c89e4eSSatish Balay static char PetscDisplay[256]; 77e5c89e4eSSatish Balay 789371c9d4SSatish Balay static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) { 79d64e9277SJed Brown char hostname[256], roothostname[256]; 80d64e9277SJed Brown PetscMPIInt localmatch, allmatch; 81ace3abfcSBarry Smith PetscBool flag; 8289c53ad2SJed Brown 8389c53ad2SJed Brown PetscFunctionBegin; 849566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(hostname, sizeof(hostname))); 859566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(roothostname, hostname, sizeof(hostname))); 869566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(roothostname, sizeof(roothostname), MPI_CHAR, 0, PETSC_COMM_WORLD)); 879566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(hostname, roothostname, &flag)); 88a297a907SKarl Rupp 8989c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 90a297a907SKarl Rupp 911c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&localmatch, &allmatch, 1, MPI_INT, MPI_LAND, PETSC_COMM_WORLD)); 92a297a907SKarl Rupp 93ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 9489c53ad2SJed Brown PetscFunctionReturn(0); 9589c53ad2SJed Brown } 9689c53ad2SJed Brown 979371c9d4SSatish Balay PetscErrorCode PetscSetDisplay(void) { 98e5c89e4eSSatish Balay PetscMPIInt size, rank; 99ace3abfcSBarry Smith PetscBool flag, singlehost = PETSC_FALSE; 1008caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 10189c53ad2SJed Brown const char *str; 102e5c89e4eSSatish Balay 103e5c89e4eSSatish Balay PetscFunctionBegin; 1049566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-display", PetscDisplay, sizeof(PetscDisplay), &flag)); 105e5c89e4eSSatish Balay if (flag) PetscFunctionReturn(0); 106e5c89e4eSSatish Balay 1079566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 1089566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 10989c53ad2SJed Brown 1109566063dSJacob Faibussowitsch PetscCall(PetscWorldIsSingleHost(&singlehost)); 11189c53ad2SJed Brown 112e5c89e4eSSatish Balay str = getenv("DISPLAY"); 11389c53ad2SJed Brown if (!str) str = ":0.0"; 1140076e027SBarry Smith #if defined(PETSC_HAVE_X) 1150076e027SBarry Smith flag = PETSC_FALSE; 1169566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-x_virtual", &flag, NULL)); 1170076e027SBarry Smith if (flag) { 11816ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 1199566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "pkill -9 Xvfb", "r", NULL)); 1209566063dSJacob Faibussowitsch PetscCall(PetscSleep(1)); 1219566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "Xvfb :15 -screen 0 1600x1200x24", "r", NULL)); 1229566063dSJacob Faibussowitsch PetscCall(PetscSleep(5)); 1230076e027SBarry Smith str = ":15"; 1240076e027SBarry Smith } 1250076e027SBarry Smith #endif 12689c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1279566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, str, sizeof(display))); 128dd400576SPatrick Sanan } else if (rank == 0) { 1299566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(display, sizeof(display))); 1309566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(display, str, sizeof(display))); 131e5c89e4eSSatish Balay } 1329566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(display, sizeof(display), MPI_CHAR, 0, PETSC_COMM_WORLD)); 1339566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(PetscDisplay, display, sizeof(PetscDisplay))); 134a297a907SKarl Rupp 1358caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay) - 1] = 0; 136e5c89e4eSSatish Balay PetscFunctionReturn(0); 137e5c89e4eSSatish Balay } 138e5c89e4eSSatish Balay 139811af0c4SBarry Smith /*@C 140811af0c4SBarry Smith PetscGetDisplay - Gets the X windows display variable for all processors. 141e5c89e4eSSatish Balay 142e5c89e4eSSatish Balay Input Parameters: 143e5c89e4eSSatish Balay . n - length of string display 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay Output Parameters: 146e5c89e4eSSatish Balay . display - the display string 147e5c89e4eSSatish Balay 148811af0c4SBarry Smith Options Database Keys: 149681455b2SBarry Smith + -display <display> - sets the display to use 1500076e027SBarry Smith - -x_virtual - forces use of a X virtual display Xvfb that will not display anything but -draw_save will still work. Xvfb is automatically 1510076e027SBarry Smith started up in PetscSetDisplay() with this option 152681455b2SBarry Smith 153*fbda9744SBarry Smith Level: advanced 154*fbda9744SBarry Smith 155*fbda9744SBarry Smith .seealso: `PETSC_DRAW_X`, `PetscDrawOpenX()` 156811af0c4SBarry Smith @*/ 1579371c9d4SSatish Balay PetscErrorCode PetscGetDisplay(char display[], size_t n) { 158e5c89e4eSSatish Balay PetscFunctionBegin; 1599566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, PetscDisplay, n)); 160e5c89e4eSSatish Balay PetscFunctionReturn(0); 161e5c89e4eSSatish Balay } 162