ANSYS程序的二次开发

更新时间:2024-06-26 23:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ANSYS程序的二次开发

标准ANSYS程序是一个功能强大、通用性好的有限元分析程序,同时它还具有良好的开放性,用户可以根据自身的需要在标准ANSYS版本上进行功能扩充和系统集成,生成具有行业分析特点和符合用户需要的用户版本的ANSYS程序。开发功能包括四个组成部分: 参数化程序设计语言(APDL) 用户界面设计语言(UIDL) 用户程序特性(UPFs) ANSYS数据接口

参数化程序设计语言(APDL)

参数化程序设计语言实质上由类似于FORTRAN77的程序设计语言部分和1000多条ANSYS命令组成。其中,程序设计语言部分与其它编程语言一样,具有参数、数组表达式、函数、流程控制(循环与分支)、重复执行命令、缩写、宏以及用户程序等。标准的ANSYS程序运行是由1000多条命令驱动的,这些命令可以写进程序设计语言编写的程序,命令的参数可以赋确定值,也可以通过表达式的结果或参数的方式进行赋值。从ANSYS命令的功能上讲,它们分别对应ANSYS分析过程中的定义几何模型、划分单元网格、材料定义、添加载荷和边界条件、控制和执行求解和后处理计算结果等指令。

用户可以利用程序设计语言将ANSYS命令组织起来,编写出参数化的用户程序,从而实现有限元分析的全过程,即建立参数化的CAD模型、参数化的网格划分与控制、参数化的材料定义、参数化的载荷和边界条件定义、参数化的分析控制和求解以及参数化的后处理。

宏是具有某种特殊功能的命令组合,实质上是参数化的用户小程序,可以当作ANSYS的命令处理,可以有输入参数或没有输入参数。

缩写是某条命令或宏的替代名称,它与被替代命令或宏存在一一对应的关系,在ANSYS中二者是完全等同的,但缩写更符合用户习惯,更易于记忆,减少敲击键盘的次数。ANSYS工具条就是一个很好的缩写例子。

用户界面设计语言(UIDL)

标准ANSYS交互图形界面可以驱动ANSYS命令,提供命令的各类输入参数接口和控制开关,用户在图形驱动的级别上进行有限元分析,整个过程变得直观轻松。用户图形界面设计语言(UIDL)就是编写或改造ANSYS图形界面的专用设计语言,主要完成以下三种图形界面的设计:

主菜单系统及菜单项 对话框和拾取对话框 帮助系统

通过用户界面设计语言(UIDL),用户可以在扩充ANSYS功能的同时建立起对应的图形驱动界面,如在主菜单的某位置增加菜单项,设计对应的对话框、拾取对话框,实现参数的输入和其它程序运行的控制,同时提供相应的联机帮助,使操作者能方便地获取系统帮助。

用户程序特性(UPFs)

用户程序特性(UPFs)向用户提供丰富的FORTRAN77用户程序开发子程序和函数,用户利用它们从开发程序源代码的级别上扩充ANSYS的功能。使用这些子程序和函数,编写用户功能的源代码程序,在与ANSYS版本要求匹配的FORTRAN或C++编译器上重新编译和连接,生成用户版本的ANSYS程序。另外,还提供了外部命令功能,允许用户创建ANSYS

1

可以利用的共享库。用户可以开发下列方面的功能程序:

开发用户子程序实现从ANSYS数据库中提取数据或将数据写入ANSYS数据库。该种子程序可以编译连接到ANSYS中,此时ANSYS提供了10个数据库操作命令;如果作为外部命令处理,可以在ANSYS的任何模块中运行;

利用ANSYS提供的子程序定义各种类型的载荷,其中包括BF或BFE载荷、压力载荷、对流载荷、热通量和电荷密度等;

利用ANSYS提供的子程序定义各种材料特性,包括塑性、蠕变、膨胀、粘塑性、超弹、层单元失效准则等;

利用ANSYS提供的子程序定义新单元和调整节点方向矩阵; 利用ANSYS提供的子程序修改或控制ANSYS单元库中的单元;

利用UEROP创建用户优化程序;ANSYS程序作为子程序在用户程序中调用。

ANSYS数据接口

ANSYS程序在分析过程中存在大量的设计分析数据,一部分在运行时置于计算机的内存之中,一部分以文件的形式存放在工作目录中。除LOG文件和出错文件等文本文件之外,其它文件都是二进制文件,分别以不同的格式进行写入,如:数据库文件、结果文件、模态结果文件、单元矩阵文件、子结构矩阵文件、对角化刚度矩阵文件、缩减位移矩阵文件、缩减频率矩阵文件和完整的刚度-质量矩阵文件等等。ANSYS数据接口详细地阐述每种二进制文件的格式,然后介绍从这些数据文件提取各种数据的子程序或函数,从而实现对二进制数据的读写和修改。显然,它满足了用户以下三种基本需要:检查或观察过程数据或结果数据;通过修改ANSYS的数据文件达到控制或修正计算;提取结果数据进行分析处理。

ANSYS数据接口提供了两条模型和数据库信息的转换和传递命令,即CDREAD和CDWRITE,前者将一个符合ANSYS读入或写出格式的模型和数据库文件信息读入到ANSYS数据库中,后者的作用正好相反。同时,为了减少转换或传递的时间,提高效率,还提供重定向自由度映射关系和其它数据库代码化的辅助命令,如/DFLAB、NBLOCK、EBLOCK、EN等等。该功能大大提高了ANSYS与其它有限元程序之间的模型数据的传递和转换,也实现了ANSYS自身数据库文件代码化后便于存储或机器之间的传递。

