Actual source code: pams.c

  1: #include <petsc/private/petscimpl.h>
  2: #include <petscviewersaws.h>

  4: /*@
  5:   PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs
  6:   by a `PetscObject` so their values may  be changed in the computation

  8:   Collective

 10:   Input Parameter:
 11: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat);

 13:   Level: advanced

 15:   Developer Notes:
 16:   The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and
 17:   `PetscObjectSAWsRestoreAccess()`

 19: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()`
 20: @*/
 21: PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj)
 22: {
 23:   if (obj->amsmem) {
 24:     /* cannot wrap with PetscPushStack() because that also deals with the locks */
 25:     SAWs_Lock();
 26:   }
 27:   return PETSC_SUCCESS;
 28: }

 30: /*@
 31:   PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to
 32:   SAWs called when the changes made during `PetscObjectSAWsTakeAccess()` are complete.

 34:   Collective

 36:   Input Parameter:
 37: . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat);

 39:   Level: advanced

 41:   Notes:
 42:   This allows the webserve to change the published values.

 44: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
 45: @*/
 46: PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj)
 47: {
 48:   if (obj->amsmem) {
 49:     /* cannot wrap with PetscPushStack() because that also deals with the locks */
 50:     SAWs_Unlock();
 51:   }
 52:   return PETSC_SUCCESS;
 53: }

 55: /*@
 56:   PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it

 58:   Not Collective

 60:   Level: advanced

 62: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
 63: @*/
 64: PetscErrorCode PetscSAWsBlock(void)
 65: {
 66:   volatile PetscBool block = PETSC_TRUE;

 68:   PetscFunctionBegin;
 69:   PetscCallSAWs(SAWs_Register, "__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN);
 70:   SAWs_Lock();
 71:   while (block) {
 72:     SAWs_Unlock();
 73:     PetscCall(PetscInfo(NULL, "Blocking on SAWs\n"));
 74:     PetscCall(PetscSleep(.3));
 75:     SAWs_Lock();
 76:   }
 77:   SAWs_Unlock();
 78:   PetscCallSAWs(SAWs_Delete, "__Block");
 79:   PetscCall(PetscInfo(NULL, "Out of SAWs block\n"));
 80:   PetscFunctionReturn(PETSC_SUCCESS);
 81: }

 83: /*@
 84:   PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called

 86:   Collective

 88:   Input Parameter:
 89: . obj - the PETSc variable

 91:   Level: advanced

 93: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
 94: @*/
 95: PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
 96: {
 97:   PetscFunctionBegin;

100:   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
101:   PetscCall(PetscSAWsBlock());
102:   PetscFunctionReturn(PETSC_SUCCESS);
103: }

105: /*@
106:   PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`

108:   Collective

110:   Input Parameters:
111: + obj - the PETSc variable
112: - flg - whether it should block

114:   Level: advanced

116: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
117: @*/
118: PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
119: {
120:   PetscFunctionBegin;
122:   obj->amspublishblock = flg;
123:   PetscFunctionReturn(PETSC_SUCCESS);
124: }

126: /*@
127:   PetscObjectSAWsViewOff - Remove a `PetscObject`'s SAWs (Scientific Application Web server) directory so the object is no longer published

129:   Logically Collective

131:   Input Parameter:
132: . obj - the `PetscObject` whose SAWs publication should be torn down

134:   Level: developer

136:   Notes:
137:   No-op for `PetscViewer` objects, and for any object that was never published via SAWs.

139:   Called from `PetscObjectDestroy()`; users normally do not need to call this directly.

141: .seealso: `PetscObject`, `PetscObjectSAWsBlock()`, `PetscObjectSAWsTakeAccess()`, `PetscObjectSAWsGrantAccess()`
142: @*/
143: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
144: {
145:   char dir[PETSC_MAX_PATH_LEN];

147:   PetscFunctionBegin;
148:   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS);
149:   if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
150:   PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
151:   PetscCallSAWs(SAWs_Delete, dir);
152:   PetscFunctionReturn(PETSC_SUCCESS);
153: }