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