xref: /petsc/src/sys/utils/pdisplay.c (revision 10450e9e44b354a0a3da7bbd573407bdf051df10)
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