Fluent自定义用户界面:概念与介绍

译自:Ansys_Fluent_UDF_Manual_2021R2  Part2

第1章:Fluent用户界面概念介绍

本章概述了在ANSYS Fluent中创建与用户定义函数相对应的用户界面的过程。

1.1.介绍

面向接口的用户定义函数是指对应于自定义图形用户界面的用户定义函数。它们提供了一个优势,即可以随时更改数据值,而无需重新编译。此外,构建一个与UDF相对应的抛光用户界面将在ANSYS Fluent和您的UDF之间创建一致的外观和感觉。本手册的这一部分将指导您使用Fluent创建自定义界面的过程,该界面允许您编辑和存储数据以供您的UDF日后使用。在您的界面上可用的可能数据类型包括整数、实数、布尔值(切换按钮)、字符串和列表。在本指南的这一部分中,将指导您创建具有这些功能的界面,并学习如何以您的UDF可以访问的方式保存它们的值。

创建自定义界面的基本方法是使用Fluent宏。宏是由ANSYS创建的方案构造,用于开发Fluent界面。宏在Fluent中有多种用途,包括使用PR变量(第691页)、创建接口元素(第699页)和从网格中收集信息。当您通读本指南的这一部分时,您将学习如何使用各种Fluent宏来构建定制的图形用户界面。

1.2.限制

这一部分是关于在Fluent中创建自己的界面所涉及的限制。

1.2.1.不能删除或覆盖读入Fluent的菜单项

需要注意的是,在Fluent功能区选项卡右侧添加了新菜单或菜单项的任何Scheme文件,一旦读入Fluent,就无法将其删除。此问题会导致对于不包含打开GUI的菜单项的方案文件不存在Scheme文件。如果您的Scheme文件没有将菜单项添加到您已经创建的菜单中,则您始终可以对Scheme文件进行更改并在再次读取之前将其保存。在这种情况下,您可以使用cx-show-panel(p.696)打开您在Fluent中读取的最新版本的GUI。如果您的Scheme文件确实包含一个菜单项来随意打开您的界面,则该菜单项一旦读入,就不能从Fluent中删除。

此外,不能通过两次读入同一文件来覆盖菜单项。如果您尝试对Scheme文件进行更改,然后再次读取它,您只会看到两个同名的菜单项,这两个菜单项引用了您已加载到Fluent中的两个版本的界面。由于具有相同名称的不同界面可能会很快造成混淆,因此建议您在尝试更改包括菜单项的Scheme文件以打开您的界面时,只需关闭并重新启动Fluent,即可从程序中删除您的界面的所有早期版本。有关将菜单或菜单项添加到Fluent功能区选项卡右侧的详细信息,请参见将菜单添加到功能区右侧(第717页)。

1.2.2.帮助按钮不可用

对话框中有一个内置的ANSYS帮助按钮,该按钮显示在界面底部。由于您正在创建的界面不是由Fluent注册的,因此帮助按钮将不起作用。如果单击“帮助”(Help),则会打开ANSYS帮助,并生成错误消息“找不到请求的页面”。

1.3.Scheme基础

Fluent中的GUI元素是在Scheme编程语言的实现中编写的。要将Scheme文件加载到FLUENT中,单击“File”,选择“Read子菜单”,然后选择Scheme.... Scheme语句在括号中编写,并且常见陈述在其他陈述中。Scheme中的注释行以半冒号开头,变量名称和Scheme命令不区分大小写。在本节中,您将了解一些基本方案陈述以及如何使用它们,因为您为您的UDF创建GUI。有关方案语言的更完整指南,请访问http:// www.scheme.com/tspl4/。

1.3.1.数据类型

Scheme允许使用许多重要的数据类型。本节提供的是Fluent允许您传递给您定义的函数的类型。

1.3.1.1. Boolean

  • 在Scheme中,使用符号#t为true和#f为false来初始化booleans。
  • 在上面的示例中,将初始化新的变量isBool,然后将其设置为false。
  • display命令是控制台打印方法,允许您检查变量的值。(display isBool)将输出#f。
  • boolean?命令用于检查以下参数是否是布尔值。(boolean?isBool)将输出#t。

