/*污染物在一维河流中扩散的简单数值仿真C程序(显式)*/
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#define c1 0 /*河流中原污染物浓度*/
#define q1 5000.0 /*河流原流量*/
#define q2 5000.0 /*排污口流量*/
#define dt 0.5 /*时间间隔*/
#define dx 10.0 /*单位河流长度*/
#define L 10000.0 /*均匀河流总长度*/
#define T 600.0 /*所研究时间的总长*/
int main(int argc, char *argv[])
{
float Ex,u,c0,c2;
double x,y,z;
FILE *fp1;
int i,j;
double a[1001],b[1001];
printf("\n 请定义纵向离散系数Ex:");
scanf("%f", &Ex);
printf("\n 请定义河流流速u:");
scanf("%f", &u);
printf("\n 请定义排污口污染物浓度c2:");
scanf("%f",&c2);
c0=(c1*q1+c2*q2)/(q1+q2);
x=Ex*dt/(dx*dx)+u*dt/(2*dx);
y=1.00-2*Ex*dt/(dx*dx);
z=Ex*dt/(dx*dx)-u*dt/(2*dx);
if(u*dt/dx>1||Ex*dt/(dx*dx)>0.5)
printf("您的定义有误\n");
if((fp1=fopen("显式.dat","w+"))==NULL)
{
printf("不能找到file--显式.dat\n");
exit(1);
}
a[0]=c0;
for(i=1;i<L/dx;i++)
a[i]=c1;
for(j=1;j<T/dt;j++)
{
for(i=0;i<L/dx;i++)
if(i==0) b[i]=a[0];
else
b[i]=x*a[i-1]+y*a[i]+z*a[i+1];
for(i=0;i<L/dx;i++)
{
a[i]=b[i];
fprintf(fp1,"%lf\t",a[i]);
}
fprintf(fp1,"\n");
printf("运算中请稍等@_@%ld共运算%ld次\n",i*j,L/dx*T/dt);
}
fclose(fp1);
return 0;
}