Usage

Smooth cases

To evaluate pressure p and velocity for the cylindrical, smooth, free-slip case

import assess
Rp, Rm = 2.22, 1.22  # outer and inner radius of domain
n = 2  # wave number
k = 3  # polynomial order of radial density variation
solution = assess.CylindricalStokesSolutionSmoothFreeSlip(n, k, Rp=Rp, Rm=Rm)
r, phi = 2, pi/2.  # location to evaluate
print("Radial component of velocity:", solution.u_r(r, phi))
print("Transverse component of velocity:", solution.u_phi(r, phi))
print("Pressure:", solution.p(r, phi))

To evaluate the radial component of stress:

print("Radial deviatoric stress:", solution.tau_rr(r,phi))
# or, radial component of full stress (including pressure)
print("Radial stress:", solution.radial_stress(r, phi))

To evaluate the density perturnation \(\rho'\) that was used:

print("Density perturbation:", solution.delta_rho(r,phi))

To setup a spherical, smooth, zero-slip case:

Rp, Rm = 2.22, 1.22  # outer and inner radius of domain
l = 2  # spherical degree
m = 3  # spherical order
k = 3  # polynomial order of radial density variation
solution = assess.SphericalStokesSolutionSmoothZeroSlip(l, m, k, Rp=Rp, Rm=Rm)
r, theta, phi = 2, pi/2., pi.  # location to evaluate
print("Radial component of velocity:", solution.u_r(r, theta, phi))
print("Colatitudinal (southward) component of velocity:", solution.u_theta(r, theta, phi))
print("Longitudinal (eastward) component of velocity:", solution.u_phi(r, theta, phi))
print("Pressure:", solution.p(r, phi))

To simplify working with Cartesian coordinates, the methods pressure_cartesian, delta_rho_cartesian, radial_stress_cartesian, and velocity_cartesian allow providing 2d (cylindrical cases) or 3d (spherical cases) coordinates (tuple/list/array). The velocity_cartesian method also returns the velocity as a Cartesian xy or xyz-vector.

Delta-function cases

To evaluate the analytical solution with a delta function forcing, one must additionaly specify the radius \(r'\) used in the delta function \(\delta(r-r')\). The analytical solution is split in two halves: one that is valid above the anomaly \(r'\leq r\leq R_+\) and one below \(R_-\leq r\leq r'\). Which of the two solutions is evaluated is chosen by setting the sign parameter: sign=1 for the upper half and sign=-1 for the lower half. Note that the methods do not check in which half the provided coordinates are actually located. This is done so that the discontinuous solutions at \(r=r'\) can be evaluated without ambiguity.

Rp, Rm = 2.22, 1.22  # outer and inner radius of domain
rp = (Rp+Rm)/2.  # density anomaly at
l = 2  # spherical degree
m = 3  # spherical order
solution_above = assess.SphericalStokesSolutionDeltaFreeSlip(l, m, +1, Rp=Rp, Rm=Rm, rp=rp)
solution_below = assess.SphericalStokesSolutionDeltaFreeSlip(l, m, -1, Rp=Rp, Rm=Rm, rp=rp)
r, theta, phi = rp, pi/2., pi.  # location to evaluate
print("Radial component of velocity:", solution_above.u_r(r, theta, phi), solution_below.u_r(r, theta, phi))
print("Colatitudinal (southward) component of velocity:", solution_above.u_theta(r, theta, phi), solution_below.u_theta(r, theta, phi))
print("Longitudinal (eastward) component of velocity:", solution_above.u_phi(r, theta, phi), solution_below.u_phi(r, theta, phi))
print("Pressure:", solution.p(r, phi))

The delta-function classes implement the same methods as the smooth-case classes except for the delta_rho method.

Keyword arguments

All eight classes take the following (optional) keyword arguments with defaults

Rp=2.22 outer radius
Rm=1.22 inner radius
nu=1.00 viscosity
g=1.00 gravitation/magnitude of forcing

Additionally, the delta-function cases have the following default for rp

rp=1.72 radius of perturbation