Skip to content

Commit

Permalink
Restructure viewing of mesh from DHM
Browse files Browse the repository at this point in the history
* Move dMeshView() and related to meshview.c
* Add dMeshView_DHM()
* Add dViewerDHMGetReferenceMesh() to reference the mesh
* Promote src/viewer/dhm.h to include/dohpviewerdhm.h
  • Loading branch information
jedbrown committed Jun 14, 2011
1 parent 3cef138 commit 01c11f5
Show file tree
Hide file tree
Showing 7 changed files with 261 additions and 207 deletions.
1 change: 1 addition & 0 deletions include/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ install_files (/include FILES
dohpmesh.h
dohpvec.h
dohpviewer.h
dohpviewerdhm.h
dohpstring.h # safer string handling, entirely optional
dohpsys.h # needed for user 'main', not usually otherwise
dohp.h # macros, optional for users, used heavily internally
Expand Down
10 changes: 5 additions & 5 deletions src/viewer/dhm.h → include/dohpviewerdhm.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
/**
* @file dhm.h
* @author Jed Brown <jed@59A2.org>
* @date Sat Oct 24 17:20:17 2009
*
* @brief DHM is format for storing Dohp vectors in HDF5 with reference to iMesh.
* @brief DHM is a format for storing Dohp vectors in HDF5 with reference to iMesh.
*
* This is a Multiple Time Multiple Domain format. A mesh defines the macro-topology, but can be a heavy object to
* duplicate at every time step, and this duplication is clumsy to deal with for certain applications because it's not
Expand Down Expand Up @@ -103,4 +99,8 @@ extern dErr dH5Dopen(hid_t loc_id,const char *name,hid_t dapl_id,hid_t *dset);
extern dErr dH5Gopen(hid_t loc_id,const char *name,hid_t dapl_id,hid_t *grp);
extern dErr dH5Aopen(hid_t obj_id,const char *name,hid_t aapl_id,hid_t *attr);

/* Uses HDF5 */
extern dErr dViewerDHMGetReferenceMesh(PetscViewer viewer,dMesh mesh,hobj_ref_t *mref);
extern dErr dViewerDHMGetMeshGroup(PetscViewer viewer,dMesh mesh,hid_t *meshgrp);

#endif
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ list (APPEND Dohp_SRCS
list (APPEND Dohp_SRCS
fs/mesh/interface/mesh.c
fs/mesh/interface/meshreg.c
fs/mesh/interface/meshview.c
fs/mesh/interface/genblock.c
fs/mesh/impls/pack/pack.c
fs/mesh/impls/serial/serial.c)
Expand Down
56 changes: 3 additions & 53 deletions src/fs/impls/cont/contviewdhm.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include <dohpfs.h>
#include <dohpvec.h>
#include <dohpstring.h>
#include <dohpviewerdhm.h>
#include "cont.h"
#include "../../../viewer/dhm.h"

#include <libgen.h> /* dirname() */

Expand Down Expand Up @@ -57,61 +57,12 @@ dErr dFSView_Cont_DHM(dFS fs,dViewer viewer)
{
/* dFS_Cont *cont = fs->data; */
dViewer_DHM *dhm = viewer->data;
const char *meshname;
char mstatestr[16];
dInt meshstate;
herr_t herr;
htri_t hflg;
hid_t meshgrp;
dErr err;
dIInt ierr;

dFunctionBegin;
err = dViewerDHMSetUp(viewer);dCHK(err);
/* Check if current mesh has been written */
err = PetscObjectGetName((dObject)fs->mesh,&meshname);dCHK(err);
err = PetscObjectStateQuery((dObject)fs->mesh,&meshstate);dCHK(err);
hflg = H5Lexists(dhm->meshroot,meshname,H5P_DEFAULT);dH5CHK(hflg,H5Lexists);
if (!hflg) {
meshgrp = H5Gcreate(dhm->meshroot,meshname,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);dH5CHK(meshgrp,H5Gcreate);
} else {
meshgrp = H5Gopen(dhm->meshroot,meshname,H5P_DEFAULT);dH5CHK(meshgrp,H5Gopen);
}
err = PetscSNPrintf(mstatestr,sizeof mstatestr,"%03d",meshstate);dCHK(err);
#if defined dH5_USE_EXTERNAL_LINK
hflg = H5Lexists(meshgrp,mstatestr,H5P_DEFAULT);dH5CHK(hflg,H5Lexists);
#else
hflg = H5Aexists(meshgrp,mstatestr);dH5CHK(hflg,H5Lexists);
hflg = 0; /* Why can't I just check if the dataset exists? */
#endif
if (!hflg) { /* Save mesh to external file and create link to it */
const char *dhmpath;
char dhmpathbuf[dMAX_PATH_LEN],imeshpath[dMAX_PATH_LEN],*imeshpath_ptr = imeshpath;
iMesh_Instance mi;
dInt slash,dot;
err = PetscViewerFileGetName(viewer,&dhmpath);dCHK(err);
err = dStrcpyS(dhmpathbuf,sizeof dhmpathbuf,dhmpath);dCHK(err);
err = dFilePathSplit(dhmpathbuf,&slash,&dot);dCHK(err);
dhmpathbuf[dot] = 0; // gets everything but the final '.'
err = PetscSNPrintf(imeshpath,sizeof imeshpath,"%s-imesh-%s-%03d.h5m",dhmpathbuf,meshname,meshstate);dCHK(err);
err = dMeshGetInstance(fs->mesh,&mi);dCHK(err);
iMesh_save(mi,0,imeshpath,"",&ierr,(int)strlen(imeshpath),0);dICHK(mi,ierr);
#if defined dH5_USE_EXTERNAL_LINK
herr = H5Lcreate_external(imeshpath,"tstt",meshgrp,mstatestr,H5P_DEFAULT,H5P_DEFAULT);dH5CHK(hflg,H5Lcreate_external);
#else
{
hid_t fstring,mstring,sspace,strattr;
err = dViewerDHMGetStringTypes(viewer,&fstring,&mstring,&sspace);dCHK(err);
hflg = H5Lexists(meshgrp,mstatestr,H5P_DEFAULT);dH5CHK(hflg,H5Lexists);
if (!hflg) {
strattr = H5Dcreate(meshgrp,mstatestr,fstring,sspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT);dH5CHK(strattr,H5Dcreate);
herr = H5Dwrite(strattr,mstring,sspace,sspace,H5P_DEFAULT,&imeshpath_ptr);dH5CHK(herr,H5Dwrite);
herr = H5Dclose(strattr);dH5CHK(strattr,H5Dclose);
}
}
#endif
}

err = dMeshView(fs->mesh,viewer);dCHK(err);
{
dht_FS fs5;
dht_Field *field5;
Expand All @@ -125,7 +76,7 @@ dErr dFSView_Cont_DHM(dFS fs,dViewer viewer)
err = dMeshGetTagName(fs->mesh,fs->tag.partition,&fs5.partition);dCHK(err);
err = dMeshGetTagName(fs->mesh,fs->tag.orderedsub,&fs5.ordered_subdomain);dCHK(err);
err = dMeshGetTagName(fs->mesh,fs->tag.bstatus,&fs5.bstatus);dCHK(err);
herr = H5Rcreate(&fs5.mesh,meshgrp,mstatestr,H5R_OBJECT,-1);dH5CHK(herr,H5Rcreate);
err = dViewerDHMGetReferenceMesh(viewer,fs->mesh,&fs5.mesh);dCHK(err);
fs5.time = dhm->time;
err = dFSGetBlockSize(fs,&bs);dCHK(err);
err = PetscObjectStateQuery((PetscObject)fs,&fs5.internal_state);dCHK(err);
Expand Down Expand Up @@ -154,7 +105,6 @@ dErr dFSView_Cont_DHM(dFS fs,dViewer viewer)

/* \todo We need a way to identify the active set in MOAB's file if the FS was only defined on a subset. */

herr = H5Gclose(meshgrp);dH5CHK(herr,H5Gclose);
dFunctionReturn(0);
}

Expand Down
149 changes: 1 addition & 148 deletions src/fs/mesh/interface/mesh.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include <dohpmeshimpl.h>
#include <dohpgeom.h>
#include <dohpviewer.h>
#include <iMesh_extensions.h>
#include <MBParallelConventions.h>
#include <ctype.h> /* needed for isprint() */

const char *const iBase_ErrorString[] = {
[iBase_SUCCESS] = "iBase_SUCCESS",
Expand Down Expand Up @@ -922,153 +922,6 @@ dErr dMeshInferIntermediateAdjacencies(dMesh mesh)
dFunctionReturn(0);
}

dErr dMeshView(dMesh m,PetscViewer viewer)
{
const char *type;
dBool iascii;
dErr err;

dFunctionBegin;
PetscValidHeaderSpecific(m,dMESH_CLASSID,1);
if (!viewer) {
err = PetscViewerASCIIGetStdout(((PetscObject)m)->comm,&viewer);dCHK(err);
}
PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
PetscCheckSameComm(m,1,viewer,2);
err = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);dCHK(err);
if (iascii) {
err = PetscObjectGetType((PetscObject)m,&type);dCHK(err);
if (((PetscObject)m)->prefix) {
err = PetscViewerASCIIPrintf(viewer,"dMesh object:(%s)\n",((PetscObject)m)->prefix);dCHK(err);
} else {
err = PetscViewerASCIIPrintf(viewer,"dMesh object:\n");dCHK(err);
}
err = PetscViewerASCIIPrintf(viewer,"Mesh type: %s\n",(type ? type : "not yet set"));dCHK(err);
err = PetscViewerASCIIPrintf(viewer,"Internal count by type: V=%d E=%d F=%d R=%d\n",m->v.s,m->e.s,m->f.s,m->r.s);dCHK(err);
err = dMeshSetView(m,m->root,viewer);dCHK(err);
if (m->ops->view) {
err = PetscViewerASCIIPushTab(viewer);dCHK(err);
err = (*m->ops->view)(m,viewer);dCHK(err);
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
}
} else {
if (m->ops->view) {
err = (*m->ops->view)(m,viewer);dCHK(err);
}
}
dFunctionReturn(0);
}

dErr dMeshSetView(dMesh m,dMeshESH root,PetscViewer viewer)
{
size_t valuesLen = 256;
char values[256];
iMesh_Instance mi = m->mi;
char *tagname,*z;
int tagtype,tagsize,intdata;
double dbldata;
dMeshEH ehdata;
MeshListTag tag=MLZ;
MeshListData data=MLZ;
MeshListESH esh=MLZ;
dInt i,j,ntopo;
dBool canprint,flg;
dErr err;

dFunctionBegin;
if (!viewer) {err = PetscViewerASCIIGetStdout(((dObject)m)->comm,&viewer);dCHK(err);}
err = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&flg);dCHK(err);
if (!flg) dFunctionReturn(0);
err = PetscViewerASCIIPushTab(viewer);dCHK(err);
{
for (i=iMesh_POINT; i<iMesh_ALL_TOPOLOGIES; i++) {
iMesh_getNumOfTopo(mi,root,i,&ntopo,&err);dICHK(mi,err);
if (ntopo) {
err = PetscViewerASCIIPrintf(viewer,"%20s : %d\n",dMeshEntTopologyName(i),ntopo);dCHK(err);
}
}
}
err = PetscViewerASCIIPopTab(viewer);dCHK(err);

iMesh_getAllEntSetTags(mi,root,&tag.v,&tag.a,&tag.s,&err);dICHK(mi,err);
err = PetscViewerASCIIPrintf(viewer,"Number of tags %d\n",tag.s);dCHK(err);
err = PetscViewerASCIIPushTab(viewer);dCHK(err);
{
for (i=0; i<tag.s; i++) {
err = dMeshGetTagName(m,tag.v[i],&tagname);dCHK(err);
iMesh_getTagType(mi,tag.v[i],&tagtype,&err);dICHK(mi,err);
iMesh_getTagSizeValues(mi,tag.v[i],&tagsize,&err);dICHK(mi,err);
switch (tagtype) { /* this needs a refactor */
case iBase_INTEGER:
iMesh_getEntSetIntData(mi,root,tag.v[i],&intdata,&err);dICHK(mi,err);
err = PetscSNPrintf(values,valuesLen,"%d",intdata);dCHK(err);
break;
case iBase_DOUBLE:
iMesh_getEntSetDblData(mi,root,tag.v[i],&dbldata,&err);dICHK(mi,err);
err = PetscSNPrintf(values,valuesLen,"%f",dbldata);dCHK(err);
break;
case iBase_ENTITY_HANDLE:
iMesh_getEntSetEHData(mi,root,tag.v[i],&ehdata,&err);dICHK(mi,err);
err = PetscSNPrintf(values,valuesLen,"%p",ehdata);dCHK(err);
break;
case iBase_BYTES:
iMesh_getEntSetData(mi,root,tag.v[i],&data.v,&data.a,&data.s,&err);dICHK(mi,err);
canprint = PETSC_TRUE;
for (j=0; j<data.s && ((char*)data.v)[j]; j++) {
if (!isprint(((char*)data.v)[i])) canprint = PETSC_FALSE;
}
if (canprint && false) {
err = PetscSNPrintf(values,(size_t)data.s,"%s",data.v);dCHK(err); /* Just a copy, but ensures a NULL byte */
} else {
z = values;
for (j=0; j<data.s && ((char*)data.v)[j] && (size_t)(z-values) < valuesLen-5; j++) {
err = PetscSNPrintf(z,3,"%02uhhx ",((char*)data.v)[j]);dCHK(err);
z += 3;
if (j%4 == 0) {
*(z++) = ' ';
}
*(z++) = '\0'; /* Terminate the string */
}
}
err = MeshListFree(data);dCHK(err);
break;
default: dERROR(PETSC_COMM_SELF,1,"Invalid tag type, iMesh probably corrupt");
}
err = PetscViewerASCIIPrintf(viewer,"Tag: %30s : %20s [%3d] = %s\n",tagname,iBase_TagValueTypeName[tagtype],tagsize,values);dCHK(err);
err = PetscFree(tagname);dCHK(err);
}
}
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
err = MeshListFree(tag);dCHK(err);

iMesh_getEntSets(mi,root,1,&esh.v,&esh.a,&esh.s,&err);dICHK(mi,err);
err = PetscViewerASCIIPrintf(viewer,"Number of contained Entity Sets: %d\n",esh.s);dCHK(err);

err = PetscViewerASCIIPushTab(viewer);dCHK(err);
for (i=0; i<esh.s; i++) {
err = PetscViewerASCIIPrintf(viewer,"Contained set %d/%d:\n",i+1,esh.s);dCHK(err);
err = PetscViewerASCIIPushTab(viewer);dCHK(err);
err = dMeshSetView(m,esh.v[i],viewer);dCHK(err);
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
}
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
err = MeshListFree(esh);dCHK(err);

iMesh_getChldn(mi,root,1,&esh.v,&esh.a,&esh.s,&err);dICHK(mi,err);
err = PetscViewerASCIIPrintf(viewer,"Number of child Entity Sets: %d\n",esh.s);dCHK(err);

err = PetscViewerASCIIPushTab(viewer);dCHK(err);
for (i=0; i<esh.s; i++) {
err = PetscViewerASCIIPrintf(viewer,"Child %d/%d:\n",i+1,esh.s);dCHK(err);
err = PetscViewerASCIIPushTab(viewer);dCHK(err);
err = dMeshSetView(m,esh.v[i],viewer);dCHK(err);
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
}
err = PetscViewerASCIIPopTab(viewer);dCHK(err);
err = MeshListFree(esh);dCHK(err);
dFunctionReturn(0);
}

dErr dMeshGetInstance(dMesh m,iMesh_Instance *mi)
{

Expand Down

0 comments on commit 01c11f5

Please sign in to comment.