【CFD小工坊】尝试完成一个简单的溃坝流算例(2)——get_val系列函数

【CFD小工坊】尝试完成一个简单的溃坝流算例(2)——get_val系列函数

  • 前言
  • 设计思路
  • 代码讲解
    • get_int_val函数
    • Trim函数
    • 其余get系列函数

前言

在上一个博文《尝试完成一个简单的溃坝流算例(1)》中,我们提到了gat_val系列函数。该系列函数的功能是从一个文本文件(.txt)中读入模型所需的参数。
我们浅水模型中涉及参数众多,一般来说我们需要以如下的格式记录这些参数(以下是一个参数文件input.txt的示例):

//**time parameter**
TimeStr = 0.0
TimeEnd = 1.0
CFL = 0.75
DtMin = 0.00001
DtMax = 1.0000
//**Bottom elevation (zb.txt)**
BotType = 0
Bot0 = 0.0
//**Initial condtition**
Initial_Eta = 0
Eta0 = 0.0
Initial_Vel = 0
//**Boundary condition**//**physical parameters**
Viscosity = 1.0E-6
Manning = 0.03
//**numerical parameter**
DepDry = 1.0E-4
DepWet = 5.0E-4
Theta_fric = 1.0
//**output**
OutStr = 0.0
OurInt = 0.5

gat_val系列函数需要在input.txt中寻找对应的变量名,并读取对应的变量值。

设计思路

一般来说,gat_val系列函数只需一个自变量,即索要读取参数的参数名。例如,get_val(“CFL”)。这个自变量是一个字符串,而返回值是数(可以是整数、浮点数)或者字符串。
执行步骤的设计思路如下:

  1. 打开input.txt文件
  2. 从上至下,以字符串的方式读取每一行的信息,这行的形式为“变量名 = 变量值”
  3. 识别等号"="前的字符串,并判断这个字符串信息是否和自变量信息一致,以确定自变量在的哪一行;
  4. 若该自变量对应这一行,识别并读入等号后面的变量值;若不是,则继续读入下行信息,回到第3步骤;
  5. 关闭input.txt文件。

代码讲解

以下将给出我写的get_val系列函数的代码。

get_int_val函数

/*
* Function: get_int_val(var_)
* Usage: read the values (int) from the file input.txt
*        For example, INI_eta = get_int_val("Initial_Eta")
* Called by: input
*/
int get_int_val(char *var_) {char *var_name;int num;int i, len, flag = 0;FILE* fp = fopen("input.txt", "r");if (fp == NULL) {fprintf(stderr, "Fail to read input files! \n");exit(EXIT_FAILURE);}char* row1 = (char*)malloc(sizeof(char) * N_str);char* var_read = (char*)malloc(sizeof(char) * N_str);while (fgets(row1, N_str, fp) != NULL) {len = strlen(row1);if (row1[0] == '/')	continue;for (i = 0; i < len; i++) {if (row1[i] == '=') break;var_read[i] = row1[i];}var_read[i] = '\0';var_read = Trim(var_read);if (strcmp(var_read, var_) == 0) {sscanf(row1, "%s = %d \n", &var_name, &num);flag = 1;return num;}}if (flag == 0) {fprintf(stderr, "%s cannot be found in input.txt \n", var_);}free(row1);free(var_read);fclose(fp);
}

首先,通过fopen函数打开input.txt文件。之后,进入一个while循环(第20行);在每次循环开始时,通过fgets函数读出这一行存储的信息,并存在字符串row1中。
此时,我们需要通过一个for循环来找出这行中等号所在的位置,并把等号前的字符串存储在var_read中(第20~27行)。在给var_read赋值后,我们再通过一个函数Trim来去掉var_read头部、尾部的多余空格(第28行);自定义函数Trim的代码详见下一小节。
判断var_read和自变量var_是否一致(第30行)。如果一致,则通过sscanf函数读如等号后面的数值,赋值到num中。
在整个while循环过程中,我们设置了一个识别符flag,并设置初值为0。如果找到了var_对应的参数值,则赋值flag = 1 (第32行)。如果没有找到var_对应的参数值,则flag = 0,则程序会报错(第37~39行)。
最后使用fclose关闭input.txt文件。

