code: def testReduceScatterBlock(self):
      size = self.COMM.Get_size()
      rank = self.COMM.Get_rank()
      for array, typecode in arrayimpl.loop():
          # segfault as of OpenMPI 4.1.1
          if unittest.is_mpi_gpu("openmpi", array):
              continue
          for op in (MPI.SUM, MPI.MAX, MPI.MIN, MPI.PROD):
              if skip_op(typecode, op):
                  continue
              for rcnt in range(1, size + 1):
                  sbuf = array([rank] * rcnt * size, typecode)
                  rbuf = array(-1, typecode, rcnt)
                  if op == MPI.PROD:
                      sbuf = array([rank + 1] * rcnt * size, typecode)
                  self.COMM.Ireduce_scatter_block(
                      sbuf.as_mpi(), rbuf.as_mpi(), op
                  ).Wait()
                  max_val = maxvalue(rbuf)
                  v_sum = (size * (size - 1)) / 2
                  v_prod = 1
                  for i in range(1, size + 1):
                      v_prod *= i
                  v_max = size - 1
                  v_min = 0
                  for i, value in enumerate(rbuf):
                      if op == MPI.SUM:
                          if v_sum <= max_val:
                              self.assertAlmostEqual(value, v_sum)
                      elif op == MPI.PROD:
                          if v_prod <= max_val:
                              self.assertAlmostEqual(value, v_prod)
                      elif op == MPI.MAX:
                          self.assertEqual(value, v_max)
                      elif op == MPI.MIN:
                          self.assertEqual(value, v_min)
  
imports: from mpi4py import MPI
  import mpiunittest
  import arrayimpl
  from functools import reduce
label_desc: Use image node_id 11 for calling the BaseTestCCOBuf obj's underlying member method code with example usage: obj.testReduceScatterBlock() without return types