参赛作品SCEDv10.docx
- 文档编号:12881499
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:22
- 大小:569.08KB
参赛作品SCEDv10.docx
《参赛作品SCEDv10.docx》由会员分享,可在线阅读,更多相关《参赛作品SCEDv10.docx(22页珍藏版)》请在冰豆网上搜索。
参赛作品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以上版本。 若无法运行请访问以下站点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 参赛 作品 SCEDv10