1.3.1.2.整数

  • Scheme中的整数与大多数其他语言中的整数类似。
  • 在上面的示例中,新的变量isInt初始化为1.
  • 在下一行中,它递增到2。记住,在Scheme中,操作始终在运行数据元素之前始终出现。
  • 使用display命令,我们可以检查isInt的值确实是2.
  • integer?命令将检查isInt是一个整数和number吗?命令将检查它是否是Scheme中的任何数字数据类型之一。这些命令的输出将是#t。

1.3.1.3.实数

  • Scheme中的实数以与整数类似的方式工作。
  • 在上面的示例中,新变量isReal初始化为1.2。
  • 在下一行中,它设置为其自身值减去0.5。请记住,在方案中,操作始终在运行数据元素之前出现。
  • Display命令允许我们验证isReal的值为0.7。
  • 命令real?和number?既返回#t。

1.3.1.4.字符

  • Scheme中的字符始终以符号#\开头。
  • 在上面的示例中,变量isChar被初始化为a值。在下一行中,变量被设置为b的值。
  • 使用display命令,我们可以检查isChar的值是否确实是b。
  • char的结果是什么?命令将为#t。

注意:尽管上面的例子证明了变量可以设置为字符值,但您通常只会处理字符本身,因为为只有1个字符的数据类型分配变量没有什么意义。

1.3.1.5.字符串

  • Scheme中的字符串与大多数其他语言中的字符串非常相似。
  • 在上例中,变量isString被初始化为\“This is a String\”。在下一行中,它被设置为值\“This is a Different String\”。
  • 使用display命令,我们可以确认isString的值为\“This is a Different String\”。
  • string?命令将通过输出#t确认isString是字符串。
  • string-length命令将返回字符串中的字符数,在本例中为26,string-ref命令将返回字符串中传递给它的整数位置的字符。在本例中,它将返回位置0或#\T.的字符。
  • string-append命令将两个字符串相加,并将结果作为第三个字符串返回。上面的示例使用string-append命令将isString与“plus more”组合在一起。它还用了一set!命令将结果保存回变量isString。
  • IsString的新值现在应该是“This is a different string plus more”。

注意:虽然string-ref命令断言字符串从位置0开始,但string-length命令始终将字符串视为从位置1开始。这是有意义的,因为string-length为1的字符串在位置0有一个字符。

1.3.1.6.符号

  • 符号有点类似于字符串的原子值。符号和字符串可以用于许多相同的目的,但有一些重要的区别,使符号在Scheme中有自己的位置。
  • 引用同一符号的多个变量名将被认为是同一个对象,这意味着当使用eq?函数在两个引用相同符号内容的不同变量上调用,你会得到#t而不是像字符串那样的#f。
  • 这可以从上面的例子中看到。一个符号,isSymbol,被初始化为abc。symbol?命令确认变量是符号。然后,字符串,isString被初始化为相同的值abc。下面的行说明了两个要点。首先,可以使用string->symbol命令将任何字符串转换为符号。第二,任何两个具有相同内容的符号都被认为是相同的对象,并且是相等的。在这种情况下eq?语句将返回#t。
  • 此外,符号是不可变的,这意味着它们一旦被创建就不能被更改。另一方面,字符串是可变的,这意味着它们可以被修改,例如,使用string-append(参见字符串(p. 720))。
  • 这表明,虽然字符串作为一种数据类型有更多的通用性,符号是一种轻量级的、容易比较的数据类型,当你知道你不需要做任何修改,一旦你创建了它。因此,符号经常出现在Scheme代码中不需要字符串的地方。

