/*污染物在一维河流中扩散的简单数值仿真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 A,B,C,D;
FILE *fp1;
int i,j,m;
double max;
double a[1001],b[1001],c[1001],d[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);
A=Ex/(dx*dx)/(1/dt+2* Ex/(dx*dx));
B=Ex/(dx*dx)/(1/dt+2* Ex/(dx*dx));
C=u/dx/(1/dt+2* Ex/(dx*dx));
D=(1/dt-u/dx) /(1/dt+2* Ex/(dx*dx));
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]=A*b[i-1]+B*a[i+1]+C*a[i-1]+D*a[i];
for(m=0;m<1000;m++)
{
for(i=0;i<L/dx;i++)
if(i==0) c[i]=c[0];
else
c[i]=A*c[i-1]+B*b[i+1]+C*a[i-1]+D*a[i];
for(i=0;i<L/dx;i++)
d[i]=c[i]-b[i];
max=d[0];
for(i=0;i<L/dx;i++)
if(d[i]>max)
max=d[i];
if(fabs(max)>=1)
for(i=0;i<L/dx;i++)
b[i]=c[i];
}
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;
}
评论14