【Fluent UDF】浮点溢出错误后初始化对UDF运行的影响、停止正在进行的计算后重载UDF再计算会产生的效果

news2024/12/28 19:32:24

一、初始化对UDF运行的影响

初始化只会初始化网格上的物理数据、在UDF中常用的实际时间flow-time(CURRENT_TIME)、迭代步数N_ITER、UDM中的数据(其实也就是网格物理数据)。

初始化之后,UDF程序中的静态变量不会再初始化(程序变量初始化和fluent的初始化不同,请注意区分),也即fluent初始化后再计算不会让程序再回到第一次执行的状态,UDF程序依稀记得初始化前静态变量在运算过程中得到取值。

不知道各位读者理没理解上面这句话,如果不理解请再继续阅读下面的。

我举个例子。假设我们需要在UDF中实现写入数据,具体来说需要每次迭代结束时判断flow-time是否经历了一次写入周期(比如1秒写入一次),如果经历了一个周期就写入一次,而且第一次一定要写入一次。

为了实现上述特征,我编写了如下UDF代码。

DEFINE_EXECUTE_AT_END(iter_ending)
    {
        real End_iter_time=0.0;
        real curing_ratio_ave=0.0;  /* Volume weighted average curing degree */
        real heat_ave=0.0;  /* Volume weighted average heating energy */


        #if !RP_HOST
        Thread *sheet_ct;
        int sheet_id = sheet_zone_id;
        cell_t c;

        real curing_ratio_weighted_sum=0.0;
        real heat_weighted_sum=0.0;
        real volume_sum=0.0;
        #endif


        #if !RP_NODE
        FILE *fp = NULL;
        char filename[]="out.txt";
        static int remain_num = -1;  /* Static variables are initialized only once */
        #endif



        #if !RP_HOST
        sheet_ct = Lookup_Thread(Get_Domain(1), sheet_id);

        begin_c_loop_int(c, sheet_ct)
        {
            curing_ratio_weighted_sum += C_VOLUME(c, sheet_ct) * C_UDMI(c, sheet_ct, 0);
            heat_weighted_sum += C_VOLUME(c, sheet_ct) * C_UDMI(c, sheet_ct, 3);
            volume_sum += C_VOLUME(c, sheet_ct);
        }
        end_c_loop_int(c, sheet_ct)

        curing_ratio_weighted_sum = PRF_GRSUM1(curing_ratio_weighted_sum);
        heat_weighted_sum = PRF_GRSUM1(heat_weighted_sum);
        volume_sum = PRF_GRSUM1(volume_sum);
        curing_ratio_ave = curing_ratio_weighted_sum / volume_sum;
        heat_ave = heat_weighted_sum / volume_sum;
        End_iter_time = CURRENT_TIME;

        #endif

        node_to_host_real_4(End_iter_time, bou_temp, curing_ratio_ave, heat_ave);

        #if !RP_NODE
        if(N_ITER<1)  /* Clear the file when open the file for the first time */
        {
            if ((fp = fopen(filename, "w"))==NULL)
                Message("\nWarning: Unable to open %s for writing\n", filename);
            else
                Message("\nWriting info to %s...\n", filename);
                fprintf(fp, "real-time \t bou_temp \t  curing_ratio_ave \t heat_ave\n");
        }
        else
        {
            if ((fp = fopen(filename, "a"))==NULL)
                Message("\nWarning: Unable to open %s for writing\n", filename);
            else
                Message("\nIt is available to Write data to %s...\n", filename);
        }
        #endif

        #if !RP_NODE
        Message("real-time:%lf \t bou_temp:%lf \t  curing_ratio_ave:%lf \t heat_ave:%lf\n", End_iter_time, bou_temp, curing_ratio_ave, heat_ave);
        if(remain_num != (int) (End_iter_time / writig_frequency))
        {
            remain_num = (int) (End_iter_time / writig_frequency);
            Message("\nWritting data to %s...\n", filename);
            fprintf(fp, "%lf \t %lf \t %lf \t %lf \n", End_iter_time, bou_temp, curing_ratio_ave, heat_ave);
        }
        fclose(fp); 
        Message("Iter_Done\n");
        #endif
    }

我的UDF代码中的DEFINE_EXECUTE_AT_END宏里定义了一个静态变量。

静态变量有两个特点:1、不会被其他文件误调用,即使同名;2、取值仅仅初始化一次。

