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,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,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 = MPIU_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,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 defined(PETSC_HAVE_X) 128 flag = PETSC_FALSE; 129 ierr = PetscOptionsGetBool(NULL,NULL,"-x_virtual",&flag,NULL);CHKERRQ(ierr); 130 if (flag) { 131 /* this is a crude hack, but better than nothing */ 132 ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"pkill -9 Xvfb","r",NULL);CHKERRQ(ierr); 133 ierr = PetscSleep(1);CHKERRQ(ierr); 134 ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"Xvfb :15 -screen 0 1600x1200x24","r",NULL);CHKERRQ(ierr); 135 ierr = PetscSleep(5);CHKERRQ(ierr); 136 str = ":15"; 137 } 138 #endif 139 if (str[0] != ':' || singlehost) { 140 ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr); 141 } else if (!rank) { 142 size_t len; 143 ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr); 144 ierr = PetscStrlen(display,&len);CHKERRQ(ierr); 145 ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr); 146 } 147 ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 148 ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr); 149 150 PetscDisplay[sizeof(PetscDisplay)-1] = 0; 151 PetscFunctionReturn(0); 152 } 153 154 #undef __FUNCT__ 155 #define __FUNCT__ "PetscGetDisplay" 156 /* 157 PetscGetDisplay - Gets the display variable for all processors. 158 159 Input Parameters: 160 . n - length of string display 161 162 Output Parameters: 163 . display - the display string 164 165 Options Database: 166 + -display <display> - sets the display to use 167 - -x_virtual - forces use of a X virtual display Xvfb that will not display anything but -draw_save will still work. Xvfb is automatically 168 started up in PetscSetDisplay() with this option 169 170 */ 171 PetscErrorCode PetscGetDisplay(char display[],size_t n) 172 { 173 PetscErrorCode ierr; 174 175 PetscFunctionBegin; 176 ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr); 177 PetscFunctionReturn(0); 178 } 179