ANSYS数据接口还阐述了图形文件的格式,帮助用户将ANSYS图形文件转换成其它格式,如AI等。

2

解析UIDL篇

1结识UIDL

UIDL是什么?Ansys二次开放语言的一种。

OK,那么它能带给我们什么?很多很多,如果你想让你在Ansys中制作的用户界面具有专业水准的话,请来结识一下我们的UIDL把。 ? 全称:

UIDL的全名是User Interface Design Language,是Ansys中二次开发工具方面的三大金刚之一。GUI方面几乎全部的二次开发功能都将由它运筹帷幄。 ? 功用:

? 组织我们自己强大的菜单系统。想象一下我们在Ansys中也能轻松做出可以和

VC,VB之类主流GUI开发工具媲美的菜单响应效果,Ansys的世界将是多么的亲切、友好。

? 构建功能繁复的对话框。Ansys中美观易用的ContactWizard对话框级联界面

一定让你印象很深把,有了它,即使是最菜鸟的门外汉也能构建一流的工程算例,Ansys5.7中的DesignSpace应该就是无可争辩的例证之一。虽然从UNIX内核上讲(Windows下的东西是Ansys的后期移植,很多技术还不成熟,这里就不加讨论了),它们多构建在繁复的TCL编程基础上,但我们利用强大的UIDL工具,也能轻松架构起我们自己的实用对话框向导。 ? 建立自己的联机帮助

Ansys中的联机帮助(尤其是UNIX下的搜索引擎)非常实用,可以说是我所接触过许多有限元平台中最为好用的几种帮助平台之一。UNIX下的关键字查询简直是帅呆了,想构建自己完善的帮助系统吗?UIDL同样是这方面不可或缺的理想开发工具。

2看看UIDL的模样

认识了这位Ansys二次开发中的大侠了巴,现在我们就来进一步和它交流交流,把我们的感性认识上升到理性层次中。 2.1 UIDL控制文件总结构

一个完整的UIDL控制文件大致如一下结构:

控制文件头 结构块结构 …………… 说明:

任何一个UIDL控制文件开头都是一个控制文件头,其后接一个或多个结构块结构。

2.2控制文件头结构

为避免鄙人在这里滔滔不绝,而读者在台下不知所云的尴尬,我们在以后的讲解中都将从一些典型结构例子入手,剖析清楚其各个部分的详细结构,当然这里从例子入手

3

的剖析手段只能做到抛砖引玉,要想熟悉的了解各个命令的详细信息,请参阅UIDL手册:

一个典型的控制文件头如下所示:

---------------------------------------------------------------------------------------------

:F UIMENU.GRN

:D Modified on %E%, Revision (SID) = 5.181.1.67 - For use with ANSYS 5.5 :I 0, 0, 0 :!

--------------------------------------------------------------------------------------------- 几点说明: 1. 控制文件头第一行必须有:F filename,filename是UIDL控制文件名。 2. 控制文件头第二行必须有:D description,description是对本文件的一些说明。

注意到description中有时能带%E%扩展,但只有当你拥有类似SCCS的系统(含一源码控制系统),ANSYS才能 有效的进行%E%扩展,否则请手动把这些说明替代%E%写入description中。 3. 控制文件第三行必须有:I 0, 0, 0,各个0必须出现在第9、

18、27行。用户只需要在这些位置填入0,ANSYS在调用该文件后会自动在这些位置填入GUI界面的位置信息。 4. :!这一行通常是用来在UIDL控制文件中做分隔标记的,可有可无,这里用来

分隔控制文件头和结构块结构,建议在控制文件头和结构文件块之间,以及各个控制文件块之间都加一行:!加以间隔。

2.3结构块结构

结构块结构是一个UIDL控制文件的核心,它涵盖了菜单信息,命令信息,以及帮助文件信息,按照其不同的类型可划分为菜单结构块,命令结构块和帮助结构块。一般来说函数结构块还都伴随着构建一个对话框结构。 1. 结构块结构基本框架

麻雀虽小,五脏俱全,让我们先看一看结构块的基本结构: 头部分 数据控制部分 尾部分 2. 例子说明

这里基于一个菜单结构块描述一下这些基本结构的细节,让大家有一个感性认识: --------------------------------------------------------------------------------------

头部分

:N Men_Add

:S 0, 0, 0 :T Menu :A Add :C :D Add

数据控制部分 Fnc_VADD Fnc_AADD Fnc_LCOMB

4

尾部分

:E END 分隔 :!

----------------------------------------------------------------------------------------

几点说明: ? 头部分

? :N行定义一唯一的结构控制块名。

? :S行定义结构控制块位置信息。用户只需在第9、16、23行输入0

即可,ANSYS在调用该文件中将自动为这些域填入合适的值。

? :T行定义该结构控制块的类型,可选类型有Menu、Cmd或者Help。 ? :A行对不同类型的结构控制块有不同的功用,在Menu块中通常用

来定义出现在GUI菜单上的名字。 ? :D行通常用来描述该结构块的信息。

? 头部分中还可以带许多其他命令,例如ANSYS内部命令等,这里就

不详述了,我们将在例子中看到其具体用法。

? 数据控制部分

数据控制部分根据不同的结构控制块有不同的写法,但必须至少有一个数据控制行。例如在菜单结构块中我们可以在其中使用Men_String来调用其他菜单项,还可以使用Fnc_String命令调用一些命令。String对应于特定的菜单名部分或者命令名部分。其他具体细节这里就不详述了。我们将在具体实例中看到他们是如何构建实现的。 ? 尾部分

