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