1e5c89e4eSSatish Balay 2c6db04a5SJed Brown #include <petscsys.h> 3e5c89e4eSSatish Balay 4e5c89e4eSSatish Balay /*@C 5e5c89e4eSSatish Balay PetscOptionsGetenv - Gets an environmental variable, broadcasts to all 6e5c89e4eSSatish Balay processors in communicator from first. 7e5c89e4eSSatish Balay 8d083f849SBarry Smith Collective 9e5c89e4eSSatish Balay 10e5c89e4eSSatish Balay Input Parameters: 11e5c89e4eSSatish Balay + comm - communicator to share variable 12e5c89e4eSSatish Balay . name - name of environmental variable 13e5c89e4eSSatish Balay - len - amount of space allocated to hold variable 14e5c89e4eSSatish Balay 15e5c89e4eSSatish Balay Output Parameters: 160298fd71SBarry Smith + flag - if not NULL tells if variable found or not 17e5c89e4eSSatish Balay - env - value of variable 18e5c89e4eSSatish Balay 19e5c89e4eSSatish Balay Level: advanced 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay Notes: 22e5c89e4eSSatish Balay You can also "set" the environmental variable by setting the options database value 23e5c89e4eSSatish Balay -name "stringvalue" (with name in lower case). If name begins with PETSC_ this is 24e5c89e4eSSatish Balay discarded before checking the database. For example, PETSC_VIEWER_SOCKET_PORT would 25e5c89e4eSSatish Balay be given as -viewer_socket_port 9000 26e5c89e4eSSatish Balay 27f98cea2cSBarry Smith If comm does not contain the 0th process in the MPIEXEC it is likely on 28e5c89e4eSSatish Balay many systems that the environmental variable will not be set unless you 29e5c89e4eSSatish Balay put it in a universal location like a .chsrc file 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay @*/ 327087cfbeSBarry Smith PetscErrorCode PetscOptionsGetenv(MPI_Comm comm,const char name[],char env[],size_t len,PetscBool *flag) 33e5c89e4eSSatish Balay { 34e5c89e4eSSatish Balay PetscMPIInt rank; 35e5c89e4eSSatish Balay char *str,work[256]; 36ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE,spetsc; 37e5c89e4eSSatish Balay 38e5c89e4eSSatish Balay PetscFunctionBegin; 39e5c89e4eSSatish Balay /* first check options database */ 409566063dSJacob Faibussowitsch PetscCall(PetscStrncmp(name,"PETSC_",6,&spetsc)); 41e5c89e4eSSatish Balay 429566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(work,"-")); 43e5c89e4eSSatish Balay if (spetsc) { 449566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work,name+6,sizeof(work))); 45e5c89e4eSSatish Balay } else { 469566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(work,name,sizeof(work))); 47e5c89e4eSSatish Balay } 489566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(work)); 49e5c89e4eSSatish Balay if (env) { 509566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,work,env,len,&flg)); 51e5c89e4eSSatish Balay if (flg) { 52e5c89e4eSSatish Balay if (flag) *flag = PETSC_TRUE; 53e5c89e4eSSatish Balay } else { /* now check environment */ 549566063dSJacob Faibussowitsch PetscCall(PetscArrayzero(env,len)); 55e5c89e4eSSatish Balay 569566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 57dd400576SPatrick Sanan if (rank == 0) { 58e5c89e4eSSatish Balay str = getenv(name); 59e5c89e4eSSatish Balay if (str) flg = PETSC_TRUE; 609566063dSJacob Faibussowitsch if (str && env) PetscCall(PetscStrncpy(env,str,len)); 61e5c89e4eSSatish Balay } 629566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&flg,1,MPIU_BOOL,0,comm)); 639566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(env,len,MPI_CHAR,0,comm)); 64e5c89e4eSSatish Balay if (flag) *flag = flg; 65e5c89e4eSSatish Balay } 66e5c89e4eSSatish Balay } else { 679566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL,NULL,work,flag)); 68e5c89e4eSSatish Balay } 69e5c89e4eSSatish Balay PetscFunctionReturn(0); 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay 72e5c89e4eSSatish Balay /* 73e1dfdf8eSBarry Smith PetscSetDisplay - Tries to set the X Windows display variable for all processors. 74e1dfdf8eSBarry Smith The variable PetscDisplay contains the X Windows display variable. 75e5c89e4eSSatish Balay 76e5c89e4eSSatish Balay */ 77e5c89e4eSSatish Balay static char PetscDisplay[256]; 78e5c89e4eSSatish Balay 79ace3abfcSBarry Smith static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) 8089c53ad2SJed Brown { 81d64e9277SJed Brown char hostname[256],roothostname[256]; 82d64e9277SJed Brown PetscMPIInt localmatch,allmatch; 83ace3abfcSBarry Smith PetscBool flag; 8489c53ad2SJed Brown 8589c53ad2SJed Brown PetscFunctionBegin; 869566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(hostname,sizeof(hostname))); 879566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(roothostname,hostname,sizeof(hostname))); 889566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(roothostname,sizeof(roothostname),MPI_CHAR,0,PETSC_COMM_WORLD)); 899566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(hostname,roothostname,&flag)); 90a297a907SKarl Rupp 9189c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 92a297a907SKarl Rupp 93*1c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD)); 94a297a907SKarl Rupp 95ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 9689c53ad2SJed Brown PetscFunctionReturn(0); 9789c53ad2SJed Brown } 9889c53ad2SJed Brown 997087cfbeSBarry Smith PetscErrorCode PetscSetDisplay(void) 100e5c89e4eSSatish Balay { 101e5c89e4eSSatish Balay PetscMPIInt size,rank; 102ace3abfcSBarry Smith PetscBool flag,singlehost=PETSC_FALSE; 1038caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 10489c53ad2SJed Brown const char *str; 105e5c89e4eSSatish Balay 106e5c89e4eSSatish Balay PetscFunctionBegin; 1079566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,"-display",PetscDisplay,sizeof(PetscDisplay),&flag)); 108e5c89e4eSSatish Balay if (flag) PetscFunctionReturn(0); 109e5c89e4eSSatish Balay 1109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 1119566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 11289c53ad2SJed Brown 1139566063dSJacob Faibussowitsch PetscCall(PetscWorldIsSingleHost(&singlehost)); 11489c53ad2SJed Brown 115e5c89e4eSSatish Balay str = getenv("DISPLAY"); 11689c53ad2SJed Brown if (!str) str = ":0.0"; 1170076e027SBarry Smith #if defined(PETSC_HAVE_X) 1180076e027SBarry Smith flag = PETSC_FALSE; 1199566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL,NULL,"-x_virtual",&flag,NULL)); 1200076e027SBarry Smith if (flag) { 12116ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 1229566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD,NULL,"pkill -9 Xvfb","r",NULL)); 1239566063dSJacob Faibussowitsch PetscCall(PetscSleep(1)); 1249566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_WORLD,NULL,"Xvfb :15 -screen 0 1600x1200x24","r",NULL)); 1259566063dSJacob Faibussowitsch PetscCall(PetscSleep(5)); 1260076e027SBarry Smith str = ":15"; 1270076e027SBarry Smith } 1280076e027SBarry Smith #endif 12989c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1309566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display,str,sizeof(display))); 131dd400576SPatrick Sanan } else if (rank == 0) { 1329566063dSJacob Faibussowitsch PetscCall(PetscGetHostName(display,sizeof(display))); 1339566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(display,str,sizeof(display))); 134e5c89e4eSSatish Balay } 1359566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD)); 1369566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay))); 137a297a907SKarl Rupp 1388caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay)-1] = 0; 139e5c89e4eSSatish Balay PetscFunctionReturn(0); 140e5c89e4eSSatish Balay } 141e5c89e4eSSatish Balay 142e5c89e4eSSatish Balay /* 143e5c89e4eSSatish Balay PetscGetDisplay - Gets the display variable for all processors. 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay Input Parameters: 146e5c89e4eSSatish Balay . n - length of string display 147e5c89e4eSSatish Balay 148e5c89e4eSSatish Balay Output Parameters: 149e5c89e4eSSatish Balay . display - the display string 150e5c89e4eSSatish Balay 151681455b2SBarry Smith Options Database: 152681455b2SBarry Smith + -display <display> - sets the display to use 1530076e027SBarry Smith - -x_virtual - forces use of a X virtual display Xvfb that will not display anything but -draw_save will still work. Xvfb is automatically 1540076e027SBarry Smith started up in PetscSetDisplay() with this option 155681455b2SBarry Smith 156e5c89e4eSSatish Balay */ 1577087cfbeSBarry Smith PetscErrorCode PetscGetDisplay(char display[],size_t n) 158e5c89e4eSSatish Balay { 159e5c89e4eSSatish Balay PetscFunctionBegin; 1609566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(display,PetscDisplay,n)); 161e5c89e4eSSatish Balay PetscFunctionReturn(0); 162e5c89e4eSSatish Balay } 163