找回密码
 注册
Simdroid-非首页
楼主: cocoon

[二次开发] 基于SiPESC.OPT 使用Abaqus优化算例

[复制链接]
 楼主| 发表于 2011-4-5 07:59:15 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-11 19:25 编辑

如果你对设计变量的取值范围更严格,只能取0.0151,0.0152,0.0143这三个离散值,也就是说设计变量是离散型设计变量,可以修改脚本中定义设计变量的那部分代码:
    // 设置优化模型中优化变量的初始值以及上、下限。
    theModel.setVariable( "innerRadius" ,  0.0151 ) ;
        theModel.setVariable( "innerRadius" ,  Array( 0.0151,0.0152,0.0143 ) );  // 用这种方式定义离散型设计变量,设计变量的上下限软件会自动从数组Array中提取出来。

使用的优化算法则需要变成可以处理离散型设计变量的DGA算法,将脚本中设定优化算法参数的那部分修改如下(就是将GA替换成DGA):

  1.     // 设置优化算法参数。
  2.     DGA.setMINMAX( -1 );
  3.     DGA.setGENERATION( 150 );
  4.     DGA.setPOPULATIONSIZE( 30 );
  5.     DGA.setMUTATIONPROBABILITY( 0.1 );
  6.     DGA.setCROSSOVERPROBABILITY( 0.8 );
  7.   
  8.     var Solver =  DGA ;
复制代码


Lug_opt.js脚本文件的其余部分不必做修改。
回复 不支持

使用道具 举报

发表于 2011-4-5 14:22:13 | 显示全部楼层 来自 澳大利亚
Simdroid开发平台
还有一个疑问请教,LZ的这个基于ABAQUS有限元优化的例子,除了使用GA,也是可以使用SLP SQP这样的优化算法的吧?

SLP SQP是传统的基于梯度寻优的数值优化算法,但是在该例中目标函数的数学模型未知,那岂不是和这些优化算法的理论基础向矛盾了? 那还如何求的数学模型的梯度进而进行迭代寻优呢? 也许我的理解有误,还希望LZ 多多指教

20# cocoon
回复 不支持

使用道具 举报

发表于 2011-4-5 16:25:50 | 显示全部楼层 来自 澳大利亚
还有一个问题想请教(不好意思。。。)
//运行计算软件来得到新的目标函数值# v)
var abaqusExeFileName = "D:/SIMULIA/abaqus/6.9-1/exec/abq691.exe"
var arguments = new Array( "cae","noGUI=D:\\SIMULIA\\workspace\\python_Lug02.py" );   
process = new Process;   
process.execute( abaqusExeFileName , arguments );   
print("===========finished.==========")
process.kill();

如果我是在UNIX系统下运行ABAQUS, 那命令应该是怎样的呢?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-5 16:46:18 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-5 16:52 编辑

SLP SQP是传统的基于梯度寻优的数值优化算法,但是在该例中目标函数的数学模型未知,也就是说这个优化模型的没有具体的数学解析表达式,因此也就没有其梯度的解析表达式。
在具体的优化计算过程中,SLP等优化算法使用差分方法计算优化模型的梯度值,因此,也可以使用SLP等算法优化这个优化模型。
当然,对于具有解析表达式的优化模型,你可以直接计算并设置优化模型的梯度值,SLP等算法也就不用差分法计算梯度,这样会节约优化时间。


如果你是在Linux系统下运行ABAQUS,需要使用SiPESC.OPT的Linux版,优化脚本则不必做修改,这也是脚本语言的一种跨平台特性,Abaqus使用的Python也具有这种特性。
回复 不支持

使用道具 举报

发表于 2011-4-9 16:17:38 | 显示全部楼层 来自 陕西西安
楼主,您好,第一次用python语言和Sipesc.Opt,按照您上传的脚本语言,我运行脚本程序后,有以下几个问题向您请教:
一.cae出现错误:
Abaqus Error: cae exited with an error.

