[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