xref: /petsc/src/sys/ams/pams.c (revision ec7429eab6e231810adac0f010b269bd5bae4496)
1 
2 #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3 #include <petscviewerams.h>
4 #include <petscsys.h>
5 
6 /*
7      If true then every PETSc object will be published with the AMS
8 */
9 PetscBool PetscAMSPublishAll;
10 
11 #undef __FUNCT__
12 #define __FUNCT__ "PetscObjectAMSTakeAccess"
13 /*@C
14    PetscObjectAMSTakeAccess - Take access of the data fields that have been published to AMS so they may be changed locally
15 
16    Collective on PetscObject
17 
18    Input Parameters:
19 .  obj - the Petsc variable
20          Thus must be cast with a (PetscObject), for example,
21          PetscObjectSetName((PetscObject)mat,name);
22 
23    Level: advanced
24 
25    Concepts: publishing object
26 
27 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSGrantAccess()
28 
29 @*/
30 PetscErrorCode  PetscObjectAMSTakeAccess(PetscObject obj)
31 {
32   PetscErrorCode ierr;
33 
34   PetscFunctionBegin;
35   if (obj->amsmem != -1) {
36     ierr = AMS_Memory_take_access(obj->amsmem);CHKERRQ(ierr);
37   }
38   PetscFunctionReturn(0);
39 }
40 
41 #undef __FUNCT__
42 #define __FUNCT__ "PetscObjectAMSGrantAccess"
43 /*@C
44    PetscObjectAMSGrantAccess - Grants access of the data fields that have been published to AMS to the memory snooper to change
45 
46    Collective on PetscObject
47 
48    Input Parameters:
49 .  obj - the Petsc variable
50          Thus must be cast with a (PetscObject), for example,
51          PetscObjectSetName((PetscObject)mat,name);
52 
53    Level: advanced
54 
55    Concepts: publishing object
56 
57 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSTakeAccess()
58 
59 @*/
60 PetscErrorCode  PetscObjectAMSGrantAccess(PetscObject obj)
61 {
62   PetscErrorCode ierr;
63 
64   PetscFunctionBegin;
65   if (obj->amsmem != -1) {
66     ierr = AMS_Memory_grant_access(obj->amsmem);CHKERRQ(ierr);
67   }
68   PetscFunctionReturn(0);
69 }
70 
71 #undef __FUNCT__
72 #define __FUNCT__ "PetscObjectAMSPublish"
73 /*@C
74    PetscObjectAMSPublish - Publish an object
75 
76    Collective on PetscObject
77 
78    Input Parameters:
79 .  obj - the Petsc variable
80          Thus must be cast with a (PetscObject), for example,
81          PetscObjectSetName((PetscObject)mat,name);
82 
83    Notes: PetscViewer objects are not published
84 
85    Level: advanced
86 
87    Concepts: publishing object
88 
89 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish()
90 
91 @*/
92 PetscErrorCode  PetscObjectAMSPublish(PetscObject obj)
93 {
94   PetscErrorCode ierr;
95   AMS_Memory     amem;
96   AMS_Comm       acomm;
97 
98   PetscFunctionBegin;
99   PetscValidHeader(obj,1);
100   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
101   if (obj->amsmem != -1) PetscFunctionReturn(0);
102   ierr = PetscObjectName(obj);CHKERRQ(ierr);
103 
104   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(PETSC_COMM_WORLD),&acomm);CHKERRQ(ierr);
105   /* Really want to attach to correct communicator but then browser needs to access multiple communicators
106   ierr      = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); */
107 
108   ierr        = AMS_Memory_create(acomm,obj->name,&amem);CHKERRQ(ierr);
109   obj->amsmem = (int)amem;
110 
111   ierr = AMS_Memory_take_access(amem);CHKERRQ(ierr);
112   ierr = AMS_Memory_add_field(amem,"Class",&obj->class_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
113   ierr = AMS_Memory_add_field(amem,"Type",&obj->type_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
114   ierr = AMS_Memory_add_field(amem,"Id",&obj->id,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
115   ierr = AMS_Memory_add_field(amem,"ParentId",&obj->parentid,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
116   ierr = AMS_Memory_add_field(amem,"Name",&obj->name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
117   ierr = AMS_Memory_add_field(amem,"Block",&obj->amspublishblock,1,AMS_BOOLEAN,AMS_WRITE,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
118   if (obj->bops->publish) {
119     ierr = (*obj->bops->publish)(obj);CHKERRQ(ierr);
120   }
121   ierr = AMS_Memory_publish(amem);CHKERRQ(ierr);
122   ierr = AMS_Memory_grant_access(amem);CHKERRQ(ierr);
123   PetscFunctionReturn(0);
124 }
125 
126 #undef __FUNCT__
127 #define __FUNCT__ "PetscObjectAMSBlock"
128 /*@C
129    PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called
130 
131    Collective on PetscObject
132 
133    Input Parameters:
134 .  obj - the Petsc variable
135          Thus must be cast with a (PetscObject), for example,
136          PetscObjectSetName((PetscObject)mat,name);
137 
138 
139    Level: advanced
140 
141    Concepts: publishing object
142 
143 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSSetBlock()
144 
145 @*/
146 PetscErrorCode  PetscObjectAMSBlock(PetscObject obj)
147 {
148   PetscFunctionBegin;
149   PetscValidHeader(obj,1);
150 
151   if (!obj->amspublishblock) PetscFunctionReturn(0);
152   /* Eventually this will be fixed to check if the AMS client has changed the lock */
153   while (1);
154   PetscFunctionReturn(0);
155 }
156 
157 #undef __FUNCT__
158 #define __FUNCT__ "PetscObjectAMSSetBlock"
159 /*@C
160    PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock()
161 
162    Collective on PetscObject
163 
164    Input Parameters:
165 +  obj - the Petsc variable
166          Thus must be cast with a (PetscObject), for example,
167          PetscObjectSetName((PetscObject)mat,name);
168 -  flg - whether it should block
169 
170    Level: advanced
171 
172    Concepts: publishing object
173 
174 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSBlock()
175 
176 @*/
177 PetscErrorCode  PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg)
178 {
179   PetscFunctionBegin;
180   PetscValidHeader(obj,1);
181   obj->amspublishblock = flg;
182   PetscFunctionReturn(0);
183 }
184 
185 #undef __FUNCT__
186 #define __FUNCT__ "PetscObjectAMSUnPublish"
187 PetscErrorCode PetscObjectAMSUnPublish(PetscObject obj)
188 {
189   PetscErrorCode ierr;
190 
191   PetscFunctionBegin;
192   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
193   if (obj->amsmem == -1) PetscFunctionReturn(0);
194   if (obj->bops->unpublish) {
195     ierr = (*obj->bops->unpublish)(obj);CHKERRQ(ierr);
196   } else {
197     ierr        = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr);
198     obj->amsmem = -1;
199   }
200   PetscFunctionReturn(0);
201 }
202 
203