xref: /petsc/src/sys/utils/pdisplay.c (revision 1c2dc1cbabe5212f80cf309c4ca5a26f0cadc660)
1e5c89e4eSSatish Balay 
2c6db04a5SJed Brown #include <petscsys.h>
3e5c89e4eSSatish Balay 
4e5c89e4eSSatish Balay /*@C
5e5c89e4eSSatish Balay      PetscOptionsGetenv - Gets an environmental variable, broadcasts to all
6e5c89e4eSSatish Balay           processors in communicator from first.
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:
160298fd71SBarry Smith +    flag - if not NULL tells if variable found or not
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
24e5c89e4eSSatish Balay     discarded before checking the database. For example, PETSC_VIEWER_SOCKET_PORT would
25e5c89e4eSSatish Balay     be given as -viewer_socket_port 9000
26e5c89e4eSSatish Balay 
27f98cea2cSBarry Smith     If comm does not contain the 0th process in the MPIEXEC 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 
31e5c89e4eSSatish Balay @*/
327087cfbeSBarry Smith PetscErrorCode  PetscOptionsGetenv(MPI_Comm comm,const char name[],char env[],size_t len,PetscBool  *flag)
33e5c89e4eSSatish Balay {
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 
429566063dSJacob Faibussowitsch   PetscCall(PetscStrcpy(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       }
629566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&flg,1,MPIU_BOOL,0,comm));
639566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(env,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   }
69e5c89e4eSSatish Balay   PetscFunctionReturn(0);
70e5c89e4eSSatish Balay }
71e5c89e4eSSatish Balay 
72e5c89e4eSSatish Balay /*
73e1dfdf8eSBarry Smith      PetscSetDisplay - Tries to set the X Windows display variable for all processors.
74e1dfdf8eSBarry Smith                        The variable PetscDisplay contains the X Windows display variable.
75e5c89e4eSSatish Balay 
76e5c89e4eSSatish Balay */
77e5c89e4eSSatish Balay static char PetscDisplay[256];
78e5c89e4eSSatish Balay 
79ace3abfcSBarry Smith static PetscErrorCode PetscWorldIsSingleHost(PetscBool  *onehost)
8089c53ad2SJed Brown {
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 
93*1c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD));
94a297a907SKarl Rupp 
95ace3abfcSBarry Smith   *onehost = (PetscBool)allmatch;
9689c53ad2SJed Brown   PetscFunctionReturn(0);
9789c53ad2SJed Brown }
9889c53ad2SJed Brown 
997087cfbeSBarry Smith PetscErrorCode  PetscSetDisplay(void)
100e5c89e4eSSatish Balay {
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));
108e5c89e4eSSatish Balay   if (flag) PetscFunctionReturn(0);
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 */
1229566063dSJacob Faibussowitsch     PetscCall(PetscPOpen(PETSC_COMM_WORLD,NULL,"pkill -9 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;
139e5c89e4eSSatish Balay   PetscFunctionReturn(0);
140e5c89e4eSSatish Balay }
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay /*
143e5c89e4eSSatish Balay      PetscGetDisplay - Gets the display variable for all processors.
144e5c89e4eSSatish Balay 
145e5c89e4eSSatish Balay   Input Parameters:
146e5c89e4eSSatish Balay .   n - length of string display
147e5c89e4eSSatish Balay 
148e5c89e4eSSatish Balay   Output Parameters:
149e5c89e4eSSatish Balay .   display - the display string
150e5c89e4eSSatish Balay 
151681455b2SBarry Smith   Options Database:
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 
156e5c89e4eSSatish Balay */
1577087cfbeSBarry Smith PetscErrorCode  PetscGetDisplay(char display[],size_t n)
158e5c89e4eSSatish Balay {
159e5c89e4eSSatish Balay   PetscFunctionBegin;
1609566063dSJacob Faibussowitsch   PetscCall(PetscStrncpy(display,PetscDisplay,n));
161e5c89e4eSSatish Balay   PetscFunctionReturn(0);
162e5c89e4eSSatish Balay }
163