xref: /petsc/src/sys/utils/pdisplay.c (revision e04113cf637149666d9c83678a5abc4e1b351bcc)
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,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,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 = MPI_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,"-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,"-x_virtual",&flag,NULL);CHKERRQ(ierr);
130   if (flag) {
131     ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"Xvfb :15 -screen 0 1600x1200x24","r",NULL);CHKERRQ(ierr);
132     ierr = PetscSleep(5);CHKERRQ(ierr);
133     str  = ":15";
134   }
135 #endif
136   if (str[0] != ':' || singlehost) {
137     ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr);
138   } else if (!rank) {
139     size_t len;
140     ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr);
141     ierr = PetscStrlen(display,&len);CHKERRQ(ierr);
142     ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr);
143   }
144   ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
145   ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr);
146 
147   PetscDisplay[sizeof(PetscDisplay)-1] = 0;
148   PetscFunctionReturn(0);
149 }
150 
151 #undef __FUNCT__
152 #define __FUNCT__ "PetscGetDisplay"
153 /*
154      PetscGetDisplay - Gets the display variable for all processors.
155 
156   Input Parameters:
157 .   n - length of string display
158 
159   Output Parameters:
160 .   display - the display string
161 
162   Options Database:
163 +  -display <display> - sets the display to use
164 -  -x_virtual - forces use of a X virtual display Xvfb that will not display anything but -draw_save will still work. Xvfb is automatically
165                 started up in PetscSetDisplay() with this option
166 
167 */
168 PetscErrorCode  PetscGetDisplay(char display[],size_t n)
169 {
170   PetscErrorCode ierr;
171 
172   PetscFunctionBegin;
173   ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr);
174   PetscFunctionReturn(0);
175 }
176