#!/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