xref: /petsc/src/sys/utils/pdisplay.c (revision 665c2ded495bb9782a7454dcfef3abf1536c3670)
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 (str[0] != ':' || singlehost) {
128     ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr);
129   } else if (!rank) {
130     size_t len;
131     ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr);
132     ierr = PetscStrlen(display,&len);CHKERRQ(ierr);
133     ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr);
134   }
135   ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr);
136   ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr);
137 
138   PetscDisplay[sizeof(PetscDisplay)-1] = 0;
139   PetscFunctionReturn(0);
140 }
141 
142 #undef __FUNCT__
143 #define __FUNCT__ "PetscGetDisplay"
144 /*
145      PetscGetDisplay - Gets the display variable for all processors.
146 
147   Input Parameters:
148 .   n - length of string display
149 
150   Output Parameters:
151 .   display - the display string
152 
153 */
154 PetscErrorCode  PetscGetDisplay(char display[],size_t n)
155 {
156   PetscErrorCode ierr;
157 
158   PetscFunctionBegin;
159   ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr);
160   PetscFunctionReturn(0);
161 }
162