:E END标志着一个结构块的结束。

? 分隔(可选)

一般说来,我们将在结构块和结构块之间加入:!来间隔(可选)。

3 Ansys调用UIDL的过程

上面我们已经熟悉了整个UIDL控制文件的结构,可惜我们还是空有武器,鲜有用武

之地,Ansys到底是怎么使用UIDL的呢?搞清楚这一点,我们才能够游刃有余的控制整个GUI界面的定制,在这部分里我们将描述一下Ansys控制UIDL文件的过程。

下面的一些设置情况都是基于工作站版本的ANSYS5.5,其他版本的ANSYS的设置处理也类似,这里就不加赘述了。

ANSYS在调用GUI界面时会自动调用menulist55.ans文件,该文件中描述了UIDL前处理器到哪里去寻找UIDL控制文件。ANSYS在其docu/目录中有一个基本的menulist55.ans文件和对应的基本UIDL控制文件。默认情况下,ANSYS就调用这一menulist55.ans文件。

下面是这一基本menulist55.ans文件的内容: ---------------------------------------------------------- /ansys55/docu/UIMENU.GRN /ansys55/docu/UIFUNC1.GRN /ansys55/docu/UIFUNC2.GRN /ansys55/docu/UICMDS.HLP

5

/ansys55/docu/UICMDS.HPS /ansys55/docu/UIELEM.HLP /ansys55/docu/UIELEM.HPS /ansys55/docu/UIGUID.HLP /ansys55/docu/UIGUID.HPS /ansys55/docu/UITHRY.HLP /ansys55/docu/UITHRY.HPS /ansys55/docu/UIOTHR.HLP /ansys55/docu/UIOTHR.HPS

----------------------------------------------------------

可见,正是因为这一menulist55.ans文件的指定,ANSYS系统将默认调用对应的基本UIDL控制文件。

由此,我们可以产生一个想法:只要我们改变这一基本menulist55.ans中的指定,就能使用我们自己的UIDL控制文件。

但其实我们有更加好的方法,一般来说我们不建议改变系统ansys55目录里任何文件内容,以避免不必要的失误。ANSYS本身在调用menulist55.ans文件的方式上就提供了便于进行UIDL开发的机制:

通常ANSYS按照以下顺序寻找menulist55.ans文件: 用户工作目录(可以在Interactive启动方式中设定)->用户根目录->/ansys/docu目录,可见只要我们在用户工作目录中编辑自己的menulist55.ans文件,ANSYS将优先使用我们自己的menulist55.ans文件。如果生成了自己的UIDL控制文件,并在我们自己的menulist55.ans文件中指向它们,我们就能实现对UIDL的全控制。以后的实例中我们将看到通用的UIDL开发过程。

最后要指出的是,UIDL前处理器在处理UIDL控制文件后,将自动在:I行(控制文件头部分)和:S行(结构块的头部分)中填入相应的位置信息,并在整个文件最后写入一系列:X行(索引行)。

UIDL实例解析一

1问题描述:

任何一个级联菜单的最底级总是调用命令,在这个实例里我们试着添加一个菜单联结,指向一个我们自己构建的命令。这个命令的构建方式我们将在实例二中给出。为方便起见,我们将在主菜单下添加一个MyProject菜单项,调用MyProject子菜单。MyProject子菜单中含有一个DoProject命令,该命令对一个实际问题进行优化设计,我们将在以后的实例中实现它。

6

2环境准备:

1. 配置好ANSYS环境,这里略过。

2. 在当前用户目录下建立一个子目录UIDL

---------------------------- %mkdir ~/UIDL ----------------------------

3. 拷贝相应文件进入该子目录

------------------------------------------------------- %cp /ansys55/docu/menulist55.ans . %cp /ansys55/docu/UIMENU.GRN . %cp /ansys55/docu/UIFUNC1.GRN . %cp /ansys55/docu/UIFUNC2.GRN .

------------------------------------------------------- 4. 编辑该子目录下文件menulist55.ans

前面我们已经看到了这个基本menulist55.ans的内容,这里我们想使用自己的UIDL控制文件,而不用默认目录/ansys55/docu下的UIDL控制文件,因此我们把该文件修改成如下内容: -------------------------------------------------------

./UIMENU.GRN ./UIFUNC1.GRN ./UIFUNC2.GRN

/ansys55/docu/UICMDS.HLP /ansys55/docu/UICMDS.HPS /ansys55/docu/UIELEM.HLP /ansys55/docu/UIELEM.HPS /ansys55/docu/UIGUID.HLP /ansys55/docu/UIGUID.HPS /ansys55/docu/UITHRY.HLP /ansys55/docu/UITHRY.HPS /ansys55/docu/UIOTHR.HLP /ansys55/docu/UIOTHR.HPS

--------------------------------------------------- 5. 运行测试是不是能够正常启动ANSYS

以Interactive方式启动,设置工作目录为刚刚创建的UIDL目录,并设置初始工作名为uidl,启动ANSYS,这是ANSYS的GUI界面应该和默认情况下启动,只不过不同的是调用的UIDL控制文件是当前UIDL目录下的了(只不过两者内容相同而已)。

3添加菜单:

ANSYS的浮动根菜单名字叫MenuRoot,我们将在根菜单下添加一个菜单项MyProject,

点击这个菜单项自动调用MyProject子菜单。MyProject子菜单中我们将放入一个命令

