docs: def solve_tank_for_V(self):
          '''Method which is called to solve for tank geometry when a certain
          volume is specified. Will be called by the __init__ method if V is set.
  
          Notes
          -----
          Raises an error if L and either of sideA_a or sideB_a are specified;
          these can only be set once D is known.
          Raises an error if more than one of D, L, or L_over_D are specified.
          Raises an error if the head ratios are not provided.
  
          Calculates initial guesses assuming no heads are present, and then uses
          fsolve to determine the correct dimensions for the tank.
  
          Tested, but bugs and limitations are expected here.
          '''
          if self.L and (self.sideA_a or self.sideB_a):
              raise Exception('Cannot specify head sizes when solving for V')
          if (self.D and self.L) or (self.D and self.L_over_D) or (self.L and self.L_over_D):
              raise Exception('Only one of D, L, or L_over_D can be specified\
              when solving for V')
          if ((self.sideA and not self.sideA_a_ratio) or (self.sideB and not self.sideB_a_ratio)):
              raise Exception('When heads are specified, head parameter ratios are required')
  
          if self.D:
              # Iterate until L is appropriate
              solve_L = lambda L: self._V_solver_error(self.V, self.D, L, self.horizontal, self.sideA, self.sideB, self.sideA_a, self.sideB_a, self.sideA_f, self.sideA_k, self.sideB_f, self.sideB_k, self.sideA_a_ratio, self.sideB_a_ratio)
              Lguess = self.V/(pi/4*self.D**2)
              self.L = float(newton(solve_L, Lguess))
          elif self.L:
              # Iterate until D is appropriate
              solve_D = lambda D: self._V_solver_error(self.V, D, self.L, self.horizontal, self.sideA, self.sideB, self.sideA_a, self.sideB_a, self.sideA_f, self.sideA_k, self.sideB_f, self.sideB_k, self.sideA_a_ratio, self.sideB_a_ratio)
              Dguess = (4*self.V/pi/self.L)**0.5
              self.D = float(newton(solve_D, Dguess))
          else:
              # Use L_over_D until L and D are appropriate
              Lguess = (4*self.V*self.L_over_D**2/pi)**(1/3.)
              solve_L_D = lambda L: self._V_solver_error(self.V, L/self.L_over_D, L, self.horizontal, self.sideA, self.sideB, self.sideA_a, self.sideB_a, self.sideA_f, self.sideA_k, self.sideB_f, self.sideB_k, self.sideA_a_ratio, self.sideB_a_ratio)
              self.L = float(newton(solve_L_D, Lguess))
              self.D = self.L/self.L_over_D