首页/文章/ 详情

ABAQUS UTRACLOAD子程序自定义面荷载

1月前浏览708

目录

  1. 概述
  2. utracload子程序接口介绍
  3. 算例介绍
  4. 计算结果
  5. 全部程序及讲解

概述

  讲解了abaqus提供的用于定义复杂面荷载的子程序utracload,这个子程序可以用于定义随时间、位置、积分点变化的面荷载、线荷载。最终以一个悬臂梁受力为例讲解具体的使用方法,帖子末尾给出了具体的程序

utracload子程序接口介绍

    子程序的接口可以在官方文档找到,下面是具体的接口

      SUBROUTINE UTRACLOAD(ALPHA,T_USER,KSTEP,KINC,TIME,NOEL,NPT,
     1 COORDS,DIRCOS,JLTYP,SNAME)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION T_USER(3), TIME(2), COORDS(3), DIRCOS(3,3)
      CHARACTER*80 SNAME

      user coding to define ALPHA and T_USER

      RETURN
      END

   下面逐一介绍这个子程序的参数
  ALPHA是需要我们计算的数值,不包括符号,这个数值会传给abaqus主程序。
  T_USER是一个定义荷载方向的向量,有三个数值分别代表x、y和z。
  KSTEP和KINC分别是当前分析步数和增量步数。
  TIME(1)TIME(2)分别是当前分析步时间和分析总时间。
  NOEL是用户自定义单元编号,这个参数需要和另一个子程序uel联合使用。
  NPT是积分点数。
  COORDS是荷载积分点的初始坐标,注意不是节点的坐标,如果计算打开了几何非线性,则是当前荷载积分点的坐标。
  DIRCOS这个参数我没有用过,不多说,怕误导读者。
  JLTYP是荷载的类型,这个参数是和inp文件相对应的,具体的对应关系为  其中,LoadLabel是inp文件中的荷载类型,JTYPE是子程序中的参数。这个参数可用于荷载判断。

算例介绍

  设计了悬臂梁算例,这个算例并没有输入非常复杂的面荷载,只是施加了简单的三角函数荷载,不采用子程序也可以施加这种荷载,目的是能够将子程序的计算结果与abaqus进行对比。如果采用子程序施加很复杂的荷载,就没办法与abaqus进行对比了。
  悬臂梁一端固定,顶端与悬臂端施加三角函数荷载,边界条件与荷载示意图为  其中,顶面的名称定义为“yz”,代表着面荷载的方向为垂直于y面与z同向,悬臂端的名称定义为“zy”,代表着面荷载的方向为垂直于z面与y同向,这个名称在子程序中需要。
  这里给顶端施加的荷载为    ,悬臂端施加的荷载为    

计算结果

  经常读我帖子的朋友都知道,我不太喜欢在结果上面花太多时间,我一般都是直接把所有的计算文件放到帖子末尾,放不下的文件一般私信我获取就行。下面简单的放一些计算结果。
  首先是2.5s时刻的位移对比
  2.5s时刻的    对比  5s时刻的位移对比
  5s时刻的    对比  10s时刻的位移对比
  10s时刻的    对比

全部程序及讲解

  下面是详细的子程序文件和部分inp文件,因为inp太大了放不下,如果有需要的,直接私信我就行
  首先给出for文件,代码以注释的形式给出讲解。

          SUBROUTINE UTRACLOAD(ALPHA,T_USER,KSTEP,KINC,TIME,NOEL,NPT,
     1 COORDS,DIRCOS,JLTYP,SNAME)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION T_USER(3), TIME(2), COORDS(3), DIRCOS(3,3)
      CHARACTER*80 SNAME
      character*10 surfyzz,surfzzy
      
c     注意这里的字符串是大写,因为参数sname默认也是大写
c     我一开习惯性始认为fortran不区分大小写
c     结果卡了我一下午!!!!!!!!!!!!
      surfyzz='SURF-Y-ZZ'      
      surfzzy='SURF-Z-ZY'

c      user coding to define ALPHA and T_USER

c index函数用于检查字符串surfyzz是否在sname中 
      if(index(sname,surfyzz).gt.0)then
       ALPHA=1e+06*SIN(TIME(1))
c 设置面荷载方向,这里的是沿着z轴正向        
        t_user(1)=0
        t_user(2)=0.0
        t_user(3)=1