7

DoProject,点击这个命令,将进入我们的问题处理。

1. 定制DoProject命令

这里我们把DoProject命令的定义写入UIFUNC2.GRN中,编辑UIFUNC2.GRN文件,在其中两个结构块之间加入一个DoProject命令结构块:

-------------------------------------------

:N Fnc_DoProject

:S 86, 73, 6 :T Cmd

:A DoProject :D Let's go Inp_P :E END :!

-------------------------------------------

当然这样一个结构块什么也不干,只是一个虚块,在以后的实例中我们将完成这个命令的功能。 2. 定制MyProject子菜单

这一步中我们把MyProject子菜单的定制写入UIMENU.GRN中,编辑UIMENU。GRN文件,在其中两个结构块之间加入一个MyProject菜单结构块:

-------------------------------------------

:N Men_MyProject

:S 120, 88, 25 :T Menu :A MyProject

:D Optimize the structure -Optimize- Fnc_DoProject :E END :!

--------------------------------------------

这里-Optimize-是出现在菜单上的静态文本,Ansys对任何寻找不到定义的调用均当做静态文本处理。如果某子菜单中只有静态文本的话,Ansys一般情况下将不显示这个子菜单。

3. 将MyProject子菜单加到根菜单下

这里我们再次编辑UIMENU.GRN文件,在MenuRoot菜单结构块中添加到MyProject的链接。最后UIMENU.GRN的MenuRoot菜单结构块定义类似如下写法:

--------------------------------------------

:N MenuRoot

:S 433, 76, 350 :T Menu

:A Main Menu

:D ANSYS ROOT MENU Men_UVBA_Main_T1

8

Men_UVBA_Main_T2 Men_UVBA_Main_T3 Fnc_Preferences Sep_

Men_Preproc Men_Solution Men_GenlPost Men_TimePost Sep_

Men_MyProject

Sep_

K_LN(alpha) Men_DesOpt ……

----------------------------------------------

可见我们把Men_MyProject子菜单链接加入到基于时间历程后处理的菜单项后。当我们重新启动ANSYS时看到的主菜单应该如下图(a)所示,点击MyProject菜单项将出现图(b)的情形。

(a)

(b)

4结束语

上面我们看到了怎么在浮动菜单中简单添加自己定制子菜单的方法,但这个时候我们点击DoProject命令什么也不发生,因为我们在命令定制中就是这么设定的。以后我们将完善这个命令,让它逐渐强大起来。

大家也许会问,既然定义的这个命令是空命令,那能不能索性不定义呢。答案应该是不可以,大家可以试一试删去UIFUNC2.GRN中DoProject函数的定义,当你点击根菜单中的MyProject菜单链接,MyProject应该都不会弹出。

9

UIDL实例解析二

1问题描述:

r

α 图1

H

如图1(a)一所示,一带孔薄板,长4000mm,宽2000mm,顶部中心部分1800mm处承受42MP的压力,左右两个长圆孔中心分别踞四周1000mm,长圆孔的具体形式如图1(b)所示,上下分别为半圆,中部用直线衔接。这里假设长圆长轴与水平方向夹角为α。

为了使得孔边缘应力集中最小,这里拟调整α的大小(α∈[-π/2, π/2]),以便在固定的H情况下达到长圆孔周围应力集中最小。

本章中,我们将仅仅限于UIDL部分完成这个问题,即实现如下功能:通过菜单和对话框,用户输入参数H的大小,我们让Ansys自动生产整个分析模型。

(a) (b)

2环境准备及构建对话框:

1. 基于上一个实验的环境,在~/UIDL目录下构建一个输入脚本,这里我们权且称其

为create.inp,该脚本能针对固定的r、H、α来构建出分析模型。Create.inp脚本文件可以参看附录。

2. 在文件UIFUNC2.GRN中任意两个结构块之间添加函数DoProject的定义:

-------------------------------------------------------------- :N Fnc_DoProject

:S 0, 0, 0 :T Command

:A Optimize My Project 图2 :D Please Input the Custom Information :C )*SET,My_H,150 Inp_NoApply Cmd_)*Cset,1,1 Fld_0 Typ_Lab

Prm_Custom the Geographic Information Fld_2

10

Prm_ Please Input the H for Analysis(100~200) Typ_INT

Def_*PAR(MY_H) Cmd_)/Go Cmd_)fini Cmd_)/clear

Cmd_)*GET,My_H,CPAR,1 Cmd_)/Input,create,inp :E END :!

------------------------------------------------------------------

图3

这里我们可以清晰的看到,在命令结构块中,:A命令后的说明将出现在调用该函数的菜单项中,如图2所示,:D命令后的说明将出现在我们定制的对话框标题上。 几点说明:

? 这里我们定制了一个对话框(无拾取点线等的功能),在任何一个自定义

的对话框中,至少应该有一个Typ_命令,但不能有Inp_P命令。

? 本对话框由于比较简单,不需要Apply按钮(该按钮多用来处理复杂输入,动态刷新功能),因此我们设定为 Inp_NoApply命令。

? 下面的Fld_0,Fld_2什么的都是一个个对话框域。不同的数据输入域,

比方说:输入框、多选框、列表框的都必须有独立的域号,象本例中一个数值输入框域代号为2。但所有静态文本都可以写在Fld_0域内,因为不会出现我们调用时的冲突。这里,我们的Fld_0域内是Typ_Lab的静态文本,内容书写在Prm_后。Fld_2域是一个整数输入对话框域(Typ_INT),前面Prm_后有一段文字说明,并设定默认值(Def_)。

