API – COMSOL 博客 - //www.denkrieger.com/blogs 发布博客 Fri, 02 Dec 2022 08:25:15 +0000 en-US hourly 1 https://wordpress.org/?v=5.7 在 COMSOL Multiphysics® 中使用表达式运算符 //www.denkrieger.com/blogs/using-the-expression-operator-in-comsol-multiphysics //www.denkrieger.com/blogs/using-the-expression-operator-in-comsol-multiphysics#respond Thu, 17 Nov 2022 01:16:30 +0000 http://cn.staging.comsol.com/blogs?p=319331 COMSOL 软件中的表达式运算符 节点可以计算任意参数化表达式。你可以在一个模型中添加多个节点,每个节点定义单独的表达式以供使用,或者将表达式定义在不同的几何实体(如域、边界)中使用。

在这篇博客中,我们将介绍表达式运算符 的工作原理,以及在使用 COMSOL Multiphysics® 软件时如何在你的建模项目中使用这项功能。

表达式运算符

表达式运算符 节点是自 COMSOL Multiphysics 5.5 版本起引入的功能,右击模型开发器 中的 全局定义定义 节点,可以从变量实用程序 子菜单(通过选择显示更多选项 对话框中常规 下的变量实用程序 复选框激活)中获得。(当添加到全局定义 下时,表达式运算符 在整个模型中有效)。表达式运算符 节点的设置包括一个定义 部分,可以在其中定义运算符。下面是具体的操作步骤。

步骤 1:输入默认表达式

表达式 字段中,输入默认表达式,该表达式在其选择上定义了表达式运算符(或者在全局定义 下添加时全局定义)。表达式可以包含任何常量、变量、函数和运算符,它们在要计算表达式运算符的上下文中是有效的。此外,它应该至少使用一个输入参数。请注意,默认表达式可以被子选择上的运算符贡献 节点所覆盖。

步骤 2:定义输入参数

表达式 字段下面的表中,定义输入参数。在参数 列中键入参数的名称,并在维度 列中键入用于定义其维度 的单位;在参数类型 列中,从下拉列表中选择表达式 选项(默认设置)或 选项。通过值传递输入参数意味着在将它作为数字插入运算符表达式之前,在调用表达式运算符的上下文中对它进行计算。由表达式传递的参数直接被替换到运算符表达式中。如果将参数作为参数传递给在不同上下文中计算其参数的耦合运算符,这可能会有所不同。例如,在一个参数中传递空间坐标变量时,必须小心,该参数被转发给作为表达式运算符定义一部分的积分 耦合。

步骤 3:输入名称

名称 字段中,为表达式运算符输入一个合适的名称。它将是你在 COMSOL 模型中引用表达式运算符时使用的名称。

表达式运算符的优点

表达式运算符 对各种建模项目和方案都有好处。下面列出了一些具体的内容:

  • 一旦定义表达式运算符并为它确定了描述性名称后,就可以在 COMSOL 模型中使用它来隐藏复杂的数学表达式。这意味着可以用速记的方式书写的表达式代替复杂的表达式。
  • 表达式运算符 节点可以使用运算符贡献 子节点在模型几何图形的不同部分定义不同的表达式。可以将 运算符贡献 子节点添加到组件 节点下定义的表达式运算符 节点。对于每个这样的子节点,可以定义几何实体级别和选择使用它的几何实体。然后,可以在运算符贡献 子节点的表达式 字段中输入新的运算符 表达式。例如,表达式运算符 节点这一功能是解决多层壳接口后处理困难的好工具。对于这类后处理,能够使用单个运算符是有好处的,该运算符可以根据不同的选择扩展为不同的运算符。然后,它作为一个包装器,将合并不同域或其他几何实体上的不同运算符和表达式。
  • 表达式运算符 还可以用来创建混合函数,这些函数混合了本地计算的参数和变量。

表达式运算符与分析函数

你可以把表达式运算符看作是一个参数化的变量,而不是一个分析函数。与分析函数相反,表达式运算符可以定义为仅在某些域中处于活动状态。根据定义,表达式运算符可以使用任何被定义的能计算出结果的表达式。

相反,分析函数应该是其参数的纯函数。由于它的全局性质,分析函数可用于定义模型参数;而表达式运算符不能。

使用表达式运算符的示例

这个示例演示了如何将表达式运算符 节点用于以下两个目的:

  1. 根据表达式运算符的计算位置,将表达式作为参数替换为不同的运算符。在本示例中,它被用于绘制双镜对称。
  2. 通过混合函数混合参数和变量,例如本示例中的运算符 phase(kx,ky)

