xref: /petsc/src/sys/ams/pams.c (revision b90c6cbe8a28dbbfeb8633979a88a1769a41a59e)
1b3506946SBarry Smith 
2afcb2eb5SJed Brown #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3665c2dedSJed Brown #include <petscviewer.h>
4b3506946SBarry Smith 
5b3506946SBarry Smith /*
6b3506946SBarry Smith      If true then every PETSc object will be published with the AMS
7b3506946SBarry Smith */
8ace3abfcSBarry Smith PetscBool PetscAMSPublishAll;
9b3506946SBarry Smith 
10b3506946SBarry Smith #undef __FUNCT__
119fb22e1aSBarry Smith #define __FUNCT__ "PetscObjectAMSPublish"
12c457296dSBarry Smith /*@C
139fb22e1aSBarry Smith    PetscObjectAMSPublish - Publish an object
14c457296dSBarry Smith 
15c457296dSBarry Smith    Collective on PetscObject
16c457296dSBarry Smith 
17c457296dSBarry Smith    Input Parameters:
18c457296dSBarry Smith .  obj - the Petsc variable
19c457296dSBarry Smith          Thus must be cast with a (PetscObject), for example,
20c457296dSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
21c457296dSBarry Smith 
229fb22e1aSBarry Smith    Notes: PetscViewer objects are not published
239fb22e1aSBarry Smith 
24c457296dSBarry Smith    Level: advanced
25c457296dSBarry Smith 
26c457296dSBarry Smith    Concepts: publishing object
27c457296dSBarry Smith 
28*b90c6cbeSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish()
29c457296dSBarry Smith 
30c457296dSBarry Smith @*/
317087cfbeSBarry Smith PetscErrorCode  PetscObjectAMSPublish(PetscObject obj)
32b3506946SBarry Smith {
33c457296dSBarry Smith   PetscErrorCode ierr;
34b3506946SBarry Smith   AMS_Memory     amem;
35b3506946SBarry Smith   AMS_Comm       acomm;
36b3506946SBarry Smith 
37b3506946SBarry Smith   PetscFunctionBegin;
38c457296dSBarry Smith   PetscValidHeader(obj,1);
399fb22e1aSBarry Smith   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
40*b90c6cbeSBarry Smith   if (obj->amsmem != -1) PetscFunctionReturn(0);
41b3506946SBarry Smith   ierr = PetscObjectName(obj);CHKERRQ(ierr);
42b3506946SBarry Smith 
431999dac5SBarry Smith   ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(PETSC_COMM_WORLD),&acomm);CHKERRQ(ierr);
441999dac5SBarry Smith   /* Really want to attach to correct communicator but then browser needs to access multiple communicators
451999dac5SBarry Smith   ierr      = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); */
461999dac5SBarry Smith 
47b3506946SBarry Smith   ierr        = AMS_Memory_create(acomm,obj->name,&amem);CHKERRQ(ierr);
48*b90c6cbeSBarry Smith   obj->amsmem = (int)amem;
49b3506946SBarry Smith 
50b3506946SBarry Smith   ierr = AMS_Memory_take_access(amem);CHKERRQ(ierr);
51b3506946SBarry Smith   ierr = AMS_Memory_add_field(amem,"Class",&obj->class_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
52b3506946SBarry Smith   ierr = AMS_Memory_add_field(amem,"Type",&obj->type_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
53b3506946SBarry Smith   ierr = AMS_Memory_add_field(amem,"Id",&obj->id,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
54b3506946SBarry Smith   ierr = AMS_Memory_add_field(amem,"ParentId",&obj->parentid,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
55b3506946SBarry Smith   ierr = AMS_Memory_add_field(amem,"Name",&obj->name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
56*b90c6cbeSBarry Smith   ierr = AMS_Memory_add_field(amem,"Block",&obj->amspublishblock,1,AMS_BOOLEAN,AMS_WRITE,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr);
57c457296dSBarry Smith   if (obj->bops->publish) {
58c457296dSBarry Smith     ierr = (*obj->bops->publish)(obj);CHKERRQ(ierr);
59c457296dSBarry Smith   }
6010212d9eSBarry Smith   ierr = AMS_Memory_publish(amem);CHKERRQ(ierr);
6110212d9eSBarry Smith   ierr = AMS_Memory_grant_access(amem);CHKERRQ(ierr);
62b3506946SBarry Smith   PetscFunctionReturn(0);
63b3506946SBarry Smith }
64b3506946SBarry Smith 
6592e62aa6SBarry Smith #undef __FUNCT__
66*b90c6cbeSBarry Smith #define __FUNCT__ "PetscObjectAMSBlock"
67*b90c6cbeSBarry Smith /*@C
68*b90c6cbeSBarry Smith    PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called
69*b90c6cbeSBarry Smith 
70*b90c6cbeSBarry Smith    Collective on PetscObject
71*b90c6cbeSBarry Smith 
72*b90c6cbeSBarry Smith    Input Parameters:
73*b90c6cbeSBarry Smith .  obj - the Petsc variable
74*b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
75*b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
76*b90c6cbeSBarry Smith 
77*b90c6cbeSBarry Smith 
78*b90c6cbeSBarry Smith    Level: advanced
79*b90c6cbeSBarry Smith 
80*b90c6cbeSBarry Smith    Concepts: publishing object
81*b90c6cbeSBarry Smith 
82*b90c6cbeSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSSetBlock()
83*b90c6cbeSBarry Smith 
84*b90c6cbeSBarry Smith @*/
85*b90c6cbeSBarry Smith PetscErrorCode  PetscObjectAMSBlock(PetscObject obj)
86*b90c6cbeSBarry Smith {
87*b90c6cbeSBarry Smith   PetscFunctionBegin;
88*b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
89*b90c6cbeSBarry Smith 
90*b90c6cbeSBarry Smith   if (!obj->amspublishblock) PetscFunctionReturn(0);
91*b90c6cbeSBarry Smith   /* Eventually this will be fixed to check if the AMS client has changed the lock */
92*b90c6cbeSBarry Smith   while (1);
93*b90c6cbeSBarry Smith   PetscFunctionReturn(0);
94*b90c6cbeSBarry Smith }
95*b90c6cbeSBarry Smith 
96*b90c6cbeSBarry Smith #undef __FUNCT__
97*b90c6cbeSBarry Smith #define __FUNCT__ "PetscObjectAMSSetBlock"
98*b90c6cbeSBarry Smith /*@C
99*b90c6cbeSBarry Smith    PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock()
100*b90c6cbeSBarry Smith 
101*b90c6cbeSBarry Smith    Collective on PetscObject
102*b90c6cbeSBarry Smith 
103*b90c6cbeSBarry Smith    Input Parameters:
104*b90c6cbeSBarry Smith +  obj - the Petsc variable
105*b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
106*b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
107*b90c6cbeSBarry Smith -  flg - whether it should block
108*b90c6cbeSBarry Smith 
109*b90c6cbeSBarry Smith    Level: advanced
110*b90c6cbeSBarry Smith 
111*b90c6cbeSBarry Smith    Concepts: publishing object
112*b90c6cbeSBarry Smith 
113*b90c6cbeSBarry Smith .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSBlock()
114*b90c6cbeSBarry Smith 
115*b90c6cbeSBarry Smith @*/
116*b90c6cbeSBarry Smith PetscErrorCode  PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg)
117*b90c6cbeSBarry Smith {
118*b90c6cbeSBarry Smith   PetscFunctionBegin;
119*b90c6cbeSBarry Smith   PetscValidHeader(obj,1);
120*b90c6cbeSBarry Smith   obj->amspublishblock = flg;
121*b90c6cbeSBarry Smith   PetscFunctionReturn(0);
122*b90c6cbeSBarry Smith }
123*b90c6cbeSBarry Smith 
124*b90c6cbeSBarry Smith #undef __FUNCT__
125*b90c6cbeSBarry Smith #define __FUNCT__ "PetscObjectAMSUnPublish"
126*b90c6cbeSBarry Smith PetscErrorCode PetscObjectAMSUnPublish(PetscObject obj)
12792e62aa6SBarry Smith {
12892e62aa6SBarry Smith   AMS_Comm       acomm;
12992e62aa6SBarry Smith   PetscErrorCode ierr;
13092e62aa6SBarry Smith 
13192e62aa6SBarry Smith   PetscFunctionBegin;
1329fb22e1aSBarry Smith   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
133*b90c6cbeSBarry Smith   if (obj->amsmem == -1) PetscFunctionReturn(0);
13492e62aa6SBarry Smith   ierr        = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr);
135*b90c6cbeSBarry Smith   ierr        = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr);
136*b90c6cbeSBarry Smith   obj->amsmem = -1;
13792e62aa6SBarry Smith   PetscFunctionReturn(0);
13892e62aa6SBarry Smith }
13992e62aa6SBarry Smith 
140