? 下面的几行Cmd_)后跟的都是针对这一数值输入域处理的Ansys命令,主

要功能是先清数据库,再取到域2内用户输入的H参数值,然后进行基于该参数的模型构建。

3. 输出结果:

这是α=π/4,H=150情况下自动生成的几何模型。虽然例子比较简单,但我们从中可以掌握一种GUI定制参数并运用到脚本建模中的技巧,掌握了这种技

11

巧,我们就不难轻松的构建各种更加复杂的模型。

3参数提取杂谈

上面我们看到了一种比较简单有效的对话框参数提取、传递的技巧,其实在Ansys中参数的提取有好些方法。

通常的用户命令中(比方说设定实常数等),Ansys中由于有固定的命令与其对应,在GUI函数命令中Ansys是这样定制的,在对话框起始处给出一个Cmd_R命令(这里以提取实常数命令R为例),其后对应的Fld_2、Fld_3等域Ansys将自动拾取之并对应R命令的第二个参数、第三个参数等。但我们初学二次开发时不可能拥有自己的命令,因此这里我们弃而不用。等以后我们学习了UPF二次开发工具,能够定制自己的命令后,我们再来回顾一下这种参数话方法。

这里我们使用的是CSET命令和CPAR命令,也是一种比较简洁有效的方式。命令结构块头部分我们用:C )*SET,My_H,150命令在环境中设定一变量My_H,初值为150,并用Def_*PAR(MY_H)命令指定为数值域的初值。然后用Cmd_)*CSET,1,1命令把第一个数值域的内容指定存储到*CSET命令对应的一矢量数值中,其次在数值域中指定用Cmd_)*GET,My_H,CPAR,1命令让参数My_H再把用户输入的数值域内容从该矢量数组中读回来,这样我们就有了一个用户输入的参数值My_H,最后就可以直接调用脚本文件,生成需要得到的参数化建模结果。

在UIFUNC2.GRN中我们还可以看到其他一些参数化提取方式,比如说利用系统参数_z1~_z9…,用命令*GET,PAR,CMD,0,FIELD,2来拾取命令中域2中的内容到自己设定的参数中。以后我们可以对各种方法都练练手,这里就不再赘述了。

4结束语

上面我们用UIDL对话框的技术轻松实现了有用户化界面的参数化建模,在以后的例子中我们将对这个实例进行完善,并融入APDL和UPF的内容。

附录

create.inp清单:

----------------------------------------------------------------------------------------- !This is a script which can create the modal with a parameter sita.

!Clear the workspace !fini

!/clear,nostart

!Setup the Parameters PI=4*atan(1) sita=PI/4 r=200

12

!H=150 H=My_H

!Customize the Material Property keyw,pr_struc,1 /prep7

et,1,shell63

r,1,120,120,120,120

uimp,1,ex,dens,nuxy,2400,1.2,0.375

!Modeling !Create plate k,1,0,0 k,2,2000,0 k,3,2000,2000 k,4,0,2000 k,5,1800,0 k,6,1000,1000 l,1,5 l,5,2 l,2,3 l,3,4 l,4,1

al,1,2,3,4,5

!Create hole

!Create my coordinate

k,7,1000+H*cos(sita),1000+H*sin(sita)

k,10,1000+H*cos(sita),1000+H*sin(sita),100 k,8,1000+r*cos(sita+PI/2),1000+r*sin(sita+PI/2) cskp,11,0,6,7,8 csys,11

!Create Hole k,9,H,r l,7,9 l,7,6

adrag,6,,,,,,7

arotat,6,,,,,,7,10,-90 arsys,y,2,3,1 arsym,x,2,5,1

aadd,2,3,4,5,6,7,8,9

13

asba,1,10

UIDL实例解析三

1问题描述

本章我们我们将描述UIDL的最后一个功能—构建我们自己的联机帮助文档。 诚然联机帮助在一般的开发过程中有点无足轻重,但如果你想让你的工作更加完善、更加专业的话,建立起自己强大的帮助系统是必不可少的,这一个实例中我们将对UIDL实例二构建我们自己的联机帮助文档。构建完联机帮助文档后,在菜单中点击DoProject菜单项将显示如下对话框: 看到了把,现在这个对话框中增加了一个Help按钮,点击这个Help按钮看看效果把,显示结果如下:

这里的文字可以任意,轻松写入任何泥想写入的帮助信息巴。下面我们就详细的说明如何建立这样的一个联机帮助。

2环境准备及构建联机帮助:

Ansys中的联机帮助一般有三种形式:ASCII形式,ZBitmap形式,PostScript形式。PostScript形式的联机帮助多是在Unix下和打印功能有关的,我们这里就不加详述了。ZBitmap形式的联机文档应该是功能最强大的,应该类似于Windows下的PDF格式帮助文

14

档把,可以在帮助文档中有图形或者文字的超级链接,构建这样的帮助文件我们得需要构建744pixels×925pixels的XWD格式图像,xwd格式是UNIX中用xwd工具抓图所得的一种图像格式,可惜的是这里我们崭时缺少这样能够生成固定尺寸格式的XWD图像文件的工具,所以这里我们也不准备仔细对它的构建方法进行描述(你可以试验用任意尺寸的XWD格式构建ZBitmap格式的帮助文档,正常情况下Ansys系统应该不加显示任何图片)。 这里我们在上一个实例的基础上描述一下如何建立ASCII形式的帮助文档。

