rtx-cfd legacy GPU: the kernel-writing methods take &mut self; read-only ones keep a shared borrow
CI / Python Bindings (maturin) (macos-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (ubuntu-latest) (push) Blocked by required conditions
CI / Build (macos-latest) (push) Waiting to run
CI / Test (macos-latest) (push) Blocked by required conditions
CI / Test (ubuntu-latest) (push) Blocked by required conditions
CI / WASM Build + Size Check (push) Blocked by required conditions
CI / Distributed Training Tests (push) Blocked by required conditions
CI / CI Success (push) Blocked by required conditions
CI / Format Check (push) Failing after 6s
Performance Benchmarks / Run Benchmarks (push) Failing after 7s
CI / Clippy Check (push) Failing after 11s
CI / Build (ubuntu-latest) (push) Failing after 13s
Documentation / Build User Guide (push) Successful in 6s
Documentation / Build API Documentation (push) Failing after 23s
CI / Build CPU-Only (Explicit) (push) Failing after 2m0s

This commit is contained in:
Omar Sobh
2026-09-16 07:29:05 -05:00
parent 0de750bad1
commit fd5972c949
5 changed files with 32 additions and 32 deletions
@@ -147,7 +147,7 @@ impl PisoGpuSolver {
fn copy_to_gpu(&self, flow_field: &FlowField) -> CfdResult<()> { fn copy_to_gpu(&self, flow_field: &FlowField) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Convert nalgebra matrices to flat vectors // Convert nalgebra matrices to flat vectors
@@ -171,7 +171,7 @@ impl PisoGpuSolver {
fn copy_from_gpu(&self, flow_field: &mut FlowField) -> CfdResult<()> { fn copy_from_gpu(&self, flow_field: &mut FlowField) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Copy from GPU // Copy from GPU
@@ -191,7 +191,7 @@ impl PisoGpuSolver {
async fn gpu_momentum_prediction(&mut self, dt: f32) -> CfdResult<()> { async fn gpu_momentum_prediction(&mut self, dt: f32) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let config = self.cpu_solver.config(); let config = self.cpu_solver.config();
@@ -271,7 +271,7 @@ impl PisoGpuSolver {
let (nx, ny) = { let (nx, ny) = {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
(buffers.nx, buffers.ny) (buffers.nx, buffers.ny)
}; };
@@ -284,7 +284,7 @@ impl PisoGpuSolver {
let iterations = { let iterations = {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
self.poisson_kernel.solve_2d( self.poisson_kernel.solve_2d(
&mut buffers.pressure_correction, &mut buffers.pressure_correction,
@@ -303,7 +303,7 @@ impl PisoGpuSolver {
{ {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
self.matrix_ops_kernel self.matrix_ops_kernel
.axpy(1.0, &buffers.pressure_correction, &mut buffers.p)?; .axpy(1.0, &buffers.pressure_correction, &mut buffers.p)?;
@@ -313,7 +313,7 @@ impl PisoGpuSolver {
let residual_norm = { let residual_norm = {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
self.matrix_ops_kernel.vector_norm(&buffers.mass_source)? self.matrix_ops_kernel.vector_norm(&buffers.mass_source)?
}; };
@@ -332,7 +332,7 @@ impl PisoGpuSolver {
) -> CfdResult<()> { ) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Clone the references we need for velocity field // Clone the references we need for velocity field
@@ -416,7 +416,7 @@ impl PisoGpuSolver {
{ {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let u_correction = buffers.u_correction.clone(); let u_correction = buffers.u_correction.clone();
let v_correction = buffers.v_correction.clone(); let v_correction = buffers.v_correction.clone();
@@ -136,7 +136,7 @@ impl SimpleGpuSolver {
fn copy_to_gpu(&self, flow_field: &FlowField) -> CfdResult<()> { fn copy_to_gpu(&self, flow_field: &FlowField) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Convert nalgebra matrices to flat vectors // Convert nalgebra matrices to flat vectors
@@ -163,7 +163,7 @@ impl SimpleGpuSolver {
fn copy_from_gpu(&self, flow_field: &mut FlowField) -> CfdResult<()> { fn copy_from_gpu(&self, flow_field: &mut FlowField) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Copy from GPU // Copy from GPU
@@ -183,7 +183,7 @@ impl SimpleGpuSolver {
async fn gpu_momentum_prediction(&mut self, dt: f32) -> CfdResult<()> { async fn gpu_momentum_prediction(&mut self, dt: f32) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let config = self.cpu_solver.config(); let config = self.cpu_solver.config();
@@ -250,7 +250,7 @@ impl SimpleGpuSolver {
async fn gpu_pressure_correction(&mut self) -> CfdResult<f32> { async fn gpu_pressure_correction(&mut self) -> CfdResult<f32> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let config = self.cpu_solver.config(); let config = self.cpu_solver.config();
@@ -282,7 +282,7 @@ impl SimpleGpuSolver {
async fn gpu_velocity_correction(&mut self) -> CfdResult<()> { async fn gpu_velocity_correction(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// This step would require a custom velocity correction kernel // This step would require a custom velocity correction kernel
@@ -300,7 +300,7 @@ impl SimpleGpuSolver {
async fn gpu_pressure_update(&self, pressure_relaxation: f32) -> CfdResult<()> { async fn gpu_pressure_update(&self, pressure_relaxation: f32) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// p = p + α_p * p' (pressure update with relaxation) // p = p + α_p * p' (pressure update with relaxation)
@@ -253,7 +253,7 @@ impl D2Q9GpuSolver {
} }
/// GPU-accelerated collision step /// GPU-accelerated collision step
fn gpu_collision_step(&self) -> CfdResult<()> { fn gpu_collision_step(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -300,7 +300,7 @@ impl D2Q9GpuSolver {
} }
/// GPU-accelerated streaming step /// GPU-accelerated streaming step
pub fn gpu_streaming_step(&self) -> CfdResult<()> { pub fn gpu_streaming_step(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -344,7 +344,7 @@ impl D2Q9GpuSolver {
} }
/// GPU-accelerated macroscopic variable computation /// GPU-accelerated macroscopic variable computation
fn gpu_compute_macroscopic(&self) -> CfdResult<()> { fn gpu_compute_macroscopic(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -391,7 +391,7 @@ impl D2Q9GpuSolver {
} }
/// Compute equilibrium distributions on GPU /// Compute equilibrium distributions on GPU
fn gpu_compute_equilibrium(&self) -> CfdResult<()> { fn gpu_compute_equilibrium(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -435,7 +435,7 @@ impl D2Q9GpuSolver {
} }
/// GPU-accelerated bounce-back boundary conditions /// GPU-accelerated bounce-back boundary conditions
pub fn gpu_apply_bounce_back_boundaries(&self) -> CfdResult<()> { pub fn gpu_apply_bounce_back_boundaries(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -539,7 +539,7 @@ impl D2Q9GpuSolver {
pub fn get_macroscopic_at(&self, i: usize, j: usize) -> CfdResult<(f64, Vector2<f64>)> { pub fn get_macroscopic_at(&self, i: usize, j: usize) -> CfdResult<(f64, Vector2<f64>)> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let idx = j * buffers.nx + i; let idx = j * buffers.nx + i;
@@ -585,7 +585,7 @@ impl D2Q9GpuSolver {
pub fn update_flow_field(&self, flow_field: &mut FlowField) -> CfdResult<()> { pub fn update_flow_field(&self, flow_field: &mut FlowField) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let (nx, ny, _, _) = flow_field.grid_info(); let (nx, ny, _, _) = flow_field.grid_info();
@@ -362,7 +362,7 @@ __global__ void d3q19_bounce_back_boundaries(
} }
/// GPU-accelerated BGK collision step /// GPU-accelerated BGK collision step
pub fn gpu_collision_step(&self) -> CfdResult<()> { pub fn gpu_collision_step(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -416,7 +416,7 @@ __global__ void d3q19_bounce_back_boundaries(
} }
/// GPU-accelerated streaming step /// GPU-accelerated streaming step
pub fn gpu_streaming_step(&self) -> CfdResult<()> { pub fn gpu_streaming_step(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -462,7 +462,7 @@ __global__ void d3q19_bounce_back_boundaries(
} }
/// Extract macroscopic variables on GPU /// Extract macroscopic variables on GPU
fn gpu_extract_macroscopic_variables(&self) -> CfdResult<()> { fn gpu_extract_macroscopic_variables(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -517,7 +517,7 @@ __global__ void d3q19_bounce_back_boundaries(
} }
/// Compute equilibrium distributions on GPU /// Compute equilibrium distributions on GPU
fn gpu_compute_equilibrium(&self) -> CfdResult<()> { fn gpu_compute_equilibrium(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -564,7 +564,7 @@ __global__ void d3q19_bounce_back_boundaries(
} }
/// GPU-accelerated bounce-back boundary conditions /// GPU-accelerated bounce-back boundary conditions
pub fn gpu_apply_bounce_back_boundaries(&self) -> CfdResult<()> { pub fn gpu_apply_bounce_back_boundaries(&mut self) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_mut()
@@ -675,7 +675,7 @@ __global__ void d3q19_bounce_back_boundaries(
) -> CfdResult<MacroscopicVariables3D> { ) -> CfdResult<MacroscopicVariables3D> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Extract macroscopic variables first // Extract macroscopic variables first
@@ -726,7 +726,7 @@ __global__ void d3q19_bounce_back_boundaries(
pub fn gpu_total_mass(&self) -> CfdResult<f64> { pub fn gpu_total_mass(&self) -> CfdResult<f64> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
self.gpu_extract_macroscopic_variables()?; self.gpu_extract_macroscopic_variables()?;
@@ -739,7 +739,7 @@ __global__ void d3q19_bounce_back_boundaries(
pub fn gpu_kinetic_energy(&self) -> CfdResult<f64> { pub fn gpu_kinetic_energy(&self) -> CfdResult<f64> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
self.gpu_extract_macroscopic_variables()?; self.gpu_extract_macroscopic_variables()?;
@@ -131,7 +131,7 @@ impl KEpsilonGpuModel {
pub fn set_initial_conditions(&mut self, k_init: f32, epsilon_init: f32) -> CfdResult<()> { pub fn set_initial_conditions(&mut self, k_init: f32, epsilon_init: f32) -> CfdResult<()> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
// Initialize k and epsilon with uniform values // Initialize k and epsilon with uniform values
@@ -429,7 +429,7 @@ impl KEpsilonGpuModel {
pub fn get_eddy_viscosity(&self) -> CfdResult<Vec<f32>> { pub fn get_eddy_viscosity(&self) -> CfdResult<Vec<f32>> {
let buffers = self let buffers = self
.gpu_buffers .gpu_buffers
.as_mut() .as_ref()
.ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?; .ok_or_else(|| CfdError::gpu_error("GPU buffers not initialized"))?;
let n = buffers.nx * buffers.ny * buffers.nz; let n = buffers.nx * buffers.ny * buffers.nz;