第一篇:ABAQUS与FORTRAN论坛问题小结
ABAQUS与FORTRAN论坛问题小结
Q:索了一下论坛发现以前的问题都是不同类型的子程序,如UEL, UMAT...这样把它们放在一个.for文件里不会有误会,但是如果都是UEL的话,该怎么识别呢? A:subroutine Umat()IF(CMNAME(1:4).EQ.'MAT1')THENCALL UMAT_MAT1(argument_list)ELSE IF(CMNAME(1:4).EQ.'MAT2')THENCALL UMAT_MAT2(argument_list)END IF上面是区分不同umat的方法,区分uel应该类似吧
Q:行abaqus的时候出现这样的提示“Problem during compilation-df.exe not found in PATH.”请问这是什么原因.A: 就是说找不到用于编译的df.exe文件(好像是Fortran的编译运行文件),在Windows控制面板的“系统”里,打开高级属性,将系统的PATH添加上Fortran的路径,最好也一并把INCLUDE和LIB也都添加上对应的FORTRAN的路径。
Q: 如何在ABAQUS中调用用户子程序UMAT
A:abaqus job=*** user=*.for or *.objA: 装好fortran编译器的前提下,有两种方式:
1、命令行:abaqus job=*.inp user=*.for或 abaqus job=*.inp user=*.obj(可以由*.f90编译后得到)
2、菜单格式:先运行CAE,在general设置中可以指定Umat用户子程序A: job=jobname user=yourfortran.for(其它类型子程序)A:如果是本构的二次开发:*material, user
Q: abaqus job=job-name user={source-file | object-file}source-file和object-file各是什么? A: fortran的源文件(.for)或者目标文件(.o)在command下面输入以上命令行就可以正常运行.用户子程序再调用别的fortran程序时,要加入abaqus 子程序中的include 'ABA_PARAM.INC'。
Q: 自己编写子程序需要哪些工作步骤 A: 1.建立工作目录
2.将abaqus安装目录6.4-pr11site下的aba_param_dp.inc 或 aba_param_sp.inc拷贝到工作目录,并改名为aba_param.inc ; 3.将编好的fortran程序拷贝到工作目录; 4.编译fortran程序,将.obj文件拷贝到工作目录; 5.建立好输入文件.inp;6.运行abaqus job=inp file name user=fortan name即可。我的要运行abq64pr11 job=inp file name user=fortan name我也学了没多久,按照这个过程成功了一个!你们试一下吧!Q: 想用FORTRAN实现:...result = SYSTEMQQ('abq job=e:abaqu***amplesbeam interactive')...出错提示:ABAQUS ERROR:Unable to create a temporary directory C:DOCUME~1ADMINI~1LOCALS~1TEMPAdministrato_ e:abaqu***amplesbeam_3628 to be used for scratch files.ABAQUS/Analysis exited with errors.但如果是 result = SYSTEMQQ('abq job=beam interactive'),但需要在FORTRAN弹出的DOS窗口里手工输入文件的绝对路径则计算正常。但我的目的是实现Fortran程序对ABAQUS的计算程序的自动调用。
A: 说个投机的花招,有没有试过在前面加上result = SYSTEMQQ('path=e:/abaqu***amples')这样的命令~~方法简单,不过能解决问题最好
A:把要算的工况都集中在一个文件夹下,fortran生成.exe文件,放在该文件夹下,然后双击运行。计算结束之后再把各种工况分类。笨招,但好用。
A: 我想,或者把systemQQ改一下,先cd e:...,然后再systemQQ(abaqus job=jobname interactive)。
Q: 偶想在FORTRAN里设定一个计时器,其功能就是每隔一段时间(如10s)就去读一次ABAQUS的(.fil)文件。哪个函数可以实现这个功能?怎么实现?? A: 通过一个while循环和下面的语句:call sleepqq(时间间隔)就可以了。
Q: 本人尝试使用ABAQUS的子程序SUBROUTINE,根据帮助文件需要编译通过生成*.for和*.lib文件,可是编译的时候出现错误:Error: Cannot open include file 'ABA_PARAM.INC'不知道是什么原因,怎么解决?
A: 1.确认Visual Fortran及VC++正确安装,并在安装ABAQUS之前安装。2.首先将用户子程序*.f文件后缀名改为*.for。3.到控制面板-》系统-》高级-》环境变量中的 Administrator用户变量:修改—— 变量名:lib变量值:C:Program FilesMicrosoft Visual StudioDF98LIB;C:Program FilesMicrosoft Visual StudioVC98LIB(我的问题就是因为只加了一个LIB,必须两个都加!)完成以上步骤以后,就可以运行了。
Q: 怎样把自己编写的子程序倒入到*.INP文件中。
A: Using the following command : abaqus job=job-id As can be seen this is no different from running a standard abaqus job.The user subroutine itself can be embedded in the abaqus input file.Here it is illustrated with the umat subroutine.<....part of the abaqus input file....>
........*END STEP*USER SUBROUTINES SUBROUTINE UMAT(........)
........END
........Alternatively the user subroutine can be in a separate file(say my_material.f)and the INPUT parameter is set to that file name.<....part of the abaqus input file....>
........*USER SUBROUTINES, INPUT=my_material.f
........Q: 用Fortran SYSTEMQQ函数作批处理遇到问题,在fortran中使用result = systemqq(abaqus job=job1 interactive)作批处理,总是在计算两个job之后就不继续往下算了,cmd明令行提示:run time error:floating-point...请问这是怎么回事?
A: 个方法就是做一个批处理文件,abaqus job=beam interactiveabaqus job=beam1 interactiveabaqus job=beam2 interactiveabaqus job=beam n? interactive存为.bat文件即可。python好像一般是做CAE前后处理界面的。
A:前面加call.call abaqus job=1 interactivecall abaqus job=2 interactivecall abaqus job=3 interactive
Q:FORTRAN如何调用ABAQUS?
A: use the function “system” or “systemqq” USE DFLIB LOGICAL(4)result result = SYSTEMQQ('abaqus job=xx')QA: 首先我用ABAQUS的VARIFY命令对系统进行修正和检测,这个命令会自动运行,对ABAQUS进行调试等操作,其中涉及到对用户子程序的模拟计算,如果计算失败,就会在VARIFY.LOG文件中说明,确实发现“USER SUBROUTINE...和SINGLE...和DOUBLE...”失败,说明用户子程序安装不成功,肯定与VISUAL FORTRAN6.5有关!然后,找到FORTRAN_MAKE文本文件,发现错误,可能是与FORTRAN安装有关!于是卸载FORTRAN,重新安装在C盘!安装完毕后,改变环境变量如下: INCLUDE C:Program FilesMicrosoft Visual StudioDF98IMSLINCLUDE;C:Program FilesMicrosoft Visual StudioVC98INCLUDE;D:程序文件VC98INCLUDE;LIB C:Program FilesMicrosoft Visual StudioDF98IMSLLIB;C:Program FilesMicrosoft Visual StudioDF98LIB;C:Program FilesMicrosoft Visual StudioVC98LIB;D:程序文件VC98LIB;PATH C:Program FilesMicrosoft Visual StudioCommonTools;D:程序文件VC98BIN;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;C:KAV6;D:程序文件KV6;c:program filesmicrosoft visual studiodf98bin;c:program filesmicrosoft visual studiovc98bin;c:program filesmicrosoft visual studiocommonmsdev98bin;D:ABAQUSCommands;C:Program FilesMicrosoft Visual StudioDF98BIN我们只需要关注MICROSOFT VISUAL STUDIO文件夹!最后,再次执行VARIFY命令,等运行完毕后,检查VARIFY文本文件,发现: ABAQUS/Standard with User Subroutines...PASSContinuing...ABAQUS/Explicit with User Subroutines(single precision)...PASSContinuing...ABAQUS/Explicit with User Subroutines(double precision)...PASSContinuing...OK!!!!!!!!!搞定
Q: 因为ABAQUS是用PYTHON编写的,那么我想要PYTHON 的原代码,因为我想 在其中加一个椭圆程序,不知可行么?(访问原代码问题)
A: 所有的PY都是差不多一样的,把ABAQUS的PY拿到MARC试试看
文档来源:http://www.xiexiebang.com/bbs/redirect.php?fid=10&tid=9031&goto=nextnewset
第二篇:Abaqus遇到的问题小结
Abaqus遇到的问题小结
1.Abaqus量纲系统(SI):m、N、Kg、s、Pa、J、Kg/m。
2.有限元单元类型(Element Type):实体单元、壳单元、杆件单元(梁Beam、桁架Truss)3.Abaqus怎样将部件的不同部分设定为不同的子集?
3tools >partition cell/plane(如果是要分层使用,则进行分割,分别赋予不同的属性;或者对其中的单元进行设置Set;如果要在运算中替换则需要在关键词里添加语句定义)
4.建模的过程中输入的尺寸被自动降低精度(四舍五入),请问如何设置尺寸精度(小数点位数)?
在 sketch option里打开sketch模块(左下角最下面)打开sketchoption对话框,其中decimal places 表示小数点位数,默认为2,最高能调到6。
5.abaqus中出现,Dependent partinstancesconnot be edited,怎么办?
mesh on part , mesh on instance一个非独立实体只是原始部件的一个指针,可以对原始部件划分网格,但是不能对一个非独立实体划分网格,即mesh on part。
方法:左边模型树里面,Assembly->instances里面的子选项右击,点Make independent;或者点击model旁边的Part,对part进行网格划分。
6.材料属性中拉伸强度和压缩强度怎么定义?
计算结果有每个计算节点的应力,计算中用不到强度值(弹性力学三组基本方程不涉及强度,求解过程用不到)。(强度值是用来校核的:断裂,屈服或超过线性变形)
7.如何选择创建独立实体还是非独立实体?
如果集合中包含许多具有相同性质的部件,则创建非独立实体(Dependent)。反之,如果集合中包含许多不同性质的部件,则创建独立实体(Independent)要有优势些。
8.地基土的分层问题?
方法1:定义为一个part,然后partition分层赋材料属性,不需要设置接触。(超级赞!!)方法2:使用多个part,每个part单独定义属性。一般不用设置一些tie,各层间只有弹性模量相差较大时再在各层间定义tie。
9.tie捆绑约束。
tie功能很强大,可以模拟实体与实体,实体与壳体,壳体和壳体的连接,而且允许连接对象之间有距离。
在tie面板中,Position Tolerance位置容差是一个重要的参数。一般选择默认设置usecomputed default,abaqus会根据你要tie的对象的网格尺寸,自动选取个容差值,一般为网格基本尺寸5%。于是,连接对象之间,距离小于这5%容差值的节点便施加tie约束,也就是对应的两节点的自由度拥有一样的数值。
如果连接对象之间有距离怎么办?若还是用usecomputed default,则是无法起到tie约束效果的。这就要手动设置specify distance为一个适合的参数。这个值要大于连接对象对应节点之间的距离。若不是很确定,可以先设一个较大的值,计算完后在Visualization调出Node sets,观察tie实际起作用的节点区域。再对specify distance值进行调整。
在使用specify distance,需将Adjust slave surface initial position选项取消。否则abaqus会将两连接对象拉近,网格产生畸变,产生错误,中止计算!
10.abaqus怎么将模型分割画网格?
划分模型的时候有全局划分网格按钮,旁边有个局部划分网格按钮,(经常要用到partition技术),点它给需要另外划分的部分部种子,然后下面有按区域划分网格。全局划分网格和局部划分网格分别是mesh part和mesh region。
网格划分完毕之后,最好在verify中对其中质量不好的单元进行编辑处理,避免在job模块里面出现错误或警告信息。
11.边界条件设置在初始步还是后续的分析步中?
设置在initial。
12.interaction面选择不上?
在此模块里面,一般先定义相应的surfaces,并分别赋予有意义的容易识别的名字,如slavesurface、master surface,并选择接触面的正确方向,如果方向选择错误的话,经常在job模块中会出现无法收敛的错误信息。
13.通过ABAQUS计算得出的应力值不连续是什么原因造成的?
这主要是因为ABAQUS的应力和应变等单元变量值(相对位移等节点变量)的计算方式所引起的 这些单元变量值主要是通过单元内的高斯积分点计算得出,然后再通过外插值法计算出节点上的应力应变值,因此对于两个相邻单元共同占用的节点,从两个单元外插得出的值有时是不一样的。对于大多情况.如果网格足够密,高斯积分点上的值不会相差很大.所以可得到一个连续性比较好的结果另外可以通过设定平均值的临界值来决定contour的连续性(即legend下默认的75%)。比如说,如果同一节点扶不同单元得出的外插值相差75%以下(即较大的外插值减去较小的外插值的差乘以大值),那么contour输出这两个值的平均值。
同时需要注意的是,这个默认的75% 可以修改,如果设为0%.那么整个contour的单元间几乎都不连续,如果设在100%,那么整个图肯定是连续的。此外,还可以通过设定legend下的limit方式(即外插值或者是平均值)来控制最后的结果。
14.平衡地应力是出现An initial condition has been specified on element 0 but thiselement has not been defined?
是因为修改inp文件时,文件中有未删除的空行。
15.土体初始地应力平衡方法。
地应力平衡原理:平衡原理和屈服条件。目的:为了使数值模拟获得一个存在初始应力,而无初始应变的状态。
平衡地应力方法:
1.Autobanlance 2.*Initial Conditions,type=stress,Geostatic;(关键字定义初始地应力,只适合土体表面水平的土体,该方法需给出不同材料区域的最高和最低点的自重应力及其相应坐标)
3.*Initial Conditions,type=stress,input=xxx.csv;(初始地应力提取法,此方法最为通用,可用于不同材料、不同地形,适应性强。)
方法3的具体步骤: i.ii.iii.iv.v.在Abaqus中建立完整的模型,定义部件、截面属性、装配件、网格、边界条件等。单元类型使用的默认的线性缩减积分单元C3D8R。
在Step功能模块中创建分析步,将类型设为Geostatic。在Load功能模块中,为整个土体定义重力载荷(类型为Geostatic),并在Component3中输入-9.8。
在命令行输入:mdb.models['Model-1'].setValues(noPartsInputFile=ON);在Job模块中创建名为Job-NoInitialCondition的分析作业,提交分析。
将分析得到的应力场保存为一个文本文件。具体的方法为:打开分析得到的ODB文件Job-NoInitialCondition.odb,选择菜单Report---FieldOutput,选中Variable对话框中积分点上的各个应力分量(S11、S22、S33、S12、S13、S23);在Setup标签页,创建inp输出文件,并命名为XX.inp,不选Append to file和Column total 和column min/max。
用Excel修改输出的XX.Inp文件,删除inp文件中的所有叙述性文字和空格(例如若土体有N层,需找出N-1处文字性叙述的地方并删除),只保留数字结果,将数字间在顺序不变的前提下用逗号隔开,保存成csv以逗号隔开的文件形式XXX.csv。vi.vii.viii.为模型定义初始应力场。因在Abaqus中无法直接定义初始应力,只能手工添加关键词,具体做法:选中菜单Model---Edit Keywords,在*Boundary语句之后,*Step语句之前添加语句*Initial Conditions,type=stress,input=XXX.csv 在Job功能模块中定义Job-WithInitialCondition作业,提交分析,即得到所需要的结果。
16.Part模块建立刚体时一定要指定参考点referencepoint,在后面分析过程中的位移、载荷的施加都在施加在此参考点上的。刚体只有平动和转动,不会有变形,因此参考点的选择即可以在建立的rigid part上,也可以建立在其他你觉得方便的位置。
17.load模块,是施加载荷和位移边界条件的,先对要施加载荷和边界条件的面、线、节点等建立set,再对相应sets分别设置。在施加载荷的时候,注意载荷的方向性,另外此模块也可以施加自定义载荷、predifined field等。
18.abaqus结果显示时数据太小看不清楚怎么办?
Viewport-->Viewport Annotation Options..在出来的对话框中选择“Legend”标签,然后点击“Set Front...” 之后选择字体大小,确认。
BY
HIT-WGJ
第三篇:ABAQUS单元小结
ABAQUS单元小结
1、单元表征
单元族:单元名字里开始的字母标志着这种单元属于哪一个单元族。C3D8I是实体单元; S4R是壳单元; CINPE4是无限元; 梁单元; 刚体单元; 膜单元;
特殊目的单元,例如弹簧,粘壶和质量; 桁架单元。
自由度dof(和单元族直接相关):每一节点处的平动和转动 1 1方向的平动 2 2方向的平动 3 3方向的平动 4 绕1轴的转动 5 绕2轴的转动 6 绕3轴的转动 开口截面梁单元的翘曲 8 声压或孔隙压力 9 电势 度(或物质扩散分析中归一化浓度)12+梁和壳厚度上其它点的温度 轴对称单元 r方向的平动 2 z方向的平动 6 r-z方向的转动
节点数:决定单元插值的阶数
数学描述:定义单元行为的数学理论
积分:应用数值方法在每一单元的体积上对不同的变量进行积分。大部分单元采用高斯积分方法计算单元内每一高斯点处的材料响应。单元末尾用字母“R”识别减缩积分单元,否则是全积分单元。
ABAQUS拥有广泛适用于结构应用的庞大单元库。单元类型的选择对模拟计算的精度和效率有重大的影响;
节点的有效自由度依赖于此节点所在的单元类型;
单元的名字完整地标明了单元族、单元的数学描述、节点数及积分类型; 所用的单元都必须指定单元性质选项。单元性质选项不仅用来提供定义单元几何形状的附加数据,而且用来识别相关的材料性质定义;
对于实体单元,ABAQUS参考整体笛卡尔坐标系来定义单元的输出变量,如应力和应变。可以用*ORIENTATION选项将整体坐标系改为局部坐标系;
对于三维壳单元,ABAQUS参考建立在壳表面上的一个坐标系来定义单元的输出变量。可以用*ORIENTATION选项更改这个参考坐标系。2.实体单元(C)实体单元可在其任何表面与其他单元连接起来。C3D:三维单元
CAX:无扭曲轴对称单元,模拟3600的环,用于分析受轴对称载荷作用,具有轴对称几何形状的结构;
CPE:平面应变单元,假定离面应变ε33为零,用力模拟厚结构; CPS:平面应力单元,假定离面应力σ33为零,用力模拟薄结构; 广义平面应变单元包括附加的推广:离面应变可以随着模型平面内的位置线性变化。这种数学描述特别适合于厚截面的热应力分析。
可以扭曲的轴对称单元:用来模拟初始时为轴对称的几何形状,且能沿对称轴发生扭曲。这些单元对于模拟圆柱形结构,例如轴对称橡胶套管的扭转很有用。
反对称单元的轴对称单元:用来模拟初始为轴对称几何形状的反对称变形。适合于模拟像承受剪切载荷作用的轴对称橡胶支座一类的问题。
如果不需要模拟非常大的应变或进行一个复杂的,改变接触条件的问题,则应采用二次减缩积分单元(CAX8R,CPE8R,CPS8R,C3D20R)
如果存在应力集中,则应在局部采用二次完全积分单元(CAX8,CPE8,CPS8,C3D20等)。
对含有非常大的网格扭曲模拟(大应变分析),采用细网格划分的线性减缩积分单元(CAX4R,CPE4R,CPS4R,C3D8R等)
对接触问题采用线性减缩积分单元或非协调元(CAX4I,CPE4I,CPS4I, C3D8I)的细网格划分。
如果在模型中采用非协调元应使网格扭曲减至最小。三维情况应尽可能采用块状单元(六面体)。当几何形状复杂时,完全采用块体单元构造网格会很困难,因此可能有必要采用稧形和四面体单元,但尽量少用,并远离需要精确求解的区域。
一些前处理程序包括网格划分方法,它们可用四面体单元构造任意形状的网格。只要采用二次四面体单元(C3D10),其结果对小位移问题应该是合理的。
小结:
在实体单元中所用的数学公式和积分阶数对分析的精度和花费有显著的影响;
使用完全积分单元,尤其是一阶(线性)单元,容易形成自锁现象,正常情况不用;
一阶减缩积分单元容易出现沙漏现象;充分的单元细化可减小这种问题; 在分析中如有弯曲位移,且采用一阶减缩积分单元时,应在厚度方向至少用4个单元;
沙漏现象在二阶减缩积分单元中较少见,一般问题应考虑应用这些单元; 非协调单元的精度依赖于单元扭曲的量值;
结果的数值精度依赖于所用的网格,应进行网格细化研究以确保该网格对问题提供了唯一的解答。但是应记住使用一个收敛网格不能保证计算结果与问题的实际行为相匹配:它还依赖于模型其他方面的近似化和理想化程度;
通常只在想要得到精确结果的区域细划网格; ABAQUS具有一些先进特点如子模型,它可以帮助对复杂模拟得到有用的结果。
3.壳单元(S)可以模拟有一维尺寸(厚度)远小于另外两维尺寸,且垂直于厚度方向的应力可以忽略的结构。
一般壳单元:S4R,S3R,SAX1,SAX2,SAX2T。对于薄壳和厚壳问题的应用均有效,且考虑了有限薄膜应变;
薄壳单元:STRI3,STRI35,STRI65,S4R5,S8R5,S9R5,SAXA。强化了基尔霍夫条件,即:垂直于壳中截面的平面保持垂直于中截面;
厚壳单元:S8R,S8RT。二阶四边形单元,在小应变和载荷使计算结果沿壳的跨度方向上平缓变化的情况下,比普通单元产生的结果更精确;
对于给定的应用,判断是属于薄壳还是厚壳问题,一般:如果单一材料制造的各向同性壳体的厚度和跨度之比在1/20-1/10之间,认为是厚壳问题;如果比值小于1/30,则认为是薄壳问题;若介于1/30-1/20之间,则不能明确划分。由于横向剪切柔度在复合材料层合壳结构中作用显著,故比值(厚跨比)将远小于“薄”壳理论中采用的比值。具有高柔韧中间层的复合材料(“三明治”复合材料)有很低的横向剪切刚度并且几乎总是被用来模拟“厚”壳;
横向剪切力和剪切应变存在于普通壳单元和厚壳单元中。对于三维单元,提供了可估计的横向剪切应力。计算这些应力时忽略了弯曲和扭转变形的耦合作用,并假定材料性质和弯曲力矩的空间梯度很小;
壳单元可以使用每个单元的局部材料方向,各项异型材料的数据,如纤维增强复合材料,以及单元输出变量,如应力和应变,都按局部材料方向而定义。在大位移分析中,壳单元上的局部材料轴随着材料各积分点上的平均运动而转动;
线性、有限薄膜应变、四边形壳单元(S4R)是较完备的而且适合于普通范围的应用;
线性、有限薄膜应变、三角形壳单元(S3R)可作为通用的壳单元来应用。由于在单元内部近似为应变场,精细的网格划分可用于求解弯曲变形和高应变梯度;
考虑到在复合材料层合壳模型中剪切柔度的影响,将采用“厚”壳单元(S4R,S3R,S8R)
四边形或三角形的二次壳单元,用于一般的小变形薄壳是很有效的。它们对剪力自锁和薄膜锁死是不敏感的;
在接触模拟中不用选用二阶三角形壳单元(STRI65),要采用9节点的四边形壳单元(S9R5);对于仅经历几何线性行为的非常大的模型,线性、薄壳单元(S4R5)一般将比通用壳单元花费更少;
小结:
壳单元的横截面特性可以由沿厚度方向的数值积分确定(*SHELL SECTION),或在分析开始时应用计算的横截面刚度(*SHELL GENERAL SECTION);
*SHELL GENERAL SECTION是非常有效的,但仅用于线性材料,*SHELL SECTION可用于线性和非线性材料;
数值积分在沿壳厚度方向的一系列积分点上进行。这些积分点就是单元变量可以被输出的位置。最外层的积分点位于壳单元的表面。
壳单元法线方向决定了单元的正和负表面,为了正确地定义接触和解释输出数据,必须知道其对应的是哪个面。壳法线还定义了施加在单元上正压力载荷的方向,并可以在ABAQUS/Post中画出;
壳单元利用材料方向局部化到每个单元。在大位移分析中,局部材料轴随单元而转动。*ORIENTATION被用来定义非默认的局部坐标系统。单元的变量,如应力和应变,在局部方向输出;
*TRANSFORM定义节点的局部坐标系,集中载荷和边界条件被应用在局部坐标系中。所用节点的输出,如位移,也默认为基于局部的坐标系;
矢量图可以使模拟结果可视化,特别是用来观察结构的运动和载荷路径。
4.梁单元(B)
模拟一维尺寸(长度)远大于另外二维尺寸的构件,且只有长度方向上的应力比较显著。
对于包含接触的任何模拟,应使用一阶、剪切变形的梁单元(B21,B31)如果结构刚度非常大或者非常柔软,在几何非线性模拟中应当使用杂交梁单元(B21H,B32H,等)
使用欧拉-伯努利(三次)梁单元(B23,B33)精度很高,可模拟承受分布载荷作用的梁,例如动态振动分析。如果横向剪切变形也很重要,要使用铁摩辛柯(二次型)梁单元(B22,B32)
模拟有开口薄壁横截面的结构,应当使用考虑了开口截面翘曲理论的梁单元(B31OS,B32OS)
小结:
梁单元的性质由截面(*BEAM SECTION或*BEAM GENERAL SECTION)的数值积分决定,或直接给出截面积、惯性矩和扭转常数(*BEAM GENERAL SECTION);
当使用*BEAM GENERAL SECTION选项时,模拟开始时进行一次数值积分,并且假定材料是弹性的;
ABAQUS包括大量的标准横截面形状。其它形状可以通过定义SECTION=ARBITRARY来模拟;
必须定义横截面取向,方法是通过给出第三个节点,或者在单元性质定义中定义一个矢量。截面取向在ABAQUS后处理中可以画出;
当梁作为壳的加强构件使用时,梁的横截面可能偏离节点;
线性和二次型包含剪切变形的影响,三次型梁不考虑剪切柔度。开口截面梁准确地模拟了扭转和薄壁开口截面翘曲(包括翘曲约束)的影响;
多点约束和约束方程可以用来连接模型中铰接、刚性连接等节点的自由度;
“弯矩”型图使得像梁这样的一维单元的结果很清楚地表示出来; ABAQUS后处理图的硬拷贝可以得到PostScript和HPGL的格式。
5.桁架单元(T)
只能承受拉伸和压缩载荷的杆,不能承受弯曲,模拟铰接框架结构,近似模拟线缆和弹簧。
6.刚体单元(R)
没有独立的自由度。7.非线性分析
小结:
结构问题中存在着三种非线性来源:材料、几何和边界(接触)。这些因素的任意组合都可以出现在ABAQUS的分析中;
几何非线性发生在位移量值影响结构响应的情况下。这包括大位移和转动效应、突然翻转和载荷硬化;
非线性问题是利用牛顿-拉弗森方法来进行迭代求解的。非线性问题比线性问题所需要的计算机资源要高许多倍;
非线性分析步被分为许多增量步。ABAQUS通过迭代,在新的载荷增量结束时近似地达到静力学平衡。ABAQUS在整个模拟计算中完全控制载荷的增量和收敛性;
状态文件允许在分析运行时监控分析过程的进展。信息文件包含了载荷增量和迭代过程的详细信息;
在每个增量步结束时可以保存计算结果,这样结构响应的演化就可以用ABAQUS/Post显示出来。计算结果也可以用x-y图的形式绘出。
8.材料
小结:
ABAQUS包含一个广泛的材料库,可模拟各种工程材料的性质。其中包括金属塑性和橡胶弹性模型;
金属塑性模型的应力-应变数据必须用真实应变定义; 金属塑性模型假定材料具有一旦屈服即不可压缩的性质。这将对应用于弹-塑性模拟的单元类型带来某些限制;
多项式和奥根应变能函数可应用于橡胶材料的弹性(超弹性)。两种模型均允许直接用实验数据来确定材料的系数。实验数据必须是名义应力和名义应变的值;
在超弹性材料模型中的稳定性警告,说明所要分析的应变范围不合适; 存在对称性时,可以只考虑部分模型从而减小模拟的尺寸。可通过施加适当的边界条件来反映结构其余部分的效应;
大畸变问题的网格设计比小位移问题更加困难。在分析的任何阶段,网格中的单元务必不能过于畸变;
ABAQUS/Post中的*DEFINE CURVE命令允许处理曲线上的数据以生成新的曲线。两条曲线或一条曲线与一个常数可以加、减、乘、除。曲线还可以求导、积分和合并。
9.动态问题
具有下列特征的问题适于采用线性瞬态动力学分析:
系统是线性的:线性材料行为,无接触条件,无非线性的几何效应; 响应只受较少的频率支配。当响应中各频率成分增加时,例如撞击和冲击情况,振型叠加方法的效果将大大降低;
载荷的主要频率在可得到的固有频率范围内,以确保对载荷的描述足够精确;
由于任何突然加载所产生的初始加速度能用特征模型精确描述; 对系统的阻尼不能过大。小结:
动态分析包括结构的惯性效应;
*FREQUENCY可以计算结构的固有频率和振型;
通过振型叠加,可以确定线性系统的动态响应。这一方法尽管有效,但是不能用于非线性问题;
线性动态过程可以计算瞬态载荷的瞬态响应、谐振动下的稳态响应、支座移动造成的响应峰值和随机载荷的响应;
为了准确表示结构的动态行为,必须选择足够多的振型。总的等效模型质量应占可动质量的90%以上;
用户可以给定直接模态阻尼、瑞利阻尼和复合模态阻尼。但是由于固有频率和振型的计算都是基于无阻尼的结构,所以此法只适用于低阻尼结构;
模态技术不适用于非线性的动态模拟。在这种情况下必须采用自己的时间积分方法(*DYNAMIC)
*AMPLITUDE选项可以描述随时间任意变化的载荷,以及给定的边界条件; 振型和瞬态结果可以在ABAQUS/Post中用动画显示。这对于理解动态响应和非线性静态分析十分有帮助。
10.多步骤分析
小结:
一个ABAQUS模拟过程可以包含任意数目的步骤;
一个分析步骤就是一段“时间”,在这段时间里ABAQUS计算模型对一套指定载荷和边界条件的响应。这一步骤中所用的特殊分析过程确定了这个响应的特征;
在一个一般分析步骤中,结构的响应可能是线性的,也可能是非线性的; 每一个一般步骤的开始状态是上一个一般步骤的结束状态。这样,在一个模拟中模型的响应随一系列一般步骤而演化;
线性扰动步骤计算结构对扰动载荷的线性响应。这个响应的基本状态是相对于最后一个一般步骤结束时模型的状态所定义的;
在一般步骤中任何载荷选项里的OP参数(例如*BOUNDARY,*CLOAD和*DLOAD中)控制着这些选项中所指定的数值是如何与前面步骤中定义的数值相互作用的;
只要存储了一个重新启动文件就可以进行重新启动分析。重新启动文件可以用来继续一个中断的分析或者给模拟添加附加的载荷过程。11.接触
小结:
接触分析需要一个谨慎的逻辑方法。如果必要,将分析分解成几步执行,并缓慢地施加荷载,以保证很好地建立接触条件;
一般地,对分析的每一步最好采用分离步骤进行,即使只是因为载荷而改变边界条件。您几乎肯定要比预期情况应用更多的步骤,但模型则收敛得更容易。如果想一步就将所有的载荷加上,接触分析是难以完成的;
在对结构施加工作载荷之前,要在所有部件之间取得稳定的接触条件。如果必要,采用临时的边界条件,在以后阶段再消除这些约束。只要所提供的约束不产生永久的变形,对最后的结果应该毫无影响;
不用对接触面上的节点施加边界条件,即在接触方向上限制节点。如果有摩擦,不要在任何自由度上约束这些节点:可能导致零主元信息;
对于接触模拟,总要试图使用一阶单元。
第四篇:Fortran语言编程小结
1.单双精度 Program ex01 implicit none real(kind=4):: a real(kind=8):: b a=3.***66666666_4
!确定这个数字是使用单精度 b=3.***66666666_8
!确定这个数字是使用双精度 write(*,*)a,b End program ex01
2.判断kind值 program ex02 Implicit none
!判断可以记录9个位数的整数kind值
integer, parameter :: long_int = selected_int_kind(9)!判断可以记录3个位数的整数kind值 integer, parameter :: short_int = selected_int_kind(3)
!判断可以有3个有效位数, 指数可以记录到3的浮点数kind值
integer, parameter :: long_real = selected_real_kind(10, 50)!判断可以有10个有效位数, 指数可以记录到50的浮点数kind值
integer, parameter :: short_real= selected_real_kind(3, 3)integer(kind=long_int):: a = 123456 integer(kind=short_int):: b = 123 real(kind=long_real)
:: c = +1.23456789D45 real(kind=short_real)
:: d =+1230 write(*, “(I3,1X,I10)”)
long_int,a write(*, “(I3,1X,I10)”)
short_int, b write(*, “(I3,1X,E10.5)”)long_real, c write(*, “(I3,1X,E10.5)”)short_real, d END
3.TYPE program ex0434 implicit none Type :: person
!开始建立person这个类型
character(len=30):: name!人名
integer :: age
!年龄
integer :: height
!身高
INTEGER :: weight
!体重
character(len=80):: address!地址 End type person type(person):: a
!声明一个person类型的变量 write(*,*)“NAME:” read(*,*)a%name write(*,*)“AGE:” read(*,*)a%age write(*,*)“HEIGHT:” read(*,*)a%height write(*,*)“WEIGHT:” read(*,*)a%weight write(*,*)“ADDRESS:” read(*,*)a%address write(*,100)a%name,a%age,a%height,a%weight 100 format(“Name:”,A10/,“Age:”,I3/,“Height:”,I3/,“Weight:”,I3/,&
“Addres:”,A80)End
4.REAL 与 INTEGER Program ex0431 implicit none
integer :: a=1
integer :: b=2
real
:: c
c=a/b!c=1/2=0, 虽然c是浮点数,但因为a,b是整数,计算a/b时会用整数去计算.write(*,“(F5.2)”)c End
5.DATA 变量表/初值表/,变量表/初值表/,… PROGRAM ex0430 IMPLICIT NONE INTEGER A REAL
B COMPLEX C CHARACTER(20)STR DATA A,B,C,STR /1, 2.0,(1.0,2.0), 'FORTRAN 77'/ WRITE(*,*)A,B,C,STR END
6.复数实虚部 Program ex0430 complex :: c =(1,2)write(*,100)real(c),'+',aimag(c),'i' 100 format(f5.1,a1,f5.1,a1)End
7.逻辑输出 Program ex0416
logical a,b
a=.true.b=.false.write(*,100)a,b
format(L5,L4)End
8.Program ex0415
character(len=20)string
character(len=5)substring
string = “Have a nice day.”
substring = “nice”
write(*,*)ichar('A')!输出字符A的ASCII码
write(*,*)char(65)
!输出ASCII码65所代表的字符,也就是A
write(*,*)len(string)!输出字符串string声明时的长度
write(*,*)len_trim(string)!输出字符串string内容的长度
write(*,*)index(string, substring)!nice在Have a nice day的第8个位置 End
9.Program ex0414
character(len= 6)first
character(len=10)second
character(len=20)add
first=“Happy ”
second=“Birthday”
add = first//second!经由两个连续的除号可以连接两个字符串
write(*,100)add
FORMAT('生日快乐',/,A)End
10.带精度计算 Program ex0408
real(kind=8):: a,b
a=1
b=0.1
write(*,*)a,“+”,b,“=”,a+b End
11.逻辑if语句 Program ex0504 implicit none
integer rain, windspeed
logical r,w
write(*,*)“Rain:”
read(*,*)rain
write(*,*)“Wind:”
read(*,*)windspeed
r =(rain>=500)
!如果rain>=150, r=.true, 不然r=.false.w =(windspeed>=10)!如果windspeed>=10, w=.true, 不然w=.false.if(r.or.w)then
!只要r或w有一个值是true就成立
write(*,*)“停止上班上课”
else
write(*,*)“照常上班上课” End if End
12.Select Case用法 Program ex0512 implicit none
integer :: score
character grade
write(*,*)“Score:”
read(*,*)score
select case(score)
case(90:100)
grade='A'
case(80:89)
grade='B'
case default
grade='?'
End select
write(*,“('Grade:',A1)”)grade End
13.IF GOTO语句
PROGRAM ex0514 IMPLICIT NONE REAL height
REAL weight
WRITE(*,*)“height:” READ(*,*)
height
WRITE(*,*)“weight:” READ(*,*)
weight
IF(weight > height-100)GOTO 200 100 WRITE(*,*)“Under control.”
GOTO 300
200
WRITE(*,*)“Too fat!” 300 STOP END
14.DO WHILE 循环 Program ex0604 implicit none
integer, parameter :: limit=10
integer counter
integer :: ans = 0
counter = 2
do while(counter <= limit)
ans = ans + counter
counter = counter + 2
end do
write(*,*)ans END
15.CYCLE,EXIT 语句 Program ex0609 implicit none
integer :: i,j
loop1: do i=1,3
loop2: do j=1,3
if(i==3)exit loop1
!跳离loop1循环
if(j==2)cycle loop2
!重做loop2循环
write(*, “('(',i2,',',i2,')')”)i, j
end do loop2
end do loop1 End
16.大小写字符 Program ex0612 implicit none
integer i
integer strlen
character(len=20):: string
write(*,*)“String:”
read(*,*)string
strlen = LEN_TRIM(string)
do i = 1, strlen
string(i:i)= char(ichar(string(i:i))+32)
end do
write(*,“('encoded:',A20)”)string End
17.循环计算 Program ex0614 implicit none
real a,b,ans
character :: key = 'y'
!为了至少循环一次
do while(key=='y'.or.key=='Y')
read(*,*)a read(*,“(A1)”)key read(*,*)b select case(key)case('+')
ans = a+b case('-')
ans = a-b case('*')
ans = a*b
case('/')
ans = a/b case default
write(*,“('Unknown operator ',A1)”)key
stop end select
write(*,“(F6.2,A1,F6.2,'=',F6.2)”)a,key,b,ans write(*,*)“(Y/y)to do again.(Other)to exit.” read(*,“(A1)”)key
end do End
18.矩阵相加 pogram ex implicit none
integer, parameter :: row = 2
integer, parameter :: col = 2
integer :: matrixA(row,col)
integer :: matrixB(row,col)
integer :: matrixC(row,col)
integer r
integer c
write(*,*)“Matrix A”
do r=1, row
do c=1, col
write(*,“('A(',I1,',',I1,')=')”)r,c
read(*,*)matrixA(r,c)end do
end do
write(*,*)“Matrix B”
do r=1, row
do c=1, col
write(*,“('B(',I1,',',I1,')=')”)r,c
read(*,*)matrixB(r,c)end do
end do
write(*,*)“Matrix A+B=”
do r=1, row
do c=1, col
matrixC(r,c)= matrixB(r,c)+matrixA(r,c)
write(*,“('(',I1,',',I1,')=',I3)”)r,c,matrixC(r,c)end do
end do end pogram ex
[ write(*,“(I3,I3,/,I3,I3)”)((mc(i,j), i=1,2),j=1,2)]
19.program ex
implicit none
integer, parameter :: row = 2
integer, parameter :: col = 2
integer :: a(2,2)=(/ 1,2,3,4 /)
!a(1,1)=1, a(2,1)=2, a(1,2)=3, a(2,2)=4
integer :: b(4)=(/ 5,6,7,8 /)
integer :: c(2)
write(*,*)a,2)
write(*,*)a(:,1)
c = a(:,1)
!c(1)=a(1,1), c(2)=a(2,1)
write(*,*)c!c(1), c(2)
c = a(2,:)
!c(1)=a(2,1), c(2)=a(2,2)
write(*,*)c!c(1), c(2)
write(*,*)c(2:1:-1)
!c(2), c(1)
c = b(1:4:2)
!c(1)=b(1), c(2)=b(3)
write(*,*)c
!c(1), c(2)End
20.FORALL语句 Program ex Implicit none
integer :: I,J
integer, parameter :: size = 5
integer :: a(size,size)
forall(I=1:size, J=1:size, I>J)a(I,J)=1
!上半部分
forall(I=1:size, J=1:size, I==J)a(I,J)=2!对角线
forall(I=1:size, J=1:size, I !下半部分 write(*,“(5(5I5,/))”)a End 21.Allocatable Program EX Implicit none integer :: size, error=0 integer, parameter :: one_mb=1024*1024 !1MB character, allocatable :: a(:) Do size=size+one_mb! allocate(a(size), stat=error) if(error/=0)exit write(*,“('Allocate ',I10, ' bytes')”)size write(*,“(F10.2,' MB used')”)real(size)/real(one_mb) deallocate(a) End do End 22.Function 函数 Program ex implicit none real :: a=10 real :: b=20 real :: add write(*,“(f6.2)”)add(a,b)End Function add(a,b)implicit none real :: a,b real :: add add = a*b End 23.SAVE语句 Program ex Implicit none call sub() call sub() call sub()End program Subroutine sub() Implicit none Integer :: count = 1 Save count !指定save变量永远活着,不会忘记它的内容 Write(*,*)count count = count+1 End [运行结果:1 2 3 ] 24.生成随机数 program ex implicit none interface!定义函数的接口 function random10(lbound, ubound)implicit none real :: lbound, ubound real :: random10(10) end function end interface real :: a(10) CALL RANDOM_SEED()!系统根据日期和时间随机地提供种子 a = random10(1.0, 10.0) write(*,“(10F6.2)”)a end function random10(lbound, ubound)implicit none real :: lbound, ubound real :: len real :: random10(10) real t integer i len = ubound-lbound!计算范围大小 do i=1,10 call random_number(t)!t会是0~1之间的随机数 random10(i)= lbound + len * t!把t转换成lbound~ubound间的随机数 end do End 25.MODULE语句 Module global implicit none integer a,b common a,b End module Program ex0834 use global implicit none a=1 b=2 call sub()End program Subroutine sub() use global implicit none write(*,*)a,b return End subroutine 26.写文件到text program ex0902 implicit none character(len=20):: string open(unit=10, file=“test.txt”) write(10,“(A20)”)“I LOVE YOU.”!写到文件中 rewind(10) read(10,“(A20)”)string!从文件中读出来 write(*,“(A20)”)string!写到屏幕上 end 27.随机成绩 program gendata implicit none integer students integer i real r(3) write(*,“(4A5)”)“座位”,“语文”,“数学”,“英语” call random_seed() write(*,*)“How many students?” read(*,*)students do i=1,students call random_number(r) write(*,“(6I5)”)i,int(r*50+50) end do end program 关于Fortran调用C++函数的小结 2017-3-12 背景 工作中遇到了需要在Fortran代码中调用C++提供的函数的情况。通过在网上查阅资料,总结了实现方法,制作了一个实例。 工具 集成开发环境是VS2010。由于默认安装模式下的VS2010是无法编译调试Fortran的,所以又补充安装了Intel(R)Virual Fortran 2011(英特尔可视化Fortran编译器)。 参考资料分析 本文需要用到Fortran与C/C++的混合编程,Fortran和C/C++分别编译各自的功能模块源代码,得到各自的目标文件(.obj),然后集成链接这些obj 文件生成一个统一的可执行文件,实现对对方函数的调用,数据交换通过约定接口来实现[1]。C++代码中函数说明前需要用到extern关键字,说明函数可以在本模块或其它模块中使用[2]。extern与“C”一起连用时,如: extern “C” void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非[3]。 要在Fortran中调用C++的函数,意味着Fortran项目对C++项目产生了依赖关系,如果项目依赖项未设置会导致类似“无法解析的外部符号 _XXX,该符号在函数 _XX 中被引用”的错误。另外还要保证Fortran与C++项目的运行库设置都是“多线程调试”[4]。 实现过程 创建Fortran项目 1)启动VS2010,新建一个Fortran控制台应用程序,名称为Console1。2)在该项目下的Source Files下添加一个新文件Source1.f90。3)在Source1.f90中写入如下代码: program main implicit none interface subroutine SUB(a,b)!DEC$ ATTRIBUTES C,ALIAS:'_sub'::SUB!DEC$ ATTRIBUTES reference::a,b integer a , b end subroutine SUB end interface integer(4)a,b,c a=100 b=1 write(*,*)“开始调用C++里的函数SUB” call SUB(a,b)read(*,*)endprogram main 注:接口中为_sub这个来自于C++的函数起了个别名SUB,所以在后面调用SUB时其实就是调用_sub。在接口中还规定了a和b两个参数的传递方式是传引用。 创建C++项目 在解决方案资源管理器中的“解决方案”处右键,添加一个新建项目,在新建窗口中选中Win32控制台应用程序,输入项目名称Cpp2。在随后弹出的应用程序设置中选择应用程序类型为静态库。 在项目的头文件中新建一个sub.h,在其中输入如下代码: //sub.h #ifndef _SUB_H #define _SUB_H extern“C”void_cdecl sub(int *a,int *b); [5]#endif 注:在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义的错误。 在项目的源文件中新建一个sub.cpp,在其中输入如下代码: //sub.cpp #include“stdafx.h” #include“sub.h” #include extern“C”void_cdecl sub(int *a,int *b){ std::cout<<“C++: 已经进入C++的函数内部n”<<“a=”<<*a<<“, b=”<<*b< 设置Fortran项目的项目依赖项 在Console1项目上右键,选择项目依赖项,在弹出窗口中依赖项页内选中Cpp2,切换到生成顺序页,可以看到Cpp2排在Console1前面。 设置运行库 1)设置Fortran项目的运行库,在Console1项目上右键选择属性,然后找到【配置属性】【Fortran】【Libraries】【Runtime Library】,设置其值为Debug Multithreaded(/libs:static/threads/dbglibs)即多线程调试。 2)设置C++项目的运行库,在Cpp2项目上右键选择属性,找到【配置属性】【C/C++】【代码生成】【运行库】,设置其值为多线程调试(/MTd)。 生成项目 1)在解决方案上右键选择重新生成解决方案。 2)在解决方案所在的Console1文件夹下找到Debug文件夹,可以看到其中有一个Cpp2.lib文件,这个静态库文件就是Cpp2项目生成的。 3)在Console1Console1Debug文件夹下可以看到Console1.exe文件,这个可执行文件是Console1项目生成的。 注:如果要单独生成Cpp2,可以在Cpp2项目上右键选择重新生成。如果在Console1项目上右键选择重新生成,因为前文设置了项目依赖项的关系,Cpp2也会被生成。 启动调试 按下F5,启动调试。可以看到调试成功。 参考文献 [1] suiyi1234546,第11章 Fortran和C的混合语言编程-授课版,百度文库,http://wenku.baidu.com/link?url=ogwgYldzkmbgJXM86iXjAMt60wimIN1bMVy6uoz1dFn0pWuPPj1mKapYZ9RAK1rXrMZCmQAmJYjGCA0B1IpvDh9wb1joBcFdJ3VO2fz19jO [2] ForFreeDom,关于C++的extern关键字,博客园,[3] chao_yu,C/C++中extern关键字详解,博客园,http:// [5] Arthursky,C++在头文件中使用#ifdef和#ifndef,ChinaUnix,http://blog.chinaunix.net/uid-11572501-id-2868707.html第五篇:关于Fortran调用C++函数的小结