4/9/11 15:47:40 Debug: ===========finished.==========
4/9/11 15:47:40 Debug: innerRadius = 0.015
4/9/11 15:47:40 Debug: maxMises = 3244008960.000000
这一点我还不知道其原因。我把cae和脚本语言Lug_opt.js放在一个文件夹了,改的语言为:
var abaqusExeFileName = "E:/SIMULIA/abaqus/6.10-1/exec/abq6101.exe"
    var arguments = new Array( "cae","noGUI=E:\\lug_opt\\xiao\\python_Lug02.py" );
    process = new Process;
    process.execute( abaqusExeFileName , arguments );

    print("===========finished.==========")
    process.kill();
二、
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-9 19:18:35 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-9 20:04 编辑

Abaqus Error: cae exited with an error.
说明Abaqus 已经运行,
可能是Abaqus 运行python_Lug02.py时出了问题, 可以查看python脚本文件


可能是python_Lug02.py脚本文件中
#-------------------------------------------------------------------------
# open result database
#-------------------------------------------------------------------------
o3 = session.openOdb(name='D:/SIMULIA/workspace/Lug3.odb')
路径有问题,
把它更改为
#-------------------------------------------------------------------------
# open result database
#-------------------------------------------------------------------------
o3 = session.openOdb(name='Lug3.odb')


使用中需要注意的是:
使用sipopt启动Abaqus运行时,Abaqus会把临时文件,结果文件等放在存放sipopt.exe的那个文件夹中,也就是   d:/sipopt/bin/ (假设你把软件安装在D盘中),在设置输入文件和结果文件路径时需要注意

我运行的输出显示是:

....

Abaqus JOB Lug3
Abaqus 6.9-1
Begin Analysis Input File Processor
04/09/11 19:54:47
Run pre.exe

04/09/11 19:54:48
End Analysis Input File Processor
Begin Abaqus/Standard Analysis
04/09/11 19:54:48
Run standard.exe

04/09/11 19:54:50
End Abaqus/Standard Analysis

Abaqus JOB Lug3 COMPLETED

4/9/11 19:54:52 Debug: ===========finished.==========
4/9/11 19:54:52 Debug: innerRadius = 0.0101951
4/9/11 19:54:52 Debug: maxMises = 349248288.000000
...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2011-4-11 15:53:13 | 显示全部楼层 来自 陕西西安
楼主,您好,以前分析我都是直接在cae界面做的,对接口语言这些还不熟悉,还劳烦您多多指教,多谢多谢。第一次用python语言和Sipesc.Opt,按照您上传的脚本语言,我运行脚本程序后,有以下四个问题向您请教,问题描述比较详细,麻烦您看一下pdf,多谢多谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-11 18:13:40 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-11 18:31 编辑

27# clear-lucky
在你的计算机中 SiPESC.OPT 已经安装,路径为:
E:/sipopt
Abaqus 安装在 E:/SIMULIA/ 中,其主程序abq691.exe 的路径为:
E:/SIMULIA/abaqus/6.10-1/exec/abq6101.exe

相应的吊耳有限元分析的脚本文件路径改为:
E:\\SIMULIA\\workspace\\python_Lug02.py
E:\\SIMULIA\\workspace\\parameterValues.txt

E:\\SIMULIA\\workspace\\maxMises.txt

你修改了参数文件路径,结果文件路径,python脚本路径,
在python_Lug02.py脚本中用到参数文件路径,结果文件路径的命令各有一处,
在Lug_opt.js脚本中用到参数文件路径,结果文件路径的命令也各有一处,
都需要做修改


在python脚本中,
# 是注释符,它表示在#所在的这一行中,在其后出现的都是脚本命令的注释。可以无视它们。


在脚本python_Lug02.py中,有打开参数文件,从中提取参数的语句,如下所示
  1. # open parameter file
  2. #-------------------------------------------------------------------------
  3. parameterFile = open('D:\\SIMULIA\\workspace\\parameterValues.txt', 'r')

  4. # read parameter values and assign to variables
  5. #-------------------------------------------------------------------------
  6. line = parameterFile.readline() innerCircleRadius = float(line)

  7. # close parameter file
  8. #-------------------------------------------------------------------------
  9. parameterFile.close()
