个人专栏—ABAQUS专栏
- Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法
- Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则
- 各向同性线弹性材料本构模型umat的应用 各向同性线弹性材料本构模型umat的应用
- ABAQUS用户子程序二次开发——UMAT介绍(一) ABAQUS用户子程序二次开发——UMAT介绍(一)
- Fortran语法介绍(一) Fortran语法介绍(一)
- Fortran语法介绍(二) Fortran语法介绍(二)
- Fortran语法介绍(三) Fortran语法介绍(三)
目录
- 个人专栏—ABAQUS专栏
- 矩阵运算与应用示例
-
数学运算:Fortran可用的数学运算符号包括
+,-,*,/,**
,四则运算规则- 乘幂有限,乘除次之,加减最后以及
()
先算 - 乘号不能省略
- 整数间的出发结果为整数,不会自动转为浮点数
- 不同类型数字间的运算,Fortran会将运算中的两数字形态转为精度较高者再做运算
- 输入数字后加
d0
可将该数转为双精度浮点数
- 乘幂有限,乘除次之,加减最后以及
-
逻辑运算符号包含:
==或.eq.
用于判断是否相等/=或.ne.
用于判断是否不等>或.gt.
用于判断是否大于>=或.ge.
用于判断是否大于或等于<或.lt.
用于判断是否小于<=或.le.
用于判断是否小于或等于.and.
连接两逻辑变量皆为真则为.true., 否则为.false..or.
连接两逻辑变量其一为真则为.true., 否则为.false..not.
用于否定连接其后的逻辑描述.eqv.
连接两逻辑变量相同则为.true.,否则为.false..neqv.
连接两逻辑变量不相同则为.true., 否则为.false.- 逻辑运算的优先顺序由
()
内先算,逻辑判别次之,逻辑连接最后
-
流程控制
!if 语句基本语法
if (逻辑判断式) then !程序区块开头
!--------------------------------!
!程序内容 !
!--------------------------------!
end if !程序区块结尾
C *** *******************************************************C
!加入逻辑判断
if (逻辑判断式) then
!--------------------------------!
!程序内容 !
!--------------------------------!
else
!--------------------------------!
!候补程序内容 !
!--------------------------------!
end if
C *** *******************************************************C
!搭配 else if 多重判断
if (逻辑判断式1) then
!--------------------------------!
!程序内容1 !
!--------------------------------!
else if (逻辑判断式2) then
!--------------------------------!
!程序内容2 !
!--------------------------------!
else if (逻辑判断式n) then
!--------------------------------!
!程序内容n !
!--------------------------------!
else
!--------------------------------!
!候补程序内容 !
!--------------------------------!
end if
若多重判断的条件是根据单一整数、字串或逻辑变量,可以使用select case使得程序更加简洁易读
select case (变量)
case (常数1)
!--------------------------------!
!程序内容1 !
!--------------------------------!
case (常数2)
!--------------------------------!
!程序内容2 !
!--------------------------------!
case (常数n)
!--------------------------------!
!程序内容n !
!--------------------------------!
case default
!--------------------------------!
!候补程序内容 !
!--------------------------------!
end select
循环语句
do counter =Is,Ie,d_I !Is为counter起始值,Ie为counter终止值,DI为counter增量
!--------------------------------!
!程序内容 !
!--------------------------------!
end do
C *** *******************************************************C
do while (逻辑判断式)
!--------------------------------!
!程序内容 !
!--------------------------------!
end do
矩阵运算与应用示例
- 加/减/乘/除
C *** ***********************C
DO I=1,N
DO J=1,N
C(I,J)=A(I,J)+B(I,J)
ENDDO
ENDDO
- 矩阵相乘
( A B ) i k = ∑ j = 1 n a i j b j k = a i 1 b 1 k , a i 2 b 2 k , ⋯ , a i n b n k (AB)_{ik}=\sum_{j=1}^n a_{ij}b_{jk}=a_{i1}b_{1k},a_{i2}b_{2k},\cdots ,a_{in}b_{nk} (AB)ik=j=1∑naijbjk=ai1b1k,ai2b2k,⋯,ainbnk
C *** ***********************C
PROGRAM MATRIX_MULTI
INTEGER ROW_A, COL_A, ROW_B, COL_B, A, B, C
C 不确定矩阵大小,先声明为极大矩阵
DIMENSION A(100,100), B(100,100), C(100,100)
C 分别输入矩阵A、B的列数、行数,矩阵B的行数必须等于矩阵A的列数
WRITE(*,*) "ENTER THE NUMBER OF THE ROWS FOR MATRIX A: "
READ(*,*) ROW_A
WRITE(*,*) "ENTER THE NUMBER OF THE COLUMNS FOR MATRIX A: "
READ(*,*) COL_A
WRITE(*,*) "THE NUMBER OF ROWS FOR MATRIX B MUST BE & EQUAL TO THE NUMBER OF COLUMNS FOR MATRIX A "
ROW_B=COL_A
WRITE(*,*) "ENTER THE NUMBER OF THE COLUMNS FOR MATRIX B: "
READ(*,*) COL_B
C 输入矩阵A的数值
DO I=1,COL_A
DO J=1,ROW_A
WRITE(*,10) J,I
10 FORMAT ("ENTER THE NUMBER OF A(",I2,",",I2,")")
READ(*,*) A(J,I)
ENDDO
ENDDO
C 输入矩阵B的数值
DO I=1,COL_B
DO J=1,ROW_B
WRITE(*,20) J,I
20 FORMAT("ENTER THE NUMBER OF B(",I2,",",I2,")")
READ(*,*) B(J,I)
ENDDO
ENDDO
C 显示矩阵B的数值
WRITE(*,*) "MATRIXB="
DO I=1,ROW_B
WRITE(*,200) (B(I,J),J=1,COL_B)
200 FORMAT (100(I5))
ENDDO
C 矩阵相乘运算
DO I=1,ROW_A
DO J=1,COL_B
C(I,J)=0
DO K=1,COL_A
C(I,J)=C(I,J)+A(I,K)*B(K,J)
ENDDO
ENDDO
ENDDO
C 输出相乘结果
WRITE(*,*) "AB="
DO I=1,ROW_A
WRITE(*,300) (C(I,J),J=1,COL_B)
300 FORMAT(100(I5))
ENDDO
ENDDO
- 向量内积
A ⃗ = [ a 1 , a 2 , ⋯ , a n ] B ⃗ = [ b 1 , b 2 . ⋯ , b n ] A ⃗ B ⃗ = ∑ j = 1 n a j b j = a 1 b 1 + a 2 b 2 + ⋯ + a n b n \begin{gather*} \vec{A}=[a_1,a_2,\cdots,a_n]\\ \vec{B}=[b_1,b_2.\cdots,b_n]\\ \vec{A}\vec{B}=\sum_{j=1}^n a_jb_j=a_1b_1+a_2b_2+\cdots+a_nb_n \end{gather*} A=[a1,a2,⋯,an]B=[b1,b2.⋯,bn]AB=j=1∑najbj=a1b1+a2b2+⋯+anbn
C *** ***********************C
PROGRAM INNER_PRODUCT
REAL A(100), B(100), C
C 输入向量的元素个数
INTEGER N
WRITE(*,*) "输入向量元素个数: "
READ(*,*) N
C 输入向量A与向量B的数值
WRITE(*,*) "输入A向量"
DO I=1,N
READ(*,*) A(I)
ENDDO
WRITE(*,*) "输入B向量:"
DO I=1,N
READ(*,*) B(I)
ENDDO
C 计算向量内积
C=0
DO I=1,N
C = C +A(I)*B(I)
ENDDO
C 输出向量内积结果
WRITE(*,10) C
10 FORMAT (1X,"A DOT B =",F8.2)
END
- 向量外积
A ⃗ = a 1 i ⃗ + a 2 j ⃗ + a 3 k ⃗ B ⃗ = b 1 i ⃗ + b 2 j ⃗ + b 3 k ⃗ A ⃗ × B ⃗ = ( a 2 b 3 − a 3 b 2 ) i ⃗ + ( a 3 b 1 − a 1 b 3 ) j ⃗ + ( a 1 b 2 − a 2 b 1 ) k ⃗ \begin{gather*} \vec{A}=a_1\vec{i}+a_2\vec{j}+a_3\vec{k}\\ \vec{B}=b_1\vec{i}+b_2\vec{j}+b_3\vec{k}\\ \vec{A}\times \vec{B}=(a_2b_3-a_3b_2)\vec{i}+(a_3b_1-a_1b_3)\vec{j}+(a_1b_2-a_2b_1)\vec{k} \end{gather*} A=a1i+a2j+a3kB=b1i+b2j+b3kA×B=(a2b3−a3b2)i+(a3b1−a1b3)j+(a1b2−a2b1)k
C *** ***********************C
PROGRAM OUT PRODUCT
REAL A(3), B(3), CROSS(3)
C 输入向量A与向量B的数值
WRITE(*,*) "输入A向量:"
DO I=1,3
READ (*,*) A(I)
ENDDO
WRITE(*,*) "输入B向量:"
DO I=1,3
READ (*,*) B(I)
ENDDO
C 计算向量外积
CROSS(1)=A(2)*B(3)-A(3)*B(2)
CROSS(2)=A(3)*B(1)-A(1)*B(3)
CROSS(3)=A(1)*B(2)-A(2)*B(1)
C 输出向量外积结果
WRITE(*,*) "A CROSS B: "
WRITE(*,10) (CROSS(I),I=1,3)
10 FORMAT (3(1X,F10.3))
END
欢迎对Abaqus感兴趣的朋友们查看:Abaqus-UMAT开发精品书籍及umat子程序学习
Abaqus非线性粘弹性模型子程序umat——广义MAXWELL粘弹性模型umat解析(朱-王-唐本构模型)
如果你喜欢以上内容,或者对Abaqus学习有兴趣,欢迎收藏关注,博主将持续更新。你的关注、收藏是我持续创作的动力!