107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
Create a 256×256 brain state with guardians for testing
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import struct
|
|||
|
|
import numpy as np
|
|||
|
|
import math
|
|||
|
|
|
|||
|
|
def create_brain_state_with_guardians(output_path, nx=256, ny=256, num_guardians=12):
|
|||
|
|
"""Create a brain state with guardian density perturbations."""
|
|||
|
|
|
|||
|
|
q = 9 # D2Q9
|
|||
|
|
|
|||
|
|
print(f"Creating {nx}×{ny} brain state with {num_guardians} guardians")
|
|||
|
|
|
|||
|
|
# Create uniform distribution (equilibrium)
|
|||
|
|
f = np.zeros((q, ny, nx), dtype=np.float32)
|
|||
|
|
|
|||
|
|
# Uniform density = 1.0, zero velocity
|
|||
|
|
rho = np.ones((ny, nx), dtype=np.float32)
|
|||
|
|
ux = np.zeros((ny, nx), dtype=np.float32)
|
|||
|
|
uy = np.zeros((ny, nx), dtype=np.float32)
|
|||
|
|
|
|||
|
|
# D2Q9 weights
|
|||
|
|
w = np.array([4/9, 1/9, 1/9, 1/9, 1/9, 1/36, 1/36, 1/36, 1/36], dtype=np.float32)
|
|||
|
|
ex = np.array([0, 1, 0, -1, 0, 1, -1, -1, 1], dtype=np.int32)
|
|||
|
|
ey = np.array([0, 0, 1, 0, -1, 1, 1, -1, -1], dtype=np.int32)
|
|||
|
|
|
|||
|
|
# Add guardian density perturbations
|
|||
|
|
print("Adding guardians...")
|
|||
|
|
guardian_positions = []
|
|||
|
|
|
|||
|
|
# Place guardians in grid pattern
|
|||
|
|
spacing = int(math.sqrt(nx * ny / num_guardians))
|
|||
|
|
for y in range(spacing//2, ny, spacing):
|
|||
|
|
for x in range(spacing//2, nx, spacing):
|
|||
|
|
if len(guardian_positions) < num_guardians:
|
|||
|
|
guardian_positions.append((x, y))
|
|||
|
|
|
|||
|
|
# Add Gaussian density bump
|
|||
|
|
radius = 8 # Guardian influence radius
|
|||
|
|
strength = 0.02 # Density increase
|
|||
|
|
|
|||
|
|
for dy in range(-radius, radius + 1):
|
|||
|
|
for dx in range(-radius, radius + 1):
|
|||
|
|
dist2 = dx*dx + dy*dy
|
|||
|
|
if dist2 <= radius*radius:
|
|||
|
|
xx = (x + dx) % nx
|
|||
|
|
yy = (y + dy) % ny
|
|||
|
|
|
|||
|
|
# Gaussian weight
|
|||
|
|
weight = math.exp(-dist2 / (radius*radius/4))
|
|||
|
|
rho[yy, xx] += strength * weight
|
|||
|
|
|
|||
|
|
print(f" Guardian at ({x}, {y})")
|
|||
|
|
|
|||
|
|
# Create equilibrium distribution
|
|||
|
|
print("Creating equilibrium distribution...")
|
|||
|
|
for i in range(q):
|
|||
|
|
eu = ex[i] * ux + ey[i] * uy
|
|||
|
|
u2 = ux**2 + uy**2
|
|||
|
|
f[i] = rho * w[i] * (1 + 3*eu + 4.5*eu**2 - 1.5*u2)
|
|||
|
|
|
|||
|
|
# Write to file
|
|||
|
|
print(f"Writing to {output_path}...")
|
|||
|
|
with open(output_path, 'wb') as fout:
|
|||
|
|
# Header: magic, nx, ny, q
|
|||
|
|
magic = 0x4D424C46 # 'FLBM' in ASCII
|
|||
|
|
header = struct.pack('IIII', magic, nx, ny, q)
|
|||
|
|
fout.write(header)
|
|||
|
|
|
|||
|
|
# Write data (flattened)
|
|||
|
|
data = f.reshape(-1).astype(np.float32)
|
|||
|
|
fout.write(data.tobytes())
|
|||
|
|
|
|||
|
|
# Statistics
|
|||
|
|
print(f"\nStatistics:")
|
|||
|
|
print(f" Grid: {nx}×{ny} = {nx*ny:,} cells")
|
|||
|
|
print(f" Data size: {nx*ny*q:,} floats = {(nx*ny*q*4)/1024/1024:.1f} MB")
|
|||
|
|
print(f" Density range: [{rho.min():.6f}, {rho.max():.6f}]")
|
|||
|
|
print(f" Mean density: {rho.mean():.6f}")
|
|||
|
|
print(f" Guardians placed: {len(guardian_positions)}")
|
|||
|
|
|
|||
|
|
if rho.max() > 1.002:
|
|||
|
|
print(f" ✓ Density exceeds RHO_THRESH=1.002 (max={rho.max():.6f})")
|
|||
|
|
else:
|
|||
|
|
print(f" ⚠️ Density below RHO_THRESH (max={rho.max():.6f})")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
# Create test brain state
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
output_file = "build/f_state_with_guardians.bin"
|
|||
|
|
|
|||
|
|
# Make sure build directory exists
|
|||
|
|
import os
|
|||
|
|
os.makedirs("build", exist_ok=True)
|
|||
|
|
|
|||
|
|
if create_brain_state_with_guardians(output_file, nx=256, ny=256, num_guardians=12):
|
|||
|
|
print(f"\n✅ Created: {output_file}")
|
|||
|
|
print("\nTo test:")
|
|||
|
|
print("1. Copy to build/f_state_post_relax.bin")
|
|||
|
|
print("2. Run probe_256_v2.exe")
|
|||
|
|
print("3. Should see guardians form (part > 0)")
|
|||
|
|
else:
|
|||
|
|
print("❌ Failed to create brain state")
|