书接上文

小白的MatSWMM使用心路(一)——安装试运行过程与可能常见问题的解决_叶不伤的博客-CSDN博客上一篇中成功运行了MatSWMM,这一篇中来尝试自动率定最关键的一步,修改INP文件。

目录

目录

1. MatSWMM居然只能modify和get部分参数?悲催的事情发生了

2. 绕开MatSWMM,单独来看怎么批量修改Input(.INP文件)(其实是txt文件)

2.1 查询某个内容的所在的行

2.2 根据行号,提取指定某几行的内容并修改

提取查看

进行修改

2.3 效果基本成功

3. 太长不看版的简单总结


1. MatSWMM居然只能modify和get部分参数?悲催的事情发生了

果然都是说的很美好,但是用起来会出各种各样的问题啊……

虽然一些文献中指出原版MatSWMM至少可以修改和调取管长、糙率等参数,但是它自己对于modify是这样写的:

也就是说按照这个说明,除了INVERT和DEPTH两个参数,其他的都无法进行修改

笔者进行实测,发现不止modify,就连get_from_input也只对这两个参数有反应,其他都会报错

……

但是get_all这个函数就很好用,全部数都可以调取出来,不太清楚为什么

关于这一点,2019年一位前辈的论文给出了SWMM增加API函数封装进dll的操作方法,大幅度增加了可以调整的参数并附上了源代码。可以说是完全解决了这个问题。(本人的研究思路也很大程度上借鉴了前辈的想法,向其致敬)。

基于改进和声搜索算法的城市雨洪模型参数率定 - 中国知网 (cnki.net)

但是!本人的C语言功底为0……所以,一时半会是复现不出这个做法了(悲)。

不过好消息是,既然SWMM的输入文件INP是一种比较灵活的文件格式,可以直接改后缀为txt,直接修改txt,然后再把后缀改回INP,就又能用了。那么干脆绕行,只要解决能够定位置批量修改INP的问题,其实也无需在意MatSWMM自己的功能嘛。

2. 绕开MatSWMM,单独来看怎么批量修改Input(.INP文件)

搜索了一下,很遗憾不太有Matlab直接修改input的方式。所以这一段直接其实就是怎么修改txt。

那还是再绕一下路,直接看matlab怎么修改txt的指定行,后期再批量修改后缀为inp罢。

这个还是比较现成的。

2.1 查询某个内容的所在的行

 a0=input('Input line content=','s');  %填写所需要查询的行的内容,储存为a0、fn=input('Input file address=','s');  %填写文件地址Origin= fopen(fn,'r');i=0;q=0;while  ~feof(Origin)   %循环体,feof为逐行查询txti=i+1;tline = fgetl(Origin);if strcmp(tline,a0);  %如果当前行是所查询的行q=i;  %记录行号为qendendfclose(Origin); %必须关,不然下次开会有问题fprintf( 'the line is line number')disp(q)   %输出查询到的行号

计划是提取txt中各个数据部分title的行号,以找到对应想修改的参数的位置,这部分参考教程为Matlab提取ABAQUS后处理文件inp中的节点数_dosper19的博客-CSDN博客_matlab怎么读取inp文件

而特别针对SWMM的INP文件以txt打开时,我们可以发现参数都是以[SUBCATCHMENT]这样的title开始,在出现第一个空格后结束。

那么进阶的,这个部分就可以以这种思路查找——查找出title后返回行号,之后继续接着查,查到第一个空行,再返回行号。

这一部分的代码改进为:

fn=input('Input file address=','s');  %填写文件地址
%全部粘贴完打回车后,出现Input file address=  在后面输入3tankstest.txt(不用加引号)。也可以输入自己的文件的完整地址title=input('Input line content to find='); %填写要寻找的行内容
%全部粘贴完打回车后,出现Input line content to find= ,在后面输入["[SUBCATCHMENTS]";"[SUBAREAS]";"[INFILTRATION]"],也可以把每个双引号内改成自己想查询的行的完整内容Origin= fopen(fn,'r');len=length(title); %测量需要获取的信息长度q=zeros(len,2); %第一列用来储存数据起始,第二列储存数据结束for k=1:len %挨个title查询a0=title(k,1);i=0;frewind(Origin); %很重要,保证每次循环将指针复位到txt的首行,从头开始查while  ~feof(Origin)   %循环体,feof为逐行查询txti=i+1;tline = fgetl(Origin);if strcmp(tline,a0) %如果当前行是所查询的行q(k,1)=i+2;%记录下来title的位置(其下2行开始为真实数据,故+2)break  %一旦查到就停止再往下查endendwhile  ~feof(Origin) %从上次从第i行的break的那里再开始,向后查询i=i+1;tline = fgetl(Origin);if  numel(tline)==0 %一旦出现第一个空行q(k,2)=i-1; %记录下来空行的位置(其上一行为真实数据,故-1)break  %一旦查到就停止再往下查endendend
disp(q) %查看矩阵q

