首页/文章/ 详情

ABAQUS UTRACLOAD子程序自定义面荷载

1天前浏览59

目录

  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天前
外太空土豆儿
硕士 我们穷极一生,究竟在追寻什么?
获赞 8粉丝 1文章 52课程 0
点赞
收藏
作者推荐

abaqus子程序uexternaldb和disp联合仿真

目录概述uexternaldb子程序disp子程序子程序讲解数据的准备uexternaldb子程序disp子程序算例所有的计算文件和代码总结概述  帖子探索了将子程序uexternaldb和disp联合进行仿真。  其中,子程序uexternaldb用于在计算分析之前读取预先准备的数据,并将数据处理成公共数据块,再利用子程序disp读取公共数据块中的内容,以位移荷载的形式施加在模型中。  以悬臂梁受随时间变化的位移荷载为例验证子程序计算准确性,最终计算结果表明,与abaqus计算结果保持一致,说明,二者联合仿真可以完成外界数据的导入和施加荷载的计算。帖子末尾给出了所有的计算文件和代码。          uexternaldb子程序  uexternaldb子程序是abaqus专门设计出来让子程序与外界的数据进行交互的。该子程序允许在不同的计算时刻调用,最大程度上满足了子程序与外界数据交互的需求,该子程序的接口为 SUBROUTINE UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)C INCLUDE 'ABA_PARAM.INC'C DIMENSION TIME(2)C user coding to set up the Fortran environment, open files, close files, calculate user-defined model-independent history information, write history information to external files, recover history information during restart analyses, etc. do not include calls to utility routine XIT RETURN END   这个子程序的参数并不复杂,下面逐一解释各个参数的含义和使用方法。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自由度的边界条件。这个子程序的接口为 SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)C INCLUDE 'ABA_PARAM.INC'C DIMENSION U(3),TIME(3),COORDS(3)C user coding to define U RETURN END   相较于uexternaldb子程序,disp子程序的参数更加简单,而且与上一个子程序的参数有重复,这里只介绍没重复的参数。  参数u就是disp最终向abaqus主程序输出的数据,这个数据要我们自己计算定义,这是一个数组,数组的长度为3,第一个是幅值本身,第二个是幅值的一阶导数,第三个是幅值的二阶导数。  参数node是当前传进子程序的节点编号,就是说,我们可以对不同的节点施加不同的边界条件,这个功能很强大!  参数noel是当前传进子程序的单元编号。  参数jdof是自由度编号。  参数coords是当前位置的坐标,我们还可以对坐标进行判断,给我们想要的位置施加边界条件,这非常方便。  以上是两个子程序的介绍,下面设计算例,在计算的过程中讲解这两个子程序是怎样交互数据的。算例  这里设计一个悬臂梁受随时间变化的位移荷载算例,悬臂梁尺寸为 ,材料弹性模量 ,密度 ,泊松比 ,悬臂梁的一段固定,悬臂端的所有节点施加同样的随时间变化的位移荷载,悬臂梁的荷载和边界条件示意图为  采用六面体单元离散模型,即C3D8单元,单元尺寸为 ,共计单元数目为250,节点数目为396,网格图为  在悬臂端施加随时间变化的位移荷载,位移荷载采用正弦曲线,即 ,曲线图为  上述算例采用dynamic implicit分析步计算,采用固定增量步长,计算总时长为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) ! Number of INCs   这样就生成了一个变量amp,,子程序就可以直接引用这个变量。  到这里,我们准备了两个文件,一个储存位移荷载的txt文件,用于后续的子程序调用;一个储存增量步总数的文件,下面开始具体的程序讲解,所有的子程序都会在文末给出。uexternaldb子程序  在程序正式开始工作之前,要先将变量和预先准备的文件引用一下C引用准备的文件,用于储存位移荷载总数 INCLUDE 'INP_PARAM.INC'   我们需要在两个子程序之间传递数据,因此要声明一个公共的数据块COMMON COMMON/ampinfo/AMPLITUDE(AMP)   下面开始读取数据,读取数据的工作只需要进行一次,即在正式的分析开始之前读取,储存起来,后续所有的增量步都不再读取,因此需要设置一个判断C 只在分析步开始之前读取数据 if(lop.eq.0)thenC codes endif   然后开始读取预先准备的txt文件,用open语句读取 OPEN(UNIT=111,FILE='C:\Users\nnn\Desktop\uexternaldb\user\ 1patch.txt',STATUS='UNKNOWN')   打开要读取的文件之后,就开始读取并储存数据C amp是储存在INP_PARAM.INC文件中的增量步总数 do ii=1,AMP read(111,*)TEMP C 将读取的temp数据赋值给AMPLITUDE数组 AMPLITUDE(II)=TEMP enddo disp子程序  与uexternaldb子程序类似,正式的计算之前也需要引用预先准备的数据,这里主要引用INP_PARAM.INC文件和uexternaldb子程序中声明的公共数据块 INCLUDE 'INP_PARAM.INC' C COMMON/ampinfo/AMPLITUDE(AMP)   引用了数据之后就是将位移荷载赋值给相应的参数,这里是位移荷载,因此按照增量步kinc将数据赋值给u(1),即 u(1)=amplitude(kinc)   以上就是子程序的所有主要内容,详细的内容在文末给出。下面是具体的计算结果计算结果  写这部分文字其实不如给大家讲述实现过程有意思,这个帖子所有的重点的内容在上面,我就简单放几个图,大家看看就好,需要详细的数据可以私信我。  这里施加的是数值向位移,我就随便选几个时间点的u2对比图放这里,3s的竖直向对比图为  5s的竖直向对比图为  10s的竖直向对比图为所有的计算文件和代码计算inp文件  计算inp文件太多了,全部写这里在太长了,我就放一下调用子程序的大致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=C3D8R1, 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*Nset, nset=load 1, 2, 3, 4, 5, 6, 67, 68, 69, 70, 71, 72, 133, 134, 135, 136 137, 138, 199, 200, 201, 202, 203, 204, 265, 266, 267, 268, 269, 270, 331, 332 333, 334, 335, 336** 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*Elset, elset=_Surf-1_S3, internal, instance=Part-1-1 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-1_Surf-1_S3, S3*End Assembly** ** MATERIALS** *Material, name=Material-1*Density0.,*Elastic 1e+10, 0.25** ----------------------------------------------------------------** ** STEP: Step-1** *Step, name=Step-1, nlgeom=NO, inc=1000*Dynamic,direct0.1,10.,** ** BOUNDARY CONDITIONS** ** Name: BC-2 Type: Displacement/Rotation************************这里调用了disp子程序************************Boundary, userPart-1-1.load, 2, 2, 10000.** Name: fixed Type: Displacement/Rotation*BoundarySet-1, 1, 1Set-1, 2, 2Set-1, 3, 3** ** 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*End Step fortran子程序  下面的子程序是完整的,只需要修改下文件路径就能运行。CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 读取外界数据的子程序 SUBROUTINE UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)C INCLUDE 'ABA_PARAM.INC' INCLUDE 'INP_PARAM.INC' C DIMENSION TIME(2) C 定义全局数据块,所有的子程序都可以调用 COMMON/ampinfo/AMPLITUDE(AMP) DOUBLE PRECISION TEMP C 只在分析步开始的时候读取外部txt文件,其余的分析步不读取 if(lop.eq.0)thenC 这里的路径需要自己修改 OPEN(UNIT=111,FILE='C:\Users\nnn\Desktop\uexternaldb\user\ 1patch.txt',STATUS='UNKNOWN') C 读取外部txt文件 do ii=1,AMP read(111,*)TEMP AMPLITUDE(II)=TEMP enddo close(111) write(*,*)"***外部数据读取完毕(仅在分析开始之前读取)***" endif RETURN ENDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 施加位移的子程序 SUBROUTINE DISP(U,KSTEP,KINC,TIME,NODE,NOEL,JDOF,COORDS)C INCLUDE 'ABA_PARAM.INC' INCLUDE 'INP_PARAM.INC' C DIMENSION U(3),TIME(3),COORDS(3)C COMMON/ampinfo/AMPLITUDE(AMP) write(*,*)amplitude(kinc) u(1)=amplitude(kinc) RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 总结  上面的东西写的花里胡哨的,但是仔细一想,这不纯纯做无用功吗!abaqus自己就可以定义正弦曲线啊!那为什么还要费劲巴拉的在外部定义曲线,还通过两个子程序联合传递数据,这有什么意义呢?  是的,这个帖子如果就内容而言,纯纯没有任何实用价值,纯纯是六个手指头挠痒痒---多一道子!但是如果我们把这个工作流程进行抽象整理,我们再来看看这个帖子做了什么事。  我们首先生成了一些外部数据,然后用uexternaldb子程序读了进来,又通过公共数据快讲数据传递给了disp,最终施加了边界条件。  将上面的步骤拆开分析。uexternaldb可以用来读取外部数据,那这个外部数据的来源就值得考究,这个帖子就只是个简单的三角函数,而且只有一组数据,非常的简单,那假如我们需要导入的数据非常的复杂呢?而且没有任何的函数关系?再假如,如果我们导入的数据是别的软件或者程序实时生成并更新的呢?事情是不是的顿时变得非常有意思了?  一言以蔽之,uexternaldb子程序为abaqus与其他的程序进行联合方针埋下了伏笔!  再来分析一下disp施加边界条件的事情。这里只是施加了一个非常简单的位移边界条件,而且还是单个自由度的一组数据,非常简单,口算都行。但是,假如我们要给接触界面添加界面属性数据呢?假如我们要修改弹性模量呢,假如我们要给一道焊缝施加高斯热源呢?事情是不是的顿时变得非常有意思了?  复杂的事情都是由简单的事情组合起来的;麻雀虽小,五脏俱全,简单的事物也包含着复杂事物的所有基本流程。来源:有限元先生

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