code: def n_rows(self):
          
          N_estimated = (self.hl * np.pi / (2 * self.stout_w_per_flow(self.hl) * self.q)).to(u.dimensionless)
          variablerow = min(10, max(4, math.trunc(N_estimated.magnitude)))
          return variablerow
docs: This equation states that the open area corresponding to one row
          can be set equal to two orifices of diameter=row height. If there
          are more than two orifices per row at the top of the LFOM then there
          are more orifices than are convenient to drill and more than
          necessary for good accuracy. Thus this relationship can be used to
          increase the spacing between the rows and thus increase the diameter
          of the orifices. This spacing function also sets the lower depth on
          the high flow rate LFOM with no accurate flows below a depth equal
          to the first row height.
          But it might be better to always set then number of rows to 10.
          The challenge is to figure out a reasonable system of constraints that
          reliably returns a valid solution.