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