# heatTransfer-serial **Repository Path**: liuhaolin24/heat-transfer-serial ## Basic Information - **Project Name**: heatTransfer-serial - **Description**: No description available - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 20 - **Created**: 2025-12-01 - **Last Updated**: 2025-12-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 热传导模拟串行程序 #My Work: 已增加heat_parallel.cpp源文件,原heat_transfer.h头文件已修改用于并行版本的运行,新增了heat_transfer_serial.h头文件,内容与原heat_transfer.h一致,用于原串行版本(未修改)的头文件; 以下是并行版本(heat_parallel.cpp)新增内容: 1.引入MPI(本项目未使用OpenMP) 2.更新算法: 域分解:将200×200网格在Y方向均匀分配各进程 新增Ghost Cells:每个进程存储相邻进程边界数据 并行收敛判断:使用MPI-Allreduce进行全局收敛检测 3.通信机制优化: 使用MPI_Sendrecv: 实现非阻塞通信,减少同步等待时间 交换Ghost cells时仅交换相邻边界行:降低通信延迟和数据传输量 4.优化边界处理: 局部边界保护:每个进程只处理自己负责的边界区域 进程间同步:交换ghost cells保证数据一致性 5.输入输出优化: 仅使用0号进程输出,避免多进程同时写入导致输出混乱 以下为代码结构的改进: 1.模块化函数: 将域分解、通信、收敛判断、输出等功能独立封装,提高了代码的可维护性 2.全局变量统一管理: 使用extern全局变量在各函数间共享进程信息 3.内存访问优化: 使用二维向量局部复制而不是整体赋值,保证了数据一致性,避免因内存共享导致数值错误 ## 项目简介 这是刘昊霖的代码库。本项目是一个基于显式有限差分法的热传导过程串行模拟程序,用于模拟固体材料中的二维热传导现象。程序通过数值计算方法求解热传导方程,模拟热量在材料中的扩散过程,并支持将计算结果以VTK格式输出,便于后续可视化分析。 ## 物理模型 程序模拟的是一个二维平面内的热传导过程,物理模型基于傅里叶热传导定律,通过求解热传导偏微分方程: ∂T/∂t = α(∂²T/∂x² + ∂²T/∂y²) 其中: - T为温度 - t为时间 - α为热扩散系数(α = λ/(ρc)) - λ为热导率 - ρ为密度 - c为比热容 ## 边界条件 - 左边界(i=0):恒温热源,温度保持在373K - 右边界(i=NX-1):恒温边界,温度保持在293K - 上边界(j=0):恒温边界,温度保持在293K - 下边界(j=NY-1):恒温边界,温度保持在293K ## 编译运行 ### 编译环境 串行版本: - C++编译器(g++) - 支持C++11标准 并行版本: - MPI编译器(mpicxx) ### 编译步骤 1. 克隆或下载项目代码到本地 2. 进入项目根目录 3. 使用 Makefile 编译 #### 编译所有版本(串行+并行) make all #### 只编译串行版本 make serial #### 只编译并行版本 make parallel ### 运行程序 #### 运行串行版本: make run-serial #### 运行并行版本(默认进程数为4) make run-parallel #### 运行并行版本(自定义进程数) make run-parallel -np (np=N(进程数),N<=10) ## 程序输出 1. 控制台输出: - 程序运行信息(网格大小、时间步长等) - 每500步迭代的中间行温度信息 - 收敛判断信息 - 程序总运行时间 2. VTK文件输出: - 每500步迭代输出一个VTK文件(`heat_serial_iterXXX.vtk` 或 `heat_parallel_iterXXX.vtk`) - 最终结果输出为`heat_serial_final.vtk` 或 `heat_parallel_iterXXX.vtk` - VTK文件可使用Paraview等可视化软件打开查看 ## 主要参数说明 参数定义在`include/heat_transfer_serial.h`文件(串行版本头文件)中: - 物理参数: - `RHO`:材料密度,单位kg/m³(默认7850,钢的密度) - `LAMBDA`:热导率,单位W/(m·K)(默认50,钢的热导率) - `C`:比热容,单位J/(kg·K)(默认460,钢的比热容) - 温度参数: - `T_LEFT`:左边界温度,单位K(默认373) - `T_OTHER`:其他边界温度,单位K(默认293) - 网格参数: - `NX`:x方向网格点数(默认200) - `NY`:y方向网格点数(默认200) - `DX`:x方向网格步长,单位m(默认0.01) - `DY`:y方向网格步长,单位m(默认0.01) - 计算控制参数: - `MAX_ITER`:最大迭代步数(默认20000) - `TOL`:收敛判断阈值(默认1e-4) ## 核心算法说明 串行版本: 1. **时间步长计算**:根据二维热传导稳定性条件计算合适的时间步长dt,确保数值计算的稳定性 2. **温度场更新**:采用显式有限差分格式计算温度场的更新,公式为: ```Plain Text T_curr[j][i] = T_prev[j][i] + coeff_x*(T_prev[j][i+1]-2*T_prev[j][i]+T_prev[j][i-1]) + coeff_y*(T_prev[j+1][i]-2*T_prev[j][i]+T_prev[j-1][i]) ``` 3. **收敛判断**:通过计算相邻时间步温度场的最大差异来判断是否达到稳态,如果最大差异小于设定阈值,则认为已经收敛 并行版本(额外特性): 1.域分解:Y方向均匀分配网格行数,每个进程负责local_ny行数据 2.Ghost cells交换:使用MPI_Sendrecv交换相邻进程边界行 3.并行收敛判断:每个进程计算本地最大温度差,使用MPI_AllReduce获取全局最大值 4.并行的I/O处理:仅使用0号进程收集各进程数据并写入文件 ## 清理编译产物 ```Bash make clean ``` 该命令会删除可执行文件、VTK输出文件和核心转储文件。 ## 查看可用命令 ```Bash make help ``` ## 结果测评 经编译运行 使用2进程的并行版本运行速度约比串行版本运行速度快了1.6倍左右(并行版本运行时间在18秒左右,而串行版本运行时间在30秒左右); 使用4进程的并行版本运行速度约比串行版本运行速度快了3倍左右(并行版本运行时间在10秒左右,而串行版本运行时间在30秒左右) 使用8进程,运行时间在9.5秒左右,较2进程和4进程与串行版本相比而言没有较大提升 ## AI使用 Ghost cells 思路来源于AI Makefile 的修改完善使用了AI协助