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