ISO 9001 · 14001 · 45001

An Advanced Water Treatment Equipment Company

Submerged Ultrafiltration (SUF)

Membrane modules immersed directly in the tank, drawing water through the membrane under gentle suction for reuse-quality filtrate.

Membrane filtration for reuse and RO pre-treatment

In a submerged ultrafiltration system, the membrane modules sit directly in an open tank and filtered water is drawn through them under a gentle vacuum. Ultrafiltration membranes are a physical barrier to suspended solids, turbidity and most bacteria, so the filtrate quality stays consistent even when the feed varies.

Adroit’s SUF systems are used for polishing treated wastewater for reuse and for preparing water for reverse osmosis.

Where SUF fits

Application

SUF is used after biological treatment when the treated water is to be reused, or ahead of RO, where suspended solids and turbidity must be removed reliably to protect the RO membranes. Because the membranes work in an open tank rather than pressure vessels, the system is simple to lay out and suits both new plants and upgrades.

How submerged ultrafiltration works

Operation

The membrane modules are immersed in the feed tank. A permeate pump creates a low suction on the inside of the membranes, and clean water passes through the membrane wall and is drawn off. Solids stay in the tank.

Air bubbled up past the membranes (air scour) keeps the surfaces clean while they filter. At intervals, the flow is briefly reversed to backwash the membranes, and periodic chemical cleaning restores performance. These cycles are automated.

Where SUF is used

Application areas

Industrial wastewater reuse

Reuse-quality water for process and utility use.

Municipal wastewater polishing

Treated water for non-potable reuse.

RO pre-treatment

Reliable removal of suspended solids and turbidity before RO.

Water recycling

Compact recycling systems for buildings and industries.

Benefits of submerged UF

Features & advantages

Consistent filtrate

Membrane barrier gives stable quality regardless of feed variation.

Low-pressure operation

Gentle suction rather than high-pressure pumping.

Compact

Modules use tank volume efficiently.

Automated cleaning

Air scour, backwash and chemical cleaning cycles run automatically.

Design basis

Dimensions & manufacturing

Membrane modules submerged in open tank

Configuration

Low-pressure suction

Filtration mode

Designed to project

Capacity

Feed quality, flux, temperature, recovery, cleaning regime, filtrate quality required

Design inputs

Frequently asked questions

FAQ

Brochures, datasheets & media

Downloads

Documents

files

No documents are available for this product.

Photos

photos

No media available for this product.

Videos

videos

No videos are available for this product.

Explore more solutions

Related technologies

Filter Underdrainage System

Filtration

The part of a sand filter you never see, and the part that decides whether it filters and backwashes evenly.

View product

GDisk® Pile Cloth Disk Filter

Filtration

Fully submerged, gravity-fed tertiary filter with polyester pile cloth media and automatic backwash, designed for high-efficiency suspended-solids removal in a compact footprint.

View product

Need fine screening sized for your inlet works?

Send us your flow rate, channel dimensions and the fine-solids you need to capture — our engineers will recommend the right Stepflow configuration.

    Enquire about Submerged Ultrafiltration (SUF)

    Product enquiry

    Tell us about your requirement and we’ll respond with specifications, references and pricing.

Request a quotation

Fields marked * are required. We typically respond within one business day.