在这个示例中,固体力学 接口仅在模型几何图形的第一个象限(右上角),也就是单位圆中定义。两个广义拉伸 运算符, yAxisMirror 以及 xAxisMirror,分别为 –x 和 –y 坐标,x 和 –y 坐标提供从源到目标的镜像操作。然后使用三个运算符贡献 子节点定义一个名为 doubleMirror 的表达式运算符,每个子节点分别在第二、第三和第四圆象限中提供双镜像转换 yAxisMirror(expr)xAxisMirror(yAxisMirror(expr)) xAxisMirror(expr)。下图显示了第三象限的运算符贡献 子节点的设置:

COMSOL Multiphysics UI显示操作员贡献设置窗口,几何实体选择和定义部分展开,图形窗口中显示单位圆模型。
第三象限中的 表达式运算符的定义

下图显示了有效 von Mises 应力超过某个极限的区域:

图形窗口的截图显示了在一个圆的模型中超过了应力极限的地方。
超过应力极限的区域绘图。表达式运算符提供的双镜包括整个圆内的解决方案。

由于使用了表达式运算符,我们只需一个简洁的表达式,第一象限计算的解就可以在整个圆中被可视化为双镜图。

对于表达式运算符 的第二种使用方式,在整个几何体中定义了一个叫做 phase 的表达式运算符,并将参数和变量混合在一起,进行局部计算。表达式运算符 被定义为 exp(-i(kx*x+ky*y)),其中,kx 和  ky 是两个输入参数,前者代表波向量的 x 分量,后者代表 y 分量。它们也被定义为表达式,如下图中的设置窗口所示。

表达式运算符设置窗口的截图,其中几何实体选择和定义部分是展开的。
包含两个表达式参数的 phase 表达式运算符的 设置窗口

相位的表达式 等效于使用 COMSOL Multiphysics 语法的数学表达式 。

你可以在曲面图中使用 phase 表达式运算符 来显示具有不同参数值的相位。下图显示相位 kx 设置为 5 ,相位 ky 设置为 20:

图形窗口的截图,显示了一个圆的模型上的相位。
曲面绘图显示了使用 表达式运算符 的相位。

后续步骤

这篇博客解释了什么是表达式运算符 节点,以及如何在 COMSOL Multiphysics 中建模时利用它来发挥自己的优势。我们鼓励你练习使用这个功能来简化和改进你的 COMSOL 模型。如果您对这个主题有任何疑问,请通过以下按钮联系 COMSOL。

延伸阅读

想要了解有关 表达式运算符 节点的更多信息?查看我们的博客文章获取统计信息:计算标准偏差和其他统计数量,其中表达式运算符 用于简化在多个位置中使用的标准偏差的表达式

]]>
//www.denkrieger.com/blogs/using-the-expression-operator-in-comsol-multiphysics/feed/ 0
递归和递归定义的几何对象 //www.denkrieger.com/blogs/recursion-and-recursively-defined-geometry-objects //www.denkrieger.com/blogs/recursion-and-recursively-defined-geometry-objects#respond Wed, 17 Jul 2019 03:40:07 +0000 http://cn.staging.comsol.com/blogs?p=309411 递归定义的几何结构在工程应用中可能很有用,比如宽带天线和超材料。关于一些应用的简要概述,请查看之前一篇关于分形的博客。本篇博客,我们将看看如何通过算法快速生成这种几何对象。

使用方法和 App 开发器创建递归定义的几何对象

我们可以使用 App 开发器中的方法编辑器创建可以执行几乎任何类型的建模任务的方法,包括几何建模。我们很容易忽略这样一个事实,那就是方法可以通过在递归循环中调用自身的方法来支持递归。

本文,我们将通过两个著名的递归结构的例子来演示递归:二维的 Sierpinski 地毯和三维的Menger 海绵。这些例子的代码很短,因此我们可以完整地将它们列出,并且在文末有下载这些示例子的链接。

Sierpinski 地毯

下图中显示的方法,create_carpet,根据一个输入参数 将递归运行到某个递归层。它将限制设置为 5 个层,以避免创建过大的几何图形。(如果你认为你的计算机可以处理大的几何图形,你可以更改这个限制。)

if (level < 1)
error("Carpet level needs to be at least 1.");
if (level > 5)
error("Carpet level needs to be at most 5.");

counter = 0;
model.component("comp1").geom("geom1").feature().clear();
model.component("comp1").geom("geom1").autoRebuild("off");
double cx0 = 0, cy0 = 0;
double si0 = 1;
carpet(level, cx0, cy0, si0);
model.component("comp1").geom("geom1").runPre("fin");

输入在方法的设置 窗口中定义的参数,如下所示。

显示 create_carpet 方法设置的屏幕截图。