复制代码
其中'D:\\SIMULIA\\workspace\\parameterValues.txt'是参数文件的路径你应该将其改为'E:\\SIMULIA\\workspace\\parameterValues.txt'

同理在脚本python_Lug02.py中,有打开结果文件,保存最大Mises应力的语句,如下所示

  1. #============================================================
  2. # open output file
  3. #============================================================
  4. outputFile = open('D:\\SIMULIA\\workspace\\maxMises.txt', 'w')
  5. #-------------------------------------------------------------------------
  6. # ouput result to 'maxMises.txt'
  7. #-------------------------------------------------------------------------
  8. if(isStressPresent):
  9.     outString = '%f'%(maxMises)
  10. else:
  11.     print 'Stress output is not available in' \
  12.         'the output database : %s\n' %(odb.name)
  13.    
  14. outputFile.write(outString)

  15. #============================================================
  16. # close output file
  17. #============================================================
  18. outputFile.close()
复制代码
其中'D:\\SIMULIA\\workspace\\maxMises.txt'是参数文件的路径你应该将其改为'E:\\SIMULIA\\workspace\\maxMises.txt'
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-11 18:26:55 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-11 18:29 编辑

在Lug_opt.js脚本文件中,用到参数文件路径的代码如下:
  1.    //经过上次优化处理后,模型对象theModel中会产生新的,算法判断较好的设计变量值。
  2.     //将新值赋给参数建模的参数。
  3.     var innerRadius =  theModel.getVariable( "innerRadius" );

  4.     parser = new FileParser;
  5.     parser.open( "D:\\SIMULIA\\workspace\\parameterValues.txt");
  6.     parser.replaceString( 0, 7, innerRadius );
  7.     parser.close();
复制代码

其中'D:\\SIMULIA\\workspace\\parameterValues.txt'是参数文件的路径你应该将其改为'E:\\SIMULIA\\workspace\\parameterValues.txt'


在Lug_opt.js脚本文件中,用到结果文件路径的代码如下:
  1.     //从计算软件的输出文件中提取目标函数值
  2.     parser = new FileParser;                    
  3.     parser.open( "D:\\SIMULIA\\workspace\\maxMises.txt");     
  4.     var  obj = parser.retriveString( 0, 17 );
  5.     theModel.setObject( "obj" , obj );
  6.     parser.close();
复制代码

其中'D:\\SIMULIA\\workspace\\maxMises.txt'是参数文件的路径你应该将其改为'E:\\SIMULIA\\workspace\\maxMises.txt'
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-11 18:34:12 | 显示全部楼层 来自 大连理工大学
在python脚本中,
# 是注释符,它表示在#所在的这一行中,在其后出现的都是脚本命令的注释。可以无视它们。

  1. outString = '%f'%(maxMises)
复制代码

f代表float
表示将变量maxMises的内容看作浮点数,将其插入%f所在的位置,也就是说把浮点数maxMises到保存在outString这个字符串中,


  1. %s\n' %(odb.name)
复制代码
同理,s代表string,
\n是回车符,也就是另起一行。
'%s\n' %(odb.name)是将字符串 odb.name的内容插入到%s所在的位置,然后另起一行
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-11 18:53:42 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-11 19:10 编辑

在 Lug_opt.js脚本中

  1.     //经过上次优化处理后,模型对象theModel中会产生新的,算法判断较好的设计变量值。
  2.     //将新值赋给参数建模的参数。
  3.     var innerRadius =  theModel.getVariable( "innerRadius" );

  4.     parser = new FileParser;
  5.     parser.open( "D:\\SIMULIA\\workspace\\parameterValues.txt");
  6.     parser.replaceString( 0, 7, innerRadius );
  7.     parser.close();
复制代码
这一段代码就是用变量innerRadius替换是旧的内径值 。
第3行脚本代码 是从theModel中提取名为innerRadius的设计变量的当前值,将其赋值给 变量innerRadius, var  是variable的简写,在JavaScript中作为变量声明。

