Skip to content

Commit

Permalink
Register finalizers for all the packages so that dInitialize/dFinaliz…
Browse files Browse the repository at this point in the history
…e can be called multiple times

This makes the VisIt plugin work properly on reload.
  • Loading branch information
jedbrown committed May 4, 2011
1 parent 07fbf2a commit 72a9ceb
Show file tree
Hide file tree
Showing 8 changed files with 54 additions and 19 deletions.
1 change: 1 addition & 0 deletions include/dohpfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ extern dErr dFSLoadIntoFS(dViewer,const char[],dFS);
extern dErr dFSRegister(const char[],const char[],const char[],dErr(*)(dFS));
extern dErr dFSRegisterAll(const char[]);
extern dErr dFSInitializePackage(const char[]);
extern dErr dFSFinalizePackage(void);

/* These are purely for convenience */
extern dErr dFSGlobalToExpanded(dFS,Vec,Vec,dFSHomogeneousMode,InsertMode);
Expand Down
3 changes: 3 additions & 0 deletions include/dohpjacobi.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ dEXTERN_C_BEGIN
extern PetscClassId dJACOBI_CLASSID,dQUADRATURE_CLASSID;
extern PetscBool dJacobiRegisterAllCalled;
extern PetscBool dQuadratureRegisterAllCalled;
extern PetscFList dQuadratureList;
extern PetscFList dJacobiList;

/**
* Handle for manipulating EFS objects. The EFS are stored directly in arrays so other components (like dFS) will have
Expand Down Expand Up @@ -162,6 +164,7 @@ extern dErr dJacobiView(dJacobi,dViewer);
extern dErr dJacobiRegister(const char[],const char[],const char[],dErr(*)(dJacobi));
extern dErr dJacobiRegisterAll(const char[]);
extern dErr dJacobiInitializePackage(const char[]);
extern dErr dJacobiFinalizePackage(void);

extern dErr dJacobiGetEFS(dJacobi,dInt,const dEntTopology[],const dPolynomialOrder[],const dRule[],dEFS**);
extern dErr dJacobiGetQuadrature(dJacobi,dQuadratureMethod,dQuadrature*);
Expand Down
2 changes: 2 additions & 0 deletions include/dohpmesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ typedef struct _p_dMesh *dMesh;
extern dClassId dMESH_CLASSID;
extern PetscBool dMeshRegisterAllCalled;
extern PetscLogEvent dLOG_MeshLoad;
extern PetscFList dMeshList;

extern const char *const iBase_ErrorString[];
extern const char *const iBase_TagValueTypeName[];
Expand Down Expand Up @@ -127,6 +128,7 @@ extern dErr dMeshRegisterAll(const char path[]);
extern dErr dMeshRegister(const char[],const char[],const char[],dErr(*)(dMesh));
extern dErr dMeshSetType(dMesh,const dMeshType);
extern dErr dMeshInitializePackage(const char[]);
extern dErr dMeshFinalizePackage(void);
extern dErr dMeshCreateRuleTagIsotropic(dMesh,dMeshESH,const char*,dInt,dMeshTag*);
extern dErr dMeshDestroyRuleTag(dMesh,dMeshTag);
extern dErr dMeshGetInstance(dMesh,iMesh_Instance*);
Expand Down
20 changes: 14 additions & 6 deletions src/fs/interface/fsreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
PetscLogEvent dLOG_Q1HexComputeQuadrature,dLOG_FSMatSetValuesExpanded;
dClassId dFSROT_CLASSID;
PetscBool dFSRegisterAllCalled;
static PetscFList dFSList;
PetscFList dFSList;
static dBool dFSPackageInitialized;

/**
* These default operations are shared with the DM. We are making a two-level inheritance since there may be different
Expand Down Expand Up @@ -45,7 +46,7 @@ dErr dFSCreate(MPI_Comm comm,dFS *infs)
#endif
{
DM dm;
err = PetscHeaderCreate(dm,_p_dFS,struct _DMOps,DM_CLASSID,0,"DM",comm,DMDestroy,DMView);dCHK(err);
err = PetscHeaderCreate(dm,_p_dFS,struct _DMOps,DM_CLASSID,-1,"DM",comm,DMDestroy,DMView);dCHK(err);
fs = (dFS)dm;
}

Expand Down Expand Up @@ -149,23 +150,30 @@ dErr dFSRegister(const char name[],const char path[],const char cname[],dErr(*cr

dErr dFSInitializePackage(const char path[])
{
static dBool initialized = PETSC_FALSE;
dErr err;

dFunctionBegin;
if (initialized) dFunctionReturn(0);
initialized = PETSC_TRUE;
if (dFSPackageInitialized) dFunctionReturn(0);
dFSPackageInitialized = PETSC_TRUE;
err = MatInitializePackage(path);dCHK(err);
err = DMInitializePackage(path);dCHK(err);
err = PetscClassIdRegister("dFS Rotation",&dFSROT_CLASSID);dCHK(err);

err = PetscLogEventRegister("dQ1HexComputQuad",DM_CLASSID,&dLOG_Q1HexComputeQuadrature);dCHK(err); /* only vaguely related */
err = PetscLogEventRegister("dFSMatSetVExpand",DM_CLASSID,&dLOG_FSMatSetValuesExpanded);dCHK(err);
err = dFSRegisterAll(path);dCHK(err);
err = PetscRegisterFinalize(dFSFinalizePackage);dCHK(err);
dFunctionReturn(0);
}