反过来,方法 create_carpet 调用下面列出的主要递归函数——地毯,使用了四个输入参数:递归层、中心 x 坐标和 y 坐标,以及当前的边长。

输入参数在方法的设置 窗口中被定义,如下所示。

显示carpet_method的输入参数列表的屏幕截图。

下图所示是方法地毯 的代码:

int l = level;
double posx, posy, si1;
String strix;
int l1;
for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    posx = cx+i*si-si;
    posy = cy+j*si-si;
    strix = toString(i)+toString(j);
    if ((Math.abs((i-1))+Math.abs((j-1))) > 0) {
      if (l == 1) {
        counter = counter+1;
        model.component("comp1").geom("geom1").create("sq"+strix+"C"+toString(counter), "Square");
        with(model.component("comp1").geom("geom1").feature("sq"+strix+"C"+toString(counter)));
          set("base", "center");
          set("size", new double[]{si});
          set("pos", new double[]{posx, posy});
        endwith();
        model.component("comp1").geom("geom1").feature("sq"+strix+"C"+toString(counter)).label("Square"+strix+"C"+toString(counter));
      } else {
      l1 = l-1;
      si1 = si/3;
      carpet(l1, posx, posy, si1);
      }
    }
  }
}

为了获得方形对象的连续编号,使用整数变量计数器(位于声明下),如下所示。

屏幕截图显示了整数变量计数器的设置窗口。

上述两个函数的代码在方法编辑器中并排显示如下:

COMSOL Multiphysics® 中方法编辑器的屏幕截图,显示并排的代码。

为了运行 create_carpet,首先将其添加为方法调用。相应的菜单按钮在开发工具 选项卡中可用。

屏幕截图显示了如何通过方法调用按钮运行 create_carpet 方法。

添加后,我们可以更改递归层,并单击运行 按钮。

屏幕截图显示了如何在调用方法时更改递归层的。

下图显示了设置递归层为3时得到的地毯的最终几何图形。

3 层 Sierpinski 地毯的几何图形。

请注意,为第 3 层地毯定义的方形几何对象数为 512。第 N 层地毯的几何对象数为 8N。这意味着,使用 create_carpet 方法设置的最大层数 5 ,生成的几何图形有 32,768 个几何对象!如果你想尝试 5 层地毯,请确保你的计算机足够强大!

Menger海绵

前面我们已经讨论了二维递归定义的几何对象,那么三维对象呢?Sierpinski 地毯的三维几何称为 Menger 海绵。Sierpinski 地毯的方法很容易推广到三维。但是,在三维中,我们需要注意不要生成超出计算机处理能力的对象。

使用以下方法 create_sponge 启动递归。

if (level < 1)
  error("Carpet level needs to be at least 1.");
if (level > 5)
  error("Carpet level needs to be at most 5.");

counter = 0;
model.component("comp1").geom("geom1").feature().clear();
model.component("comp1").geom("geom1").autoRebuild("off");
double cx0 = 0, cy0 = 0;
double si0 = 1;
carpet(level, cx0, cy0, si0);
model.component("comp1").geom("geom1").runPre("fin");

由上面的方法调用并递归创建一个 Menger 海绵,得到如下所示的方法海绵

int l = level;
double posx, posy, si1;
String strix;
int l1;
for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    posx = cx+i*si-si;
    posy = cy+j*si-si;
    strix = toString(i)+toString(j);
    if ((Math.abs((i-1))+Math.abs((j-1))) > 0) {
      if (l == 1) {
        counter = counter+1;
        model.component("comp1").geom("geom1").create("sq"+strix+"C"+toString(counter), "Square");
        with(model.component("comp1").geom("geom1").feature("sq"+strix+"C"+toString(counter)));
          set("base", "center");
          set("size", new double[]{si});
          set("pos", new double[]{posx, posy});
        endwith();
        model.component("comp1").geom("geom1").feature("sq"+strix+"C"+toString(counter)).label("Square"+strix+"C"+toString(counter));
      } else {
      l1 = l-1;
      si1 = si/3;
      carpet(l1, posx, posy, si1);
      }
    }
  }
}

下图显示了 2 层海绵的最终几何形状。

COMSOL Multiphysics®中递归定义几何对象的图像。

使用这种方法创建的几何对象的数量随着层数 N 增加为 20N,上面显示的 2 层海绵有 400 个块几何对象。

根据关于创建 Koch 雪花的迭代方法的这篇博客,我们也不可以不是使用递归来创建这种类型的结构。

如果你有任何用于附加的 CAD 功能的附加产品,都可以将这些几何对象导出为标准的 CAD 格式。如果没有附加产品,也可以将网格几何导出为任何支持的网格格式,例如 STL。

下一步

