/*@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,"-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(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); }
/*@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,"-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(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 PetscBagRegisterScalar - add a real or complex number value to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of scalar 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 PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar 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,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help);CHKERRQ(ierr); } ierr = PetscOptionsGetScalar(bag->bagprefix,nname,&mdefault,NULL);CHKERRQ(ierr); ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_SCALAR; 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; *(PetscScalar*)addr = mdefault; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscBagRegisterString - add a string value to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of start of string in struct . msize - length of the string space in the struct . mdefault - the initial value . name - name of the string - help - longer string with more information about the value Level: beginner Note: The struct should have the field char mystring[msize]; not char *mystring .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() @*/ PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* 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,"-help",&printhelp);CHKERRQ(ierr); if (printhelp) { ierr = (*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help);CHKERRQ(ierr); } ierr = PetscNew(&item);CHKERRQ(ierr); item->dtype = PETSC_CHAR; 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; if (mdefault != (char*)addr) { ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr); } ierr = PetscOptionsGetString(bag->bagprefix,nname,(char*)addr,msize,NULL);CHKERRQ(ierr); ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscBagRegisterBoolArray - add a n logical values to the bag Logically Collective on PetscBag Input Parameter: + bag - the bag of values . addr - location of boolean array in struct . msize - number of entries in array . name - name of the boolean 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 PetscBagRegisterBoolArray(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,"-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,"%D ",*((PetscInt*)addr)+i);CHKERRQ(ierr); } ierr = (*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help);CHKERRQ(ierr); } ierr = PetscOptionsGetBoolArray(bag->bagprefix,nname,(PetscBool*)addr,&tmp,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 = msize; ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode InitializeProblem(AppCtx *user) { PetscErrorCode ierr; PetscViewer loader; MPI_Comm comm; PetscInt nrows,ncols,i; PetscScalar one=1.0; char filebase[128]; char filename[128]; PetscFunctionBegin; comm = PETSC_COMM_WORLD; ierr = PetscStrncpy(filebase,user->name,128);CHKERRQ(ierr); ierr = PetscStrncat(filebase,"/",1);CHKERRQ(ierr); ierr = PetscStrncpy(filename,filebase,128);CHKERRQ(ierr); ierr = PetscStrncat(filename,"f",3);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(comm,filename,FILE_MODE_READ,&loader);CHKERRQ(ierr); ierr = VecCreate(comm,&user->d);CHKERRQ(ierr); ierr = VecLoad(user->d,loader);CHKERRQ(ierr); ierr = PetscViewerDestroy(&loader);CHKERRQ(ierr); ierr = VecGetSize(user->d,&nrows);CHKERRQ(ierr); ierr = VecSetFromOptions(user->d);CHKERRQ(ierr); user->n = nrows; ierr = PetscStrncpy(filename,filebase,128);CHKERRQ(ierr); ierr = PetscStrncat(filename,"H",3);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(comm,filename,FILE_MODE_READ,&loader);CHKERRQ(ierr); ierr = MatCreate(comm,&user->H);CHKERRQ(ierr); ierr = MatSetSizes(user->H,PETSC_DECIDE,PETSC_DECIDE,nrows,nrows);CHKERRQ(ierr); ierr = MatLoad(user->H,loader);CHKERRQ(ierr); ierr = PetscViewerDestroy(&loader);CHKERRQ(ierr); ierr = MatGetSize(user->H,&nrows,&ncols);CHKERRQ(ierr); if (nrows != user->n) SETERRQ(comm,0,"H: nrows != n\n"); if (ncols != user->n) SETERRQ(comm,0,"H: ncols != n\n"); ierr = MatSetFromOptions(user->H);CHKERRQ(ierr); ierr = PetscStrncpy(filename,filebase,128);CHKERRQ(ierr); ierr = PetscStrncat(filename,"Aeq",3);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(comm,filename,FILE_MODE_READ,&loader); if (ierr) { user->Aeq = NULL; user->me = 0; } else { ierr = MatCreate(comm,&user->Aeq);CHKERRQ(ierr); ierr = MatLoad(user->Aeq,loader);CHKERRQ(ierr); ierr = PetscViewerDestroy(&loader);CHKERRQ(ierr); ierr = MatGetSize(user->Aeq,&nrows,&ncols);CHKERRQ(ierr); if (ncols != user->n) SETERRQ(comm,0,"Aeq ncols != H nrows\n"); ierr = MatSetFromOptions(user->Aeq);CHKERRQ(ierr); user->me = nrows; } ierr = PetscStrncpy(filename,filebase,128);CHKERRQ(ierr); ierr = PetscStrncat(filename,"Beq",3);CHKERRQ(ierr); ierr = PetscViewerBinaryOpen(comm,filename,FILE_MODE_READ,&loader);CHKERRQ(ierr); if (ierr) { user->beq = 0; } else { ierr = VecCreate(comm,&user->beq);CHKERRQ(ierr); ierr = VecLoad(user->beq,loader);CHKERRQ(ierr); ierr = PetscViewerDestroy(&loader);CHKERRQ(ierr); ierr = VecGetSize(user->beq,&nrows);CHKERRQ(ierr); if (nrows != user->me) SETERRQ(comm,0,"Aeq nrows != Beq n\n"); ierr = VecSetFromOptions(user->beq);CHKERRQ(ierr); } user->mi = user->n; /* Ain = eye(n,n) */ ierr = MatCreate(comm,&user->Ain);CHKERRQ(ierr); ierr = MatSetType(user->Ain,MATAIJ);CHKERRQ(ierr); ierr = MatSetSizes(user->Ain,PETSC_DECIDE,PETSC_DECIDE,user->mi,user->mi);CHKERRQ(ierr); ierr = MatMPIAIJSetPreallocation(user->Ain,1,NULL,0,NULL);CHKERRQ(ierr); ierr = MatSeqAIJSetPreallocation(user->Ain,1,NULL);CHKERRQ(ierr); for (i=0;i<user->mi;i++) { ierr = MatSetValues(user->Ain,1,&i,1,&i,&one,INSERT_VALUES);CHKERRQ(ierr); } ierr = MatAssemblyBegin(user->Ain,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatAssemblyEnd(user->Ain,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); ierr = MatSetFromOptions(user->Ain);CHKERRQ(ierr); /* bin = [0,0 ... 0]' */ ierr = VecCreate(comm,&user->bin);CHKERRQ(ierr); ierr = VecSetType(user->bin,VECMPI);CHKERRQ(ierr); ierr = VecSetSizes(user->bin,PETSC_DECIDE,user->mi);CHKERRQ(ierr); ierr = VecSet(user->bin,0.0);CHKERRQ(ierr); ierr = VecSetFromOptions(user->bin);CHKERRQ(ierr); user->m = user->me + user->mi; PetscFunctionReturn(0); }
/*@C PetscGetFullPath - Given a filename, returns the fully qualified file name. Not Collective Input Parameters: + path - pathname to qualify . fullpath - pointer to buffer to hold full pathname - flen - size of fullpath Level: developer Concepts: full path Concepts: path^full .seealso: PetscGetRelativePath() @*/ PetscErrorCode PetscGetFullPath(const char path[],char fullpath[],size_t flen) { PetscErrorCode ierr; size_t ln; PetscBool flg; PetscFunctionBegin; if (path[0] == '/') { ierr = PetscStrncmp("/tmp_mnt/",path,9,&flg);CHKERRQ(ierr); if (flg) {ierr = PetscStrncpy(fullpath,path + 8,flen);CHKERRQ(ierr);} else {ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr);} fullpath[flen-1] = 0; PetscFunctionReturn(0); } ierr = PetscStrncpy(fullpath,path,flen);CHKERRQ(ierr); fullpath[flen-1] = 0; /* Remove the various "special" forms (~username/ and ~/) */ if (fullpath[0] == '~') { char tmppath[PETSC_MAX_PATH_LEN],*rest; if (fullpath[1] == '/') { ierr = PetscGetHomeDirectory(tmppath,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); rest = fullpath + 2; } else { #if defined(PETSC_HAVE_PWD_H) struct passwd *pwde; char *p,*name; /* Find username */ name = fullpath + 1; p = name; while (*p && *p != '/') p++; *p = 0; rest = p + 1; pwde = getpwnam(name); if (!pwde) PetscFunctionReturn(0); ierr = PetscStrcpy(tmppath,pwde->pw_dir);CHKERRQ(ierr); #else PetscFunctionReturn(0); #endif } ierr = PetscStrlen(tmppath,&ln);CHKERRQ(ierr); if (tmppath[ln-1] != '/') {ierr = PetscStrcat(tmppath+ln-1,"/");CHKERRQ(ierr);} ierr = PetscStrcat(tmppath,rest);CHKERRQ(ierr); ierr = PetscStrncpy(fullpath,tmppath,flen);CHKERRQ(ierr); fullpath[flen-1] = 0; } else { ierr = PetscGetWorkingDirectory(fullpath,flen);CHKERRQ(ierr); ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); ierr = PetscStrncpy(fullpath+ln,"/",flen - ln);CHKERRQ(ierr); fullpath[flen-1] = 0; ierr = PetscStrlen(fullpath,&ln);CHKERRQ(ierr); if (path[0] == '.' && path[1] == '/') { ierr = PetscStrncat(fullpath,path+2,flen - ln - 1);CHKERRQ(ierr); } else { ierr = PetscStrncat(fullpath,path,flen - ln - 1);CHKERRQ(ierr); } fullpath[flen-1] = 0; } /* Remove the automounter part of the path */ ierr = PetscStrncmp(fullpath,"/tmp_mnt/",9,&flg);CHKERRQ(ierr); if (flg) { char tmppath[PETSC_MAX_PATH_LEN]; ierr = PetscStrcpy(tmppath,fullpath + 8);CHKERRQ(ierr); ierr = PetscStrcpy(fullpath,tmppath);CHKERRQ(ierr); } /* We could try to handle things like the removal of .. etc */ PetscFunctionReturn(0); }