docs: def SA_tank(D, L, sideA=None, sideB=None, sideA_a=0,
               sideB_a=0, sideA_f=None, sideA_k=None, sideB_f=None, sideB_k=None,
               full_output=False):
      r'''Calculates the surface are of a cylindrical tank with optional heads.
      In the degenerate case of being provided with only `D` and `L`, provides
      the surface area of a cylinder.
  
      Parameters
      ----------
      D : float
          Diameter of the cylindrical section of the tank, [m]
      L : float
          Length of the main cylindrical section of the tank, [m]
      sideA : string, optional
          The left (or bottom for vertical) head of the tank's type; one of
          [None, 'conical', 'ellipsoidal', 'torispherical', 'guppy', 'spherical'].
      sideB : string, optional
          The right (or top for vertical) head of the tank's type; one of
          [None, 'conical', 'ellipsoidal', 'torispherical', 'guppy', 'spherical'].
      sideA_a : float, optional
          The distance the head as specified by sideA extends down or to the left
          from the main cylindrical section, [m]
      sideB_a : float, optional
          The distance the head as specified by sideB extends up or to the right
          from the main cylindrical section, [m]
      sideA_f : float, optional
          Dish-radius parameter for side A; fD  = dish radius [1/m]
      sideA_k : float, optional
          knuckle-radius parameter for side A; kD = knuckle radius [1/m]
      sideB_f : float, optional
          Dish-radius parameter for side B; fD  = dish radius [1/m]
      sideB_k : float, optional
          knuckle-radius parameter for side B; kD = knuckle radius [1/m]
  
      Returns
      -------
      SA : float
          Surface area of the tank [m^2]
      areas : tuple, only returned if full_output == True
          (sideA_SA, sideB_SA, lateral_SA)
  
      Other Parameters
      ----------------
      full_output : bool, optional
          Returns a tuple of (sideA_SA, sideB_SA, lateral_SA) if True
  
      Examples
      --------
      Cylinder, Spheroid, Long Cones, and spheres. All checked.
  
      >>> SA_tank(D=2, L=2)
      18.84955592153876
      >>> SA_tank(D=1., L=0, sideA='ellipsoidal', sideA_a=2, sideB='ellipsoidal',
      ... sideB_a=2)
      28.480278854014387
      >>> SA_tank(D=1., L=5, sideA='conical', sideA_a=2, sideB='conical',
      ... sideB_a=2)
      22.18452243965656
      >>> SA_tank(D=1., L=5, sideA='spherical', sideA_a=0.5, sideB='spherical',
      ... sideB_a=0.5)
      18.84955592153876
      '''
      # Side A
      if sideA == 'conical':
          sideA_SA = SA_conical_head(D=D, a=sideA_a)
      elif sideA == 'ellipsoidal':
          sideA_SA = SA_ellipsoidal_head(D=D, a=sideA_a)
      elif sideA == 'guppy':
          sideA_SA = SA_guppy_head(D=D, a=sideA_a)
      elif sideA == 'spherical':
          sideA_SA = SA_partial_sphere(D=D, h=sideA_a)
      elif sideA == 'torispherical':
          sideA_SA = SA_torispheroidal(D=D, fd=sideA_f, fk=sideA_k)
      else:
          sideA_SA = pi/4*D**2 # Circle
      # Side B
      if sideB == 'conical':
          sideB_SA = SA_conical_head(D=D, a=sideB_a)
      elif sideB == 'ellipsoidal':
          sideB_SA = SA_ellipsoidal_head(D=D, a=sideB_a)
      elif sideB == 'guppy':
          sideB_SA = SA_guppy_head(D=D, a=sideB_a)
      elif sideB == 'spherical':
          sideB_SA = SA_partial_sphere(D=D, h=sideB_a)
      elif sideB == 'torispherical':
          sideB_SA = SA_torispheroidal(D=D, fd=sideB_f, fk=sideB_k)
      else:
          sideB_SA = pi/4*D**2 # Circle
  
      lateral_SA = pi*D*L
  
      SA = sideA_SA + sideB_SA + lateral_SA
      if full_output:
          return SA, (sideA_SA, sideB_SA, lateral_SA)
      else:
          return SA