第5行脚本代码 是创建一个新 FileParser对象,将其赋值给变量parser
第6行脚本代码 是parser打开参数文件D:\\SIMULIA\\workspace\\parameterValues.txt
第7行脚本代码 是将parameterValues.txt文件中从第0个字符到第7个字符之间的字符用innerRadius替换,也就是用新的内径值替换旧的内径值。
第8行脚本代码 是关闭参数文件。



parameterValues.txt文件的内容如下:
0.01499
一共有7个字符,是旧的内径值
parser.replaceString( 0, 7, innerRadius );
就是用变量innerRadius替换是旧的内径值
就是将parameterValues.txt文件中从第0个到第7个字符之间的字符用innerRadius的值替换,
例如  innerRadius的值为0.013456788964
则替换后parameterValues.txt文件的内容如下:
0.01345   
只取它的前7位,后边的数字6788964就略去了,如果调整精度,可以将7改为其它数字,如8、6等,parameterValues.txt文件中字符的数量也要做相应的调整。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-11 19:16:16 | 显示全部楼层 来自 大连理工大学

  1. // 设置优化算法参数。
  2. GA.setMINMAX( -1 );
  3. GA.setGENERATION( 150 );
  4. GA.setPOPULATIONSIZE( 30 );
  5. GA.setMUTATIONPROBABILITY( 0.1 );
  6. GA.setCROSSOVERPROBABILITY( 0.8 );
复制代码
这里每项代表的含义如下:

GA优化算法参数

参数名称: MINMAX       
参数类型   int     
参数意义: 求最大还是最小       
参数取值范围:1-max,-1-min

参数名称: GENERATION       
参数类型   int     
参数意义: 遗传代数       
参数取值范围:
         
参数名称: CROSSOVERPROBABILITY       
参数类型   实数     
参数意义: 交配概率       
参数取值范围:交配概率是一个小于1的正实数,一般较大(0.7-0.9)
       
参数名称: MUTATIONPROBABILITY       
参数类型   实数     
参数意义: 变异概率       
参数取值范围: 交配概率是一个小于1的正实数,一般较小(<0.3),目标函数性态太差时可适当调高,

参数名称: POPULATIONSIZE       
参数类型   int     
参数意义: 种群大小       
参数取值范围: 不可太小,太小容易局部收敛
回复 不支持

使用道具 举报

发表于 2011-4-12 10:21:54 | 显示全部楼层 来自 陕西西安
本帖最后由 clear-lucky 于 2011-4-12 10:35 编辑

非常感谢楼主详细的解答,受益匪浅,多谢多谢! 不过其实脚本文件我已经把D改成了E,但是cae依旧有错误。如附件。 以前我都是建立cae模型求解物体强度的,如果优化计算,是不是就无需在cae截面画图计算了呢?比如一个简单的圆柱体, 水杯初始半径为R=1,高度为H=1(DV),由于水杯材料直接喝水杯的表面积有关系,这里我假设水杯表面积不能大于100,这样就有S=2πRH+2πR(2表示平方)<100(SV),水杯的容积为V=πR(2)H (OBJ)。 这些需要优化的变量叫做设计变量(DV);优化的目标是要使整个水杯的容积最大,这个目标叫目标函数(OBJ);再者,对设计变量的优化有一定的限制条件,比如说整个杯子的材料不变,这些限制条件用状态变量(SV)来控制。 请问上面这个简单的模型,在这个SIPESCOpt和abaqus接口过程中,如何操作呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-12 20:26:27 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-13 08:14 编辑

对这种类型的问题,大体上可以分为以下几步:
1)提取优化模型,
2)编写SiPESC.OPT的JavaScript代码
       可以使用记事本等文本编辑程序手动编写代码,也可以使用SiPESC.OPT的图形界面自动生成。
3)编写Abaqus的python脚本
4)修改JavaScript代码
5)测试
6)优化计算

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-12 20:39:01 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-13 09:00 编辑

