def writeDomainSiloFile(ndim, maxproc, baseDirectory, baseName, procDir, materials, vars, xminblock, xmaxblock, nblock, jsplit, label, time, cycle, pretendRZ): assert jsplit < ndim # Make sure the directories are there. if mpi.rank == 0: for iproc in xrange(maxproc): pth = os.path.join(baseDirectory, procDir) if not os.path.exists(pth): os.makedirs(pth) mpi.barrier() # Is there anything to do? if mpi.rank < maxproc: numZones = 1 numNodes = 1 nblocknodes = list(nblock) for i, x in enumerate(nblock): numZones *= x numNodes *= x + 1 nblocknodes[i] = x + 1 assert numZones > 0 # Make a vector<int> version of nblock nblock_vec = Spheral.vector_of_int(nblock) # Create the file. fileName = os.path.join(baseDirectory, procDir, "domain%i.silo" % mpi.rank) f = silo.DBCreate(fileName, silo.DB_CLOBBER, silo.DB_LOCAL, label, silo.DB_HDF5) nullOpts = silo.DBoptlist() # Make the hblk0 directory. assert silo.DBMkDir(f, "hblk0") == 0 # Write the domain mesh. coords = Spheral.vector_of_vector_of_double( [Spheral.vector_of_double()] * ndim) for jdim in xrange(ndim): coords[jdim] = Spheral.vector_of_double([0.0] * nblocknodes[jdim]) dx = (xmaxblock[jdim] - xminblock[jdim]) / nblock[jdim] for i in xrange(nblocknodes[jdim]): coords[jdim][i] = xminblock[jdim] + i * dx optlist = silo.DBoptlist() assert optlist.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert optlist.addOption(silo.DBOPT_DTIME, time) == 0 if pretendRZ: assert optlist.addOption(silo.DBOPT_COORDSYS, silo.DB_CYLINDRICAL) == 0 else: assert optlist.addOption(silo.DBOPT_COORDSYS, silo.DB_CARTESIAN) == 0 assert silo.DBPutQuadmesh(f, "hblk0/hydro_mesh", coords, optlist) == 0 # Write materials. if materials: matnos = Spheral.vector_of_int(range(len(materials) + 1)) assert len(matnos) == len(materials) + 1 matlist = Spheral.vector_of_int([0] * numZones) matnames = Spheral.vector_of_string(["void"]) for imat, nodeList in enumerate(materials): for i in xrange(numZones): if vars[0][0][i] > 0.0: matlist[i] = imat + 1 matnames.append(nodeList.name) assert len(matlist) == numZones assert len(matnames) == len(materials) + 1 matOpts = silo.DBoptlist(1024) assert matOpts.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert matOpts.addOption(silo.DBOPT_DTIME, time) == 0 assert matOpts.addOption(silo.DBOPT_MATNAMES, silo.DBOPT_NMATNOS, matnames) == 0 assert silo.DBPutMaterial(f, "hblk0/Materials", "hydro_mesh", matnos, matlist, nblock_vec, Spheral.vector_of_int(), Spheral.vector_of_int(), Spheral.vector_of_int(), Spheral.vector_of_double(), matOpts) == 0 # Write the field variables. varOpts = silo.DBoptlist(1024) assert varOpts.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert varOpts.addOption(silo.DBOPT_DTIME, time) == 0 for var, varname in vars: assert len(var) == numZones assert silo.DBPutQuadvar1(f, "hblk0/" + varname, "hydro_mesh", var, Spheral.vector_of_double(), silo.DB_ZONECENT, nblock_vec, varOpts) == 0 # That's it. assert silo.DBClose(f) == 0 del f return
def hadesDump1(integrator, nsample, xmin, xmax, W, isotopes, baseFileName, baseDirectory=".", mask=None, dumpGhosts=True, materials="all"): # We currently only support 3-D. assert isinstance(integrator, Spheral.Integrator3d) assert len(nsample) == 3 assert isinstance(xmin, Spheral.Vector3d) assert isinstance(xmax, Spheral.Vector3d) assert isinstance(W, Spheral.TableKernel3d) for x in isotopes: for xx in x: assert len(xx) == 2 # Prepare to time how long this takes. t0 = time.clock() # Extract the data base. db = integrator.dataBase() # If requested, set ghost node info. if dumpGhosts and not integrator is None: state = Spheral.State3d(db, integrator.physicsPackages()) derivs = Spheral.StateDerivatives3d(db, integrator.physicsPackages()) integrator.setGhostNodes() integrator.applyGhostBoundaries(state, derivs) # Get the set of material names we're going to write. if materials == "all": materials = [n for n in db.fluidNodeLists()] assert len(materials) == len(isotopes) # HACK! We are currently restricting to writing single material output! assert len(materials) == 1 # Make sure the output directory exists. import mpi import os if mpi.rank == 0 and not os.path.exists(baseDirectory): try: os.makedirs(baseDirectory) except: raise "Cannot create output directory %s" % baseDirectory mpi.barrier() # Write the density header file. print "hadesDump: writing density header..." if mpi.rank == 0: filename = os.path.join(baseDirectory, baseFileName + ".spr") f = open(filename, "w") f.write("3\n") for i in xrange(3): f.write("%i\n" % nsample[i]) f.write("%f\n" % xmin(i)) f.write("%f\n" % ((xmax(i) - xmin(i)) / nsample[i])) f.write("3\n") f.close() mpi.barrier() # Sample the density. ntot = nsample[0] * nsample[1] * nsample[2] for nodes in materials: print "hadesDump: sampling density for %s..." % nodes.name r = Spheral.VectorFieldList3d() H = Spheral.SymTensorFieldList3d() rho = Spheral.ScalarFieldList3d() r.appendField(nodes.positions()) w.appendField(nodes.weight()) H.appendField(nodes.Hfield()) rho.appendField(nodes.massDensity()) w = Spheral.ScalarFieldList3d() w.copyFields() w.appendField(Spheral.ScalarField3d("weight", nodes, 1.0)) fieldListSet = Spheral.FieldListSet3d() fieldListSet.ScalarFieldLists.append(rho) localMask = Spheral.IntFieldList3d() if mask is None: localMask.copyFields() localMask.appendField(Spheral.IntField3d("mask", nodes, 1)) else: localMask.appendField(mask.fieldForNodeList(nodes)) scalar_samples = Spheral.vector_of_vector_of_double() vector_samples = Spheral.vector_of_vector_of_Vector3d() tensor_samples = Spheral.vector_of_vector_of_Tensor3d() symTensor_samples = Spheral.vector_of_vector_of_SymTensor3d() nsample_vec = Spheral.vector_of_int(3) for i in xrange(3): nsample_vec[i] = nsample[i] Spheral.sampleMultipleFields2Lattice3d(fieldListSet, r, w, H, localMask, W, xmin, xmax, nsample_vec, scalar_samples, vector_samples, tensor_samples, symTensor_samples) print "Generated %i scalar fields" % len(scalar_samples) rhosamp = scalar_fields[0] nlocal = len(rhosamp) assert mpi.allreduce(nlocal, mpi.SUM) == ntot print "hadesDump: writing density for %s..." % nodes.name filename = os.path.join(baseDirectory, baseFileName + ".sdt") for sendProc in xrange(mpi.procs): if mpi.rank == sendProc: f = open(filename, "ab") f.write(struct.pack(nlocal * "f", *tuple(rhosamp))) f.close() mpi.barrier() # Write the material arrays. print "hadesDump: writing material flags..." filename = os.path.join(baseDirectory, baseFileName + "_mat.sdt") for sendProc in xrange(mpi.procs): if mpi.rank == sendProc: f = open(filename, "ab") f.write(struct.pack(nlocal * "i", *(nlocal * (1, )))) f.close() mpi.barrier() # Write the isotopes. print "hadesDump: writing isotopics..." if mpi.rank == 0: filename = os.path.join(baseDirectory, "isos.mat") f = open(filename, "w") i = 0 for isofracs in isotopes: f.write("isofrac(%i) =" % i) for (iso, frac) in isofracs: f.write(" %i %f" % (iso, frac)) f.write("\n") i += 1 f.close() mpi.barrier() mpi.barrier() print "hadesDump finished: required %0.2f seconds" % (time.clock() - t0) return
def writeMasterSiloFile(ndim, nblock, jsplit, baseDirectory, baseName, procDir, materials, vars, label, time, cycle): nullOpts = silo.DBoptlist() # Decide which domains have information. if len(vars[0][0]) > 0: myvote = mpi.rank + 1 else: myvote = 0 maxproc = mpi.allreduce(myvote, mpi.MAX) assert maxproc <= mpi.procs # Pattern for constructing per domain variables. domainNamePatterns = [ os.path.join(procDir, "domain%i.silo:%%s" % i) for i in xrange(maxproc) ] # We need each domains nblock info. nblocks = [nblock] for sendproc in xrange(1, maxproc): if mpi.rank == sendproc: mpi.send(nblock, dest=0, tag=50) if mpi.rank == 0: nblocks.append(mpi.recv(source=sendproc, tag=50)[0]) # Create the master file. if mpi.rank == 0: fileName = os.path.join(baseDirectory, baseName + ".silo") f = silo.DBCreate(fileName, silo.DB_CLOBBER, silo.DB_LOCAL, label, silo.DB_HDF5) nullOpts = silo.DBoptlist() # Write the domain file names and types. domainNames = Spheral.vector_of_string( [p % "hblk0/hydro_mesh" for p in domainNamePatterns]) meshTypes = Spheral.vector_of_int([silo.DB_QUADMESH] * maxproc) optlist = silo.DBoptlist(1024) assert optlist.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert optlist.addOption(silo.DBOPT_DTIME, time) == 0 assert silo.DBPutMultimesh(f, "hydro_mesh", domainNames, meshTypes, optlist) == 0 # Write material names. if materials: material_names = Spheral.vector_of_string( [p % "/hblk0/Materials" for p in domainNamePatterns]) matnames = Spheral.vector_of_string( ["void"] + [x.name for x in materials]) matnos = Spheral.vector_of_int(range(len(materials) + 1)) assert len(material_names) == maxproc assert len(matnames) == len(materials) + 1 assert len(matnos) == len(materials) + 1 optlist = silo.DBoptlist(1024) assert optlist.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert optlist.addOption(silo.DBOPT_DTIME, time) == 0 assert optlist.addOption(silo.DBOPT_MMESH_NAME, "hydro_mesh") == 0 assert optlist.addOption(silo.DBOPT_MATNAMES, silo.DBOPT_NMATNOS, matnames) == 0 assert optlist.addOption(silo.DBOPT_MATNOS, silo.DBOPT_NMATNOS, matnos) == 0 assert silo.DBPutMultimat(f, "Materials", material_names, optlist) == 0 # Write the variables descriptors. types = Spheral.vector_of_int([silo.DB_QUADVAR] * maxproc) for var, varname in vars: domainVarNames = Spheral.vector_of_string() for iproc, p in enumerate(domainNamePatterns): domainVarNames.append(p % ("/hblk0/" + varname)) assert len(domainVarNames) == maxproc optlistMV = silo.DBoptlist() assert optlistMV.addOption(silo.DBOPT_CYCLE, cycle) == 0 assert optlistMV.addOption(silo.DBOPT_DTIME, time) == 0 #assert optlistMV.addOption(silo.DBOPT_TENSOR_RANK, silo.DB_VARTYPE_SCALAR) == 0 assert optlistMV.addOption(silo.DBOPT_BLOCKORIGIN, 0) == 0 assert optlistMV.addOption(silo.DBOPT_MMESH_NAME, "hydro_mesh") == 0 assert silo.DBPutMultivar(f, varname, domainVarNames, types, optlistMV) == 0 # Write the dummy variable "akap_0" to fool Hades into thinking we're actually Hydra or something. assert silo.DBPutQuadvar1( f, "akap_0", "hydro_mesh", Spheral.vector_of_double([0.0] * (ndim * ndim)), Spheral.vector_of_double(), silo.DB_ZONECENT, Spheral.vector_of_int([ndim] * ndim), nullOpts) == 0 # Write domain and mesh size info. assert silo.DBMkDir(f, "Decomposition") == 0 assert silo.DBWrite(f, "Decomposition/NumDomains", maxproc) == 0 assert silo.DBWrite(f, "Decomposition/NumLocalDomains", maxproc) == 0 assert silo.DBWrite(f, "Decomposition/NumBlocks", 1) == 0 #assert silo.DBWrite(f, "Decomposition/LocalName", "hblk") == 0 localDomains = Spheral.vector_of_int(range(maxproc)) domainFiles = Spheral.vector_of_vector_of_int( [Spheral.vector_of_int(range(maxproc))]) assert silo.DBWrite(f, "Decomposition/LocalDomains", localDomains) == 0 assert silo.DBWrite(f, "DomainFiles", domainFiles) == 0 for iproc in xrange(maxproc): assert silo.DBMkDir(f, "Decomposition/gmap%i" % iproc) == 0 stuff = Spheral.vector_of_int([0] * 12) for jdim in xrange(ndim): stuff[6 + jdim] = nblocks[iproc][jdim] if iproc in (0, maxproc - 1): assert silo.DBWrite( f, "Decomposition/gmap%i/NumNeighbors" % iproc, 1) == 0 else: assert silo.DBWrite( f, "Decomposition/gmap%i/NumNeighbors" % iproc, 2) == 0 assert silo.DBWrite(f, "Decomposition/gmap%i/gmap" % iproc, stuff) == 0 # Close the file. if mpi.rank == 0: assert silo.DBClose(f) == 0 del f return maxproc
def writeDomainSiloFile(ndim, maxproc, baseDirectory, baseName, procDirBaseName, materials, rhosamp, xminblock, xmaxblock, nblock, jsplit, label, time, cycle, pretendRZ): assert jsplit < ndim # Make sure the directories are there. if mpi.rank == 0: for iproc in xrange(maxproc): pth = os.path.join(baseDirectory, procDirBaseName) if not os.path.exists(pth): os.makedirs(pth) mpi.barrier() # Is there anything to do? if mpi.rank < maxproc: numZones = 1 numNodes = 1 nblocknodes = list(nblock) for i, x in enumerate(nblock): numZones *= x numNodes *= x + 1 nblocknodes[i] = x + 1 assert numZones > 0 assert len(rhosamp) == numZones # Make a vector<int> version of nblock nblock_vec = Spheral.vector_of_int(ndim) for jdim in xrange(ndim): nblock_vec[jdim] = nblock[jdim] # Create the file. fileName = os.path.join(baseDirectory, procDirBaseName, "domain%i.silo" % mpi.rank) f = silo.DBCreate(fileName, SA._DB_CLOBBER, SA._DB_LOCAL, label, SA._DB_HDF5) nullOpts = silo.DBoptlist() # Make the hblk0 directory. assert silo.DBMkDir(f, "hblk0") == 0 # Write the domain mesh. coords = Spheral.vector_of_vector_of_double(ndim) for jdim in xrange(ndim): coords[jdim] = Spheral.vector_of_double(nblocknodes[jdim]) dx = (xmaxblock[jdim] - xminblock[jdim]) / nblock[jdim] for i in xrange(nblocknodes[jdim]): coords[jdim][i] = xminblock[jdim] + i * dx optlist = silo.DBoptlist() assert optlist.addOption(SA._DBOPT_CYCLE, cycle) == 0 assert optlist.addOption(SA._DBOPT_DTIME, time) == 0 if pretendRZ: assert optlist.addOption(SA._DBOPT_COORDSYS, SA._DB_CYLINDRICAL) == 0 else: assert optlist.addOption(SA._DBOPT_COORDSYS, SA._DB_CARTESIAN) == 0 assert silo.DBPutQuadmesh(f, "hblk0/hydro_mesh", coords, optlist) == 0 # # Domain neighbors. # if maxproc > 1 and mpi.rank < maxproc: # domain_neighbors = Spheral.vector_of_vector_of_int(2) # if mpi.rank > 0: # domain_neighbors[1].append(mpi.rank - 1) # if mpi.rank < maxproc - 1: # domain_neighbors[1].append(mpi.rank + 1) # domain_neighbors[0].append(len(domain_neighbors[1])) # assert silo.DBPutCompoundarray(f, "DOMAIN_NEIGHBOR_NUMS", Spheral.vector_of_string(len(domain_neighbors), "dummy"), domain_neighbors, nullOpts) == 0 # # Domain shared nodes. # if maxproc > 1 and mpi.rank < maxproc: # for idomain in xrange(len(domain_neighbors[1])): # commelements = Spheral.vector_of_vector_of_int(11) # if mpi.rank == 0: # face = nnodes[jsplit] - 1 # elif mpi.rank == maxproc - 1: # face = 0 # elif idomain == 0: # face = 0 # else: # face = nnodes[jsplit] - 1 # if jsplit == 0: # for j in xrange(nnodes[1]): # for k in xrange(nnodes[2]): # commelements[6].append(face + j*nnodes[0] + k*nnodes[0]*nnodes[1]) # elif jsplit == 1: # for i in xrange(nnodes[0]): # for k in xrange(nnodes[2]): # commelements[6].append(i + face*nnodes[0] + k*nnodes[0]*nnodes[1]) # else: # for i in xrange(nnodes[0]): # for j in xrange(nnodes[1]): # commelements[6].append(i + j*nnodes[0] + face*nnodes[0]*nnodes[1]) # assert silo.DBPutCompoundarray(f, "DOMAIN_NEIGHBOR%i" % idomain, Spheral.vector_of_string(11, "dummy"), commelements, nullOpts) == 0 # Write materials. if materials: matnos = Spheral.vector_of_int(1, 0) for i in xrange(len(materials)): matnos.append(i + 1) assert len(matnos) == len(materials) + 1 matlist = Spheral.vector_of_int(numZones, 0) matnames = Spheral.vector_of_string(1, "void") for imat, nodeList in enumerate(materials): for i in xrange(numZones): if rhosamp[i] > 0.0: matlist[i] = imat + 1 matnames.append(nodeList.name) assert len(matlist) == numZones assert len(matnames) == len(materials) + 1 matOpts = silo.DBoptlist(1024) assert matOpts.addOption(SA._DBOPT_CYCLE, cycle) == 0 assert matOpts.addOption(SA._DBOPT_DTIME, time) == 0 assert matOpts.addOption(SA._DBOPT_MATNAMES, SA._DBOPT_NMATNOS, matnames) == 0 assert silo.DBPutMaterial(f, "hblk0/Materials", "hydro_mesh", matnos, matlist, nblock_vec, Spheral.vector_of_int(), Spheral.vector_of_int(), Spheral.vector_of_int(), Spheral.vector_of_double(), matOpts) == 0 # Write the field variables. varOpts = silo.DBoptlist(1024) assert varOpts.addOption(SA._DBOPT_CYCLE, cycle) == 0 assert varOpts.addOption(SA._DBOPT_DTIME, time) == 0 assert silo.DBPutQuadvar1(f, "hblk0/den", "hydro_mesh", rhosamp, Spheral.vector_of_double(), SA._DB_ZONECENT, nblock_vec, varOpts) == 0 # That's it. assert silo.DBClose(f) == 0 del f return