Revision 0461d2e117ce88704a56dd8bcbf6bf7787991b15 authored by Eh Tan on 08 November 2007, 23:28:46 UTC, committed by Eh Tan on 08 November 2007, 23:28:46 UTC
svn+ssh://svn@geodynamics.org/cig/mc/3D/CitcomS/trunk ........ r8194 | tan2 | 2007-10-30 14:49:58 -0700 (Tue, 30 Oct 2007) | 1 line Compute d(rho)/dr/rho from rho(r) ........ r8195 | tan2 | 2007-10-30 14:50:52 -0700 (Tue, 30 Oct 2007) | 1 line Fixed a bug in dimensionalizing density. Provided the formula of geoid calculation in the comments. Rearranged the order of functions. ........ r8196 | tan2 | 2007-10-30 14:53:50 -0700 (Tue, 30 Oct 2007) | 1 line A post-processing program to project geoid coefficents onto a regular (longitude, latitude) mesh ........ r8197 | tan2 | 2007-10-30 14:54:14 -0700 (Tue, 30 Oct 2007) | 1 line Added the C program project_geoid to the makefile ........ r8199 | tan2 | 2007-10-30 15:29:44 -0700 (Tue, 30 Oct 2007) | 1 line Minor modification ........ r8201 | tan2 | 2007-11-01 16:33:30 -0700 (Thu, 01 Nov 2007) | 1 line Print dv/v=dp/p=1.0 for the 1st Uzawa iteraion ........ r8202 | tan2 | 2007-11-01 16:33:50 -0700 (Thu, 01 Nov 2007) | 1 line Fixed an error in comment ........ r8204 | tan2 | 2007-11-05 17:03:35 -0800 (Mon, 05 Nov 2007) | 1 line Scaled topo with variable gravity. Fixed an error in comment. Rearranged computation. ........ r8205 | tan2 | 2007-11-05 17:03:55 -0800 (Mon, 05 Nov 2007) | 1 line Removed functions related sph. harm in lib/Regional_obsolete.c ........ r8206 | tan2 | 2007-11-05 17:04:20 -0800 (Mon, 05 Nov 2007) | 1 line Shrank the size of sph. harm arrays ........ r8207 | tan2 | 2007-11-05 17:04:43 -0800 (Mon, 05 Nov 2007) | 1 line Init'd some variables about vtk_io, which might be accessed with uninit'd values in output_finalize() ........ r8212 | tan2 | 2007-11-06 15:17:54 -0800 (Tue, 06 Nov 2007) | 1 line Fixed a few memory errors ........ r8213 | tan2 | 2007-11-06 15:18:12 -0800 (Tue, 06 Nov 2007) | 1 line Increase vlowstep to match the default value in pyre ........ r8214 | tan2 | 2007-11-06 15:18:35 -0800 (Tue, 06 Nov 2007) | 1 line Removed unused multigrid parameters ........ r8215 | tan2 | 2007-11-06 15:18:54 -0800 (Tue, 06 Nov 2007) | 1 line Added cgrad solver convergence parameters, increased buoyancy_ratio and lower the # of steps ........ r8226 | tan2 | 2007-11-07 11:51:56 -0800 (Wed, 07 Nov 2007) | 1 line Print a warning when matrix eqn solver not converging ........ r8227 | tan2 | 2007-11-07 11:52:17 -0800 (Wed, 07 Nov 2007) | 1 line Removed comp_el from default output, since it is not required for restart anymore. ........ r8228 | tan2 | 2007-11-07 11:52:39 -0800 (Wed, 07 Nov 2007) | 1 line Decreased the # of processors. This is the only way I can reproduce single-cell convection as in the manual. ........ r8235 | tan2 | 2007-11-08 11:18:26 -0800 (Thu, 08 Nov 2007) | 1 line Dereased the timestep size to reduce artifacts in advection ........ r8236 | tan2 | 2007-11-08 11:18:52 -0800 (Thu, 08 Nov 2007) | 1 line Update NEWS ........ r8237 | tan2 | 2007-11-08 11:19:12 -0800 (Thu, 08 Nov 2007) | 1 line Update the version number ........ r8241 | tan2 | 2007-11-08 13:17:14 -0800 (Thu, 08 Nov 2007) | 1 line Updated file ChangeLog to r8240 ........ r8242 | tan2 | 2007-11-08 13:36:55 -0800 (Thu, 08 Nov 2007) | 1 line Removed binary checkpoint files from makefile, as the file size is too big for distribution. ........ r8243 | tan2 | 2007-11-08 13:38:09 -0800 (Thu, 08 Nov 2007) | 1 line Updated file ChangeLog to r8242 ........ r8244 | tan2 | 2007-11-08 14:31:21 -0800 (Thu, 08 Nov 2007) | 1 line Replaced a system call by std C library remove() and disabled another system call (backup input file). Partially fixed issue130. All remaining system calls are in lib/Output_gzdir.c. ........ r8245 | tan2 | 2007-11-08 14:41:31 -0800 (Thu, 08 Nov 2007) | 1 line Updated file ChangeLog to r8244 ........
1 parent a828fa9
EmbeddedCoupler.py
#!/usr/bin/env python
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
#<LicenseText>
#
# 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
#
#</LicenseText>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
from Coupler import Coupler
class EmbeddedCoupler(Coupler):
def __init__(self, name, facility):
Coupler.__init__(self, name, facility)
# time of containing coupler
self.ccplr_t = 0
# time of embedded coupler
self.ecplr_t = 0
# whether to apply boundary conditions
self.toApplyBC = True
return
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!'
# allocate space for exchanger objects
self.remoteIntrList = range(self.remoteSize)
self.sourceList = range(self.remoteSize)
self.outletList = range(self.remoteSize)
return
def createMesh(self):
'''Create BoundedMesh objects.
'''
from ExchangerLib import createGlobalBoundedBox, exchangeBoundedBox, createBoundary, createEmptyInterior
inv = self.inventory
# the bounding box of the mesh on this solver
self.globalBBox = createGlobalBoundedBox(self.all_variables)
# the bounding box of the mesh on the other solver
mycomm = self.communicator
self.remoteBBox = exchangeBoundedBox(self.globalBBox,
mycomm.handle(),
self.sinkComm.handle(),
0)
# the nodes on the boundary, top and bottom boundaries are special
self.boundary, self.myBBox = createBoundary(self.all_variables,
inv.exclude_top,
inv.exclude_bottom)
# an empty interior object, which will be filled by a remote interior obj.
if inv.two_way_communication:
for i in range(self.remoteSize):
self.remoteIntrList[i] = createEmptyInterior()
return
def createSourceSink(self):
# create sink first, then source. The order is important.
self.createSink()
if self.inventory.two_way_communication:
self.createSource()
return
def createSink(self):
# the sink obj. will receive boundary conditions from remote sources
from ExchangerLib import Sink_create
# the sink will communicate with the source in ContainingCoupler
# during creation stage
self.sink = Sink_create(self.sinkComm.handle(),
self.remoteSize,
self.boundary)
return
def createSource(self):
# 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.srcCommList,
self.remoteIntrList):
# sink is always in the last rank of a communicator
sinkRank = comm.size - 1
# 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
def createBC(self):
# boundary conditions will be recv. by SVTInlet, which receives
# stress, velocity, and temperature
import Inlet
self.inlet = Inlet.SVTInlet(self.boundary,
self.sink,
self.all_variables)
return
def createII(self):
# interior temperature will be sent by TOutlet
import Outlet
for i, src in zip(range(self.remoteSize),
self.sourceList):
self.outletList[i] = Outlet.TOutlet(src, self.all_variables)
return
def initTemperature(self):
from ExchangerLib import initTemperature
initTemperature(self.globalBBox,
self.all_variables)
return
def exchangeTemperature(self):
if not self.inventory.exchange_initial_temperature:
return
from ExchangerLib import createInterior, Sink_create
interior, bbox = createInterior(self.remoteBBox,
self.all_variables)
sink = Sink_create(self.sinkComm.handle(),
self.remoteSize,
interior)
import Inlet
inlet = Inlet.TInlet(interior, sink, self.all_variables)
inlet.recv()
inlet.impose()
# Any modification of read-in temperature is done here
# Note: modifyT is called after receiving unmodified T from CCPLR.
# If T is modified before sending, ECPLR's T will lose sharp feature.
# CCPLR has to call modifyT too to ensure consistent T field.
#self.modifyT(self.globalBBox)
return
def preVSolverRun(self):
# apply bc before solving the velocity
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
def newStep(self):
if self.inventory.two_way_communication:
if self.synchronized:
# send temperture field to CCPLR
for outlet in self.outletList:
outlet.send()
return
def stableTimestep(self, old_dt):
from ExchangerLib import exchangeTimestep
if self.synchronized:
#print "start new big step"
mycomm = self.communicator
self.ccplr_t = exchangeTimestep(old_dt,
mycomm.handle(),
self.sinkComm.handle(),
0)
self.ecplr_t = 0
self.synchronized = False
dt = old_dt
self.ecplr_t += dt
# clipping oversized ecplr_t
if self.ecplr_t >= self.ccplr_t:
#print "** clip dt **"
#print "dt = %g, ecplr_t = %g, ccplr_t = %g" %(dt, self.ecplr_t, self.ccplr_t)
dt = dt - (self.ecplr_t - self.ccplr_t)
self.ecplr_t = self.ccplr_t
self.synchronized = True
#print self.name, " SYNCHRONIZED!"
# store timestep for interpolating boundary velocities
self.inlet.storeTimestep(self.ecplr_t, self.ccplr_t)
#print "%s - old dt = %g exchanged dt = %g" % (
# self.name, old_dt, dt)
#print "ccplr_t = %g ecplr_t = %g" % (self.ccplr_t, self.ecplr_t)
return dt
def exchangeSignal(self, signal):
from ExchangerLib import exchangeSignal
mycomm = self.communicator
newsgnl = exchangeSignal(signal,
mycomm.handle(),
self.sinkComm.handle(),
0)
return newsgnl
class Inventory(Coupler.Inventory):
import pyre.inventory as prop
# excluding nodes in top boundary? (used if vbc is read from file)
exclude_top = prop.bool("exclude_top", default=False)
# excluding nodes in bottom boundary?
exclude_bottom = prop.bool("exclude_bottom", default=False)
# version
__id__ = "$Id$"
# End of file
Computing file changes ...