参赛作品SCEDv10.docx

上传人:b****1 文档编号:2125542 上传时间:2023-05-02 格式:DOCX 页数:22 大小:569.08KB
下载 相关 举报
参赛作品SCEDv10.docx_第1页
第1页 / 共22页
参赛作品SCEDv10.docx_第2页
第2页 / 共22页
参赛作品SCEDv10.docx_第3页
第3页 / 共22页
参赛作品SCEDv10.docx_第4页
第4页 / 共22页
参赛作品SCEDv10.docx_第5页
第5页 / 共22页
参赛作品SCEDv10.docx_第6页
第6页 / 共22页
参赛作品SCEDv10.docx_第7页
第7页 / 共22页
参赛作品SCEDv10.docx_第8页
第8页 / 共22页
参赛作品SCEDv10.docx_第9页
第9页 / 共22页
参赛作品SCEDv10.docx_第10页
第10页 / 共22页
参赛作品SCEDv10.docx_第11页
第11页 / 共22页
参赛作品SCEDv10.docx_第12页
第12页 / 共22页
参赛作品SCEDv10.docx_第13页
第13页 / 共22页
参赛作品SCEDv10.docx_第14页
第14页 / 共22页
参赛作品SCEDv10.docx_第15页
第15页 / 共22页
参赛作品SCEDv10.docx_第16页
第16页 / 共22页
参赛作品SCEDv10.docx_第17页
第17页 / 共22页
参赛作品SCEDv10.docx_第18页
第18页 / 共22页
参赛作品SCEDv10.docx_第19页
第19页 / 共22页
参赛作品SCEDv10.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

参赛作品SCEDv10.docx

《参赛作品SCEDv10.docx》由会员分享,可在线阅读,更多相关《参赛作品SCEDv10.docx(22页珍藏版)》请在冰点文库上搜索。

参赛作品SCEDv10.docx

参赛作品SCEDv10

 

程序设计大赛参赛作品

均质土坝渗流计算程序设计

 

作品:

SCEDv1.0

一、前言

渗流分析与计算的方法主要分为解析法、电拟法和数值法。

解析法利用有关数学手段直接求解基本微分方程,主要有流体力学和水力学两种方法。

解析法适合边界条件单一的情况,但对于实际工程复杂的边界条件,很难找到精确解析解。

电拟法采用导电液模型进行试验,但它无法模拟非均质各向异性渗透介质,对复杂的地质和边界也不尽适应。

随着电子计算机的迅速发展,数值方法(有限差分法、有限单元发和边界元法)在渗流分析中越来越广泛的应用。

针对本次程序设计大赛第六题“均质坝渗流计算程序设计”的要求,作者选择解析法的数学手段对渗流结果进行求解。

SCEDv1.0(SeepageCalculationofEarthdam)程序设计主要目的有一下几点:

1.掌握渗流计算的一般方法,加深对渗流问题的认识。

2.掌握迭代问题的一般算法,并提高迭代的效率。

3.设计程序界面,方便程序的使用。

4.提高自己的程序设计能力。

二、程序设计

1设计基础

SCEDv1.0使用C#语言编写而成,使用的框架为.NetFramework3.5SP1,用户界面采用的技术为WPF(WindowsPresentationFoundation)。

C#是面向对象的编程语言。

它使得程序员可以快速地编写各种基于MICROSOFT.NET平台的应用程序。

正是由于C#面向对象的卓越设计,使它成为构建各类组件的理想之选——无论是高级的商业对象还是系统级的应用程序。

图1程序界面及其相应的模块

2程序模块——类设计

图1所示为程序界面及其相应的模块图,显示本程序中核心部分的类图,用户界面部分未包含其中,类的功能定义如表1所示,其余具体说明等请参见源代码中的注释。

功能模块

对应的函数

函数的功能

模型参数读取模块

inputData

数据文件读取类的接口

渗流计算和结果显示模块

btn_check

模型参数的检查按钮

btn_calculate

渗流计算

ResultDisplay

结果显示

计算报告输出模块

btn_output

输出计算报告

outputData

形成计算报告

其他

btn_exit

退出

HELPToolStrip

帮助

表1核心类说明

3算法设计

程序采用类的形式封装各种对象及其相应操作,为保证算法的高效,存储结构方面主要使用了双精度浮点数和双精度浮点数数组。

(1)变精度算法

对于渗流量q和下游溢出点高程Δh两个未知量,计算取溢出点高程Δh作为迭代的对象。

为达到目标精度要求,实现未知量地高效迭代计算,本算法采用“变精度”法进行试算。

