xref: /petsc/src/sys/ams/pams.c (revision c890eb3d8db7584739082f37fd7362a6cfe6be76)
1 
2 #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3 #include <petscviewer.h>
4 
5 /*
6      If true then every PETSc object will be published with the AMS
7 */
8 PetscBool PetscAMSPublishAll;
9 
10 #undef __FUNCT__
11 #define __FUNCT__ "PetscObjectAMSPublish"
12 /*@C
13    PetscObjectAMSPublish - Publish an object
14 
15    Collective on PetscObject
16 
17    Input Parameters:
18 .  obj - the Petsc variable
19          Thus must be cast with a (PetscObject), for example,
20          PetscObjectSetName((PetscObject)mat,name);
21 
22    Notes: PetscViewer objects are not published
23 
24    Level: advanced
25 
26    Concepts: publishing object
27 
28 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish()
29 
30 @*/
31 PetscErrorCode  PetscObjectAMSPublish(PetscObject obj)
32 {
33   PetscErrorCode ierr;
34   AMS_Memory     amem;
35   AMS_Comm       acomm;
36 
37   PetscFunctionBegin;
38   PetscValidHeader(obj,1);
39   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
40   if (obj->amsmem != -1) PetscFunctionReturn(0);
41   ierr = PetscObjectName(obj);CHKERRQ(ierr);
42 
43   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(PETSC_COMM_WORLD),&acomm);CHKERRQ(ierr);
44   /* Really want to attach to correct communicator but then browser needs to access multiple communicators
45   ierr      = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); */
46 
47   ierr        = AMS_Memory_create(acomm,obj->name,&amem);CHKERRQ(ierr);
48   obj->amsmem = (int)amem;
49 
50   ierr = AMS_Memory_take_access(amem);CHKERRQ(ierr);
51   ierr = AMS_Memory_add_field(amem,"Class",&obj->class_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
52   ierr = AMS_Memory_add_field(amem,"Type",&obj->type_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
53   ierr = AMS_Memory_add_field(amem,"Id",&obj->id,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
54   ierr = AMS_Memory_add_field(amem,"ParentId",&obj->parentid,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
55   ierr = AMS_Memory_add_field(amem,"Name",&obj->name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
56   ierr = AMS_Memory_add_field(amem,"Block",&obj->amspublishblock,1,AMS_BOOLEAN,AMS_WRITE,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
57   if (obj->bops->publish) {
58     ierr = (*obj->bops->publish)(obj);CHKERRQ(ierr);
59   }
60   ierr = AMS_Memory_publish(amem);CHKERRQ(ierr);
61   ierr = AMS_Memory_grant_access(amem);CHKERRQ(ierr);
62   PetscFunctionReturn(0);
63 }
64 
65 #undef __FUNCT__
66 #define __FUNCT__ "PetscObjectAMSBlock"
67 /*@C
68    PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called
69 
70    Collective on PetscObject
71 
72    Input Parameters:
73 .  obj - the Petsc variable
74          Thus must be cast with a (PetscObject), for example,
75          PetscObjectSetName((PetscObject)mat,name);
76 
77 
78    Level: advanced
79 
80    Concepts: publishing object
81 
82 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSSetBlock()
83 
84 @*/
85 PetscErrorCode  PetscObjectAMSBlock(PetscObject obj)
86 {
87   PetscFunctionBegin;
88   PetscValidHeader(obj,1);
89 
90   if (!obj->amspublishblock) PetscFunctionReturn(0);
91   /* Eventually this will be fixed to check if the AMS client has changed the lock */
92   while (1);
93   PetscFunctionReturn(0);
94 }
95 
96 #undef __FUNCT__
97 #define __FUNCT__ "PetscObjectAMSSetBlock"
98 /*@C
99    PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock()
100 
101    Collective on PetscObject
102 
103    Input Parameters:
104 +  obj - the Petsc variable
105          Thus must be cast with a (PetscObject), for example,
106          PetscObjectSetName((PetscObject)mat,name);
107 -  flg - whether it should block
108 
109    Level: advanced
110 
111    Concepts: publishing object
112 
113 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSBlock()
114 
115 @*/
116 PetscErrorCode  PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg)
117 {
118   PetscFunctionBegin;
119   PetscValidHeader(obj,1);
120   obj->amspublishblock = flg;
121   PetscFunctionReturn(0);
122 }
123 
124 #undef __FUNCT__
125 #define __FUNCT__ "PetscObjectAMSUnPublish"
126 PetscErrorCode PetscObjectAMSUnPublish(PetscObject obj)
127 {
128   AMS_Comm       acomm;
129   PetscErrorCode ierr;
130 
131   PetscFunctionBegin;
132   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
133   if (obj->amsmem == -1) PetscFunctionReturn(0);
134   ierr        = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr);
135   ierr        = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr);
136   obj->amsmem = -1;
137   PetscFunctionReturn(0);
138 }
139 
140