1.3.1.7.配对和列表

  • 对和列表是两个相关的方案数据构造,通常在需要将多个数据项存储在一起时使用。
  • 对是可以从同一变量名访问的两个数据项。配对通常表示为两个数据项,其间有句点,如上例中的第一行。使用cons语句创建对,如上面示例的第二行所示。
  • 配对可用于创建列表。列表是第二个元素是另一个对的对。这使得您的列表只要您需要,就可以拥有正确数量的附加对。
  • 上例的第三行显示了由单个对组成的列表在概念上的外观。上例中的第四行显示了如何使用list语句创建列表。
  • 上面示例的其余部分显示了如何访问列表中的某些数据。car语句用于访问列表中的第一项。在上面的示例中,它将返回1。cdr语句用于访问列表中除第一项以外的所有内容。在上面的示例中,它将返回(2 3 4 5)。
  • list-ref语句用于根据项目在列表中的位置访问列表中的项目。上例中的list-ref语句将返回3。list-ail语句用于从您指定的位置开始返回列表中的其余项。在上面的示例中,由于它被作为起点传递到位置1,所以list-ail语句将返回(2 3 4 5)。

1.3.2.重要的概念

在创建您自己的Fluent界面时,有许多Scheme概念是非常重要的。本节讨论您最有可能在本指南中的示例中看到并在构建您自己的界面时使用的那些概念。

1.3.2.1. Define

define语句用于在Scheme中创建新变量。

Scheme中的变量没有类型,而是返回值。返回值本身也有类型,但是使用变量名本身就像调用一个可以返回任何类型的值的函数。例如,上例中的变量isInt返回整数1。

Scheme变量在创建时不必使用值进行初始化。在上面的示例中,变量whoKnows为空,可以赋给任何类型的值。

1.3.2.2. Set!

  • set!语句用于为已创建的变量赋值。如果变量尚未通过define语句创建,您将收到未绑定变量错误(unbound variable error)。
  • 由于Scheme中没有变量类型,因此可以用多种类型的数据覆盖一个变量。在上面的示例中,变量some Variable最初为空。
  • 在第一个set!之后语句中,some Variable将返回整数值1。在第二个set!之后,然而,someVariable语句将返回实际值2.5。
  • 变量使用的这种灵活性有其优势,因为创建变量并立即开始使用它很容易。如果您不努力跟踪每个变量的返回类型,这也可能是一个问题。

1.3.2.3. Let

  • let语句定义它们内部发生的变量绑定的范围,它们类似于C和C++中的{}。
  • let语句分为两个部分。第一部分以紧跟在单词let后面的圆括号开始。在这组圆括号内是要为let语句的其余部分定义的变量绑定。
  • 对于上例中的外部let,第一部分由变量绑定(x 5)组成。对于上面示例的内部let,第一部分由变量绑定(x 2)和(y x)组成。
  • let语句的第二部分称为正文。一旦变量绑定完成,这里就是使用这些变量的操作发生的地方。
  • 对于上例中的外部let,正文由第一部分之后的所有内容组成,包括内部let,直到最后一个括号。对于上面示例中的内部let,主体包括语句(y x)。
  • 当let嵌套时(如上例所示),外部let和内部let都将一个值绑定到同一个变量,则外部let绑定的值将一直使用,直到内部let的第一部分关闭。
  • 因此,上例中的(y x)语句将为x使用值2,而不是5。但是,此语句中y的值仍为5,因为当y被赋予x的值时,它没有看到x已更改为2,因为内部字母的第一部分尚未闭合。这就是加法的结果为7。

1.3.2.4. Lambda

  • lambda 关键字用于创建新的 Scheme 过程。
  • 使用 lambda 关键字创建新过程时,必须首先提供将在过程中使用的变量列表。一旦声明了变量,您就可以指定过程的功能。
  • 在上面的例子中可以看到这个过程。一旦使用关键字 lambda 使 doubleProcedure 成为过程,就声明了变量 x。由于 x 是此过程中使用的唯一变量,我们现在可以继续进行功能,它由该行的 (+x x) 部分组成。
  • 现在已经创建了过程,我们可以使用任意数字作为 x 调用它,如上面示例的第二行所示,它将返回 2。

