Raw File
#!/usr/bin/env python

#
# Layout for MultiCoupled Application
#
#


from Layout import Layout

class MultiLayout(Layout):


    def __init__(self, name, facility):
        Layout.__init__(self, name, facility)

        # containing communicator
        self.ccomm = None

        # embedded comminicator1
        self.ecomm1 = None

        # embedded comminicator2
        self.ecomm2 = None

        # list of communicators created to pass imformation
        # between different solvers
        self.ccommPlus1 = []
        self.ccommPlus2 = []
        self.ecommPlus1 = []
        self.ecommPlus2 = []

        self.comm = None
        self.rank = 0
        self.nodes = 0
        return


    def verify(self, application):
        # check that we have at least 3 processor
        if self.nodes < 3:
            import journal
            firewall = journal.firewall("MultiLayout")
            firewall.log("'%s' requires at least 3 processors" \
                         % application.name)


        containing_group = self.inventory.containing_group
        embedded_group1 = self.inventory.embedded_group1
        embedded_group2 = self.inventory.embedded_group2

        # check for duplicated elements in the group
        self.check_duplicated(containing_group)
        self.check_duplicated(embedded_group1)
        self.check_duplicated(embedded_group2)

        # check that the three groups are disjoint
        self.check_disjoint(containing_group, embedded_group1)
        self.check_disjoint(containing_group, embedded_group2)
        self.check_disjoint(embedded_group1, embedded_group2)

        return



    def createCommunicators(self):
        # Create communicators for solvers and couplerd

        world = self.comm
        myrank = self.rank
        containing_group = self.inventory.containing_group
        embedded_group1 = self.inventory.embedded_group1
        embedded_group2 = self.inventory.embedded_group2

        # Communicator for solvers
        self.ccomm = world.include(containing_group)
        self.ecomm1 = world.include(embedded_group1)
        self.ecomm2 = world.include(embedded_group2)

        # Communicator for inter-solver communication
        # ecommPlus1 is a list of communicators, with each communicator
        # contains a node in embedded_group1 and the whole containing_group

        # ecommPlus2 is similar
        for node in containing_group:
            self.ecommPlus1.append(world.include(embedded_group1 + [node]))
            self.ecommPlus2.append(world.include(embedded_group2 + [node]))

        # ccommPlus1 is a list of communicators, with each communicator
        # contains a node in containing group and the whole embedded_group1

        # commPlus2 is similar
        for node in embedded_group1:
            self.ccommPlus1.append(world.include(containing_group + [node]))
        for node in embedded_group2:
            self.ccommPlus2.append(world.include(containing_group + [node]))

        return


    class Inventory(Layout.Inventory):

        import pyre.inventory

        # The containing solver will run on these nodes
        containing_group = pyre.inventory.slice("containing_group",
                                                default=range(12))

        # The embedded solver1 will run on these nodes
        embedded_group1 = pyre.inventory.slice("embedded_group1",
                                               default=[12])

        # The embedded solver2 will run on these nodes
        embedded_group2 = pyre.inventory.slice("embedded_group2",
                                               default=[13])


# version
__id__ = "$Id$"

# End of file
back to top