Axisymmetric (cylindrical) and Spherical materials are included in Tensor Mechanics for revolved geometries and assume symmetrical loading.  These 'strain calculator' materials compute the strain within the appropriate coordinate system and include kernels to handle the stress divergence.  The ```AxisymmetricRZ``` material is appropriate for a 2D simulation and assumes symmetry revolved about the z-axis in the polar angle.  The ```RSpherical``` material assumes symmetry in both the polar and azimuthal angles and takes a 1D mesh.

Introduction to 2D Strain Geometries

A 2D formulation of an appropriate simulation problem can reduce the simulation run time while preserving key physics.  The 2D geometries described below simplify either the stress or strain tensor by setting the out-of-plane shear components to zero.  [Plane stress](https://en.wikipedia.org/wiki/Plane_stress) assumptions are appropriate for thin volumes in which the normal and shear out-of-plane stresses are close to zero. Generalized plane strain assumptions modify the strain tensor to set the out-of-plane shear strains to zero and set the normal out-of-plane strain to a value which is not dependent on out-of-plane displacement:

\epsilon_{xx} & \epsilon_{xy} & 0 \\
\epsilon_{yx} & \epsilon_{yy} & 0 \\
0 & 0 & \epsilon_{zz}

where the value of $$\epsilon_{zz}$$ depends on the assumptions made in the specific simulation type.  The calculation for this out-of-plane strain term is a virtual class, ```computeStrainZZ()``` which must be overwritten by inheriting classes ([Doxygen](http://mooseframework.org/docs/doxygen/modules/classCompute2DSmallStrain.html)).

Using an appropriate set of geometry and boundary conditions, these classes of problems have strain and stress fields which are not functions of the out of plane coordinate variable.  In Cartesian plane strain simulations, these solution fields do not depend on the $$Z$$ coordinate, and in Cylindrical coordinate axisymmetric system, the values of stress and strain in the $$\theta$$ direction do not depend on the $$\theta$$ coordinate.

Generalized Plane Strain Problems
Plane strain assumptions are applied to thick structures or objects with a uniform cross section.  Classically it is assumed that the thickness in the $$Z$$-direction prevents any displacement from occurring in the $$Z$$-direction; therefore, the strain $$\epsilon_{zz}$$ is defined to be zero ([Doxygen](http://mooseframework.org/docs/doxygen/modules/classComputePlaneSmallStrain.html)).

In thick geometries which are unconstrained in the $$Z$$-direction, it is more appropriate to allow the strain $$\epsilon_{zz}$$ to be a constant non-zero value under generalized plane strain.  In this strain calculation model the material is free to contract or expand in the $$Z$$-direction, and the integrated out-of-plane stress across the entire cross section is set to zero.  The generalized plane strain model retains the requirement of planar cross sections.   

Axisymmetric or Axial Revolved Problems
Axisymmetric simulations are appropriate to problems in which a solid is generated by [revolving a planar area about an axis](https://en.wikipedia.org/wiki/Axial_symmetry) in the same plane.  The axisymmetric model employs the cylindrical coordinates, $$r$$, $$z$$, and $$\theta$$, where the planar cross section is rotated about the $$z$$ axis.  The cylindrical coordinate system strain tensor for axisymmetric problems has the form
\epsilon_{rr} & \epsilon_{rz} & 0 \\
\epsilon_{zr} & \epsilon_{zz} & 0 \\
0 & 0 & \epsilon_{\theta \theta}
where the value of the strain $$\epsilon_{\theta \theta}$$ depends on the displacement and position in the radial direction $$\epsilon_{\theta \theta} = \frac{u_r}{X_r}$$.  Although axisymmetric problems solve for 3D stress and strain fields, the problem is mathematically 2D.  Only minimal changes are required to adapt a plane strain problem to an axisymmetric problem; thus, the axisymmetric code overwrites the same function seen in the plane strain models ([Doxygen](http://mooseframework.org/docs/doxygen/modules/classComputeAxisymmetricRZSmallStrain.html)).

Finite Strain Incremental Problems
In finite strain, the same assumptions from the small strain tensor components are applied to the calculation of the deformation gradient components:  the virtual function ```computeDeformGradZZ``` and its old deformation gradient equivalent ```computeDeformGradZZOld``` must be overwritten in the inheriting 2D  Axisymmetric class ([Doxygen](http://mooseframework.com/docs/doxygen/modules/classComputeAxisymmetricRZFiniteStrain.html)).  

Once the deformation gradient is calculated for the specific 2D geometry, the deformation gradient is passed to the strain and rotation methods used by full 3D Cartesian simulations, as described in the [Finite Strain Mechanics](http://mooseframework.org/wiki/PhysicsModules/TensorMechanics/FiniteStrain/) page.

Axisymmetric Stress Divergence Kernel
As in the Stress Divergence kernel for Cartesian coordinates, the stress divergence kernel for the Axisymmetric simulations includes the stress divergence calculation for the residual and the calculation of the Jacobian matrix.  In cylindrical coordinates, the [divergence of a rank-2 tensor](https://en.wikipedia.org/wiki/Tensor_derivative_%28continuum_mechanics%29#Cylindrical_polar_coordinates_2) includes mixed term contributions.  In the axisymmetric model we assume symmetric loading conditions, in addition to the zero out-of-plane shear strains, so that the residual computation is simplified.

$$ \begin{eqnarray} 
\nabla \sigma  & = & \left[ \frac{\partial \sigma_{rr}}{\partial r} + \frac{u_r}{X_r}\sigma_{\theta \theta} + \frac{\partial \sigma_{rz}}{\partial z} \right] \hat{e}_r \\ 
 & + & \left[ \frac{\partial \sigma_{zz}}{\partial z} + \frac{\partial \sigma_{rz}}{\partial r}    \right] \hat{e}_z
\end{eqnarray} $$

This calculation of the residual and the Jacobian calculation require the axis of symmetry lies along the $$z$$-axis.  The calculation of the Jacobian is similarly complex, requiring up to four terms in the calculation of the diagonal entries.

Input File Modifications for an Axisymmetric Problem

To modify a 2D problem in Cartesian coordinates, e.g. a plane strain problem, to an Axisymmetric problem in cylindrical coordinates:

  1. Change all of the variable names from Cartesian variables to cylindrical variables
      - ```displacements = 'disp_x disp_y' ``` becomes ```displacements = 'disp_r disp_z'```
  2. Change the coordinate system in MOOSE by adding a new block, called ```Problem```
      -   ```
            coord_type = RZ
  3. Change the compute strain material to use the AxisymmetricRZ compute stress material class within the `[Materials]` block
      - ```ComputeSmallStrain``` becomes `ComputeAxisymmetricRZSmallStrain`

Note that the `TensorMechanics` action will detect the coordinate system that is used and will add the correct stress divergence kernels automatically.

For a detailed example of how to convert a Cartesian 2D problem to an AxisymmetricRZ problem, see the [AxisymmetricRZ tutorial](basics_part_2).

Spherically Symmetrical Problems
The 1D RSpherical materials and kernel are designed to model sphere geometries with 1D models.  Symmetry in the polar ($$ \theta$$) and azimuthal ($$ \phi $$) directions is assumed, and the model is considered to revolve in both of these directions.   In the 1D RSpherical code, the material properties, variables (e.g. temperature), and loading conditions are all assumed to be spherically symmetric:  these attributes only depend on the axial position.  

As in the plane strain and axisymmetric cases, the stress and strain tensors are modified in the spherical problem; only the diagonal components are non-zero in this 1D problem.
\epsilon_{rr} & 0 & 0 \\
0 & \epsilon_{\theta \theta} & 0 \\
0 & 0 & \epsilon_{\phi \phi}
where the value of the  normal strain components in the polar and azimuth directions depend on the displacement and position in the radial direction $$\epsilon_{\phi \phi} = \epsilon_{\theta \theta} = \frac{u_r}{X_r}$$.  

As in the axisymmetric materials, the total strain is computed in the ```ComputeRSphericalSmallStrain``` material ([Doxygen](http://mooseframework.com/docs/doxygen/modules/classComputeRSphericalSmallStrain.html)), and in the finite strain case ```ComputeRSphericalFiniteStrain``` ([Doxygen](http://mooseframework.com/docs/doxygen/modules/classComputeRSphericalFiniteStrain.html)), the deformation gradient is calculated using the strain and displacement relation given above.  More details about the spherical symmetry derivations are available in the online textbook [Applied Mechanics of Solids](http://solidmechanics.org/text/Chapter4_1/Chapter4_1.htm).

1D RSpherical Stress Divergence Kernel
The stress divergence in spherical coordinates includes contributions from the normal polar and azimuthal stresses even in the 1D case.  After simplifying for the 1D case, the spherical stress divergence reduces to

$$ \nabla \sigma  =  \left[ \frac{\partial \sigma_{rr}}{\partial r} + \frac{2}{X_r} \sigma_{rr} - \frac{1}{X_r} \left( \sigma_{\phi \phi} + \sigma_{\theta \theta} \right)  \right] \hat{e}_r $$

In deriving the weak form of this equation, the second term drops out so that the residual contribution in the ```StressDivergenceRSphericalTensors``` kernel is

$$ \mathbf{R} = \sigma_{rr} \frac{ \partial \phi_i }{ \partial r} + \frac{ \phi_i}{X_r} \left( \sigma_{\phi \phi} + \sigma_{\theta \theta} \right) $$

Input File Modifications for 1D RSpherical Problem

Because the spherical symmetry strain and stress materials assume only one independent displacement variable, a new 1D mesh must be generated and the problem dimension must be changed to the lower dimension. 

  1. Change the variable names from Cartesian variables to spherical variables and retain only one variable
      - ```displacements = 'disp_x disp_y' ``` becomes ```displacements = 'disp_r'```
  2. Change the coordinate system in MOOSE by adding a new block, called ```Problem```
      -   ```
            coord_type = RSPHERICAL
  3. Update the mesh to a 1D mesh using the internal MOOSE mesh generator by changing the contents of the mesh block
      - ```
            type = GeneratedMesh
      - ```
            dim = 1
  4. Change the compute strain material to use the AxisymmetricRZ compute stress material class within the `[Materials]` block
      - ```ComputeSmallStrain``` becomes `ComputeRSphericalSmallStrain`