2.2 根据行号,提取指定某几行的内容并修改

  • 提取查看

参考文章Matlab修改txt指定行内容_黑皮执事的博客-CSDN博客_matlab替换文本文件某一行

还是用MatSWMM里自带的示例文件3tanks.inp,后缀改成txt打开后看着是这样

那么比如我们现在想批量修改汇水区【subcatchments】的坡度slope,变成3,3,2,2这样

先用上文查询所在行的代码查询一下【subcatchments】下属数据的行号。可以很轻松查询到汇水区参数真正的区域为56-59。

 fn= fopen('3tankstest.txt');    % 输入文件地址,确定提取文件fileID(fn)FormatString=repmat('%s %s %s %f %f %f %f %f',1,1);  %查看对应的txt里,每一段的格式%因为SWMM的inp文件格式固定,所以每种查一次就好%这里发现是前3个是字符,后5个是数字,所以这么写了,为了标准,其实也可以继续控制浮点的小数data = textscan(fn,FormatString,4,'headerlines',55);  %参数1:从fn里%参数2:以FormatString的格式提取值%参数3:提取4行%参数4:跳过前n行%参数5:跳过的n为55,即从56行开始提取fclose(fn); %记得有开有关,不然下次会报错

于是生成了data,查看一下为cell格式

 cell内为取值,和txt里一致

  • 进行修改

修改的时候最主要的麻烦出现在数据格式上,根据上述方法生成的data里,文本及参数均以数组格式储存起来,确实还是比较便于查看修改的。但是写入txt时,却变得麻烦了基本上要么写入纯文本,要么写入纯字符。至于数组,或者是字符和文本混合的形式,都不是被接受的状态……这个部分确实花了很多时间。

但是最终大概也是摸索出来了(好像有绕路,但是不管了XD)

修改完指定列后(比如修改了第7列slope):

%修改data里的指定列要素(这里以修改第7列slope为例子)
data{1,7}=[3;3;2;2];%然后整理格式1 需要修改的部分有4行8列,因此创建一个4×8数组new储存new=cell(4,8);for i=1:4for j=1:8if j<4  %这里有点麻烦,前3列的字符是写在嵌套的cell里面的,所以得把字符串拿出来aa=data{1,j}(i,1);b=aa{1,1};new{i,j}=b;elseaa=data{1,j}(i,1);b=num2str(aa);  %后5列则是直接写在第一层cell里,所以用num2str转成字符串new{i,j}=b;endendend%整理格式2 将文本数字逐行转化成1个字符串储存进4×1的元胞数组new2new2=cell(4,1); %同列合并起来for i=1:4tou=new{i,1};for j=2:8chuan=new{i,j};chuan=[tou,' ',chuan]; %想到的方法只有循环,然后从头以空格连接8个要素,形成一个字符串tou=chuan;endnew2{i,1}=tou;end

学习了一些前辈们提供的教程后,把修改内容写进txt的整体思路就是:

1. 准备好需要替换的几行新内容

2. 从头逐行抄写原txt

3. 如果到了需要修改行,那么则这几行就不抄原文,开始抄写新内容

4. 直到抄写完原txt最后一行

5. 把带有新内容的抄写版txt复制覆盖原txt/生成新txt

2.3 效果基本成功

打开新txt,可以看到虽然格式跟其他的已经不一样了(间隔符不一样),但是确实是写进去了

那么swmm可以识别吗?

后缀直接改成inp然后导入一下:

(matlab控制修改后缀得教程可以参考:MATLAB 批量改文件后缀_凯旋16668的博客-CSDN博客_matlab批量修改后缀)

导入和识别都没有问题,坡度已经修改完成了,放进SWMM软件运行也完全没问题。

利用MatSWMM在Matlab里运行也完全没有问题

3. 太长不看版的简单总结

整体上就是:因为MatSWMM无法实现所有参数的修改,所以:

将INP改成txt→(利用matlab与txt的交互)→对参数进行位置检索和提取→参数修改→参数写回txt→txt再改成INP。

肯定不是最简单的办法,但是感觉原理比较浅显也好理解吧,短时间内自己鼓捣也只能这么实现目标了。

下一篇的计划就是步入关键,整体批量修改和批量运算了。

还是,提前预祝自己成功啦(十一前要成功啊(哭))。

