1c6db04a5SJed Brown #include <petscsys.h> 2e5c89e4eSSatish Balay 3e5c89e4eSSatish Balay /*@C 4e5c89e4eSSatish Balay PetscOptionsGetenv - Gets an environmental variable, broadcasts to all 5811af0c4SBarry Smith processors in communicator from MPI rank zero 6e5c89e4eSSatish Balay 7d083f849SBarry Smith Collective 8e5c89e4eSSatish Balay 9e5c89e4eSSatish Balay Input Parameters: 10e5c89e4eSSatish Balay + comm - communicator to share variable 11e5c89e4eSSatish Balay . name - name of environmental variable 12e5c89e4eSSatish Balay - len - amount of space allocated to hold variable 13e5c89e4eSSatish Balay 14e5c89e4eSSatish Balay Output Parameters: 15667f096bSBarry Smith + flag - if not `NULL` indicates if the variable was found 16e5c89e4eSSatish Balay - env - value of variable 17e5c89e4eSSatish Balay 18e5c89e4eSSatish Balay Level: advanced 19e5c89e4eSSatish Balay 20e5c89e4eSSatish Balay Notes: 21e5c89e4eSSatish Balay You can also "set" the environmental variable by setting the options database value 22e5c89e4eSSatish Balay -name "stringvalue" (with name in lower case). If name begins with PETSC_ this is 23811af0c4SBarry Smith discarded before checking the database. For example, `PETSC_VIEWER_SOCKET_PORT` would 2410450e9eSJacob Faibussowitsch be given as `-viewer_socket_port 9000` 25e5c89e4eSSatish Balay 26667f096bSBarry Smith If comm does not contain the 0th process in the `MPI_COMM_WORLD` it is likely on 27e5c89e4eSSatish Balay many systems that the environmental variable will not be set unless you 28e5c89e4eSSatish Balay put it in a universal location like a .chsrc file 2910450e9eSJacob Faibussowitsch 3010450e9eSJacob Faibussowitsch .seealso: `PetscOptionsHasName()` 31e5c89e4eSSatish Balay @*/ 32d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsGetenv(MPI_Comm comm, const char name[], char env[], size_t len, PetscBool *flag) 33d71ae5a4SJacob Faibussowitsch { 34e5c89e4eSSatish Balay PetscMPIInt rank; 35e5c89e4eSSatish Balay char *str, work[256]; 36ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE, spetsc; 37e5c89e4eSSatish Balay 38e5c89e4eSSatish Balay PetscFunctionBegin; 39e5c89e4eSSatish Balay /* first check options database */ 409566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(name, "PETSC_", 6, &spetsc)); 41e5c89e4eSSatish Balay 42c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(work, "-", sizeof(work))); 43e5c89e4eSSatish Balay if (spetsc) { 449566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name + 6, sizeof(work))); 45e5c89e4eSSatish Balay } else { 469566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work, name, sizeof(work))); 47e5c89e4eSSatish Balay } 489566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(work)); 49e5c89e4eSSatish Balay if (env) { 509566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, work, env, len, &flg)); 51e5c89e4eSSatish Balay if (flg) { 52e5c89e4eSSatish Balay if (flag) *flag = PETSC_TRUE; 53e5c89e4eSSatish Balay } else { /* now check environment */ 549566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(env, len)); 55e5c89e4eSSatish Balay 569566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 57dd400576SPatrick Sanan if (rank == 0) { 58e5c89e4eSSatish Balay str = getenv(name); 59e5c89e4eSSatish Balay if (str) flg = PETSC_TRUE; 609566063dSJacob Faibussowitsch if (str && env) PetscCall(PetscStrncpy(env, str, len)); 61e5c89e4eSSatish Balay } 62*5440e5dcSBarry Smith PetscCallMPI(MPI_Bcast(&flg, 1, MPI_C_BOOL, 0, comm)); 636497c311SBarry Smith PetscCallMPI(MPI_Bcast(env, (PetscMPIInt)len, MPI_CHAR, 0, comm)); 64e5c89e4eSSatish Balay if (flag) *flag = flg; 65e5c89e4eSSatish Balay } 66e5c89e4eSSatish Balay } else { 679566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, work, flag)); 68e5c89e4eSSatish Balay } 693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay 72e5c89e4eSSatish Balay /* 73e1dfdf8eSBarry Smith PetscSetDisplay - Tries to set the X Windows display variable for all processors. 74811af0c4SBarry Smith The variable `PetscDisplay` contains the X Windows display variable. 75e5c89e4eSSatish Balay 76e5c89e4eSSatish Balay */ 77e5c89e4eSSatish Balay static char PetscDisplay[256]; 78e5c89e4eSSatish Balay 79d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) 80d71ae5a4SJacob Faibussowitsch { 81d64e9277SJed Brown char hostname[256], roothostname[256]; 82d64e9277SJed Brown PetscMPIInt localmatch, allmatch; 83ace3abfcSBarry Smith PetscBool flag; 8489c53ad2SJed Brown 8589c53ad2SJed Brown PetscFunctionBegin; 869566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(hostname, sizeof(hostname))); 879566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(roothostname, hostname, sizeof(hostname))); 889566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(roothostname, sizeof(roothostname), MPI_CHAR, 0, PETSC_COMM_WORLD)); 899566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(hostname, roothostname, &flag)); 90a297a907SKarl Rupp 9189c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 92a297a907SKarl Rupp 93462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&localmatch, &allmatch, 1, MPI_INT, MPI_LAND, PETSC_COMM_WORLD)); 94a297a907SKarl Rupp 95ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9789c53ad2SJed Brown } 9889c53ad2SJed Brown 99d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSetDisplay(void) 100d71ae5a4SJacob Faibussowitsch { 101e5c89e4eSSatish Balay PetscMPIInt size, rank; 102ace3abfcSBarry Smith PetscBool flag, singlehost = PETSC_FALSE; 1038caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 10489c53ad2SJed Brown const char *str; 105e5c89e4eSSatish Balay 106e5c89e4eSSatish Balay PetscFunctionBegin; 1079566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-display", PetscDisplay, sizeof(PetscDisplay), &flag)); 1083ba16761SJacob Faibussowitsch if (flag) PetscFunctionReturn(PETSC_SUCCESS); 109e5c89e4eSSatish Balay 1109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 1119566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 11289c53ad2SJed Brown 1139566063dSJacob Faibussowitsch PetscCall(PetscWorldIsSingleHost(&singlehost)); 11489c53ad2SJed Brown 115e5c89e4eSSatish Balay str = getenv("DISPLAY"); 11689c53ad2SJed Brown if (!str) str = ":0.0"; 1170076e027SBarry Smith #if defined(PETSC_HAVE_X) 1180076e027SBarry Smith flag = PETSC_FALSE; 1199566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-x_virtual", &flag, NULL)); 1200076e027SBarry Smith if (flag) { 12116ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 122a5af8288SJose E. Roman PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "pkill -15 Xvfb", "r", NULL)); 1239566063dSJacob Faibussowitsch PetscCall(PetscSleep(1)); 1249566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD, NULL, "Xvfb :15 -screen 0 1600x1200x24", "r", NULL)); 1259566063dSJacob Faibussowitsch PetscCall(PetscSleep(5)); 1260076e027SBarry Smith str = ":15"; 1270076e027SBarry Smith } 1280076e027SBarry Smith #endif 12989c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1309566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, str, sizeof(display))); 131dd400576SPatrick Sanan } else if (rank == 0) { 1329566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(display, sizeof(display))); 1339566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(display, str, sizeof(display))); 134e5c89e4eSSatish Balay } 1359566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(display, sizeof(display), MPI_CHAR, 0, PETSC_COMM_WORLD)); 1369566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(PetscDisplay, display, sizeof(PetscDisplay))); 137a297a907SKarl Rupp 1388caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay) - 1] = 0; 1393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 140e5c89e4eSSatish Balay } 141e5c89e4eSSatish Balay 142811af0c4SBarry Smith /*@C 143811af0c4SBarry Smith PetscGetDisplay - Gets the X windows display variable for all processors. 144e5c89e4eSSatish Balay 1452fe279fdSBarry Smith Input Parameter: 146e5c89e4eSSatish Balay . n - length of string display 147e5c89e4eSSatish Balay 1482fe279fdSBarry Smith Output Parameter: 149e5c89e4eSSatish Balay . display - the display string 150e5c89e4eSSatish Balay 151811af0c4SBarry Smith Options Database Keys: 152681455b2SBarry Smith + -display <display> - sets the display to use 1530076e027SBarry 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 1540076e027SBarry Smith started up in PetscSetDisplay() with this option 155681455b2SBarry Smith 156fbda9744SBarry Smith Level: advanced 157fbda9744SBarry Smith 158fbda9744SBarry Smith .seealso: `PETSC_DRAW_X`, `PetscDrawOpenX()` 159811af0c4SBarry Smith @*/ 160d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetDisplay(char display[], size_t n) 161d71ae5a4SJacob Faibussowitsch { 162e5c89e4eSSatish Balay PetscFunctionBegin; 1639566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display, PetscDisplay, n)); 1643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 165e5c89e4eSSatish Balay } 166