2017-07-29 5 views
1

J'ai essayé de compiler un programme et j'ai rencontré un problème simple. Cependant, je n'ai pas encore réussi à le résoudre. Toutes les idées sont très appréciées. Le programme ressemble à ce qui suit,Problème de compilation de gfortran avec une variable complexe double

code:

subroutine rescal(zy,nvar) 

    integer nvar,i, nexponent 
    double complex zy(nvar) 
    double precision maxabs, scalfac 

    maxabs = 0.d0 
    do i = 1, nvar 
    maxabs = max(zabs(zy),maxabs) 
    enddo 

maxabs ((rang 0)) doit stocker le maximum de zy et maxabs. Simple, non?

Je tente de compiler ce programme avec gfortran et d'obtenir l'erreur suivante. Je ne comprends pas pourquoi le compilateur se plaint que maxabs devrait être de rang 1 et non de rang 0. À ma compréhension, zabs est la bonne fonction à utiliser avec un nombre complexe double précision.

gfortran -e -Ofast -ffixed-line-length-none -std=legacy -c -o rescal.o rescal.f 
rescal.f:13.8: 

maxabs = max(zabs(zy),maxabs) 
1 
Error: Incompatible ranks 0 and 1 in assignment at (1) 
make: *** [rescal.o] Error 1 

Répondre

1

max est une fonction élémentaire qui, à l'aide d'un argument tableau renvoie un résultat de tableau. Votre problème ici, alors, est que zabs(zy) est un tableau.

Simplement, il vous manque la sélection d'un élément de zy comme on boucle:

do i = 1, nvar 
    maxabs = max(zabs(zy(i)),maxabs) ! Select the i-th element of zy 
enddo 

Cela dit, quelques points:

  • vous pouvez éviter zabs spécifique non standard en utilisant le générique abs; La fonction maxval est disponible.

Vous pouvez avoir la place

maxabs = MAXVAL(ABS(zy)) 
+0

Oh! Je vous remercie! J'ai dû être aveugle comme une chauve-souris pour ne pas voir l'index. Merci encore! – januka