首页/文章/ 详情

基于Python输出Abaqus场变量数据

13小时前浏览5

简介


 

在有限元软件Abaqus中,场输出数据的提取通常可在后处理界面中借助创建XY Data或者使用Report选项中的Field Output功能来实现。然而,这些功能只适用于在提取的数据量较少时使用。如果需要同时提取多个Odb文件或多个分析步中的场输出数据,手动提取将变得非常繁琐。此时,使用Python可非常轻松地实现对场输出数据的批量提取。本文将主要介绍如何基于Python输出Abaqus场输出数据。

程序实现


 

为基于Python提出场输出数据,本文的主要思路为:首先,在Python程序中定义提出场输出数据所需要设定的一些参数,例如待提取Odb文件的路径和文件名,待提取数据所在的分析步和增量步,以及待提取的场输出变量的名称,如应力或应变结果。此外,大多数情况下我们并不需要提取整个模型中所有单元的场输出数据,因此需要指定待提取的单元或节点。考虑到当单元或节点数量较多时,在Python程序中直接指定单元或节点编号非常繁琐,因此最好是可以在后处理界面中以可视化地方式提前定义好单元或节点集,然后在Python程序中通过指定单元集或节点集的名称来访问指定的单元或节点。 实现上述功能所对应的代码片段下所示。

#-* - coding:UTF-8 -*-

#导入Abaqus模块
from odbAccess import *
from abaqusConstants import *

#提取参数定义
Odb_Path='C:/Users/Lenovo/Desktop/Field_Output_Extract/'     #Odb文件路径
Odb_Name='Plate.odb'                                         #Odb文件名称

Elem_Set_Name='Stress_Elem'                                  #单元集 合名称

Step_Name='Step-1'                     #待提取分析步名称(与Odb文件中分析步名称一致)
File_Variable_Label='E'               #待提取场变量(与Abaqus中定义一致)
Frame_Start=0                         #待提取增量步的起始编号
Frame_End=5                           #待提取增量步的终止编号


#------------------------------读取待提取的单元集中的单元号-----------------------
#以只读方式打开odb文件
My_Odb=openOdb(path=Odb_Path+Odb_Name,readOnly=True)


#读取用户指定的单元集 合
try:
 My_Elem_Set=My_Odb.rootAssembly.elementSets[Elem_Set_Name]
except:
 print('\n'*2)
 print("Error:The specified element set does not exist!")


#读取单元集 合中的单元号
My_Elem_Labels=[]
for Element in My_Elem_Set.elements:
for Sub_Element in Element:
  My_Elem_Labels.append(Sub_Element.label)
#------------------------------------------------------------------------------

在上述代码中,Odb_PathOdb_Name分别代表了Odb文件所在路径和Odb文件名。Elem_Set_Name代表用户定义的单元集 合名称。Step_Name为待提取场输出数据所在的分析步名称。File_Variable_Label为待提取场输出变量的名称,为了保证场输出变量被正确读取,必须与Abaqus中场变量的名称保持一致,如应力用S表示,应变用E表示。Frame_StartFrame_End为待提取场输出数据所在增量步的起始编号和终止编号,该参数允许提取多个增量步中的场输出数据。

首先,程序将通过openOdb方法以只读方式打开用户指定的Odb文件。然后,程序将基于用户指定的单元集名称,尝试在Odb文件中读取对应的单元集。如果没有找到同名的单元集,则程序将输出错误信息。

如果对应的单元集被找到,则对应于该单元集的elementSets对象将被存放于My_Elem_Set变量中。在elementSets对象中,单元编号存放于子对象elementSets.elements.label中。因此,程序将会遍历所有子对象,并将读取到的单元编号存放于变量My_Elem_Labels中。

待程序读取到用户指定的单元编号后,下一步即可根据单元编号获取该单元在指定分析步和增量步上的场输出数据。为了能够顺利找到单元对应的场输出数据,需要用户对于Abaqus的输出数据库对象的构成有一定了解。下图展示了Abaqus中数据库对象构成的示意图。

