2 つのベクトルの加算を示す小さな例を作成しました。もう MKL をインストールしていないのでSAXPY
、BLAS のコマンドを使用しました。原則は同じはずです。
最初に、適切な定義でモジュールを定義します。私の場合、これは実際の配列をデータ型に保存するための割り当て (array
変数に直接アクセスすることもできるため、これは便利な関数にすぎません) と追加の定義です。どちらも、+
演算子と=
代入に対する新しいオーバーロードです。
プログラムでは、3 つのフィールドを定義します。そのうちの 2 つに乱数が割り当てられ、追加されて 3 番目のフィールドが取得されます。次に、最初の 2 つのフィールドが特殊変数に格納され、この加算の結果がこの型の 3 番目の変数に格納されます。
最後に、配列に直接アクセスして結果を比較します。カスタム データ型から同じデータ型への割り当ては既に定義されていることに注意してください (たとえば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