Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

  • 8a09c73
  • /
  • tran.cyl_spher.Rd
Raw File Download
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
content badge Iframe embedding
swh:1:cnt:2ce0b5df3620d1635be975561489120a2901bf26
directory badge Iframe embedding
swh:1:dir:8a09c739a8f00d9b1bf0ca569854956c68760562
Citations

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
  • directory
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
tran.cyl_spher.Rd
\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}

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Contact— JavaScript license information— Web API

back to top