docs: def watershed_delineation(np, dem, outlet_file=None, thresh=0, singlebasin=False,
                                workingdir=None, mpi_bin=None, bin_dir=None,
                                logfile=None, runtime_file=None, hostfile=None):
          """Watershed Delineation."""
          # 1. Check directories
          if not os.path.exists(dem):
              TauDEM.error('DEM: %s is not existed!' % dem)
          dem = os.path.abspath(dem)
          if workingdir is None:
              workingdir = os.path.dirname(dem)
          namecfg = TauDEMFilesUtils(workingdir)
          workingdir = namecfg.workspace
          UtilClass.mkdir(workingdir)
          # 2. Check log file
          if logfile is not None and FileClass.is_file_exists(logfile):
              os.remove(logfile)
          # 3. Get predefined intermediate file names
          filled_dem = namecfg.filldem
          flow_dir = namecfg.d8flow
          slope = namecfg.slp
          flow_dir_dinf = namecfg.dinf
          slope_dinf = namecfg.dinf_slp
          dir_code_dinf = namecfg.dinf_d8dir
          weight_dinf = namecfg.dinf_weight
          acc = namecfg.d8acc
          stream_raster = namecfg.stream_raster
          default_outlet = namecfg.outlet_pre
          modified_outlet = namecfg.outlet_m
          stream_skeleton = namecfg.stream_pd
          acc_with_weight = namecfg.d8acc_weight
          stream_order = namecfg.stream_order
          ch_network = namecfg.channel_net
          ch_coord = namecfg.channel_coord
          stream_net = namecfg.streamnet_shp
          subbasin = namecfg.subbsn
          dist2_stream_d8 = namecfg.dist2stream_d8
  
          # 4. perform calculation
          UtilClass.writelog(logfile, '[Output] %d..., %s' % (10, 'pitremove DEM...'), 'a')
          TauDEM.pitremove(np, dem, filled_dem, workingdir, mpi_bin, bin_dir,
                           log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' %
                             (20, 'Calculating D8 and Dinf flow direction...'), 'a')
          TauDEM.d8flowdir(np, filled_dem, flow_dir, slope, workingdir,
                           mpi_bin, bin_dir, log_file=logfile,
                           runtime_file=runtime_file, hostfile=hostfile)
          TauDEM.dinfflowdir(np, filled_dem, flow_dir_dinf, slope_dinf, workingdir,
                             mpi_bin, bin_dir, log_file=logfile,
                             runtime_file=runtime_file, hostfile=hostfile)
          DinfUtil.output_compressed_dinf(flow_dir_dinf, dir_code_dinf, weight_dinf)
          UtilClass.writelog(logfile, '[Output] %d..., %s' % (30, 'D8 flow accumulation...'), 'a')
          TauDEM.aread8(np, flow_dir, acc, None, None, False, workingdir, mpi_bin, bin_dir,
                        log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' %
                             (40, 'Generating stream raster initially...'), 'a')
          min_accum, max_accum, mean_accum, std_accum = RasterUtilClass.raster_statistics(acc)
          TauDEM.threshold(np, acc, stream_raster, mean_accum, workingdir,
                           mpi_bin, bin_dir, log_file=logfile,
                           runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' % (50, 'Moving outlet to stream...'), 'a')
          if outlet_file is None:
              outlet_file = default_outlet
              TauDEM.connectdown(np, flow_dir, acc, outlet_file, wtsd=None,
                                 workingdir=workingdir, mpiexedir=mpi_bin, exedir=bin_dir,
                                 log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
          TauDEM.moveoutletstostrm(np, flow_dir, stream_raster, outlet_file,
                                   modified_outlet, workingdir, mpi_bin, bin_dir,
                                   log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' %
                             (60, 'Generating stream skeleton...'), 'a')
          TauDEM.peukerdouglas(np, filled_dem, stream_skeleton, workingdir,
                               mpi_bin, bin_dir, log_file=logfile,
                               runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' %
                             (70, 'Flow accumulation with outlet...'), 'a')
          tmp_outlet = None
          if singlebasin:
              tmp_outlet = modified_outlet
          TauDEM.aread8(np, flow_dir, acc_with_weight, tmp_outlet, stream_skeleton, False,
                        workingdir, mpi_bin, bin_dir, log_file=logfile,
                        runtime_file=runtime_file, hostfile=hostfile)
  
          if thresh <= 0:  # find the optimal threshold using dropanalysis function
              UtilClass.writelog(logfile, '[Output] %d..., %s' %
                                 (75, 'Drop analysis to select optimal threshold...'), 'a')
              min_accum, max_accum, mean_accum, std_accum = \
                  RasterUtilClass.raster_statistics(acc_with_weight)
              if mean_accum - std_accum < 0:
                  minthresh = mean_accum
              else:
                  minthresh = mean_accum - std_accum
              maxthresh = mean_accum + std_accum
              numthresh = 20
              logspace = 'true'
              drp_file = namecfg.drptxt
              TauDEM.dropanalysis(np, filled_dem, flow_dir, acc_with_weight,
                                  acc_with_weight, modified_outlet, minthresh, maxthresh,
                                  numthresh, logspace, drp_file, workingdir, mpi_bin, bin_dir,
                                  log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
              if not FileClass.is_file_exists(drp_file):
                  raise RuntimeError('Dropanalysis failed and drp.txt was not created!')
              with open(drp_file, 'r', encoding='utf-8') as drpf:
                  temp_contents = drpf.read()
                  (beg, thresh) = temp_contents.rsplit(' ', 1)
              print(thresh)
          UtilClass.writelog(logfile, '[Output] %d..., %s' % (80, 'Generating stream raster...'), 'a')
          TauDEM.threshold(np, acc_with_weight, stream_raster, float(thresh),
                           workingdir, mpi_bin, bin_dir, log_file=logfile,
                           runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' % (90, 'Generating stream net...'), 'a')
          TauDEM.streamnet(np, filled_dem, flow_dir, acc_with_weight, stream_raster,
                           modified_outlet, stream_order, ch_network,
                           ch_coord, stream_net, subbasin, workingdir, mpi_bin, bin_dir,
                           log_file=logfile, runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d..., %s' %
                             (95, 'Calculating distance to stream (D8)...'), 'a')
          TauDEM.d8hdisttostrm(np, flow_dir, stream_raster, dist2_stream_d8, 1,
                               workingdir, mpi_bin, bin_dir, log_file=logfile,
                               runtime_file=runtime_file, hostfile=hostfile)
          UtilClass.writelog(logfile, '[Output] %d.., %s' %
                             (100, 'Original subbasin delineation is finished!'), 'a')