Je suis nouveau sur Intel MKL. Voici un problème que j'ai rencontré - apparemment un problème non lié à MKL lui-même, mais au problème de comment déclarer et passer un tableau de taille jusqu'ici inconnue comme sortie d'un sous-programme vers un autre sous-programme.Passer un tableau de taille inconnue (sortie de sous-programme) vers un autre sous-programme
J'essaie d'utiliser mkl_ddnscsr pour convertir une matrice à son format RSE adapté pour les appels par Pardiso:
CALL mkl_ddnscsr(job,Nt,Nt,Adns,Nt,Acsr,ja,ia,info)
CALL PARDISO(pt,1,1,11,13,Nt,Acsr,ia,ja,perm,1,iparm,0,b,x,errr)
Le problème est, je ne sais pas ce que la longueur du formulaire CSR Acsr et l'indice vector ja avant d'appeler le sous-programme mkl_ddnscsr. Comment devrait-on déclarer Acsr et ja dans le programme principal, ou le sous-programme où se trouvent ces deux lignes?
J'ai essayé quelque chose comme
INTERFACE
SUBROUTINE mkl_ddnscsr(job, m, n, Adns, lda, Acsr, ja, ia, info)
IMPLICIT NONE
INTEGER :: job(8)
INTEGER :: m, n, lda, info
INTEGER, ALLOCATABLE :: ja(:)
INTEGER :: ia(m+1)
REAL(KIND=8), ALLOCATABLE :: Acsr(:)
REAL(KIND=8) :: Adns(:)
END SUBROUTINE
END INTERFACE
suivie
INTEGER, ALLOCATABLE :: ja(:)
REAL(KIND=8), ALLOCATABLE :: Acsr(:)
dehors de l'interface, dans le programme principal. Mais cette configuration me donne la faute de segmentation en cours d'exécution.
D'autre part, si je tente quelque chose comme
INTERFACE
SUBROUTINE mkl_ddnscsr(job, m, n, Adns, lda, Acsr, ja, ia, info)
IMPLICIT NONE
INTEGER :: job(8)
INTEGER :: m, n, lda, info
INTEGER :: ja(:), ia(m+1)
REAL(KIND=8) :: Acsr(:), Adns(:)
END SUBROUTINE
END INTERFACE
puis
INTEGER, DIMENSION(:) :: ja
REAL(KIND=8), DIMENSION(:) :: Acsr
Puis ifort me donner le message suivant:
error #6596: If a deferred-shape array is intended, then the ALLOCATABLE or POINTER attribute is missing; if an assumed-shape array is intended, the array must be a dummy argument.
Quelqu'un at-il une idée comment travailler autour de cela? Quelle est la bonne façon de déclarer ja et Acsr dans le programme principal (ou le sous-programme principal) et de les transmettre?
Notez que les sous-programmes font partie du package Intel MKL, pas quelque chose que j'écris seul, donc il semble que module
serait hors de question.
Utilisez le tag fortran. Vous n'avez pas besoin d'être répété dans le titre. 'kind = 8' est une odeur de code moche –