CSF Flow Node#

Module: mime.nodes.environment.csf_flow Stability: experimental Algorithm ID: MIME-NODE-004 Version: 1.0.0 Verification Mode: Mode 2 (Independent)

Summary#

Analytical Stokes drag on a spherical body in quiescent or pulsatile CSF. Computes translational and rotational drag forces without resolving the flow field. This is the analytical fallback for benchmarks B0 and B2; it will be augmented/replaced by IB-LBM for full fluid-structure coupling.

Governing Equations#

Stokes drag (quiescent fluid): $$ \mathbf{F}_{\text{drag}} = -6\pi\mu a (\mathbf{V} - \mathbf{u}^{\infty}) $$

Rotational drag: $$ \mathbf{T}_{\text{drag}} = -8\pi\mu a^3 \boldsymbol{\omega} $$

Pulsatile background flow (simplified centreline sinusoidal): $$ \mathbf{u}^{\infty}(t) = v_{\text{peak}} \sin(\omega_c t) \hat{\mathbf{z}} $$

Discretization#

Analytical — closed-form evaluation each timestep.

Implementation Mapping#

Equation Term

Implementation

Notes

$\mathbf{F} = -6\pi\mu a(\mathbf{V} - \mathbf{u})$

mime.nodes.environment.csf_flow.CSFFlowNode.update

jnp arithmetic

$\mathbf{T} = -8\pi\mu a^3 \omega$

mime.nodes.environment.csf_flow.CSFFlowNode.update

jnp arithmetic

$\mathbf{u}^{\infty}(t)$

mime.nodes.environment.csf_flow.CSFFlowNode.update

jnp.sin(omega_c * t)

Assumptions and Simplifications#

  1. Spherical body for drag computation

  2. Stokes regime ($Re \ll 1$)

  3. Newtonian fluid (CSF at physiological protein levels)

  4. Robot small compared to channel ($a \ll R$)

  5. Pulsatile mode: centreline velocity only (no radial profile)

Validated Physical Regimes#

Parameter

Verified Range

Notes

Re

0–0.1

Stokes regime

robot_radius

10–500 um

Microrobot size range

Known Limitations and Failure Modes#

  1. No resolved flow field — point-force drag only

  2. No fluid-structure interaction (one-way coupling)

  3. No Faxen correction (negligible for $a = 100\mu$m at cardiac frequency)

  4. No Basset history force (3.3% correction at cardiac frequency)

State Variables#

Field

Shape

Units

Description

drag_force

(3,)

N

Drag force on robot

drag_torque

(3,)

N.m

Rotational drag

background_velocity

(3,)

m/s

CSF flow at robot position

sim_time

()

s

Accumulated time

Parameters#

Parameter

Type

Default

Units

Description

fluid_viscosity_pa_s

float

8.5e-4

Pa.s

CSF dynamic viscosity

fluid_density_kg_m3

float

1002

kg/m^3

CSF density

robot_radius_m

float

100e-6

m

Effective hydrodynamic radius

pulsatile

bool

False

-

Enable pulsatile background flow

cardiac_freq_hz

float

1.1

Hz

Cardiac pulsation frequency

peak_velocity_m_s

float

0.04

m/s

Peak centreline velocity

Boundary Inputs#

Field

Shape

Default

Coupling Type

Description

position

(3,)

zeros

replacive

Robot position

velocity

(3,)

zeros

replacive

Robot velocity

angular_velocity

(3,)

zeros

replacive

Robot angular velocity

Boundary Fluxes (outputs)#

Field

Shape

Units

Description

drag_force

(3,)

N

To RigidBodyNode (additive)

drag_torque

(3,)

N.m

To RigidBodyNode (additive)

MIME-Specific Sections#

Anatomical Operating Context#

Compartment

Flow Regime

Re Range

Viscosity Range

CSF (aqueduct)

pulsatile

0–0.1

0.7–1.0 mPa.s

Clinical Relevance#

CSF flow is pulsatile (cardiac + respiratory). Drag on the microrobot determines navigation accuracy and energy budget. Pulsatile flow creates time-varying forces that affect closed-loop control performance.

References#

  • [@Purcell1977] Purcell, E.M. (1977). Life at Low Reynolds Number. — Foundational low-Re hydrodynamics.

Verification Evidence#

  • MIME-VER-001: Stokes translational drag (< 5% error)

  • MIME-VER-002: Stokes rotational drag

  • MIME-VER-003: Drag linearity

  • Unit tests: tests/nodes/test_csf_flow.py (11 tests)

Changelog#

Version

Date

Change

1.0.0

2026-03-20

Initial implementation — analytical Stokes drag