xref: /petsc/src/sys/utils/pdisplay.c (revision c41eeb4c7ee8c207454005c239cd30e8a0a906ae)
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 
47   /* first check options database */
48   ierr = PetscStrncmp(name,"PETSC_",6,&spetsc);CHKERRQ(ierr);
49 
50   ierr = PetscStrcpy(work,"-");CHKERRQ(ierr);
51   if (spetsc) {
52     ierr = PetscStrcat(work,name+6);CHKERRQ(ierr);
53   } else {
54     ierr = PetscStrcat(work,name);CHKERRQ(ierr);
55   }
56   ierr = PetscStrtolower(work);CHKERRQ(ierr);
57   if (env) {
58     ierr = PetscOptionsGetString(PETSC_NULL,work,env,len,&flg);CHKERRQ(ierr);
59     if (flg) {
60       if (flag) *flag = PETSC_TRUE;
61     } else { /* now check environment */
62       ierr = PetscMemzero(env,len*sizeof(char));CHKERRQ(ierr);
63 
64       ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
65       if (!rank) {
66         str = getenv(name);
67         if (str) flg = PETSC_TRUE;
68         if (str && env) {ierr = PetscStrncpy(env,str,len);CHKERRQ(ierr);}
69       }
70       ierr = MPI_Bcast(&flg,1,MPIU_BOOL,0,comm);CHKERRQ(ierr);
71       ierr = MPI_Bcast(env,len,MPI_CHAR,0,comm);CHKERRQ(ierr);
72       if (flag) *flag = flg;
73     }
74   } else {
75     ierr = PetscOptionsHasName(PETSC_NULL,work,flag);CHKERRQ(ierr);
76   }
77   PetscFunctionReturn(0);
78 }
79 
80 /*
81      PetscSetDisplay - Tries to set the X windows display variable for all processors.
82                        The variable PetscDisplay contains the X windows display variable.
83 
84 */
85 static char PetscDisplay[256];
86 
87 #undef __FUNCT__
88 #define __FUNCT__ "PetscWorldIsSingleHost"
89 static PetscErrorCode PetscWorldIsSingleHost(PetscBool  *onehost)
90 {
91   PetscErrorCode ierr;
92   char           hostname[256],roothostname[256];
93   PetscMPIInt    localmatch,allmatch;
94   PetscBool      flag;
95 
96   PetscFunctionBegin;
97   ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr);
98   ierr = PetscMemcpy(roothostname,hostname,256);CHKERRQ(ierr);
99   ierr = MPI_Bcast(roothostname,256,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
100   ierr = PetscStrcmp(hostname,roothostname,&flag);CHKERRQ(ierr);
101   localmatch = (PetscMPIInt)flag;
102   ierr = MPI_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD);CHKERRQ(ierr);
103   *onehost = (PetscBool)allmatch;
104   PetscFunctionReturn(0);
105 }
106 
107 
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscSetDisplay"
110 PetscErrorCode  PetscSetDisplay(void)
111 {
112   PetscErrorCode ierr;
113   PetscMPIInt    size,rank;
114   PetscBool      flag,singlehost=PETSC_FALSE;
115   char           display[sizeof(PetscDisplay)];
116   const char     *str;
117 
118   PetscFunctionBegin;
119   ierr = PetscOptionsGetString(PETSC_NULL,"-display",PetscDisplay,sizeof(PetscDisplay),&flag);CHKERRQ(ierr);
120   if (flag) PetscFunctionReturn(0);
121 
122   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
123   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
124 
125   ierr = PetscWorldIsSingleHost(&singlehost);CHKERRQ(ierr);
126 
127   str = getenv("DISPLAY");
128   if (!str) str = ":0.0";
129   if (str[0] != ':' || singlehost) {
130     ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr);
131   } else {
132     if (!rank) {
133       size_t len;
134       ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr);
135       ierr = PetscStrlen(display,&len);CHKERRQ(ierr);
136       ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr);
137     }
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   PetscDisplay[sizeof(PetscDisplay)-1] = 0;
142   PetscFunctionReturn(0);
143 }
144 
145 #undef __FUNCT__
146 #define __FUNCT__ "PetscGetDisplay"
147 /*
148      PetscGetDisplay - Gets the display variable for all processors.
149 
150   Input Parameters:
151 .   n - length of string display
152 
153   Output Parameters:
154 .   display - the display string
155 
156 */
157 PetscErrorCode  PetscGetDisplay(char display[],size_t n)
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr);
163   PetscFunctionReturn(0);
164 }
165