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: 16667f096bSBarry Smith + flag - if not `NULL` indicates if the variable was found 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 27667f096bSBarry Smith If comm does not contain the 0th process in the `MPI_COMM_WORLD` 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 @*/ 31d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetenv(MPI_Comm comm, const char name[], char env[], size_t len, PetscBool *flag) 32d71ae5a4SJacob Faibussowitsch { 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 41c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(work, "-", sizeof(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 } 683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 78d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) 79d71ae5a4SJacob Faibussowitsch { 80d64e9277SJed Brown char hostname[256], roothostname[256]; 81d64e9277SJed Brown PetscMPIInt localmatch, allmatch; 82ace3abfcSBarry Smith PetscBool flag; 8389c53ad2SJed Brown 8489c53ad2SJed Brown PetscFunctionBegin; 859566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(hostname, sizeof(hostname))); 869566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(roothostname, hostname, sizeof(hostname))); 879566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(roothostname, sizeof(roothostname), MPI_CHAR, 0, PETSC_COMM_WORLD)); 889566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(hostname, roothostname, &flag)); 89a297a907SKarl Rupp 9089c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 91a297a907SKarl Rupp 921c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&localmatch, &allmatch, 1, MPI_INT, MPI_LAND, PETSC_COMM_WORLD)); 93a297a907SKarl Rupp 94ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9689c53ad2SJed Brown } 9789c53ad2SJed Brown 98d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSetDisplay(void) 99d71ae5a4SJacob Faibussowitsch { 100e5c89e4eSSatish Balay PetscMPIInt size, rank; 101ace3abfcSBarry Smith PetscBool flag, singlehost = PETSC_FALSE; 1028caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 10389c53ad2SJed Brown const char *str; 104e5c89e4eSSatish Balay 105e5c89e4eSSatish Balay PetscFunctionBegin; 1069566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-display", PetscDisplay, sizeof(PetscDisplay), &flag)); 1073ba16761SJacob Faibussowitsch if (flag) PetscFunctionReturn(PETSC_SUCCESS); 108e5c89e4eSSatish Balay 1099566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 1109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 11189c53ad2SJed Brown 1129566063dSJacob Faibussowitsch PetscCall(PetscWorldIsSingleHost(&singlehost)); 11389c53ad2SJed Brown 114e5c89e4eSSatish Balay str = getenv("DISPLAY"); 11589c53ad2SJed Brown if (!str) str = ":0.0"; 1160076e027SBarry Smith #if defined(PETSC_HAVE_X) 1170076e027SBarry Smith flag = PETSC_FALSE; 1189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-x_virtual", &flag, NULL)); 1190076e027SBarry Smith if (flag) { 12016ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 1219566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "pkill -9 Xvfb", "r", NULL)); 1229566063dSJacob Faibussowitsch PetscCall(PetscSleep(1)); 1239566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "Xvfb :15 -screen 0 1600x1200x24", "r", NULL)); 1249566063dSJacob Faibussowitsch PetscCall(PetscSleep(5)); 1250076e027SBarry Smith str = ":15"; 1260076e027SBarry Smith } 1270076e027SBarry Smith #endif 12889c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1299566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, str, sizeof(display))); 130dd400576SPatrick Sanan } else if (rank == 0) { 1319566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(display, sizeof(display))); 1329566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(display, str, sizeof(display))); 133e5c89e4eSSatish Balay } 1349566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(display, sizeof(display), MPI_CHAR, 0, PETSC_COMM_WORLD)); 1359566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(PetscDisplay, display, sizeof(PetscDisplay))); 136a297a907SKarl Rupp 1378caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay) - 1] = 0; 1383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 139e5c89e4eSSatish Balay } 140e5c89e4eSSatish Balay 141811af0c4SBarry Smith /*@C 142811af0c4SBarry Smith PetscGetDisplay - Gets the X windows display variable for all processors. 143e5c89e4eSSatish Balay 144*2fe279fdSBarry Smith Input Parameter: 145e5c89e4eSSatish Balay . n - length of string display 146e5c89e4eSSatish Balay 147*2fe279fdSBarry Smith Output Parameter: 148e5c89e4eSSatish Balay . display - the display string 149e5c89e4eSSatish Balay 150811af0c4SBarry Smith Options Database Keys: 151681455b2SBarry Smith + -display <display> - sets the display to use 1520076e027SBarry 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 1530076e027SBarry Smith started up in PetscSetDisplay() with this option 154681455b2SBarry Smith 155fbda9744SBarry Smith Level: advanced 156fbda9744SBarry Smith 157fbda9744SBarry Smith .seealso: `PETSC_DRAW_X`, `PetscDrawOpenX()` 158811af0c4SBarry Smith @*/ 159d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetDisplay(char display[], size_t n) 160d71ae5a4SJacob Faibussowitsch { 161e5c89e4eSSatish Balay PetscFunctionBegin; 1629566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, PetscDisplay, n)); 1633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 164e5c89e4eSSatish Balay } 165