Can complex numbers be used in Fortran array constructors?

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
5 replies · 9K views
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.
 
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?
 
Thank you, that works!