Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 32 additions & 7 deletions src/Mesh/siloMeshDump.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,25 @@ def extractFieldComponents(nodeLists, time, cycle,
metaDataTensorField, extractTensorField, dummyTensorField)
return result

#-------------------------------------------------------------------------------
# Get subdirs for the variable names. They need to be sorted s.t. parent dirs
# are created first.
#-------------------------------------------------------------------------------
def getSubDirs(fieldwad):
dirs = set()
if len(fieldwad) > 0:
for name, desc, type, optlistDef, optlistMV, optlistVar, subvars in fieldwad:
subdirs = name.split("/")[:-1]
for i in range(len(subdirs)):
dirs.add("/".join(subdirs[:i+1]))
return sorted(dirs, key=lambda x: x.count("/"))

#-------------------------------------------------------------------------------
# Return name with / replaced by _
#-------------------------------------------------------------------------------
def unslashify(name):
return name.replace("/", "_")

#-------------------------------------------------------------------------------
# Write the master file.
#-------------------------------------------------------------------------------
Expand All @@ -154,7 +173,10 @@ def writeMasterMeshSiloFile(dirName, mesh, label, nodeLists, time, cycle, fieldw
# Make directories for variables.
assert silo.DBMkDir(db, "CELLS") == 0
assert silo.DBMkDir(db, "POINTS") == 0 # HACK

for d in getSubDirs(fieldwad):
assert silo.DBMkDir(db, "CELLS/" + d) == 0
assert silo.DBMkDir(db, "POINTS/" + d) == 0

# Pattern for constructing per domain variables.
domainNamePatterns = [("%s/domain%i.silo:" % (p1, i)) + "%s" for i in range(mpi.procs) if numZonesPerDomain[i] > 0]
numDomains = len(domainNamePatterns)
Expand Down Expand Up @@ -230,12 +252,12 @@ def writeMasterMeshSiloFile(dirName, mesh, label, nodeLists, time, cycle, fieldw
# Write the variables descriptors.
ucdTypes = vector_of_int([silo.DB_UCDVAR]*numDomains)
for name, desc, type, optlistDef, optlistMV, optlistVar, subvars in fieldwad:
domainVarNames = vector_of_string([p % ("CELLS_" + name) for p in domainNamePatterns])
domainVarNames = vector_of_string([p % ("CELLS_" + unslashify(name)) for p in domainNamePatterns])
assert len(domainVarNames) == numDomains
assert silo.DBPutMultivar(db, "CELLS/" + name, domainVarNames, ucdTypes, optlistMV) == 0
if desc != None:
for subname, vals in subvars:
domainVarNames = vector_of_string([p % ("CELLS_" + subname) for p in domainNamePatterns])
domainVarNames = vector_of_string([p % ("CELLS_" + unslashify(subname)) for p in domainNamePatterns])
assert len(domainVarNames) == numDomains
assert silo.DBPutMultivar(db, "CELLS/" + subname, domainVarNames, ucdTypes, optlistVar) == 0

Expand All @@ -245,14 +267,14 @@ def writeMasterMeshSiloFile(dirName, mesh, label, nodeLists, time, cycle, fieldw
# for name, desc, type, optlistDef, optlistMV, optlistVar, subvars in fieldwad:
# domainVarNames = []
# for p in domainNamePatterns:
# domainVarNames.append(p % ("POINTS_" + name))
# domainVarNames.append(p % ("POINTS_" + unslashify(name)))
# assert len(domainVarNames) == numDomains
# assert silo.DBPutMultivar(db, "POINTS/" + name, domainVarNames, ptTypes, optlistMV) == 0
# if desc != None:
# for subname, vals in subvars:
# domainVarNames = []
# for p in domainNamePatterns:
# domainVarNames.append(p % ("POINTS_" + subname))
# domainVarNames.append(p % ("POINTS_" + unslashify(subname)))
# assert len(domainVarNames) == numDomains
# assert silo.DBPutMultivar(db, "POINTS/" + subname, domainVarNames, ptTypes, optlistVar) == 0

Expand Down Expand Up @@ -293,6 +315,9 @@ def writeDomainMeshSiloFile(dirName, mesh, index2zone, label, nodeLists, time, c
# Make directories for variables.
assert silo.DBMkDir(db, "CELLS") == 0
assert silo.DBMkDir(db, "POINTS") == 0 # HACK
for d in getSubDirs(fieldwad):
assert silo.DBMkDir(db, "CELLS/" + d) == 0
assert silo.DBMkDir(db, "POINTS/" + d) == 0

# Determine our dimensionality
if isinstance(mesh, polytope.Tessellation2d):
Expand Down Expand Up @@ -403,7 +428,7 @@ def writeDomainMeshSiloFile(dirName, mesh, index2zone, label, nodeLists, time, c
ctor = vector_of_double
else:
ctor = vector_of_int
assert silo.DBPutUcdvar1(db, "CELLS_" + subname, "MESH", ctor(vals), ctor([]), silo.DB_ZONECENT, varOpts) == 0
assert silo.DBPutUcdvar1(db, "CELLS_" + unslashify(subname), "MESH", ctor(vals), ctor([]), silo.DB_ZONECENT, varOpts) == 0

# print " --> %g sec to DBPutUcdvar1" % (TIME.clock() - start)
# start = TIME.clock()
Expand All @@ -419,7 +444,7 @@ def writeDomainMeshSiloFile(dirName, mesh, index2zone, label, nodeLists, time, c
# ctor = vector_of_double
# else:
# ctor = vector_of_int
# assert silo.DBPutPointvar1(db, "POINTS_" + subname, "PointMESH", ctor(vals), varOpts) == 0
# assert silo.DBPutPointvar1(db, "POINTS_" + unslashify(subname), "PointMESH", ctor(vals), varOpts) == 0

# print " --> %g sec to DBPutPointvar1" % (TIME.clock() - start)
# start = TIME.clock()
Expand Down
2 changes: 1 addition & 1 deletion src/PYB11/Silo/SiloWrappers.hh
Original file line number Diff line number Diff line change
Expand Up @@ -1392,7 +1392,7 @@ DBPutPointmesh(DBfile& file,

// Preconditions.
const unsigned ndims = coords.size();
VERIFY(ndims == 2 or ndims == 3);
VERIFY(ndims == 1 or ndims == 2 or ndims == 3);
const unsigned npoints = coords[0].size();
for (unsigned idim = 0; idim != ndims; ++idim) VERIFY(coords[idim].size() == npoints);

Expand Down
83 changes: 59 additions & 24 deletions src/SimulationControl/siloPointmeshDump.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import os, mpi
from Spheral import *
from SpheralCompiledPackages import silo
from siloMeshDump import getSubDirs, unslashify

#-------------------------------------------------------------------------------
# siloPointMeshDump -- this is the one the user should actually call!
Expand Down Expand Up @@ -45,10 +46,10 @@ def siloPointmeshDump(baseName,
os.makedirs(dire)
mpi.barrier()

# We can only pretend this is an RZ mesh if it's 2D.
# Check dimensionality.
ndim = dimension(nodeLists[0])
if not ndim in (2, 3):
raise ValueError("You need to provide 2D or 3D information for siloPointMeshDump.")
if not ndim in (1, 2, 3):
raise ValueError("You need to provide 1D, 2D or 3D information for siloPointMeshDump.")

# Characterize the fields we're going to write.
allfields = fields[:]
Expand All @@ -68,7 +69,7 @@ def siloPointmeshDump(baseName,
elif isinstance(f, eval("SymTensorField%id" % ndim)):
symTensorFields.append(f)
else:
print("siloPointmeshDump WARNING: ignoring unknown field type.")
print("siloPointmeshDump WARNING: ignoring unknown field type: %s" % type(f).__name__)

# For any tensor fields, dump the trace, determinant, min, and max eigen values.
for f in (tensorFields + symTensorFields):
Expand Down Expand Up @@ -96,9 +97,9 @@ def siloPointmeshDump(baseName,
# If we're domain 0 we write the master file.
writeMasterSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeLists, label, time, cycle, dumpGhosts, fieldwad)

# Each domain writes it's domain file.
# Each domain writes its domain file.
writeDomainSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeLists, label, time, cycle, dumpGhosts, fieldwad)

#-------------------------------------------------------------------------------
# Extract the fields we're going to write. This requires exploding vector and
# tensor fields into their components.
Expand Down Expand Up @@ -178,6 +179,10 @@ def writeMasterSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeList
assert optlist.addOption(silo.DBOPT_MATNOS, silo.DBOPT_NMATNOS, vector_of_int(matnos)) == 0
assert silo.DBPutMultimat(db, "MATERIAL", vector_of_string(material_names), optlist) == 0

# Create directories for any fields that have slashes in their names
for d in getSubDirs(fieldwad):
silo.DBMkDir(db, d)

# Write the variable descriptions for non-scalar variables (vector and tensors).
writeDefvars(db, fieldwad)

Expand All @@ -190,7 +195,7 @@ def writeMasterSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeList
for iproc, p in enumerate(domainNamePatterns):
nvals = mpi.bcast(nlocalvals, root=iproc)
if nvals > 0:
domainVarNames.append(p % name)
domainVarNames.append(p % unslashify(name))
else:
domainVarNames.append("EMPTY")
assert len(domainVarNames) == ndoms
Expand All @@ -202,7 +207,7 @@ def writeMasterSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeList
for iproc, p in enumerate(domainNamePatterns):
nvals = mpi.bcast(nlocalvals, root=iproc)
if nvals > 0:
domainVarNames.append(p % subname)
domainVarNames.append(p % unslashify(subname))
else:
domainVarNames.append("EMPTY")
assert len(domainVarNames) == ndoms
Expand Down Expand Up @@ -285,6 +290,10 @@ def writeDomainSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeList
# Write the variable descriptions for non-scalar variables (vector and tensors).
writeDefvars(db, fieldwad)

# Create directories for any fields that have slashes in their names
for d in getSubDirs(fieldwad):
silo.DBMkDir(db, d)

# Write the field components.
varOpts = silo.DBoptlist(1024)
assert varOpts.addOption(silo.DBOPT_CYCLE, cycle) == 0
Expand All @@ -296,7 +305,7 @@ def writeDomainSiloFile(ndim, baseDirectory, baseName, procDirBaseName, nodeList
ctor = vector_of_double
else:
ctor = vector_of_int
assert silo.DBPutPointvar1(db, subname, "mesh", ctor(vals), varOpts) == 0
assert silo.DBPutPointvar1(db, unslashify(subname), "mesh", ctor(vals), varOpts) == 0

# That's it.
assert silo.DBClose(db) == 0
Expand Down Expand Up @@ -418,9 +427,15 @@ def metaDataScalarField(name, time, cycle, dim):
#-------------------------------------------------------------------------------
def extractVectorField(name, field, vals, dim):
assert len(vals) == dim or len(vals) == 0
assert dim in (2,3)
assert dim in (1,2,3)

if dim == 2:
if dim == 1:
if vals == []:
vals = [["%s_x" % name, vector_of_double()]]
for v in field:
vals[0][1].append(v.x)

elif dim == 2:
if vals == []:
vals = [["%s_x" % name, vector_of_double()],
["%s_y" % name, vector_of_double()]]
Expand All @@ -442,9 +457,11 @@ def extractVectorField(name, field, vals, dim):

def dummyVectorField(name, n, vals, dim):
assert len(vals) == dim or len(vals) == 0
assert dim in (2,3)
assert dim in (1,2,3)
if vals == []:
if dim == 2:
if dim == 1:
vals = [["%s_x" % name, vector_of_double([0.0]*n)]]
elif dim == 2:
vals = [["%s_x" % name, vector_of_double([0.0]*n)],
["%s_y" % name, vector_of_double([0.0]*n)]]
else:
Expand All @@ -457,18 +474,23 @@ def dummyVectorField(name, n, vals, dim):
return vals

def metaDataVectorField(name, time, cycle, dim):
assert dim in (2,3)
assert dim in (1,2,3)
optlistDef = silo.DBoptlist()
optlistMV = silo.DBoptlist()
optlistVar = silo.DBoptlist()
for optlist in (optlistDef, optlistMV, optlistVar):
assert optlist.addOption(silo.DBOPT_CYCLE, cycle) == 0
assert optlist.addOption(silo.DBOPT_DTIME, time) == 0
assert optlistMV.addOption(silo.DBOPT_TENSOR_RANK, silo.DB_VARTYPE_VECTOR) == 0
assert optlistVar.addOption(silo.DBOPT_HIDE_FROM_GUI, 1) == 0
# For 1D, don't hide components
if dim > 1:
assert optlistVar.addOption(silo.DBOPT_HIDE_FROM_GUI, 1) == 0
assert optlistVar.addOption(silo.DBOPT_TENSOR_RANK, silo.DB_VARTYPE_SCALAR) == 0

if dim == 2:
if dim == 1:
return ("{%s_x}" % name, silo.DB_VARTYPE_VECTOR,
optlistDef, optlistMV, optlistVar)
elif dim == 2:
return ("{%s_x, %s_y}" % (name, name), silo.DB_VARTYPE_VECTOR,
optlistDef, optlistMV, optlistVar)
else:
Expand All @@ -480,8 +502,14 @@ def metaDataVectorField(name, time, cycle, dim):
#-------------------------------------------------------------------------------
def extractTensorField(name, field, vals, dim):
assert len(vals) == dim*dim or len(vals) == 0
assert dim in (2,3)
if dim == 2:
assert dim in (1,2,3)
if dim == 1:
if vals == []:
vals = [["%s_xx" % name, vector_of_double()]]
for t in field:
vals[0][1].append(t.xx)

elif dim == 2:
if vals == []:
vals = [["%s_xx" % name, vector_of_double()],
["%s_xy" % name, vector_of_double()],
Expand Down Expand Up @@ -511,9 +539,11 @@ def extractTensorField(name, field, vals, dim):

def dummyTensorField(name, n, vals, dim):
assert len(vals) == dim*dim or len(vals) == 0
assert dim in (2,3)
assert dim in (1,2,3)
if vals == []:
if dim == 2:
if dim == 1:
vals = [["%s_xx" % name, vector_of_double([0.0]*n)]]
elif dim == 2:
vals = [["%s_xx" % name, vector_of_double([0.0]*n)],
["%s_xy" % name, vector_of_double([0.0]*n)],
["%s_yx" % name, vector_of_double([0.0]*n)],
Expand All @@ -534,18 +564,23 @@ def dummyTensorField(name, n, vals, dim):
return vals

def metaDataTensorField(name, time, cycle, dim):
assert dim in (2,3)
assert dim in (1,2,3)
optlistDef = silo.DBoptlist()
optlistMV = silo.DBoptlist()
optlistVar = silo.DBoptlist()
for optlist in (optlistDef, optlistMV, optlistVar):
assert optlist.addOption(silo.DBOPT_CYCLE, cycle) == 0
assert optlist.addOption(silo.DBOPT_DTIME, time) == 0
assert optlistMV.addOption(silo.DBOPT_TENSOR_RANK, silo.DB_VARTYPE_TENSOR) == 0
assert optlistVar.addOption(silo.DBOPT_HIDE_FROM_GUI, 1) == 0
# For 1D, don't hide components
if dim > 1:
assert optlistVar.addOption(silo.DBOPT_HIDE_FROM_GUI, 1) == 0
assert optlistVar.addOption(silo.DBOPT_TENSOR_RANK, silo.DB_VARTYPE_SCALAR) == 0

if dim == 2:
if dim == 1:
return ("{%s_xx}" % name, silo.DB_VARTYPE_TENSOR,
optlistDef, optlistMV, optlistVar)
elif dim == 2:
return ("{{%s_xx, %s_xy}, {%s_yx, %s_yy}}" % (name, name, name, name), silo.DB_VARTYPE_TENSOR,
optlistDef, optlistMV, optlistVar)
else:
Expand All @@ -562,7 +597,7 @@ def writeDefvars(db, fieldwad):
for name, desc, type, optlistDef, optlistMV, optlistVar, subvars in fieldwad:
if desc != None:
assert optlistDef != None
assert len(subvars) > 1
assert len(subvars) > 0
names.append(name)
defs.append(desc)
types.append(type)
Expand Down