1.3.2.5. If

  • Scheme IF语句与大多数其他编程语言中的IF语句具有相同的基本逻辑,尽管语法略有不同。
  • 在Scheme中,if语句由三部分组成。第一部分是测试,它决定如何继续执行其余的if代码。
  • 第二部分是结果(consequent),即测试为真时执行的代码块。
  • 第三部分是替代(alternative),它对应于其他流行语言中的else语句。如果测试为假,则执行此代码块。
  • 在上面的示例中,创建了一个名为ifExample的过程来显示if语句是工作原理。有关在Scheme中创建过程的信息,请参见Lambda(第724页)。
  • 过程主体中有一个简单的if语句,本例中的测试为(>= x 0),结果为(+ x 1),替代为(- x 1)。
  • 传递数字时,ifExample过程将在数字大于或等于0时递增数字,如果数字为负数则递减。因此,函数调用(IfExample 1)将返回2,函数调用(ifExample-1)将返回-2

1.3.2.6. Map

  • Scheme map语句将所需的函数应用于列表的每个元素。有关列表的更多信息,请参 Pairs and Lists (p. 721)。
  • 上面的例子使用了一个叫做halve 的函数。有关使用 lambda 语句创建函数的更多信息,请参阅 Lambda (p. 724)。
  • 在上面的例子中,函数halve被创建以将传递给它的任何数字除以2。
  • 在第二行,一个map语句用于将halve函数应用于列表的每个数字(list 2 4 6 8 10 ).这个map语句返回(1 2 3 4 5)。
  • map 语句基本上可以与任何函数一起使用,只要该函数与其操作的列表项兼容

1.4. RP 变量

RP 变量是为在 Fluent 中使用而创建的变量,它提供了一种将数据从 GUI(在 Scheme 中)传递到已编译或解释的 UDF(在 C 中)的方法。 RP 变量可以从 GUI 和 UDF 访问。因此,要将数据从 GUI 传递到 UDF,您只需在 GUI 代码中为 RP 变量创建和赋值,然后在 UDF 代码中访问这些相同的变量。

1.4.1.创建 RP 变量

要在 Scheme 中创建新的 RP 变量,您必须使用宏 (rp-var-define)。例如,以下命令创建一个名为 myInt 的整数 RP 变量,默认值为 1。

注意:符号通常用作 Scheme 函数中的参数而不是字符串

在创建 RP 变量之前,最好先检查该名称的 RP 变量是否尚未定义。一种简单的方法是创建一个名为 make-new-rpvar 的函数,它会在创建之前通过该名称检查 RP 变量是否存在。下面的 make-new-rpvar 函数可以复制到您的 Scheme 文件中并用于确保您选择的名称的 RP 变量在创建之前不存在。

1.4.2.更改 RP 变量

为了从您的 Scheme GUI 更改 RP 变量,您必须使用 (rpsetvar) 宏。例如,如果要将在创建 RP 变量 (p. 725) 中创建的 myInt 变量更改为 3 而不是 1,则可以使用以下语句:

注意:您分配给现有 RP 变量的新值必须是最初声明的类型,否则您将收到错误消息。

(rpsetvar) 语句常用于 apply-cb 函数中,单击 OK 按钮时会调用该函数。这样,当您单击“OK”时,就会为 RP 变量设置新值,然后 UDF 可以在需要运行时访问新值.

1.4.3.在 GUI 中访问 RP 变量的值

通常需要访问GUI和UDF中的RP变量值。这对于在每次打开 GUI 时显示每个变量的现有值非常有用。通过这样做,您就可以在每次更改RP变量时知道它的现有值。要访问Scheme中的RP变量,必须使用(%rpgetvar)宏。此宏通常用于将局部变量的值设置为RP变量的当前值。例如,如果您有一个名为localInt的整数输入框和一个名为rpInt的整数RP变量,则可以使用以下语句将localInt的值设置为rpInt的值。

