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