【fluent UDF】保留UDM变量Reserving UDM Variables Using Reserve_User_Memory_Vars-测试分析篇

一、问题背景

因为对Reserve_User_Memory_Vars这个函数比较陌生,在学习官方文档过程中发现难以理解,于是只好亲手在fluent 2022上测试一番。

直接上结论:

此保留函数运行一次后(设置GUI界面中的UDM数目+第一次加载共享库成功),再如何运行都不会产生保留效果,因此我估计fluent中目前最多加载两个共享库。

二、测试1:

在官方2023的二次开发文档中,如下是保留函数功能的示范性代码。
在这里插入图片描述

/* general FLUENT header files */
#include "udf.h"
#include "para.h"
#include "mem.h"

static int udm_offset = UDS_UNRESERVED;
#define N_TESTLIB_UDS 2
#define NUM_UDM 4


DEFINE_EXECUTE_ON_LOADING(on_loading, libname)
{
    // if I_AM_NODE_ZERO_P
    // {
        if (udm_offset == UDM_UNRESERVED) 
            udm_offset = Reserve_User_Memory_Vars(NUM_UDM);
        if (udm_offset == UDM_UNRESERVED)
            Message("\nDefine %d extra UDMs in GUI and reload %s\n,and the UDM_UNRESERVED is %d\n", NUM_UDM, libname, UDS_UNRESERVED);
        else
        {
        Message("%d UDMs have been reserved by the current "
        "library %s\n", NUM_UDM, libname);
        Set_User_Memory_Name(udm_offset,"lib1-UDM-0");
        Set_User_Memory_Name(udm_offset+1,"lib1-UDM-1");
        Set_User_Memory_Name(udm_offset+2,"lib1-UDM-2");
        }
        Message("\nUDM Offset for Current Loaded Library = %d",udm_offset);
    // }
}

DEFINE_ON_DEMAND(set_udms)
    {
        Domain *d;
        Thread *ct;
        cell_t c;
        int i;
        d=Get_Domain(1);
        if(udm_offset != UDM_UNRESERVED)
        {
            Message("Setting UDMs\n");
            for (i=0; i<NUM_UDM; i++)
            {
                thread_loop_c(ct,d)
                {
                    begin_c_loop(c,ct)
                        {
                        C_UDMI(c,ct,udm_offset+i)=2.0+i/10.0;
                        }
                    end_c_loop(c,ct)
                }
            }
        }
        else
            Message("UDMs have not yet been reserved for library 1\n");
    }

在on loading宏里面,首先进行第一个if判断,由于初始化时将udm_offset变量赋值为UDS_

UNRESERVED(此预定义宏在sg_udms.h中定义,取值恒为-1),也即-1,所以判定为真,会执行保留函数。
在这里插入图片描述
但是保留函数会对UDMs进行判断,如果用户并没有在GUI界面中如下图所示设置UDM的数目,那么保留函数并不会生效。
在这里插入图片描述
因此还会进入第2个if判断,从而弹出错误——Define xx extra UDMs in GUI and reload xx1,and the UDM_UNRESERVED is xx。意思是说需要在GUI界面定义至少xx1个UDM.
在这里插入图片描述
因此我们在GUI界面中定义UDM后,再返回重新加载libudf共享库。

这次没有报错,console中输出信息如下(本人将NUM_UDM宏改成4了)。之所以会输出这么多条message,是因为本人用的是并行UDF,每条对应1个计算节点/核心。

4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

UDM Offset for Current Loaded Library = 0  4 UDMs have been reserved by the current library libudf

我们可以看出执行保留函数后,UDM Offset变量被复制为NUM_UDM的取值,因此得以进入else语句输出【4 UDMs have been reserved by the current library libudf】

而我们再重新编译一份UDF,代码和上面的差不多,命名为libudf2,加载过程中发现这次保留函数压根就没有生效。

/* general FLUENT header files */
#include "udf.h"
#include "mem.h"

static int udm_offset = UDS_UNRESERVED;
#define N_TESTLIB_UDS 2
#define NUM_UDM 4


DEFINE_EXECUTE_ON_LOADING(on_loading, libname)
{
    if (udm_offset == UDM_UNRESERVED) 
        udm_offset = Reserve_User_Memory_Vars(NUM_UDM);
    if (udm_offset == UDM_UNRESERVED)
        Message("\nDefine %d extra UDMs in GUI and reload %s\n,and the UDM_UNRESERVED is %d\n", NUM_UDM, libname, UDS_UNRESERVED);
    else
    {
    Message("%d UDMs have been reserved by the current "
    "library %s\n", NUM_UDM, libname);
    Set_User_Memory_Name(udm_offset,"lib2-UDM-0");
    Set_User_Memory_Name(udm_offset+1,"lib2-UDM-1");
    Set_User_Memory_Name(udm_offset+2,"lib2-UDM-2");
    }
    Message("\nUDM Offset for Current Loaded Library = %d",udm_offset);

}

