2016-05-19 20 views
1

In Fortran habe ich ein 1D Array vom Typ real, real :: work(2*N), das N komplexe Zahlen darstellt. Ich habe keinen Einfluss auf die Deklaration des Arrays.Konjugation auf reales Array anwenden (Fortran)

Später muss ich eine komplexe Konjugation auf work anwenden. conjg(work(:)) funktioniert jedoch nicht, da es vom Typ real ist.

Gibt es eine effiziente Möglichkeit, den Compiler zu überzeugen, die conjg auf mein Array anzuwenden?

+0

Oder so etwas wie 'Arbeit (2 :: 2) = -1 * Arbeit (2 :: 2)':

wird als die Äquivalenz verwendet? Unversucht, ungetestet, kein Fortran auf dieser Maschine. –

+1

noch knappen, 'Arbeit (2 :: 2) = - Arbeit (2 :: 2)' (getestet ..) – agentp

Antwort

3

Der einfachste Ansatz ist bereits im Kommentar von HighPerformanceMark, multipliziere einfach die Elemente, die den Imaginärteil darstellen, mit -1.

Sie können auch equivalence zwischen einem realen Array und einem komplexen Array verwenden. Es wird nur ein Array sein, aber als real und komplex angesehen. Vielleicht nicht streng normkonform (nicht sicher) aber so lange wie N konstant ist.

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

Ich glaube, Äquivalenz 'ist absolut normkonform, solange das komplexe Array genau die Hälfte der erklärt wird Länge des echten. Durch einige schnelle Tests ist 'conjg' /' Äquivalenz' ein gutes Stück schneller als die Slice-Operation. (Vielleicht sollten Sie ein Beispiel zeigen) – agentp

2

Verwenden Sie eine komplexe Variable COMPLEX :: temp(N) und wenden Sie die Konjugation darauf an. Sie können dann die echten und komplexen Teile sezieren und sie wieder in Ihre Arbeitsmatrix einfügen, indem Sie REAL(temp) und AIMAG(temp) verwenden. Wahrscheinlich ist es besser, Ihre work von Anfang an eine komplexe Art zu machen.