Viscous_Cahn_Hilliard_2D_Spatio-Temporal
收藏数据集概述:Viscous Cahn-Hilliard Optimal Control
数据集简介
该数据集包含2000个高保真模拟,模拟对象为在随机控制力作用下的粘性Cahn-Hilliard方程。该数据集旨在支持稀疏最优控制、科学机器学习和相场建模领域的研究。 官方代码仓库:Sparse-optimal-control-of-Viscous-Chan-hilliard (GitHub) 每个样本代表一个由外部控制场引导的两相系统演化过程。数据使用自定义的高精度有限差分求解器结合Crank-Nicolson时间积分方法生成。
数据集结构
数据形状
数据在逻辑上存储为一个5维张量,物理上分片存储为Parquet文件。
- 形状:
(2000, 101, 128, 128, 4) - 维度:
(样本数, 时间步长, 高度, 宽度, 通道数)
通道定义
根据data_process.py流程,4个通道分别对应:
- 通道 0 (
phi/ $varphi$): 相场序参数 ($varphi in [-1, 1]$)。代表两相之间的浓度差。 - 通道 1 (
mu/ $mu$): 化学势。定义为 $mu = -kappaDeltavarphi + f(varphi) - w$。 - 通道 2 (
w): 辅助控制变量。由松弛方程 $gamma partial_t w + w = u$ 控制。 - 通道 3 (
u): 施加于系统的外部控制力场。
物理域
- 空间域: $Omega = [0, 1] imes [0, 1]$
- 网格分辨率: $128 imes 128$ (均匀网格间距 $h approx 0.0078$)。
- 时间范围: $T = 1.0$ 秒。
- 时间分辨率: $dt = 0.01$ (每个模拟101帧)。
数据生成细节
物理模型
数据遵循具有对数势的粘性Cahn-Hilliard系统,确保相场严格保持在物理边界$(-1, 1)$内。
$$
egin{aligned}
partial_t varphi - Delta mu &= 0
au partial_t varphi - kappa Delta varphi + f(varphi) &= mu + w
gamma partial_t w + w &= u
end{aligned}
$$
数值实现
求解器 (Forward2_solver.py) 采用:
- 空间离散化: 使用诺伊曼边界条件的标准5点有限差分格式。
- 时间积分: 半隐式Crank-Nicolson格式。
- 隐式部分: 线性扩散和势的凸部分 ($c_1$)。
- 显式部分: 势的凹部分 ($c_2$)。
- 非线性求解器: 采用Armijo回溯线搜索的Monolithic Newton-Raphson方法。
- 质量守恒: 通过全局拉格朗日乘子校正步骤强制执行。
模拟参数
数据集使用config.py中的配置生成:
| 参数 | 符号 | 值 | 描述 |
|---|---|---|---|
| 粘度 | $ au$ | 0.05 |
相方程的弛豫时间。 |
| 控制弛豫 | $gamma$ | 10.0 |
控制变量 $w$ 的阻尼因子。 |
| 界面宽度 | $kappa$ | 9.0e-4 |
梯度能量系数(控制界面厚度)。 |
| 势(凸) | $c_1$ | 0.75 |
Flory-Huggins对数系数。 |
| 势(凹) | $c_2$ | 1.0 |
二次失稳系数。 |
| 时间步长 | $dt$ | 0.01 |
采样率(求解器内部步长可能更小)。 |
输入控制生成
控制场 u 使用平滑随机场程序化生成:
- 在傅里叶空间中生成随机噪声。
- 应用低通滤波器 ($K^{-1.5}$) 以确保平滑性。
- 使用三次样条在时间上插值关键帧,以创建连续变化的作用力。
如何加载 (Python)
python import pandas as pd import numpy as np from datasets import load_dataset
1. 加载数据集(推荐使用流式加载处理50GB数据)
dataset = load_dataset("your-username/your-repo-name", split="train", streaming=True)
2. 遍历样本
for row in dataset: # 3. 将展平的数组重塑回 (128, 128, 4) # 假设您的Parquet转换脚本将空间维度展平了 sample_id = row[sample_id] timestep = row[time_step]
# 形状取决于您特定的parquet转换脚本
# 针对展平的1维数组列的示例:
data_flat = np.array(row[readings])
frame_tensor = data_flat.reshape(128, 128, 4)
phi = frame_tensor[:, :, 0] # 相场
u = frame_tensor[:, :, 3] # 控制输入
print(f"Sample {sample_id} at t={timestep}: Phi range [{phi.min():.2f}, {phi.max():.2f}]")
break




