xref: /petsc/src/sys/classes/bag/bag.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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