c index函数用于检查字符串surfzzy是否在sname中         
      elseif(index(sname,surfzzy).gt.0)then
       ALPHA=1e+06*COS(TIME(1))
c 设置面荷载方向,这里的是沿着y轴负向   
        t_user(1)=0
        t_user(2)=-1
        t_user(3)=0.0
               
      endif
      RETURN
      END

  下面是带有子程序的部分inp文件,不带子程序的文件就不占用篇幅了,如有需要直接私信我。

*Heading
** Job name: Job-1 Model name: Model-1
** Generated by: Abaqus/CAE 2020
*Preprint, echo=NO, model=NO, history=NO, contact=NO
**
** PARTS
**
*Part, name=Part-1
*Node
1,          10.,          10.,          20.
**省略节点坐标
......  
396,           0.,           0.,           0.
*Element, type=C3D8
1,  67,  68,  74,  73,   1,   2,   8,   7
**省略单元
......
250, 389, 390, 396, 395, 323, 324, 330, 329
*Nset, nset=Set-1, generate
   1,  396,    1
*Elset, elset=Set-1, generate
   1,  250,    1
*Elset, elset=_surf-y-zz_S6, internal, generate
   1,  246,    5
*Surface, type=ELEMENT, name=surf-y-zz
_surf-y-zz_S6, S6
*Elset, elset=_surf-z-zy_S3, internal
   1,   2,   3,   4,   5,  51,  52,  53,  54,  55, 101, 102, 103, 104, 105, 151
 152, 153, 154, 155, 201, 202, 203, 204, 205
*Surface, type=ELEMENT, name=surf-z-zy
_surf-z-zy_S3, S3
** Section: Section-1
*Solid Section, elset=Set-1, material=Material-1
,
*End Part
**  
**
** ASSEMBLY
**
*Assembly, name=Assembly
**  
*Instance, name=Part-1-1, part=Part-1
*End Instance
**  
*Nset, nset=Set-1, instance=Part-1-1
  61,  62,  63,  64,  65,  66, 127, 128, 129, 130, 131, 132, 193, 194, 195, 196
 197, 198, 259, 260, 261, 262, 263, 264, 325, 326, 327, 328, 329, 330, 391, 392
 393, 394, 395, 396
*Elset, elset=Set-1, instance=Part-1-1
  46,  47,  48,  49,  50,  96,  97,  98,  99, 100, 146, 147, 148, 149, 150, 196
 197, 198, 199, 200, 246, 247, 248, 249, 250
*End Assembly
*Amplitude, name=cosx, definition=PERIODIC
1,              1.,              0.,              0.
             1.,              0.
*Amplitude, name=sinx, definition=PERIODIC
1,              1.,              0.,              0.
             0.,              1.
** 
** MATERIALS
** 
*Material, name=Material-1
*Density
2000.,
*Elastic
 1e+10, 0.25
** ----------------------------------------------------------------
** 
** STEP: Step-1
** 
*Step, name=Step-1, nlgeom=NO, inc=1000
*Dynamic,direct
0.01,10.,
** 
** BOUNDARY CONDITIONS
** 
** Name: fixed Type: Displacement/Rotation
*Boundary
Set-1, 1, 1
Set-1, 2, 2
Set-1, 3, 3
** 
** LOADS
** 
** Name: surf-y-zz   Type: Surface traction
** 这里的关键字调用了utracload子程序
*Dsload
Part-1-1.surf-y-zz, TRSHRNU, 1., 0., 0., 1.
** Name: surf-z-zy   Type: Surface traction
*Dsload
Part-1-1.surf-z-zy, TRSHRNU, 1., 0., -1., 0.
** 
** OUTPUT REQUESTS
** 
*Restart, write, frequency=0
** 
** FIELD OUTPUT: F-Output-1
** 
*Output, field, variable=PRESELECT, frequency=1
** 
** HISTORY OUTPUT: H-Output-1
** 
*Output, history, variable=PRESELECT, frequency=1
*End Step

来源:有限元先生

ACTAbaqus非线性ADS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-11-22
最近编辑:1月前
外太空土豆儿
博士 我们穷极一生,究竟在追寻什么?
获赞 24粉丝 4文章 66课程 0
点赞
收藏
作者推荐

abaqus子程序uexternaldb和disp联合仿真