你说的这个优化问题:
比如一个简单的圆柱体, 水杯初始半径为R=1,高度为H=1(DV),由于水杯材料直接喝水杯的表面积有关系,这里我假设水杯表面积不能大于100,这样就有S=2πRH+2πR(2表示平方)<100(SV),水杯的容积为V=πR(2)H (OBJ)。 这些需要优化的变量叫做设计变量(DV);优化的目标是要使整个水杯的容积最大,这个目标叫目标函数(OBJ);再者,对设计变量的优化有一定的限制条件,比如说整个杯子的材料不变,这些限制条件用状态变量(SV)来控制。 请问上面这个简单的模型,在这个SIPESCOpt和abaqus接口过程中,如何操作呢?

其优化模型总结如下:
优化目标是:
    使水杯容积V最大,
设计变量是:
    水杯半径 R
    水杯高度 H
约束条件是:
    水杯表面积不能大于100

V = π*R*R*H
S = π*R*R + 2*π*R*H

由于最优化问题习惯上是求目标函数的极小值,优化模型的约束一般都是小于等于0,因此

min V = -( π*R*R*H )
s.t. π*R*R + 2*π*R*H -100 <= 0

这个优化模型是有约束的非线性优化模型,设计变量是连续变量
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-13 08:20:52 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-13 09:06 编辑

这是先使用图形界面生成脚本
在SiPESC.OPT中,一个优化模型和求解这个优化模型的优化算法作为一个优化任务。
使用图形界面操作时
首先是定义优化任务名称,优化模型名称,优化算法名称,选择优化算法
这些名称主要是用来保存数据时的标识符,可以根据个人喜好,名称是一个包含英文字母和数字和下划线(使用汉字可能会出现乱码,最好不要使用)的字符串,其首字母不应是数字,
选择优化算法要根据优化模型的类型和特点选择,这个优化模型是带约束非线性优化模型,就先选用SQP算法试试。


定义设计变量,这个优化模型中的两个设计变量都是连续型设计变量,初始值都设为1,下限都设为0,上限分别设为10,100



定义目标函数



定义约束函数

至此,整个优化模型就定义完毕,点击对话框右下角的确定按钮,就转入优化任务浏览界面

在左侧的优化任务框中,点击Projects前的+号,会将优化任务展开成树状图显示,点击Tasks前的+号,点击选取cup,则将优化任务的详细内容显示在右侧的优化任务浏览窗口

点击窗口左上工具栏中运行按钮(就是那个带跑步小人的按钮),会将窗口右侧 优化任务浏览器 中的 当前优化任务 自动转换为 脚本文件,保存在 SiPESC.OPT软件的temp文件夹中,文件名为优化任务名加.js后缀。
这时,会弹出一个小对话窗口,提示你已经生成脚本文件,你可以选择确定,抛弃,显示细节,取消,
选择确定,软件会将脚本文件提交运行,
选择显示细节,会显示脚本内容,你可以查看脚本是否有误,
如果不满意可以 选择抛弃或者取消,


