Fortran语法介绍(二)

个人专栏—ABAQUS专栏

  1. Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法
  2. Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则
  3. 各向同性线弹性材料本构模型umat的应用 各向同性线弹性材料本构模型umat的应用
  4. ABAQUS用户子程序二次开发——UMAT介绍(一) ABAQUS用户子程序二次开发——UMAT介绍(一)
  5. Fortran语法介绍(一) Fortran语法介绍(一)
  6. Fortran语法介绍(二) Fortran语法介绍(二)
  7. Fortran语法介绍(三) Fortran语法介绍(三)


声明

  • 变量类型声明:目的是在编辑器中指明预留存储空间的类型

    • Fortran 使用的变量类型声明包括整数(integer)、浮点数(real)、复数(complex)、字符串(character)和逻辑变量(logical)五种

    • 声明变量类型和大小: type(n)::var

  INTEGER(4)::age       !声明一个长整数变量age
  INTEGER(2)::age       !声明一个短整数变量age
  REAL(8)::temperature  !声明一个双精度浮点实数变量temperature
  REAL(4)::temperature  !声明是个单精度实数变量temperature
  COMPLEX(16)::z        !声明一个双精度复数变量z
  COMPLEX(8)::z         !声明是个单精度复数变量z
  LOGICAL:: is_valid    !声明一个逻辑变量 is_valid
  CHARACTER(10):: name  !声明一个长度为10的字符串变量name
  • 程序内定变量类型:若程序中出现未声明变量,Fortran编译器会根据变量名称的第一个英文字母,自行分配变量类型,该内定规则由指令implicit自行定义:
  implicit real(a-h,o-z)      !变量名称在字母a-h,o-z范围内分配浮点数变量
  implicit integer(i-n)       !变量名称在字母i-n范围内分配为整数变量
  implicit none               !声明不适用编译器自行分配变量
  !注意:未声明类型的变量不具备任何类型,在编译时会报错
  • 数组声明规则:type::arr(Ne),type为数组类型,arr为自定义数组名,Ne为正整数代表数组大小,多维数组各维度间以,分割
INTEGER::my_array(5)            !声明一个大小为5的整数一维数组
REAL::matrix(3,3)               !声明一个大小为3X3的实数二维数组
!初始化数组列表
INTEGER::my_array(3)=[1,2,3]
!使用赋值语句逐个赋值
INTEGER::my_array(3)
my_array=[1,2,3]
!使用循环结构进行赋值
INTEGER::i
INTEGER::my_array(3)
DO i=1,3
    my_array(i)=i
!访问数组元素,Fortran内定数组索引从1开始
value=my_array(5)               !索引包含a(1)、a(2)、a(3)、a(4)、a(5)五个整数元素
value=my_array(1:5)
value=array(-3:1)               !索引该数组次序为a(-3)、a(-2)、a(-1)、a(0)、a(1)
!二维数组,第一个索引表示行,第二个索引表示列
value=matrix(2,3)               !索引访问二维数组的第二行第三列
  • 初值设定:Fortran中变量初值设定有两种方法:直接声明和使用data指令
!直接声明
INTEGER::a=1,b=2
REAL::c=3.0
COMPLEX::d=(1.0,2.0)
CHARACTER*10::str=``Fortran 90``
!data指令
INTEGER::a,b
REAL::c
data a,b,c /1,2,3.0/
!数组初值设定几种方法
INTEGER::a(5)=(/1,2,3,4,5/)
REAL::matrix(2,2)=reshape([1.0,2.0,3.0,4.0],[2,2])
INTEGER::a(5)
data a /1,2,3,4/
INTEGER::a(5)=(/(I,I=1,4),4/)
data a /(I,I=1,4),4/
  • 常数声明关键词为parameter
REAL,PARAMETER::pi=3.1415926
REAL::g
PARAMETER(g=9.81)
  • 动态数组声明关键词为allocatable,动态数组声明相对耗时长,频繁使用会拖慢程序运算速度,应谨慎使用
