xref: /petsc/src/sys/utils/pdisplay.c (revision e611a964e9853b74d61a56642fe9d06a6e51780f)
1 
2 #include <petscsys.h>
3 
4 #undef __FUNCT__
5 #define __FUNCT__ "PetscOptionsGetenv"
6 /*@C
7      PetscOptionsGetenv - Gets an environmental variable, broadcasts to all
8           processors in communicator from first.
9 
10      Collective on MPI_Comm
11 
12    Input Parameters:
13 +    comm - communicator to share variable
14 .    name - name of environmental variable
15 -    len - amount of space allocated to hold variable
16 
17    Output Parameters:
18 +    flag - if not NULL tells if variable found or not
19 -    env - value of variable
20 
21   Level: advanced
22 
23    Notes:
24     You can also "set" the environmental variable by setting the options database value
25     -name "stringvalue" (with name in lower case). If name begins with PETSC_ this is
26     discarded before checking the database. For example, PETSC_VIEWER_SOCKET_PORT would
27     be given as -viewer_socket_port 9000
28 
29     If comm does not contain the 0th process in the MPIEXEC it is likely on
30     many systems that the environmental variable will not be set unless you
31     put it in a universal location like a .chsrc file
32 
33 @*/
34 PetscErrorCode  PetscOptionsGetenv(MPI_Comm comm,const char name[],char env[],size_t len,PetscBool  *flag)
35 {
36   PetscErrorCode ierr;
37   PetscMPIInt    rank;
38   char           *str,work[256];
39   PetscBool      flg = PETSC_FALSE,spetsc;
40 
41   PetscFunctionBegin;
42   /* first check options database */
43   ierr = PetscStrncmp(name,"PETSC_",6,&spetsc);CHKERRQ(ierr);
44 
45   ierr = PetscStrcpy(work,"-");CHKERRQ(ierr);
46   if (spetsc) {
47     ierr = PetscStrcat(work,name+6);CHKERRQ(ierr);
48   } else {
49     ierr = PetscStrcat(work,name);CHKERRQ(ierr);
50   }
51   ierr = PetscStrtolower(work);CHKERRQ(ierr);
52   if (env) {
53     ierr = PetscOptionsGetString(NULL,NULL,work,env,len,&flg);CHKERRQ(ierr);
54     if (flg) {
55       if (flag) *flag = PETSC_TRUE;
56     } else { /* now check environment */
57       ierr = PetscMemzero(env,len*sizeof(char));CHKERRQ(ierr);
58 
59       ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
60       if (!rank) {
61         str = getenv(name);
62         if (str) flg = PETSC_TRUE;
63         if (str && env) {ierr = PetscStrncpy(env,str,len);CHKERRQ(ierr);}
64       }
65       ierr = MPI_Bcast(&flg,1,MPIU_BOOL,0,comm);CHKERRQ(ierr);
66       ierr = MPI_Bcast(env,len,MPI_CHAR,0,comm);CHKERRQ(ierr);
67       if (flag) *flag = flg;
68     }
69   } else {
70     ierr = PetscOptionsHasName(NULL,NULL,work,flag);CHKERRQ(ierr);
71   }
72   PetscFunctionReturn(0);
73 }
74 
75 /*
76      PetscSetDisplay - Tries to set the X windows display variable for all processors.
77                        The variable PetscDisplay contains the X windows display variable.
78 
79 */
80 static char PetscDisplay[256];
81 
82 #undef __FUNCT__
83 #define __FUNCT__ "PetscWorldIsSingleHost"
84 static PetscErrorCode PetscWorldIsSingleHost(PetscBool  *onehost)
85 {
86   PetscErrorCode ierr;
87   char           hostname[256],roothostname[256];
88   PetscMPIInt    localmatch,allmatch;
89   PetscBool      flag;
90 
91   PetscFunctionBegin;
92   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
93   ierr = PetscMemcpy(roothostname,hostname,256);CHKERRQ(ierr);
94   ierr = MPI_Bcast(roothostname,256,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
95   ierr = PetscStrcmp(hostname,roothostname,&flag);CHKERRQ(ierr);
96 
97   localmatch = (PetscMPIInt)flag;
98 
99   ierr = MPIU_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD);CHKERRQ(ierr);
100 
101   *onehost = (PetscBool)allmatch;
102   PetscFunctionReturn(0);
103 }
104 
105 
106 #undef __FUNCT__
107 #define __FUNCT__ "PetscSetDisplay"
108 PetscErrorCode  PetscSetDisplay(void)
109 {
110   PetscErrorCode ierr;
111   PetscMPIInt    size,rank;
112   PetscBool      flag,singlehost=PETSC_FALSE;
113   char           display[sizeof(PetscDisplay)];
114   const char     *str;
115 
116   PetscFunctionBegin;
117   ierr = PetscOptionsGetString(NULL,NULL,"-display",PetscDisplay,sizeof(PetscDisplay),&flag);CHKERRQ(ierr);
118   if (flag) PetscFunctionReturn(0);
119 
120   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
121   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
122 
123   ierr = PetscWorldIsSingleHost(&singlehost);CHKERRQ(ierr);
124 
125   str = getenv("DISPLAY");
126   if (!str) str = ":0.0";
127 #if defined(PETSC_HAVE_X)
128   flag = PETSC_FALSE;
129   ierr = PetscOptionsGetBool(NULL,NULL,"-x_virtual",&flag,NULL);CHKERRQ(ierr);
130   if (flag) {
131     /*  this is a crude hack, but better than nothing */
132     ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"pkill -9 Xvfb","r",NULL);CHKERRQ(ierr);
133     ierr = PetscSleep(1);CHKERRQ(ierr);
134     ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"Xvfb :15 -screen 0 1600x1200x24","r",NULL);CHKERRQ(ierr);
135     ierr = PetscSleep(5);CHKERRQ(ierr);
136     str  = ":15";
137   }
138 #endif
139   if (str[0] != ':' || singlehost) {
140     ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr);
141   } else if (!rank) {
142     size_t len;
143     ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr);
144     ierr = PetscStrlen(display,&len);CHKERRQ(ierr);
145     ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr);
146   }
147   ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
148   ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr);
149 
150   PetscDisplay[sizeof(PetscDisplay)-1] = 0;
151   PetscFunctionReturn(0);
152 }
153 
154 #undef __FUNCT__
155 #define __FUNCT__ "PetscGetDisplay"
156 /*
157      PetscGetDisplay - Gets the display variable for all processors.
158 
159   Input Parameters:
160 .   n - length of string display
161 
162   Output Parameters:
163 .   display - the display string
164 
165   Options Database:
166 +  -display <display> - sets the display to use
167 -  -x_virtual - forces use of a X virtual display Xvfb that will not display anything but -draw_save will still work. Xvfb is automatically
168                 started up in PetscSetDisplay() with this option
169 
170 */
171 PetscErrorCode  PetscGetDisplay(char display[],size_t n)
172 {
173   PetscErrorCode ierr;
174 
175   PetscFunctionBegin;
176   ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr);
177   PetscFunctionReturn(0);
178 }
179