diffusion.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // 包括库 --- Include libraries
  2. #include <stdio.h>
  3. // 定义 --- Definitions
  4. #define N 15 // 空间网格数 --- Number of spatial grid points
  5. #define T 30 // 时间步数 --- Time steps to be simulated (integrated)
  6. #define dt 1 // 时间步长 --- Temporal length scale (dt)
  7. #define dx 1 // 空间步长 --- Spatial length scale (dx
  8. #define alpha 0.1 // 扩散系数 --- Diffusion coefficient
  9. // 打印功能 --- Print function
  10. void printGrid(double grid[N]) {
  11. for (int i = 0; i < N;i++){
  12. printf("%.2f ", grid[i]);
  13. printf("\t");
  14. }
  15. printf("\n");
  16. }
  17. // 主要功能 --- Main function
  18. int main() {
  19. double u[N+1]; // u: 为当前时刻的浓度分
  20. // --- To store the concentration distribution at the current moment
  21. double u_new[N+1]; // u_new: 为下一个时刻的浓度分布
  22. // --- To sdtore the concentration distribution at the next moment
  23. // 初始化浓度分布 --- Initialize concentration distribution
  24. for (int i = 0; i <= N; i++) {
  25. if (i >= 45*N/100 && i <= 55*N/100) {
  26. u[i] = 100.0;
  27. } else {
  28. u[i] = 0.0;
  29. }
  30. }
  31. printGrid(u);
  32. // 迭代计算 --- Iterative calculation
  33. for (int t = 1; t <= T; t++) {
  34. // 边界条件:固定浓度 --- Boundary condition: fixed concentration
  35. u_new[0] = u[0];
  36. u_new[N] = u[N];
  37. // 内部节点计算 --- Internal node calculation
  38. for (int i = 1; i < N; i++) {
  39. u_new[i] = u[i] + alpha * dt / (dx*dx) * (u[i+1] - 2*u[i] + u[i-1]);
  40. }
  41. // 更新浓度分布 --- Update concentration distribution
  42. for (int i = 0; i <= N; i++) {
  43. u[i] = u_new[i];
  44. }
  45. printGrid(u);
  46. }
  47. return 0;
  48. }