INTEGER::I=3,J=10
real,allocatable::mtx(:,:)          !allocatable声明二维动态数组
write(*,*) allocated(mtx)           !allocated判断动态数组是否赋值
allocate(mtx(0:I,J))                !allocate对动态数组赋值
write(*,*) allocated(mtx)
deallocate(mtx)                     !deallocate对数组大小归零释放存储空间
write(*,*) allocate(mtx)       
  • 参数声明:参数传入子程序时仅含其存储位置,不含参数类型,即使子程序内外参数类型不同也能够同时运行,使用者应注意避免因参数类型不一致导致的程序运行错误。
  • 变量的存储周期:在子程序运行结束后,子程序中的变量存储空间会被释放,若希望某些变量值能保存至所有程序运行阶数,可使用save或common命令
save var_1,...,var_n
!save为子程序中的变量预留一个永久的存储空间,变量仅能为子程序调用
common /group_name/ var_1,...,var_n
!common为全域变量向编辑器预留一个永久存储空间供各程序模块调用
!group_name为自定义变量数组命名

UMAT变量存储:编写UMAT子程序时,若需要使用全域变量,自定义数组名建议以K开头,避免意外存取以被Abaqus声明的全域变量数组。

  • 函数声明
function function_name (var_1,...,var_n)        !函数声明
type function function_name (var_1,...,var_n)   !子程序函数变量类型声明
!主程序函数变量声明必须以external区别于一般函数变量声明
type,external :: function_name
  • 输入与输出
!unit定义输入/输出位置,fmt定义输入/输出格式
!unit为*时,代表使用程序预设位置,fmt为*时,代表使用预设格式
write(unit,fmt)     !屏幕输出unit为*,相对应的数值代码为6
read(unit,fmt)      !键盘输入unit为*,相对应的数值代码为5
read(*,*)           !读入整数I
write(*,*)          !屏幕输出整数I

在编写UMAT时若因除错等原因有输出需求时可以unit=7输出至Abaqus/Standard的信息档案.msg,或unit=6输出至Abaqus/Standard的输出档案.dat

  • 常用格式化输出/输入指令
    1. A[w]:以w个字符宽度输出/输入字,多出的宽度会补上空格
    2. Iw[.n]:以w个字符宽度输出/输入整数,最少须包含n个数字。多出的宽度会补上空格,位数不足n者补上0,需要字符不足时,会输出*
    3. Fw.d:以w个字符宽度输出/输入浮点数,小数部分占d个字符宽度。整数多出的宽度会补上空格,需要字符不足时,会输出*;小数多出的宽度会补0,需要字符不足时,会进行四舍五入。
    4. Ew.d[Ee]:以w个字符宽度输出/输入浮点数的科学记号,小数部分占d个字符宽,指数部分占e个字符宽。
    5. ESw.d[Ee]:基本同Ew.d[Ee],进队非零浮点数而言,E格式的个位数恒为0,ES格式的个位数为1到9。
    6. Lw:以w个字符宽度输出/输入逻辑变量(T或F)
    7. nX:把输出/输入的位置向右移动n个字符宽度
    8. /:换行
    9. 字符串:输出/输入格式中可输入字符串,作为输出资料的说明。

应用示例

      program format_test
      ! -------------------------------!
      write(*,"('""格式化输出测试""')")
      write(*,100)
      write(*,"(A5,I5,L5)") 'hi',100,.true.
      !A5、I5与L5分别代表以5个字符宽度输出字符串、整数和逻辑变量
      write(*,"(E15.5,/,F10.5)") 63.42,945.38
      !E15.5代表以15个字符宽度、5个有效位数与科学计数方式输出浮点数
      !F10.5代表以10个字符宽度输出取值至小数点后5位的浮点数
      !/在此代表强制换行
      write(*,100)
100   format('----5----0----5----0')
      ! -------------------------------!
      end program format_test

输出结果如下:

"格式化输出测试"
----5----0----5----0
 hi   100     T
  0.63420E+02
945.38000
----5----0----5----0

欢迎对Abaqus感兴趣的朋友们查看:Abaqus-UMAT开发精品书籍及umat子程序学习
在这里插入图片描述

Abaqus非线性粘弹性模型子程序umat——广义MAXWELL粘弹性模型umat解析(朱-王-唐本构模型)

在这里插入图片描述

如果你喜欢以上内容,或者对Abaqus学习有兴趣,欢迎收藏关注,博主将持续更新。你的关注、收藏是我持续创作的动力!

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科研拓展人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值