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?
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?
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.
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!
vBulletin® v3.7.6, Copyright ©2000-2009, Jelsoft Enterprises Ltd.