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
的当前集成点。
旁注:
- 新用户通常认为他们在 Abaqus 用户子程序中编写 FORTRAN 77 时遇到困难。 They aren't.
- 将模块与 abaqus 用户子程序一起使用的最简单方法是将它们放在文件的顶部。然后 Abaqus 将在您 运行 分析时自动编译和 link 它们。
这是我第一次 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" 来完成。
> 我推荐基于模块的方法。但是,请参阅
(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
的当前集成点。
旁注:
- 新用户通常认为他们在 Abaqus 用户子程序中编写 FORTRAN 77 时遇到困难。 They aren't.
- 将模块与 abaqus 用户子程序一起使用的最简单方法是将它们放在文件的顶部。然后 Abaqus 将在您 运行 分析时自动编译和 link 它们。