1. 在Unix下,构建你的帮助文档文字信息,把它存成文件hlp_other2:

――――――――――――――――――― ZengP Work Group

This Project is designed by Heling. Enjoy it!

――――――――――――――――――― 2. 检查hlp_other2文件字节数:

Unix下可以用命令ls hlp_other2或者wc –c hlp_other2命令查看该文件的字节数,这里得出的字节数为63

3. 构建帮助文件的数据控制部分,把它存成hlp_other1

――――――――――――――――――― Customized Help Hlp_ Hlp_ ASCII 63

END_OF_HYPERLINKS

―――――――――――――――――――

这里的数据控制部分是有固定格式的,第一行表示帮助对话框的标题。 第二行和第三行是描述该帮助文件的前端链接和后端链接。这里由于是我们自己定义的帮助文档,没有前端链接和后端链接,因此我们都把它写成Hlp_就可以了,第四行是描述帮助文件格式、字节信息的,这里我们是ASCII格式,字节数是上一步中得到的字节数63(对ZBitmap格式后面需要提供压缩后字节数和压缩前字节数两个信息,具体做法请自己参看UIDL帮助手册)。以下到最后一行的END_OF_HYPERLINKS之间是定义帮助文档之间超级链接的,由于我们这里是做ASCII的帮助信息,不是ZBitmap格式的,因此没有任何超级链接需要定义。 4. 把hlp_other1和hlp_other2合成一个文件hlp_other

êt hlp_other1 hlp_other2 >hlp_other 5. 检查一下文件hlp_other的字节数

%wc –c hlp_other

这个例子中得到的字节数是116

6. 构建帮助文件的头信息,把它存储为head_other:

――――――――――――――――― :N Hlp_0_Contents

:S 0, 0, 0 :T HELP 116

――――――――――――――――― 7. 构建帮助文件尾信息,把它存储为end:

―――――――――――――――――

15

8.

9. 10.

11.

:E End

―――――――――――――――――

构建帮助文件的控制文件头,把它存储为control_other: ――――――――――――――――― :F OTHER.HLP :D Modified on 1/17

:I 0, 0, 0 :!

――――――――――――――――― 构建总的帮助文件OTHER.HLP

%cat control_other head_other hlp_other end >OTHER.HLP

把我们构建好的帮助文件OTHER.HLP加入menulist55.ans中去。 最后menulist55.ans显示内容如下: ――――――――――――――――― ./UIMENU.GRN ./UIFUNC1.GRN ./UIFUNC2.GRN

/ansys55/docu/UICMDS.HLP /ansys55/docu/UICMDS.HPS /ansys55/docu/UIELEM.HLP /ansys55/docu/UIELEM.HPS /ansys55/docu/UIGUID.HLP /ansys55/docu/UIGUID.HPS /ansys55/docu/UITHRY.HLP /ansys55/docu/UITHRY.HPS /ansys55/docu/UIOTHR.HLP /ansys55/docu/UIOTHR.HPS ./OTHER.HLP

―――――――――――――――――

在我们的函数定义DoProject中加入联机帮助信息.

编辑UIFUNC2.GRN中的DoProject函数定义,由于我们定制的帮助文件名为Hlp_0_Contents,我们把它加入到函数定义中去,编辑完后该函数定义内容结果如下:

――――――――――――――――――――― :N Fnc_DoProject

:S 396, 147, 242 :T Command

:A Optimize my Project

:D Please Input Custom Information :C )*Set,My_H,150 :H Hlp_0_Contents Inp_NoApply Cmd_)*Cset,1,1 Fld_0

16

Typ_Lab

Prm_Custom the Geographic Information Fld_2

Prm_ Please Input the H for Analysis(100~200) Typ_INT

Def_*PAR(My_H) Cmd_)/Go Cmd_)fini Cmd_)/clear

Cmd_)*GET,My_H,CPAR,1 Cmd_)/Input,create,inp :E END :!

――――――――――――――――――――――――- 12. 万事具备,测试一下你自己构建的帮助文档把。

3几点说明

从前面可以看到,一个帮助文件一般有文件控制头和若干帮助文件结构块组成,对帮助文件结构块来说,其包含四个部分:头部分,数据控制部分,帮助内容部分和尾部分。与函数说明不同的是它增加了帮助内容部分,这里存放各种格式的帮助文档,其次它需要提供许多帮助内容部分的字节信息。所以构建帮助文件的时候一般都是分块构建,不断用wc或者ls命令观看字节信息,最后生成完善的帮助文件。感兴趣的同学可以自己生成强大的帮助文档信息,由于这一部分不是二次开发的重点,我们在这里也不详细讨论其细节了,利用上面的知识我们已经足以构建任何复杂的ASCII文档信息。

4 结束语

到这里为止,我们已经对UIDL的所有功能都基于例子进行了详细描述,讲到这里大家已经有足够的UIDL知识构建比较专业化的基于GUI界面的参数化建模本领了。在后续章节,我们将基于APDL和UPF知识对这一例子进行优化处理实现,希望大家保持充足的兴趣继续向下学习。

17

解析APDL

1 熟悉新朋友—APDL

APDL是我们即将结识的第二个强大二次开发工具。它的全称是ANSYS Parametric Design Language。APDL可以帮助你更加有效的进行分析计算,可以让你轻松自动化你的工作(循环、分支、宏等结构),并是一种高效的参数化建模手段。很多情况下,APDL主要用在优化设计或者自适应网格划分中。但在日常分析中如果你知道善用,APDL也将发挥其强大的优势,让你的工作变的生动起来。

