xref: /petsc/src/sys/ams/pams.c (revision 67a1e3b6342386522ac8352d0c49d19b4428a821)
1b3506946SBarry Smith 
2afcb2eb5SJed Brown #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3e04113cfSBarry Smith #include <petscviewersaws.h>
4ec7429eaSBarry Smith #include <petscsys.h>
5b3506946SBarry Smith 
6b3506946SBarry Smith #undef __FUNCT__
7e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsTakeAccess"
8ec7429eaSBarry Smith /*@C
9e04113cfSBarry Smith    PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally
10ec7429eaSBarry Smith 
11ec7429eaSBarry Smith    Collective on PetscObject
12ec7429eaSBarry Smith 
13ec7429eaSBarry Smith    Input Parameters:
14ec7429eaSBarry Smith .  obj - the Petsc variable
15ec7429eaSBarry Smith          Thus must be cast with a (PetscObject), for example,
16ec7429eaSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
17ec7429eaSBarry Smith 
18ec7429eaSBarry Smith    Level: advanced
19ec7429eaSBarry Smith 
20ec7429eaSBarry Smith    Concepts: publishing object
21ec7429eaSBarry Smith 
22e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess()
23ec7429eaSBarry Smith 
24ec7429eaSBarry Smith @*/
25e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsTakeAccess(PetscObject obj)
26ec7429eaSBarry Smith {
27ec957eceSBarry Smith   if (obj->amsmem) {
289a492a5cSBarry Smith     SAWs_Lock();
29ec7429eaSBarry Smith   }
30*67a1e3b6SBarry Smith   return 0;
31ec7429eaSBarry Smith }
32ec7429eaSBarry Smith 
33ec7429eaSBarry Smith #undef __FUNCT__
34e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsGrantAccess"
35ec7429eaSBarry Smith /*@C
36e04113cfSBarry Smith    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change
37ec7429eaSBarry Smith 
38ec7429eaSBarry Smith    Collective on PetscObject
39ec7429eaSBarry Smith 
40ec7429eaSBarry Smith    Input Parameters:
41ec7429eaSBarry Smith .  obj - the Petsc variable
42ec7429eaSBarry Smith          Thus must be cast with a (PetscObject), for example,
43ec7429eaSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
44ec7429eaSBarry Smith 
45ec7429eaSBarry Smith    Level: advanced
46ec7429eaSBarry Smith 
47ec7429eaSBarry Smith    Concepts: publishing object
48ec7429eaSBarry Smith 
49e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
50ec7429eaSBarry Smith 
51ec7429eaSBarry Smith @*/
52e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsGrantAccess(PetscObject obj)
53ec7429eaSBarry Smith {
54ec957eceSBarry Smith   if (obj->amsmem) {
559a492a5cSBarry Smith     SAWs_Unlock();
56ec7429eaSBarry Smith   }
57*67a1e3b6SBarry Smith   return 0;
58ec7429eaSBarry Smith }
59ec7429eaSBarry Smith 
60ec7429eaSBarry Smith #undef __FUNCT__
61e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsBlock"
62b90c6cbeSBarry Smith /*@C
63e04113cfSBarry Smith    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
64b90c6cbeSBarry Smith 
65b90c6cbeSBarry Smith    Collective on PetscObject
66b90c6cbeSBarry Smith 
67b90c6cbeSBarry Smith    Input Parameters:
68b90c6cbeSBarry Smith .  obj - the Petsc variable
69b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
70b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
71b90c6cbeSBarry Smith 
72b90c6cbeSBarry Smith 
73b90c6cbeSBarry Smith    Level: advanced
74b90c6cbeSBarry Smith 
75b90c6cbeSBarry Smith    Concepts: publishing object
76b90c6cbeSBarry Smith 
77e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()
78b90c6cbeSBarry Smith 
79b90c6cbeSBarry Smith @*/
80e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
81b90c6cbeSBarry Smith {
82a332a263SBarry Smith   PetscErrorCode ierr;
83a332a263SBarry Smith 
84b90c6cbeSBarry Smith   PetscFunctionBegin;
85b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
86b90c6cbeSBarry Smith 
8796f8ada6SBarry Smith   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
88e04113cfSBarry Smith   ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
89a332a263SBarry Smith   while (obj->amsblock) {
906c4a5ce2SBarry Smith     ierr = PetscInfo(NULL,"Blocking on AMS\n");
91e04113cfSBarry Smith     ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
926c4a5ce2SBarry Smith     ierr = PetscSleep(2.0);CHKERRQ(ierr);
93e04113cfSBarry Smith     ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
94a332a263SBarry Smith   }
95e04113cfSBarry Smith   ierr = PetscInfo(NULL,"Out of SAWs block\n");
96a332a263SBarry Smith   obj->amsblock = PETSC_TRUE;
97e04113cfSBarry Smith   ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
98b90c6cbeSBarry Smith   PetscFunctionReturn(0);
99b90c6cbeSBarry Smith }
100b90c6cbeSBarry Smith 
101b90c6cbeSBarry Smith #undef __FUNCT__
102e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsSetBlock"
103b90c6cbeSBarry Smith /*@C
104e04113cfSBarry Smith    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()
105b90c6cbeSBarry Smith 
106b90c6cbeSBarry Smith    Collective on PetscObject
107b90c6cbeSBarry Smith 
108b90c6cbeSBarry Smith    Input Parameters:
109b90c6cbeSBarry Smith +  obj - the Petsc variable
110b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
111b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
112b90c6cbeSBarry Smith -  flg - whether it should block
113b90c6cbeSBarry Smith 
114b90c6cbeSBarry Smith    Level: advanced
115b90c6cbeSBarry Smith 
116b90c6cbeSBarry Smith    Concepts: publishing object
117b90c6cbeSBarry Smith 
118e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()
119b90c6cbeSBarry Smith 
120b90c6cbeSBarry Smith @*/
121e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
122b90c6cbeSBarry Smith {
123b90c6cbeSBarry Smith   PetscFunctionBegin;
124b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
125b90c6cbeSBarry Smith   obj->amspublishblock = flg;
126a332a263SBarry Smith   obj->amsblock        = flg;
127b90c6cbeSBarry Smith   PetscFunctionReturn(0);
128b90c6cbeSBarry Smith }
129b90c6cbeSBarry Smith 
130b90c6cbeSBarry Smith #undef __FUNCT__
131e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsViewOff"
132e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
13392e62aa6SBarry Smith {
1349a492a5cSBarry Smith   char           dir[1024];
1359a492a5cSBarry Smith   PetscErrorCode ierr;
1369a492a5cSBarry Smith 
13792e62aa6SBarry Smith   PetscFunctionBegin;
1389fb22e1aSBarry Smith   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
1399a492a5cSBarry Smith   ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr);
1409a492a5cSBarry Smith   SAWs_Delete(dir);
14192e62aa6SBarry Smith   PetscFunctionReturn(0);
14292e62aa6SBarry Smith }
14392e62aa6SBarry Smith 
144