xref: /petsc/src/sys/ams/pams.c (revision e04113cf637149666d9c83678a5abc4e1b351bcc)
1b3506946SBarry Smith 
2afcb2eb5SJed Brown #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3*e04113cfSBarry Smith #include <petscviewersaws.h>
4ec7429eaSBarry Smith #include <petscsys.h>
5b3506946SBarry Smith 
6b3506946SBarry Smith #undef __FUNCT__
7*e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsTakeAccess"
8ec7429eaSBarry Smith /*@C
9*e04113cfSBarry 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 
22*e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess()
23ec7429eaSBarry Smith 
24ec7429eaSBarry Smith @*/
25*e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsTakeAccess(PetscObject obj)
26ec7429eaSBarry Smith {
27ec7429eaSBarry Smith   PetscFunctionBegin;
28ec957eceSBarry Smith   if (obj->amsmem) {
29*e04113cfSBarry Smith     PetscStackCallSAWs(SAWS_Lock_Directory,(obj->amsmem));
30ec7429eaSBarry Smith   }
31ec7429eaSBarry Smith   PetscFunctionReturn(0);
32ec7429eaSBarry Smith }
33ec7429eaSBarry Smith 
34ec7429eaSBarry Smith #undef __FUNCT__
35*e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsGrantAccess"
36ec7429eaSBarry Smith /*@C
37*e04113cfSBarry Smith    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change
38ec7429eaSBarry Smith 
39ec7429eaSBarry Smith    Collective on PetscObject
40ec7429eaSBarry Smith 
41ec7429eaSBarry Smith    Input Parameters:
42ec7429eaSBarry Smith .  obj - the Petsc variable
43ec7429eaSBarry Smith          Thus must be cast with a (PetscObject), for example,
44ec7429eaSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
45ec7429eaSBarry Smith 
46ec7429eaSBarry Smith    Level: advanced
47ec7429eaSBarry Smith 
48ec7429eaSBarry Smith    Concepts: publishing object
49ec7429eaSBarry Smith 
50*e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
51ec7429eaSBarry Smith 
52ec7429eaSBarry Smith @*/
53*e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsGrantAccess(PetscObject obj)
54ec7429eaSBarry Smith {
55ec7429eaSBarry Smith   PetscFunctionBegin;
56ec957eceSBarry Smith   if (obj->amsmem) {
57*e04113cfSBarry Smith     PetscStackCallSAWs(SAWS_Unlock_Directory,(obj->amsmem));
58ec7429eaSBarry Smith   }
59ec7429eaSBarry Smith   PetscFunctionReturn(0);
60ec7429eaSBarry Smith }
61ec7429eaSBarry Smith 
62ec7429eaSBarry Smith #undef __FUNCT__
63*e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsBlock"
64b90c6cbeSBarry Smith /*@C
65*e04113cfSBarry Smith    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
66b90c6cbeSBarry Smith 
67b90c6cbeSBarry Smith    Collective on PetscObject
68b90c6cbeSBarry Smith 
69b90c6cbeSBarry Smith    Input Parameters:
70b90c6cbeSBarry Smith .  obj - the Petsc variable
71b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
72b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
73b90c6cbeSBarry Smith 
74b90c6cbeSBarry Smith 
75b90c6cbeSBarry Smith    Level: advanced
76b90c6cbeSBarry Smith 
77b90c6cbeSBarry Smith    Concepts: publishing object
78b90c6cbeSBarry Smith 
79*e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()
80b90c6cbeSBarry Smith 
81b90c6cbeSBarry Smith @*/
82*e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
83b90c6cbeSBarry Smith {
84a332a263SBarry Smith   PetscErrorCode ierr;
85a332a263SBarry Smith 
86b90c6cbeSBarry Smith   PetscFunctionBegin;
87b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
88b90c6cbeSBarry Smith 
8996f8ada6SBarry Smith   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
90*e04113cfSBarry Smith   ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
91a332a263SBarry Smith   while (obj->amsblock) {
926c4a5ce2SBarry Smith     ierr = PetscInfo(NULL,"Blocking on AMS\n");
93*e04113cfSBarry Smith     ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
946c4a5ce2SBarry Smith     ierr = PetscSleep(2.0);CHKERRQ(ierr);
95*e04113cfSBarry Smith     ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
96a332a263SBarry Smith   }
97*e04113cfSBarry Smith   ierr = PetscInfo(NULL,"Out of SAWs block\n");
98a332a263SBarry Smith   obj->amsblock = PETSC_TRUE;
99*e04113cfSBarry Smith   ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
100b90c6cbeSBarry Smith   PetscFunctionReturn(0);
101b90c6cbeSBarry Smith }
102b90c6cbeSBarry Smith 
103b90c6cbeSBarry Smith #undef __FUNCT__
104*e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsSetBlock"
105b90c6cbeSBarry Smith /*@C
106*e04113cfSBarry Smith    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()
107b90c6cbeSBarry Smith 
108b90c6cbeSBarry Smith    Collective on PetscObject
109b90c6cbeSBarry Smith 
110b90c6cbeSBarry Smith    Input Parameters:
111b90c6cbeSBarry Smith +  obj - the Petsc variable
112b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
113b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
114b90c6cbeSBarry Smith -  flg - whether it should block
115b90c6cbeSBarry Smith 
116b90c6cbeSBarry Smith    Level: advanced
117b90c6cbeSBarry Smith 
118b90c6cbeSBarry Smith    Concepts: publishing object
119b90c6cbeSBarry Smith 
120*e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()
121b90c6cbeSBarry Smith 
122b90c6cbeSBarry Smith @*/
123*e04113cfSBarry Smith PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
124b90c6cbeSBarry Smith {
125b90c6cbeSBarry Smith   PetscFunctionBegin;
126b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
127b90c6cbeSBarry Smith   obj->amspublishblock = flg;
128a332a263SBarry Smith   obj->amsblock        = flg;
129b90c6cbeSBarry Smith   PetscFunctionReturn(0);
130b90c6cbeSBarry Smith }
131b90c6cbeSBarry Smith 
132b90c6cbeSBarry Smith #undef __FUNCT__
133*e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsViewOff"
134*e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
13592e62aa6SBarry Smith {
13692e62aa6SBarry Smith   PetscErrorCode ierr;
13792e62aa6SBarry Smith 
13892e62aa6SBarry Smith   PetscFunctionBegin;
1399fb22e1aSBarry Smith   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
140ec957eceSBarry Smith   if (!obj->amsmem) PetscFunctionReturn(0);
141*e04113cfSBarry Smith   ierr = SAWS_Directory_Destroy(&obj->amsmem);CHKERRQ(ierr);
14292e62aa6SBarry Smith   PetscFunctionReturn(0);
14392e62aa6SBarry Smith }
14492e62aa6SBarry Smith 
145