def createTopoProblem(props, forest, order=2, nlevels=2, Xscale=1.0, ordering=TACS.PY_MULTICOLOR_ORDER): # Create the forest forests = [] filters = [] assemblers = [] varmaps = [] vecindices = [] # Create the trees, rebalance the elements and repartition forest.balance(1) forest.repartition() forests.append(forest) # Create the filter filtr = forest.coarsen() filtr.balance(1) filters.append(filtr) # Make the creator class creator = CreateMe(bcs, filters[-1], props) assemblers.append( creator.createTACS(forest, scale=Xscale, ordering=ordering)) varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) for i in range(nlevels - 1): forest = forests[-1].coarsen() forest.balance(1) forest.repartition() forests.append(forest) # Create the filter filtr = forest.coarsen() filtr.balance(1) filters.append(filtr) # Make the creator class creator = CreateMe(bcs, filters[-1], props) assemblers.append( creator.createTACS(forest, scale=Xscale, ordering=ordering)) varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) # Create the multigrid object mg = TMR.createMg(assemblers, forests) # Create the topology optimization problem vars_per_node = 1 nmats = props.getNumMaterials() if nmats > 1: vars_per_node = nmats + 1 problem = TMR.TopoProblem(assemblers, filters, varmaps, vecindices, mg, vars_per_node) return assemblers[0], problem, filters[0], varmaps[0]
def createTopoProblem(forest, order=2, nlevels=2): # Create the forest forests = [] filters = [] assemblers = [] varmaps = [] vecindices = [] # Create the trees, rebalance the elements and repartition forest.balance(1) forest.repartition() forests.append(forest) # Create the filter filtr = forest.coarsen() filtr.balance(1) filters.append(filtr) # Make the creator class creator = CreateMe(bcs, filters[-1]) assemblers.append(creator.createTACS(order, forest)) varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) for i in range(nlevels - 1): forest = forests[-1].coarsen() forest.balance(1) forest.repartition() forests.append(forest) # Create the filter filtr = forest.coarsen() filtr.balance(1) filters.append(filtr) # Make the creator class creator = CreateMe(bcs, filters[-1]) assemblers.append(creator.createTACS(order, forest)) varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) # Create the multigrid object mg = TMR.createMg(assemblers, forests) # Create the topology optimization problem problem = TMR.TopoProblem(assemblers, filters, varmaps, vecindices, mg) return assemblers[0], problem, filters[0], varmaps[0]
def createTopoProblem(forest, callback, filter_type, nlevels=2, repartition=True, design_vars_per_node=1, s=2.0, N=10, r0=0.05, lowest_order=2, ordering=TACS.PY_MULTICOLOR_ORDER, scale_coordinate_factor=1.0): """ Create a topology optimization problem instance and a hierarchy of meshes. This code takes in the OctForest or QuadForest on the finest mesh level and creates a series of coarser meshes for analysis and optimization. The discretization at each level is created via a callback function that generates the appropriate TACSCreator object and its associated filter (the QuadForest or OctForest on which the design parametrization is defined.) The code then creates a TMRTopoFilter class which stores information about the design parametrization and hierarchy. It creates a multigrid object and finally a TMRTopoProblem instance for optimization. The callback function takes in a forest object, corresponding to the finite- element discretization and returns a creator object and a filter object in the following form: creator, filter = callback(forest) Args: callback: A callback function that takes in the forest and returns the filter and the associated creator class filter_type (str): Type of filter to create forest (TMROctForest or TMRQuadForest): Forest type repartition (bool): Repartition the mesh design_vars_per_node (int): number of design variables for each node s (float): Matrix filter smoothing parameter N (int): Matrix filter approximation parameter r0 (float): Helmholtz filter radius lowest_order (int): Lowest order mesh to create ordering: TACS Assembler ordering type scale_coordinate_factor (float): Scale all coordinates by this factor Returns: problem (TopoProblem): The allocated topology optimization problem """ # Store data forests = [] filters = [] assemblers = [] varmaps = [] vecindices = [] # Balance the forest and repartition across processors forest.balance(1) if repartition: forest.repartition() # Create the forest object creator, filtr = callback(forest) forests.append(forest) filters.append(filtr) assemblers.append(creator.createTACS(forest, ordering)) if filter_type == 'lagrange': varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) for i in range(nlevels - 1): order = forests[-1].getMeshOrder() interp = forests[-1].getInterpType() if order > lowest_order: forest = forests[-1].duplicate() order = order - 1 forest.setMeshOrder(order, interp) else: forest = forests[-1].coarsen() forest.setMeshOrder(order, interp) # Balance and repartition if needed forest.balance(1) if repartition: forest.repartition() # Create the forest object creator, filtr = callback(forest) forests.append(forest) filters.append(filtr) assemblers.append(creator.createTACS(forest, ordering)) if filter_type == 'lagrange': varmaps.append(creator.getMap()) vecindices.append(creator.getIndices()) # Scale the coordinates by scale_coordinates factor if it is != 1.0 if scale_coordinate_factor != 1.0: for assembler in assemblers: X = assembler.createNodeVec() assembler.getNodes(X) X.scale(scale_coordinate_factor) assembler.setNodes(X) # Create the multigrid object mg = TMR.createMg(assemblers, forests) # Create the TMRTopoFilter object filter_obj = None if filter_type == 'lagrange': filter_obj = TMR.LagrangeFilter(assemblers, filters, varmaps, vecindices, vars_per_node=design_vars_per_node) elif filter_type == 'matrix': filter_obj = TMR.MatrixFilter(s, N, assemblers, forests, vars_per_node=design_vars_per_node) elif filter_type == 'conform': filter_obj = TMR.ConformFilter(assemblers, filters, vars_per_node=design_vars_per_node) elif filter_type == 'helmholtz': filter_obj = TMR.HelmholtzFiler(r0, assemblers, filters, vars_per_node=design_vars_per_node) problem = TMR.TopoProblem(filter_obj, mg) return problem