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