\name{tran.cylindrical}
\alias{tran.cylindrical}
\alias{tran.spherical}
\title{
Diffusive Transport in cylindrical (r, theta, z) and spherical (r, theta, phi)
coordinates.
}
\description{
Estimates the transport term (i.e. the rate of change of a concentration
due to diffusion) in a cylindrical (r, theta, z) or spherical (r, theta, phi)
coordinate system.
}
\usage{
tran.cylindrical (C, C.r.up = NULL, C.r.down = NULL,
C.theta.up = NULL, C.theta.down = NULL,
C.z.up = NULL, C.z.down = NULL,
flux.r.up = NULL, flux.r.down = NULL,
flux.theta.up = NULL, flux.theta.down = NULL,
flux.z.up = NULL, flux.z.down = NULL,
cyclicBnd = NULL,
D.r = NULL, D.theta = D.r, D.z = D.r,
r = NULL, theta = NULL, z = NULL)
tran.spherical (C, C.r.up = NULL, C.r.down = NULL,
C.theta.up = NULL, C.theta.down = NULL,
C.phi.up = NULL, C.phi.down = NULL,
flux.r.up = NULL, flux.r.down = NULL,
flux.theta.up = NULL, flux.theta.down = NULL,
flux.phi.up = NULL, flux.phi.down = NULL,
cyclicBnd = NULL,
D.r = NULL, D.theta = D.r, D.phi = D.r,
r = NULL, theta = NULL, phi = NULL)
}
\arguments{
\item{C }{concentration, expressed per unit volume, defined at the centre
of each grid cell; Nr*Nteta*Nz (cylindrica) or Nr*Ntheta*Nphi (spherical
coordinates) array [M/L3].
}
\item{C.r.up }{concentration at upstream boundary in r(x)-direction;
one value [M/L3].
}
\item{C.r.down }{concentration at downstream boundary in r(x)-direction;
one value [M/L3].
}
\item{C.theta.up }{concentration at upstream boundary in theta-direction;
one value [M/L3].
}
\item{C.theta.down }{concentration at downstream boundary in theta-direction;
one value [M/L3].
}
\item{C.z.up }{concentration at upstream boundary in z-direction (cylindrical
coordinates); one value [M/L3].
}
\item{C.z.down }{concentration at downstream boundary in z-direction(cylindrical
coordinates); one value [M/L3].
}
\item{C.phi.up }{concentration at upstream boundary in phi-direction (spherical
coordinates); one value [M/L3].
}
\item{C.phi.down }{concentration at downstream boundary in phi-direction(spherical
coordinates); one value [M/L3].
}
\item{flux.r.up }{flux across the upstream boundary in r-direction,
positive = INTO model domain; one value [M/L2/T].
}
\item{flux.r.down }{flux across the downstream boundary in r-direction,
positive = OUT of model domain; one value [M/L2/T].
}
\item{flux.theta.up }{flux across the upstream boundary in theta-direction,
positive = INTO model domain; one value [M/L2/T].
}
\item{flux.theta.down }{flux across the downstream boundary in theta-direction,
positive = OUT of model domain; one value [M/L2/T].
}
\item{flux.z.up }{flux across the upstream boundary in z-direction(cylindrical
coordinates); positive = INTO model domain; one value [M/L2/T].
}
\item{flux.z.down }{flux across the downstream boundary in z-direction,
(cylindrical coordinates); positive = OUT of model domain; one value [M/L2/T].
}
\item{flux.phi.up }{flux across the upstream boundary in phi-direction(spherical
coordinates); positive = INTO model domain; one value [M/L2/T].
}
\item{flux.phi.down }{flux across the downstream boundary in phi-direction,
(spherical coordinates); positive = OUT of model domain; one value [M/L2/T].
}
\item{cyclicBnd }{If not \code{NULL}, the direction in which a cyclic
boundary is defined, i.e. \code{cyclicBnd = 1} for the \code{r} direction,
\code{cyclicBnd = 2} for the \code{theta} direction and
\code{cyclicBnd = c(1,2)} for both the \code{r} and \code{theta} direction.
}
\item{D.r }{diffusion coefficient in r-direction, defined on grid cell
interfaces. One value or a vector of length (Nr+1), [L2/T].
}
\item{D.theta }{diffusion coefficient in theta-direction, defined on grid cell
interfaces. One value or or a vector of length (Ntheta+1), [L2/T].
}
\item{D.z }{diffusion coefficient in z-direction, defined on grid cell
interfaces for cylindrical coordinates. One value or a vector of length
(Nz+1) [L2/T].
}
\item{D.phi }{diffusion coefficient in phi-direction, defined on grid cell
interfaces for cylindrical coordinates. One value or a vector of length
(Nphi+1) [L2/T].
}
\item{r }{position of adjacent cell interfaces in the r-direction.
A vector of length Nr+1 [L].
}
\item{theta }{position of adjacent cell interfaces in the theta-direction.
A vector of length Ntheta+1 [L]. Theta should be within [0,2 pi]
}
\item{z }{position of adjacent cell interfaces in the z-direction (cylindrical
coordinates). A vector of length Nz+1 [L].
}
\item{phi }{position of adjacent cell interfaces in the phi-direction (spherical
coordinates). A vector of length Nphi+1 [L]. Phi should be within [0,2 pi]
}
}
\value{
a list containing:
\item{dC }{the rate of change of the concentration C due to transport,
defined in the centre of each grid cell, a Nr*Nteta*Nz (cylindrical) or
Nr*Ntheta*Nphi (spherical coordinates) array. [M/L3/T].
}
\item{flux.r.up }{flux across the upstream boundary in r-direction,
positive = INTO model domain. A matrix of dimension Nteta*Nz (cylindrical)
or Ntheta*Nphi (spherical) [M/L2/T].
}
\item{flux.r.down }{flux across the downstream boundary in r-direction,
positive = OUT of model domain. A matrix of dimension Nteta*Nz (cylindrical)
or Ntheta*Nphi (spherical) [M/L2/T].
}
\item{flux.theta.up }{flux across the upstream boundary in theta-direction,
positive = INTO model domain. A matrix of dimension Nr*Nz (cylindrical) or
or Nr*Nphi (spherical) [M/L2/T].
}
\item{flux.theta.down }{flux across the downstream boundary in theta-direction,
positive = OUT of model domain. A matrix of dimension Nr*Nz (cylindrical) or
Nr*Nphi (spherical) [M/L2/T].
}
\item{flux.z.up }{flux across the upstream boundary in z-direction,
for cylindrical coordinates;
positive = OUT of model domain. A matrix of dimension Nr*Nteta [M/L2/T].
}
\item{flux.z.down }{flux across the downstream boundary in z-direction
for cylindrical coordinates;
positive = OUT of model domain. A matrix of dimension Nr*Nteta [M/L2/T].
}
\item{flux.phi.up }{flux across the upstream boundary in phi-direction,
for spherical coordinates;
positive = OUT of model domain. A matrix of dimension Nr*Nteta [M/L2/T].
}
\item{flux.phi.down }{flux across the downstream boundary in phi-direction,
for spherical coordinates;
positive = OUT of model domain. A matrix of dimension Nr*Nteta [M/L2/T].
}
}
\examples{
## =============================================================================
## Testing the functions
## =============================================================================
# Grid definition
r.N <- 4 # number of cells in r-direction
theta.N <- 6 # number of cells in theta-direction
z.N <- 3 # number of cells in z-direction
D <- 100 # diffusion coefficient
r <- seq(0, 8,len=r.N+1) # cell size r-direction [cm]
theta <- seq(0,2*pi,len=theta.N+1) # theta-direction - theta: from 0, 2pi
phi <- seq(0,2*pi,len= z.N+1) # phi-direction (0,2pi)
z <- seq(0,5,len=z.N+1) # cell size z-direction [cm]
# Intial conditions
C <- array(dim = c(r.N, theta.N, z.N), data=0)
# Concentration boundary conditions
tran.cylindrical (C = C, D.r = D, D.theta = D,
C.r.up = 1, C.r.down = 1,
C.theta.up = 1, C.theta.down = 1,
C.z.up = 1, C.z.down = 1,
r = r, theta = theta, z = z )
tran.spherical (C = C, D.r = D, D.theta = D,
C.r.up = 1, C.r.down = 1, C.theta.up = 1, C.theta.down = 1,
C.phi.up = 1, C.phi.down = 1,
r = r, theta = theta, phi = phi)
# Flux boundary conditions
tran.cylindrical(C = C, D.r = D, r = r, theta = theta, z = z,
flux.r.up = 10, flux.r.down = 10,
flux.theta.up = 10, flux.theta.down = 10,
flux.z.up = 10, flux.z.down = 10)
tran.spherical(C = C, D.r = D, r = r, theta = theta, phi = phi,
flux.r.up = 10, flux.r.down = 10,
flux.theta.up = 10, flux.theta.down = 10,
flux.phi.up = 10, flux.phi.down = 10)
# cyclic boundary conditions
tran.cylindrical(C = C, D.r = D, r = r, theta = theta, z = z,
cyclicBnd = 1:3)
tran.spherical(C = C, D.r = D, r = r, theta = theta, phi = phi,
cyclicBnd = 1:3)
# zero-gradient boundary conditions
tran.cylindrical(C = C, D.r = D, r = r, theta = theta, z = z)
tran.spherical(C = C, D.r = D, r = r, theta = theta, phi = phi)
## =============================================================================
## A model with diffusion and first-order consumption
## =============================================================================
N <- 10 # number of grid cells
rr <- 0.005 # consumption rate
D <- 400
r <- seq (2, 4, len=N+1)
theta <- seq (0, 2*pi, len = N+1)
z <- seq (0, 3, len = N+1)
phi <- seq (0, 2*pi, len = N+1)
# The model equations
Diffcylin <- function (t, y, parms) {
CONC <- array(dim = c(N, N, N), data = y)
tran <- tran.cylindrical(CONC,
D.r = D, D.theta = D, D.z = D,
r = r, theta = theta, z = z,
C.r.up = 0, C.r.down = 1,
cyclicBnd = 2)
dCONC <- tran$dC - rr * CONC
return (list(dCONC))
}
Diffspher <- function (t, y, parms) {
CONC <- array(dim = c(N, N, N), data = y)
tran <- tran.spherical (CONC,
D.r = D, D.theta = D, D.phi = D,
r = r, theta = theta, phi = phi,
C.r.up = 0, C.r.down = 1,
cyclicBnd = 2:3)
dCONC <- tran$dC - rr * CONC
return (list(dCONC))
}
# initial condition: 0 everywhere, except in central point
y <- array(dim = c(N, N, N), data = 0)
N2 <- ceiling(N/2)
y[N2, N2, N2] <- 100 # initial concentration in the central point...
# solve to steady-state; cyclicBnd = 2,
outcyl <- steady.3D (y = y, func = Diffcylin, parms = NULL,
dim = c(N, N, N), lrw = 1e6, cyclicBnd = 2)
STDcyl <- array(dim = c(N, N, N), data = outcyl$y)
image(STDcyl[,,1])
# For spherical coordinates, cyclic Bnd = 2, 3
outspher <- steady.3D (y = y, func = Diffspher, parms = NULL, pos=TRUE,
dim = c(N, N, N), lrw = 1e6, cyclicBnd = 2:3)
#STDspher <- array(dim = c(N, N, N), data = outspher$y)
#image(STDspher[,,1])
\dontrun{
image(outspher)
}
}
%%\references{
%%}
\details{
\code{tran.cylindrical} performs (diffusive) transport in cylindrical coordinates
\code{tran.spherical} performs (diffusive) transport in spherical coordinates
The \bold{boundary conditions} are either
\itemize{
\item (1) zero gradient
\item (2) fixed concentration
\item (3) fixed flux
\item (4) cyclic boundary
}
This is also the order of priority. The cyclic boundary overrules the other.
If fixed concentration, fixed flux, and cyclicBnd are \code{NULL} then
the boundary is zero-gradient
A cyclic boundary condition has concentration and flux at upstream and
downstream boundary the same. It is useful mainly for the \code{theta} and
\code{phi} direction.
** Do not expect too much of this equation: do not try to use it with
many boxes **
}
\seealso{
\code{\link{tran.polar}}
for a discretisation of 2-D transport equations in polar coordinates
\code{\link{tran.1D}}, \code{\link{tran.2D}}, \code{\link{tran.3D}}
}
\keyword{utilities}