1 2 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewerams.h> 4 #include <petscsys.h> 5 6 #undef __FUNCT__ 7 #define __FUNCT__ "PetscObjectAMSTakeAccess" 8 /*@C 9 PetscObjectAMSTakeAccess - Take access of the data fields that have been published to AMS 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(), PetscObjectAMSViewOff(), PetscObjectAMSGrantAccess() 23 24 @*/ 25 PetscErrorCode PetscObjectAMSTakeAccess(PetscObject obj) 26 { 27 PetscFunctionBegin; 28 if (obj->amsmem != -1) { 29 PetscStackCallAMS(AMS_Memory_take_access,(obj->amsmem)); 30 } 31 PetscFunctionReturn(0); 32 } 33 34 #undef __FUNCT__ 35 #define __FUNCT__ "PetscObjectAMSGrantAccess" 36 /*@C 37 PetscObjectAMSGrantAccess - Grants access of the data fields that have been published to AMS to the memory snooper to change 38 39 Collective on PetscObject 40 41 Input Parameters: 42 . obj - the Petsc variable 43 Thus must be cast with a (PetscObject), for example, 44 PetscObjectSetName((PetscObject)mat,name); 45 46 Level: advanced 47 48 Concepts: publishing object 49 50 .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess() 51 52 @*/ 53 PetscErrorCode PetscObjectAMSGrantAccess(PetscObject obj) 54 { 55 PetscFunctionBegin; 56 if (obj->amsmem != -1) { 57 PetscStackCallAMS(AMS_Memory_grant_access,(obj->amsmem)); 58 } 59 PetscFunctionReturn(0); 60 } 61 62 #undef __FUNCT__ 63 #define __FUNCT__ "PetscObjectAMSBlock" 64 /*@C 65 PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called 66 67 Collective on PetscObject 68 69 Input Parameters: 70 . obj - the Petsc variable 71 Thus must be cast with a (PetscObject), for example, 72 PetscObjectSetName((PetscObject)mat,name); 73 74 75 Level: advanced 76 77 Concepts: publishing object 78 79 .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSSetBlock() 80 81 @*/ 82 PetscErrorCode PetscObjectAMSBlock(PetscObject obj) 83 { 84 PetscErrorCode ierr; 85 86 PetscFunctionBegin; 87 PetscValidHeader(obj,1); 88 89 if (!obj->amspublishblock) PetscFunctionReturn(0); 90 ierr = PetscObjectAMSTakeAccess(obj);CHKERRQ(ierr); 91 while (obj->amsblock) { 92 ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr); 93 ierr = PetscSleep(2);CHKERRQ(ierr); 94 ierr = PetscObjectAMSTakeAccess(obj);CHKERRQ(ierr); 95 } 96 obj->amsblock = PETSC_TRUE; 97 ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr); 98 PetscFunctionReturn(0); 99 } 100 101 #undef __FUNCT__ 102 #define __FUNCT__ "PetscObjectAMSSetBlock" 103 /*@C 104 PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock() 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(), PetscObjectAMSViewOff(), PetscObjectAMSBlock() 119 120 @*/ 121 PetscErrorCode PetscObjectAMSSetBlock(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__ "PetscObjectAMSViewOff" 132 PetscErrorCode PetscObjectAMSViewOff(PetscObject obj) 133 { 134 PetscErrorCode ierr; 135 136 PetscFunctionBegin; 137 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 138 if (obj->amsmem == -1) PetscFunctionReturn(0); 139 ierr = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr); 140 obj->amsmem = -1; 141 PetscFunctionReturn(0); 142 } 143 144