Fortran 语言的 Abaqus DFLUX 子程序

Abaqus DFLUX subroutine in Fortran

这是我第一次 post 来这里,我希望我能清楚地描述我在 Abaqus subroutine 中遇到的问题。我是使用 Fortran 的新手。基本上,我的目标是在开口横截面管上定义非均匀表面热通量,我使用的是 DFLUX subroutine。 作为开放式横截面,通量受结构自阴影的影响,因此必须相应定义。 显然,子程序在每个积分点都被调用,因此这些点的坐标不会被存储,我每次只有一个点的 X、Y、Z 值。我想做的是将所有坐标存储在一个数组中,以便我可以比较不同的点以应用热通量的条件。 我已经阅读了有关 COMMON 块或 SAVE 命令的信息,但我找不到如何在我的子例程中使用这些选项。 我希望我已经足够清楚了。 这是我正在使用的子程序:

     SUBROUTINE DFLUX(FLUX,SOL,JSTEP,JINC,TIME,NOEL,NPT,COORDS,JLTYP,
 1 TEMP,PRESS,SNAME)

  INCLUDE 'ABA_PARAM.INC'

   REAL X,Y,Z,t,pi,theta
   parameter(pi=3.1415)
   DIMENSION COORDS(3),FLUX(2),TIME(2)

   CHARACTER*80 SNAME

  X=COORDS(1)-0.1 ! X coordinate of the center in global ref
  Y=COORDS(2)+0.1732 ! Y coord of the center in global ref
  Z=COORDS(3)
  t=TIME(2)
  theta=atan2(X,Y)
  if (JSTEP.eq.1) then !Step with heat flux impinging on structure
  !flux dependant on the angle of incidence
      if (theta.ge.0 .and.theta.le.pi/2 .or. theta.le.-pi/2) then
       flux(1)=1400*abs(cos(theta))
       flux(2)=0
    else !shadowed portion of the structure
       flux(1)=0
       flux(2)=0
    endif
  else
     STOP
  endif
  RETURN

  END

背景: Abaqus 提供了许多 Fortran 子程序 "templates"(fixed-format/F77 风格),允许用户获取特定信息或影响某些方面分析期间的解决方案,又名用户子程序。 Abaqus 控制何时调用用户子程序、传递什么信息 in/out 等。用户无法更改任何这些,也无法访问主程序或其专有源代码。但是,在用户子例程中,用户可以自由编写他们认为必要的任何有效代码。

在这个问题中,OP 希望存储来自对 dflux 用户子例程的每次调用的信息,以便其他子例程或对 dflux 子例程的其他调用可用。注意:dflux 不提供此功能,因此 OP 需要解决方法。

可能的解决方法: 幸运的是,dflux 用户子例程为当前调用提供了元素编号、集成点编号和空间坐标。此信息可能用于存储(和访问)您需要的任何数据。数据 storage/transfer 方法可以通过 COMMON 块、Fortran 模块、甚至文本文件或其他一些外部 "database" 来完成。

> 我推荐基于模块的方法。但是,请参阅 以了解如何使用 COMMON 块和模块的详细说明。

(EDIT) 为了完整起见,一个带有模块和 abaqus 子例程的非常简单的示例的结构如下:

module data_mod
  ! Any routine may access this module with the statement: "USE data_mod".
  ! Any variable within the module is then shared by those routines.

  implicit none

  ! You can use an allocatable array, but for this example I will assume
  ! there are 1000 or fewer points, and up to 10 values for each.
  real, dimension(1000,10) :: point_data

end module data_mod


subroutine dflux(....all the args...)
  ! Note: you must "USE" modules before any other statements in the routine.

  use data_mod

  ! Now you may carry on with the rest of your code. 
  ! Be sure to have the required "INCLUDE 'ABA_PARAM.INC" statement,
  ! which defines how abaqus implements "IMPLICIT REAL" for your machine,
  ! and all of the boilerplate variable declarations included with the 
  ! DFLUX subroutine template.

  include 'aba_param.inc'
  (...etc...)

  ! For simplicity, I am assuming you have a unique ID for each point, and
  ! each ID is numerically equal to one of the row indices in 'point_data'.
  ! When ready to read/write data in the 'point_data' array:

  ! Read data:
  neighbor_vals(:) = point_data(NEIGHBOR_ID, 2:)
  old_data_at_current_point(:) = point_data(ID, 2:)

  (...etc...)

  ! Write data:
  point_data(ID,2:4) = coords(:)
  point_data(ID,5) = result1
  point_data(ID,6) = result2

end subroutine dflux

> 您将需要选择一种数据容器类型和一些巧妙的组织概念 - 也许使用元素编号、集成点编号或 (x,y,z ) 坐标来唯一标识要存储的数据。例如,一个简单的二维 (MxN) 数组可能就足够了:每一行代表第 Mth 个积分点,第一列包含唯一的点标识符,其余的列包含您要从每个点存储的任何值。注意:确定哪些点是 "neighbors" 是您需要巧妙解决的另一个主题。完成此操作后,也许相邻点也可以存储在数组中,以便更快地访问。

> 您可以安全地从存储在数据容器中的其他集成点读取数据,但不要 write/change 存储在数据容器中的值(无论是在 COMMON 块或模块中)除非它是针对当前正在调用 dflux 的当前集成点。


旁注:

  1. 新用户通常认为他们在 Abaqus 用户子程序中编写 FORTRAN 77 时遇到困难。 They aren't.
  2. 将模块与 abaqus 用户子程序一起使用的最简单方法是将它们放在文件的顶部。然后 Abaqus 将在您 运行 分析时自动编译和 link 它们。