由于此语句旨在在您打开 GUI 时更新每个字段中的值,因此此类语句通常出现在 update-cb 函数中,每次打开 GUI 对话框或任务页面时都会调用该函数。

1.4.4.在 UDF 中访问 RP 变量的值

要访问要在 UDF 中使用的 RP 变量的值,请参阅Accessing a Scheme Variable in a UDF  (p. 384)。

1.4.5.保存和加载 RP 变量

一旦创建了新的 RP 变量,它们的当前值将在每次保存案例文件时存储在案例文件中。在尝试从案例文件中加载 RP 变量值时,加载案例文件和Scheme文件的顺序无关紧要.如果在读取案例文件之前读取Scheme文件,将使用Scheme文件中指定的默认值创建 RP 变量。然后当读取案例文件时,这些值将被案例文件中的值覆盖。如果在 Scheme 文件之前读入案例文件,则会创建 RP 变量并将其设置为案例文件中指定的值。

当Scheme文件被读入时,当它识别到案例文件已经创建了这些RP变量时,它将忽略RP变量创建语句。

注意:为了确保您的 Scheme 文件能够识别案例文件何时创建了 RP 变量,请确保在创建 RP 变量时使用创建 RP 变量 (p. 725) 中定义的 Scheme 函数。

1.5. .fluent 文件

当 Fluent 首次启动时,它会在您的主文件夹(home folder)中查找名为 .fluent 的文件。如果它在您的主文件夹中找到 .fluent 文件,它会将其作为 Scheme 文件加载。就像在读取包含 UDF 的 case 文件时 UDF 会自动加载到 Fluent 中一样,Scheme 文件可以在每次程序启动时使用 .fluent 文件自动加载到 Fluent 中。 以下步骤将引导您完成创建和使用.fluent 文件。本示例中创建的特定 .fluent 文件加载到三个单独的示例 Scheme 文件中:Schemefile1.scm、Schemefile2.scm 和 Schemefile3.scm。

  • 第一步是将每次 Fluent 启动时要加载的每个 Scheme 文件复制到您的主文件夹中。
  • 接下来,您必须在基本文本编辑器(例如记事本)中打开一个新的空白文档。在此空白文档中,您将为 Fluent 启动时要加载的每个 Scheme 文件添加一行。这些行是 Scheme 命令,它们使用 Fluent 文本用户界面 (TUI) 相应地加载每个 Scheme 文件。上面的示例 Scheme 行将允许 .fluent 文件加载 Scheme 文件 Schemefile1.scm、Schemefile2.scm 和 Schemefile3.scm。命令 ti-menu-loadstring 部分是调用将后面的字符串加载到 Fluent TUI 中。字符串开始文件 read-journal 告诉 Fluent 读入后面的 Scheme 文件。有关 Fluent TUI 的更多信息,请参阅 Ansys Fluent 用户指南。
  • 最后,您必须将文档以名称 .fluent 保存在您的主文件夹中。请注意,在允许您定义自己的文档类型之前,某些文本编辑器会强制您将文档类型从默认类型更改为所有文件 (*.*)。Windows 机器通常不允许文档名称以句点开头。为了解决这个问题,您必须在名称末尾添加第二个句点。例如,.fluent. 将是您在创建 .fluent 文件时要输入的名称。单击“save”时,您可能会收到有关所选文件名的警告,具体取决于您使用的文本编辑器。您应该忽略此警告。保存文档时,它应该删除第二个句点并将文件命名为 .fluent
  • 现在应该在您的主文件夹中拥有所有所需的 Scheme 文件和一个完整的 .fluent 文件。从现在开始,每次启动 Fluent 时都会自动读取每个 Scheme 文件

注意:Scheme 文件是按照它们在 .fluent 文件中请求的顺序读入 Fluent 的。因此,如果一个 Scheme 文件为在不同 Scheme 文档中定义的对话框创建了一个菜单项,您应该在读入为其创建菜单项的 Scheme 文件之前,请务必先读入定义对话框的 Scheme 文件。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空