J'ai les deux sous-routines donnés ci-dessous:Debugging Sous-programmes pour Defintions variables
SUBROUTINE DENSITYMATRIXNEW(X,C,A,B,RHONEW)
IMPLICIT NONE
COMPLEX*16, DIMENSION(DIMMAT,1),INTENT(IN)::X
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS) :: RHO
COMPLEX(KIND = DBL), DIMENSION(DIMSYS,DIMSYS), INTENT(OUT) :: RHONEW
REAL(KIND = DBL) :: ENERGYGAP, DELTA
REAL(KIND = DBL) :: ALPHA = SQRT(ENERGYGAP**2.0D0 + DELTA**2.0D0)
COMPLEX(KIND = DBL), DIMENSION(2,2), INTENT(IN) :: A, B
REAL(KIND=DBL), DIMENSION(2,2), INTENT(IN) :: C
REAL(KIND=DBL), DIMENSION(2,2) :: TEMP1
COMPLEX(KIND = DBL), DIMENSION(2,2) :: TEMP2
COMPLEX(KIND = DBL), DIMENSION(2,2) :: UNITARY, UNITARTCONJ
REAL(KIND = DBL) :: T
TEMP1 = COS((ALPHA*T)/2) * C
TEMP2 = ((ENERGYGAP/ALPHA)*A + (DELTA/ALPHA)*B)*SIN((ALPHA*T)/2)
UNITARY = TEMP1 - IMU * TEMP2
UNITARTCONJ = TEMP1 + IMU * TEMP2
CALL DENSITYMATRIX(X,RHO)
RHONEW = UNITARTCONJ*RHO*UNITARY
END SUBROUTINE DENSITYMATRIXNEW
SUBROUTINE EXPECTATION(X,C,A,B,D,ANS)
IMPLICIT NONE
COMPLEX*16, DIMENSION(DIMMAT,1),INTENT(IN) :: X
REAL(KIND = DBL), DIMENSION(2,2),INTENT(IN) :: C
COMPLEX(KIND = DBL), DIMENSION(2,2), INTENT(IN) :: A, B
COMPLEX(KIND = DBL),DIMENSION(DIMSYS,DIMSYS),INTENT(IN)::D
REAL(KIND = DBL), INTENT(OUT) :: ANS
COMPLEX(KIND = DBL), DIMENSION(DIMSYS, DIMSYS):: RHONEW
COMPLEX*16, DIMENSION(DIMSYS, DIMSYS) :: TEMP
INTEGER :: J
REAL(KIND = DBL)::SUMM
SUMM = 0.0D0
!CALL DENSITYMATRIX(X,RHO)
CALL DENSITYMATRIXNEW(X,C,A,B,D,RHONEW)
TEMP = MATMUL(D,RHONEW)
DO J = 1, DIMSYS
SUMM = SUMM + DREAL(TEMP(J,J))
END DO
ANS = SUMM
END SUBROUTINE EXPECTATION
Quand je les lance dans le cadre d'un programme plus vaste, je reçois les erreurs:
Que pourrait être le problème? Je pense avoir défini toutes les variables. Je n'arrive pas à déboguer le code.
Puis-je poser une question à propos du point 1? Est-il possible d'initialiser une variable locale dans la ligne de déclaration avec une autre variable locale (plutôt qu'avec une constante nommée)? Je l'ai essayé avec gfortran mais pas de succès (avec le message d'erreur ci-dessus). De plus, puisque l'initialisation implique automatiquement l'attribut SAVE, je suppose qu'il serait plus sûr d'assigner des valeurs après que toutes les déclarations de variables locales aient été faites. – roygvib
@roygvib Oui, il est certainement préférable d'initialiser après la déclaration, sauf si vous voulez vraiment ajouter l'attribut de sauvegarde (mais je l'ajouterais de toute façon explicitement de toute façon). Je pense que 'energygap' etc. devrait être déclaré comme paramètres pour que cela fonctionne (je vais éditer pour clarifier cela). –
Merci, je sens que le message d'erreur de gfortran ci-dessus est un peu déroutant ... (si n'importe quelle "variable" n'est pas autorisée pour l'utilisation dans l'initialisation) – roygvib