Δημοσιεύτηκε: 18 Μάιος 2010, 20:17
από idomeneas
yallou έγραψε:
Κώδικας: Επιλογή όλων
SUBROUTINE DSYEV(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO)
CHARACTER(LEN=1)::JOBZ, UPLO
INTEGER::N,LDA,LWORK,INFO
COMPLEX(8),DIMENSION(:)::W,WORK
REAL(8),DIMENSION(:,:) :: A
Τα
Κώδικας: Επιλογή όλων
W,WORK
είναι REAL(8). Δες και εδώ πριν χρησιμοποιείς κάτι από LAPACK http://www.netlib.org/lapack/double/dsyev.f Μετά από αυτό θα έχεις ένα LWORK όπως το είπαμε, και το allocate θα γίνει για το WORK(LWORK). Τέλος σαν παρατήρηση. Για να χρησιμοποιείς DSYEV, θα πρέπει αυτό που λύνεις να είναι όντως ένα συμμετρικό πρόβλημα και τότε δεν υπάρχουν Complex μεταβλητές γιατί τα συμμετρικά μητρώα ως γνωστόν έχουν πραγματικές ιδιοτιμές-ιδιοδιανύσματα :)
Έτσι στο interface θα αλλάξεις το COMPLEX(8) σε REAL(8), και το ίδιο στο main program. Το WORK είναι το workspace που χρειάζεται η lapack και θα γίνει allocate με την τιμή του LWORK, και το αποτέλεσμα (eigenvalues) θα γίνει allocate για την τιμή step+1. Σε αυτό θα περιέχονται οι ιδιοτιμές (W στο interface).Κάνε αυτά και μετά πες αν δούλεψε.