从图中可以看到,Abaqus数据库对象包含模型数据(Model Data)和结果数据(Results Data)两部分。其中模型数据包含部件、截面和材料等定义信息,而场输出(fieldOutputs)和时间历程输出(historyOutputs)则包含在结果数据中。需要注意的是,场输出对象的父对象为增量步(frames)对象,而增量步对象的父对象为分析步(steps)对象。这意味着,如果需要访问场输出数据,则需要首先确定待提取场输出数据所在的分析步和增量步。并且,如果需要获取多个增量步下的场输出数据,这需要逐个访问其对应的增量步对象,这是比较繁琐的地方。需要注意的是,在实际操作中笔者还发现,每个场输出对象只对应了在某个积分点或节点上的场输出数据,这取决于你需要提取的场变量类型。例如,对于应力或应变数据,由于是在积分点上获得的,因此每个单元的每个积分点对应一个场输出对象。而对于位移数据,由于是在节点上获得的,因此每个单元节点对应一个场输出对象。这意味着,对于采用全积分的单元,你必须访问不同的场输出对应来获得某个单元在所有积分点上的场输出数据。这里,本文的提取程序只讨论最简单的情况,即提取采用减缩积分单元在积分点上的场输出数据。如果需要提取全积分单元在多个积分点或者节点上的数据,则需要对本文提供的程序进行适当修改。

 实现提取减缩积分单元在积分点上的场输出数据的程序片段如下所示。

#------------------------------读取单元集中单元场输出变量值-----------------------
#读取指定分析步
My_Step=My_Odb.steps[Step_Name]

#读取指定分析步的增量步(遍历所有增量步)
print('\n'*100)
for Frame_Index in range(Frame_Start,Frame_End+1):
 My_Frame=My_Step.frames[Frame_Index]

#获取场输出值所在的全部对象(所有单元)
 Field_Value=My_Frame.fieldOutputs[File_Variable_Label].values

#创建快速查询字典 建立单元号与对象索引的关系(键:单元号  值:对象)
 Element_Map={}
for Val in Field_Value:
  Element_Map[Val.elementLabel]=Val

#读取单元集中单元场并格式化输出变量值
 print('\n'*2)
for Current_Label in My_Elem_Labels:
#格式化输出增量步号(9位右对齐整型)
  Formatted_Frame='%9d' % int(Frame_Index)

#格式化输出单元号(9位右对齐整型)
  Formatted_Label='%9d' % int(Current_Label)

#格式化输出场输出数据(12位对齐科学计数法)
  Formatted_Values=[]
for Val in Element_Map[Current_Label].data:
   Formatted_Val='%12.5e' % float(Val)
   Formatted_Values.append(Formatted_Val)

#拼接单元号及输出数据
  Output_Line=Formatted_Frame+'    '+Formatted_Label +'    ' + '    '.join(Formatted_Values)

#输出数据行至屏幕
  print(Output_Line)
#------------------------------------------------------------------------------

在上述程序片段中,My_Odb.steps[Step_Name]用于访问用户指定分析步的step对象,并将其存储在变量My_Step中。然后,My_Step.frames[Frame_Index]用于访问当前指定分析步中frame对象,Frame_Index代表当前指定分析步中frame对象的索引值,例如取值为0时代表初始增量步,取值为-1时代表最后一个增量。通过遍历所有的frame对象,即可访问所有增量步下场输出数据的取值。

My_Frame.fieldOutputs[File_Variable_Label].values代表用户指定的场变量的取值。需要注意的是,该对象包含的是整个模型中所有节点或单元的每个积分点在当前增量步下的场变量数据。对于采用减缩的单元,并且如果输出的场变量定义在单元的积分点上,如应力或应变等,则该对象包含的是所有单元的积分点在当前增量步下的场变量数据。如果用户需要获取指定单元集中所有单元的场变量数据,则需要首先访问其子对象    My_Frame.fieldOutputs[File_Variable_Label].values.elementLabel以获取当前对象所对应的单元号。通过判断其单元号是否与指定单元集中的单元号匹配来判断是否需要输出其场变量数据。为此,本文首先遍历所有对象,通过创建字典结构,来建立单元号与场变量对象之间的关系。其中字典Element_Map的键为单元号,键值为单元号所对应的场变量对象。这样,通过提供单元号即可快速获得该单元所对应的场变量对象。最后,通过访问子对象My_Frame.fieldOutputs[File_Variable_Label].values.data即可获得指定单元的场变量值。在本文中,这些场变量值被格式化输出至屏幕,在实际应用中,也可以将其以文本形式的输出。 

