ANSYS基于VC++6.0的二次开发与相互作用分析在ANSYS中的实现
1 概述
ANSYS是一套功能十分强大的有限元分析软件,能实现多场及多场耦合分析;是实现前后处理、求解及多场分析统一数据库的一体化大型FEA软件;支持异种、异构平台的网络浮动,在异种、异构平台上用户界面统一、数据文件全部兼容,强大的并行计算功能支持分布式并行及共享内存式并行。该软件具有如下特点:
(1) 完备的前处理功能
ANSYS不仅提供了强大的实体建模及网格划分工具,可以方便地构造数学模型,而且还专门设有用户所熟悉的一些大型通用有限元软件的数据接口(如MSC/NSSTRAN,ALGOR,ABAQUS等),并允许从这些程序中读取有限元模型数据,甚至材料特性和边界条件,完成ANSYS中的初步建模工作。此外,ANSYS还具有近200种单元类型,这些丰富的单元特性能使用户方便而准确地构建出反映实际结构的仿真计算模型。
(2) 强大的求解器
ANSYS提供了对各种物理场量的分析,是目前唯一能融结构、热、电磁、流体、声学等为一体的有限元软件。除了常规的线性、非线性结构静力、动力分析外,还可以解决高度非线性结构的动力分析、结构非线性及非线性屈曲分析。提供的多种求解器分别适用于不同的问题及不同的硬件配置。
(3) 方便的后处理器
ANSYS的后处理分为通用后处理模块(POST1)和时间历程后处理模块(POST26)两部分。后处理结果可能包括位移、温度、应力、应变、速度以及热流等,输出形式可以有图形显示和数据列表两种。
(4) 多种实用的二次开发工具
ANSYS除了具有较为完善的分析功能外,同时还为用户进行二次开发提供了多种实用工具。如宏(Marco)、参数设计语言(APDL)、用户界面设计语言(UIDL)及用户编程特性(UPFs),其中APDL(ANSYS Parametric Design Language)是一种非常类似于Fortran77的参数化设计解释性语言,其核心内容为宏、参数、循环命令和条件语句,可以通过建立参数化模型来自动完成一些通用性强的任务;UIDL(User Interface Design Language)是ANSYS为用户提供专门进行程序界面设计的语言,允许用户改变ANSYS的图形用户界面(GUI)中的一些组项,提供了一种允许用户灵活使用、按个人喜好来组织设计ANSYS图形用户界面的强有力工具;UPFs(User Programmable Features)提供了一套Fortran77函数和例程以扩展或修改程序的功能,该项技术充分显示了ANSYS的开放体系,用户不仅可以采用它将ANSYS程序剪裁成符合自己所需的任何组织形式(如可以定义一种新的材料,一个新的单元或者给出一种新的屈服准则),而且还可以编写自己的优化算法,通过将整个ANSYS作为一个子程序调用的方式实现。
鉴于上述特点,近几年来,ANSYS软件在国内外工程建设和科学研究中得到了广泛的应用。但这些应用大多局限于直接运用ANSYS软件进行实际工程分析,对利用ANSYS提供的二次开发工具进行有限元软件设计却很少涉及。本文首次利用ANSYS软件的二次开发功能,以VC++6.0为工具,运用APDL语言,对ANSYS进行二次开发,编制框筒结构-桩筏基础-土相互作用体系与地震反应分析程序。
2 程序设计目标
针对某一实际工程问题,ANSYS所提供的APDL语言可对ANSYS软件进行封装。APDL语言即ANSYS软件提供的参数化设计语言,它的全称是ANSYS Parametric Design Language。 使用APDL语言可以更加有效地进行分析计算,可以轻松地进行自动化工作(循环、分支、宏等结构),而且,它是一种高效的参数化建模手段。使用APDL语言进行封装的系统可以只要求操作人员输入前处理参数,然后自动运行ANSYS进行求解。但完全用APDL编写的宏还存在弱点。比如用APDL语言较难控制程序的进程,虽然它提供了循环语句和条件判断语句,但总的来说还是难以用来编写结构清晰的程序。它虽然提供了参数的界面输入,但功能还不是太强,交互性不够流畅。针对这种情况,本文用VC++6.0开发框筒结构-桩筏基础-土相互作用有限元分析程序(简称LWS程序)。
本程序设计目标是利用VC++6.0对ANSYS进行封装。用VC++6.0对ANSYS模拟框筒结构-桩筏基础-土相互作用进行二次开发,用户只需输入诸如地震波、计算时间步长、阻尼比等物理性能参数等,系统就能自动调用ANSYS计算程序,自动进行网格划分、地震动加载以及自动求解。该系统由于前台开发友好、方便、易用的人机交互界面,对复杂的、难于理解和掌握的ANSYS命令流进行后台封装,因此,程序设计可让即使从未认真学习过ANSYS软件的工程设计人员也能很好地借助本系统进行结构抗震性能有限元分析,具有较强的处理实际问题能力。
用户输入计算参数,即可调用后台的ANSYS命令进行计算,ANSYS把计算结果返回给用户,进行后处理。
程序设计的主要原则和功能如下:
(1)方便原则,即程序模块应具有良好的用户界面和易用性。程序前台设计采用Windows提供的标准图形用户界面(GUI),用户无须接受专门训练即可使用。同时,程序应具有良好的容错和纠错能力,避免用户操作不当造成损失。
(2)程序系统能够提供用户以下功能:
①允许用户可以根据实际计算工况,输入特定的计算参数,包括地震波选择、计算时间步长、地震波调幅与否等。
②用户在输入各种参数以后、进行计算之前可以对输入的数据进行修改、添加和删除操作,以保证输入正确的参数。
③用户通过界面调用后台的ANSYS命令流进行计算,能够得到最后的计算结果文件,供用户进行后处理和结果分析。
④用户可以添加新的功能或新的二次开发以实现程序升级。
(3)程序应具有良好的可移植性,不依赖于特定的硬件设备,只要能安装ANSYS和VC++6.0的硬件环境都能使用本系统,保证程序使用的广泛性。
(4)程序代码应具有开放性和可重用性。这样,在进一步的设计中,能保证设计者可以方便地对代码进行修改扩充;同时,提供一定的设计接口,新的设计者可以根据接口,无须对程序进行大幅度的修改,就可以进行新的开发,以适应新的特殊要求。
程序的开发平台是Microsoft VC++6.0、ANSYS6.1,基于WindowsXP编程。程序实现是利用微软提供的Windows编程接口MFC和ANSYS公司的ANSYS/Multiphysics产品,采用面向对象的程序设计方法。
3程序的主要模块和设计
如图3-2所示,程序的主要模块有:用户界面模块、ANSYS计算模块、VC调用接口模块和VC后处理模块,分别论述如下:
3.1 ANSYS模块
ANSYS为了满足用户的特殊需求,建立了开放的体系结构,提供了二次开发接口APDL、UIDL和UPFs(User Programming Features,用户编程特性)等。其中,ANSYS接口允许用户将自己的VC代码连到ANSYS中去,或将ANSYS作为子程序调用,从而使ANSYS具备特殊的功能。
本文的ANSYS模块是使用APDL语言进行二次开发的。在上面的二次开发中用到了参数化设计方法。参数是APDL的变量(它们更象FORTRAN变量,而不像FORTRAN参数),不必明确声明参数类型,所有数值变量都以双精度数存储。被使用但未声明的参数都被赋予接近0的“极小值”。在二次开发中使用参数化设计方法,增强了程序的易读性和可移植性。用户无须了解程序的具体结构只需改变参数值就可自动调用ANSYS模块。
3.2 VC调用模块
VC调用模块在该系统中起着接受用户界面的输入、创建进程调用ANSYS模块进行计算的重要作用。有两项工作是在实现在VC程序中调用ANSYS必须做的,一是要使接口程序能够修改ANSYSB的命令流文件路径及文件名称,这可通过注册表编程实现;二是要能在接口程序中运行ANSYSB应用程序,这涉及到创建进程的编程,下面分别介绍它们的具体实现。
1. 注册表编程
在Windows(98/NT/2000/XP)系统上运行ANSYS安装程序后,便在Windows系统的注册表里记录了一些信息,如初始工作路径,文件名等。利用VC平台调用ANSYS计算模块的程序必须指定ANSYS软件的运行目录以及用APDL语言开发的ANSYS模块程序路径,这样,ANSYS软件的批处理程序才能从给定的路径下读取命令流文件。在接口程序中修改这些注册表信息,可以使用Windows提供的注册表编辑API(Application Programming Interface)函数[30,31],具体实现如下:
HKEY hSubKey; // 定义子键
LONG lRet;
char RegPath[200]="SoftWare\\ANSYS, Inc.\\ANSYS\\ANSYS 6.1\\0";
lRet=RegOpenKeyEx(HKEY_CURRENT_USER,RegPath,0,KEY_ALL_ACCESS,&hSubKey); // 打开子键
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"Extension",0,REG_SZ,(LPBYTE)"txt",3); //设置ANSYS批处理程序读取的文件扩展名
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"Jobname",0,REG_SZ,(LPBYTE)"ZHY");
//指定ANSYS模块文件名
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"WorkingDirectory",0,REG_SZ,(LPBYTE)"E:\\LWS\\Workspace ",16);
if(lRet!=ERROR_SUCCESS)return; // 键值出错返回
RegCloseKey(hSubKey); // 关闭子键
通过以上的设置后运行ANSYS批处理程序,界面变成如图3-3所示。
从图中可看出ANSYS模块工作路径E:\\LWS\\Workspace、初始文件名ZHY、ANSYS程序文件名ZHY.txt文件、计算结果输出文件名ZHY.out都已经自动出现在ANSYS批处理程序的输入框,往下ANSYS就可以自动从ZHY.txt读取命令流进行计算并将结果输出到ZHY.out文件中。若想改ANSYS模块路径或文件名只需对上面程序稍加修改即可。
2. 多进程编程
本文在VC平台上对ANSYS进行封装,希望前台处理系统和用户的交互,而后台进行ANSYS的计算。这就要求系统具有并发性,为此,引入多进程编程机制。进程是一个正在运行程序的实例,它具有动态性、并发性、独立性、异步性和结构性等特点。系统中的进程动态产生与消亡,多个进程并发运行,分别执行各自对应的程序段,为各自的目标而工作。一个程序可以包含多个进程。
图3-3 ANSYS批处理运行界面
在VC++6.0中可以利用CreateProcess函数来创建一个进程去执行其他程序,而且可以设置该进程的优先级。CreateProcess函数的原型是:
BOOL CreateProcess(
LPCTSTR lpAppliciatonName
LPTSTR lpCommandLine
LPSECURITY_ATTRIBUTES lpProcessAttributes
LPSECURITY_ATTRIBUTES lpThreadAttributes
BOOL bInheritHandles
DWORD dwCreationFlags
LPVOID lpEnvironment
LPCTSTR lpCurrentDirectory
LPSTARTUPINFO lpStartupInfo
LPPROCESS_INFORMATION lpProcessInformation
);
当系统调用CreateProcess时,会创建一个进程内核对象,其初始使用计数是1。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的DLL文件的代码和数据加载到该进程的地址空间中。接着,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。与进程内核对象一样,线程内核对象也是操作系统用来管理线程的小型数据结构。通过执行C/C++运行期启动代码,该主线程便开始运行,它最终调用WinMain、wWinMain、main或wmain函数。如果系统成功创建了新进程和主线程,CreateProcess便返回True。
PszApplicationName和pszCommandLine参数分别用于设定新进程将要使用的可执行文件的名字和传递给新进程的命令行字符串。PszApplicationName的参数可以是NULL,表示系统将使用全路径来查看可执行文件,并且不再搜索这些目录;如果参数不是NULL可以将地址传递给pszApplicationName参数中包含可运行的文件的名字字符串。当系统找到了可执行文件后,就创建一个新进程,并将可执行文件的代码和数据映射到新进程的地址空间中。
PsaProcess和psaThread参数分别设定进程对象和线程对象需要的安全性。可以为这些参数传递NULL,这种情况下,系统为这些对象赋予默认安全性描述符;也可以指定两个SECURITY_ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对象。将SECRURITY_ATTRIBUTES 结构用于psaProcess和psaThread参数的另一个原因是,父进程将来生成的任何子进程都可以继承这两个对象句柄中的任何一个。本程序除了创键调用ANSYS计算模块的进程外,无需再创建其它进程,因而,psaProcess和psaThread参数都为NULL。同理,binheritHandles参数为FALSE。
fdwCreate参数用于标识标志,以便用于规定如何来创建新进程,fdwCreate参数也可以用来设定优先级类,不过对于大多数应用程序来说不应该这样做,因为系统会为新进程赋予一个默认优先级。
PszCurDir参数允许父进程设置子进程的当前驱动器和目录。如果本参数为NULL,则新进程的工作目录将与生成新进程的应用程序的目录相同;若不为空,则必须指向包含需要的工作驱动器和工作目录的以0结尾的字符串。课题中该参数选择为NULL就可以了。
PsiStartInfo参数用于指向一个STARTUPINFO结构。当Windows创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序仅仅使用默认值。至少应该将该结构中的所有成员初始化为零,然后将cb(cb为STARTUPINFO结构成员)设置为该结构的大小。STARTUPINFO结构的其他具体成员参见VC++6.0帮助系统MSDN。
PpiProcInfo参数用于指向你必须指定的PROCESS_INFORMATION结构。CreateProcess在返回之前要对该结构的成员进行初始化。该结构的形式如下面所示:
Typedef struct _PROCESS_INFORMATION{
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}PROCESS_INFORMATION;
CreateProcess在返回之前打开进程对象和线程对象,并将每个对象的与进程相关的句柄放入PROCESS_INFORMATION结构的hProcess和hThread成员中。
综上所述,课题创建进程的关键程序如下:
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
memset( & StartupInfo, 0 , sizeof (STARTUPINFO)); // 分配内存
StartupInfo.cb = sizeof (STARTUPINFO); // 初始化
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_SHOWMAXIMIZED;
if ( ! ::CreateProcess(NULL,d:\\ProgramFiles\\Ansys
Inc\\ANSYS61\\bin\\intel\\AnsysB”,NULL,NULL,FALS E, 0 ,NULL,NULL, & StartupInfo, & ProcessInfo))
{
AfxMessageBox( " error! " );
GetLastError();
} // 创建进程
3. 进程的终止
要终止进程的运行可以使用如下四种方法:①主线程的进入点函数返回;②进程中的一个线程调用ExitProcess函数;③另一个进程中的线程调用TerminateProcess函数;④所有进程中的线程自动终止运行(这种情况一般不会发生)。本文采用第一种方法终止所创建的进程,即当ANSYS计算结束时通过函数返回。
在WindowsXP系统中,如果ANSYS批处理程序运行完后,窗口标题会显示“ANSYS已完成”。本文程序开发便可通过这一特点来终止系统所创建的进程。当ANSYS计算模块运行完毕后,系统会弹出一个消息框提示ANSYS已计算完毕,可以进行后处理了。
3.3.3 用户界面接口模块
用户界面模块主要完成系统和用户的交互。用户界面模块包括计算参数输入和程序调用两部分。计算参数输入部分的主要功能是负责输入诸如地震波数据、是否调幅、时间步长等。计算输入是由对话框构成。计算参数输入对话框界面如下:
图3-4 计算参数输入界面
程序对各参数的输入范围都进行了设定,如果用户输入的参数超过了这一设定,系统就会弹出对话框以提醒用户输入错误,需要重新输入。ANSYS程序调用通过菜单方式进行。该菜单首先不处于激活状态,而是当三维数值模拟所需参数输入完成后才得到消息激活菜单。这样设计的优点:能够提醒用户输入并检查用于三维数值模拟的相关参数,避免用户在不输入参数的情况下直接调用ANSYS进行计算而造成错误。
程序设计采用文档读写的方式将输入的计算参数插入到用APDL语言进行二次开发的ANSYS计算模块。参数化设计的ANSYS计算模块就可以根据输入的参数进行数值模拟计算。
3.3.4 ANSYS后处理模块的二次开发
ANSYS软件提供了两个后处理器,可以对结果进行时间-历程后处理
和通用后处理。对于相互作用体系地震反应分析,它可以将模拟结果用应力图、等值线(面)、动画等形式输出与转换。其中POST1通用后处理器可用于观察整个模型或模型的一部分在某一时间的模拟结果,可显示结构在地震作用下的应力图和位移变形图;时间—历程后处理器POST26用于检查模型中指定点的分析结果与时间的函数关系,可显示模型上各个节点的各变量的时程曲线。可见,对于大多数的后处理分析我们可以直接使用ANSYS的后处理器。但由于ANSYS是一个通用软件,而对某些特殊领域的后处理分析无能为力或者不是很方便,因而,需要对其进行二次开发,以减轻后处理工作和提高后处理效率。
在相互作用体系地震反应分析中,有时除了关注各物理量时程曲线外,还关心其在结构高度方向的分布(如层间位移、层间剪力、层间加速度反应等)。解决这一问题的二次开发需要结合相互作用体系地震反应分析特点进行。
(1)物理量分析
在地震反应时程分析中,我们对楼层位移时程、加速度时程、柱应力应变时程 、剪力墙应力应变时程比较关心,同时还需要分析层间位移和层间加速度变化。考虑到本文将计算多种工况,本程序对常见的变量编写了后处理程序,具有通用性,极大地提高了后处理效率。
(2) 程序实现
基于上面分析,本程序是通过接口程序调用ANSYS,读入编写的后处理命令流,读取ANSYS计算的结果数据库,生成各变量的结果文件,然后用本程序的后处理模块进行读数绘图处理,进而生成结果图形。这一过程采用VC编程实现的,VC编程的算法流程图如图3-2的后处理模块。
问:在用patran等建立了几何模型,划分网格后,删除了几何模型,有何办法可以重新恢复几何模型,当然不是重新建点、线、面、体等。大家看有没有好的方法。
答:首先将有限元模型转换为ANSYS格式,然后可以利用ANSYS从实体单元的单元面再产生几何体。下面给出一个从四面体单元再产生几何实体的示例命令流(如果要转换六面体网格,可以通过修改下面的命令流实现。):
1. 转换未变形的网格:
esel,s,mat,,1 !假设单元材料号为1,先选择单元
*get,enum1,elem,0,count
*get,el,elem,0,num,min
ksel,all
*get,nkp1,kp,0,num,max
ksel,none
asel,none
vsel,none
/prep7
*do,i,1,enum1
*do,j,1,3
nd=nelem(el,j)
knum1=nkp1+4*(i-1)+j
k,knum1,nx(nd),ny(nd),nz(nd) !
*enddo
nd=nelem(el,j+2)
k,knum1+1,nx(nd),ny(nd),nz(nd)
v,knum1-2,knum1-1,knum1,knum1+1
el=elnext(el)
*enddo
numm,kp
cm,aal1,area
asel,r,ext
cm,aext,area
vdel,all
va,all
cmsel,s,aal1
cmsel,u,aext
adel,all,,,1
2. 如果需要转换变形后的网格:
esel,s,mat,,1 !假设单元材料号为1,先选择单元
*get,enum1,elem,0,count
*get,el,elem,0,num,min
ksel,all
*get,nkp1,kp,0,num,max
ksel,none
asel,none
vsel,none
/post1
set,last !输出最后一步变形后的网格
/prep7
SHPP,OFF
UPGEOM,1,LAST,LAST,'filname','rst',' ' !假设工作文件名为filname
*do,i,1,enum1
*do,j,1,3
nd=nelem(el,j)
knum1=nkp1+4*(i-1)+j
k,knum1,nx(nd),ny(nd),nz(nd) !
*enddo
nd=nelem(el,j+2)
k,knum1+1,nx(nd),ny(nd),nz(nd)
v,knum1-2,knum1-1,knum1,knum1+1
el=elnext(el)
*enddo
numm,kp
cm,aal1,area
asel,r,ext
cm,aext,area
vdel,all
va,all
cmsel,s,aal1
cmsel,u,aext
adel,all,,,1
查看更多评论 >