具体实现过程如图2所示:

图2变精度算法设计流程图

变精度算法主要是对试算精度e和迭代变量Δh进行控制,首先选取比较大的精度e,一般取e=1(表示计算结果只需要精确到小数点位),并选取比较小迭代变量,一般取Δh的范围的最小值。

每一次迭代完成后,判断迭代误差是否满足试算精度误差,即图2中的第一个菱形判断,若不满足,增加Δh的值,取Δh=Δh+e,直到迭代结果误差小于试算误差e的要求,这是得到第一次试算的结果,记作Δh(i)。

当该次的试算误差满足要求误差Precision时(即图2中的第二个菱形判断),得到的Δh(i)为满足要求的解答,如不满足,则需要减少试算误差,取e=e/10,即将精度向小数点后面再推一位,再进行迭代计算,迭代的初值则是前一次试算得到的Δh(i)。

由于试算误差e一直朝着要求误差Precision的方向取值,最终将计算得到满足要求误差Precision的解,即迭代收敛。

(2)算法详解

以本次渗流计算为例,计算模型如图3所示,对变精度试算法进行详细解答,模型参数采用大赛第六题中的数据。

图3计算模型简图

将坝高H、坝顶宽度B等八个模型参数输入程序,并输入要求精度0.0001,程序记作Precision=0.0001,对问题初始化,取下游溢出点高程Δh=0.0,试算精度e=1,按照公式①-③进行迭代计算:

根据溢出点高程Δh=0.0,由公式①、②可以计算出q,由公式③可以计算出迭代后的Δh,前后两次的Δh之差记为ht,与试算误差e进行比较。

若误差大于试算误差,增大Δh,取Δh=Δh+e=2,继续迭代。

当取Δh=3时,试算出来的Δh=3.2729,此时误差为0.2729

第1次试算得到的下游溢出点高程为:

3m

第2次试算得到的下游溢出点高程为:

3.2m

第3次试算得到的下游溢出点高程为:

3.23m

第4次试算得到的下游溢出点高程为:

3.236m

第5次试算得到的下游溢出点高程为:

3.2362m

下游溢出点高程试算的次数达到第5次时,得到的下游溢出点高程已达到精度要求,此时计算结束。

计算总迭代次数为3+2+3+6+2=16次。

综上,即可计算得到要求结果。

三、程序源代码

程序源代码共计278行,以下为渗流计算核心算法代码,提取自Form1.cs文件:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.IO;

usingSystem.Runtime.InteropServices;

namespaceseepage

