2016-08-22 5 views
0

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:

enter image description here

Que pourrait être le problème? Je pense avoir défini toutes les variables. Je n'arrive pas à déboguer le code.

Répondre

1

Vous avez plusieurs erreurs ici donc je vais essayer d'expliquer chacun des principaux

  1. REAL(KIND = DBL) :: ALPHA=SQRT(ENERGYGAP**2.0d0 + DELTA**2.0d0) - l'erreur dit energygap has not been declared or is a variable , which does not reduce to a constant expression. Vous avez corrigé le fait que vous avez déclaré energygap (et delta) dans densitymatrixnew mais vous ne leur avez pas donné de valeur afin que le compilateur ne sache pas quelle valeur définir alpha à. Essentiellement si vous voulez initialiser une variable dans la déclaration real :: a = b alors vous devez vous assurer que le compilateur sait ce que la valeur de b est au moment de la compilation. C'est en fait plus strict que cela et b doit être déclaré en tant que paramètre, j'ai donné un exemple en bas de la liste.

  2. Un Type mismatch dans l'appel de densitymatrixnew. Celui-ci est assez facile, vous avez déclaré densitymatrixnew pour prendre 5 arguments mais quand vous l'appelez, vous passez 6 arguments (notez l'argument supplémentaire D dans l'appel).

  3. Can't open module file ... vous devez vous assurer que vous avez compilé le fichier qui contient le module function_container avant d'essayer de compiler SBWOcohNew.f et faire en sorte que le fichier du module (* .mod) est disponible (plus facile à mettre juste dans ce répertoire).

J'espère que cela aide. À l'avenir, je vous recommande de copier et coller les erreurs sous forme de texte plutôt que de fournir une capture d'écran - cela rend tout plus facile.

Exemple pour le point 1. Seraient permis

subroutine test 
    implicit none 
    real, parameter :: b = 2.0 
    real :: a = b 
end subroutine 

mais les suivantes ne

subroutine test 
    implicit none 
    real :: b = 2.0 
    real :: a = b 
end subroutine 
+0

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

+0

@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). –

+0

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