小白的MatSWMM使用心路(二)——用matlab修改INP文件参数/使用matlab查找txt内容并修改多行内容相关推荐

  1. 小白的MatSWMM使用心路(一)——安装试运行过程与可能常见问题的解决

    写在最前面:作为一个有点菜的学生(一把年纪,真是颇为羞愧),计算机基础也好,水文模型软件也好,这篇里面确实可能会有点理解的各种不到位,也许确是走了不少大佬们看起来的弯路,甚至有很多不知道原理但是莫名其 ...

  2. matlab 处理dat文件画图,matlab_DAT_processing matlab处理dat文件并进行绘图 - 下载 - 搜珍网...

    matlab实验2/11.txt matlab实验2/B00001.dat matlab实验2/B00002.dat matlab实验2/B00003.dat matlab实验2/B00004.dat ...

  3. matlab创建nc文件怎么打开,MATLAB打开nc文件并读取nc文件数据

    MATLAB打开nc文件 ncdisp('E:\**\**.nc') 输入该命令后命令行窗口会显示该nc文件的基本信息 MATLAB读取nc文件 根据上一步中nc文件的基本信息提取nc文件的相应数据. ...

  4. matlab引用csv文件,如何用MATLAB读取csv文件

    如何使用Matlab读取csv文件 在Matlab中,有专门读取csv文件的函数:csvread().在Matlab的帮助文档中,有对这个函数的详细解释. csvread()函数有三种使用方法: 1. ...

  5. matlab中m文件是什么,MATLAB中M文件的使用

    运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...

  6. matlab能输入铁心参数,基于MATLAB的电力机车110伏直流稳压电源仿真研究

    1引言电力机车110伏直流稳压电源主要由110伏稳压电源柜和蓄电池共同组成.110伏稳压电源柜主要为电力机车的控制电路供电,而蓄电池在降弓情况下是为机车照明及低压试验提供能量,在升弓时则当电源柜发生故 ...

  7. matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例

    我目前正在混淆使用Matlab实现带有交叉验证的SVM. stackoverflow上有很多帖子提到了有关SVM及其交叉验证的信息;然而,即使使用最简单的'fisheriris'数据集也没有完整的例子 ...

  8. MATLAB求线性代数的参数范围,MATLAB科学计算04(线性代数问题求解一)

    文章目录 特殊矩阵 矩阵的基本概念 求解线性方程组 直接求解 判定求解 特殊矩阵 零矩阵.1矩阵及单位矩阵 生成nxn方阵: A=zeros(n), B=ones(n), C=eye(n) 生成mxn ...

  9. MATLAB处理EXCEL文件

    MATLAB处理EXCEL文件 文章目录 MATLAB处理EXCEL文件 前言 一.批量检索文件 二.对文档进行编辑 总结 前言 当需要批量处理EXCEL文件时,手动处理太耗时间且可能出错,由于电脑上 ...

最新文章

  1. python游戏服务器框架_Scut游戏服务器免费开源框架--快速开发(2)
  2. 绝命沙虫 精度,double,模拟 牛客白月赛44
  3. 神策数据易向文:打造券商上层数据应用的坚实基础
  4. 积跬步以至千里_《荀子》名句76则:不积跬步,无以至千里;不积小流,无以成江海...
  5. 1.常用字符对象方法
  6. 不兼容结构的协调——适配器模式
  7. 西瓜书——极大似然估计和朴素贝叶斯
  8. _CentOS「linux」学习笔记11:crontab定时任务常用参数和基本语法
  9. c++获取串口设备名称_RTThread PIN设备学习笔记
  10. performSelector:withObject:afterDelay: 的用法
  11. 2010.11.13网规论文关注点
  12. C语言 100道经典编程题适用于专升本,专接本【详细分析版】
  13. Redis 学习笔记-雷云龙
  14. spearman相关系数 matlab,数学建模——相关系数(4)——斯皮尔曼相关系数(spearman)...
  15. linux 查看文件哈希码,Linux校验文件SHA1/SHA256/MD5哈希值方法
  16. 山西计算机专业三本大学排名,2021山西三本院校排名 最新大学排行榜
  17. 恒指交易如何先小亏,后而才是大赚!
  18. Sharpen 的调试步骤
  19. 阿尔法编程python答案_C语言程序设计-阿尔法编程(编程答案)
  20. MATLAB 中的调用C语音DLL 库

热门文章

  1. 分享7个神仙壁纸网站,让新的壁纸,给自己小小的雀跃,不陷入年年日日的重复。
  2. 郑州大学 oracle数据库,郑州大学软件学院oracle.doc
  3. 通俗易懂带你了解Java多线程处理
  4. Flink Mailbox模型
  5. 求生之路2怎么联机显示服务器,求生之路2怎么联机
  6. 普通一本的计算机专业好就业吗,填报志愿:这22所“普通一本”大学值得报!优势专业好就业!...
  7. 财报解读:照明行业景气上行,欧普照明已步入增长“快车道”
  8. 浙大大龄毕业生的曲折人生路
  9. ADAS-GPS定位原理概述
  10. chosen插件--简单快速的理解