参赛作品SCEDv10Word文档下载推荐.docx
《参赛作品SCEDv10Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《参赛作品SCEDv10Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。
![参赛作品SCEDv10Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/2710a60b-50f0-4258-a1f2-c2d30f0ca701/2710a60b-50f0-4258-a1f2-c2d30f0ca7011.gif)
渗流计算
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<
e=1.0,则减少试算误差,取e=e/10=0.1,取Δh=3.0+e=3.1继续迭代,当Δh=3.2时,迭代前后误差满足试算误差,再较少试算误差,进行下一步迭代,直到试算误差等于要求误差Precision=0.0001,这迭代结束,得到最终的答案,具体迭代计算过程如下:
第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>
m_B>
m_H>
m_precision<
=1&
m_precision>
0&
m_m1>
m_m2>
=m_h1&
=m_h2)
MessageBox.Show("
参数输入正确,请点击开始计算!
"
);
else
参数输入不正确,请检查输入的参数!
privatevoidbtn_caculate_Click(objectsender,EventArgse)
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;
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_e)
m_ht0[i]=m_ht1;
m_ht1=Math.Min(m_ht1,m_ht2);
break;
}
ResultDisplay();
计算完成!
欢迎再次使用!
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"
))
Success!
"
提示对话框"
MessageBoxButtons.OK,MessageBoxIcon.Information);
对不起,文件导出失败!
privatevoidoutputData()
StreamWritersw=newStreamWriter("
//输出计算模型信息
sw.WriteLine("
-------TheReportoftheSeepageCaculationResult--------"
+
"
\r\n"
\r\n>
>
均质土石坝基本参数为:
\r\n坝高H:
{0:
F2}m"
\r\n坝顶宽度B:
{1:
\r\n坝基厚度Td:
{2:
\r\n上游水头h1:
{3:
\r\n下游水头h2:
{4:
\r\n上游坝坡坡度m1:
{5:
\r\n下游坝坡坡度m2:
{6:
\r\n渗透系数k:
{7:
e2}m/s"
m_H,m_B,m_Td,m_h1,m_h2,m_m1,m_m2,m_k);
\r\n-------------------------------------------------------------------"
//输出计算控制参数
计算精度为:
\r\n计算精度e:
e0}"
m_precision);
\r\n-------------------------------------------------------------------"
//输出计算分析
计算过程为:
\r\n下游溢出点高程试算的次数为:
F0}次"
\r\n计算总迭代次数为:
n+1,counter);
+Convert.ToString(i);
//输出结果小数点控制
第{0:
F0}次试算得到的下游溢出点高程为:
+m_ht0[i].ToString(Fn)+"
m"
i+1);
};
\r\n---------------------------------------------------------------------"
//输出计算结果信息
stringFm="
//输出结果小数点控制
计算结果为:
\r\n单宽渗流量为:
"
+m_q.ToString(Fm)+"
L/min"
\r\n溢出点高程(相对下游水面)为:
+m_h0.ToString(Fm)+"
m"
\r\n"
//输出时间
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)
privatevoidExitToolStripMenuItem1_Click(objectsender,EventArgse)
privatevoidIfoToolStripMenuItem1_Click(objectsender,EventArgse)
MessageBox.Show(
说明"
\r\n1.SCEDV1.0为均质土石坝稳定渗流计算小程序。
\r\n2.渗流计算公式参照《渗流分析与控制》(毛昶熙)编写。
"
\r\n3.本程序只能作为均质渗流计算的参考,不能作为设计标准。
privatevoidAboutToolStripMenuItem1_Click(objectsender,EventArgse)
About"
\r\nSCEDV1.0程序为武汉大学第六届“弘禹杯”工程程序设计大赛参赛作品。
\r\n更多信息请联系wangmin-whu@"
privatevoid版本ToolStripMenuItem1_Click(objectsender,EventArgse)
Information"
\r\nVersion1.0"
\r\nCopyrightWangmin@WHU.2012"
\r\nContactwangmin-whu@"
privatevoidhELPToolStripMenuItem_Click(objectsender,EventArgse)
SCEDV1.0使用手册"
\r\n1.根据程序右边“简化模型”图,确定均质土石坝的模型参数。
\r\n2.在程序左边“模型参数”栏输入相对应的参数。
\r\n3.点击“参数检查”按钮,对模型参数进行检查。
\r\n4.若参数无误,点击“开始计算”按钮进行计算。
\r\n5.计算结果将在“结果显示”栏显示出来。
\r\n6.点击“保存计算结果”,程序将输出Result_Report.txt的结果文件。
\r\n7.点击“关闭”,关闭程序。
\r\n注:
参数单位采用米和秒,流量的单位为(L/min)。
\r\n更多信息,查看“帮助”。
}
四、程序说明
1程序功能
a.实现均质土石坝模型的模拟;
b.计算均质土石坝简单模型的单宽渗流量;
c.计算均质土石坝简单模型的溢出点高程(相对下游水位);
d.输出计算报告。
2程序编写环境
程序采用C#语言编写,使用的IDE为MicrosoftVisualStudio2008TeamSystemSP1及MicrosoftExpressionBlend3,目标运行环境为.NetFramework3.5SP1;
开发和调试在Windows7Ultimate系统下进行。
3系统需求
程序运行于Windows操作系统下,系统中需要安装有Microsoft.NETFramework3.5ServicePack1以上版本。
若无法运行请访问以下站点