Fortran Fortran, complex array with rank one

AI Thread Summary
The discussion revolves around using the MATMUL command in Fortran to multiply a rank one complex array A with a 3x3 complex matrix B. The user encounters a compilation error due to shape conformity issues, suspecting that array A is not defined correctly. It is clarified that MATMUL(B,A) requires A to be a 3x1 array for successful multiplication, as rank one arrays cannot be directly multiplied with rank two arrays. The user also seeks a solution for defining the output variable c correctly after resolving the multiplication issue, indicating a need for proper data type definition in Fortran. The conversation highlights the importance of understanding array dimensions and types in matrix operations.
_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?
 
Technology 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?
 
It may depend on what compiler you are using. I'm not sure. Did you try using the 3x1 matrix?
 
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!
 

Similar threads

Back
Top