dErr dFSFinalizePackage(void)
{
dFunctionBegin;
dFSPackageInitialized = dFALSE;
dFSRegisterAllCalled = dFALSE;
dFSList = NULL;
dFunctionReturn(0);
}

dEXTERN_C_BEGIN

Expand Down
23 changes: 16 additions & 7 deletions src/fs/mesh/interface/meshreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
dClassId dMESH_CLASSID;
PetscBool dMeshRegisterAllCalled;
PetscLogEvent dLOG_MeshLoad;
static PetscFList MeshList;
PetscFList dMeshList;
static PetscBool dMeshPackageInitialized;

dErr dMeshCreate(MPI_Comm comm,dMesh *inm)
{
Expand Down Expand Up @@ -34,7 +35,7 @@ dErr dMeshSetFromOptions(dMesh mesh)
err = MPI_Comm_size(((dObject)mesh)->comm,&size);dCHK(err);
err = PetscStrncpy(type,size>1 ? dMESHPACK : dMESHSERIAL,sizeof(type));dCHK(err);
err = PetscOptionsBegin(((PetscObject)mesh)->comm,((PetscObject)mesh)->prefix,"Mesh (dMesh) options","dMesh");dCHK(err);
err = PetscOptionsList("-dmesh_type","Mesh type","dMeshSetType",MeshList,type,type,sizeof(type),&flg);dCHK(err);
err = PetscOptionsList("-dmesh_type","Mesh type","dMeshSetType",dMeshList,type,type,sizeof(type),&flg);dCHK(err);
if (flg || !((dObject)mesh)->type_name) {
err = dMeshSetType(mesh,type);dCHK(err);
}
Expand Down Expand Up @@ -62,7 +63,7 @@ dErr dMeshSetType(dMesh mesh,const dMeshType type)
err = PetscTypeCompare((PetscObject)mesh,type,&match);dCHK(err);
if (match) dFunctionReturn(0);
if (!dMeshRegisterAllCalled) {err = dMeshRegisterAll(NULL);dCHK(err);}
err = PetscFListFind(MeshList,((PetscObject)mesh)->comm,type,dTRUE,(void(**)(void))&r);dCHK(err);
err = PetscFListFind(dMeshList,((PetscObject)mesh)->comm,type,dTRUE,(void(**)(void))&r);dCHK(err);
if (!r) dERROR(PETSC_COMM_SELF,1,"Unable to find requested dMesh type %s",type);
if (mesh->ops->destroy) { err = (*mesh->ops->destroy)(mesh);dCHK(err); }
err = (*r)(mesh);dCHK(err);
Expand All @@ -77,24 +78,32 @@ dErr dMeshRegister(const char name[],const char path[],const char cname[],dErr(*

dFunctionBegin;
err = PetscFListConcat(path,cname,fullname);dCHK(err);
err = PetscFListAdd(&MeshList,name,fullname,(void (*)(void))create);dCHK(err);
err = PetscFListAdd(&dMeshList,name,fullname,(void (*)(void))create);dCHK(err);
dFunctionReturn(0);
}

dErr dMeshInitializePackage(const char path[])
{
static dBool initialized = PETSC_FALSE;
dErr err;

dFunctionBegin;
if (initialized) dFunctionReturn(0);
initialized = PETSC_TRUE;
if (dMeshPackageInitialized) dFunctionReturn(0);
dMeshPackageInitialized = PETSC_TRUE;
err = PetscClassIdRegister("Mesh",&dMESH_CLASSID);dCHK(err);
err = dMeshRegisterAll(path);dCHK(err);
err = PetscLogEventRegister("dMeshLoad", dMESH_CLASSID,&dLOG_MeshLoad);dCHK(err);
err = PetscRegisterFinalize(dMeshFinalizePackage);dCHK(err);
dFunctionReturn(0);
}

dErr dMeshFinalizePackage(void)
{
dFunctionBegin;
dMeshPackageInitialized = dFALSE;
dMeshList = NULL;
dMeshRegisterAllCalled = dFALSE;
dFunctionReturn(0);
}

dEXTERN_C_BEGIN

Expand Down
2 changes: 1 addition & 1 deletion src/fs/tests/stokes.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ static const char help[] = "Solve non-Newtonian Stokes problem using dual order

#include "stokesimpl.h"

PetscFList StokesCaseList = 0;
PetscFList StokesCaseList = NULL;

#define StokesCaseType char*

Expand Down
20 changes: 16 additions & 4 deletions src/jacobi/interface/jacobi.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ PetscBool dJacobiRegisterAllCalled;

const char *dGaussFamilies[] = {"gauss","lobatto","radau","dGaussFamily","dGAUSS_",0};

static PetscFList dJacobiList;
static dBool dJacobiPackageInitialized;
PetscFList dJacobiList = NULL;

static const struct _dJacobiOps _defaultOps = {
.View = 0,
Expand Down Expand Up @@ -192,18 +193,29 @@ dErr dJacobiRegisterAll(const char path[])

dErr dJacobiInitializePackage(const char path[])
{
static dBool initialized = PETSC_FALSE;
dErr err;

dFunctionBegin;
if (initialized) dFunctionReturn(0);
if (dJacobiPackageInitialized) dFunctionReturn(0);
dJacobiPackageInitialized = dTRUE;
err = PetscClassIdRegister("Jacobi context",&dJACOBI_CLASSID);dCHK(err);
err = PetscClassIdRegister("Quadrature context",&dQUADRATURE_CLASSID);dCHK(err);
err = PetscLogEventRegister("dEFSApply", dJACOBI_CLASSID,&dLOG_EFSApply);dCHK(err);
err = PetscLogEventRegister("dRuleComputeGeom",dJACOBI_CLASSID,&dLOG_RuleComputeGeometry);dCHK(err);
err = dJacobiRegisterAll(path);dCHK(err);
err = dQuadratureRegisterAll(path);dCHK(err);
initialized = PETSC_TRUE;
err = PetscRegisterFinalize(dJacobiFinalizePackage);dCHK(err);
dFunctionReturn(0);
}

dErr dJacobiFinalizePackage(void)
{
dFunctionBegin;
dJacobiPackageInitialized = dFALSE;
dJacobiList = NULL;
dQuadratureList = NULL;
dJacobiRegisterAllCalled = dFALSE;
dQuadratureRegisterAllCalled = dFALSE;
dFunctionReturn(0);
}

Expand Down
2 changes: 1 addition & 1 deletion src/jacobi/interface/quadrature.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include <dohpjacimpl.h>
#include <dohp.h>

static PetscFList dQuadratureList;
PetscFList dQuadratureList;
PetscBool dQuadratureRegisterAllCalled;

const char *const dQuadratureMethods[] = {"FAST","SPARSE","SELF","dQuadratureMethod","dQUADRATURE_METHOD_",0};
Expand Down

0 comments on commit 72a9ceb

Please sign in to comment.