예제 #1
0
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]
예제 #2
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]
예제 #3
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