[cig-commits] r7636 - mc/3D/CitcomS/trunk/CitcomS/Coupler
tan2 at geodynamics.org
tan2 at geodynamics.org
Tue Jul 10 13:08:45 PDT 2007
Author: tan2
Date: 2007-07-10 13:08:44 -0700 (Tue, 10 Jul 2007)
New Revision: 7636
Modified:
mc/3D/CitcomS/trunk/CitcomS/Coupler/ContainingCoupler.py
mc/3D/CitcomS/trunk/CitcomS/Coupler/Coupler.py
mc/3D/CitcomS/trunk/CitcomS/Coupler/EmbeddedCoupler.py
Log:
Renamed variables for clarification
Modified: mc/3D/CitcomS/trunk/CitcomS/Coupler/ContainingCoupler.py
===================================================================
--- mc/3D/CitcomS/trunk/CitcomS/Coupler/ContainingCoupler.py 2007-07-10 19:30:41 UTC (rev 7635)
+++ mc/3D/CitcomS/trunk/CitcomS/Coupler/ContainingCoupler.py 2007-07-10 20:08:44 UTC (rev 7636)
@@ -46,8 +46,8 @@
# allocate space for exchanger objects
self.remoteBdryList = range(self.remoteSize)
- self.source["BC"] = range(self.remoteSize)
- self.BC = range(self.remoteSize)
+ self.sourceList = range(self.remoteSize)
+ self.outletList = range(self.remoteSize)
return
@@ -63,8 +63,8 @@
# the bounding box of the mesh on the other solver
self.remoteBBox = exchangeBoundedBox(self.globalBBox,
self.communicator.handle(),
- self.srcComm[0].handle(),
- self.srcComm[0].size - 1)
+ self.srcCommList[0].handle(),
+ self.srcCommList[0].size - 1)
# the nodes within remoteBBox
self.interior, self.myBBox = createInterior(self.remoteBBox,
@@ -90,25 +90,31 @@
# the source obj's will send boundary conditions to a remote sink
from ExchangerLib import CitcomSource_create
for i, comm, b in zip(range(self.remoteSize),
- self.srcComm,
+ self.srcCommList,
self.remoteBdryList):
# sink is always in the last rank of a communicator
sinkRank = comm.size - 1
- self.source["BC"][i] = CitcomSource_create(comm.handle(),
- sinkRank,
- b,
- self.myBBox,
- self.all_variables)
+ # the sources will communicate with the sink in EmbeddedCoupler
+ # during creation stage
+ self.sourceList[i] = CitcomSource_create(comm.handle(),
+ sinkRank,
+ b,
+ self.myBBox,
+ self.all_variables)
+
return
def createSink(self):
# the sink obj. will receive interior temperature from remote sources
from ExchangerLib import Sink_create
- self.sink["Intr"] = Sink_create(self.sinkComm.handle(),
- self.remoteSize,
- self.interior)
+
+ # the sink will communicate with the source in EmbeddedCoupler
+ # during creation stage
+ self.sink = Sink_create(self.sinkComm.handle(),
+ self.remoteSize,
+ self.interior)
return
@@ -117,18 +123,17 @@
# stress, velocity, and temperature
import Outlet
for i, src in zip(range(self.remoteSize),
- self.source["BC"]):
- self.BC[i] = Outlet.SVTOutlet(src,
- self.all_variables)
+ self.sourceList):
+ self.outletList[i] = Outlet.SVTOutlet(src, self.all_variables)
return
def createII(self):
# interior temperature will be received by TInlet
import Inlet
- self.II = Inlet.TInlet(self.interior,
- self.sink["Intr"],
- self.all_variables)
+ self.inlet = Inlet.TInlet(self.interior,
+ self.sink,
+ self.all_variables)
return
@@ -155,7 +160,7 @@
interior[i] = createEmptyInterior()
for i, comm, b in zip(range(self.remoteSize),
- self.srcComm,
+ self.srcCommList,
interior):
# sink is always in the last rank of a communicator
sinkRank = comm.size - 1
@@ -182,7 +187,8 @@
def postVSolverRun(self):
# send computed velocity to ECPLR for its BCs
- self.applyBoundaryConditions()
+ for outlet in self.outletList:
+ outlet.send()
return
@@ -190,25 +196,23 @@
# update the temperature field in the overlapping region
if self.inventory.two_way_communication:
# receive temperture field from EmbeddedCoupler
- self.II.recv()
- self.II.impose()
+ self.inlet.recv()
+ self.inlet.impose()
return
- def applyBoundaryConditions(self):
- for bc in self.BC:
- bc.send()
- return
+ def stableTimestep(self, dt):
+ from ExchangerLib import exchangeTimestep
+ remote_dt = exchangeTimestep(dt,
+ self.communicator.handle(),
+ self.srcCommList[0].handle(),
+ self.srcCommList[0].size - 1)
+ assert remote_dt < dt, \
+ 'Size of dt in the esolver is greater than dt in the csolver!'
- def stableTimestep(self, dt):
- from ExchangerLib import exchangeTimestep
- new_dt = 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)
+ # self.__class__, dt, remote_dt)
return dt
@@ -216,8 +220,8 @@
from ExchangerLib import exchangeSignal
newsgnl = exchangeSignal(signal,
self.communicator.handle(),
- self.srcComm[0].handle(),
- self.srcComm[0].size - 1)
+ self.srcCommList[0].handle(),
+ self.srcCommList[0].size - 1)
return newsgnl
Modified: mc/3D/CitcomS/trunk/CitcomS/Coupler/Coupler.py
===================================================================
--- mc/3D/CitcomS/trunk/CitcomS/Coupler/Coupler.py 2007-07-10 19:30:41 UTC (rev 7635)
+++ mc/3D/CitcomS/trunk/CitcomS/Coupler/Coupler.py 2007-07-10 20:08:44 UTC (rev 7636)
@@ -37,13 +37,10 @@
self.all_variables = None
self.communicator = None
- self.srcComm = []
+ self.srcCommList = []
self.sinkComm = None
self.remoteSize = 0
- self.sink = {}
- self.source = {}
-
self.synchronized = True
self.done = False
self.coupled_steps = 1
@@ -52,10 +49,10 @@
def initialize(self, solver):
self.communicator = solver.communicator
- self.srcComm = solver.myPlus
+ self.srcCommList = solver.myPlus
# number of processors in the remote solver
- self.remoteSize = len(self.srcComm)
+ self.remoteSize = len(self.srcCommList)
# only one of remotePlus is sinkComm
self.sinkComm = solver.remotePlus[self.communicator.rank]
Modified: mc/3D/CitcomS/trunk/CitcomS/Coupler/EmbeddedCoupler.py
===================================================================
--- mc/3D/CitcomS/trunk/CitcomS/Coupler/EmbeddedCoupler.py 2007-07-10 19:30:41 UTC (rev 7635)
+++ mc/3D/CitcomS/trunk/CitcomS/Coupler/EmbeddedCoupler.py 2007-07-10 20:08:44 UTC (rev 7636)
@@ -48,6 +48,11 @@
def initialize(self, solver):
Coupler.initialize(self, solver)
+ # the embedded solver should set its solver.bc.side_sbcs to on
+ # otherwise, we have to stop
+ assert solver.inventory.bc.inventory.side_sbcs == True, \
+ 'Error: esolver.bc.side_sbcs must be on!'
+
# restart and use temperautre field of previous run?
self.restart = solver.restart
if self.restart:
@@ -55,14 +60,9 @@
# allocate space for exchanger objects
self.remoteIntrList = range(self.remoteSize)
- self.source["Intr"] = range(self.remoteSize)
- self.II = range(self.remoteSize)
+ self.sourceList = range(self.remoteSize)
+ self.outletList = range(self.remoteSize)
- # the embedded solver should set its solver.bc.side_sbcs to on
- # otherwise, we have to stop
- if not solver.inventory.bc.inventory.side_sbcs:
- raise SystemExit('\n\nError: esolver.bc.side_sbcs must be on!\n\n\n')
-
return
@@ -107,9 +107,11 @@
def createSink(self):
# the sink obj. will receive boundary conditions from remote sources
from ExchangerLib import Sink_create
- self.sink["BC"] = Sink_create(self.sinkComm.handle(),
- self.remoteSize,
- self.boundary)
+ # the sink will communicate with the source in ContainingCoupler
+ # during creation stage
+ self.sink = Sink_create(self.sinkComm.handle(),
+ self.remoteSize,
+ self.boundary)
return
@@ -117,16 +119,19 @@
# the source obj's will send interior temperature to a remote sink
from ExchangerLib import CitcomSource_create
for i, comm, b in zip(range(self.remoteSize),
- self.srcComm,
+ self.srcCommList,
self.remoteIntrList):
# sink is always in the last rank of a communicator
sinkRank = comm.size - 1
- self.source["Intr"][i] = CitcomSource_create(comm.handle(),
- sinkRank,
- b,
- self.myBBox,
- self.all_variables)
+ # the sources will communicate with the sink in ContainingCoupler
+ # during creation stage
+ self.sourceList[i] = CitcomSource_create(comm.handle(),
+ sinkRank,
+ b,
+ self.myBBox,
+ self.all_variables)
+
return
@@ -134,9 +139,9 @@
# boundary conditions will be recv. by SVTInlet, which receives
# stress, velocity, and temperature
import Inlet
- self.BC = Inlet.SVTInlet(self.boundary,
- self.sink["BC"],
- self.all_variables)
+ self.inlet = Inlet.SVTInlet(self.boundary,
+ self.sink,
+ self.all_variables)
return
@@ -144,9 +149,8 @@
# interior temperature will be sent by TOutlet
import Outlet
for i, src in zip(range(self.remoteSize),
- self.source["Intr"]):
- self.II[i] = Outlet.TOutlet(src,
- self.all_variables)
+ self.sourceList):
+ self.outletList[i] = Outlet.TOutlet(src, self.all_variables)
return
@@ -184,7 +188,16 @@
def preVSolverRun(self):
# apply bc before solving the velocity
- self.applyBoundaryConditions()
+ if self.toApplyBC:
+ self.inlet.recv()
+
+ self.toApplyBC = False
+
+ self.inlet.impose()
+
+ # applyBC only when previous step is sync'd
+ if self.synchronized:
+ self.toApplyBC = True
return
@@ -192,50 +205,37 @@
if self.inventory.two_way_communication:
if self.synchronized:
# send temperture field to CCPLR
- for ii in self.II:
- ii.send()
+ for outlet in self.outletList:
+ outlet.send()
return
- def applyBoundaryConditions(self):
- if self.toApplyBC:
- self.BC.recv()
- self.toApplyBC = False
-
- self.BC.impose()
-
- # applyBC only when previous step is sync'd
- if self.synchronized:
- self.toApplyBC = True
-
- return
-
-
def stableTimestep(self, dt):
from ExchangerLib import exchangeTimestep
if self.synchronized:
mycomm = self.communicator
self.ccplr_t = exchangeTimestep(dt,
- mycomm.handle(),
- self.sinkComm.handle(),
- 0)
+ mycomm.handle(),
+ self.sinkComm.handle(),
+ 0)
self.ecplr_t = 0
self.synchronized = False
- self.ecplr_t += dt
old_dt = dt
# clipping oversized ecplr_t
- if self.ecplr_t >= self.ccplr_t:
- dt = dt - (self.ecplr_t - self.ccplr_t)
+ if self.ecplr_t + dt >= self.ccplr_t:
+ dt = self.ccplr_t - self.ecplr_t
self.ecplr_t = self.ccplr_t
self.synchronized = True
#print "ECPLR: SYNCHRONIZED!"
+ else:
+ self.ecplr_t += dt
# store timestep for interpolating boundary velocities
- self.BC.storeTimestep(self.ecplr_t, self.ccplr_t)
+ self.inlet.storeTimestep(self.ecplr_t, self.ccplr_t)
#print "%s - old dt = %g exchanged dt = %g" % (
# self.__class__, old_dt, dt)
More information about the cig-commits
mailing list