(() => {
  if (window.adroitEnquiryButtonsReady) return;

  window.adroitEnquiryButtonsReady = true;

  const rootSelector = ".adroit-contact-form";

  const buttonSelector = [
    "#wsf-1-field-38",
    "#wsf-1-field-39",
  ].join(", ");

  const values = {
    "wsf-1-field-38": "Product Enquiry",
    "wsf-1-field-39": "Service Request",
  };

  function getFormRoot(element) {
    return element.closest(rootSelector);
  }

  function getHiddenField(form) {
    let field = form.querySelector(
      'input[data-enquiry-type-field="true"]'
    );

    if (!field) {
      field = document.createElement("input");
      field.type = "hidden";
      field.name = "inquiry_type";
      field.dataset.enquiryTypeField = "true";

      form.appendChild(field);
    }

    return field;
  }

  function getErrorRow(formRoot) {
    let errorRow = formRoot.querySelector(
      '[data-enquiry-error-row="true"]'
    );

    if (errorRow) return errorRow;

    const fieldsGrid = formRoot.querySelector(".wsf-fields");
    const firstField = formRoot.querySelector(
      "#wsf-1-field-wrapper-20"
    );

    if (!fieldsGrid || !firstField) return null;

    errorRow = document.createElement("div");
    errorRow.className =
      "wsf-extra-small-12 wsf-tile wsf-field-wrapper";
    errorRow.dataset.enquiryErrorRow = "true";
    errorRow.hidden = true;

    const errorMessage = document.createElement("div");
    errorMessage.className = "wsf-invalid-feedback";
    errorMessage.textContent = "This field is required.";
    errorMessage.setAttribute("aria-live", "polite");

    errorRow.appendChild(errorMessage);

    fieldsGrid.insertBefore(errorRow, firstField);

    return errorRow;
  }

  function showError(formRoot) {
    const errorRow = getErrorRow(formRoot);

    if (!errorRow) return;

    errorRow.hidden = false;

    const errorMessage = errorRow.querySelector(
      ".wsf-invalid-feedback"
    );

    if (errorMessage) {
      errorMessage.style.display = "block";
    }

    formRoot.querySelectorAll(buttonSelector).forEach((button) => {
      button.classList.add("is-invalid");
      button.setAttribute("aria-invalid", "true");
    });
  }

  function clearError(formRoot) {
    const errorRow = formRoot.querySelector(
      '[data-enquiry-error-row="true"]'
    );

    if (errorRow) {
      errorRow.hidden = true;
    }

    formRoot.querySelectorAll(buttonSelector).forEach((button) => {
      button.classList.remove("is-invalid");
      button.removeAttribute("aria-invalid");
    });
  }

  function hasSelection(formRoot) {
    return Boolean(
      formRoot.querySelector(
        "#wsf-1-field-38.is-selected, #wsf-1-field-39.is-selected"
      )
    );
  }

  function validateEnquiry(formRoot) {
    if (hasSelection(formRoot)) {
      clearError(formRoot);
      return true;
    }

    showError(formRoot);
    return false;
  }

  function selectButton(button) {
    const formRoot = getFormRoot(button);
    const form = button.closest("form");

    if (!formRoot || !form) return;

    formRoot.querySelectorAll(buttonSelector).forEach((item) => {
      const isSelected = item === button;

      item.classList.toggle("is-selected", isSelected);
      item.setAttribute("aria-pressed", String(isSelected));
    });

    getHiddenField(form).value = values[button.id] || "";

    clearError(formRoot);
  }

  /*
   * Window capture runs before WS Form's button click handler.
   * This stops WS Form AJAX submission only when enquiry type is missing.
   */
  window.addEventListener(
    "click",
    (event) => {
      const enquiryButton = event.target.closest(
        `${rootSelector} #wsf-1-field-38, ${rootSelector} #wsf-1-field-39`
      );

      if (enquiryButton) {
        selectButton(enquiryButton);
        return;
      }

      const submitButton = event.target.closest(
        `${rootSelector} button[type="submit"], ${rootSelector} input[type="submit"]`
      );

      if (!submitButton) return;

      const formRoot = getFormRoot(submitButton);

      if (!formRoot) return;

      if (validateEnquiry(formRoot)) return;

      event.preventDefault();
      event.stopImmediatePropagation();
    },
    true
  );

  /*
   * Covers pressing Enter in a form field.
   */
  window.addEventListener(
    "submit",
    (event) => {
      const form = event.target;

      if (!(form instanceof HTMLFormElement)) return;

      const formRoot = getFormRoot(form);

      if (!formRoot) return;

      if (validateEnquiry(formRoot)) return;

      event.preventDefault();
      event.stopImmediatePropagation();
    },
    true
  );

  function initialize() {
    document.querySelectorAll(rootSelector).forEach((formRoot) => {
      const form = formRoot.querySelector("form");

      formRoot.querySelectorAll(buttonSelector).forEach((button) => {
        button.classList.remove("is-selected", "is-invalid");
        button.removeAttribute("aria-invalid");
        button.setAttribute("aria-pressed", "false");
      });

      clearError(formRoot);

      if (form) {
        getHiddenField(form).value = "";
      }
    });
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", initialize, {
      once: true,
    });
  } else {
    initialize();
  }
})();