Trim函数

Trim函数也仅有一个自变量,即字符串src。它的功能是去掉src头部和尾部的多余空格,并返回。
代码如下:

/*
* Function: char* Trim(char *src)
* Usage: cut out the extra spaces of src at its beginning and end
* Called by:
*/
char* Trim(char *src)
{char *ori_src = src;char *begin = src;char *end = src + strlen(src);if (begin == end)  return ori_src;while (*begin == ' ' || *begin == '\t')++begin;while (*end == '\0' || *end == ' ' || *end == '\t')--end;if (begin > end) {*src = '\0';   return  ori_src;}while (begin != end) {*src++ = *begin++;}*src++ = *end;*src = '\0';return ori_src;
}

其余get系列函数

此外,我们的模型中还用了get_double_val(char *var_)和get_string_val(char *var_)。他们的代码均与get_int_val函数的代码类似;唯一的区别是在找到变量var_所在的行后,用于读取、赋值的变量的类型为double或char。
此外,对于get_string_val的代码,一般sscanf(row1, “%s = %d \n”, &var_name, &num)的方式读取参数,而是通过更直接的一种方式:

  1. 将"="号后面的字符串赋值给一个空字符串(如char *res)。
  2. 利用Trim去掉res头部和尾部的多余空格,之后得到的res即所需的参数值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有没有能用蓝牙的游泳耳机?四大年度最佳游泳耳机由衷推荐

随着科技的不断发展&#xff0c;游泳爱好者们对于游泳耳机的追求也越来越高。在游泳过程中&#xff0c;音乐和播客是许多泳者们的最佳伴侣&#xff0c;它能帮助他们保持节奏、提高兴趣。然而&#xff0c;传统的有线耳机在水下容易产生拉扯&#xff0c;不仅影响游泳体验&#xf…

【Linux操作系统】:Linux进程概念(2)

一、Z(zombie)-僵尸进程 1.僵尸进程概念 故事 张三每天都有跑步的习惯&#xff0c;这一天他和往常一样跑步&#xff0c;跑了两三圈&#xff0c;突然跑在它前面的一个人倒在地上不动了&#xff0c;作为热心市民张三赶紧报警并且拨打120。很快120就来了&#xff0c;但是没过几分…

使用 QLoRA 在 Google Colab 中微调 Mistral 7b(完整指南)

使用 QLoRA 在 Google Colab 中微调 Mistral 7b&#xff08;完整指南&#xff09; 在本文中&#xff0c;我们将在一个名为 Enlighten 的游戏的整个代码库上微调 Mistral 7b&#xff0c;所有这些都在 Google Colab&#xff08;或 Kaggle&#xff09;中免费提供合成数据。在我们的…

深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

中科数安 | 企业办公透明加密系统,终端文件数据 \ 资料防泄密管理软件

#公司办公文件数据 \ 资料防泄密软件系统# "中科数安"是一家专注于数据安全领域的公司&#xff0c;其提供的企业办公加密系统是一种针对企事业单位内部数据安全需求而设计的解决方案。该系统通过先进的加密技术&#xff0c;对企业在日常办公过程中产生的各类敏感信息…

浙大版《数据结构学习与实验指导(第2版)》笛卡尔树

笛卡尔树 题目描述 笛卡尔树是一种特殊的二叉树&#xff0c;其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树&#xff0c;即结点左子树的所有K1值都比该结点的K1值小&#xff0c;右子树则大。其次所有结点的K2关键字满足优先队列&#xff08;不妨设为最小堆&am…

实景剧本杀小程序开发搭建

开发搭建实景剧本杀小程序需要以下步骤&#xff1a; 1. 确定小程序的开发语言和框架&#xff1a;根据项目需求和小程序的功能选择合适的开发语言和框架&#xff0c;如微信小程序、React Native等。 2. 设计小程序界面和功能&#xff1a;根据项目需求设计小程序界面和功能&…

MySQL--索引常见面试题详解