我就是看中了后面这一点,才在此处加了static关键字,因为我想让这个变量在程序在第一次执行时取值符合某种条件(满足条件就写入数据到文件),后续迭代步时取值仅仅由初始化代码的后面代码决定。

-------------------------------------UDF代码讲完了,接着讲常规操作-----------------------------------------

将刚定义好的cas文件载入,加载UDF后(在加载前编译成功,并且进行了hook和在边界条件等处应用了UDF),接着设置一个自认为合理的时间步长,开始计算。

可是,没一会儿就报错——浮点溢出了(floating point exception)。

于是乎我们进行一次fluent初始化,清除掉所有的网格数据(还有flow-time、N_ITER等),调小时间步长再计算(注意我们没有卸载UDF再重载)。

我们发现在UDF中的DEFINE_EXECUTE_AT_END宏里定义的初次运行会写入一次数字数据的操作(倒数第6行)失效了。

在这里插入图片描述
后来我猜测fluent初始化并不会让程序重新运行,让静态变量再一次进行(程序变量)初始化,因此flow-time必须满足个位更新(我在UDF源文件最前面的全局区域定义writig_frequency为1.0)的条件才会执行倒数第6行的代码。

这只是猜想,接下来我们在第二部分验证。

二、重载UDF再计算对UDF运行的影响

本部分研究【停止正在进行的计算后重载UDF再计算会产生的效果】。

如果你仅仅是用下图中的两个stop按钮之一停止计算,做一些步长调整(或其他参数调整)后,或者你停止计算后进行了初始化。

再重新开始计算时,你的程序之前保存的静态变量取值还保存着。

在这里插入图片描述

当我这次将原来加载的libudf卸载,重新加载时,再开始计算。

这次我发现,倒数第6行的代码被很快运行,说明这次程序满足第一次运行就写入数据的条件,也说明静态变量在重载后会被重新进行(程序变量)初始化。
在这里插入图片描述

三、后话

为了避免下一次再出现同样的问题,我在DEFINE_EXECUTE_AT_END宏中加了下面这条代码。

使得这个辅助判断的变量remain_num在第一次迭代时一定满足写入数据条件,不管是否之前已经执行过。在这里插入图片描述

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

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

相关文章

