我开发了一个小例子来展示两个向量的相加。由于我不再安装 MKL,因此我使用了SAXPY
BLAS 的命令。原理应该是一样的。
首先,您使用适当的定义定义一个模块。在我的情况下,这将是在我的数据类型中保存一个真实数组的赋值(这只是一个方便的函数,因为您也可以直接访问该array
变量)和加法的定义。两者都是+
运算符和=
赋值的新重载。
在程序中,我定义了三个字段。其中两个被分配随机数,然后相加得到第三个字段。然后前两个字段存储在我的特殊变量中,并且此添加的结果存储在此类型的第三个变量中。
最后,通过直接访问数组来比较结果。请注意,从自定义数据类型到相同数据类型的分配已经定义(例如ffield3 = ffield1
已经定义。)
我的模块:
MODULE fasttype
IMPLICIT NONE
PRIVATE
PUBLIC :: OPERATOR(+), ASSIGNMENT(=)
TYPE,PUBLIC :: fastreal
REAL,DIMENSION(:),ALLOCATABLE :: array
END TYPE
INTERFACE OPERATOR(+)
MODULE PROCEDURE fast_add
END INTERFACE
INTERFACE ASSIGNMENT(=)
MODULE PROCEDURE fast_assign
END INTERFACE
CONTAINS
FUNCTION fast_add(fr1, fr2) RESULT(fr3)
TYPE(FASTREAL), INTENT(IN) :: fr1, fr2
TYPE(FASTREAL) :: fr3
INTEGER :: L
L = SIZE(fr2%array)
fr3 = fr2
CALL SAXPY(L, 1., fr1%array, 1, fr3%array, 1)
END FUNCTION
SUBROUTINE fast_assign(fr1, r2)
TYPE(FASTREAL), INTENT(OUT) :: fr1
REAL, DIMENSION(:), INTENT(IN) :: r2
INTEGER :: L
IF (.NOT. ALLOCATED(fr1%array)) THEN
L = SIZE(r2)
ALLOCATE(fr1%array(L))
END IF
fr1%array = r2
END SUBROUTINE
END MODULE
我的程序:
PROGRAM main
USE fasttype
IMPLICIT NONE
REAL, DIMENSION(:), ALLOCATABLE :: field1, field2, field3
TYPE(fastreal) :: ffield1, ffield2, ffield3
ALLOCATE(field1(10),field2(10),field3(10))
CALL RANDOM_NUMBER(field1)
CALL RANDOM_NUMBER(field2)
field3 = field1 + field2
ffield1 = field1
ffield2 = field2
ffield3 = ffield1 + ffield2
WRITE(*,*) field3 == ffield3%array
END PROGRAM