本文描述在STAR CCM+中实现计算过程中判断监测物理量的值,并在监测值达到目标时停止计算。
前面提到在 Fluent 中监测物理量,并在物理量达到设定条件时终止计算的一些方法。STAR CCM+中也可以实现相同的操作。
还是用相同的案例来描述此过程。如图所示的几何模型,直径20 mm,长度200 mm。左侧壁面温度500 K,其他壁面为绝热。初始温度为300 K,考虑瞬态热传导,当物体内部中心点处温度为420 K时停止计算。
File → Import → Import Volume Mesh…
加载网格文件cylinder.mshContinua > Physics 1
,点击弹出菜单项Select Models...
打开模型选择对话框注:这里选择能量方程时要小心,建议选择使用Coupled Solid Energy。若选择使用Segregated Solid Energy,需要足够多的内迭代次数,否则计算出来的结果和Coupled Solid Energy及Fluent计算的结果相差巨大。利用Coupled Solid Energy或Fluent进行计算得到1.8 s时监测点达到420K,但Segregated Solid Energy在内迭代次数设置为40 时,得到的结果为2.25 s才能达到420 K。当内迭代次数减少时,Segregated Solid Energy方法计算结果显示需要的时间更多,如使用默认内迭代次数5时,需要9.9 s,显然是错误的。而Coupled Solid Energy在内迭代次数为5 时,依然能够计算得到1.8 s时刻监测点达到420。
”
Continua > Physics 1 > Models > Solid > AI
,打开材料属性设置对话框,如下图所示设置材料参数Regions > Boundaries > HOTWALL
,如下图所示设置其温度为500 K ,其他边界保持默认设置Derived Parts
,点击弹出菜单项New → Probe → Point
打开设置对话框Reports
,点击弹出菜单项New → User → Maximum
创建新节点注:这里监测的是点的数据,因此Maximum与Minimum的值是一样的,随便选择哪一个都可以。
”
Maximum 1
的参数Maximum 1
,点击弹出菜单项Create Monitor and Plot from Report
创建监测值显示Solvers > Implicit Unsteady
,指定参数Time Step
为 0.05 sStopping Criteria > Maximum Physical Time
,如下图所示指定参数Maximum Physical Time
为 4.5 s利用Simulation Operations控制仿真过程。基本思路为:判断监测值与目标值的差距,以此来判断是继续迭代计算还是终止计算。
注:此方法并未成功,尚不清楚问题出在哪里。
”
Tools > Simulation Operations
,点击弹出菜单项 New 创建新节点Operations
, 点击弹出菜单项New → Conditions
创建判断条件Condition
,如下图所示设置判断表达式True
,点击弹出菜单项New → Stop Simulation Operations
。表示当Condition满足时(报告值>420),终止仿真计算。False
,点击弹出菜单项New → Solve Physics
。Solve Physics
,如下图所示设置参数Simulation Objects
为 Physics 1Simulation Operations 1
,点击菜单项Play/Resume Simulation Operations
执行计算但似乎没起作用,计算并没有在监测值达到420时终止计算。
事实上Simulation Operations是做了正确判断的,但目前不知道什么原因,其并没有执行Ture分支下的终止计算指令。更换表达式将Ture和False调换也没有用。
上面的方法不奏效,那就用java脚本进行控制,这个更简单。
两个工作:
脚本可以限录制,然后进行改造,改造完毕后的代码如下图所示。代码文件保存为control.java
。
注意:在读入此文件之前,需要将中文注释清除掉,否则会因为无法识别而报错。
”
// control.java
// Written by Simcenter STAR-CCM+ 18.04.008
package macro;
import java.util.*;
import star.common.*;
import star.base.report.*;
public class control extends StarMacro {
public void execute() {
execute0();
}
private void execute0() {
Simulation simulation_0 =getActiveSimulation();
Solution solution_0 =simulation_0.getSolution();
solution_0.initializeSolution();
while(true)
{
//获取report的值。这里report的名称为Maximum 1,与软件中定义的名称保持一致
MaxReport maxReport_0 =
((MaxReport) simulation_0.getReportManager().getReport("Maximum 1"));
double maxTemp = maxReport_0.getReportMonitorValue();
//将获取的监测值与目标值进行比较
if(maxTemp <= 420)
{
//若监测值小于420,则迭代计算
simulation_0.getSimulationIterator().step(1);
}
else{
//超过420则终止迭代计算
simulation_0.getSimulationIterator().stop();
simulation_0.println("Reach target value, stop iteration!");
//break用于跳出循环,非常重要
break;
}
}
}
}
File → Macro → Play Macro...
,打开文件选择对话框control.java
(完)