Actual source code: pams.c

petsc-3.4.5 2014-06-29
  2: #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
  3: #include <petscviewerams.h>
  4: #include <petscsys.h>

  8: /*@C
  9:    PetscObjectAMSTakeAccess - Take access of the data fields that have been published to AMS so they may be changed locally

 11:    Collective on PetscObject

 13:    Input Parameters:
 14: .  obj - the Petsc variable
 15:          Thus must be cast with a (PetscObject), for example,
 16:          PetscObjectSetName((PetscObject)mat,name);

 18:    Level: advanced

 20:    Concepts: publishing object

 22: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSGrantAccess()

 24: @*/
 25: PetscErrorCode  PetscObjectAMSTakeAccess(PetscObject obj)
 26: {
 28:   if (obj->amsmem != -1) {
 29:     PetscStackCallAMS(AMS_Memory_take_access,(obj->amsmem));
 30:   }
 31:   return(0);
 32: }

 36: /*@C
 37:    PetscObjectAMSGrantAccess - Grants access of the data fields that have been published to AMS to the memory snooper to change

 39:    Collective on PetscObject

 41:    Input Parameters:
 42: .  obj - the Petsc variable
 43:          Thus must be cast with a (PetscObject), for example,
 44:          PetscObjectSetName((PetscObject)mat,name);

 46:    Level: advanced

 48:    Concepts: publishing object

 50: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()

 52: @*/
 53: PetscErrorCode  PetscObjectAMSGrantAccess(PetscObject obj)
 54: {
 56:   if (obj->amsmem != -1) {
 57:     PetscStackCallAMS(AMS_Memory_grant_access,(obj->amsmem));
 58:   }
 59:   return(0);
 60: }

 64: /*@C
 65:    PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called

 67:    Collective on PetscObject

 69:    Input Parameters:
 70: .  obj - the Petsc variable
 71:          Thus must be cast with a (PetscObject), for example,
 72:          PetscObjectSetName((PetscObject)mat,name);


 75:    Level: advanced

 77:    Concepts: publishing object

 79: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSSetBlock()

 81: @*/
 82: PetscErrorCode  PetscObjectAMSBlock(PetscObject obj)
 83: {


 89:   if (!obj->amspublishblock) return(0);
 90:   PetscObjectAMSTakeAccess(obj);
 91:   while (obj->amsblock) {
 92:     PetscInfo(NULL,"Blocking on AMS\n");
 93:     PetscObjectAMSGrantAccess(obj);
 94:     PetscSleep(2.0);
 95:     PetscObjectAMSTakeAccess(obj);
 96:   }
 97:   PetscInfo(NULL,"Out of AMS block\n");
 98:   obj->amsblock = PETSC_TRUE;
 99:   PetscObjectAMSGrantAccess(obj);
100:   return(0);
101: }

105: /*@C
106:    PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock()

108:    Collective on PetscObject

110:    Input Parameters:
111: +  obj - the Petsc variable
112:          Thus must be cast with a (PetscObject), for example,
113:          PetscObjectSetName((PetscObject)mat,name);
114: -  flg - whether it should block

116:    Level: advanced

118:    Concepts: publishing object

120: .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSBlock()

122: @*/
123: PetscErrorCode  PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg)
124: {
127:   obj->amspublishblock = flg;
128:   obj->amsblock        = flg;
129:   return(0);
130: }

134: PetscErrorCode PetscObjectAMSViewOff(PetscObject obj)
135: {

139:   if (obj->classid == PETSC_VIEWER_CLASSID) return(0);
140:   if (obj->amsmem == -1) return(0);
141:   AMS_Memory_destroy(obj->amsmem);
142:   obj->amsmem = -1;
143:   return(0);
144: }