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