PDA

View Full Version : Fortran, complex array with rank one


_Andreas
Sep19-09, 10:06 PM
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?

sylas
Sep19-09, 10:29 PM
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

_Andreas
Sep20-09, 12:22 PM
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
Sep20-09, 01:32 PM
It may depend on what compiler you are using. I'm not sure. Did you try using the 3x1 matrix?

_Andreas
Sep20-09, 02:10 PM
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.

_Andreas
Sep20-09, 02:35 PM
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?

_Andreas
Sep20-09, 03:33 PM
I think I solved the problem. Thanks anyway, sylas.

sylas
Sep20-09, 05:48 PM
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!