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