在这个例子里,我们需要使用SiPESC.OPT的脚本调用Abaqus,因此选择取消。
在temp文件夹中找到cup.js

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2011-4-14 13:42:04 | 显示全部楼层 来自 陕西西安
在这个例子里,我们需要使用SiPESC.OPT的脚本调用Abaqus,因此选择取消。在temp文件夹中找到cup.js,这里怎么操作呢?3)编写Abaqus的python脚本;4)修改JavaScript代码;5)测试;6)优化计算这里如何实现呢?优化结果是什么,怎么看呢?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-14 18:27:20 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-15 07:26 编辑

  1. //   
  2. //  
  3. // This file is generated by SiPESC.Opt
  4. //         COPYRIGHT (C) , 2009  
  5. //   
  6. //   
  7. //         ALL RIGHTS RESERVED  
  8. //      
  9. //         
  10. //           2011 . 04. 12
  11. /////////////////////////////////////////////////

  12.    
  13. //
  14. // 创建一个优化模型对象,供后续程序使用。
  15. var theModel = new OptModel;

  16. //
  17. // 设置优化模型的名称。
  18. theModel.setModelName("cup");


  19. //
  20. // 设置优化模型中优化变量的初始值以及上、下限。
  21. theModel.setVariable( "R" ,  1 ) ;
  22. theModel.setVariableLowerLimit( "R" ,  0 ) ;
  23. theModel.setVariableUpperLimit( "R" ,  10 ) ;

  24. theModel.setVariable( "H" ,  1 ) ;
  25. theModel.setVariableLowerLimit( "H" ,  0 ) ;
  26. theModel.setVariableUpperLimit( "H" ,  100 ) ;


  27. //
  28. // 计算优化模型中目标函数值和约束函数值。
  29. function eval( )
  30. {
  31.    var R =  theModel.getVariable( "R" );
  32.    var H =  theModel.getVariable( "H" );

  33.    var V = -(Math.PI*R*R*H );
  34.    theModel.setObject( "V" , V );


  35.    var S = Math.PI*R*R + 2* Math.PI*R*H - 100;
  36.    theModel.setConstraint( "S" , S );

  37. }


  38. //
  39. // 使用优化变量的初始值对优化模型初始化。
  40. eval( );

  41.   

  42. //
  43. // 设置优化算法参数。
  44. SQP.setMINMAX( -1 );
  45. SQP.setMaxIterationNumber( 100 );
  46.   
  47. var Solver =  SQP ;

  48. //
  49. // 使用优化模型初始化优化算法。
  50. Solver.initialize( theModel );

  51. //
  52. // 初始化数据库,以备存储优化迭代过程中优化模型数据。
  53. ModelSaver.executeSQLCommand( "DROP TABLE IF EXISTS cup" );  
  54. ModelSaver.initializeModel( theModel );  

  55. //
  56. // 开始优化迭代计算。
  57. do{  
  58.   eval();  
  59.   ModelSaver.save( theModel );
  60.   Solver.renewModel( theModel );
  61. } while(  ! Solver.isComplete() )  
  62.   

复制代码
上面是SiPESC.OPT生成的优化脚本文件。
0--11行 是文件版权信息,
大部分脚本代码都有注释,

要实现在 SiPESC.OPT的脚本调用Abaqus
需要修改的是36行的那个函数eval() 的内容
eval() 从36行开始到48行结束,它的主要功能如注释所言,是根据优化模型的设计变量值,计算目标函数值和约束函数值,并把新的目标函数值和约束函数值赋值给优化模型对象,
36行是函数声明,
37行的{ 是函数体的起始标识符,
48行的 }是函数体的结束标识符,
这一点与python语言不同,在python中函数体没有起始标识符和结束标识符,python中函数体是靠字符缩进来标识函数体。

首先,需要了解函数eval() 是如何被调用的,先看75--79行的迭代循环结构,就是在这里实现了寻找优化解的迭代历程。
75--79行的脚本代码是一个do...while() ... 循环,
79行中while语句中()内是是个判断语句
do 后{}内的76--78行语句组成是循环体,
运行时,首先执行一遍循环体,然后执行判断语句,如果执行判断语句得到的是 true,则继续执行循环体,如果执行判断语句得到的是 false,则终止循环。
76行 是调用eval函数,
77行 是保存优化模型的数据到数据库中,也就是保存优化迭代历史信息,供以后查看
78行 是让优化算法求解器(Solver)更新优化模型数据,主要是根据优化模型的目标函数值和约束函数值,更新优化模型的设计变量值,如果优化模型满足优化条件,优化算法求解器(Solver)会将自身的迭代终止的标识符,这样 在执行 79行的判断语句Solver.isComplete()时候,就会返回 true ,那个感叹号 !是表示改变bool的状态 ,也就是说它将true改变成false(感叹号 !也会将false改变成true ),因此,do...while() ... 循环就终止执行,优化迭代循环也就完成了,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-14 20:03:33 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-15 21:38 编辑

和吊耳优化的例子类似,SiPESC.OPT 和 Abaqus 也是通过 参数文件和结果文件沟通信息的

