Can complex numbers be used in Fortran array constructors?

Click For Summary

Discussion Overview

The discussion revolves around the use of complex numbers in Fortran array constructors, specifically in the context of defining 2x2 matrices that incorporate complex exponential functions. Participants explore issues related to type mixing in array constructors and the proper declaration of complex matrices.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant describes the need to create 2x2 matrices using complex numbers and encounters an error when mixing real and complex types in an array constructor.
  • Another participant asserts that it is not possible to mix types in an array and suggests declaring the entire array as complex.
  • A different participant mentions that Fortran's generic EXP function can handle complex data types, allowing for direct calculations without separating real and imaginary parts.
  • A participant shares their Fortran code but continues to face issues, questioning whether using real values (1.0 and 0.0) in a complex array is the cause of the problem.
  • One participant proposes using complex representations for the real numbers, suggesting the use of (0.0, 0.0) and (1.0, 0.0) instead of just 0.0 and 1.0.
  • Another participant confirms that the suggestion to use complex representations resolves the issue.

Areas of Agreement / Disagreement

Participants generally agree that mixing types in an array constructor is not allowed, and there is a consensus on the need to declare matrices as complex. However, the discussion includes varying approaches to resolving the initial issues faced by the original poster.

Contextual Notes

Participants discuss the implications of using real numbers within a complex array and the potential need for conversion to complex types. The discussion does not resolve all aspects of the initial error encountered.

Lukejambo
Messages
13
Reaction score
0
Hi, so I need to write a fortran code with 2, 2x2 matrices.

These matrices are in the form of B=(1 exp(i)(theta) 0 0) and D=(0 0 exp(i)(theta) 1) where i is sqrt of -1 and theta is an angle between 0 and 2pi.

I've expanded the exponential so it reads cos(theta)+isin(theta) and let theta=pi/2

I've delcared i as complex in the form of i=(0.0,1.0) however as the matrices are declared as real with real components in them (ie: 0.0, 1.0) an error appears stating that "You cannot mix types in an array constructor (Complex(Kind=1)) in a real(Kind=1) constructor."

Is it possible to mix types in an array constructor or can I have the whole array as complex?

Any help would be much appreciated.
 
Technology news on Phys.org
Lukejambo said:
Hi, so I need to write a fortran code with 2, 2x2 matrices.

These matrices are in the form of B=(1 exp(i)(theta) 0 0) and D=(0 0 exp(i)(theta) 1) where i is sqrt of -1 and theta is an angle between 0 and 2pi.

I've expanded the exponential so it reads cos(theta)+isin(theta) and let theta=pi/2

I've delcared i as complex in the form of i=(0.0,1.0) however as the matrices are declared as real with real components in them (ie: 0.0, 1.0) an error appears stating that "You cannot mix types in an array constructor (Complex(Kind=1)) in a real(Kind=1) constructor."

Is it possible to mix types in an array constructor or can I have the whole array as complex?
No, you can't mix types in an array. Make the base type of the array COMPLEX.
Lukejambo said:
Any help would be much appreciated.
 
Also, Fortran's generic EXP function accommodates the COMPLEX data type, so you can do stuff like this:

Code:
      complex i, z
      real theta
      i = (0.0, 1.0)
      theta = 0.5
      z = exp (i*theta)
      print *, z
      end

No need to use Euler's identity to calculate the real and imaginary parts separately.
 
Thanks for your help, I've declared each matrix as complex and used exp(i)(theta) instead of cos and sine however the problem still remains, here is my programme below:

program
implicit none
REAL, PARAMETER :: pi=3.14159
real :: ph
complex, dimension(2,2) :: B, D
complex :: z, ic
ph= 1.0
ic = ( 0.0, 1.0 )

z = exp(ic*ph)

B = RESHAPE( (/ 1.0, z ,0.0,0.0 /), (/2.0,2.0/) )

D = RESHAPE( (/ 0.0,0.0,z,1.0 /), (/2.0,2.0/) )

write(6,'(2f4.1)') B, D

end program

Is it because I'm using 1.0 and 0.0 as real values inside a complex array?

If so, can I convert them so they're complex numbers?
 
Lukejambo said:
If so, can I convert them so they're complex numbers?

Have you tried using (0.0, 0.0) and (1.0, 0.0) instead of 0.0 and 1.0?
 
Thank you, that works!
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 5 ·
Replies
5
Views
1K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 21 ·
Replies
21
Views
3K
  • · Replies 8 ·
Replies
8
Views
4K
  • · Replies 12 ·
Replies
12
Views
3K
  • · Replies 9 ·
Replies
9
Views
5K
  • · Replies 6 ·
Replies
6
Views
3K