1*5f80ce2aSJacob Faibussowitsch #include <petsc/private/petscimpl.h> 2af0996ceSBarry Smith #include <petsc/private/bagimpl.h> /*I "petscbag.h" I*/ 3665c2dedSJed Brown #include <petscviewer.h> 45c6c1daeSBarry Smith 55c6c1daeSBarry Smith /* 65c6c1daeSBarry Smith Adds item to the linked list in a bag 75c6c1daeSBarry Smith */ 85c6c1daeSBarry Smith static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char *name,const char *help) 95c6c1daeSBarry Smith { 105c6c1daeSBarry Smith PetscFunctionBegin; 11*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1)); 12*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1)); 13*5f80ce2aSJacob Faibussowitsch if (bag->bagitems) { 145c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 15*5f80ce2aSJacob Faibussowitsch 16*5f80ce2aSJacob Faibussowitsch while (nitem->next) nitem = nitem->next; 175c6c1daeSBarry Smith nitem->next = item; 18*5f80ce2aSJacob Faibussowitsch } else bag->bagitems = item; 195c6c1daeSBarry Smith bag->count++; 205c6c1daeSBarry Smith PetscFunctionReturn(0); 215c6c1daeSBarry Smith } 225c6c1daeSBarry Smith 235c6c1daeSBarry Smith /*@C 245c6c1daeSBarry Smith PetscBagRegisterEnum - add an enum value to the bag 255c6c1daeSBarry Smith 265c6c1daeSBarry Smith Logically Collective on PetscBag 275c6c1daeSBarry Smith 28d8d19677SJose E. Roman Input Parameters: 295c6c1daeSBarry Smith + bag - the bag of values 305c6c1daeSBarry Smith . addr - location of enum in struct 315c6c1daeSBarry Smith . mdefault - the initial value 325c6c1daeSBarry Smith . list - array of strings containing names of enum values followed by enum name followed by enum prefix 335c6c1daeSBarry Smith - help - longer string with more information about the value 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith Level: beginner 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 385c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 395c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith @*/ 425c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char *const *list,PetscEnum mdefault, const char *name, const char *help) 435c6c1daeSBarry Smith { 445c6c1daeSBarry Smith PetscBagItem item; 455c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 465c6c1daeSBarry Smith PetscBool printhelp; 475c6c1daeSBarry Smith PetscInt i = 0; 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith PetscFunctionBegin; 50*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 51*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 52*5f80ce2aSJacob Faibussowitsch PetscValidPointer(list,3); 53*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,5); 54*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,6); 555c6c1daeSBarry Smith nname[0] = '-'; 565c6c1daeSBarry Smith nname[1] = 0; 57*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 58*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 595c6c1daeSBarry Smith if (printhelp) { 605c6c1daeSBarry Smith while (list[i++]) ; 61*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: (%s) %s (choose one of) ",bag->bagprefix ? bag->bagprefix : "",name,list[mdefault],list[i-3],help)); 62*5f80ce2aSJacob Faibussowitsch for (i=0; list[i+2]; i++) CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," %s",list[i])); 63*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,"\n")); 645c6c1daeSBarry Smith } 65*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetEnum(NULL,bag->bagprefix,nname,list,&mdefault,NULL)); 665c6c1daeSBarry Smith 67*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 685c6c1daeSBarry Smith item->dtype = PETSC_ENUM; 695c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 70*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 7102c9f0b5SLisandro Dalcin item->next = NULL; 725c6c1daeSBarry Smith item->msize = 1; 73*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayallocpy(list,(char***)&item->list)); 745c6c1daeSBarry Smith *(PetscEnum*)addr = mdefault; 75*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 765c6c1daeSBarry Smith PetscFunctionReturn(0); 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith /*@C 805c6c1daeSBarry Smith PetscBagRegisterIntArray - add an integer value to the bag 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith Logically Collective on PetscBag 835c6c1daeSBarry Smith 84d8d19677SJose E. Roman Input Parameters: 855c6c1daeSBarry Smith + bag - the bag of values 865c6c1daeSBarry Smith . addr - location of integer in struct 875c6c1daeSBarry Smith . msize - number of entries in array 885c6c1daeSBarry Smith . name - name of the integer array 895c6c1daeSBarry Smith - help - longer string with more information about the value 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith Level: beginner 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 945c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 955c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 965c6c1daeSBarry Smith 975c6c1daeSBarry Smith @*/ 985c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterIntArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 995c6c1daeSBarry Smith { 1005c6c1daeSBarry Smith PetscBagItem item; 1015c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1025c6c1daeSBarry Smith PetscBool printhelp; 1035c6c1daeSBarry Smith PetscInt i,tmp = msize; 1045c6c1daeSBarry Smith 1055c6c1daeSBarry Smith PetscFunctionBegin; 106*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 107*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 108*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 109*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 1105c6c1daeSBarry Smith nname[0] = '-'; 1115c6c1daeSBarry Smith nname[1] = 0; 112*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 113*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 1145c6c1daeSBarry Smith if (printhelp) { 115*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name)); 1165c6c1daeSBarry Smith for (i=0; i<msize; i++) { 117*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,"%" PetscInt_FMT " ",*((PetscInt*)addr)+i)); 1185c6c1daeSBarry Smith } 119*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help)); 1205c6c1daeSBarry Smith } 121*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetIntArray(NULL,bag->bagprefix,nname,(PetscInt*)addr,&tmp,NULL)); 1225c6c1daeSBarry Smith 123*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 1245c6c1daeSBarry Smith item->dtype = PETSC_INT; 1255c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 126*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 12702c9f0b5SLisandro Dalcin item->next = NULL; 1285c6c1daeSBarry Smith item->msize = msize; 129*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 1305c6c1daeSBarry Smith PetscFunctionReturn(0); 1315c6c1daeSBarry Smith } 1325c6c1daeSBarry Smith 1335c6c1daeSBarry Smith /*@C 1345c6c1daeSBarry Smith PetscBagRegisterRealArray - add an real array to the bag 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith Logically Collective on PetscBag 1375c6c1daeSBarry Smith 138d8d19677SJose E. Roman Input Parameters: 1395c6c1daeSBarry Smith + bag - the bag of values 1405c6c1daeSBarry Smith . addr - location of real array in struct 1415c6c1daeSBarry Smith . msize - number of entries in array 1425c6c1daeSBarry Smith . name - name of the integer array 1435c6c1daeSBarry Smith - help - longer string with more information about the value 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Level: beginner 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 1485c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 1495c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 1505c6c1daeSBarry Smith 1515c6c1daeSBarry Smith @*/ 1525c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterRealArray(PetscBag bag,void *addr,PetscInt msize, const char *name, const char *help) 1535c6c1daeSBarry Smith { 1545c6c1daeSBarry Smith PetscBagItem item; 1555c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 1565c6c1daeSBarry Smith PetscBool printhelp; 1575c6c1daeSBarry Smith PetscInt i,tmp = msize; 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith PetscFunctionBegin; 160*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 161*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 162*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 163*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 1645c6c1daeSBarry Smith nname[0] = '-'; 1655c6c1daeSBarry Smith nname[1] = 0; 166*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 167*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 1685c6c1daeSBarry Smith if (printhelp) { 169*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix ? bag->bagprefix : "",name)); 1705c6c1daeSBarry Smith for (i=0; i<msize; i++) { 171*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,"%g ",(double)*((PetscReal*)addr)+i)); 1725c6c1daeSBarry Smith } 173*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help)); 1745c6c1daeSBarry Smith } 175*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetRealArray(NULL,bag->bagprefix,nname,(PetscReal*)addr,&tmp,NULL)); 1765c6c1daeSBarry Smith 177*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 1785c6c1daeSBarry Smith item->dtype = PETSC_REAL; 1795c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 180*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 18102c9f0b5SLisandro Dalcin item->next = NULL; 1825c6c1daeSBarry Smith item->msize = msize; 183*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 1845c6c1daeSBarry Smith PetscFunctionReturn(0); 1855c6c1daeSBarry Smith } 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith /*@C 1885c6c1daeSBarry Smith PetscBagRegisterInt - add an integer value to the bag 1895c6c1daeSBarry Smith 1905c6c1daeSBarry Smith Logically Collective on PetscBag 1915c6c1daeSBarry Smith 192d8d19677SJose E. Roman Input Parameters: 1935c6c1daeSBarry Smith + bag - the bag of values 1945c6c1daeSBarry Smith . addr - location of integer in struct 1955c6c1daeSBarry Smith . mdefault - the initial value 1965c6c1daeSBarry Smith . name - name of the integer 1975c6c1daeSBarry Smith - help - longer string with more information about the value 1985c6c1daeSBarry Smith 1995c6c1daeSBarry Smith Level: beginner 2005c6c1daeSBarry Smith 2015c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 202bafee8b4SSatish Balay PetscBagRegisterInt64(), PetscBagRegisterBool(), PetscBagRegisterScalar() 2035c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 2045c6c1daeSBarry Smith 2055c6c1daeSBarry Smith @*/ 2065c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault,const char *name,const char *help) 2075c6c1daeSBarry Smith { 2085c6c1daeSBarry Smith PetscBagItem item; 2095c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 2105c6c1daeSBarry Smith PetscBool printhelp; 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith PetscFunctionBegin; 213*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 214*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 215*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 216*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 2175c6c1daeSBarry Smith nname[0] = '-'; 2185c6c1daeSBarry Smith nname[1] = 0; 219*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 220*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 2215c6c1daeSBarry Smith if (printhelp) { 222*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%" PetscInt_FMT ">: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help)); 2235c6c1daeSBarry Smith } 224*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,bag->bagprefix,nname,&mdefault,NULL)); 2255c6c1daeSBarry Smith 226*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 2275c6c1daeSBarry Smith item->dtype = PETSC_INT; 2285c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 229*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 23002c9f0b5SLisandro Dalcin item->next = NULL; 2315c6c1daeSBarry Smith item->msize = 1; 2325c6c1daeSBarry Smith *(PetscInt*)addr = mdefault; 233*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 2345c6c1daeSBarry Smith PetscFunctionReturn(0); 2355c6c1daeSBarry Smith } 2365c6c1daeSBarry Smith 2370d349d43SBarry Smith /*@C 238bafee8b4SSatish Balay PetscBagRegisterInt64 - add an integer value to the bag 2390d349d43SBarry Smith 2400d349d43SBarry Smith Logically Collective on PetscBag 2410d349d43SBarry Smith 242d8d19677SJose E. Roman Input Parameters: 2430d349d43SBarry Smith + bag - the bag of values 2440d349d43SBarry Smith . addr - location of integer in struct 2450d349d43SBarry Smith . mdefault - the initial value 2460d349d43SBarry Smith . name - name of the integer 2470d349d43SBarry Smith - help - longer string with more information about the value 2480d349d43SBarry Smith 2490d349d43SBarry Smith Level: beginner 2500d349d43SBarry Smith 2510d349d43SBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 2520d349d43SBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 2530d349d43SBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 2540d349d43SBarry Smith 2550d349d43SBarry Smith @*/ 256bafee8b4SSatish Balay PetscErrorCode PetscBagRegisterInt64(PetscBag bag,void *addr,PetscInt64 mdefault,const char *name,const char *help) 2570d349d43SBarry Smith { 2580d349d43SBarry Smith PetscBagItem item; 2590d349d43SBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 2600d349d43SBarry Smith PetscBool printhelp; 2610d349d43SBarry Smith PetscInt odefault = (PetscInt)mdefault; 2620d349d43SBarry Smith PetscBool flg; 2630d349d43SBarry Smith 2640d349d43SBarry Smith PetscFunctionBegin; 2650d349d43SBarry Smith nname[0] = '-'; 2660d349d43SBarry Smith nname[1] = 0; 267*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 268*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 2690d349d43SBarry Smith if (printhelp) { 270*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%" PetscInt_FMT ">: %s \n",bag->bagprefix ? bag->bagprefix : "",name,odefault,help)); 2710d349d43SBarry Smith } 272*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,bag->bagprefix,nname,&odefault,&flg)); 273bafee8b4SSatish Balay if (flg) mdefault = (PetscInt64)odefault; 2740d349d43SBarry Smith 275*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 2760d349d43SBarry Smith item->dtype = PETSC_INT; 2770d349d43SBarry Smith item->offset = ((char*)addr) - ((char*)bag); 278*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 27902c9f0b5SLisandro Dalcin item->next = NULL; 2800d349d43SBarry Smith item->msize = 1; 281bafee8b4SSatish Balay *(PetscInt64*)addr = mdefault; 282*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 2830d349d43SBarry Smith PetscFunctionReturn(0); 2840d349d43SBarry Smith } 2850d349d43SBarry Smith 286dd66f111SBlaise Bourdin /*@C 287dd66f111SBlaise Bourdin PetscBagRegisterBoolArray - add a n logical values to the bag 288dd66f111SBlaise Bourdin 289dd66f111SBlaise Bourdin Logically Collective on PetscBag 290dd66f111SBlaise Bourdin 291d8d19677SJose E. Roman Input Parameters: 292dd66f111SBlaise Bourdin + bag - the bag of values 293dd66f111SBlaise Bourdin . addr - location of boolean array in struct 294dd66f111SBlaise Bourdin . msize - number of entries in array 295dd66f111SBlaise Bourdin . name - name of the boolean array 296dd66f111SBlaise Bourdin - help - longer string with more information about the value 297dd66f111SBlaise Bourdin 298dd66f111SBlaise Bourdin Level: beginner 299dd66f111SBlaise Bourdin 300dd66f111SBlaise Bourdin .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 301dd66f111SBlaise Bourdin PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 302dd66f111SBlaise Bourdin PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 303dd66f111SBlaise Bourdin 304dd66f111SBlaise Bourdin @*/ 305dd66f111SBlaise Bourdin PetscErrorCode PetscBagRegisterBoolArray(PetscBag bag,void *addr,PetscInt msize, const char* name, const char* help) 306dd66f111SBlaise Bourdin { 307dd66f111SBlaise Bourdin PetscBagItem item; 308dd66f111SBlaise Bourdin char nname[PETSC_BAG_NAME_LENGTH+1]; 309dd66f111SBlaise Bourdin PetscBool printhelp; 310dd66f111SBlaise Bourdin PetscInt i,tmp = msize; 311dd66f111SBlaise Bourdin 312dd66f111SBlaise Bourdin PetscFunctionBegin; 313*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 314*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 315*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 316*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 317dd66f111SBlaise Bourdin nname[0] = '-'; 318dd66f111SBlaise Bourdin nname[1] = 0; 319*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 320*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 321dd66f111SBlaise Bourdin if (printhelp) { 322*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <",bag->bagprefix?bag->bagprefix:"",name)); 323dd66f111SBlaise Bourdin for (i=0; i<msize; i++) { 324*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,"%" PetscInt_FMT " ",*((PetscInt*)addr)+i)); 325dd66f111SBlaise Bourdin } 326*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm,">: %s \n",help)); 327dd66f111SBlaise Bourdin } 328*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBoolArray(NULL,bag->bagprefix,nname,(PetscBool*)addr,&tmp,NULL)); 329dd66f111SBlaise Bourdin 330*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 331dd66f111SBlaise Bourdin item->dtype = PETSC_BOOL; 332dd66f111SBlaise Bourdin item->offset = ((char*)addr) - ((char*)bag); 333*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 33402c9f0b5SLisandro Dalcin item->next = NULL; 335dd66f111SBlaise Bourdin item->msize = msize; 336*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 337dd66f111SBlaise Bourdin PetscFunctionReturn(0); 338dd66f111SBlaise Bourdin } 339dd66f111SBlaise Bourdin 3405c6c1daeSBarry Smith /*@C 3415c6c1daeSBarry Smith PetscBagRegisterString - add a string value to the bag 3425c6c1daeSBarry Smith 3435c6c1daeSBarry Smith Logically Collective on PetscBag 3445c6c1daeSBarry Smith 345d8d19677SJose E. Roman Input Parameters: 3465c6c1daeSBarry Smith + bag - the bag of values 3475c6c1daeSBarry Smith . addr - location of start of string in struct 3485c6c1daeSBarry Smith . msize - length of the string space in the struct 3495c6c1daeSBarry Smith . mdefault - the initial value 3505c6c1daeSBarry Smith . name - name of the string 3515c6c1daeSBarry Smith - help - longer string with more information about the value 3525c6c1daeSBarry Smith 3535c6c1daeSBarry Smith Level: beginner 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Note: The struct should have the field char mystring[msize]; not char *mystring 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 3585c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 3595c6c1daeSBarry Smith PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 3605c6c1daeSBarry Smith 3615c6c1daeSBarry Smith @*/ 3625c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault,const char* name,const char* help) 3635c6c1daeSBarry Smith { 3645c6c1daeSBarry Smith PetscBagItem item; 3655c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 3665c6c1daeSBarry Smith PetscBool printhelp; 3675c6c1daeSBarry Smith 3685c6c1daeSBarry Smith PetscFunctionBegin; 369*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 370*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 371*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(mdefault,4); 372*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,5); 373*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,6); 3745c6c1daeSBarry Smith nname[0] = '-'; 3755c6c1daeSBarry Smith nname[1] = 0; 376*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 377*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 3785c6c1daeSBarry Smith if (printhelp) { 379*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,mdefault,help)); 3805c6c1daeSBarry Smith } 3815c6c1daeSBarry Smith 382*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 3835c6c1daeSBarry Smith item->dtype = PETSC_CHAR; 3845c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 385*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 38602c9f0b5SLisandro Dalcin item->next = NULL; 3875c6c1daeSBarry Smith item->msize = msize; 3885c6c1daeSBarry Smith if (mdefault != (char*)addr) { 389*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy((char*)addr,mdefault,msize-1)); 3905c6c1daeSBarry Smith } 391*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetString(NULL,bag->bagprefix,nname,(char*)addr,msize,NULL)); 392*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 3935c6c1daeSBarry Smith PetscFunctionReturn(0); 3945c6c1daeSBarry Smith } 3955c6c1daeSBarry Smith 3965c6c1daeSBarry Smith /*@C 3975c6c1daeSBarry Smith PetscBagRegisterReal - add a real value to the bag 3985c6c1daeSBarry Smith 3995c6c1daeSBarry Smith Logically Collective on PetscBag 4005c6c1daeSBarry Smith 401d8d19677SJose E. Roman Input Parameters: 4025c6c1daeSBarry Smith + bag - the bag of values 4035c6c1daeSBarry Smith . addr - location of double in struct 4045c6c1daeSBarry Smith . mdefault - the initial value 4055c6c1daeSBarry Smith . name - name of the variable 4065c6c1daeSBarry Smith - help - longer string with more information about the value 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith Level: beginner 4095c6c1daeSBarry Smith 4105c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4115c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4125c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith @*/ 4155c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char *name, const char *help) 4165c6c1daeSBarry Smith { 4175c6c1daeSBarry Smith PetscBagItem item; 4185c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4195c6c1daeSBarry Smith PetscBool printhelp; 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith PetscFunctionBegin; 422*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 423*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 424*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 425*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 4265c6c1daeSBarry Smith nname[0] = '-'; 4275c6c1daeSBarry Smith nname[1] = 0; 428*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 429*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 4305c6c1daeSBarry Smith if (printhelp) { 431*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)mdefault,help)); 4325c6c1daeSBarry Smith } 433*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetReal(NULL,bag->bagprefix,nname,&mdefault,NULL)); 4345c6c1daeSBarry Smith 435*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 4365c6c1daeSBarry Smith item->dtype = PETSC_REAL; 4375c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 438*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 43902c9f0b5SLisandro Dalcin item->next = NULL; 4405c6c1daeSBarry Smith item->msize = 1; 4415c6c1daeSBarry Smith *(PetscReal*)addr = mdefault; 442*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 4435c6c1daeSBarry Smith PetscFunctionReturn(0); 4445c6c1daeSBarry Smith } 4455c6c1daeSBarry Smith 4465c6c1daeSBarry Smith /*@C 4475c6c1daeSBarry Smith PetscBagRegisterScalar - add a real or complex number value to the bag 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith Logically Collective on PetscBag 4505c6c1daeSBarry Smith 451d8d19677SJose E. Roman Input Parameters: 4525c6c1daeSBarry Smith + bag - the bag of values 4535c6c1daeSBarry Smith . addr - location of scalar in struct 4545c6c1daeSBarry Smith . mdefault - the initial value 4555c6c1daeSBarry Smith . name - name of the variable 4565c6c1daeSBarry Smith - help - longer string with more information about the value 4575c6c1daeSBarry Smith 4585c6c1daeSBarry Smith Level: beginner 4595c6c1daeSBarry Smith 4605c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 4615c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 4625c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith @*/ 4655c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault,const char *name,const char *help) 4665c6c1daeSBarry Smith { 4675c6c1daeSBarry Smith PetscBagItem item; 4685c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 4695c6c1daeSBarry Smith PetscBool printhelp; 4705c6c1daeSBarry Smith 4715c6c1daeSBarry Smith PetscFunctionBegin; 472*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 473*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 474*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 475*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 4765c6c1daeSBarry Smith nname[0] = '-'; 4775c6c1daeSBarry Smith nname[1] = 0; 478*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 479*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 4805c6c1daeSBarry Smith if (printhelp) { 481*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%g + %gi>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,(double)PetscRealPart(mdefault),(double)PetscImaginaryPart(mdefault),help)); 4825c6c1daeSBarry Smith } 483*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetScalar(NULL,bag->bagprefix,nname,&mdefault,NULL)); 4845c6c1daeSBarry Smith 485*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 4865c6c1daeSBarry Smith item->dtype = PETSC_SCALAR; 4875c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 488*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 48902c9f0b5SLisandro Dalcin item->next = NULL; 4905c6c1daeSBarry Smith item->msize = 1; 4915c6c1daeSBarry Smith *(PetscScalar*)addr = mdefault; 492*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 4935c6c1daeSBarry Smith PetscFunctionReturn(0); 4945c6c1daeSBarry Smith } 4955c6c1daeSBarry Smith 4965c6c1daeSBarry Smith /*@C 4975c6c1daeSBarry Smith PetscBagRegisterBool - add a logical value to the bag 4985c6c1daeSBarry Smith 4995c6c1daeSBarry Smith Logically Collective on PetscBag 5005c6c1daeSBarry Smith 501d8d19677SJose E. Roman Input Parameters: 5025c6c1daeSBarry Smith + bag - the bag of values 5035c6c1daeSBarry Smith . addr - location of logical in struct 5045c6c1daeSBarry Smith . mdefault - the initial value 5055c6c1daeSBarry Smith . name - name of the variable 5065c6c1daeSBarry Smith - help - longer string with more information about the value 5075c6c1daeSBarry Smith 5085c6c1daeSBarry Smith Level: beginner 5095c6c1daeSBarry Smith 5105c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 5115c6c1daeSBarry Smith PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5125c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 5135c6c1daeSBarry Smith 5145c6c1daeSBarry Smith @*/ 5155c6c1daeSBarry Smith PetscErrorCode PetscBagRegisterBool(PetscBag bag,void *addr,PetscBool mdefault,const char *name,const char *help) 5165c6c1daeSBarry Smith { 5175c6c1daeSBarry Smith PetscBagItem item; 5185c6c1daeSBarry Smith char nname[PETSC_BAG_NAME_LENGTH+1]; 5195c6c1daeSBarry Smith PetscBool printhelp; 5205c6c1daeSBarry Smith 5215c6c1daeSBarry Smith PetscFunctionBegin; 522*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 523*5f80ce2aSJacob Faibussowitsch PetscValidPointer(addr,2); 524*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,4); 525*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,5); 5265c6c1daeSBarry Smith /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ 527*5f80ce2aSJacob Faibussowitsch PetscCheck(mdefault == PETSC_FALSE || mdefault == PETSC_TRUE,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Boolean %s %s must be boolean; integer value %d",name,help,(int)mdefault); 5285c6c1daeSBarry Smith nname[0] = '-'; 5295c6c1daeSBarry Smith nname[1] = 0; 530*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(nname,name,PETSC_BAG_NAME_LENGTH)); 531*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasHelp(NULL,&printhelp)); 5325c6c1daeSBarry Smith if (printhelp) { 533*5f80ce2aSJacob Faibussowitsch CHKERRQ((*PetscHelpPrintf)(bag->bagcomm," -%s%s <%s>: %s \n",bag->bagprefix ? bag->bagprefix : "",name,PetscBools[mdefault],help)); 5345c6c1daeSBarry Smith } 535*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,bag->bagprefix,nname,&mdefault,NULL)); 5365c6c1daeSBarry Smith 537*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&item)); 5385c6c1daeSBarry Smith item->dtype = PETSC_BOOL; 5395c6c1daeSBarry Smith item->offset = ((char*)addr) - ((char*)bag); 540*5f80ce2aSJacob Faibussowitsch PetscCheck(item->offset <= bag->bagsize,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Registered item %s %s is not in bag memory space",name,help); 54102c9f0b5SLisandro Dalcin item->next = NULL; 5425c6c1daeSBarry Smith item->msize = 1; 5435c6c1daeSBarry Smith *(PetscBool*)addr = mdefault; 544*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagRegister_Private(bag,item,name,help)); 5455c6c1daeSBarry Smith PetscFunctionReturn(0); 5465c6c1daeSBarry Smith } 5475c6c1daeSBarry Smith 5485c6c1daeSBarry Smith /*@C 5495c6c1daeSBarry Smith PetscBagDestroy - Destroys a bag values 5505c6c1daeSBarry Smith 5515c6c1daeSBarry Smith Collective on PetscBag 5525c6c1daeSBarry Smith 5535c6c1daeSBarry Smith Input Parameter: 5545c6c1daeSBarry Smith . bag - the bag of values 5555c6c1daeSBarry Smith 5565c6c1daeSBarry Smith Level: beginner 5575c6c1daeSBarry Smith 5585c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 5595c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5605c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 5615c6c1daeSBarry Smith 5625c6c1daeSBarry Smith @*/ 5635c6c1daeSBarry Smith PetscErrorCode PetscBagDestroy(PetscBag *bag) 5645c6c1daeSBarry Smith { 565*5f80ce2aSJacob Faibussowitsch PetscBagItem nitem; 5665c6c1daeSBarry Smith 5675c6c1daeSBarry Smith PetscFunctionBegin; 568*5f80ce2aSJacob Faibussowitsch if (!*bag) PetscFunctionReturn(0); 569*5f80ce2aSJacob Faibussowitsch PetscValidPointer(*bag,1); 570*5f80ce2aSJacob Faibussowitsch nitem = (*bag)->bagitems; 5715c6c1daeSBarry Smith while (nitem) { 572*5f80ce2aSJacob Faibussowitsch PetscBagItem item = nitem->next; 573*5f80ce2aSJacob Faibussowitsch 574*5f80ce2aSJacob Faibussowitsch if (nitem->list) CHKERRQ(PetscStrArrayDestroy(&nitem->list)); 575*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(nitem)); 5765c6c1daeSBarry Smith nitem = item; 5775c6c1daeSBarry Smith } 578*5f80ce2aSJacob Faibussowitsch if ((*bag)->bagprefix) CHKERRQ(PetscFree((*bag)->bagprefix)); 579*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(*bag)); 5805c6c1daeSBarry Smith PetscFunctionReturn(0); 5815c6c1daeSBarry Smith } 5825c6c1daeSBarry Smith 5835c6c1daeSBarry Smith /*@ 5845c6c1daeSBarry Smith PetscBagSetFromOptions - Allows setting options from a bag 5855c6c1daeSBarry Smith 5865c6c1daeSBarry Smith Collective on PetscBag 5875c6c1daeSBarry Smith 5885c6c1daeSBarry Smith Input Parameter: 5895c6c1daeSBarry Smith . bag - the bag of values 5905c6c1daeSBarry Smith 5915c6c1daeSBarry Smith Level: beginner 5925c6c1daeSBarry Smith 5935c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 5945c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 5955c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum() 5965c6c1daeSBarry Smith 5975c6c1daeSBarry Smith @*/ 5985c6c1daeSBarry Smith PetscErrorCode PetscBagSetFromOptions(PetscBag bag) 5995c6c1daeSBarry Smith { 6005c6c1daeSBarry Smith PetscErrorCode ierr; 6015c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6025c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3]; 6035c6c1daeSBarry Smith PetscInt n; 6045c6c1daeSBarry Smith 6055c6c1daeSBarry Smith PetscFunctionBegin; 606*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 607*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(helpname,bag->bagname,sizeof(helpname))); 608*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(helpname," ",sizeof(helpname))); 609*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(helpname,bag->baghelp,sizeof(helpname))); 61002c9f0b5SLisandro Dalcin ierr = PetscOptionsBegin(bag->bagcomm,bag->bagprefix,helpname,NULL);CHKERRQ(ierr); 6115c6c1daeSBarry Smith while (nitem) { 6125c6c1daeSBarry Smith name[0] = '-'; 6135c6c1daeSBarry Smith name[1] = 0; 614*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlcat(name,nitem->name,sizeof(name))); 6155c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { /* special handling for fortran required? [due to space padding vs null termination] */ 6165c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 617*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,NULL)); 6185c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 6195c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 6205c6c1daeSBarry Smith if (nitem->msize == 1) { 621*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsReal(name,nitem->help,"",*value,value,NULL)); 6225c6c1daeSBarry Smith } else { 6235c6c1daeSBarry Smith n = nitem->msize; 624*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsRealArray(name,nitem->help,"",value,&n,NULL)); 6255c6c1daeSBarry Smith } 6265c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 6275c6c1daeSBarry Smith PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset); 628*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsScalar(name,nitem->help,"",*value,value,NULL)); 6295c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 6305c6c1daeSBarry Smith PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset); 6315c6c1daeSBarry Smith if (nitem->msize == 1) { 632*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsInt(name,nitem->help,"",*value,value,NULL)); 6335c6c1daeSBarry Smith } else { 6345c6c1daeSBarry Smith n = nitem->msize; 635*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsIntArray(name,nitem->help,"",value,&n,NULL)); 6365c6c1daeSBarry Smith } 6375c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 6385c6c1daeSBarry Smith PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset); 6395c6c1daeSBarry Smith PetscInt i = 0; 6405c6c1daeSBarry Smith while (nitem->list[i++]) ; 641*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsEnum(name,nitem->help,nitem->list[i-3],(const char*const*)nitem->list,*value,value,NULL)); 6425c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 6435c6c1daeSBarry Smith PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 644dd66f111SBlaise Bourdin if (nitem->msize == 1) { 645*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool(name,nitem->help,"",*value,value,NULL)); 646dd66f111SBlaise Bourdin } else { 647dd66f111SBlaise Bourdin n = nitem->msize; 648*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBoolArray(name,nitem->help,"",value,&n,NULL)); 649dd66f111SBlaise Bourdin } 6505c6c1daeSBarry Smith } 6515c6c1daeSBarry Smith nitem = nitem->next; 6525c6c1daeSBarry Smith } 653*5f80ce2aSJacob Faibussowitsch ierr = PetscOptionsEnd();CHKERRQ(ierr); 6545c6c1daeSBarry Smith PetscFunctionReturn(0); 6555c6c1daeSBarry Smith } 6565c6c1daeSBarry Smith 6575c6c1daeSBarry Smith /*@C 6585c6c1daeSBarry Smith PetscBagView - Views a bag of values as either ASCII text or a binary file 6595c6c1daeSBarry Smith 6605c6c1daeSBarry Smith Collective on PetscBag 6615c6c1daeSBarry Smith 662d8d19677SJose E. Roman Input Parameters: 6635c6c1daeSBarry Smith + bag - the bag of values 6645c6c1daeSBarry Smith - viewer - location to view the values 6655c6c1daeSBarry Smith 6665c6c1daeSBarry Smith Level: beginner 6675c6c1daeSBarry Smith 6685c6c1daeSBarry Smith Warning: Currently PETSc bags saved in a binary file can only be read back 6695c6c1daeSBarry Smith in on a machine of the same architecture. Let us know when this is a problem 6705c6c1daeSBarry Smith and we'll fix it. 6715c6c1daeSBarry Smith 6725c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData() 6735c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 6745c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName() 6755c6c1daeSBarry Smith 6765c6c1daeSBarry Smith @*/ 6775c6c1daeSBarry Smith PetscErrorCode PetscBagView(PetscBag bag,PetscViewer view) 6785c6c1daeSBarry Smith { 6795c6c1daeSBarry Smith PetscBool isascii,isbinary; 6805c6c1daeSBarry Smith PetscBagItem nitem = bag->bagitems; 6815c6c1daeSBarry Smith 6825c6c1daeSBarry Smith PetscFunctionBegin; 683*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 684*5f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view,PETSC_VIEWER_CLASSID,2); 685*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERASCII,&isascii)); 686*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary)); 6875c6c1daeSBarry Smith if (isascii) { 6883ffde785SBarry Smith if (bag->bagprefix) { 689*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"PetscBag Object: %s (%s) %s\n",bag->bagname,bag->bagprefix,bag->baghelp)); 6903ffde785SBarry Smith } else { 691*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp)); 6923ffde785SBarry Smith } 6935c6c1daeSBarry Smith while (nitem) { 6945c6c1daeSBarry Smith if (nitem->dtype == PETSC_CHAR) { 6955c6c1daeSBarry Smith char *value = (char*)(((char*)bag) + nitem->offset); 6965c6c1daeSBarry Smith char tmp = value[nitem->msize-1]; /* special handling for fortran chars wihout null terminator */ 6975c6c1daeSBarry Smith value[nitem->msize-1] =0; 698*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help)); 6995c6c1daeSBarry Smith value[nitem->msize-1] = tmp; 7005c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_REAL) { 7015c6c1daeSBarry Smith PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset); 7025c6c1daeSBarry Smith PetscInt i; 703*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = ",nitem->name)); 7045c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 705*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"%g ",(double)value[i])); 7065c6c1daeSBarry Smith } 707*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help)); 7085c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_SCALAR) { 7095c6c1daeSBarry Smith PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset); 7105c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) 7118627564fSBarry Smith if ((double)PetscImaginaryPart(value)) { 712*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = %g + %gi; %s\n",nitem->name,(double)PetscRealPart(value),(double)PetscImaginaryPart(value),nitem->help)); 7138627564fSBarry Smith } else { 714*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)PetscRealPart(value),nitem->help)); 7158627564fSBarry Smith } 7165c6c1daeSBarry Smith #else 717*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = %g; %s\n",nitem->name,(double)value,nitem->help)); 7185c6c1daeSBarry Smith #endif 7195c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_INT) { 7205c6c1daeSBarry Smith PetscInt i,*value = (PetscInt*)(((char*)bag) + nitem->offset); 721*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = ",nitem->name)); 7225c6c1daeSBarry Smith for (i=0; i<nitem->msize; i++) { 723*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"%" PetscInt_FMT " ",value[i])); 7245c6c1daeSBarry Smith } 725*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help)); 7265c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_BOOL) { 727dd66f111SBlaise Bourdin PetscBool *value = (PetscBool*)(((char*)bag) + nitem->offset); 728dd66f111SBlaise Bourdin PetscInt i; 7295c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 730*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = ",nitem->name)); 731dd66f111SBlaise Bourdin for (i=0; i<nitem->msize; i++) { 732dd66f111SBlaise Bourdin if (((int) value[i]) == -1) value[i] = PETSC_TRUE; 7335c6c1daeSBarry Smith /* the checks here with != PETSC_FALSE and PETSC_TRUE is a special case; here we truly demand that the value be 0 or 1 */ 734*5f80ce2aSJacob Faibussowitsch PetscCheck(value[i] == PETSC_FALSE || value[i] == PETSC_TRUE,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Boolean value for %s %s is corrupt; integer value %" PetscInt_FMT,nitem->name,nitem->help,(PetscInt)(value[i])); 735*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s",PetscBools[value[i]])); 736dd66f111SBlaise Bourdin } 737*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view,"; %s\n",nitem->help)); 7385c6c1daeSBarry Smith } else if (nitem->dtype == PETSC_ENUM) { 7395c6c1daeSBarry Smith PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset); 7405c6c1daeSBarry Smith PetscInt i = 0; 7415c6c1daeSBarry Smith while (nitem->list[i++]) ; 742*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help)); 7435c6c1daeSBarry Smith } 7445c6c1daeSBarry Smith nitem = nitem->next; 7455c6c1daeSBarry Smith } 7465c6c1daeSBarry Smith } else if (isbinary) { 7475c6c1daeSBarry Smith PetscInt classid = PETSC_BAG_FILE_CLASSID, dtype; 7485c6c1daeSBarry Smith PetscInt deprecatedbagsize = 0; 749a261c58fSBarry Smith PetscViewerFormat format; 750*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&classid,1,PETSC_INT)); 751*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&deprecatedbagsize,1,PETSC_INT)); 752*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT)); 753*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR)); 754*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR)); 7555c6c1daeSBarry Smith while (nitem) { 756*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT)); 7575c6c1daeSBarry Smith dtype = (PetscInt)nitem->dtype; 758*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT)); 759*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR)); 760*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR)); 761*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT)); 7625c6c1daeSBarry Smith /* some Fortran compilers use -1 as boolean */ 7635c6c1daeSBarry Smith if (dtype == PETSC_BOOL && ((*(int*) (((char*)bag) + nitem->offset) == -1))) *(int*) (((char*)bag) + nitem->offset) = PETSC_TRUE; 7645c6c1daeSBarry Smith 765*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype)); 7665c6c1daeSBarry Smith if (dtype == PETSC_ENUM) { 767*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWriteStringArray(view,(const char* const*)nitem->list)); 7685c6c1daeSBarry Smith } 7695c6c1daeSBarry Smith nitem = nitem->next; 7705c6c1daeSBarry Smith } 771*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerGetFormat(view,&format)); 772a261c58fSBarry Smith if (format == PETSC_VIEWER_BINARY_MATLAB) { 773a261c58fSBarry Smith MPI_Comm comm; 774a261c58fSBarry Smith FILE *info; 775*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetComm((PetscObject)view,&comm)); 776*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryGetInfoPointer(view,&info)); 777*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFPrintf(comm,info,"#--- begin code written by PetscViewerBinary for MATLAB format ---#\n")); 778*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFPrintf(comm,info,"#$$ Set.%s = PetscBinaryRead(fd);\n",bag->bagname)); 779*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFPrintf(comm,info,"#--- end code written by PetscViewerBinary for MATLAB format ---#\n\n")); 780a261c58fSBarry Smith } 781a261c58fSBarry Smith } 7825c6c1daeSBarry Smith PetscFunctionReturn(0); 7835c6c1daeSBarry Smith } 7845c6c1daeSBarry Smith 7855c6c1daeSBarry Smith /*@C 786173f9484SMatthew G. Knepley PetscBagViewFromOptions - Processes command line options to determine if/how a PetscBag is to be viewed. 787173f9484SMatthew G. Knepley 788173f9484SMatthew G. Knepley Collective on PetscBag 789173f9484SMatthew G. Knepley 790173f9484SMatthew G. Knepley Input Parameters: 791173f9484SMatthew G. Knepley + obj - the object 792173f9484SMatthew G. Knepley . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 793173f9484SMatthew G. Knepley - optionname - option to activate viewing 794478db826SMatthew G. Knepley 795173f9484SMatthew G. Knepley Level: intermediate 796478db826SMatthew G. Knepley 797478db826SMatthew G. Knepley .seealso: PetscBagCreate(), PetscBag, PetscViewer 798173f9484SMatthew G. Knepley @*/ 799173f9484SMatthew G. Knepley PetscErrorCode PetscBagViewFromOptions(PetscBag bag, PetscObject bobj, const char optionname[]) 800173f9484SMatthew G. Knepley { 801173f9484SMatthew G. Knepley static PetscBool incall = PETSC_FALSE; 802173f9484SMatthew G. Knepley PetscViewer viewer; 803173f9484SMatthew G. Knepley PetscViewerFormat format; 804173f9484SMatthew G. Knepley const char *prefix, *bprefix = NULL; 805173f9484SMatthew G. Knepley PetscBool flg; 806173f9484SMatthew G. Knepley 807173f9484SMatthew G. Knepley PetscFunctionBegin; 808173f9484SMatthew G. Knepley if (incall) PetscFunctionReturn(0); 809173f9484SMatthew G. Knepley incall = PETSC_TRUE; 810*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 811*5f80ce2aSJacob Faibussowitsch if (bobj) CHKERRQ(PetscObjectGetOptionsPrefix(bobj, &bprefix)); 812173f9484SMatthew G. Knepley prefix = bobj ? bprefix : bag->bagprefix; 813*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetViewer(bag->bagcomm, NULL, prefix, optionname, &viewer, &format, &flg)); 814173f9484SMatthew G. Knepley if (flg) { 815*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerPushFormat(viewer, format)); 816*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBagView(bag, viewer)); 817*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(viewer)); 818*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerPopFormat(viewer)); 819*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 820173f9484SMatthew G. Knepley } 821173f9484SMatthew G. Knepley incall = PETSC_FALSE; 822173f9484SMatthew G. Knepley PetscFunctionReturn(0); 823173f9484SMatthew G. Knepley } 824173f9484SMatthew G. Knepley 825173f9484SMatthew G. Knepley /*@C 8265c6c1daeSBarry Smith PetscBagLoad - Loads a bag of values from a binary file 8275c6c1daeSBarry Smith 8285c6c1daeSBarry Smith Collective on PetscViewer 8295c6c1daeSBarry Smith 830d8d19677SJose E. Roman Input Parameters: 8315c6c1daeSBarry Smith + viewer - file to load values from 8325c6c1daeSBarry Smith - bag - the bag of values 8335c6c1daeSBarry Smith 83495452b02SPatrick Sanan Notes: 83595452b02SPatrick Sanan You must have created and registered all the fields in the bag before loading into it. 8365c6c1daeSBarry Smith 8375c6c1daeSBarry Smith Notes: 8385c6c1daeSBarry Smith Level: beginner 8395c6c1daeSBarry Smith 8405c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData() 8415c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 8425c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum() 8435c6c1daeSBarry Smith 8445c6c1daeSBarry Smith @*/ 8455c6c1daeSBarry Smith PetscErrorCode PetscBagLoad(PetscViewer view,PetscBag bag) 8465c6c1daeSBarry Smith { 8475c6c1daeSBarry Smith PetscBool isbinary; 848*5f80ce2aSJacob Faibussowitsch PetscInt classid,bagcount,dtype,msize,offset,deprecatedbagsize; 8495c6c1daeSBarry Smith char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list; 8505c6c1daeSBarry Smith PetscBagItem nitem; 8515c6c1daeSBarry Smith MPI_Comm comm; 8525c6c1daeSBarry Smith PetscMPIInt flag; 8535c6c1daeSBarry Smith 8545c6c1daeSBarry Smith PetscFunctionBegin; 855*5f80ce2aSJacob Faibussowitsch PetscValidHeaderSpecific(view,PETSC_VIEWER_CLASSID,1); 856*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,2); 857*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetComm((PetscObject)view,&comm)); 858*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_compare(comm,bag->bagcomm,&flag)); 859*5f80ce2aSJacob Faibussowitsch PetscCheck(flag == MPI_CONGRUENT || flag == MPI_IDENT,PETSC_COMM_SELF,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the viewer and bag"); 860*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)view,PETSCVIEWERBINARY,&isbinary)); 861*5f80ce2aSJacob Faibussowitsch PetscCheck(isbinary,PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for this viewer type"); 8625c6c1daeSBarry Smith 863*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&classid,1,NULL,PETSC_INT)); 864*5f80ce2aSJacob Faibussowitsch PetscCheck(classid == PETSC_BAG_FILE_CLASSID,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file"); 865*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&deprecatedbagsize,1,NULL,PETSC_INT)); 866*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&bagcount,1,NULL,PETSC_INT)); 867*5f80ce2aSJacob Faibussowitsch PetscCheck(bagcount == bag->count,comm,PETSC_ERR_ARG_INCOMP,"Bag in file has different number of entries %d then passed in bag %d",(int)bagcount,(int)bag->count); 868*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,bag->bagname,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR)); 869*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR)); 8705c6c1daeSBarry Smith 8715c6c1daeSBarry Smith nitem = bag->bagitems; 872*5f80ce2aSJacob Faibussowitsch for (PetscInt i=0; i<bagcount; i++) { 873*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&offset,1,NULL,PETSC_INT)); 8745c6c1daeSBarry Smith /* ignore the offset in the file */ 875*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&dtype,1,NULL,PETSC_INT)); 876*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,NULL,PETSC_CHAR)); 877*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,NULL,PETSC_CHAR)); 878*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,&msize,1,NULL,PETSC_INT)); 8795c6c1daeSBarry Smith 8805c6c1daeSBarry Smith if (dtype == (PetscInt) PETSC_CHAR) { 881*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_CHAR)); 8825c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_REAL) { 883*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_REAL)); 8845c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_SCALAR) { 885*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_SCALAR)); 8865c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_INT) { 887*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_INT)); 8885c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_BOOL) { 889*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,msize,NULL,PETSC_BOOL)); 8905c6c1daeSBarry Smith } else if (dtype == (PetscInt) PETSC_ENUM) { 891*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(view,((char*)bag)+nitem->offset,1,NULL,PETSC_ENUM)); 892*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryReadStringArray(view,&list)); 8935c6c1daeSBarry Smith /* don't need to save list because it is already registered in the bag */ 894*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(list)); 8955c6c1daeSBarry Smith } 8965c6c1daeSBarry Smith nitem = nitem->next; 8975c6c1daeSBarry Smith } 8985c6c1daeSBarry Smith PetscFunctionReturn(0); 8995c6c1daeSBarry Smith } 9005c6c1daeSBarry Smith 901e8976759SBarry Smith /*@C 9025c6c1daeSBarry Smith PetscBagCreate - Create a bag of values 9035c6c1daeSBarry Smith 904d083f849SBarry Smith Collective 9055c6c1daeSBarry Smith 9065c6c1daeSBarry Smith Level: Intermediate 9075c6c1daeSBarry Smith 9085c6c1daeSBarry Smith Input Parameters: 9095c6c1daeSBarry Smith + comm - communicator to share bag 9105c6c1daeSBarry Smith - bagsize - size of the C structure holding the values 9115c6c1daeSBarry Smith 9125c6c1daeSBarry Smith Output Parameter: 9135c6c1daeSBarry Smith . bag - the bag of values 9145c6c1daeSBarry Smith 9155c6c1daeSBarry Smith Notes: 9165c6c1daeSBarry Smith The size of the A struct must be small enough to fit in a PetscInt; by default 9175c6c1daeSBarry Smith PetscInt is 4 bytes; this means a bag cannot be larger than 2 gigabytes in length. 9185c6c1daeSBarry Smith The warning about casting to a shorter length can be ignored below unless your A struct is too large 9195c6c1daeSBarry Smith 9205c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9215c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9225c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9235c6c1daeSBarry Smith @*/ 9245c6c1daeSBarry Smith PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t bagsize, PetscBag *bag) 9255c6c1daeSBarry Smith { 926*5f80ce2aSJacob Faibussowitsch const size_t totalsize = bagsize+sizeof(struct _n_PetscBag)+sizeof(PetscScalar); 9275c6c1daeSBarry Smith 9285c6c1daeSBarry Smith PetscFunctionBegin; 929*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,3); 930*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL,"Creating Bag with total size %d\n",(int)totalsize)); 931*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscCalloc(totalsize,bag)); 932a297a907SKarl Rupp 933*5f80ce2aSJacob Faibussowitsch (*bag)->bagsize = totalsize; 9345c6c1daeSBarry Smith (*bag)->bagcomm = comm; 9350298fd71SBarry Smith (*bag)->bagprefix = NULL; 9365c6c1daeSBarry Smith (*bag)->structlocation = (void*)(((char*)(*bag)) + sizeof(PetscScalar)*(sizeof(struct _n_PetscBag)/sizeof(PetscScalar)) + sizeof(PetscScalar)); 9375c6c1daeSBarry Smith PetscFunctionReturn(0); 9385c6c1daeSBarry Smith } 9395c6c1daeSBarry Smith 9405c6c1daeSBarry Smith /*@C 9415c6c1daeSBarry Smith PetscBagSetName - Sets the name of a bag of values 9425c6c1daeSBarry Smith 9435c6c1daeSBarry Smith Not Collective 9445c6c1daeSBarry Smith 9455c6c1daeSBarry Smith Level: Intermediate 9465c6c1daeSBarry Smith 9475c6c1daeSBarry Smith Input Parameters: 9485c6c1daeSBarry Smith + bag - the bag of values 9495c6c1daeSBarry Smith . name - the name assigned to the bag 9505c6c1daeSBarry Smith - help - help message for bag 9515c6c1daeSBarry Smith 9525c6c1daeSBarry Smith .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9535c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9545c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9555c6c1daeSBarry Smith @*/ 9565c6c1daeSBarry Smith 9575c6c1daeSBarry Smith PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help) 9585c6c1daeSBarry Smith { 9595c6c1daeSBarry Smith PetscFunctionBegin; 960*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 961*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(name,2); 962*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(help,3); 963*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1)); 964*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1)); 9655c6c1daeSBarry Smith PetscFunctionReturn(0); 9665c6c1daeSBarry Smith } 9675c6c1daeSBarry Smith 9685c6c1daeSBarry Smith /*@C 9695c6c1daeSBarry Smith PetscBagGetName - Gets the name of a bag of values 9705c6c1daeSBarry Smith 9715c6c1daeSBarry Smith Not Collective 9725c6c1daeSBarry Smith 9735c6c1daeSBarry Smith Level: Intermediate 9745c6c1daeSBarry Smith 9755c6c1daeSBarry Smith Input Parameter: 9765c6c1daeSBarry Smith . bag - the bag of values 9775c6c1daeSBarry Smith 9785c6c1daeSBarry Smith Output Parameter: 9795c6c1daeSBarry Smith . name - the name assigned to the bag 9805c6c1daeSBarry Smith 9815c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData() 9825c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 9835c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 9845c6c1daeSBarry Smith @*/ 9855c6c1daeSBarry Smith PetscErrorCode PetscBagGetName(PetscBag bag, char **name) 9865c6c1daeSBarry Smith { 9875c6c1daeSBarry Smith PetscFunctionBegin; 988*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 989*5f80ce2aSJacob Faibussowitsch PetscValidPointer(name,2); 9905c6c1daeSBarry Smith *name = bag->bagname; 9915c6c1daeSBarry Smith PetscFunctionReturn(0); 9925c6c1daeSBarry Smith } 9935c6c1daeSBarry Smith 9945c6c1daeSBarry Smith /*@C 9955c6c1daeSBarry Smith PetscBagGetData - Gives back the user - access to memory that 9965c6c1daeSBarry Smith should be used for storing user-data-structure 9975c6c1daeSBarry Smith 9985c6c1daeSBarry Smith Not Collective 9995c6c1daeSBarry Smith 10005c6c1daeSBarry Smith Level: Intermediate 10015c6c1daeSBarry Smith 10025c6c1daeSBarry Smith Input Parameter: 10035c6c1daeSBarry Smith . bag - the bag of values 10045c6c1daeSBarry Smith 10055c6c1daeSBarry Smith Output Parameter: 10065c6c1daeSBarry Smith . data - pointer to memory that will have user-data-structure 10075c6c1daeSBarry Smith 10085c6c1daeSBarry Smith .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad() 10095c6c1daeSBarry Smith PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 10105c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 10115c6c1daeSBarry Smith @*/ 10125c6c1daeSBarry Smith PetscErrorCode PetscBagGetData(PetscBag bag, void **data) 10135c6c1daeSBarry Smith { 10145c6c1daeSBarry Smith PetscFunctionBegin; 1015*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 1016*5f80ce2aSJacob Faibussowitsch PetscValidPointer(data,2); 10175c6c1daeSBarry Smith *data = bag->structlocation; 10185c6c1daeSBarry Smith PetscFunctionReturn(0); 10195c6c1daeSBarry Smith } 10205c6c1daeSBarry Smith 10215c6c1daeSBarry Smith /*@C 10225c6c1daeSBarry Smith PetscBagSetOptionsPrefix - Sets the prefix used for searching for all 10235c6c1daeSBarry Smith PetscBag items in the options database. 10245c6c1daeSBarry Smith 10255c6c1daeSBarry Smith Logically collective on Bag. 10265c6c1daeSBarry Smith 10275c6c1daeSBarry Smith Level: Intermediate 10285c6c1daeSBarry Smith 10295c6c1daeSBarry Smith Input Parameters: 10305c6c1daeSBarry Smith + bag - the bag of values 10315c6c1daeSBarry Smith - prefix - the prefix to prepend all Bag item names with. 10325c6c1daeSBarry Smith 10335c6c1daeSBarry Smith NOTES: Must be called prior to registering any of the bag items. 10345c6c1daeSBarry Smith 10355c6c1daeSBarry Smith .seealso: PetscBag, PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar() 10365c6c1daeSBarry Smith PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum() 10375c6c1daeSBarry Smith @*/ 10385c6c1daeSBarry Smith 10395c6c1daeSBarry Smith PetscErrorCode PetscBagSetOptionsPrefix(PetscBag bag, const char pre[]) 10405c6c1daeSBarry Smith { 10415c6c1daeSBarry Smith PetscFunctionBegin; 1042*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 1043*5f80ce2aSJacob Faibussowitsch if (pre) { 1044*5f80ce2aSJacob Faibussowitsch PetscValidCharPointer(pre,2); 1045*5f80ce2aSJacob Faibussowitsch PetscCheck(pre[0] != '-',PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Options prefix should not begin with a hyphen"); 1046*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(bag->bagprefix)); 1047*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(pre,&(bag->bagprefix))); 1048*5f80ce2aSJacob Faibussowitsch } else CHKERRQ(PetscFree(bag->bagprefix)); 10495c6c1daeSBarry Smith PetscFunctionReturn(0); 10505c6c1daeSBarry Smith } 1051ffb7e86cSMatthew G. Knepley 1052ffb7e86cSMatthew G. Knepley /*@C 1053ffb7e86cSMatthew G. Knepley PetscBagGetNames - Get the names of all entries in the bag 1054ffb7e86cSMatthew G. Knepley 1055ffb7e86cSMatthew G. Knepley Not collective 1056ffb7e86cSMatthew G. Knepley 1057ffb7e86cSMatthew G. Knepley Input Parameters: 1058ffb7e86cSMatthew G. Knepley + bag - the bag of values 1059ffb7e86cSMatthew G. Knepley - names - array of the correct size to hold names 1060ffb7e86cSMatthew G. Knepley 1061ffb7e86cSMatthew G. Knepley Output Parameter: 1062ffb7e86cSMatthew G. Knepley . names - array of char pointers for names 1063ffb7e86cSMatthew G. Knepley 1064ffb7e86cSMatthew G. Knepley Level: intermediate 1065ffb7e86cSMatthew G. Knepley 1066ffb7e86cSMatthew G. Knepley .seealso: PetscBag, PetscBagGetName(), PetscBagSetName(), PetscBagCreate(), PetscBagGetData() 1067ffb7e86cSMatthew G. Knepley PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterBool(), PetscBagRegisterScalar(), PetscBagRegisterEnum() 1068ffb7e86cSMatthew G. Knepley @*/ 1069ffb7e86cSMatthew G. Knepley PetscErrorCode PetscBagGetNames(PetscBag bag, const char *names[]) 1070ffb7e86cSMatthew G. Knepley { 1071ffb7e86cSMatthew G. Knepley PetscBagItem nitem = bag->bagitems; 1072ffb7e86cSMatthew G. Knepley 1073ffb7e86cSMatthew G. Knepley PetscFunctionBegin; 1074*5f80ce2aSJacob Faibussowitsch PetscValidPointer(bag,1); 1075*5f80ce2aSJacob Faibussowitsch PetscValidPointer(names,2); 1076*5f80ce2aSJacob Faibussowitsch for (PetscInt n = 0; nitem; ++n, nitem = nitem->next) names[n] = nitem->name; 1077ffb7e86cSMatthew G. Knepley PetscFunctionReturn(0); 1078ffb7e86cSMatthew G. Knepley } 1079