单击下面的按钮进入 COMSOL 案例库,尝试使用本文中介绍的模型。

]]>
//www.denkrieger.com/blogs/recursion-and-recursively-defined-geometry-objects/feed/ 0
主题演讲视频:通过仿真 App 改进同步加速器光源 //www.denkrieger.com/blogs/keynote-video-improving-synchrotron-light-sources-with-applications //www.denkrieger.com/blogs/keynote-video-improving-synchrotron-light-sources-with-applications#respond Wed, 19 Dec 2018 02:41:48 +0000 http://cn.staging.comsol.com/blogs?p=311821 对于同步加速器光源来说,越亮越好。通过在加速器中使用明亮的光束,先进光子源(APS) 同步加速器的研究人员可以有效地收集详细数据。RadiaSoft LLC 公司的 Nicholas Goldring 与 APS 的工程师合作创建和分发仿真 App,用于设计与 APS 相关的真空室。以下是他在 COMSOL 用户年会 2018 波士顿站的主题演讲的录像和摘要。

Nicholas Goldring 讨论用于同步加速器设计的仿真 App

 

优化 APS 同步加速器的电子束亮度

RadiaSoft LLC 公司对粒子加速器和 X 射线光束线进行建模和设计,目前正在与阿贡国家实验室合作改进真空室模拟。APS 升级的目标是提高 X 射线光束的亮度,根据 Goldring 的说法,这是“同步辐射光源的品质因数”。增强光束强度需要弯曲的磁极尖更靠近电子束轴,这反过来又需要更小的真空室。为了适应新的设计,真空室必须从 190 mm 缩小到 22 mm,这使同步辐射的行为更加复杂。正如 Goldring 所说。“我们不仅有更明亮的光束和更高强度的 X 射线,真空室也需要更小,从而导致复杂和耦合的物理现象,包括高热应力、光子激发解吸和电磁波场。”

Nicholas Goldring 在 2018 年 COMSOL 用户年会上讨论同步加速器光源的照片。
来自视频:Nicholas Goldring 讨论了升级前后的光束亮度(右上)和真空室(右下)。

为了准确模拟 APS 同步加速器和其他加速器的行为,RadiaSoft 构建了仿真模型,并将它们转换为仿真 App,然后分发给项目利益相关者。

使用仿真 App 和 COMSOL Server™ 升级加速器设计

同步加速器真空室是一个真正的多物理场问题,但在典型的加速器模拟中,Goldring 解释说,“有许多不同的代码[…],而且它们非常专业”——通常是针对一个物理过程。这是有问题的,因为在仿真之间来回切换容易出错,而且很耗时。

作为这个问题的解决方案,RadiaSoft 的工程师使用 COMSOL Multiphysics® 软件进行射线追踪、热分析、分子流模型等。构建好模型后,他们将其转换为仿真 App,并使用 COMSOL Server™ 部署产品进行分发。这使不熟悉代码或 COMSOL Multiphysics 的科学家和工程师能够运行自己的仿真。

Goldring 说,App 开发器的界面使他能够“将许多不同的模型对象拖放到画布上”,这使事情变得简单。还可以通过内置的 Java® 开发环境将更复杂的功能,例如通过实现自定义算法,添加到仿真 App 中。此外,Goldring 说:“COMSOL® 有一个广泛的 [应用程序界面],但它们可以通过记录方法轻松访问。”同事们可以通过 COMSOL Server™ 轻松访问 RadiaSoft 基于云的服务器上的仿真 App。“效果非常好”,Goldring 表示。

示例:真空室中的射线

Goldring 讨论的第一个仿真 App 是用于新真空室设计中的射线。App 用户可以定义许多参数,包括:

  • 电子束源
  • 束弧长
  • 弯曲半径
  • 电子束能量
  • 偶极磁铁的强度

基于这些(和其他)输入,仿真App可以显示腔室中的温度以及射线的能量和功率分布。Goldring 说:“同步辐射功率分布相当复杂,尤其是当它沿着电子轨迹前进时,因此绘制不同点的分布情况通常很好。”

Nicholas Goldring 在 2018 年 COMSOL 用户年会上演讲的照片
来自视频:Nicholas Goldring 正在展示真空室应用。

通过使用 COMSOL Server™ 部署仿真 App,RadiaSoft 让科学家和工程师能够更轻松地测试和优化加速器设计。

本材料基于美国能源部科学办公室基础能源科学办公室支持的工作,资助编号为 DE-SC0015209。

要了解有关 RadiaSoft 如何使用多物理场仿真和仿真App改进 APS 同步加速器的更多信息,请观看本文开头的主题演讲视频并访问 RadiaSoft 网站

]]>
//www.denkrieger.com/blogs/keynote-video-improving-synchrotron-light-sources-with-applications/feed/ 0