目录概述uexternaldb子程序disp子程序子程序讲解数据的准备uexternaldb子程序disp子程序算例所有的计算文件和代码总结概述  帖子探索了将子程序uexternaldb和disp联合进行仿真。  其中,子程序uexternaldb用于在计算分析之前读取预先准备的数据,并将数据处理成公共数据块,再利用子程序disp读取公共数据块中的内容,以位移荷载的形式施加在模型中。  以悬臂梁受随时间变化的位移荷载为例验证子程序计算准确性,最终计算结果表明,与abaqus计算结果保持一致,说明,二者联合仿真可以完成外界数据的导入和施加荷载的计算。帖子末尾给出了所有的计算文件和代码。          uexternaldb子程序  uexternaldb子程序是abaqus专门设计出来让子程序与外界的数据进行交互的。该子程序允许在不同的计算时刻调用,最大程度上满足了子程序与外界数据交互的需求,该子程序的接口为SUBROUTINEUEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)CINCLUDE'ABA_PARAM.INC'CDIMENSIONTIME(2)CusercodingtosetuptheFortranenvironment,openfiles,closefiles,calculateuser-definedmodel-independenthistoryinformation,writehistoryinformationtoexternalfiles,recoverhistoryinformationduringrestartanalyses,etc.donotincludecallstoutilityroutineXITRETURNEND  这个子程序的参数并不复杂,下面逐一解释各个参数的含义和使用方法。abaqus对于参数的介绍是非常有逻辑性的,所有的参数一般被分为以下几种:需要我们定义的参数、传递进子程序作为信息的参数、可以更新的参数等等,在这个子程序中,不存在我们需要定义的参数,传递进子程序的所有参数都是我们可以直接使用的信息。下面是具体的参数介绍。当lop等于0的时候,意味着当前时刻是0时刻,即分析步还没开始。lop等于1的时候意味着当前增量步开始,lop等于2的时候意味着当前时刻是增量步结束时刻,lop等于3的是时候意味着当前时刻是分析步结束时刻,即当前所有计算已经完成。lop等于4意味着当前时刻是重启动分析开始前,lop等于5意味着当前时刻是一个分析步开始时刻,lop等于6意味着当前时刻是分析步结束时刻。time(1)参数是当前分析步时间。time(2)是计算总时间。dtime是增量步长。kstep是当前分析步数。kinc是当前增量步数目。    disp子程序  disp子程序用于定义复杂的边界条件。abaqus所有的自由度均可以使用这个子程序,在这次帖子中,仅仅涉及到位移自由度,即1-3自由度的边界条件。这个子程序的接口为SUBROUTINEDISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)CINCLUDE'ABA_PARAM.INC'CDIMENSIONU(3),TIME(3),COORDS(3)CusercodingtodefineURETURNEND  相较于uexternaldb子程序,disp子程序的参数更加简单,而且与上一个子程序的参数有重复,这里只介绍没重复的参数。  参数u就是disp最终向abaqus主程序输出的数据,这个数据要我们自己计算定义,这是一个数组,数组的长度为3,第一个是幅值本身,第二个是幅值的一阶导数,第三个是幅值的二阶导数。  参数node是当前传进子程序的节点编号,就是说,我们可以对不同的节点施加不同的边界条件,这个功能很强大!  参数noel是当前传进子程序的单元编号。  参数jdof是自由度编号。  参数coords是当前位置的坐标,我们还可以对坐标进行判断,给我们想要的位置施加边界条件,这非常方便。  以上是两个子程序的介绍,下面设计算例,在计算的过程中讲解这两个子程序是怎样交互数据的。算例  这里设计一个悬臂梁受随时间变化的位移荷载算例,悬臂梁尺寸为,材料弹性模量,密度,泊松比,悬臂梁的一段固定,悬臂端的所有节点施加同样的随时间变化的位移荷载,悬臂梁的荷载和边界条件示意图为  采用六面体单元离散模型,即C3D8单元,单元尺寸为,共计单元数目为250,节点数目为396,网格图为  在悬臂端施加随时间变化的位移荷载,位移荷载采用正弦曲线,即,曲线图为  上述算例采用dynamicimplicit分析步计算,采用固定增量步长,计算总时长为10,增量步长为0.01,总体增量步数100。设置两种计算工况,分别为1.完全采用abaqus计算。2.采用子程序完成上述计算。具体的步骤为(1)采用uexternaldb子程序读取预先准备的荷载数据(2)通过fortran语言的公共数据块COMMON将数据传递给子程序disp(3)disp子程序完成位移荷载的赋值。  对于工况1,可参考文末给出的inp文件。下面重点讲解工况2程序的实现过程。子程序讲解数据的准备  这里采用的是正弦曲线的位移荷载,可以直接通过excel表格生成。注意计算总时长为10,增量步长为0.01,excel的数值大致为  上面有两列数据,左边为时间序列,时间间隔就是增量步长0.01,右面一列是位移幅值,我们需要将右面一列复制到一个txt文件中,便于后续的子程序读取。  除了包含位移荷载的txt文件,我们还需要准备一个记录数据总数的文件:“INP_PARAM.INC”,子程序运行的时候,会自动包含这个文件中生成的参数,这里的参数是位移荷载的个数,即总的增量步数,这个文件的书写遵循fortran语法,具体的内容为PARAMETER(amp=100)!NumberofINCs  这样就生成了一个变量amp,,子程序就可以直接引用这个变量。  到这里,我们准备了两个文件,一个储存位移荷载的txt文件,用于后续的子程序调用;一个储存增量步总数的文件,下面开始具体的程序讲解,所有的子程序都会在文末给出。uexternaldb子程序  在程序正式开始工作之前,要先将变量和预先准备的文件引用一下C引用准备的文件,用于储存位移荷载总数INCLUDE'INP_PARAM.INC'  我们需要在两个子程序之间传递数据,因此要声明一个公共的数据块COMMONCOMMON/ampinfo/AMPLITUDE(AMP)  下面开始读取数据,读取数据的工作只需要进行一次,即在正式的分析开始之前读取,储存起来,后续所有的增量步都不再读取,因此需要设置一个判断C只在分析步开始之前读取数据if(lop.eq.0)thenCcodesendif  然后开始读取预先准备的txt文件,用open语句读取OPEN(UNIT=111,FILE='C:\Users\nnn\Desktop\uexternaldb\user\1patch.txt',STATUS='UNKNOWN')  打开要读取的文件之后,就开始读取并储存数据Camp是储存在INP_PARAM.INC文件中的增量步总数doii=1,AMPread(111,*)TEMPC将读取的temp数据赋值给AMPLITUDE数组AMPLITUDE(II)=TEMPenddodisp子程序  与uexternaldb子程序类似,正式的计算之前也需要引用预先准备的数据,这里主要引用INP_PARAM.INC文件和uexternaldb子程序中声明的公共数据块INCLUDE'INP_PARAM.INC'CCOMMON/ampinfo/AMPLITUDE(AMP)  引用了数据之后就是将位移荷载赋值给相应的参数,这里是位移荷载,因此按照增量步kinc将数据赋值给u(1),即u(1)=amplitude(kinc)  以上就是子程序的所有主要内容,详细的内容在文末给出。下面是具体的计算结果计算结果  写这部分文字其实不如给大家讲述实现过程有意思,这个帖子所有的重点的内容在上面,我就简单放几个图,大家看看就好,需要详细的数据可以私信我。  这里施加的是数值向位移,我就随便选几个时间点的u2对比图放这里,3s的竖直向对比图为  5s的竖直向对比图为  10s的竖直向对比图为所有的计算文件和代码计算inp文件  计算inp文件太多了,全部写这里在太长了,我就放一下调用子程序的大致inp文件,需要详细的数据可以私信我。*Heading**Jobname:Job-1Modelname:Model-1**Generatedby:Abaqus/CAE2020*Preprint,echo=NO,model=NO,history=NO,contact=NO****PARTS***Part,name=Part-1*Node1,10.,10.,20.......396,0.,0.,0.*Element,type=C3D8R1,67,68,74,73,1,2,8,7....250,389,390,396,395,323,324,330,329*Nset,nset=Set-1,generate1,396,1*Elset,elset=Set-1,generate1,250,1*Nset,nset=load1,2,3,4,5,6,67,68,69,70,71,72,133,134,135,136137,138,199,200,201,202,203,204,265,266,267,268,269,270,331,332333,334,335,336**Section:Section-1*SolidSection,elset=Set-1,material=Material-1,*EndPart******ASSEMBLY***Assembly,name=Assembly***Instance,name=Part-1-1,part=Part-1*EndInstance***Nset,nset=Set-1,instance=Part-1-161,62,63,64,65,66,127,128,129,130,131,132,193,194,195,196197,198,259,260,261,262,263,264,325,326,327,328,329,330,391,392393,394,395,396*Elset,elset=Set-1,instance=Part-1-146,47,48,49,50,96,97,98,99,100,146,147,148,149,150,196197,198,199,200,246,247,248,249,250*Elset,elset=_Surf-1_S3,internal,instance=Part-1-11,2,3,4,5,51,52,53,54,55,101,102,103,104,105,151152,153,154,155,201,202,203,204,205*Surface,type=ELEMENT,name=Surf-1_Surf-1_S3,S3*EndAssembly****MATERIALS***Material,name=Material-1*Density0.,*Elastic1e+10,0.25**----------------------------------------------------------------****STEP:Step-1***Step,name=Step-1,nlgeom=NO,inc=1000*Dynamic,direct0.1,10.,****BOUNDARYCONDITIONS****Name:BC-2Type:Displacement/Rotation************************这里调用了disp子程序************************Boundary,userPart-1-1.load,2,2,10000.**Name:fixedType:Displacement/Rotation*BoundarySet-1,1,1Set-1,2,2Set-1,3,3****OUTPUTREQUESTS***Restart,write,frequency=0****FIELDOUTPUT:F-Output-1***Output,field,variable=PRESELECT,frequency=1****HISTORYOUTPUT:H-Output-1***Output,history,variable=PRESELECT*EndStepfortran子程序  下面的子程序是完整的,只需要修改下文件路径就能运行。CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC读取外界数据的子程序SUBROUTINEUEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)CINCLUDE'ABA_PARAM.INC'INCLUDE'INP_PARAM.INC'CDIMENSIONTIME(2)C定义全局数据块,所有的子程序都可以调用COMMON/ampinfo/AMPLITUDE(AMP)DOUBLEPRECISIONTEMPC只在分析步开始的时候读取外部txt文件,其余的分析步不读取if(lop.eq.0)thenC这里的路径需要自己修改OPEN(UNIT=111,FILE='C:\Users\nnn\Desktop\uexternaldb\user\1patch.txt',STATUS='UNKNOWN')C读取外部txt文件doii=1,AMPread(111,*)TEMPAMPLITUDE(II)=TEMPenddoclose(111)write(*,*)"***外部数据读取完毕(仅在分析开始之前读取)***"endifRETURNENDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC施加位移的子程序SUBROUTINEDISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)CINCLUDE'ABA_PARAM.INC'INCLUDE'INP_PARAM.INC'CDIMENSIONU(3),TIME(3),COORDS(3)CCOMMON/ampinfo/AMPLITUDE(AMP)write(*,*)amplitude(kinc)u(1)=amplitude(kinc)RETURNENDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC总结  上面的东西写的花里胡哨的,但是仔细一想,这不纯纯做无用功吗!abaqus自己就可以定义正弦曲线啊!那为什么还要费劲巴拉的在外部定义曲线,还通过两个子程序联合传递数据,这有什么意义呢?  是的,这个帖子如果就内容而言,纯纯没有任何实用价值,纯纯是六个手指头挠痒痒---多一道子!但是如果我们把这个工作流程进行抽象整理,我们再来看看这个帖子做了什么事。  我们首先生成了一些外部数据,然后用uexternaldb子程序读了进来,又通过公共数据快讲数据传递给了disp,最终施加了边界条件。  将上面的步骤拆开分析。uexternaldb可以用来读取外部数据,那这个外部数据的来源就值得考究,这个帖子就只是个简单的三角函数,而且只有一组数据,非常的简单,那假如我们需要导入的数据非常的复杂呢?而且没有任何的函数关系?再假如,如果我们导入的数据是别的软件或者程序实时生成并更新的呢?事情是不是的顿时变得非常有意思了?  一言以蔽之,uexternaldb子程序为abaqus与其他的程序进行联合方针埋下了伏笔!  再来分析一下disp施加边界条件的事情。这里只是施加了一个非常简单的位移边界条件,而且还是单个自由度的一组数据,非常简单,口算都行。但是,假如我们要给接触界面添加界面属性数据呢?假如我们要修改弹性模量呢,假如我们要给一道焊缝施加高斯热源呢?事情是不是的顿时变得非常有意思了?  复杂的事情都是由简单的事情组合起来的;麻雀虽小,五脏俱全,简单的事物也包含着复杂事物的所有基本流程。来源:有限元先生

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