xref: /petsc/src/sys/utils/pdisplay.c (revision da80777bb9afa786145217fc25b54e33c3ebf541)
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   localmatch = (PetscMPIInt)flag;
101   ierr = MPI_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD);CHKERRQ(ierr);
102   *onehost = (PetscBool)allmatch;
103   PetscFunctionReturn(0);
104 }
105 
106 
107 #undef __FUNCT__
108 #define __FUNCT__ "PetscSetDisplay"
109 PetscErrorCode  PetscSetDisplay(void)
110 {
111   PetscErrorCode ierr;
112   PetscMPIInt    size,rank;
113   PetscBool      flag,singlehost=PETSC_FALSE;
114   char           display[sizeof(PetscDisplay)];
115   const char     *str;
116 
117   PetscFunctionBegin;
118   ierr = PetscOptionsGetString(PETSC_NULL,"-display",PetscDisplay,sizeof(PetscDisplay),&flag);CHKERRQ(ierr);
119   if (flag) PetscFunctionReturn(0);
120 
121   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
122   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
123 
124   ierr = PetscWorldIsSingleHost(&singlehost);CHKERRQ(ierr);
125 
126   str = getenv("DISPLAY");
127   if (!str) str = ":0.0";
128   if (str[0] != ':' || singlehost) {
129     ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr);
130   } else {
131     if (!rank) {
132       size_t len;
133       ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr);
134       ierr = PetscStrlen(display,&len);CHKERRQ(ierr);
135       ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr);
136     }
137   }
138   ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
139   ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr);
140   PetscDisplay[sizeof(PetscDisplay)-1] = 0;
141   PetscFunctionReturn(0);
142 }
143 
144 #undef __FUNCT__
145 #define __FUNCT__ "PetscGetDisplay"
146 /*
147      PetscGetDisplay - Gets the display variable for all processors.
148 
149   Input Parameters:
150 .   n - length of string display
151 
152   Output Parameters:
153 .   display - the display string
154 
155 */
156 PetscErrorCode  PetscGetDisplay(char display[],size_t n)
157 {
158   PetscErrorCode ierr;
159 
160   PetscFunctionBegin;
161   ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr);
162   PetscFunctionReturn(0);
163 }
164