DEFINE_ON_DEMAND(set_udms)
    {
        Domain *d;
        Thread *ct;
        cell_t c;
        int i;
        d=Get_Domain(1);
        if(udm_offset != UDM_UNRESERVED)
        {
            Message("Setting UDMs\n");
            for (i=0; i<NUM_UDM; i++)
            {
                thread_loop_c(ct,d)
                {
                    begin_c_loop(c,ct)
                        {
                        C_UDMI(c,ct,udm_offset+i)=2.0+i/10.0;
                        }
                    end_c_loop(c,ct)
                }
            }
        }
        else
            Message("UDMs have not yet been reserved for library 2\n");
    }

上面是libudf1的代码

在这里插入图片描述
下面是console中的输出信息,可以看出这次保留函数并没有生效。

UDF Autorun:
on_loading

Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Done.

Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

UDM Offset for Current Loaded Library = -1
Define 4 extra UDMs in GUI and reload libudf1
,and the UDM_UNRESERVED is -1

三、测试2:在加载libudf之后执行demand宏,再加载libudf1

官方文档中如是言:

Note:that the on demand UDF must be executed after the solution is initialized to reset the initial values
for the UDMs.
中文:注意demand udf必须在求解器初始化之后被执行以初始化UDM数值。

于是乎我这次没直接加载libudf1,而是在加载libudf之后执行demand宏,再加载libudf1。

结果仍然没有变化,保留函数仍然没有生效。
在这里插入图片描述

四、测试3:修改UDM的数目后再加载

我怀疑是不是每加载一次共享库就需要重新确定GUI界面中的Number of User-Defined Memory Locations。
在这里插入图片描述
于是我更改了数目(情况1),或者直接点开这个对话框不修改数目(情况2),再次确定。

这两种情况都已经测试,结果相同,都还是出现上面的问题。

五、无关紧要的并行化测试

其实在中途,我还将# if RP_NODE宏和# if RP_HOST宏包裹住on loading的主干部分,以免输出太多同质化信息让我眼花缭乱。

但是我发现,不管让这个主干代码在host中执行、还是在node中执行、还是在node0中执行,最后都会在加载过程中卡住不动。

于是我无奈只好更改为不使用编译器指令——诸如# if RP_HOST等宏。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始学习 UVM】3.8、UVM TestBench架构 —— UVM Agent [uvm_agent]

文章目录 什么是 UVM Agent?所有的Agent Type是什么?如何确定UVM Agent是主动还是被动的?创建UVM代理的步骤一个UVM代理做什么?如何将UVM代理配置为主动或被动?一个UVM Agent例子推荐做法什么是 UVM Agent? 一个 Agent 将Sequencer、Driver和Monitor封装成一个单一实体,…

图像分类的划分数据,dataset和dataloader的实现

目录 1. 介绍 2. 主函数代码 2. utils 模块代码 2.1 划分数据集 2.2 可视化数据集 3. dataset 数据处理 4. collate_fn 5. other 1. 介绍 图像分类一般来说不需要自定义的dataSet&#xff0c;因为pytorch自定义好的ImageFolder可以解决大部分的需求&#xff0c;更多的…

springBoot --- mybatisPlus自动生成代码

mybatisPlus自动生成代码mybatisPlus自动生成代码pom.xmlapplication.yml自动生成代码测试主启动类生成目录结果使用插件 --- 版本要求&#xff1a;3.4.0 版本以上pom.xml更新mybatisplus插件版本mp报错‘AutoGenerator()‘ has private access in ‘com.baomidou.mybatisplus.…

Linux系统中使任务后台挂起不停止的命令

在使用远程SSH连接工具时&#xff0c;退出工具时任务也停止&#xff0c;相当于远程连接工具在系统开启了一个Terminal终端&#xff0c;服务也会随着终端的中断而停止。Linux系统也提供了服务基于后台运行的命令&#xff0c;是独立于终端的进程。 nohup Linux nohup Linux no…

【Python】仅7行代码实现自动化天气报时

文章目录前言一、实现步骤二、请求天气接口1.引入库2.读入数据3.钉钉通知天气预报总结前言 早上出门上班前&#xff0c;我总是忘记查看天气预报&#xff0c;以至于通勤路上下雨来了个措手不及。 回想起来&#xff0c;大部分人早上出门前的行为模式是固定的&#xff0c;那么有…

一个基于stream的EPICS IOC应用程序

本文将介绍如何开发一个基于stream的EPICS IOC应用程序&#xff0c;其将作为一个简单的基于消息的设备&#xff08;用于EPICS stream练习的设备模拟程序_yuyuyuliang00的博客-CSDN博客中最后一个python程序模拟的设备)的IOC控制程序。 1&#xff09; 按如下步骤建立这个IOC程序…

vb+access大气污染模型系统

数据模型就是按专业的要求&#xff0c;用数字方式描述自然界的事物或现象以及他们的关系。 我们通过对地区的具体数值和情况的观察&#xff0c;对大气质量状况做出分析&#xff0c;建立一个符合当地情况的大气污染模型&#xff0c;用来测量大气污染浓度&#xff0c;并根据污染…

在公司兢兢业业5年,被新来的自动化测试倒挂了薪资…

