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 = PetscInfo(NULL,"Blocking on AMS\n"); 93 ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr); 94 ierr = PetscSleep(2.0);CHKERRQ(ierr); 95 ierr = PetscObjectAMSTakeAccess(obj);CHKERRQ(ierr); 96 } 97 ierr = PetscInfo(NULL,"Out of AMS block\n"); 98 obj->amsblock = PETSC_TRUE; 99 ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr); 100 PetscFunctionReturn(0); 101 } 102 103 #undef __FUNCT__ 104 #define __FUNCT__ "PetscObjectAMSSetBlock" 105 /*@C 106 PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock() 107 108 Collective on PetscObject 109 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 115 116 Level: advanced 117 118 Concepts: publishing object 119 120 .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSBlock() 121 122 @*/ 123 PetscErrorCode PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg) 124 { 125 PetscFunctionBegin; 126 PetscValidHeader(obj,1); 127 obj->amspublishblock = flg; 128 obj->amsblock = flg; 129 PetscFunctionReturn(0); 130 } 131 132 #undef __FUNCT__ 133 #define __FUNCT__ "PetscObjectAMSViewOff" 134 PetscErrorCode PetscObjectAMSViewOff(PetscObject obj) 135 { 136 PetscErrorCode ierr; 137 138 PetscFunctionBegin; 139 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 140 if (obj->amsmem == -1) PetscFunctionReturn(0); 141 ierr = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr); 142 obj->amsmem = -1; 143 PetscFunctionReturn(0); 144 } 145 146