问题的提出:我们经常会需要用ansys计算一些东西,之后再用matlab来处理计算的结果。
当修改某些参数重复上述过程的时候,就比较容易出现问题——比如ansys模型中的参数和matlab
程序中参数的一致性问题等。这时可以考虑采用下面的协同工作的方法。
解决的方法:
1. 采用matlab作为主控程序,设置好所有的参数与选项传递给ansys(通过文件)
并调用ansys计算。
2. ansys计算结束后(默认情况下,matlab会自己等着,这一点很方便,呵呵)
再用matlab处理ansys的输出文件。由于所有的设置可以在matlab中统一完成,省去很多参数同步
的工作,也顺便实现了计算的自动化。呵呵。。。
核心提示:
1.如何使用matlab调用ansys,下面是个例子
!"D:\Program Files\Ansys Inc\v100\ANSYS\bin\intel\ansys100.exe" -b -i d:\inp\vm1.mac -o "d:\out put\1.txt"
! 是由matlab提供的用以执行shell命令的操作符(也可以用system或dos命令)
参数 -b指定使用batch方式运行ansys,-i 指定输入文件,-o指定输出文件。这里有一点值得注
意的是,这里的输出文件是指在gui方式运行是output windows中的输出内容,通常不是我们想要
的结果文件。
2.我们想要的ansys结果可以通过*vwrite,*mwrite等命令写入文件,以供matlab使用。
3.想要matlab传递给ansys的参数,也通过文件方式传递。(不知哪位大侠有其他的方法,请不吝
赐教!)
下面给出一个matlab调用ansys求解H2范数的例子 :
%matlab和ansys协同工作
clear all;
e_num=25; %杆件总数
B=(1:e_num);
X=combnk(B,3);
N=size(X,1);
Gama=zeros(1,N); %分离系数初始化
for i=1:4
fid = fopen('flag.txt','wt');
fprintf(fid,'m m m\n',X(i,1),X(i,2),X(i,3));
fclose(fid);
!"C:\Program Files\Ansys Inc\v100\ANSYS\bin\intel\ansys100.exe
" -b -i C:\hangjia_25_V.mac -o "C:\1.txt" %调用ansys计算程序
%H2范数
format long;
K0=load('SMATR.txt');
M0=load('MMATR.txt');
C0=load('CMATR.txt');
E=2.06e11;
A=5.48e-3;
L=1.0;
K0=E*A/L*K0;
C0=1e5*C0;
[Nrow Ncol]=size(K0);
Z=zeros(Nrow,Ncol);
I=eye(Nrow,Ncol);
A=[Z I;-K0/M0 -C0/M0];
B=[Z;I/M0];
C=[I Z];
R=B*B';
[D p]=chol(R);
if p>0
if real(eig(A))<0
Q=lyap(A,R);
h22=sqrt(trace(C*Q*C'));
h2=3.123592886516603e-006;
Gama(i)=(h22-h2)/h2;
else
Gama(i)=-1;
end
else
Gama(i)=-1;
end
end
fid0 = fopen('result.txt','wt');
for i=1:N
fprintf(fid0,'m m m m .5f\n',i,X(i,1),X(i,2),X(i,3),Gama(i));
end
fclose(fid0);
利用APDL功能按照一定格式写出ansys数据文件的方法
ANSYS在运行阶段总是处理大量的模型数据、载荷数据以及结果数据等,有时需要将这些数据按照一定
的格式写进指定的数据文件中,这时可以利用*GET和*VGET数据提取的各种命令将数据存入到变量或数
组中,然后利用*CFWRITE或*VWRITE命令写入到指定文件.下面是使用*VWRITE实现该过程的一个实例:
/post1
set,,,,,10.0
*get,ntemp01,node,2,temp ! 时间等于10时的节点2的温度值
*get,ntemp02,node,9,temp ! 时间等于10时的节点9的温度值
*get,ntemp03,node,7,temp ! 时间等于10时的节点7的温度值
*vwrite,ntemp01,ntemp02,ntemp03
(T1,''N2 TEMP='',F5.1,'', N9 TEMP='',F5.1,'', N7 TEMP='',F5.1)
/output,nodetemp,dat
其中,命令/output可以用于确定输出方向,即输出到ansys的输出窗口(OUTPUT WINDOW)中,
或者指定的文件中。上面将温度值输出到nodetemp.dat文件中,内容如下:
N2 TEMP= 19.2, N9 TEMP= 19.8, N7 TEMP= 20.8
这样就可以对输出数据用别的工具进行处理。
如何实现ansys倒退功能undo,并添加toolbar模式
首先用命令/undo,on激活undo命令
然后在MenuCtrls中的Edit Toolbar....中输入:*ABBR, UNDO, undo
即可添加undo命令的快捷方式。然后Save Toolbar.
这对于喜欢gui方式的朋友可能有些用处。
注意:
激活UNDO命令后,ANSYS求解运行时会变慢,可能正是因为这样,所以ANSYS公司没有把这个命令
激活!这是专门做二次开发的一位网友告诉我的。所以,建议大家最好还是将这个命令关闭。
将ANSYS作为子程序调用
对于优化或参数化设计,可以在VC或FORTRAN中将ANSYS作为子程序调用。具体调用方法如下:
1.在VC中调用ANSYS
::WinExec("d:/ANSYS57/BIN/INTEL/ANSYS57 -b -p ansys_product_feature -i input_file -o output_file",SW_SHOWNORMAL);
2.在FORTRAN中调用ANSYS
LOGICAL(4) result
RESULT=SYSTEMQQ('d:\ANSYS57\BIN\INTEL\ANSYS57 -b -p
ansys_product_feature -i input_file -o output_file')
3.说明
1和2中,input_file为用APDL语言编写的ANSYS输入文件。
ansys_product_feature为你的ANSYS产品特征代码。
需要注意的是,在VC中调用ANSYS时,需要加一条判断语句,以确定ANSYS
已经执行完毕。在FORTRAN中不需要判断,FORTRAN会等ANSYS执行完毕才继续执行下一条语句。在VC中,我没有
找到与FORTRAN类似的函数,只好加一条循环判断语句。
判断方法很简单,只需判断错误文件file.err是否可写就可以了。因为当ANSYS在运行时,file.err是不可写的,只有当它运行完毕,此文件才可写。
数据文件(假设输出的数据文件名为opt.out):
*dim,out1,,2,1
out1(1)=dmax !目标函数
out1(2)=1-eymax !约束条件1
*cfopen,opt,out
*vwrite,out1(1),out1(2)
(2f10.6)
*cfclos
在VC中相应的显示数据文件命令为:
result=system("notepad opt.out");
图形文件(假设ANSYS工作文件名为test,输出jpg图形文件,具体信息请参考命令/show):
/SHOW,JPEG
JPEG,QUAL,75,
JPEG,ORIENT,HORIZ
JPEG,COLOR,2
JPEG,TMOD,1
/GFILE,600,
!*
plns,uy
/SHOW,TERM
在VC中相应的显示图形文件命令为:
result=system("mspaint test001.jpg");
**************************************************************************************
VC调用ANSYS的示例程序。
file://Test.cpp
#include "stdio.h"
#include"process.h"
void main()
{
int result;
printf("Solving...");
result=system("d:/ANSYS57/BIN/INTEL/ANSYS57 -b -p ansysul -i test.txt -o test.out");
file://不用::WinExec,就用不着等待语句,可以实现用FORTRAN调用一样的效果。
printf("Solution finished...");
}
怎么还不知道?那个特征表找着没有?ANSYS帮助->ANSYS,INC.Licensing Guide->License files->What are License files->Product feature Table
以第一行为例:ANSYS/MULTIPHYSICS ane3fl
ANSYS/MULTIPHYSICS是产品特征名称,ane3fl是与其对应的产品特征代码,把这个代码填到下面的语句中:
result=system("d:/ANSYS57/BIN/INTEL/ANSYS57 -b -p ane3fl -i test.txt -o test.out");
VC中的变量与APDL语言中的变量可以进行数据交换,否则怎么实现参数化或优化设计?
不过不能直接互换.我采用的办法是,在VC中将变量结果写到一个文件中,然后再在ANSYS的APDL语言文件中读入这个文件的数据,再由ANSYS进行新的计算,计算结束之后,再由后处理处理结果,并将结果数据输出到一个文件中,然后用VC读入此文件中的数据,进行下一步处理.
复杂几何模型的系列网格划分技术
众所周知,对于有限元分析来说,网格划分是其中最关键的一个步骤,网格划分的好坏直接影响到解算的精度和速度。在ANSYS中,大家知道,网格划分有三个步骤:定义单元属性(包括实常数)、在几何模型上定义网格属性、划分网格。在这里,我们仅对网格划分这个步骤所涉及到的一些问题,尤其是与复杂模型相关的一些问题作简要阐述。
一、 自由网格划分
自由网格划分是自动化程度最高的网格划分技术之一,它在面上(平面、曲面)可以自动生成三角形或四边形网格,在体上自动生成四面体网格。通常情况下,可利用ANSYS的智能尺寸控制技术(SMARTSIZE命令)来自动控制网格的大小和疏密分布,也可进行人工设置网格的大小(AESIZE、LESIZE、KESIZE、ESIZE等系列命令)并控制疏密分布以及选择分网算法等(MOPT命令)。对于复杂几何模型而言,这种分网方法省时省力,但缺点是单元数量通常会很大,计算效率降低。同时,由于这种方法对于三维复杂模型只能生成四面体单元,为了获得较好的计算精度,建议采用二次四面体单元(92号单元)。如果选用的是六面体单元,则此方法自动将六面体单元退化为阶次一致的四面体单元,因此,最好不要选用线性的六面体单元(没有中间节点,比如45号单元),因为该单元退化后为线性的四面体单元,具有过刚的刚度,计算精度较差;如果选用二次的六面体单元(比如95号单元),由于其是退化形式,节点数与其六面体原型单元一致,只是有多个节点在同一位置而已,因此,可以利用TCHG命令将模型中的退化形式的四面体单元变化为非退化的四面体单元,减少每个单元的节点数量,提高求解效率。在有些情况下,必须要用六面体单元的退化形式来进行自由网格划分,比如,在进行混合网格划分(后面详述)时,只有用六面体单元才能形成金字塔过渡单元。对于计算流体力学和考虑集肤效应的电磁场分析而言,自由网格划分中的层网格功能(由LESIZE命令的LAYER1和LAYER2域控制)是非常有用的。
二、 映射网格划分
映射网格划分是对规整模型的一种规整网格划分方法,其原始概念是:对于面,只能是四边形面,网格划分数需在对边上保持一致,形成的单元全部为四边形;对于体,只能是六面体,对应线和面的网格划分数保持一致;形成的单元全