https://github.com/geodynamics/citcoms
Raw File
Tip revision: 60c9538a11a48ae533f752115f5456df3c302303 authored by Eh Tan on 16 January 2012, 21:25 UTC
Merged r18932, r19073, and r19192 from trunk to v3.1 branch
Tip revision: 60c9538
MultiCoupledApp.py
#! usr/bin/env python
#
#
#
# need corresponding coupler controller solver
#
#
#
#
#
#

from BaseApplication import BaseApplication
import journal

class MultiCoupledApp(BaseApplication):


    def __init__(self, name="CitcomS"):
        BaseApplication.__init__(self, name)

        self.solver = None
        self.solverCommunicator = None

        # list of communicators used to pass imformation between solvers
        self.myPlus = []
        self.remotePlus = []

        # containing solver need to do more communication
        self.myPlus2 = []
        self.remotePlus2 = []


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

        return


    def getNodes(self):
        # csolver requires nproc1 CPUs to run
        s1 = self.inventory.csolver.inventory.mesher.inventory
        nproc1 = s1.nproc_surf * s1.nprocx * s1.nprocy * s1.nprocz

        # esolver1 requires nproc2 CPUs to run
        s2 = self.inventory.esolver1.inventory.mesher.inventory
        nproc2 = s2.nproc_surf * s2.nprocx * s2.nprocy * s2.nprocz

        # esolver2 requires nproc3 CPUs to run
        s3 = self.inventory.esolver2.inventory.mesher.inventory
        nproc3 = s3.nproc_surf * s3.nprocx * s3.nprocy * s3.nprocz

        return nproc1 + nproc2 + nproc3


    def initialize(self):

        layout = self.inventory.layout
        layout.initialize(self)

        self.findLayout(layout)

        self.controller.initialize(self)

        return


    def findLayout(self, layout):

        if layout.ccomm:
            # This process belongs to the containing solver
            self.controller = self.inventory.ccontroller
            self.solver = self.inventory.csolver
            self.coupler = self.inventory.ccoupler
            self.solverCommunicator = layout.ccomm
            self.myPlus = layout.ccommPlus1
            self.remotePlus = layout.ecommPlus1
            self.myPlus2 = layout.ccommPlus2
            self.remotePlus2 = layout.ecommPlus2


        elif layout.ecomm1:
            # This process belongs to the embedded solver1
            self.controller = self.inventory.econtroller1
            self.solver = self.inventory.esolver1
            self.coupler = self.inventory.ecoupler1
            self.solverCommunicator = layout.ecomm1
            self.myPlus = layout.ecommPlus1
            self.remotePlus = layout.ccommPlus1


        elif layout.ecomm2:
            # This process belongs to the embedded solver2
            self.controller = self.inventory.econtroller2
            self.solver = self.inventory.esolver2
            self.coupler = self.inventory.ecoupler2
            self.solverCommunicator = layout.ecomm2
            self.myPlus = layout.ecommPlus2
            self.remotePlus = layout.ccommPlus2

        else:
            # This process doesn't belong to any solver
            import journal
            journal.warning(self.name).log("node '%d' is an orphan"
                                           % layout.rank)

        self.comm = layout.comm
        self.rank = layout.rank
        self.nodes = layout.nodes

        return


    def reportConfiguration(self):

        rank = self.comm.rank

        if rank != 0:
            return

        self._info.line("configuration:")

        self._info.line("  facilities:")
        self._info.line("    launcher: %r" % self.inventory.launcher.name)

        self._info.line("    csolver: %r" % self.inventory.csolver.name)
        self._info.line("    esolver1: %r" % self.inventory.esolver1.name)
        self._info.line("    esolver2: %r" % self.inventory.esolver2.name)
        self._info.line("    ccontroller: %r" % self.inventory.ccontroller.name)
        self._info.line("    econtroller1: %r" % self.inventory.econtroller1.name)
        self._info.line("    econtroller2: %r" % self.inventory.econtroller2.name)
        self._info.line("    ccoupler: %r" % self.inventory.ccoupler.name)
        self._info.line("    ecoupler1: %r" % self.inventory.ecoupler1.name)
        self._info.line("    ecoupler2: %r" % self.inventory.ecoupler2.name)
        self._info.line("    layout: %r" % self.inventory.layout.name)

        return


    class Inventory(BaseApplication.Inventory):

        import pyre.inventory

        import Controller
        import Solver
        import Coupler
        import MultiLayout

        ccontroller = pyre.inventory.facility(name="ccontroller",
                                              factory=Controller.controller,
                                              args=("ccontroller","ccontroller"))
        econtroller1 = pyre.inventory.facility(name="econtroller1",
                                               factory=Controller.controller,
                                               args=("econtroller1","econtroller1"))
        econtroller2 = pyre.inventory.facility(name="econtroller2",
                                               factory=Controller.controller,
                                               args=("econtroller2","econtroller2"))

        ccoupler = pyre.inventory.facility("ccoupler",
                                           factory=Coupler.multicontainingcoupler,
                                           args=("ccoupler","ccoupler"))
        ecoupler1 = pyre.inventory.facility("ecoupler1",
                                            factory=Coupler.multiembeddedcoupler,
                                            args=("ecoupler1","ecoupler1"))
        ecoupler2 = pyre.inventory.facility("ecoupler2",
                                            factory=Coupler.multiembeddedcoupler,
                                            args=("ecoupler2","ecoupler2"))

        csolver = pyre.inventory.facility("csolver",
                                          factory=Solver.multicoupledRegionalSolver,
                                          args=("csolver", "csolver"))
        esolver1 = pyre.inventory.facility("esolver1",
                                           factory=Solver.multicoupledRegionalSolver,
                                           args=("esolver1", "esolver1"))
        esolver2 = pyre.inventory.facility("esolver2",
                                           factory=Solver.multicoupledRegionalSolver,
                                           args=("esolver2", "esolver2"))

        layout = pyre.inventory.facility("layout", factory=MultiLayout.MultiLayout,
                                         args=("layout", "layout"))

        steps = pyre.inventory.int("steps", default=1)


# version
__id__ = "$Id$"

# End of file
back to top