SPINS Science Files: Difference between revisions

From Fluids Wiki
Jump to navigation Jump to search
mNo edit summary
(Restructure by function's purpose)
Line 3: Line 3:
Unless otherwise mentioned, the functions below work for both unmapped and mapped domains where the mapping is along the bottom of the domain (where the bottom is at the 0-index in the z-dimension, as opposed to at the <math> N_z-1 </math> index). Another way to say this is that z increases with the index.
Unless otherwise mentioned, the functions below work for both unmapped and mapped domains where the mapping is along the bottom of the domain (where the bottom is at the 0-index in the z-dimension, as opposed to at the <math> N_z-1 </math> index). Another way to say this is that z increases with the index.


== Notation ==
== Details and Notes ==
 
=== Notation ===


<span style="color:red">Warning!</span> Multiple different notations are used below. Subscripts of <math> u </math>, <math> v </math>, and <math> w </math> are always derivatives with respect to the subscript variable. However, subscripts of <math> \omega </math> and <math> t </math> are components. That is, <math> u_x </math> and <math> \omega_x </math> are the x-derivative of <math> u </math> and the x-component of vorticity.
<span style="color:red">Warning!</span> Multiple different notations are used below. Subscripts of <math> u </math>, <math> v </math>, and <math> w </math> are always derivatives with respect to the subscript variable. However, subscripts of <math> \omega </math> and <math> t </math> are components. That is, <math> u_x </math> and <math> \omega_x </math> are the x-derivative of <math> u </math> and the x-component of vorticity.


== Units ==
=== Units ===


The units of each of the functions have been built under the assumption that physical units are being used in the simulation. These computations will work for nondimensional simulations, but more care must be taken to ensure the scalings are appropriate. Physical units are typically:
The units of each of the functions have been built under the assumption that physical units are being used in the simulation. These computations will work for nondimensional simulations, but more care must be taken to ensure the scalings are appropriate. Physical units are typically:
Line 24: Line 26:




== Boundary Stresses ==


== bottom_slope.cpp ==
=== bottom_slope.cpp ===
Compute the vector of the bottom slope at each x-grid point. This is used for calculating the stresses along the bottom boundary (cf. [[#bottom_stress_x.cpp|bottom_stress_x.cpp]] and  [[#bottom_stress_y.cpp|bottom_stress_y.cpp]]).
Compute the vector of the bottom slope at each x-grid point. This is used for calculating the stresses along the bottom boundary (cf. [[#bottom_stress_x.cpp|bottom_stress_x.cpp]] and  [[#bottom_stress_y.cpp|bottom_stress_y.cpp]]).




<div id="bottom_stress_x.cpp"></div>
<div id="bottom_stress_x.cpp"></div>
== bottom_stress_x.cpp ==
=== bottom_stress_x.cpp ===
Compute the 2D vector of the x-component of stress on the bottom boundary. The z boundary condition must be no slip.
Compute the 2D vector of the x-component of stress on the bottom boundary. The z boundary condition must be no slip.


Line 48: Line 51:


<div id="bottom_stress_y.cpp"></div>
<div id="bottom_stress_y.cpp"></div>
== bottom_stress_y.cpp ==
=== bottom_stress_y.cpp ===
Compute the 2D vector of the y-component of stress on the bottom boundary. The z boundary condition must be no slip.
Compute the 2D vector of the y-component of stress on the bottom boundary. The z boundary condition must be no slip.


Line 62: Line 65:


where <math> \alpha(x) = \sqrt{1 + h'^2(x)} </math> and where <math> h'(x) </math> is the bottom slope.
where <math> \alpha(x) = \sqrt{1 + h'^2(x)} </math> and where <math> h'(x) </math> is the bottom slope.
=== top_stress_x.cpp ===
Compute the 2D vector of the x-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it would entail copying what is done for the bottom boundary).
<math> t_x = -\mu u_z </math>
where <math> \mu = \nu \rho_0 </math> is the dynamic viscosity.
=== top_stress_y.cpp ===
Compute the 2D vector of the y-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it's would entail copying what is done for the bottom boundary).
<math> t_y = -\mu v_z </math>
where <math> \mu = \nu \rho_0 </math> is the dynamic viscosity.
== Energy Budget ==




<div id="compute_Background_PE.cpp"></div>
<div id="compute_Background_PE.cpp"></div>
== compute_Background_PE.cpp ==
=== compute_Background_PE.cpp ===
Compute the value of the background potential energy,
Compute the value of the background potential energy,


Line 74: Line 95:


<div id="compute_BPE_from_internal.cpp"></div>
<div id="compute_BPE_from_internal.cpp"></div>
== compute_BPE_from_internal.cpp ==
=== compute_BPE_from_internal.cpp ===
Compute the rate of energy transfer from internal energy into background potential energy.
Compute the rate of energy transfer from internal energy into background potential energy.


Line 82: Line 103:
For more information see Winters et al. (1995). It is assumed that gravity points in the negative z direction.
For more information see Winters et al. (1995). It is assumed that gravity points in the negative z direction.


== compute_quadweights.cpp ==
=== dissipation.cpp ===
Compute the quadrature weights for each dimension.
Compute the viscous dissipation <math> \epsilon = 2 \mu e_{ij} e_{ij} </math>


If the boundary condition is no-slip, use the Clenshaw-Curtis quadrature weights:
where summation is implied over duplicate indices and <math> e_{ij} = \frac{1}{2} (\frac{\partial u_i}{\partial x_j} + \frac{\partial u_j}{\partial x_i})</math>
is the strain rate tensor.


<math> w = ... </math>


If the boundary condition is free-slip, use the trapezoid rule:


<math> w = L_x/N_x = \Delta x </math>
== Vorticity and Vorticity Equation ==


== compute_vorticity.cpp ==
=== compute_vorticity.cpp ===
Compute all vorticity components.
Compute all vorticity components.


== compute_vort_x.cpp ==
=== compute_vort_x.cpp ===
Compute the x-component of vorticity: <math> \omega_x = w_y - v_z </math>
Compute the x-component of vorticity: <math> \omega_x = w_y - v_z </math>


== compute_vort_y.cpp ==
=== compute_vort_y.cpp ===
Compute the y-component of vorticity: <math> \omega_y = u_z - w_x </math>
Compute the y-component of vorticity: <math> \omega_y = u_z - w_x </math>


== compute_vort_z.cpp ==
=== compute_vort_z.cpp ===
Compute the z-component of vorticity: <math> \omega_z = v_x - u_y </math>
Compute the z-component of vorticity: <math> \omega_z = v_x - u_y </math>


== dissipation.cpp ==
Compute the viscous dissipation <math> \epsilon = 2 \mu e_{ij} e_{ij} </math>


where summation is implied over duplicate indices and <math> e_{ij} = \frac{1}{2} (\frac{\partial u_i}{\partial x_j} + \frac{\partial u_j}{\partial x_i})</math>
=== vortex_stretch_x.cpp ===
is the strain rate tensor.
 
Compute the x-component of the vorticity production due to stretching/tilting
 
<math> \omega_x u_x + \omega_y u_y + \omega_z u_z </math>
 
cf. [[Vorticity equation]]
 
=== vortex_stretch_y.cpp ===
 
Compute the y-component of the vorticity production due to stretching/tilting
 
<math> \omega_x v_x + \omega_y v_y + \omega_z v_z </math>
 
cf. [[Vorticity equation]]
 
=== vortex_stretch_z.cpp ===
 
Compute the z-component of the vorticity production due to stretching/tilting
 
<math> \omega_x w_x + \omega_y w_y + \omega_z w_z </math>
 
cf. [[Vorticity equation]]
 
== Enstrophy equation ==


== enstrophy_density.cpp ==
=== enstrophy_density.cpp ===
Compute the enstrophy density
Compute the enstrophy density
<math> \Omega = \frac{1}{2} \omega_i\omega_i = \frac{1}{2} (\omega_x^2 + \omega_y^2 + \omega_z^2) </math>
<math> \Omega = \frac{1}{2} \omega_i\omega_i = \frac{1}{2} (\omega_x^2 + \omega_y^2 + \omega_z^2) </math>




== enstrophy_stretch_production.cpp ==
=== enstrophy_stretch_production.cpp ===
Compute the enstrophy production due to vortex tilting/stretching  
Compute the enstrophy production due to vortex tilting/stretching  
<math> \omega_i \omega_j e_{ij} =  \omega_i \omega_j \frac{\partial u_i}{\partial x_j} </math>
<math> \omega_i \omega_j e_{ij} =  \omega_i \omega_j \frac{\partial u_i}{\partial x_j} </math>
Line 126: Line 167:




== find_expansion.cpp  ==
 
== Other ==
 
=== compute_quadweights.cpp ===
Compute the quadrature weights for each dimension.
 
If the boundary condition is no-slip, use the Clenshaw-Curtis quadrature weights:
 
<math> w = ... </math>
 
If the boundary condition is free-slip, use the trapezoid rule:
 
<math> w = L_x/N_x = \Delta x </math>
 
 
=== find_expansion.cpp  ===
Returns the expansion types for each field.
Returns the expansion types for each field.


Line 174: Line 230:




== get_quad.cpp ==
=== get_quad.cpp ===
Fairly certain that this is a deprecated function
Fairly certain that this is a deprecated function


== overturning_2d.cpp ==  
=== overturning_2d.cpp ===  


Details to be added. It's an old function and probably deprecated.
Details to be added. It's an old function and probably deprecated.


== read_2d_restart.cpp ==
=== read_2d_restart.cpp ===


For reading 2D spins files and (likely) extending to 3D.
For reading 2D spins files and (likely) extending to 3D.
Line 187: Line 243:
Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.  
Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.  


== read_2d_slice.cpp ==
=== read_2d_slice.cpp ===


For reading 2D matlab files or 2D slices.
For reading 2D matlab files or 2D slices.
Line 193: Line 249:
Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.
Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.


== swap_trig.cpp ==  
=== swap_trig.cpp ===


Change cosine expansion to sine expansion and vice versa. To be used in find_expansion for variables of derivatives.
Change cosine expansion to sine expansion and vice versa. To be used in find_expansion for variables of derivatives.
== top_stress_x.cpp ==
Compute the 2D vector of the x-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it would entail copying what is done for the bottom boundary).
<math> t_x = -\mu u_z </math>
where <math> \mu = \nu \rho_0 </math> is the dynamic viscosity.
== top_stress_y.cpp ==
Compute the 2D vector of the y-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it's would entail copying what is done for the bottom boundary).
<math> t_y = -\mu v_z </math>
where <math> \mu = \nu \rho_0 </math> is the dynamic viscosity.
== vortex_stretch_x.cpp ==
Compute the x-component of the vorticity production due to stretching/tilting
<math> \omega_x u_x + \omega_y u_y + \omega_z u_z </math>
cf. [[Vorticity equation]]
== vortex_stretch_y.cpp ==
Compute the y-component of the vorticity production due to stretching/tilting
<math> \omega_x v_x + \omega_y v_y + \omega_z v_z </math>
cf. [[Vorticity equation]]
== vortex_stretch_z.cpp ==
Compute the z-component of the vorticity production due to stretching/tilting
<math> \omega_x w_x + \omega_y w_y + \omega_z w_z </math>
cf. [[Vorticity equation]]

Revision as of 12:41, 8 October 2020

SPINS comes with a variety of Science files which help with simulation data analysis. Below is a list of currently available functions with a brief description of their purpose and the assumptions behind their implementation. These Science files are in spins/src/Science.

Unless otherwise mentioned, the functions below work for both unmapped and mapped domains where the mapping is along the bottom of the domain (where the bottom is at the 0-index in the z-dimension, as opposed to at the index). Another way to say this is that z increases with the index.

Details and Notes

Notation

Warning! Multiple different notations are used below. Subscripts of , , and are always derivatives with respect to the subscript variable. However, subscripts of and are components. That is, and are the x-derivative of and the x-component of vorticity.

Units

The units of each of the functions have been built under the assumption that physical units are being used in the simulation. These computations will work for nondimensional simulations, but more care must be taken to ensure the scalings are appropriate. Physical units are typically:

Length m
Time s
Density kg/m^3

The reference density should be 1000 kg/m^3 for the stress and dissipation calculations to be physically correct. The density field can be (and often is) non-dimensionalized to . If nondimensionalized, compute_Background_PE.cpp and compute_BPE_from_internal.cpp assume this form of scaling. These two functions also need to know if the density field is dimensional or not.


Boundary Stresses

bottom_slope.cpp

Compute the vector of the bottom slope at each x-grid point. This is used for calculating the stresses along the bottom boundary (cf. bottom_stress_x.cpp and bottom_stress_y.cpp).


bottom_stress_x.cpp

Compute the 2D vector of the x-component of stress on the bottom boundary. The z boundary condition must be no slip.

If the case is unmapped:

where is the dynamic viscosity.

If the case is mapped:

where and where is the bottom slope.


bottom_stress_y.cpp

Compute the 2D vector of the y-component of stress on the bottom boundary. The z boundary condition must be no slip.

If the case is unmapped:

where is the dynamic viscosity.

If the case is mapped:

where and where is the bottom slope.

top_stress_x.cpp

Compute the 2D vector of the x-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it would entail copying what is done for the bottom boundary).

where is the dynamic viscosity.

top_stress_y.cpp

Compute the 2D vector of the y-component of stress on the top boundary. The z boundary condition must be no slip and have no mapping along the top boundary. Implementation for mapping is missing as of 2020 (it's would entail copying what is done for the bottom boundary).

where is the dynamic viscosity.

Energy Budget

compute_Background_PE.cpp

Compute the value of the background potential energy,

where is the depth of an element of the sorted density field which minimized the potential energy (ie. ). For more information see Winters et al. (1995). It is assumed that gravity points in the negative z direction.


compute_BPE_from_internal.cpp

Compute the rate of energy transfer from internal energy into background potential energy.

where and are the depths of the upper and lower boundaries, respectively. The integral is taken over the horizontal extent. For more information see Winters et al. (1995). It is assumed that gravity points in the negative z direction.

dissipation.cpp

Compute the viscous dissipation

where summation is implied over duplicate indices and is the strain rate tensor.


Vorticity and Vorticity Equation

compute_vorticity.cpp

Compute all vorticity components.

compute_vort_x.cpp

Compute the x-component of vorticity:

compute_vort_y.cpp

Compute the y-component of vorticity:

compute_vort_z.cpp

Compute the z-component of vorticity:


vortex_stretch_x.cpp

Compute the x-component of the vorticity production due to stretching/tilting

cf. Vorticity equation

vortex_stretch_y.cpp

Compute the y-component of the vorticity production due to stretching/tilting

cf. Vorticity equation

vortex_stretch_z.cpp

Compute the z-component of the vorticity production due to stretching/tilting

cf. Vorticity equation

Enstrophy equation

enstrophy_density.cpp

Compute the enstrophy density


enstrophy_stretch_production.cpp

Compute the enstrophy production due to vortex tilting/stretching

where summation is implied over duplicate indices and is the strain rate tensor.

cf. The Enstrophy equation.


Other

compute_quadweights.cpp

Compute the quadrature weights for each dimension.

If the boundary condition is no-slip, use the Clenshaw-Curtis quadrature weights:

If the boundary condition is free-slip, use the trapezoid rule:


find_expansion.cpp

Returns the expansion types for each field.

Boundary Condition Flow Variable
u v w otherwise
Fourier Periodic Periodic Periodic Periodic
No slip Chebyshev Chebyshev Chebyshev Chebyshev
Free slip in x sine cosine cosine cosine
Free slip in y cosine sine cosine cosine
Free slip in z cosine cosine sine cosine

Spins assumes that a variable ending in _x, _y, or _z is the x, y, or z derivative of that particular variable. This is needed to get the proper expansion type for the derivative of the given variable.


get_quad.cpp

Fairly certain that this is a deprecated function

overturning_2d.cpp

Details to be added. It's an old function and probably deprecated.

read_2d_restart.cpp

For reading 2D spins files and (likely) extending to 3D.

Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.

read_2d_slice.cpp

For reading 2D matlab files or 2D slices.

Unsure why this is in /Science. IO should also be cleaned up since there's a bunch of overlapping functions.

swap_trig.cpp

Change cosine expansion to sine expansion and vice versa. To be used in find_expansion for variables of derivatives.