/*@C PetscBagRegisterInt - add an integer value to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of integer in struct . mdefault - the initial value . name - name of the integer - help - longer string with more information about the value Level: beginner .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() PetscBagRegisterInt64(), PetscBagRegisterBool(), PetscBagRegisterScalar() PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() @*/ PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help) { PetscErrorCode ierr; PetscBagItem item; char nname[PETSC_BAG_NAME_LENGTH+1]; PetscBool printhelp; PetscFunctionBegin; nname[0] = '-'; nname[1] = 0; ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%d>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); } ierr = PetscOptionsGetInt(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_INT; item->offset = ((char*)addr) - ((char*)bag); if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); item->next = 0; item->msize = 1; *(PetscInt*)addr = mdefault; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscBagRegisterBool - add a logical value to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of logical in struct . mdefault - the initial value . name - name of the variable - help - longer string with more information about the value Level: beginner .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() @*/ PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help) { PetscErrorCode ierr; PetscBagItem item; char nname[PETSC_BAG_NAME_LENGTH+1]; PetscBool printhelp; PetscFunctionBegin; /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ if (mdefault != PETSC_FALSE && mdefault != PETSC_TRUE) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Boolean %s %s must be boolean; integer value %d",name,help,(int)mdefault); nname[0] = '-'; nname[1] = 0; ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help);CHKERRQ(ierr); } ierr = PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_BOOL; item->offset = ((char*)addr) - ((char*)bag); if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); item->next = 0; item->msize = 1; *(PetscBool*)addr = mdefault; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscBagRegisterRealArray - add an real array to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of real array in struct . msize - number of entries in array . name - name of the integer array - help - longer string with more information about the value Level: beginner .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() @*/ PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) { PetscErrorCode ierr; PetscBagItem item; char nname[PETSC_BAG_NAME_LENGTH+1]; PetscBool printhelp; PetscInt i,tmp = msize; PetscFunctionBegin; /* ierr = PetscMemzero(addr,msize*sizeof(PetscInt));CHKERRQ(ierr);*/ nname[0] = '-'; nname[1] = 0; ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name);CHKERRQ(ierr); for (i=0; i<msize; i++) { ierr = (*PetscHelpPrintf)(bag->bagcomm,"%g ",(double)*((PetscReal*)addr)+i);CHKERRQ(ierr); } ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); } ierr = PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL);CHKERRQ(ierr); ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_REAL; item->offset = ((char*)addr) - ((char*)bag); if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); item->next = 0; item->msize = msize; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscBagRegisterEnum - add an enum value to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of enum in struct . mdefault - the initial value . list - array of strings containing names of enum values followed by enum name followed by enum prefix - help - longer string with more information about the value Level: beginner .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() @*/ PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help) { PetscErrorCode ierr; PetscBagItem item; char nname[PETSC_BAG_NAME_LENGTH+1]; PetscBool printhelp; PetscInt i = 0; PetscFunctionBegin; nname[0] = '-'; nname[1] = 0; ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr); ierr = PetscOptionsHasName(NULL,NULL,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { while (list[i++]) ; ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: (%s) %s (choose one of) ",bag->bagprefix ? bag->bagprefix : "",name,list[mdefault],list[i-3],help);CHKERRQ(ierr); for (i=0; list[i+2]; i++) { ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr); } ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr); } ierr = PetscOptionsGetEnum(NULL,bag->bagprefix,nname,list,&mdefault,NULL);CHKERRQ(ierr); ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_ENUM; item->offset = ((char*)addr) - ((char*)bag); if (item->offset > bag->bagsize) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); item->next = 0; item->msize = 1; ierr = PetscStrArrayallocpy(list,(char***)&item->list);CHKERRQ(ierr); *(PetscEnum*)addr = mdefault; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }