Actual source code: pams.c


  2: #include <petsc/private/petscimpl.h>
  3: #include <petscviewersaws.h>
  4: #include <petscsys.h>

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

 10:    Collective

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

 15:    Level: advanced

 17:    Developer Note:
 18:    The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and `PetscObjectSAWsRestoreAccess()`

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

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

 35:    Collective

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

 40:    Level: advanced

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

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

 56:    Not Collective

 58:    Level: advanced

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

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

 81: /*@C
 82:    PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called

 84:    Collective

 86:    Input Parameter:
 87: .  obj - the PETSc variable

 89:    Level: advanced

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

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

103: /*@C
104:    PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`

106:    Collective

108:    Input Parameters:
109: +  obj - the PETSc variable
110: -  flg - whether it should block

112:    Level: advanced

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

124: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
125: {
126:   char dir[PETSC_MAX_PATH_LEN];

128:   PetscFunctionBegin;
129:   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS);
130:   if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS);
131:   PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
132:   PetscCallSAWs(SAWs_Delete, (dir));
133:   PetscFunctionReturn(PETSC_SUCCESS);
134: }