1e5c89e4eSSatish Balay 2c6db04a5SJed Brown #include <petscsys.h> 3e5c89e4eSSatish Balay 4e5c89e4eSSatish Balay #undef __FUNCT__ 5e5c89e4eSSatish Balay #define __FUNCT__ "PetscOptionsGetenv" 6e5c89e4eSSatish Balay /*@C 7e5c89e4eSSatish Balay PetscOptionsGetenv - Gets an environmental variable, broadcasts to all 8e5c89e4eSSatish Balay processors in communicator from first. 9e5c89e4eSSatish Balay 10e5c89e4eSSatish Balay Collective on MPI_Comm 11e5c89e4eSSatish Balay 12e5c89e4eSSatish Balay Input Parameters: 13e5c89e4eSSatish Balay + comm - communicator to share variable 14e5c89e4eSSatish Balay . name - name of environmental variable 15e5c89e4eSSatish Balay - len - amount of space allocated to hold variable 16e5c89e4eSSatish Balay 17e5c89e4eSSatish Balay Output Parameters: 180298fd71SBarry Smith + flag - if not NULL tells if variable found or not 19e5c89e4eSSatish Balay - env - value of variable 20e5c89e4eSSatish Balay 21e5c89e4eSSatish Balay Level: advanced 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay Notes: 24e5c89e4eSSatish Balay You can also "set" the environmental variable by setting the options database value 25e5c89e4eSSatish Balay -name "stringvalue" (with name in lower case). If name begins with PETSC_ this is 26e5c89e4eSSatish Balay discarded before checking the database. For example, PETSC_VIEWER_SOCKET_PORT would 27e5c89e4eSSatish Balay be given as -viewer_socket_port 9000 28e5c89e4eSSatish Balay 29f98cea2cSBarry Smith If comm does not contain the 0th process in the MPIEXEC it is likely on 30e5c89e4eSSatish Balay many systems that the environmental variable will not be set unless you 31e5c89e4eSSatish Balay put it in a universal location like a .chsrc file 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay @*/ 347087cfbeSBarry Smith PetscErrorCode PetscOptionsGetenv(MPI_Comm comm,const char name[],char env[],size_t len,PetscBool *flag) 35e5c89e4eSSatish Balay { 36e5c89e4eSSatish Balay PetscErrorCode ierr; 37e5c89e4eSSatish Balay PetscMPIInt rank; 38e5c89e4eSSatish Balay char *str,work[256]; 39ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE,spetsc; 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay PetscFunctionBegin; 42e5c89e4eSSatish Balay /* first check options database */ 43e5c89e4eSSatish Balay ierr = PetscStrncmp(name,"PETSC_",6,&spetsc);CHKERRQ(ierr); 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay ierr = PetscStrcpy(work,"-");CHKERRQ(ierr); 46e5c89e4eSSatish Balay if (spetsc) { 47e5c89e4eSSatish Balay ierr = PetscStrcat(work,name+6);CHKERRQ(ierr); 48e5c89e4eSSatish Balay } else { 49e5c89e4eSSatish Balay ierr = PetscStrcat(work,name);CHKERRQ(ierr); 50e5c89e4eSSatish Balay } 51e5c89e4eSSatish Balay ierr = PetscStrtolower(work);CHKERRQ(ierr); 52e5c89e4eSSatish Balay if (env) { 530298fd71SBarry Smith ierr = PetscOptionsGetString(NULL,work,env,len,&flg);CHKERRQ(ierr); 54e5c89e4eSSatish Balay if (flg) { 55e5c89e4eSSatish Balay if (flag) *flag = PETSC_TRUE; 56e5c89e4eSSatish Balay } else { /* now check environment */ 57e5c89e4eSSatish Balay ierr = PetscMemzero(env,len*sizeof(char));CHKERRQ(ierr); 58e5c89e4eSSatish Balay 59e5c89e4eSSatish Balay ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 60e5c89e4eSSatish Balay if (!rank) { 61e5c89e4eSSatish Balay str = getenv(name); 62e5c89e4eSSatish Balay if (str) flg = PETSC_TRUE; 63e5c89e4eSSatish Balay if (str && env) {ierr = PetscStrncpy(env,str,len);CHKERRQ(ierr);} 64e5c89e4eSSatish Balay } 65c3aae356SJed Brown ierr = MPI_Bcast(&flg,1,MPIU_BOOL,0,comm);CHKERRQ(ierr); 66e5c89e4eSSatish Balay ierr = MPI_Bcast(env,len,MPI_CHAR,0,comm);CHKERRQ(ierr); 67e5c89e4eSSatish Balay if (flag) *flag = flg; 68e5c89e4eSSatish Balay } 69e5c89e4eSSatish Balay } else { 700298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,work,flag);CHKERRQ(ierr); 71e5c89e4eSSatish Balay } 72e5c89e4eSSatish Balay PetscFunctionReturn(0); 73e5c89e4eSSatish Balay } 74e5c89e4eSSatish Balay 75e5c89e4eSSatish Balay /* 76e5c89e4eSSatish Balay PetscSetDisplay - Tries to set the X windows display variable for all processors. 77e5c89e4eSSatish Balay The variable PetscDisplay contains the X windows display variable. 78e5c89e4eSSatish Balay 79e5c89e4eSSatish Balay */ 80e5c89e4eSSatish Balay static char PetscDisplay[256]; 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay #undef __FUNCT__ 8389c53ad2SJed Brown #define __FUNCT__ "PetscWorldIsSingleHost" 84ace3abfcSBarry Smith static PetscErrorCode PetscWorldIsSingleHost(PetscBool *onehost) 8589c53ad2SJed Brown { 8689c53ad2SJed Brown PetscErrorCode ierr; 87d64e9277SJed Brown char hostname[256],roothostname[256]; 88d64e9277SJed Brown PetscMPIInt localmatch,allmatch; 89ace3abfcSBarry Smith PetscBool flag; 9089c53ad2SJed Brown 9189c53ad2SJed Brown PetscFunctionBegin; 9289c53ad2SJed Brown ierr = PetscGetHostName(hostname,256);CHKERRQ(ierr); 9389c53ad2SJed Brown ierr = PetscMemcpy(roothostname,hostname,256);CHKERRQ(ierr); 9489c53ad2SJed Brown ierr = MPI_Bcast(roothostname,256,MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 9589c53ad2SJed Brown ierr = PetscStrcmp(hostname,roothostname,&flag);CHKERRQ(ierr); 96a297a907SKarl Rupp 9789c53ad2SJed Brown localmatch = (PetscMPIInt)flag; 98a297a907SKarl Rupp 99*b2566f29SBarry Smith ierr = MPIU_Allreduce(&localmatch,&allmatch,1,MPI_INT,MPI_LAND,PETSC_COMM_WORLD);CHKERRQ(ierr); 100a297a907SKarl Rupp 101ace3abfcSBarry Smith *onehost = (PetscBool)allmatch; 10289c53ad2SJed Brown PetscFunctionReturn(0); 10389c53ad2SJed Brown } 10489c53ad2SJed Brown 10589c53ad2SJed Brown 10689c53ad2SJed Brown #undef __FUNCT__ 107e5c89e4eSSatish Balay #define __FUNCT__ "PetscSetDisplay" 1087087cfbeSBarry Smith PetscErrorCode PetscSetDisplay(void) 109e5c89e4eSSatish Balay { 110e5c89e4eSSatish Balay PetscErrorCode ierr; 111e5c89e4eSSatish Balay PetscMPIInt size,rank; 112ace3abfcSBarry Smith PetscBool flag,singlehost=PETSC_FALSE; 1138caf3d72SBarry Smith char display[sizeof(PetscDisplay)]; 11489c53ad2SJed Brown const char *str; 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay PetscFunctionBegin; 1170298fd71SBarry Smith ierr = PetscOptionsGetString(NULL,"-display",PetscDisplay,sizeof(PetscDisplay),&flag);CHKERRQ(ierr); 118e5c89e4eSSatish Balay if (flag) PetscFunctionReturn(0); 119e5c89e4eSSatish Balay 120e5c89e4eSSatish Balay ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 121e5c89e4eSSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 12289c53ad2SJed Brown 12389c53ad2SJed Brown ierr = PetscWorldIsSingleHost(&singlehost);CHKERRQ(ierr); 12489c53ad2SJed Brown 125e5c89e4eSSatish Balay str = getenv("DISPLAY"); 12689c53ad2SJed Brown if (!str) str = ":0.0"; 1270076e027SBarry Smith #if defined(PETSC_HAVE_X) 1280076e027SBarry Smith flag = PETSC_FALSE; 1290076e027SBarry Smith ierr = PetscOptionsGetBool(NULL,"-x_virtual",&flag,NULL);CHKERRQ(ierr); 1300076e027SBarry Smith if (flag) { 13116ad0300SBarry Smith /* this is a crude hack, but better than nothing */ 13216ad0300SBarry Smith ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"pkill -9 Xvfb","r",NULL);CHKERRQ(ierr); 13316ad0300SBarry Smith ierr = PetscSleep(1);CHKERRQ(ierr); 1340076e027SBarry Smith ierr = PetscPOpen(PETSC_COMM_WORLD,NULL,"Xvfb :15 -screen 0 1600x1200x24","r",NULL);CHKERRQ(ierr); 1350076e027SBarry Smith ierr = PetscSleep(5);CHKERRQ(ierr); 1360076e027SBarry Smith str = ":15"; 1370076e027SBarry Smith } 1380076e027SBarry Smith #endif 13989c53ad2SJed Brown if (str[0] != ':' || singlehost) { 1408caf3d72SBarry Smith ierr = PetscStrncpy(display,str,sizeof(display));CHKERRQ(ierr); 141a297a907SKarl Rupp } else if (!rank) { 14213f021ebSJed Brown size_t len; 1438caf3d72SBarry Smith ierr = PetscGetHostName(display,sizeof(display));CHKERRQ(ierr); 14413f021ebSJed Brown ierr = PetscStrlen(display,&len);CHKERRQ(ierr); 1458caf3d72SBarry Smith ierr = PetscStrncat(display,str,sizeof(display)-len-1);CHKERRQ(ierr); 146e5c89e4eSSatish Balay } 1478caf3d72SBarry Smith ierr = MPI_Bcast(display,sizeof(display),MPI_CHAR,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 1488caf3d72SBarry Smith ierr = PetscMemcpy(PetscDisplay,display,sizeof(PetscDisplay));CHKERRQ(ierr); 149a297a907SKarl Rupp 1508caf3d72SBarry Smith PetscDisplay[sizeof(PetscDisplay)-1] = 0; 151e5c89e4eSSatish Balay PetscFunctionReturn(0); 152e5c89e4eSSatish Balay } 153e5c89e4eSSatish Balay 154e5c89e4eSSatish Balay #undef __FUNCT__ 155e5c89e4eSSatish Balay #define __FUNCT__ "PetscGetDisplay" 156e5c89e4eSSatish Balay /* 157e5c89e4eSSatish Balay PetscGetDisplay - Gets the display variable for all processors. 158e5c89e4eSSatish Balay 159e5c89e4eSSatish Balay Input Parameters: 160e5c89e4eSSatish Balay . n - length of string display 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay Output Parameters: 163e5c89e4eSSatish Balay . display - the display string 164e5c89e4eSSatish Balay 165681455b2SBarry Smith Options Database: 166681455b2SBarry Smith + -display <display> - sets the display to use 1670076e027SBarry 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 1680076e027SBarry Smith started up in PetscSetDisplay() with this option 169681455b2SBarry Smith 170e5c89e4eSSatish Balay */ 1717087cfbeSBarry Smith PetscErrorCode PetscGetDisplay(char display[],size_t n) 172e5c89e4eSSatish Balay { 173e5c89e4eSSatish Balay PetscErrorCode ierr; 174e5c89e4eSSatish Balay 175e5c89e4eSSatish Balay PetscFunctionBegin; 176e5c89e4eSSatish Balay ierr = PetscStrncpy(display,PetscDisplay,n);CHKERRQ(ierr); 177e5c89e4eSSatish Balay PetscFunctionReturn(0); 178e5c89e4eSSatish Balay } 179