索引的设计原则&#xff1f; 在 where 子句中出现的列&#xff0c;建议设计索引。基数较小的列&#xff0c;不建议设计索引。尽量只用短索引&#xff0c;可以节省索引空间。不要过度索引&#xff0c;多设计联合索引&#xff0c;因为索引也有时间和空间的消耗。 创建索引需要注…

【css面试题】弹性盒布局模型 flex 全部知识点整理

一、基本语法 flex-basis 在分配多余空间之前&#xff0c;占据的主轴空间&#xff0c;相当于 widthflex-grow 定义项目的放大比例(存在剩余空间是否放大)默认为0 &#xff08;即如果存在剩余空间也不放大&#xff09;flex-shrink 定义项目的缩小比例&#xff08;空间不足&…

Mysql隔离级别的实现

Mysql隔离级别的实现 mysql隔离级别是通过MVCC锁来实现的&#xff0c;MVCC用来实现读已提交、可重复读 Mysql幻读的解决 1.针对快照读&#xff0c;通过 MVCC 方式解决了幻读 补充:串行化所有的数据库都没做&#xff0c;不过mvcc实现的效果跟串行化差不太多了&#xff0c;可以…

突飞猛进,智能饮品机器人如何助力实体经济?

近日&#xff0c;财务部公布了2024年第一季度及全年财报。数据显示&#xff0c;连锁品牌增长速度惊人&#xff0c;这其中不得不提到智能饮品机器人的使用&#xff0c;为不同的品牌门店拼速度、抢点位立下了不小的功劳&#xff0c;那么智能饮品机器人到底如何助力各门店&#xf…

Outlook API发送邮件的方法?如何设置接口?

如何使用Outlook API发送电子邮件&#xff1f;怎么调用API接口&#xff1f; 为了满足更高级别的需求&#xff0c;我们可能需要通过编程的方式来操作Outlook&#xff0c;这时候&#xff0c;Outlook API就显得尤为重要了。那么&#xff0c;如何使用Outlook API发送邮件呢&#x…

Spring Security自定义认证授权过滤器

自定义认证授权过滤器 自定义认证授权过滤器1、SpringSecurity内置认证流程2、自定义Security认证过滤器2.1 自定义认证过滤器2.2 定义获取用户详情服务bean2.3 定义SecurityConfig类2.4 自定义认证流程测试 3、 基于JWT实现无状态认证3.1 认证成功响应JWT实现3.2 SpringSecuri…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接&#xff1a;基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

普林斯顿算法讲义(一)

原文&#xff1a;普林斯顿大学算法课程 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 1. 基础知识 原文&#xff1a;algs4.cs.princeton.edu/10fundamentals 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 概述。 本书的目标是研究各种重要和有用的算法——…

多线程编程

多线程写作类 倒计时协调器CountDownLatch 某个线程需要等待其他线程执行到特定操作结束即可。例如&#xff1a;在多Web服务中&#xff0c;在启动指定服务时需要启动若干启动过程中比较耗时的服务&#xff0c;为了尽可能减少服务启动过程的总耗时&#xff0c;该服务会使用专门…

深入探讨MES管理系统与MOM系统之间的关系

在制造业的信息化浪潮中&#xff0c;各种系统与技术层出不穷&#xff0c;其中MES制造执行系统和MOM制造运营管理无疑是备受瞩目的两大主角。尽管它们都是制造业信息化不可或缺的部分&#xff0c;但许多人对它们之间的区别与联系仍感到困惑。本文将对MES管理系统和MOM系统进行深…

uniapp小程序上传oss

uniapp上传小程序代码 import crypto from crypto-js; import { Base64 } from js-base64/base64.js; // 计算oss签名。 function computeSignature(accessKeySecret, canonicalString) {return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecre…

#数据结构 线性表的顺序存储

目录 每日文案 一、线性表的定义 二、线性表的操作 顺序表的存储结构 顺序表的初始化操作 判断顺序表是否为空表 将顺序表置为空表 计算顺序表中的元素个数 取出顺序表中的对应位置元素 取出对应数值的位序 在对应位置插入元素 将对应位置的元素删除 将顺序表中的数据…