2 二次开发工具之间的比较

APDL所能实现的功能通俗的说来应该是次于UPF而强与UIDL,但实际上是由于三者具体侧重点不同造成的:UIDL主要控制GUI界面的各类二次开发方法,涉及的分析部分就要少一些,APDL可以称其为和分析部分频繁打交道的一组小型工具,功能强大,但不和UIDL一样能够非常具体的针对某一两方面的二次开发处理,通常情况下的他融合在分析的角角落落中。UPF是三者之间的最强者,他能完成最复杂的二次开发工作,比如说构建新单元,复杂数据库交互,外围命令定制等,但UPF在很多情况下也借助了APDL命令来完全实现其功能。同样我们也能在UIDL中欠入APDL命令,来构建比较复杂的GUI二次开发工作。 一句话,UIDL、APDL和UPF三者各有所长,密不可分。结合使用三者,我们将能够实现任何强大的分析功能。

3 结束语

我们这里对APDL的介绍将着重于它的一些基本功能,而不会象UIDL那样用一组实例来完整的描述他的所有功能,当然其间也会夹杂讲述一些例子,来加强大家对APDL工具应用技巧。

APDL综合实例

1 问题说明

本章在阐明APDL技术时本想也采取实例的方式,把APDL的各个细节都用一个个详细的实例说清楚,无奈APDL细节内容比较繁复,而且不和UIDL那样各成体系,APDL的应用很多情况下都是和UIDL、UPF结合在一起应用的,它甚至渗透到基础分析中的各个环节中,可以说也是ANSYS的脚本基础。考虑到大家都不会有兴趣来聆听枯燥的数组构建法,宏函数的参元特性等罗嗦的APDL语法,这里我们打算用一个比

18

较大的综合实例来想大家描述一部分APDL的功能,从这里你将能看到我们能用APDL干些什么。

还记得UIDL实例解析二中的一个例子巴,这里我们有必要重温一下:

r

α 图1

H

(a) (b)

如图1(a)一所示,一带孔薄板,长4000mm,宽2000mm,顶部中心部分1800mm处承受42MP的压力,左右两个长圆孔中心分别踞四周1000mm,长圆孔的具体形式如图1(b)所示,上下分别为半圆,中部用直线衔接。这里假设长圆长轴与水平方向夹角为α。

为了使得孔边缘应力集中最小,这里拟调整α的大小(α∈[-π/2, π/2]),以便在固定的H情况下达到长圆孔周围应力集中最小。

在UIDL实例二的部分我们只是在GUI界面下实现了它的参数化建模,这部分工作在本章的综合实例中仍然有效,下面我们将一步步完全实现这一问题。

2 解题思想

本问题是在用户给定H的情况下求得α角的最优解,使得孔边最大拉应力最小(这是因为材料抗拉性能比较弱)。这里我们的想法是把α取每一个角度时候得到的孔边最大拉应力都求出,比较一下,得到孔边拉应力最小情况下对应的α取值。现在的问题是,我们只能够对每一离散的α值求取其孔边最大拉应力,让α在[0°~360°]之间连续取值不仅是无法做到的,而且在工程中也没有必要,这里我们拟每隔一定角度计算一下孔边最大拉应力,最终在这些有限的角度中求取出最佳的α值。因此我们还需要用户自定义求解的精度参数,即我们每隔多少角度来计算一次(决定了结果精确到什么程度)。比方说我们定义每隔5°计算一次的话,整个优化过程需要进行180/5=36次求解运算。

3 构建步骤

下面说明一下在构建过程中的一些全局参数: My_H:用户输入的H参数值

My_sita:每次计算对应的α参数值

My_dsita:每两次计算之间间隔的角度值(用户输入的参数)。 My_N:总共需要分析计算的次数。My_N=180/My_dsita My_sita0:初始α值,这里统一定义为0°。 My_MinS1:最优化位置处的最大拉应力值。(计算完以后才是)

19

My_Msita:最优化位置处对应的α值。

Mysmin:每次分析计算得到对应特定α角时的孔边最大拉应力。(一般都是孔边产生应力集中,所以也是整个板料内部的最大拉应力处)

_s1数组:对应特定α时求解得到各个节点上的最大拉应力值。

1. 首先我们重新构建一比较完善的参数话建模脚本,取名为modaling.mac,该脚本

针对固定的My_H和My_sita将构建整个几何模型,加好载荷和约束,具体细节请参看附录。

2. 构建脚本mysolve.mac:

―――――――――――――――――――――― My_sita0=0

My_N=180/My_dsita *do,I,0,My_N-1 parsav,all,mypar fini

/clear,start

parres,new,mypar

My_sita=My_sita0+My_dsita*I modaling /solu solve /post1

ar11=ndinqr(0,14) _s1=

*dim,_s1,,ar11

*vget,_s1(1),node,1,s,1

*vscfun,mysmin,max,_s1(1) *if,I,eq,0,then

My_MinS1=mysmin My_Msita=My_sita *ELSE

*IF,mysmin,lt,My_MinS1,then My_MinS1=mysmin My_Msita=My_sita *ENDIF *ENDIF

parsav,all,mypar *enddo

――――――――――――――――――――――――― 下面是几点说明:

? 程序整个框架是先根据用户输入的参数定制好一些解题环境,比方说求出需要

重复计算的次数My_N,然后用APDL的*do循环结构繁复执行My_N次,每次求得对应角度的孔边最大拉应力值,不断积累出这些对应角度孔边最大拉应力值的最小结果。完成了My_N次结果后,最优结果My_MinS1和对应的角