以下是基于Python批量输出Abaqus场变量的完整程序:

#-* - coding:UTF-8 -*-

#导入Abaqus模块
from odbAccess import *
from abaqusConstants import *

#提取参数定义
Odb_Path='C:/Users/Lenovo/Desktop/Field_Output_Extract/'     #Odb文件路径
Odb_Name='Plate.odb'                                         #Odb文件名称

Elem_Set_Name='Stress_Elem'                                  #单元集 合名称

Step_Name='Step-1'                     #待提取分析步名称(与Odb文件中分析步名称一致)
File_Variable_Label='E'                #待提取场变量(与Abaqus中定义一致)
Frame_Start=0                          #待提取增量步的起始编号
Frame_End=5                            #待提取增量步的终止编号


#------------------------------读取待提取的单元集中的单元号-----------------------
#以只读方式打开odb文件
My_Odb=openOdb(path=Odb_Path+Odb_Name,readOnly=True)


#读取用户指定的单元集 合
try:
 My_Elem_Set=My_Odb.rootAssembly.elementSets[Elem_Set_Name]
except:
 print('\n'*2)
 print("Error:The specified element set does not exist!")


#读取单元集 合中的单元号
My_Elem_Labels=[]
for Element in My_Elem_Set.elements:
for Sub_Element in Element:
  My_Elem_Labels.append(Sub_Element.label)
#------------------------------------------------------------------------------

#------------------------------读取单元集中单元场输出变量值-----------------------
#读取指定分析步
My_Step=My_Odb.steps[Step_Name]

#读取指定分析步的增量步(遍历所有增量步)
print('\n'*100)
for Frame_Index in range(Frame_Start,Frame_End+1):
 My_Frame=My_Step.frames[Frame_Index]

#获取场输出值所在的全部对象(所有单元)
 Field_Value=My_Frame.fieldOutputs[File_Variable_Label].values

#创建快速查询字典 建立单元号与对象索引的关系(键:单元号  值:对象)
 Element_Map={}
for Val in Field_Value:
  Element_Map[Val.elementLabel]=Val

#读取单元集中单元场并格式化输出变量值
 print('\n'*2)
for Current_Label in My_Elem_Labels:
#格式化输出增量步号(9位右对齐整型)
  Formatted_Frame='%9d' % int(Frame_Index)

#格式化输出单元号(9位右对齐整型)
  Formatted_Label='%9d' % int(Current_Label)

#格式化输出场输出数据(12位对齐科学计数法)
  Formatted_Values=[]
for Val in Element_Map[Current_Label].data:
   Formatted_Val='%12.5e' % float(Val)
   Formatted_Values.append(Formatted_Val)

#拼接单元号及输出数据
  Output_Line=Formatted_Frame+'    '+Formatted_Label +'    ' + '    '.join(Formatted_Values)

#输出数据行至屏幕
  print(Output_Line)
#------------------------------------------------------------------------------


来源:FEM and FEA
ACTAbaqusSTEPSpython材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-04-16
最近编辑:13小时前
追逐繁星的Mono
硕士 签名征集中
获赞 52粉丝 112文章 68课程 0
点赞
收藏
作者推荐

基于Abaqus用户子程序UEXTERNALDB调用外部文件数据