去年年中朋友左思右想从工作了 5 年的企业离职&#xff0c;离职原因很简单&#xff0c;待疲了&#xff0c;薪资也没咋涨过&#xff0c;新来的自动化测试钱比 Ta 高一倍。但离职 Ta 还是很忐忑的&#xff0c;在这个公司待得久了&#xff0c;自己会的东西一直是那些&#xff0c;业…

Python3爬虫图片抓取

在上一章中&#xff0c;我们已经学会了如何使用Python3爬虫抓取文字&#xff0c;那么在本章教程中&#xff0c;将通过实例来教大家如何使用Python3爬虫批量抓取图片。注&#xff1a;该网站目前已经更换了图片的请求方式&#xff0c;以下爬虫方法只能作为思路参考&#xff0c;已…

【Linux】进程理解与学习-程序替换

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅 相关文章推荐&#xff1a; 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学…

想拿到10k-40k的offer,这些技能必不可少!作为程序员的你了解吗

总结了一份Java架构师的技能树&#xff0c;希望对Java编程的同学有点帮助 Java编程的技术点&#xff1a; ​ 计算机基础 ​ Java高级特性 设计模式 ​ 数据库 分布式系统 ​ 注意&#xff1a;下文主要是我个人的总结方法经验&#xff08;面试学习和刷题笔记&#xff09; 01…

aws codedeploy 在ec2实例和autoscaling组上进行蓝绿部署

参考资料 https://docs.amazonaws.cn/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.htmlhttps://docs.amazonaws.cn/zh_cn/codedeploy/latest/userguide/applications.html为 EC2/本地蓝/绿部署创建部署组&#xff08;控制台&#xff09; 部署ec2比较…

面试角度看问题:消息队列详解(万字长文,绝对值得一看)

面试角度看问题&#xff1a;消息队列详解前言一、消息队列是什么&#xff1f;二、为什么要使用消息队列&#xff1f;1.解耦2.异步3.削峰三、消息队列有什么缺点&#xff1f;1.系统可用性降低2.系统复杂度提高3.一致性问题四、如何保证消息队列的高可用&#xff1f;1.RabbitMQ 的…

zookeeper

目录 1.软件架构的发展 2.了解zookeeper 2.1概述 2.2zookeeper的应用场景 2.3安装zookeeper 2.4zookeeper客户端命令 3.zookeeper简单操作 3.1zookeeper的数据结构 3.2节点的分类 3.3java代码操作zookeeper节点 3.4zookeeper的watch机制 3.4.1介绍 3.4.2NodeCache…

ERD Online 4.0.11 在线数据库建模、元数据协作平台(免费、私有部署)

ERD Online 是全球第一个开源、免费在线数据建模、元数据管理平台。提供简单易用的元数据设计、关系图设计、SQL查询等功能&#xff0c;辅以版本、导入、导出、数据源、SQL解析、审计、团队协作等功能、方便我们快速、安全的管理数据库中的元数据。 4.0.11 ❝ :memo: fix(erd):…

5亿融资与重磅新品双发布,杉数以智能决策技术变革中国产业运营模式

2023年3月30日&#xff0c;由杉数科技举办的“智能决策重塑增长”2023杉数科技智能决策前沿峰会在北京举行。会上发布了杉数新一轮融资消息&#xff0c;同时&#xff0c;面向零售快消的决策优化产品计划宇宙&#xff08;Planiverse&#xff09;与面向工业制造的决策优化产品数弈…

Flink (四) --------- Flink 运行时架构

目录一、系统架构1. 整体构成2. 作业管理器&#xff08;JobManager&#xff09;3. 任务管理器&#xff08;TaskManager&#xff09;二、作业提交流程1. 高层级抽象视角2. 独立模式&#xff08;Standalone&#xff09;3. YARN 集群三、 一些重要概念1. 数据流图&#xff08;Data…

C的实用笔记36——几种常用的字符串处理API(一)

0、const关键字 1、知识点&#xff1a;const是与存储相关的关键字&#xff0c;用作常量声明&#xff0c;修饰普通变量和指针变量&#xff0c;表示只读。const修饰普通变量&#xff1a;&#xff0c;修饰后变量从可修改的左值变成不可修改的左值 const修饰指针变量&#xff1a;分…

redis源码解析(四)——ziplist

版本&#xff1a;redis - 5.0.4 参考资料&#xff1a;redis设计与实现 文件&#xff1a;src下的ziplist.c ziplist.h 一、基础知识1、压缩列表的各个组成部分及详细说明2、列表节点3、encoding二、连锁更新三、ziplist.hquickList一、基础知识 压缩列表是Redis为了节约内存而开…

陌生人社交软件如何破冰?

据艾媒咨询的数据显示&#xff0c;2020年中国移动社交用户规模已达9.24亿人&#xff0c;预计2022年中国移动社交用户整体突破10亿人。而早在2020年&#xff0c;我国陌生人社交用户规模已经达到了6.49亿人&#xff0c;虽然增速有所放缓&#xff0c;但整体规模还是较为庞大。 艾媒…