20

度My_Msita也就求出来了。

? 不同次分析计算过程前必须对ANSYS环境中的现有模型清零,用到/clear命

令,但该命令会使用户参数同时清零,这里用到parsav和parres技术,在每次清零过程前先把当前工作区的参数保存起来,清模型结束后再调入工作区,这样就实现了只清模型、不清参数的效果。

? 解题结束后,我们先用ndinqr(0,14)这一UPF命令求取模型中的节点总数。然

后用*vget命令把所有节点上的最大拉应力都保存到_s1数组中,最后用*vscfun函数得到_s1数组中的最大值。

? 注意每次求解完提取数据时都要重新定义_s1数组的大小(因为每次划分单元

后总节点数不同),这时候每次ANSYS都回出现让你确认是否把已经存在的_s1数组结构改变的对话框,这将导致自动化求解中断,这里我们采用的一个技巧是每次重新定义_s1数组前先清掉_s1数组(用_s1=命令行)。这样救避免了Ansys的询问。同样解决/clear命令的Ansys询问方法就是写全/clear命令:/clear,start。注意这里我们是必须要用start参数的,它表面我们在新建模型时读入start55.ans文件,我们必须在工作目录中构建一个我们自己的start55.ans文件,里面添加上PI参数的说明(因为modaling.mac宏文件中将利用这一参数,如果系统环境中没有这一参数的说明,将产生建模错误)。 ? 解决完一次运算,保存完数据后记得用parsav函数保存环境参数。 3. 完善GUI参数化界面

这里我们要比上次UIDL实例二中多增加一个参数My_dsita,为此我们修改UIFUNC2.GRN函数中DoProject函数:

――――――――――――――――――― :N Fnc_DoProject

:S 0, 0, 0 :T Command

:A Optimize my Project

:D Please Input Custom Information :C )*Set,My_H,150 :C )*Set,My_dsita,90 :H Hlp_0_Contents Inp_NoApply Cmd_)*Cset,1,2 Fld_0 Typ_Lab

Prm_Custom the Geographic Information Fld_2

Prm_ Please Input the Dsita for Analysis(1~90) Typ_INT

Def_*PAR(My_dsita) Fld_3

Prm_ Please Input the H for Analysis(100~200) Typ_INT

Def_*PAR(My_H) Cmd_)/Go

21

Cmd_)*GET,My_H,CPAR,2 Cmd_)*GET,My_dsita,CPAR,1 Cmd_)mysolve :E END :!

――――――――――――――――――――――――

这里可以看到和UIDL篇中的实例相比,多加了参数My_dsita的用户化输入。最后的命令修改成直接用文件名调用(这是因为我们把文件名后缀改为了.mac,它标志着标准的宏文件)。 最后的对话框显示如下:

用户定制好分析精度和H值后,点击OK就开始了完整的分析过程。 4. 求解结果

最后求解完毕后得到了一些最优化结果:用*status命令可以看到所有参数结果(这里我用每隔5度进行一次分析求解): My_Msita=40°,用该最优化建模图形为:

这里由于实常数对应力集中的效应没有影响,我们就不再给出具体计算结果来了。

22

有效的仅是在同样的载荷条件下不同角度的孔上最大拉应力的情况。

4 几点说明

APDL中的参数化建模、优化涉及是十分复杂有效的,这里我们只是给出了一个小小的例子,用来举一反三。套用同样的方法和机制,我们可以完成更加复杂的问题。 这里我们仅仅用到了APDL功能中的一小部分,我们完全可以想象一下UIDL+APDL+UPF能够完成什么样复杂程度的功能—几乎是任何功能!

5 结束语

这里结合APDL,UIDL和UPF讲述了一个比较综合的例子,在以后描述了UPF功能后,大家将更加为UPF功能的强大而神往不已。

附录:

modaling.mac:

―――――――――――――――――――――――――――――― !This is a script which can create the modal with a parameter sita. !Parameter Setting sita=My_sita/180*PI r=0.2

H=My_H/1000

!Customize the Environment keyw,pr_struc,1 /prep7

et,1,shell63

r,1,0.12,0.12,0.12,0.12

uimp,1,ex,dens,nuxy,2.1e9,1.2,0.375

!Modeling !Create plate k,1,0,0 k,2,2,0 k,3,2,2 k,4,0,2 k,5,0.9,2 k,6,1,1 l,1,2 l,2,3 l,3,5 l,5,4

23

l,4,1

al,1,2,3,4,5

!Create hole

!Create my coordinate

k,7,1+H*cos(sita),1+H*sin(sita)

k,10,1+H*cos(sita),1+H*sin(sita),100 k,8,1+r*cos(sita+PI/2),1+r*sin(sita+PI/2) cskp,11,0,6,7,8 csys,11

!Create Hole k,9,H,r l,7,9 l,7,6

adrag,6,,,,,,7

arotat,6,,,,,,7,10,-90 arsys,y,2,3,1 arsym,x,2,5,1

aadd,2,3,4,5,6,7,8,9 asba,1,10

csys,0

arsym,x,2, , , ,0,0 nummer,all, , , ,low aadd,1,2

/auto,1 gplot

!Meshing the plane smrt,6 amesh,all

!Add DOF

DK,2,UX,0, ,,UY DK,14,UX,0,,,UY

!Add Pressure SFL,4,PRES,42 SFL,11,PRES,42

―――――――――――――――

24

25

本文来源:https://www.bwwdw.com/article/3ma3.html

Top