Hmm, I think this perhaps an issue of documentation. 

   It seems the various PetscOptionsGetXXX() DO NOT set the value unless the 
options database indicates it should be set (and when the options database does 
indicate it has been set the set flag is set). 

   But this is only documented for PetscOptionsGetBool()

   The PetscOptionsXXX() also do not set the value unless the options database 
indicates it should be set. 

   So my conclusion is that the code is correct but the documentation needs 
work. I will make a pull request where I "fix" the documentation.

  Barry


   

> On Nov 6, 2017, at 8:25 AM, Mark Adams <mfad...@lbl.gov> wrote:
> 
> This code looks wrong. I get a valgrind warning if the option is not set. I 
> think this code should be added.
> 
> PetscErrorCode  PetscOptionsBool_Private(PetscOptionItems 
> *PetscOptionsObject,const char opt[],const char text[],const char 
> man[],PetscBool currentvalue,PetscBool  *flg,PetscBool  *set)
> {
>   PetscErrorCode  ierr;
>   PetscBool       iset;
>   PetscOptionItem amsopt;
> 
>   PetscFunctionBegin;
>   if (!PetscOptionsObject->count) {
>     ierr = 
> PetscOptionItemCreate_Private(PetscOptionsObject,opt,text,man,OPTION_BOOL,&amsopt);CHKERRQ(ierr);
>     ierr = PetscMalloc(sizeof(PetscBool),&amsopt->data);CHKERRQ(ierr);
> 
>     *(PetscBool*)amsopt->data = currentvalue;
>   }
>   flg = currentvalue;
>   ierr = 
> PetscOptionsGetBool(PetscOptionsObject->options,PetscOptionsObject->prefix,opt,flg,&iset);CHKERRQ(ierr);
>   if (set) *set = iset;
>   if (PetscOptionsObject->printhelp && PetscOptionsObject->count == 1 && 
> !PetscOptionsObject->alreadyprinted) {
>     const char *v = PetscBools[currentvalue];
>     ierr = (*PetscHelpPrintf)(PetscOptionsObject->comm,"  -%s%s: <%s> %s 
> (%s)\n",PetscOptionsObject->prefix?PetscOptionsObject->prefix:"",opt+1,v,text,ManSection(man));CHKERRQ(ierr);
>   }
>   PetscFunctionReturn(0);
> }
> 

Reply via email to