Fortran, complex array with rank one

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
7 replies · 10K views
_Andreas
Messages
141
Reaction score
1
I'm using the MATMUL command to multiplicate two arrays: array A is of rank one and has three complex elements, while array B is a 3x3 matrix with complex elements. However, the compilation is aborted because "the shapes of the array expressions do not conform". I'm pretty sure that the operation MATMUL(B,A) should yield a 3x1 array with complex elements, so I suspect that the expression defining array A isn't correct. Right now it looks like this:

A=[0.e0+0.e0, 0.e0+0.e0, 1.e-29+0.e0]

(I'm only interested in the real part of the last element for the moment.) Is this really the way to express a complex, rank one array?
 
Physics news on Phys.org
_Andreas said:
I'm using the MATMUL command to multiplicate two arrays: array A is of rank one and has three complex elements, while array B is a 3x3 matrix with complex elements. However, the compilation is aborted because "the shapes of the array expressions do not conform". I'm pretty sure that the operation MATMUL(B,A) should yield a 3x1 array with complex elements, so I suspect that the expression defining array A isn't correct. Right now it looks like this:

A=[0.e0+0.e0, 0.e0+0.e0, 1.e-29+0.e0]

(I'm only interested in the real part of the last element for the moment.) Is this really the way to express a complex, rank one array?

You can't multiply an array of rank 1 by an array of rank 2.

MATMAL(B,A) will work if B is rank 3x3 and A is rank 3x1, and the result will be rank 3x1
 
sylas said:
You can't multiply an array of rank 1 by an array of rank 2.

MATMAL(B,A) will work if B is rank 3x3 and A is rank 3x1, and the result will be rank 3x1

That's strange, because this is what it says in the book NUMERICAL RECIPES IN FORTRAN 90: The Art of PARALLEL Scientific Computing
:

[Num] matmul(mata,matb)
Result of matrix-multiplying the two two-dimensional matrices mata
and matb. The shapes have to be such as to allow matrix multiplication.
Vectors (one-dimensional arrays) are additionally allowed as either the
first or second argument, but not both; they are treated as row vectors
in the first argument, and as column vectors in the second.
You might wonder how to form the outer product of two vectors, since

I guess you're right since it doesn't work, but perhaps I'm misinterpreting the quoted text?
 
sylas said:
It may depend on what compiler you are using. I'm not sure. Did you try using the 3x1 matrix?

Yes, I tried that before trying this method. It worked fine, but the problem is that in the same program, I want to be able to calculate the dot product of array A. I don't know how to do this if I define it as a 3X1 matrix.
 
Ok, now I know exactly what is wrong, but not how to fix it. The relevant part of the code looks like this:

c=matmul(a,b)

The part that is wrong is the "c", because the command

write(*,*) matmul(a,b)

gives the correct output. I obviously have to define "c" properly, but

real, complex(3,1) :: c

doesn't do. Any suggestions?
 
I think I solved the problem. Thanks anyway, sylas.
 
_Andreas said:
I think I solved the problem. Thanks anyway, sylas.

You're welcome. Please post the solution. I'm rusty on Fortran, and would like to know!