#!/usr/bin/env python # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # # # CitcomS.py by Eh Tan, Eun-seo Choi, and Pururav Thoutireddy. # Copyright (C) 2002-2005, California Institute of Technology. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # from Coupler import Coupler class ContainingCoupler(Coupler): def __init__(self, name, facility): Coupler.__init__(self, name, facility) # exchanged information is non-dimensional self.inventory.dimensional = False # exchanged information is in spherical coordinate self.inventory.transformational = False return def initialize(self, solver): Coupler.initialize(self, solver) # restart and use temperautre field of previous run? self.restart = solver.restart if self.restart: self.ic_initTemperature = solver.ic_initTemperature self.all_variables = solver.all_variables self.boundary = range(self.numSrc) self.source["BC"] = range(self.numSrc) self.BC = range(self.numSrc) self.module.initConvertor(self.inventory.dimensional, self.inventory.transformational, self.all_variables) return def createMesh(self): self.globalBBox = self.module.createGlobalBoundedBox(self.all_variables) self.remoteBBox = self.module.exchangeBoundedBox( self.globalBBox, self.communicator.handle(), self.srcComm[0].handle(), self.srcComm[0].size - 1) self.interior, self.myBBox = self.module.createInterior( self.remoteBBox, self.all_variables) for i in range(len(self.boundary)): self.boundary[i] = self.module.createEmptyBoundary() return def createSourceSink(self): self.createSource() if self.inventory.two_way_communication: self.createSink() return def createSource(self): for i, comm, b in zip(range(self.numSrc), self.srcComm, self.boundary): # sink is always in the last rank of a communicator sinkRank = comm.size - 1 self.source["BC"][i] = self.module.CitcomSource_create(comm.handle(), sinkRank, b, self.myBBox, self.all_variables) return def createSink(self): self.sink["Intr"] = self.module.Sink_create(self.sinkComm.handle(), self.numSrc, self.interior) return def createBC(self): import Outlet for i, src in zip(range(self.numSrc), self.source["BC"]): self.BC[i] = Outlet.SVTOutlet(src, self.all_variables) return def createII(self): import Inlet self.II = Inlet.TInlet(self.interior, self.sink["Intr"], self.all_variables) return def initTemperature(self): if self.restart: # read-in restarted temperature field self.ic_initTemperature() del self.ic_initTemperature # send temperature to FGE and postprocess self.restartTemperature() else: self.module.initTemperature(self.remoteBBox, self.all_variables) return def restartTemperature(self): interior = range(self.numSrc) source = range(self.numSrc) for i in range(len(interior)): interior[i] = self.module.createEmptyInterior() for i, comm, b in zip(range(self.numSrc), self.srcComm, interior): # sink is always in the last rank of a communicator sinkRank = comm.size - 1 source[i] = self.module.CitcomSource_create(comm.handle(), sinkRank, b, self.myBBox, self.all_variables) import Outlet for i, src in zip(range(self.numSrc), source): outlet = Outlet.TOutlet(src, self.all_variables) outlet.send() # Any modification of read-in temperature is done here # Note: modifyT is called after sending unmodified T to FGE. # If T is modified before sending, FGE's T will lose sharp feature. # FGE has to call modifyT too to ensure consistent T field. self.modifyT(self.remoteBBox) return def postVSolverRun(self): self.applyBoundaryConditions() return def NewStep(self): if self.inventory.two_way_communication: # receive temperture field from FGE self.II.recv() self.II.impose() return def applyBoundaryConditions(self): for bc in self.BC: bc.send() return def stableTimestep(self, dt): new_dt = self.module.exchangeTimestep(dt, self.communicator.handle(), self.srcComm[0].handle(), self.srcComm[0].size - 1) #print "%s - old dt = %g exchanged dt = %g" % ( # self.__class__, dt, new_dt) return dt def exchangeSignal(self, signal): newsgnl = self.module.exchangeSignal(signal, self.communicator.handle(), self.srcComm[0].handle(), self.srcComm[0].size - 1) return newsgnl class Inventory(Coupler.Inventory): import pyre.inventory as prop # version __id__ = "$Id$" # End of file