docs: def temperature_effectiveness_basic(R1, NTU1, subtype='crossflow'):
      r'''Returns temperature effectiveness `P1` of a heat exchanger with 
      a specified heat capacity ratio, number of transfer units `NTU1`,
      and of type `subtype`. This function performs the calculations for the
      basic cases, not actual shell-and-tube exchangers. The supported cases
      are as follows:
          
      * Counterflow (ex. double-pipe)
      * Parallel (ex. double pipe inefficient configuration)
      * Crossflow, single pass, fluids unmixed
      * Crossflow, single pass, fluid 1 mixed, fluid 2 unmixed
      * Crossflow, single pass, fluid 2 mixed, fluid 1 unmixed
      * Crossflow, single pass, both fluids mixed
      
      For parallel flow heat exchangers (this configuration is symmetric):
  
      .. math::
          P_1 = \frac{1 - \exp[-NTU_1(1+R_1)]}{1 + R_1}
  
      For counterflow heat exchangers (this configuration is symmetric):
  
      .. math::
          P_1 = \frac{1 - \exp[-NTU_1(1-R_1)]}{1 - R_1 \exp[-NTU_1(1-R_1)]}
  
      For cross-flow (single-pass) heat exchangers with both fluids unmixed
      (this configuration is symmetric), there are two solutions available;
      a frequently cited approximation and an exact solution which uses
      a numerical integration developed in [4]_. The approximate solution is:
  
      .. math::
          P_1 \approx 1 - \exp\left[\frac{NTU_1^{0.22}}{R_1}
          (\exp(-R_1 NTU_1^{0.78})-1)\right]
  
      The exact solution for crossflow (single pass, fluids unmixed) is:
          
      .. math::
          \epsilon = \frac{1}{R_1} - \frac{\exp(-R_1 \cdot NTU_1)}{2(R_1 NTU_1)^2}
          \int_0^{2 NTU_1\sqrt{R_1}} \left(1 + NTU_1 - \frac{v^2}{4R_1 NTU_1}
          \right)\exp\left(-\frac{v^2}{4R_1 NTU_1}\right)v I_0(v) dv
  
      For cross-flow (single-pass) heat exchangers with fluid 1 mixed, fluid 2
      unmixed:
  
      .. math::
          P_1 = 1 - \exp\left(-\frac{K}{R_1}\right)
          
          K = 1 - \exp(-R_1 NTU_1)
  
      For cross-flow (single-pass) heat exchangers with fluid 2 mixed, fluid 1 
      unmixed:
  
      .. math::
          P_1 = \frac{1 - \exp(-K R_1)}{R_1}
          
          K = 1 - \exp(-NTU_1)
  
      For cross-flow (single-pass) heat exchangers with both fluids mixed 
      (this configuration is symmetric):
  
      .. math::
          P_1 = \left(\frac{1}{K_1} + \frac{R_1}{K_2} - \frac{1}{NTU_1}\right)^{-1}
          
          K_1 = 1 - \exp(-NTU_1)
          
          K_2 = 1 - \exp(-R_1 NTU_1)
          
      Parameters
      ----------
      R1 : float
          Heat capacity ratio of the heat exchanger in the P-NTU method,
          calculated with respect to stream 1 [-]
      NTU1 : float
          Thermal number of transfer units of the heat exchanger in the P-NTU 
          method, calculated with respect to stream 1 [-]
      subtype : float
          The type of heat exchanger; one of 'counterflow', 'parallel', 
          'crossflow', 'crossflow approximate', 'crossflow, mixed 1', 
          'crossflow, mixed 2', 'crossflow, mixed 1&2'.
          
      Returns
      -------
      P1 : float
          Thermal effectiveness of the heat exchanger in the P-NTU method,
          calculated with respect to stream 1 [-]
  
      Notes
      -----
      The crossflow case is an approximation only. There is an actual
      solution involving an infinite sum. This was implemented, but found to 
      differ substantially so the approximation is used instead.
  
      Examples
      --------
      >>> temperature_effectiveness_basic(R1=.1, NTU1=4, subtype='counterflow')
      0.9753412729761263
  
      References
      ----------
      .. [1] Shah, Ramesh K., and Dusan P. Sekulic. Fundamentals of Heat 
         Exchanger Design. 1st edition. Hoboken, NJ: Wiley, 2002.
      .. [2] Thulukkanam, Kuppan. Heat Exchanger Design Handbook, Second Edition. 
         CRC Press, 2013.
      .. [3] Rohsenow, Warren and James Hartnett and Young Cho. Handbook of Heat
         Transfer, 3E. New York: McGraw-Hill, 1998.
      .. [4] Triboix, Alain. "Exact and Approximate Formulas for Cross Flow Heat 
         Exchangers with Unmixed Fluids." International Communications in Heat 
         and Mass Transfer 36, no. 2 (February 1, 2009): 121-24. 
         doi:10.1016/j.icheatmasstransfer.2008.10.012.
      '''
      if subtype == 'counterflow':
          # Same as TEMA 1 pass
          P1 = (1 - exp(-NTU1*(1 - R1)))/(1 - R1*exp(-NTU1*(1-R1)))
      elif subtype == 'parallel':
          P1 = (1 - exp(-NTU1*(1 + R1)))/(1 + R1)
      elif subtype == 'crossflow approximate':
          # This isn't technically accurate, an infinite sum is required
          # It has been computed from two different sources
          # but is found not to be within the 1% claimed of this equation
          P1 = 1 - exp(NTU1**0.22/R1*(exp(-R1*NTU1**0.78) - 1.))
      elif subtype == 'crossflow':
          def to_int(v, NTU1, R1):
              return (1. + NTU1 - v*v/(4.*R1*NTU1))*exp(-v*v/(4.*R1*NTU1))*v*iv(0, v)
          int_term = quad(to_int, 0, 2.*NTU1*R1**0.5, args=(NTU1, R1))[0]
          P1 = 1./R1 - exp(-R1*NTU1)/(2.*(R1*NTU1)**2)*int_term
      elif subtype == 'crossflow, mixed 1':
          # Not symmetric
          K = 1 - exp(-R1*NTU1)
          P1 = 1 - exp(-K/R1)
      elif subtype == 'crossflow, mixed 2':
          # Not symmetric
          K = 1 - exp(-NTU1)
          P1 = (1 - exp(-K*R1))/R1
      elif subtype == 'crossflow, mixed 1&2':
          K1 = 1. - exp(-NTU1)
          K2 = 1. - exp(-R1*NTU1)
          P1 = (1./K1 + R1/K2 - 1./NTU1)**-1
      else:
          raise Exception('Subtype not recognized.')
      return P1