Abaqus用户子程序UEXTERNALDB常用于在Abaqus/Standard求解器运行时,实现Abaqus与外部程序之间的通信,如交换数据等。本文将通过一个简单案例,介绍如何基于Abaqus用户子程序UEXTERNALDB实现对外部文件数据的调用。计算案例 考虑线弹性断裂力学中的一个典型案例:一个中心裂纹板的裂纹面上承受有非均布载荷作用,这个非均布载荷通过一个分段三次样条函数来描述。在第i个分段上,该非均布载荷可表示为: 式中:αi,βi,γi和δi为分段样条函数的系数,si-1和si为第i个分段的区间下限和上限。为了求解中心裂纹板在该非均布载荷作用下的应力分布,我们可以通过Abaqus用户子程序DLOAD或解析场来定义该非均布载荷。因此,本文建立了如图1所示的1/4对称有限元模型。图中,紫色箭头代表了DLOAD子程序的载荷定义域,也就是非均布载荷的作用区域。 图1 中心裂纹板1/4对称有限元模型 事实上,当这个非均布载荷非常简单时,我们可以直接在DLOAD用户子程序中定义该非均布载荷的表达式。然而,这种方法的缺点是,每当我们需要更改该非均布载荷时,则需要重新修改并编译子程序。并且,当需要修改的系数较多时,直接修改子程序将非常繁琐。因此,一种更为简便的方式是将非均布载荷的系数数据存储在外部文件中,以供DLOAD子程序调用。这样,当我们需要修改非均布载荷的系数时,只需要更改外部文件的数据即可,而无需修改并重新编译子程序。为此,我们构建了一个如下所示的子程序。该子程序由DLOAD子程序和UEXTERNALDB子程序构成。UEXTERNALDB子程序用于读取定义非均布载荷系数的外部文件,并将数据传递给出DLOAD子程序。而DLOAD子程序则根据传递得到的系数实现非均布载荷的施加。CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 程序用于在裂纹面上施加非均布载荷CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C-------------------------------------------------------------------------C 读取存放非均布载荷分段样条曲线系数的外部文本文件C------------------------------------------------------------------------- SUBROUTINE UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)C INCLUDE 'ABA_PARAM.INC'C DIMENSION TIME(2) DIMENSION INTV(1),REALV(1) CHARACTER*256 CHARV(1) CHARACTER*256 OUTDIR !Abaqus结果文件输出目录 CHARACTER*14 EDS_FILE_NAME !非均布载荷系数外部文件名 INTEGER::I !循环计数指标 INTEGER::FILE_PT_INDEX=1 !外部文件读取索引 INTEGER,PARAMETER::EDS_COEFF_NUM=6 !非均布载荷系数数量 REAL::EDS_DATA_ALPHA(EDS_COEFF_NUM) !分段样条曲线系数Alpha REAL::EDS_DATA_BETA(EDS_COEFF_NUM) !分段样条曲线系数Beta REAL::EDS_DATA_GAMMA(EDS_COEFF_NUM) !分段样条曲线系数Gamma REAL::EDS_DATA_DELTA(EDS_COEFF_NUM) !分段样条曲线系数Delta REAL::EDS_DATA_LOWER_RANGE(EDS_COEFF_NUM) !分段样条曲线区间下限 REAL::EDS_DATA_UPPER_RANGE(EDS_COEFF_NUM) !分段样条曲线区间上限 COMMON /EDS_DATA/ EDS_DATA_ALPHA, !定义为全局变量 & EDS_DATA_BETA,EDS_DATA_GAMMA, & EDS_DATA_DELTA,EDS_DATA_LOWER_RANGE, & EDS_DATA_UPPER_RANGE C 读取Abaqus结果文件输出目录(工作目录) CALL GETOUTDIR(OUTDIR,LENOUTDIR) EDS_FILE_NAME="EDS_Coeff.txt" C 读取非均布载荷分段样条曲线系数 IF(LOP.EQ.0)THEN OPEN(110,FILE=TRIM(OUTDIR)//"\"//EDS_FILE_NAME) DO WHILE(.NOT.EOF(110)) READ(110,*) EDS_DATA_ALPHA(FILE_PT_INDEX), & EDS_DATA_BETA(FILE_PT_INDEX), & EDS_DATA_GAMMA(FILE_PT_INDEX), & EDS_DATA_DELTA(FILE_PT_INDEX), & EDS_DATA_LOWER_RANGE(FILE_PT_INDEX), & EDS_DATA_UPPER_RANGE(FILE_PT_INDEX) FILE_PT_INDEX=FILE_PT_INDEX+1 END DO CLOSE(110) END IF C 输出非均布载荷分段样条曲线系数至MSG文件 CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV) CALL STDB_ABQERR(1,"EDS Coefficient Output ",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线系数Alpha CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV) CALL STDB_ABQERR(1,"Coefficient Alpha Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_ALPHA(I) CALL STDB_ABQERR(1,"Alpha(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线系数Beta CALL STDB_ABQERR(1,"Coefficient Beta Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_BETA(I) CALL STDB_ABQERR(1,"Beta(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线系数Gamma CALL STDB_ABQERR(1,"Coefficient Gamma Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_GAMMA(I) CALL STDB_ABQERR(1,"Gamma(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线系数Delta CALL STDB_ABQERR(1,"Coefficient Delta Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_DELTA(I) CALL STDB_ABQERR(1,"Delta(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线区间下限 CALL STDB_ABQERR(1,"EDS Lower Limit Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_LOWER_RANGE(I) CALL STDB_ABQERR(1,"Lower Limit(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV)C 输出非均布载荷分段样条曲线区间上限 CALL STDB_ABQERR(1,"EDS Upper Limit Table: ",INTV,REALV,CHARV) DO I=1,EDS_COEFF_NUM INTV(1)=I REALV(1)=EDS_DATA_UPPER_RANGE(I) CALL STDB_ABQERR(1,"Upper Limit(%I)=%R ",INTV,REALV,CHARV) END DO CALL STDB_ABQERR(1,"---------------------------",INTV,REALV,CHARV) RETURN ENDC-------------------------------------------------------------------------C 施加非均布载荷分布至裂纹面C------------------------------------------------------------------------- SUBROUTINE DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT, & COORDS,JLTYP,SNAME)C INCLUDE 'ABA_PARAM.INC'C DIMENSION TIME(2),COORDS(3) CHARACTER*80 SNAME CHARACTER*256 CHARV(1) CHARACTER*256 OUTDIR INTEGER::I !循环计数索引 INTEGER::INTERVAL_INDEX !分段样条区间号 C 读取全局变量数据 INTEGER,PARAMETER::EDS_COEFF_NUM=6 !非均布载荷系数数量 REAL::EDS_DATA_ALPHA(EDS_COEFF_NUM) !分段样条曲线系数Alpha REAL::EDS_DATA_BETA(EDS_COEFF_NUM) !分段样条曲线系数Beta REAL::EDS_DATA_GAMMA(EDS_COEFF_NUM) !分段样条曲线系数Gamma REAL::EDS_DATA_DELTA(EDS_COEFF_NUM) !分段样条曲线系数Delta REAL::EDS_DATA_LOWER_RANGE(EDS_COEFF_NUM) !分段样条曲线区间下限 REAL::EDS_DATA_UPPER_RANGE(EDS_COEFF_NUM) !分段样条曲线区间上限 COMMON /EDS_DATA/ EDS_DATA_ALPHA, !定义为全局变量 & EDS_DATA_BETA,EDS_DATA_GAMMA, & EDS_DATA_DELTA,EDS_DATA_LOWER_RANGE, & EDS_DATA_UPPER_RANGE C 判断当前材料点是否位于裂纹面 IF ((COORDS(1).LT.EDS_DATA_LOWER_RANGE(1)).OR. & (COORDS(1).GT.EDS_DATA_UPPER_RANGE(EDS_COEFF_NUM)))THEN CALL STDB_ABQERR(-3,"Loading region is beyond crack surface", & INTV,REALV,CHARV) END IF C 判断当前材料点所在分段样条区间号 DO I=1,EDS_COEFF_NUM IF ((COORDS(1).GE.EDS_DATA_LOWER_RANGE(I)).AND. & (COORDS(1).LE.EDS_DATA_UPPER_RANGE(I)))THEN INTERVAL_INDEX=I EXIT END IF END DO C 计算当前材料点上的非均布载荷值 F=EDS_DATA_ALPHA(INTERVAL_INDEX)*COORDS(1)**3+ & EDS_DATA_BETA(INTERVAL_INDEX)*COORDS(1)**2+ & EDS_DATA_GAMMA(INTERVAL_INDEX)*COORDS(1)+ & EDS_DATA_DELTA(INTERVAL_INDEX) RETURN END 下面,本文将对该子程序的实现流程做简要介绍。在UEXTERNALDB子程序中,字符串变量EDS_FILE_NAME用于定义存放非均布载荷外部数据的文件名。EDS_COEFF_NUM变量为非均布载荷的分段数,为了保证数据能被正常读取,必须填写正确的分段数。EDS_DATA_ALPHA等变量则用于定义非均布载荷的系数和区间上、下限。这里,COMMON指令用于将这些变量定义为全局变量,使其能够被传递到DLOAD子程序中。然后,UEXTERNALDB子程序将根据指定的文件名找到对应的外部数据文件,并通过READ函数循环读取外部文件数据,并将其存放到相应的变量中。注意,这里我们使用了UEXTERNALDB子程序提供的LOP变量来判断读取数据文件的时机。这里,我们设置为当LOP变量取值为0时开始读取外部文件数据,这代表数据文件是在计算开始时被调用的。我们也可以通过判断LOP变量的取值来实现在计算过程的其他阶段来读取外部文件。事实上,这正是使用UEXTERNALDB子程序读取外部文件的优势。它允许我们可以控制在计算过程的特定阶段来读写外部文件数据。当然,我们也可以在DLOAD子程序中通过READ函数来读取外部文件。然而,由于DLOAD子程序将在每次进入积分点时均被调用一次,这意味在每个积分点上,都将执行一次文件读写,这将严重降低计算效率。虽然我们可以通过指定增量步或分析步号来判断外部文件的读写时机,但这并不是一种较好的解决方法。在DLOAD子程序中,我们将同样通过COMMON指令来接收全局变量的取值,并基于外部文件定义的数据来实现非均布载荷的施加,这里不再赘述。需要该案例完整计算文件的读者可在公 众号回复ARB_CFT获取。UEXTERNALDB子程序简介 用户子程序UEXTERNALDB:l 可以在每次分析的开始时刻、每个增量步的开始时刻、每个增量步的结束时刻以及每次分析的结束时刻被分别调用一次(此外,也会在重启动分析的开始时刻被调用一次);l 可以用于与其他软件或Abaqus/Standard中的其他子程序进行通信;l 可以用于在分析的开始时刻打开用于其他用户子程序的外部文件,或者在分析的结束时刻关闭这些外部文件;l 可以用于在每个增量步的开始时刻计算或读取历程信息。这些信息能够被写入用户自定义COMMON块或外部文件,以便在分析中被其他子程序调用;l 还可以用于将用户计算的历程信息的当前值写入到外部文件。 子程序接口 需要定义的变量用户子程序UEXTERNALDB在被调用后无需用户更改子程序中变量的取值。 提供参考信息的变量当用户子程序UEXTERNALDB被调用后,以下变量的取值可以被用户读取,以便为需要执行的操作提供参考信息。LOPLOP=0表明子程序正在分析的开始时刻被调用。LOP=1表明子程序正在当前分析增量步的开始时刻被调用。如果在当前分析增量步下计算无法收敛,需要更小的时间增量,则该子程序会在分析增量步的开始时刻被多次调用。LOP=2表明子程序正在当前分析增量步的结束时刻被调用。此时,所有在重启动分析中用户需要用到信息必须被写入到外部文件。LOP=3表明子程序正在分析的结束时刻被调用。LOP=4表明子程序正在重启动分析的开始时刻被调用。此时,所有必须的外部文件都应该被打开并合理放置,所有重启动分析用到信息也应该从外部文件中被读入。LOP=5表明子程序正在当前分析步的开始时刻被调用。变量KSTEP中包含了当前的分析步号。LOP=6表明子程序正在当前分析步的结束时刻被调用。变量KSTEP中包含了当前的分析步号。TIME(1)当前分析步时间TIME(2)总的分析步时间DTIME时间增量KSTEP当前分析步号。如果LOP=4,则KSTEP为重启动分析步号。KINC当前增量步号。如果LOP=4,则KINC为重启动增量步号。 来源:FEM and FEA

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