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