2016-05-19 2 views
1

Dans Fortran, j'ai un tableau 1D de type réel, real :: work(2*N), qui représente N nombres complexes. Je n'ai aucun impact de la déclaration du tableau.Application de la conjugaison au tableau réel (Fortran)

Plus tard, j'ai besoin d'appliquer une conjugaison complexe sur work. Cependant, conjg(work(:)) ne fonctionne pas car il est de type réel.

Existe-t-il un moyen efficace de convaincre le compilateur d'appliquer le conjg à ma matrice?

+0

Ou quelque chose comme 'travail (2 :: 2) = -1 * travail (2 :: 2)'? Non-testé, non testé, pas de Fortran sur cette machine. –

+1

encore plus laconiquement, 'work (2 :: 2) = - work (2 :: 2)' (testé ..) – agentp

Répondre

3

L'approche la plus simple est déjà dans le commentaire de HighPerformanceMark, il suffit de multiplier les éléments représentant la partie imaginaire par -1.

Vous pouvez également utiliser equivalence entre un tableau réel et un tableau complexe. Ce sera juste un tableau mais considéré comme réel et complexe. Peut-être pas strictement conforme à la norme (pas sûr), mais travailler aussi longtemps que N est constante.

L'équivalence est utilisé comme:

real :: work(2*N) 
complex :: cwork(N) 

!both work and cwork point to the same data 
equivalence (work, cwork) 

work = some_initial_value 

!this conjugates work at the same time as cwork because they are just different names for the same array 
cwork = conjg(cwork) 
+1

Je crois que 'l'équivalence' est absolument conforme aux normes, tant que le tableau complexe est déclaré exactement la moitié longueur du vrai. Par un test rapide, 'conjg' /' equivalence' est un peu plus rapide que l'opération de découpe. (Peut-être que vous devriez montrer un exemple) – agentp

2

Utilisez une variable complexe, COMPLEX :: temp(N) et appliquez la conjugaison à cela. Vous pouvez ensuite disséquer les parties réelles et complexes et les remettre dans votre tableau de travail en utilisant REAL(temp) et AIMAG(temp). Probablement, il est préférable de faire votre un type complexe dès le départ.