{

publicpartialclassForm1:

Form

{

//输入的参数

privatedoublem_m1=0.0;

privatedoublem_m2=0.0;

privatedoublem_h1=0.0;

privatedoublem_h2=0.0;

privatedoublem_H=0.0;

privatedoublem_B=0.0;

privatedoublem_Td=0.0;

privatedoublem_k=0.0;

//输出结果

privatedoublem_q=0.0;

privatedoublem_h0=0.0;

//计算过程中的变量

privatedoublem_Hu=0.0;

privatedoublem_Hd=0.0;

privatedoublem_bm=0.0;

privatedoublem_Lx=0.0;

privatedoublem_L=0.0;

privatedoublem_A=0.0;

privatedoublem_D=0.0;

privatedoublem_ht1=0.0;

privatedoublem_ht2=0.0;

privatedoublem_ht=0.0;

privateintn;

privateintcounter;

privatedouble[]m_ht0=newdouble[10000];

//计算精度:

m_precision为控制精度,m_e为试算精度

privatedoublem_precision=0.0;

privatedoublem_e=0.0;

publicForm1()

{

InitializeComponent();

}

privatevoidinputData()

{

m_H=Convert.ToDouble(textBox1.Text);//坝高

m_B=Convert.ToDouble(textBox2.Text);//坝顶宽

m_Td=Convert.ToDouble(textBox3.Text);//坝基厚度

m_h1=Convert.ToDouble(textBox4.Text);//上游水头

m_h2=Convert.ToDouble(textBox5.Text);//下游水头

m_m1=Convert.ToDouble(textBox6.Text);//上游坝坡坡度

m_m2=Convert.ToDouble(textBox7.Text);//下游坝坡坡度

m_k=Convert.ToDouble(textBox8.Text);//渗透系数

m_precision=Convert.ToDouble(textBox11.Text);//计算控制精度

}

privatevoidbtn_check_Click(objectsender,EventArgse)

{

//对输入的数据进行判读,并提示是否输入正确的参数

inputData();

if(m_h1>=m_h2&&m_k>=0&&m_Td>=0&&m_B>=0&&m_H>=0&&m_precision<=1&&m_precision>0&&m_m1>=0&&m_m2>=0&&m_H>=m_h1&&m_H>=m_h2)

{

MessageBox.Show("参数输入正确,请点击开始计算!

");

}

else

{

MessageBox.Show("参数输入不正确,请检查输入的参数!

");

}

}

privatevoidbtn_caculate_Click(objectsender,EventArgse)

{

inputData();

m_Hu=m_Td+m_h1;m_bm=m_m1*m_Hu/(1+2*m_m1);m_ht1=0.0;

n=Convert.ToInt16(Math.Log10(1/m_precision));//n为试算次数

counter=0;//counter为计数器

for(inti=0;i<=n;i++)

{

if(i==0)

{

m_e=1.0;

}

else

{

m_e=m_e/10.0;

}

for(intj=0;j<=100;j++)

{

counter=counter+1;

m_ht1=m_ht1+m_e;

m_Hd=m_Td+m_h2+m_ht1;

m_Lx=m_m1*(m_H-m_h1)+m_B+m_m2*(m_H-m_h2-m_ht1);

m_L=m_bm+m_Lx;

m_D=0.5*(m_Hu*m_Hu-m_Hd*m_Hd)/m_L;

m_A=0.5*(m_D*m_m2-(1+0.4/m_m2)*m_Hd);

m_ht2=1.2*(m_A+Math.Sqrt(m_A*m_A+0.4*m_D*m_Hd));

m_ht=m_ht2-m_ht1;

if(Math.Abs(m_ht2-m_ht1)

{

m_ht0[i]=m_ht1;

m_ht1=Math.Min(m_ht1,m_ht2);

break;

}

}

}

ResultDisplay();

MessageBox.Show("计算完成!

欢迎再次使用!

");

}

privatevoidResultDisplay()

{

stringFn="";

m_q=m_D*m_k*60000.0;

m_h0=m_ht1;

Fn="F"+Convert.ToString(n);//控制结果小数点位数

textBox9.Text=m_q.ToString(Fn);//渗流量

textBox10.Text=m_h0.ToString(Fn);//溢出点高度(相对下游水面)

}

privatevoidbtn_output_Click(objectsender,EventArgse)

{

outputData();

if(File.Exists(Application.StartupPath+"\\"+"Result_Report.txt"))

{

MessageBox.Show("Success!

","提示对话框",

MessageBoxButtons.OK,MessageBoxIcon.Information);

}

else

{

MessageBox.Show("对不起,文件导出失败!

","提示对话框",

MessageBoxButtons.OK,MessageBoxIcon.Information);

}

}

privatevoidoutputData()

{

StreamWritersw=newStreamWriter("Result_Report.txt");

//输出计算模型信息

sw.WriteLine("-------TheReportoftheSeepageCaculationResult--------"+

"\r\n"+

"\r\n"+

"\r\n>>均质土石坝基本参数为:

"+

"\r\n坝高H:

{0:

F2}m"+

"\r\n坝顶宽度B:

{1:

F2}m"+

"\r\n坝基厚度Td:

{2:

F2}m"+

"\r\n上游水头h1:

{3:

F2}m"+

"\r\n下游水头h2:

{4:

F2}m"+

"\r\n上游坝坡坡度m1:

{5:

F2}m"+

"\r\n下游坝坡坡度m2:

{6:

F2}m"+

"\r\n渗透系数k:

{7:

e2}m/s",

m_H,m_B,m_Td,m_h1,m_h2,m_m1,m_m2,m_k);

sw.WriteLine("\r\n-------------------------------------------------------------------");

//输出计算控制参数

sw.WriteLine(">>计算精度为:

"+

"\r\n计算精度e:

{0:

e0}",m_precision);

sw.WriteLine("\r\n-------------------------------------------------------------------");

//输出计算分析

sw.WriteLine(">>计算过程为:

"+

"\r\n下游溢出点高程试算的次数为:

{0:

F0}次"+

"\r\n计算总迭代次数为:

{1:

F0}次",n+1,counter);

for(inti=0;i<=n;i++)

{

stringFn="F"+Convert.ToString(i);//输出结果小数点控制

sw.WriteLine("第{0:

F0}次试算得到的下游溢出点高程为:

"

+m_ht0[i].ToString(Fn)+"m",i+1);

};

sw.WriteLine("\r\n---------------------------------------------------------------------");

//输出计算结果信息

stringFm="F"+Convert.ToString(n);//输出结果小数点控制

sw.WriteLine(">>计算结果为:

"+

"\r\n单宽渗流量为:

"+m_q.ToString(Fm)+"L/min"+

"\r\n溢出点高程(相对下游水面)为:

"+m_h0.ToString(Fm)+"m"+

"\r\n");

//输出时间

sw.WriteLine("SCEDv1.0"+

"\r\n{0:

f}",System.DateTime.Now);

sw.Close();

}

privatevoidbtn_exit_Click(objectsender,EventArgse)

{

if(DialogResult.OK==MessageBox.Show("是否确定退出?

","提示",

MessageBoxButtons.OKCancel))

{

this.Close();

}

}

privatevoidClearToolStripMenuItem1_Click(objectsender,EventArgse)

{

textBox1.Text="";textBox2.Text="";textBox3.Text="";textBox4.Text="";

textBox5.Text="";textBox6.Text="";textBox7.Text="";textBox8.Text="";

textBox9.Text="";textBox10.Text="";textBox11.Text="";

}

privatevoidOutput_dataToolStripMenuItem1_Click(objectsender,EventArgse)

{

outputData();

if(File.Exists(Application.StartupPath+"\\"+"Result_Report.txt"))

{

MessageBox.Show("Success!

","提示对话框",

MessageBoxButtons.OK,MessageBoxIcon.Information);

}

else

{

MessageBox.Show("对不起,文件导出失败!

","提示对话框",

MessageBoxButtons.OK,MessageBoxIcon.Information);

}

}

privatevoidExitToolStripMenuItem1_Click(objectsender,EventArgse)

{

if(DialogResult.OK==MessageBox.Show("是否确定退出?

","提示",

MessageBoxButtons.OKCancel))

{

this.Close();

}

}

privatevoidIfoToolStripMenuItem1_Click(objectsender,EventArgse)

{

MessageBox.Show(

"说明"+

"\r\n"+

"\r\n1.SCEDV1.0为均质土石坝稳定渗流计算小程序。

"+

"\r\n2.渗流计算公式参照《渗流分析与控制》(毛昶熙)编写。

"+

"\r\n3.本程序只能作为均质渗流计算的参考,不能作为设计标准。

");

}

privatevoidAboutToolStripMenuItem1_Click(objectsender,EventArgse)

{

MessageBox.Show(

"About"+

"\r\n"+

"\r\nSCEDV1.0程序为武汉大学第六届“弘禹杯”工程程序设计大赛参赛作品。

"+

"\r\n更多信息请联系wangmin-whu@");

}

privatevoid版本ToolStripMenuItem1_Click(objectsender,EventArgse)

{

MessageBox.Show(

"Information"+

"\r\n"+

"\r\nVersion1.0"+

"\r\nCopyrightWangmin@WHU.2012"+

"\r\nContactwangmin-whu@");

}

privatevoidhELPToolStripMenuItem_Click(objectsender,EventArgse)

{

MessageBox.Show(

"SCEDV1.0使用手册"+

"\r\n"+

"\r\n1.根据程序右边“简化模型”图,确定均质土石坝的模型参数。

"+

"\r\n2.在程序左边“模型参数”栏输入相对应的参数。

"+

"\r\n3.点击“参数检查”按钮,对模型参数进行检查。

"+

"\r\n4.若参数无误,点击“开始计算”按钮进行计算。

"+

"\r\n5.计算结果将在“结果显示”栏显示出来。

"+

"\r\n6.点击“保存计算结果”,程序将输出Result_Report.txt的结果文件。

"+

"\r\n7.点击“关闭”,关闭程序。

"+

"\r\n"+

"\r\n注:

参数单位采用米和秒,流量的单位为(L/min)。

"+

"\r\n更多信息,查看“帮助”。

");

}

}

}

四、程序说明

1程序功能

a.实现均质土石坝模型的模拟;

b.计算均质土石坝简单模型的单宽渗流量;

c.计算均质土石坝简单模型的溢出点高程(相对下游水位);

d.输出计算报告。

2程序编写环境

程序采用C#语言编写,使用的IDE为MicrosoftVisualStudio2008TeamSystemSP1及MicrosoftExpressionBlend3,目标运行环境为.NetFramework3.5SP1;开发和调试在Windows7Ultimate系统下进行。

3系统需求

程序运行于Windows操作系统下,系统中需要安装有Microsoft.NETFramework3.5ServicePack1以上版本。

若无法运行请访问以下站点

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2