def build3DMesh(p, nnx, nny, nnz): return MeshTools.MultilevelTetrahedralMesh(nnx,nny,nnz, p.domain.x[0], p.domain.x[1], p.domain.x[2], p.domain.L[0], p.domain.L[1], p.domain.L[2], refinementLevels=1, nLayersOfOverlap=0, parallelPartitioningType=MeshTools.MeshParallelPartitioningTypes.node)
def PUMI_reallocate(self, mesh): p0 = self.pList[0] n0 = self.nList[0] if self.TwoPhaseFlow: nLevels = p0.myTpFlowProblem.general['nLevels'] nLayersOfOverlapForParallel = p0.myTpFlowProblem.general[ 'nLayersOfOverlapForParallel'] parallelPartitioningType = MeshTools.MeshParallelPartitioningTypes.element domain = p0.myTpFlowProblem.domain domain.MeshOptions.setParallelPartitioningType('element') else: nLevels = n0.nLevels nLayersOfOverlapForParallel = n0.nLayersOfOverlapForParallel parallelPartitioningType = n0.parallelPartitioningType domain = p0.domain logEvent("Generating %i-level mesh from PUMI mesh" % (nLevels, )) if domain.nd == 3: mlMesh = MeshTools.MultilevelTetrahedralMesh( 0, 0, 0, skipInit=True, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) if domain.nd == 2: mlMesh = MeshTools.MultilevelTriangularMesh( 0, 0, 0, skipInit=True, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) if self.comm.size() == 1: mlMesh.generateFromExistingCoarseMesh( mesh, nLevels, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) else: mlMesh.generatePartitionedMeshFromPUMI( mesh, nLevels, nLayersOfOverlap=nLayersOfOverlapForParallel) self.mlMesh_nList = [] for p in self.pList: self.mlMesh_nList.append(mlMesh) if (domain.PUMIMesh.size_field_config() == "isotropicProteus"): mlMesh.meshList[0].subdomainMesh.size_field = numpy.ones( (mlMesh.meshList[0].subdomainMesh.nNodes_global, 1), 'd') * 1.0e-1 if (domain.PUMIMesh.size_field_config() == 'anisotropicProteus'): mlMesh.meshList[0].subdomainMesh.size_scale = numpy.ones( (mlMesh.meshList[0].subdomainMesh.nNodes_global, 3), 'd') mlMesh.meshList[0].subdomainMesh.size_frame = numpy.ones( (mlMesh.meshList[0].subdomainMesh.nNodes_global, 9), 'd') #may want to trigger garbage collection here self.modelListOld = self.modelList logEvent("Allocating models on new mesh") self.allocateModels()
def refine_uniform_from_tetgen(filebase,refinementLevels,index_base=0,EB=False): from proteus import MeshTools,Archiver mesh = MeshTools.TetrahedralMesh() mesh.generateFromTetgenFiles(filebase,index_base,skipGeometricInit=False) MLMesh = MeshTools.MultilevelTetrahedralMesh(0,0,0,skipInit=True) MLMesh.generateFromExistingCoarseMesh(mesh,refinementLevels) MLMesh.meshList[-1].writeTetgenFiles(filebase+'_out',index_base) ar = Archiver.XdmfArchive('.',filebase+'_out') import xml.etree.ElementTree as ElementTree ar.domain = ElementTree.SubElement(ar.tree.getroot(),"Domain") mesh.writeMeshXdmf(ar,'mesh_coarse'+'_out',init=True,EB=EB,tCount=0) MLMesh.meshList[-1].writeMeshXdmf(ar,'mesh_fine'+'_out',init=True,EB=EB,tCount=1) ar.close()
def PUMI_reallocate(self,mesh): p0 = self.pList[0] n0 = self.nList[0] nLevels = n0.nLevels nLayersOfOverlapForParallel = n0.nLayersOfOverlapForParallel parallelPartitioningType = MeshTools.MeshParallelPartitioningTypes.element domain = p0.domain domain.MeshOptions.setParallelPartitioningType('element') logEvent("Generating %i-level mesh from PUMI mesh" % (nLevels,)) if domain.nd == 3: mlMesh = MeshTools.MultilevelTetrahedralMesh( 0,0,0,skipInit=True, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) if domain.nd == 2: mlMesh = MeshTools.MultilevelTriangularMesh( 0,0,0,skipInit=True, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) if self.comm.size()==1: mlMesh.generateFromExistingCoarseMesh( mesh,nLevels, nLayersOfOverlap=nLayersOfOverlapForParallel, parallelPartitioningType=parallelPartitioningType) else: mlMesh.generatePartitionedMeshFromPUMI( mesh,nLevels, nLayersOfOverlap=nLayersOfOverlapForParallel) #need to remove old mlMesh references to ensure the number of mesh entities is properly updated self.mlMesh_nList.clear() for p in self.pList: self.mlMesh_nList.append(mlMesh) if (b"isotropicProteus" in self.domain.AdaptManager.sizeInputs): mlMesh.meshList[0].subdomainMesh.size_field = numpy.ones((mlMesh.meshList[0].subdomainMesh.nNodes_global,1),'d')*1.0e-1 if (b'anisotropicProteus' in self.domain.AdaptManager.sizeInputs): mlMesh.meshList[0].subdomainMesh.size_scale = numpy.ones((mlMesh.meshList[0].subdomainMesh.nNodes_global,3),'d') mlMesh.meshList[0].subdomainMesh.size_frame = numpy.ones((mlMesh.meshList[0].subdomainMesh.nNodes_global,9),'d') #may want to trigger garbage collection here self.modelListOld = self.modelList logEvent("Allocating models on new mesh") self.allocateModels()