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 25*10450e9eSJacob Faibussowitsch 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 30*10450e9eSJacob Faibussowitsch 31*10450e9eSJacob Faibussowitsch .seealso: `PetscOptionsHasName()` 32e5c89e4eSSatish Balay @*/ 33d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetenv(MPI_Comm comm, const char name[], char env[], size_t len, PetscBool *flag) 34d71ae5a4SJacob Faibussowitsch { 35e5c89e4eSSatish Balay PetscMPIInt rank; 36e5c89e4eSSatish Balay char *str, work[256]; 37ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE, spetsc; 38e5c89e4eSSatish Balay 39e5c89e4eSSatish Balay PetscFunctionBegin; 40e5c89e4eSSatish Balay /* first check options database */ 419566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(name, "PETSC_", 6, &spetsc)); 42e5c89e4eSSatish Balay 43c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(work, "-", sizeof(work))); 44e5c89e4eSSatish Balay if (spetsc) { 459566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name + 6, sizeof(work))); 46e5c89e4eSSatish Balay } else { 479566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name, sizeof(work))); 48e5c89e4eSSatish Balay } 499566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(work)); 50e5c89e4eSSatish Balay if (env) { 519566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, work, env, len, &flg)); 52e5c89e4eSSatish Balay if (flg) { 53e5c89e4eSSatish Balay if (flag) *flag = PETSC_TRUE; 54e5c89e4eSSatish Balay } else { /* now check environment */ 559566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(env, len)); 56e5c89e4eSSatish Balay 579566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 58dd400576SPatrick Sanan if (rank == 0) { 59e5c89e4eSSatish Balay str = getenv(name); 60e5c89e4eSSatish Balay if (str) flg = PETSC_TRUE; 619566063dSJacob Faibussowitsch if (str && env) PetscCall(PetscStrncpy(env, str, len)); 62e5c89e4eSSatish Balay } 639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&flg, 1, MPIU_BOOL, 0, comm)); 649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(env, len, MPI_CHAR, 0, comm)); 65e5c89e4eSSatish Balay if (flag) *flag = flg; 66e5c89e4eSSatish Balay } 67e5c89e4eSSatish Balay } else { 689566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, work, flag)); 69e5c89e4eSSatish Balay } 703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 71e5c89e4eSSatish Balay } 72e5c89e4eSSatish Balay 73e5c89e4eSSatish Balay /* 74e1dfdf8eSBarry Smith PetscSetDisplay - Tries to set the X Windows display variable for all processors. 75811af0c4SBarry Smith The variable `PetscDisplay` contains the X Windows display variable. 76e5c89e4eSSatish Balay 77e5c89e4eSSatish Balay */ 78e5c89e4eSSatish Balay static char PetscDisplay[256]; 79e5c89e4eSSatish Balay 80d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) 81d71ae5a4SJacob Faibussowitsch { 82d64e9277SJed Brown char hostname[256], roothostname[256]; 83d64e9277SJed Brown PetscMPIInt localmatch, allmatch; 84ace3abfcSBarry Smith PetscBool flag; 8589c53ad2SJed Brown 8689c53ad2SJed Brown PetscFunctionBegin; 879566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(hostname, sizeof(hostname))); 889566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(roothostname, hostname, sizeof(hostname))); 899566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(roothostname, sizeof(roothostname), MPI_CHAR, 0, PETSC_COMM_WORLD)); 909566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(hostname, roothostname, &flag)); 91a297a907SKarl Rupp 9289c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 93a297a907SKarl Rupp 941c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&localmatch, &allmatch, 1, MPI_INT, MPI_LAND, PETSC_COMM_WORLD)); 95a297a907SKarl Rupp 96ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9889c53ad2SJed Brown } 9989c53ad2SJed Brown 100d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSetDisplay(void) 101d71ae5a4SJacob Faibussowitsch { 102e5c89e4eSSatish Balay PetscMPIInt size, rank; 103ace3abfcSBarry Smith PetscBool flag, singlehost = PETSC_FALSE; 1048caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 10589c53ad2SJed Brown const char *str; 106e5c89e4eSSatish Balay 107e5c89e4eSSatish Balay PetscFunctionBegin; 1089566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-display", PetscDisplay, sizeof(PetscDisplay), &flag)); 1093ba16761SJacob Faibussowitsch if (flag) PetscFunctionReturn(PETSC_SUCCESS); 110e5c89e4eSSatish Balay 1119566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 1129566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 11389c53ad2SJed Brown 1149566063dSJacob Faibussowitsch PetscCall(PetscWorldIsSingleHost(&singlehost)); 11589c53ad2SJed Brown 116e5c89e4eSSatish Balay str = getenv("DISPLAY"); 11789c53ad2SJed Brown if (!str) str = ":0.0"; 1180076e027SBarry Smith #if defined(PETSC_HAVE_X) 1190076e027SBarry Smith flag = PETSC_FALSE; 1209566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-x_virtual", &flag, NULL)); 1210076e027SBarry Smith if (flag) { 12216ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 1239566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "pkill -9 Xvfb", "r", NULL)); 1249566063dSJacob Faibussowitsch PetscCall(PetscSleep(1)); 1259566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "Xvfb :15 -screen 0 1600x1200x24", "r", NULL)); 1269566063dSJacob Faibussowitsch PetscCall(PetscSleep(5)); 1270076e027SBarry Smith str = ":15"; 1280076e027SBarry Smith } 1290076e027SBarry Smith #endif 13089c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1319566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, str, sizeof(display))); 132dd400576SPatrick Sanan } else if (rank == 0) { 1339566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(display, sizeof(display))); 1349566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(display, str, sizeof(display))); 135e5c89e4eSSatish Balay } 1369566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(display, sizeof(display), MPI_CHAR, 0, PETSC_COMM_WORLD)); 1379566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(PetscDisplay, display, sizeof(PetscDisplay))); 138a297a907SKarl Rupp 1398caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay) - 1] = 0; 1403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 141e5c89e4eSSatish Balay } 142e5c89e4eSSatish Balay 143811af0c4SBarry Smith /*@C 144811af0c4SBarry Smith PetscGetDisplay - Gets the X windows display variable for all processors. 145e5c89e4eSSatish Balay 1462fe279fdSBarry Smith Input Parameter: 147e5c89e4eSSatish Balay . n - length of string display 148e5c89e4eSSatish Balay 1492fe279fdSBarry Smith Output Parameter: 150e5c89e4eSSatish Balay . display - the display string 151e5c89e4eSSatish Balay 152811af0c4SBarry Smith Options Database Keys: 153681455b2SBarry Smith + -display <display> - sets the display to use 1540076e027SBarry 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 1550076e027SBarry Smith started up in PetscSetDisplay() with this option 156681455b2SBarry Smith 157fbda9744SBarry Smith Level: advanced 158fbda9744SBarry Smith 159fbda9744SBarry Smith .seealso: `PETSC_DRAW_X`, `PetscDrawOpenX()` 160811af0c4SBarry Smith @*/ 161d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetDisplay(char display[], size_t n) 162d71ae5a4SJacob Faibussowitsch { 163e5c89e4eSSatish Balay PetscFunctionBegin; 1649566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, PetscDisplay, n)); 1653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 166e5c89e4eSSatish Balay } 167