私はminimalexample.f90:
間違ったマトリックス乗算(Fortranの)
MODULE FUNCTION_CONTAINER
IMPLICIT NONE
SAVE
INTEGER, PARAMETER :: DBL = SELECTED_REAL_KIND(P = 15,R = 200)
INTEGER :: DIMSYS, DIMMAT
COMPLEX(KIND = DBL), DIMENSION(4,1) :: INSTATE_BASISSTATES
COMPLEX(KIND = DBL), DIMENSION(2,2) :: SIGMAX
REAL(KIND = DBL), DIMENSION(2,2) :: BASISSTATES
REAL(KIND = DBL), DIMENSION(2,2) :: ID
COMPLEX(KIND = DBL),DIMENSION(2,2) :: PROJECTOR
CONTAINS
SUBROUTINE INDEXCONVERTER(N,K,L)
IMPLICIT NONE
INTEGER, INTENT(IN)::N
INTEGER, INTENT(OUT)::K,L
INTEGER::X, REMAINDER
X = N/DIMSYS
REMAINDER = N - (X * DIMSYS)
IF (REMAINDER == 0) THEN
K = X
L = DIMSYS
ELSE
K = X + 1
L = REMAINDER
END IF
END SUBROUTINE INDEXCONVERTER
SUBROUTINE DENSITYMATRIX(X,RHO)
IMPLICIT NONE
COMPLEX(KIND = DBL), DIMENSION(DIMMAT,1), INTENT(IN) :: X
COMPLEX(KIND = DBL), DIMENSION(2,2),INTENT(OUT)::RHO
INTEGER :: J, K, L
DO J = 1, DIMMAT
CALL INDEXCONVERTER(J,K,L)
RHO(K,L) = X(J,1)
END DO
END SUBROUTINE DENSITYMATRIX
SUBROUTINE WRONGRESULT(X,RHONEW)
IMPLICIT NONE
COMPLEX(KIND = DBL), DIMENSION(DIMMAT,1), INTENT(IN) :: X
COMPLEX(KIND = DBL),DIMENSION(DIMSYS,DIMSYS),INTENT(OUT)::RHONEW
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: RHO
REAL(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: ID
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: SIGMAZ
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: SIGMAX
CALL DENSITYMATRIX(X,RHO)
RHONEW = matmul(SIGMAX,rho)
END SUBROUTINE WRONGRESULT
SUBROUTINE EXPECTATION(X,D,ANS)
IMPLICIT NONE
COMPLEX(KIND = DBL), DIMENSION(DIMMAT,1), INTENT(IN) :: X
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: RHONEW
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS), INTENT(IN) :: D
REAL(KIND = DBL),INTENT(OUT)::ANS
COMPLEX(KIND = DBL),DIMENSION(DIMSYS, DIMSYS) :: TEMP
INTEGER :: J
REAL(KIND = DBL)::SUMM
SUMM = 0.0D0
CALL WRONGRESULT(X,RHONEW)
TEMP = MATMUL(D,RHONEW)
DO J = 1, DIMSYS
SUMM = SUMM + DREAL(TEMP(J,J))
END DO
ANS = SUMM
END SUBROUTINE EXPECTATION
SUBROUTINE RK(ANSWER)
IMPLICIT NONE
REAL(KIND = DBL), INTENT(OUT) :: ANSWER
COMPLEX(KIND = DBL), DIMENSION(DIMMAT,1)::X
REAL(KIND = DBL) :: X_EXPECTATION
REAL(KIND = DBL)::T
T = 0.0D0
X = INSTATE_BASISSTATES
CALL EXPECTATION(X,SIGMAX,X_EXPECTATION)
ANSWER = X_EXPECTATION
END SUBROUTINE RK
END MODULE FUNCTION_CONTAINER
PROGRAM ONE
USE FUNCTION_CONTAINER
IMPLICIT NONE
REAL(KIND = DBL) :: ANS
SIGMAX(1,1) = (0.0D0,0.0D0)
SIGMAX(1,2) = (1.0D0,0.0D0)
SIGMAX(2,1) = (1.0D0,0.0D0)
SIGMAX(2,2) = (0.0D0,0.0D0)
ID(1,1) = 1.0D0
ID(1,2) = 0.0D0
ID(2,1) = 0.0D0
ID(2,2) = 1.0D0
DIMSYS = 2
DIMMAT = 4
BASISSTATES = ID
INSTATE_BASISSTATES(1,1) = (0.5D0,0.0D0)
INSTATE_BASISSTATES(2,1) = (0.5D0,0.0D0)
INSTATE_BASISSTATES(3,1) = (0.5D0,0.0D0)
INSTATE_BASISSTATES(4,1) = (0.5D0,0.0D0)
CALL RK(ANS)
WRITE (*,*) ANS
END PROGRAM ONE
に保存され、次の最小限の例を持って、私はそれを実行すると、コンパイラcygwin
は、すべての権利1と答えを出力します - 予想通り。今、サブルーチンが間違っていると、私はRHONEW.
の異なる式で遊んでいます。例えば、RHONEW = 2*RHO
で、私は答えとして2を得ます。再度、期待どおり。
今、私はRHONEW = matmul(id,rho)
と書いています。 RHO
の期待値を計算する前に、私が(些細なことながら)同一性を掛けているので、サブルーチンEXPECTATION
で定義されているように、私は答えとして1を取るべきです。代わりに、私は1.2732139384274929E-313.
完全な意味がありません。
何が起こっている可能性がありますか?私の実際のコードでは、私は、フォームの複雑なマトリックス乗算をしたい:
UCONJ
と
U
は行列の線形結合である
RHONEW = UCONJ*RHO*U,
。
些細な乗算でも正しい結果が得られません。私の問題に移行するために訂正できる可能性のあるエラー?
固定された形式で書いたスーパーバイザーからコードを入手したので、コードはすべてCAPSに入っています。コードは.f
と.f90
の両方の拡張子でコンパイルされます。
インデントを修正してください。固定形式でサポートされています。また、Fortranは大文字と小文字を区別しません。 –
@AlexanderVogtさて、大文字小文字を無視しましょう。私はそれが分かっている。私はこの形式で書かれたコードを得た。また、インデントは正しいとは限りません。私は '.f90.'を使用しています –
@ Aftab123確かに、コンパイラには関係ありません。しかし、あなたのコードをデバッグしようとする人にはそうです。人々があなたを助けてくれるようにしてください。 –