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 @*/
PetscOptionsGetenv(MPI_Comm comm,const char name[],char env[],size_t len,PetscBool * flag)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
PetscWorldIsSingleHost(PetscBool * onehost)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
PetscSetDisplay(void)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 @*/
PetscGetDisplay(char display[],size_t n)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