/hpc_kernel_samples/sparse_linear_algebra/casestudies/pagerank-petsc/petsc-2.3.2-p10/src/sys/bag/bag.c

https://gitlab.com/steinret/CodeVault · C · 736 lines · 427 code · 41 blank · 268 comment · 90 complexity · 59e62060d38c5fa7a6e3b9694bb49f29 MD5 · raw file

  1. #define PETSC_DLL
  2. #include "petsc.h" /*I "petsc.h" I*/
  3. #include "petscsys.h"
  4. #include "bagimpl.h" /*I "petscbag.h" I*/
  5. /*
  6. Ugly variable to indicate if we are inside a PetscBagLoad() and should not call PetscOptions....
  7. */
  8. static PetscTruth PetscBagInLoad = PETSC_FALSE;
  9. #undef __FUNCT__
  10. #define __FUNCT__ "PetscBagRegister_Private"
  11. /*
  12. Adds item to the linked list in a bag
  13. */
  14. static PetscErrorCode PetscBagRegister_Private(PetscBag bag,PetscBagItem item,const char*name,const char*help)
  15. {
  16. PetscErrorCode ierr;
  17. PetscFunctionBegin;
  18. item->freelist = PETSC_FALSE;
  19. ierr = PetscStrncpy(item->name,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  20. ierr = PetscStrncpy(item->help,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
  21. if (!bag->bagitems) bag->bagitems = item;
  22. else {
  23. PetscBagItem nitem = bag->bagitems;
  24. while (nitem->next) {
  25. nitem = nitem->next;
  26. }
  27. nitem->next = item;
  28. }
  29. bag->count++;
  30. PetscFunctionReturn(0);
  31. }
  32. #undef __FUNCT__
  33. #define __FUNCT__ "PetscBagRegisterEnum"
  34. /*@C
  35. PetscBagRegisterEnum - add an enum value to the bag
  36. Collective on PetscBag
  37. Input Parameter:
  38. + bag - the bag of values
  39. . addr - location of enum in struct
  40. . mdefault - the initial value
  41. . list - array of strings containing names of enum values followed by enum name followed by enum prefix
  42. - help - longer string with more information about the value
  43. Level: beginner
  44. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  45. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  46. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
  47. @*/
  48. PetscErrorCode PetscBagRegisterEnum(PetscBag bag,void *addr,const char **list,PetscEnum mdefault, const char *name, const char* help)
  49. {
  50. PetscErrorCode ierr;
  51. PetscBagItem item;
  52. char nname[PETSC_BAG_NAME_LENGTH+1];
  53. PetscTruth printhelp;
  54. PetscInt i = 0;
  55. PetscFunctionBegin;
  56. if (!PetscBagInLoad) {
  57. nname[0] = '-';
  58. nname[1] = 0;
  59. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  60. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  61. if (printhelp) {
  62. while (list[i++]);
  63. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%s>: (%s) %s (choose one of) ",nname,list[mdefault],list[i-3],help);CHKERRQ(ierr);
  64. for (i=0; list[i+2]; i++){
  65. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s",list[i]);CHKERRQ(ierr);
  66. }
  67. ierr = (*PetscHelpPrintf)(bag->bagcomm,"\n");CHKERRQ(ierr);
  68. }
  69. ierr = PetscOptionsGetEnum(PETSC_NULL,nname,list,&mdefault,PETSC_NULL);CHKERRQ(ierr);
  70. }
  71. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  72. item->dtype = PETSC_ENUM;
  73. item->offset = ((char*)addr) - ((char*)bag);
  74. item->next = 0;
  75. item->msize = 1;
  76. item->list = list;
  77. *(PetscEnum*)addr = mdefault;
  78. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  79. PetscFunctionReturn(0);
  80. }
  81. #undef __FUNCT__
  82. #define __FUNCT__ "PetscBagRegisterInt"
  83. /*@C
  84. PetscBagRegisterInt - add an integer value to the bag
  85. Collective on PetscBag
  86. Input Parameter:
  87. + bag - the bag of values
  88. . addr - location of integer in struct
  89. . mdefault - the initial value
  90. . name - name of the integer
  91. - help - longer string with more information about the value
  92. Level: beginner
  93. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  94. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  95. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  96. @*/
  97. PetscErrorCode PetscBagRegisterInt(PetscBag bag,void *addr,PetscInt mdefault, const char* name, const char* help)
  98. {
  99. PetscErrorCode ierr;
  100. PetscBagItem item;
  101. char nname[PETSC_BAG_NAME_LENGTH+1];
  102. PetscTruth printhelp;
  103. PetscFunctionBegin;
  104. if (!PetscBagInLoad) {
  105. nname[0] = '-';
  106. nname[1] = 0;
  107. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  108. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  109. if (printhelp) {
  110. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%d>: %s \n",nname,mdefault,help);CHKERRQ(ierr);
  111. }
  112. ierr = PetscOptionsGetInt(PETSC_NULL,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
  113. }
  114. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  115. item->dtype = PETSC_INT;
  116. item->offset = ((char*)addr) - ((char*)bag);
  117. item->next = 0;
  118. item->msize = 1;
  119. *(PetscInt*)addr = mdefault;
  120. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  121. PetscFunctionReturn(0);
  122. }
  123. #undef __FUNCT__
  124. #define __FUNCT__ "PetscBagRegisterString"
  125. /*@C
  126. PetscBagRegisterString - add a string value to the bag
  127. Collective on PetscBag
  128. Input Parameter:
  129. + bag - the bag of values
  130. . addr - location of start of string in struct
  131. . msize - length of the string space in the struct
  132. . mdefault - the initial value
  133. . name - name of the string
  134. - help - longer string with more information about the value
  135. Level: beginner
  136. Note: The struct should have the field char mystring[msize]; not char *mystring
  137. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  138. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  139. PetscBagSetFromOptions(),PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  140. @*/
  141. PetscErrorCode PetscBagRegisterString(PetscBag bag,void *addr,PetscInt msize,const char* mdefault, const char* name, const char* help)
  142. {
  143. PetscErrorCode ierr;
  144. PetscBagItem item;
  145. char nname[PETSC_BAG_NAME_LENGTH+1];
  146. PetscTruth printhelp;
  147. PetscFunctionBegin;
  148. if (!PetscBagInLoad) {
  149. nname[0] = '-';
  150. nname[1] = 0;
  151. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  152. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  153. if (printhelp) {
  154. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%s>: %s \n",nname,mdefault,help);CHKERRQ(ierr);
  155. }
  156. }
  157. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  158. item->dtype = PETSC_CHAR;
  159. item->offset = ((char*)addr) - ((char*)bag);
  160. item->next = 0;
  161. item->msize = msize;
  162. if (mdefault != (char*)addr) {
  163. ierr = PetscStrncpy((char*)addr,mdefault,msize-1);CHKERRQ(ierr);
  164. }
  165. if (!PetscBagInLoad) {
  166. ierr = PetscOptionsGetString(PETSC_NULL,nname,(char*)addr,msize,PETSC_NULL);CHKERRQ(ierr);
  167. }
  168. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  169. PetscFunctionReturn(0);
  170. }
  171. #undef __FUNCT__
  172. #define __FUNCT__ "PetscBagRegisterReal"
  173. /*@C
  174. PetscBagRegisterReal - add a real value to the bag
  175. Collective on PetscBag
  176. Input Parameter:
  177. + bag - the bag of values
  178. . addr - location of double in struct
  179. . mdefault - the initial value
  180. . name - name of the variable
  181. - help - longer string with more information about the value
  182. Level: beginner
  183. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  184. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  185. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  186. @*/
  187. PetscErrorCode PetscBagRegisterReal(PetscBag bag,void *addr,PetscReal mdefault, const char* name, const char* help)
  188. {
  189. PetscErrorCode ierr;
  190. PetscBagItem item;
  191. char nname[PETSC_BAG_NAME_LENGTH+1];
  192. PetscTruth printhelp;
  193. PetscFunctionBegin;
  194. if (!PetscBagInLoad) {
  195. nname[0] = '-';
  196. nname[1] = 0;
  197. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  198. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  199. if (printhelp) {
  200. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%G>: %s \n",nname,mdefault,help);CHKERRQ(ierr);
  201. }
  202. ierr = PetscOptionsGetReal(PETSC_NULL,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
  203. }
  204. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  205. item->dtype = PETSC_REAL;
  206. item->offset = ((char*)addr) - ((char*)bag);
  207. item->next = 0;
  208. item->msize = 1;
  209. *(PetscReal*)addr = mdefault;
  210. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  211. PetscFunctionReturn(0);
  212. }
  213. #undef __FUNCT__
  214. #define __FUNCT__ "PetscBagRegisterScalar"
  215. /*@C
  216. PetscBagRegisterScalar - add a real value to the bag
  217. Collective on PetscBag
  218. Input Parameter:
  219. + bag - the bag of values
  220. . addr - location of scalar in struct
  221. . mdefault - the initial value
  222. . name - name of the variable
  223. - help - longer string with more information about the value
  224. Level: beginner
  225. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  226. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  227. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  228. @*/
  229. PetscErrorCode PetscBagRegisterScalar(PetscBag bag,void *addr,PetscScalar mdefault, const char* name, const char* help)
  230. {
  231. PetscErrorCode ierr;
  232. PetscBagItem item;
  233. char nname[PETSC_BAG_NAME_LENGTH+1];
  234. PetscTruth printhelp;
  235. PetscFunctionBegin;
  236. if (!PetscBagInLoad) {
  237. nname[0] = '-';
  238. nname[1] = 0;
  239. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  240. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  241. if (printhelp) {
  242. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%G + %Gi>: %s \n",nname,PetscRealPart(mdefault),PetscImaginaryPart(mdefault),help);CHKERRQ(ierr);
  243. }
  244. ierr = PetscOptionsGetScalar(PETSC_NULL,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
  245. }
  246. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  247. item->dtype = PETSC_SCALAR;
  248. item->offset = ((char*)addr) - ((char*)bag);
  249. item->next = 0;
  250. item->msize = 1;
  251. *(PetscScalar*)addr = mdefault;
  252. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  253. PetscFunctionReturn(0);
  254. }
  255. #undef __FUNCT__
  256. #define __FUNCT__ "PetscBagRegisterTruth"
  257. /*@C
  258. PetscBagRegisterTruth - add a logical value to the bag
  259. Collective on PetscBag
  260. Input Parameter:
  261. + bag - the bag of values
  262. . addr - location of logical in struct
  263. . mdefault - the initial value
  264. . name - name of the variable
  265. - help - longer string with more information about the value
  266. Level: beginner
  267. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  268. PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  269. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  270. @*/
  271. PetscErrorCode PetscBagRegisterTruth(PetscBag bag,void *addr,PetscTruth mdefault, const char* name, const char* help)
  272. {
  273. PetscErrorCode ierr;
  274. PetscBagItem item;
  275. char nname[PETSC_BAG_NAME_LENGTH+1];
  276. PetscTruth printhelp;
  277. PetscFunctionBegin;
  278. if (!PetscBagInLoad) {
  279. nname[0] = '-';
  280. nname[1] = 0;
  281. ierr = PetscStrncat(nname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  282. ierr = PetscOptionsHasName(PETSC_NULL,"-help",&printhelp);CHKERRQ(ierr);
  283. if (printhelp) {
  284. ierr = (*PetscHelpPrintf)(bag->bagcomm," %s <%s>: %s \n",nname,PetscTruths[mdefault],help);CHKERRQ(ierr);
  285. }
  286. ierr = PetscOptionsGetTruth(PETSC_NULL,nname,&mdefault,PETSC_NULL);CHKERRQ(ierr);
  287. }
  288. ierr = PetscNew(struct _n_PetscBagItem,&item);CHKERRQ(ierr);
  289. item->dtype = PETSC_TRUTH;
  290. item->offset = ((char*)addr) - ((char*)bag);
  291. item->next = 0;
  292. item->msize = 1;
  293. *(PetscTruth*)addr = mdefault;
  294. ierr = PetscBagRegister_Private(bag,item,name,help);CHKERRQ(ierr);
  295. PetscFunctionReturn(0);
  296. }
  297. #undef __FUNCT__
  298. #define __FUNCT__ "PetscBagDestroy"
  299. /*@C
  300. PetscBagDestroy - Destroys a bag values
  301. Collective on PetscBag
  302. Input Parameter:
  303. . bag - the bag of values
  304. Level: beginner
  305. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  306. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  307. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  308. @*/
  309. PetscErrorCode PETSC_DLLEXPORT PetscBagDestroy(PetscBag bag)
  310. {
  311. PetscErrorCode ierr;
  312. PetscBagItem nitem = bag->bagitems,item;
  313. PetscFunctionBegin;
  314. while (nitem) {
  315. item = nitem->next;
  316. if (nitem->freelist) {
  317. void *v = (void*)nitem->list;
  318. ierr = PetscFree(v);CHKERRQ(ierr);
  319. }
  320. ierr = PetscFree(nitem);CHKERRQ(ierr);
  321. nitem = item;
  322. }
  323. ierr = PetscFree(bag);CHKERRQ(ierr);
  324. PetscFunctionReturn(0);
  325. }
  326. #undef __FUNCT__
  327. #define __FUNCT__ "PetscBagSetFromOptions"
  328. /*@C
  329. PetscBagSetFromOptions - Allows setting options from a bag
  330. Collective on PetscBag
  331. Input Parameter:
  332. . bag - the bag of values
  333. Level: beginner
  334. .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
  335. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  336. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagView(), PetscBagRegisterEnum()
  337. @*/
  338. PetscErrorCode PETSC_DLLEXPORT PetscBagSetFromOptions(PetscBag bag)
  339. {
  340. PetscErrorCode ierr;
  341. PetscBagItem nitem = bag->bagitems;
  342. char name[PETSC_BAG_NAME_LENGTH+1],helpname[PETSC_BAG_NAME_LENGTH+PETSC_BAG_HELP_LENGTH+3];
  343. PetscFunctionBegin;
  344. ierr = PetscStrcpy(helpname,bag->bagname);CHKERRQ(ierr);
  345. ierr = PetscStrcat(helpname," ");CHKERRQ(ierr);
  346. ierr = PetscStrcat(helpname,bag->baghelp);CHKERRQ(ierr);
  347. ierr = PetscOptionsBegin(bag->bagcomm,PETSC_NULL,helpname,0);
  348. while (nitem) {
  349. name[0] = '-';
  350. name[1] = 0;
  351. ierr = PetscStrcat(name,nitem->name);CHKERRQ(ierr);
  352. if (nitem->dtype == PETSC_CHAR) {
  353. char *value = (char*)(((char*)bag) + nitem->offset);
  354. ierr = PetscOptionsString(name,nitem->help,"",value,value,nitem->msize,PETSC_NULL);CHKERRQ(ierr);
  355. } else if (nitem->dtype == PETSC_REAL) {
  356. PetscReal *value = (PetscReal*)(((char*)bag) + nitem->offset);
  357. ierr = PetscOptionsReal(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
  358. } else if (nitem->dtype == PETSC_SCALAR) {
  359. PetscScalar *value = (PetscScalar*)(((char*)bag) + nitem->offset);
  360. ierr = PetscOptionsScalar(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
  361. } else if (nitem->dtype == PETSC_INT) {
  362. PetscInt *value = (PetscInt*)(((char*)bag) + nitem->offset);
  363. ierr = PetscOptionsInt(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
  364. } else if (nitem->dtype == PETSC_ENUM) {
  365. PetscEnum *value = (PetscEnum*)(((char*)bag) + nitem->offset);
  366. PetscInt i = 0;
  367. while (nitem->list[i++]);
  368. ierr = PetscOptionsEnum(name,nitem->help,nitem->list[i-3],nitem->list,*value,value,PETSC_NULL);CHKERRQ(ierr);
  369. } else if (nitem->dtype == PETSC_TRUTH) {
  370. PetscTruth *value = (PetscTruth*)(((char*)bag) + nitem->offset);
  371. ierr = PetscOptionsTruth(name,nitem->help,"",*value,value,PETSC_NULL);CHKERRQ(ierr);
  372. }
  373. nitem = nitem->next;
  374. }
  375. PetscOptionsEnd();
  376. PetscFunctionReturn(0);
  377. }
  378. #undef __FUNCT__
  379. #define __FUNCT__ "PetscBagView"
  380. /*@C
  381. PetscBagView - Views a bag of values as either ASCII text or a binary file
  382. Collective on PetscBag
  383. Input Parameter:
  384. + bag - the bag of values
  385. - viewer - location to view the values
  386. Level: beginner
  387. Warning: Currently PETSc bags saved in a binary file can only be read back
  388. in on a machine of the same architecture. Let us know when this is a problem
  389. and we'll fix it.
  390. .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagLoad(), PetscBagGetData()
  391. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar(), PetscBagRegisterEnum()
  392. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName()
  393. @*/
  394. PetscErrorCode PETSC_DLLEXPORT PetscBagView(PetscBag bag,PetscViewer view)
  395. {
  396. PetscTruth isascii,isbinary;
  397. PetscErrorCode ierr;
  398. PetscBagItem nitem = bag->bagitems;
  399. PetscFunctionBegin;
  400. ierr = PetscTypeCompare((PetscObject)view,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
  401. ierr = PetscTypeCompare((PetscObject)view,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
  402. if (isascii) {
  403. ierr = PetscViewerASCIIPrintf(view,"PetscBag Object: %s %s\n",bag->bagname,bag->baghelp);CHKERRQ(ierr);
  404. while (nitem) {
  405. if (nitem->dtype == PETSC_CHAR) {
  406. char* value = (char*)(((char*)bag) + nitem->offset);
  407. ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
  408. } else if (nitem->dtype == PETSC_REAL) {
  409. PetscReal value = *(PetscReal*)(((char*)bag) + nitem->offset);
  410. ierr = PetscViewerASCIIPrintf(view," %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
  411. } else if (nitem->dtype == PETSC_SCALAR) {
  412. PetscScalar value = *(PetscScalar*)(((char*)bag) + nitem->offset);
  413. #if defined(PETSC_USE_COMPLEX)
  414. ierr = PetscViewerASCIIPrintf(view," %s = %G + %Gi; %s\n",nitem->name,PetscRealPart(value),PetscImaginaryPart(value),nitem->help);CHKERRQ(ierr);
  415. #else
  416. ierr = PetscViewerASCIIPrintf(view," %s = %G; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
  417. #endif
  418. } else if (nitem->dtype == PETSC_INT) {
  419. PetscInt value = *(PetscInt*)(((char*)bag) + nitem->offset);
  420. ierr = PetscViewerASCIIPrintf(view," %s = %D; %s\n",nitem->name,value,nitem->help);CHKERRQ(ierr);
  421. } else if (nitem->dtype == PETSC_TRUTH) {
  422. PetscTruth value = *(PetscTruth*)(((char*)bag) + nitem->offset);
  423. ierr = PetscViewerASCIIPrintf(view," %s = %s; %s\n",nitem->name,PetscTruths[value],nitem->help);CHKERRQ(ierr);
  424. } else if (nitem->dtype == PETSC_ENUM) {
  425. PetscEnum value = *(PetscEnum*)(((char*)bag) + nitem->offset);
  426. PetscInt i = 0;
  427. while (nitem->list[i++]);
  428. ierr = PetscViewerASCIIPrintf(view," %s = %s; (%s) %s\n",nitem->name,nitem->list[value],nitem->list[i-3],nitem->help);CHKERRQ(ierr);
  429. }
  430. nitem = nitem->next;
  431. }
  432. } else if (isbinary) {
  433. PetscInt cookie = PETSC_BAG_FILE_COOKIE, bagsize = (PetscInt) bag->bagsize, dtype;
  434. ierr = PetscViewerBinaryWrite(view,&cookie,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
  435. ierr = PetscViewerBinaryWrite(view,&bagsize,1,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
  436. ierr = PetscViewerBinaryWrite(view,&bag->count,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
  437. ierr = PetscViewerBinaryWrite(view,bag->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
  438. ierr = PetscViewerBinaryWrite(view,bag->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
  439. while (nitem) {
  440. ierr = PetscViewerBinaryWrite(view,&nitem->offset,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
  441. dtype = (PetscInt)nitem->dtype;
  442. ierr = PetscViewerBinaryWrite(view,&dtype,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
  443. ierr = PetscViewerBinaryWrite(view,nitem->name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
  444. ierr = PetscViewerBinaryWrite(view,nitem->help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR,PETSC_FALSE);CHKERRQ(ierr);
  445. ierr = PetscViewerBinaryWrite(view,&nitem->msize,1,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
  446. ierr = PetscViewerBinaryWrite(view,(((char*)bag) + nitem->offset),nitem->msize,nitem->dtype,PETSC_FALSE);CHKERRQ(ierr);
  447. if (dtype == PETSC_ENUM) {
  448. ierr = PetscViewerBinaryWriteStringArray(view,(char **)nitem->list);CHKERRQ(ierr);
  449. }
  450. nitem = nitem->next;
  451. }
  452. } else {
  453. SETERRQ(PETSC_ERR_SUP,"No support for this viewer type");
  454. }
  455. PetscFunctionReturn(0);
  456. }
  457. #undef __FUNCT__
  458. #define __FUNCT__ "PetscBagLoad"
  459. /*@C
  460. PetscBagLoad - Loads a bag of values from a binary file
  461. Collective on PetscViewer
  462. Input Parameter:
  463. . viewer - file to load values from
  464. Output Parameter:
  465. . bag - the bag of values
  466. Level: beginner
  467. .seealso: PetscBag, PetscBagSetName(), PetscBagDestroy(), PetscBagView(), PetscBagGetData()
  468. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  469. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagGetName(), PetscBagRegisterEnum()
  470. @*/
  471. PetscErrorCode PETSC_DLLEXPORT PetscBagLoad(PetscViewer view,PetscBag *bag)
  472. {
  473. PetscErrorCode ierr;
  474. PetscTruth isbinary,skipoptions;
  475. PetscInt cookie,bagsizecount[2],i,offsetdtype[2],msize;
  476. char name[PETSC_BAG_NAME_LENGTH],help[PETSC_BAG_HELP_LENGTH],**list;
  477. PetscBagItem nitem;
  478. PetscFunctionBegin;
  479. ierr = PetscTypeCompare((PetscObject)view,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
  480. if (!isbinary) SETERRQ(PETSC_ERR_SUP,"No support for this viewer type");
  481. ierr = PetscViewerBinaryRead(view,&cookie,1,PETSC_INT);CHKERRQ(ierr);
  482. if (cookie != PETSC_BAG_FILE_COOKIE) SETERRQ(PETSC_ERR_ARG_WRONG,"Not PetscBag next in binary file");
  483. ierr = PetscViewerBinaryRead(view,bagsizecount,2,PETSC_INT);CHKERRQ(ierr);
  484. ierr = PetscMalloc(bagsizecount[0],bag);CHKERRQ(ierr);
  485. ierr = PetscMemzero(*bag,bagsizecount[0]);CHKERRQ(ierr);
  486. (*bag)->bagsize = bagsizecount[0];
  487. ierr = PetscViewerBinaryRead(view,(*bag)->bagname,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
  488. ierr = PetscViewerBinaryRead(view,(*bag)->baghelp,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
  489. ierr = PetscViewerBinaryGetSkipOptions(view,&skipoptions);CHKERRQ(ierr);
  490. if (skipoptions) PetscBagInLoad = PETSC_TRUE;
  491. for (i=0; i<bagsizecount[1]; i++) {
  492. ierr = PetscViewerBinaryRead(view,offsetdtype,2,PETSC_INT);CHKERRQ(ierr);
  493. ierr = PetscViewerBinaryRead(view,name,PETSC_BAG_NAME_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
  494. ierr = PetscViewerBinaryRead(view,help,PETSC_BAG_HELP_LENGTH,PETSC_CHAR);CHKERRQ(ierr);
  495. ierr = PetscViewerBinaryRead(view,&msize,1,PETSC_INT);CHKERRQ(ierr);
  496. if (offsetdtype[1] == (PetscInt) PETSC_CHAR) {
  497. ierr = PetscViewerBinaryRead(view,((char*)(*bag))+offsetdtype[0],msize,PETSC_CHAR);CHKERRQ(ierr);
  498. ierr = PetscBagRegisterString(*bag,((char*)(*bag))+offsetdtype[0],msize,((char*)(*bag))+offsetdtype[0],name,help);CHKERRQ(ierr);
  499. } else if (offsetdtype[1] == (PetscInt) PETSC_REAL) {
  500. PetscReal mdefault;
  501. ierr = PetscViewerBinaryRead(view,&mdefault,1,PETSC_REAL);CHKERRQ(ierr);
  502. ierr = PetscBagRegisterReal(*bag,((char*)(*bag))+offsetdtype[0],mdefault,name,help);CHKERRQ(ierr);
  503. } else if (offsetdtype[1] == (PetscInt) PETSC_SCALAR) {
  504. PetscScalar mdefault;
  505. ierr = PetscViewerBinaryRead(view,&mdefault,1,PETSC_SCALAR);CHKERRQ(ierr);
  506. ierr = PetscBagRegisterScalar(*bag,((char*)(*bag))+offsetdtype[0],mdefault,name,help);CHKERRQ(ierr);
  507. } else if (offsetdtype[1] == (PetscInt) PETSC_INT) {
  508. PetscInt mdefault;
  509. ierr = PetscViewerBinaryRead(view,&mdefault,1,PETSC_INT);CHKERRQ(ierr);
  510. ierr = PetscBagRegisterInt(*bag,((char*)(*bag))+offsetdtype[0],mdefault,name,help);CHKERRQ(ierr);
  511. } else if (offsetdtype[1] == (PetscInt) PETSC_TRUTH) {
  512. PetscTruth mdefault;
  513. ierr = PetscViewerBinaryRead(view,&mdefault,1,PETSC_TRUTH);CHKERRQ(ierr);
  514. ierr = PetscBagRegisterTruth(*bag,((char*)(*bag))+offsetdtype[0],mdefault,name,help);CHKERRQ(ierr);
  515. } else if (offsetdtype[1] == (PetscInt) PETSC_ENUM) {
  516. PetscEnum mdefault;
  517. ierr = PetscViewerBinaryRead(view,&mdefault,1,PETSC_ENUM);CHKERRQ(ierr);
  518. ierr = PetscViewerBinaryReadStringArray(view,&list);CHKERRQ(ierr);
  519. ierr = PetscBagRegisterEnum(*bag,((char*)(*bag))+offsetdtype[0],(const char**)list,mdefault,name,help);CHKERRQ(ierr);
  520. /* we malloced list in PetscViewerBinaryReadStringArray() so must free ourselves */
  521. nitem = (*bag)->bagitems;
  522. while (nitem->next) nitem = nitem->next;
  523. nitem->freelist = PETSC_TRUE;
  524. }
  525. }
  526. PetscBagInLoad = PETSC_FALSE;
  527. PetscFunctionReturn(0);
  528. }
  529. #undef __FUNCT__
  530. #define __FUNCT__ "PetscBagCreate"
  531. /*@C
  532. PetscBagCreate - Create a bag of values
  533. Collective on MPI_Comm
  534. Level: Intermediate
  535. Input Parameters:
  536. + comm - communicator to share bag
  537. - C struct name - name of the C structure holding the values
  538. Output Parameter:
  539. . bag - the bag of values
  540. Notes:
  541. The size of the A struct must be small enough to fit in a PetscInt; by default
  542. PetscInt is 4 bytes. The warning about casting to a shorter length can be ignored
  543. below unless your A struct is too large
  544. .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  545. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  546. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
  547. @*/
  548. PetscErrorCode PetscBagCreate(MPI_Comm comm, size_t size, PetscBag *bag)
  549. {
  550. PetscErrorCode ierr;
  551. size_t tsize;
  552. PetscFunctionBegin;
  553. tsize = sizeof(struct _n_PetscBag)+size;
  554. ierr = PetscMalloc(tsize,bag);CHKERRQ(ierr);
  555. ierr = PetscMemzero(*bag,tsize);CHKERRQ(ierr);
  556. (*bag)->bagsize = tsize;
  557. (*bag)->bagcomm = comm;
  558. PetscFunctionReturn(0);
  559. }
  560. #undef __FUNCT__
  561. #define __FUNCT__ "PetscBagSetName"
  562. /*@C
  563. PetscBagSetName - Sets the name of a bag of values
  564. Not Collective
  565. Level: Intermediate
  566. Input Parameters:
  567. + bag - the bag of values
  568. . name - the name assigned to the bag
  569. - help - help message for bag
  570. .seealso: PetscBag, PetscBagGetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  571. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  572. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
  573. @*/
  574. PetscErrorCode PetscBagSetName(PetscBag bag, const char *name, const char *help)
  575. {
  576. PetscErrorCode ierr;
  577. PetscFunctionBegin;
  578. ierr = PetscStrncpy(bag->bagname,name,PETSC_BAG_NAME_LENGTH-1);CHKERRQ(ierr);
  579. ierr = PetscStrncpy(bag->baghelp,help,PETSC_BAG_HELP_LENGTH-1);CHKERRQ(ierr);
  580. PetscFunctionReturn(0);
  581. }
  582. #undef __FUNCT__
  583. #define __FUNCT__ "PetscBagGetName"
  584. /*@C
  585. PetscBagGetName - Gets the name of a bag of values
  586. Not Collective
  587. Level: Intermediate
  588. Input Parameter:
  589. . bag - the bag of values
  590. Output Parameter:
  591. . name - the name assigned to the bag
  592. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad(), PetscBagGetData()
  593. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  594. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
  595. @*/
  596. PetscErrorCode PetscBagGetName(PetscBag bag, char **name)
  597. {
  598. PetscFunctionBegin;
  599. *name = bag->bagname;
  600. PetscFunctionReturn(0);
  601. }
  602. /*@C
  603. PetscBagGetData - Gives back the user - access to memory that
  604. should be used for storing user-data-structure
  605. Not Collective
  606. Level: Intermediate
  607. Input Parameter:
  608. . bag - the bag of values
  609. Output Parameter:
  610. . data - pointer to memory that will have user-data-structure
  611. .seealso: PetscBag, PetscBagSetName(), PetscBagView(), PetscBagLoad()
  612. PetscBagRegisterReal(), PetscBagRegisterInt(), PetscBagRegisterTruth(), PetscBagRegisterScalar()
  613. PetscBagSetFromOptions(), PetscBagCreate(), PetscBagDestroy(), PetscBagRegisterEnum()
  614. @*/
  615. PetscErrorCode PetscBagGetData(PetscBag bag, void **data)
  616. {
  617. PetscFunctionBegin;
  618. *data = (char*)bag + sizeof(struct _n_PetscBag);
  619. PetscFunctionReturn(0);
  620. }