【牛客刷题专栏】0x22:JZ21 调整数组顺序使奇数位于偶数前面(一)(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

Java阶段二Day03

Java阶段二Day03 文章目录 Java阶段二Day03V5BirdBootApplicationClientHandlerHttpServletRequest V6BirdBootApplicationClientHandlerHttpServletRequest V7BirdBootApplicationClientHandlerHttpServletRequestHttpServletResponse V8BirdBootApplicationClientHandlerHttp…

【Unity入门】14.值类型和引用类型

【Unity入门】值类型和引用类型 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;值类型 &#xff08;1&#xff09;C#的值类型 1. 布尔类型&#xff08;bool&#xff09; 2. 字符类型&#x…

【软考备战·希赛网每日一练】2023年4月18日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源&#xff1a;2023年04月18日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; MTTF&#xff1a;平均无故障时间 MTTR&#xff1a;平均故障修复时间 可用性/可靠性MTTF…

一文入门Typrscript和Vue3

一、TypeScript快速上手 在TypeScript专栏已经详细介绍过TypeScript,在此总结一下TypeScript和Vue3的基础知识。 1. 初识 TypeScript 1.1 TypeScript 的介绍 TypeScript是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集&#xff0c;最终会被编译为JavaScrip…

Python轻量级Web框架Flask(9)——图书馆项目

1、项目要求&#xff1a; 创建一个项目&#xff0c;用来说明出版社&#xff0c;书籍和作者的关系。作者和书籍之间的关系&#xff1a;1对多&#xff08;一本书由一个作者完成&#xff0c;一本书可以有多个创作者&#xff09;出版社和书籍之间的关系&#xff1a;多对多&#xf…

day15 消息队列

目录 消息队列 消息队列的使用 发送消息 消息的接收 消息队列的控制 消息队列 概念&#xff1a; 消息队列是system V IPC对象的一种&#xff1b; 消息队列有消息队列ID来唯一标识&#xff1b; 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等&a…

有介质的高斯定理详细证明(电偶极子模型)以及例题讲解

目录 静电场中的电介质 电极化强度的引入 电偶极子模型的计算 电介质极化过程 极化电荷引入 推导 各向同性和线性的电介质 例题 静电场中的电介质 电介质与导体的区别&#xff1a;所有的粒子被束缚在原子核周围&#xff08;限制空间&#xff09; 电介质分为两种 1.无…

OldWang带你了解MySQL(十)

文章目录 &#x1f525;MySQL事务&#x1f525;使用事务&#x1f525;事务的并发问题&#x1f525;MySQL的用户管理&#x1f525;MySQL分页查询 &#x1f525;MySQL事务 事务简介 事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完…

【网络小知识】当我在浏览器url输入文本后的解析流程/http协议对比https协议

当我们在地址栏输入信息之后&#xff0c;我们会得到浏览器给我们一个返回的信息&#xff0c;那么这个信息怎么出来的&#xff1f;且看下文~~~ 目录 ⭐一、浏览器url解析流程⭐二、http协议对比https协议 ⭐一、浏览器url解析流程 在浏览器地址栏输入文本后&#xff0c;比如 “…

window.postMessage()接收不到信息(失效)

问题描述 按照正常的代码逻辑&#xff0c;应该是这个样子&#xff0c;通过iframe打开子窗口&#xff0c;能够正常通信。 // 接收端&#xff08;父窗口&#xff09; window.onmessage function (e) {// 逻辑代码 }// 发送端&#xff08;子窗口&#xff09; window.parent.po…

第一次参加CSDN周赛,这体验很难说···

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSDN周赛】 本篇文章目录&#x1f30f;前言&#x1f30f;一、勾股数&#x1f338;题目描述&#x1f338;题解&…

Android Activity 了解

前言 : Android 系统的四大组件分别是 1 活动 &#xff08;Activity&#xff09; 2 服务&#xff08;Service&#xff09; 3 广播接收器&#xff08;Broadcast Receiver&#xff09; 4 内容提供器 &#xff08;Content Provider&#xff09; 其中活动是所有安卓应用程序的…

rust闭包(Closure)

闭包(Closure) 闭包在现代化的编程语言中普遍存在。闭包是一种匿名函数&#xff0c;它可以赋值给变量也可以作为参数传递给其它函数&#xff0c;不同于函数的是&#xff0c;它允许捕获调用者作用域中的值。Rust 闭包在形式上借鉴了 Smalltalk 和 Ruby 语言&#xff0c;与函数最…

无聊小知识.04 以下代码会输出什么?

1、前言 今天同事给我看了一段代码&#xff0c;然后这段简单的代码&#xff0c;我却陷入了沉思。 2、代码 String string ""; try {string "123";return string; } finally {string "234"; } 这段代码&#xff0c;string最终是“123”还是…

【SpringSecurity】学习笔记(一)

学习笔记一、SpringSecurity 简介二、创建测试项目2.1、引入依赖2.2、测试三、SpringSecurity基本原理3.1、过滤器链3.1.1、FilterSecurityInterceptor3.1.2、ExceptionTranslationFilter3.1.3、UsernamePasswordAuthenticationFilter3.2、过滤器加载过程3.3、两个重要的接口3.…

看完这篇,保证你学网络安全一帆风顺!

网络安全入门很难吗&#xff1f;总有人抱怨黑客入门太难了&#xff0c;然后仔细了解之后却发现&#xff0c;觉得难是因为看的视频教程都不是配套的&#xff0c;都是这里学一点、那里学一点&#xff0c;脑子里连基本的框架都没有。更过分的是&#xff0c;有的人学了好几个月&…

uniapp - 微信小程序端引入 Echarts 图表及使用详细教程,简单快速的解决方案(拒绝复杂的过程,附带详细的使用示例保姆级教程)

效果图 现在各种平台的文章都太乱了,基本上实测无效。。。 帮你在uniapp开发中,微信小程序平台端使用 echats 图表的详细教程,快速并且简单轻松搞定。 下面是最后的运行结果,随便用的一个图表进行展示,图表更多用法详见文档!

用正则去掉所有HTML标签,保留指定标签

保留单个&#xff0c;如保留img标签&#xff1a;str.replace(/]*>/ig,) 保留多个&#xff0c;如保留strong、em、p、u标签&#xff1a;str.replace(/]*>/ig,) 清除所有标签&#xff0c;就是去掉保留指定标签的部分了&#xff1a;str.replace(/]*>/g, ) replace 正则匹…

(学习日记)2023.4.18

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…