首先设定结果文件为
D:/SIMULIA/workspace/result.txt
设定参数文件为
D:/SIMULIA/workspace/parameter.txt
其内容为R和H的值
   1.0
   2.0

为了简便,只编写了使用python计算V, S的代码

  1. # open parameter file
  2. #-------------------------------------------------------------------------
  3. parameterFile = open('D:/SIMULIA/workspace/parameter.txt', 'r')


  4. # read parameter values and assign to variables
  5. #-------------------------------------------------------------------------
  6. line = parameterFile.readline()
  7. R = float(line)
  8. print "R = ", R

  9. line = parameterFile.readline()
  10. H = float(line)
  11. print "H = ", H


  12. # close parameter file
  13. #-------------------------------------------------------------------------
  14. parameterFile.close()


  15. V =  3.14*R*R*H
  16. S = 3.14 *R*R + 2*3.14*R*H - 100

  17. #=========================================================================
  18. # open output file
  19. #=========================================================================
  20. outputFile = open('D:/SIMULIA/workspace/result.txt', 'w')


  21. #-------------------------------------------------------------------------
  22. # ouput result to 'maxMises.txt'
  23. #-------------------------------------------------------------------------

  24.    
  25. outString = '%f\n'%(V)
  26. outputFile.write(outString)
  27. outString = '%f\n'%(S)
  28. outputFile.write(outString)
  29.    

  30. #=========================================================================
  31. # close output file
  32. #=========================================================================
  33. outputFile.close()
复制代码
[


可以直接使用Abaqus直接运行cup.py,以检验python代码的正确性。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-15 07:41:06 | 显示全部楼层 来自 大连理工大学
本帖最后由 cocoon 于 2011-4-15 10:14 编辑

SiPESC.OPT的脚本中 写参数文件,读结果文件的代码如下:


  1. // 生成一个名为parameterFile的FILE对象  
  2. parameterFile = new FILE;

  3. //  设置文件名为 D:/SIMULIA/workspace/parameter.txt
  4. parameterFile.setFileName( "D:/SIMULIA/workspace/parameter.txt" );

  5. //以模式2打开文件,
  6. state = parameterFile.open(2);
  7. // 如果返回值为false,则输出警告信息。
  8. if( !state )
  9. {
  10.         print("open result file failed.");
  11. }

  12. var R = 1;
  13. var H = 1;

  14. //  向文件中写入变量R 以及一个换行符\n
  15. parameterFile.write( R + "\n" );

  16. //  向文件中写入变量H 以及一个换行符\n
  17. parameterFile.write( H + "\n" );

  18. //将缓冲池中的数据写入文件中。
  19. parameterFile.flush();

  20. //关闭文件result
  21. parameterFile.close();

复制代码

这段代码要插入到cup.js的 eval()函数中
其中第15行,16行代码需要做进一步修改。


读结果文件的代码如下:

  1. // 文件名
  2. var parameterFilePath = "D:/SIMULIA/workspace/result.txt";

  3. // 生成一个名为fooParser的FileParser对象
  4. var fooParser = new FileParser;

  5. //  指定文件名,并尝试打开文件。
  6. fooParser.open( parameterFilePath );


  7. //   第一行
  8. var line = fooParser.readLine();
  9. var V = parseFloat(line);

  10. //   第二行
  11. line = fooParser.readLine();
  12. var V = parseFloat(line);

  13. fooParser.close();
复制代码
运行Abaqus的脚本代码可以直接从Lug_opt.js中直接拷贝过来,稍做改动即可

  1.    //运行计算软件来得到新的目标函数值

  2.     var abaqusExeFileName = "D:/SIMULIA/abaqus/6.9-1/exec/abq691.exe"

  3.     var arguments = new Array( "cae","noGUI=D:\\SIMULIA\\workspace\\cup.py" );

  4.     process = new Process;

  5.     process.execute( abaqusExeFileName , arguments );



  6.     print("===========finished.==========")
复制代码

将第5代码中的python文件名改为cup.py

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-20 06:22 , Processed in 0.056270 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表