[comp.lang.c] C interfacing with Fortran

glenn@suphys.physics.su.OZ.AU (08/28/90)

Hi,
	I'm trying to write a program which uses a 2-d array of structs to
represent a matrix of complex numbers: struct complex {double r; double i}.
The array is dynamically allocated as it can become rather large. I don't
want to do complex arithmetic in C (we don't have C++ :-)) so I thought I'd
use Fortran.

Problem: How does one pass a 2-d C array of structs to a Fortran subroutine?

I've managed to do it with a 1-d array, but our Manuals (SUN OS 4.1) say
nothing about 2-d arrays; that part seems to just be a copy (with minor changes)
of the version 7 UNIX manual.

Any example programs or pointers to good cross language references would be much
appreciated.

BTW I'm using f77 and cc (standard SUN C compiler).

			Thanks in advance,
				Glenn

glenn@qed.physics.su.oz.au


--
Glenn Geers                       | "So when it's over, we're back to people.
Department of Theoretical Physics |  Just to prove that human touch can have
The University of Sydney          |  no equal."
Sydney NSW 2006 Australia         |  - Basia Trzetrzelewska, 'Prime Time TV'

tsaiwn@eecs.nwu.edu (Wen-Nung Tsai) (08/31/90)

In <1990Aug27.220828.9319@metro.ucc.su.OZ.AU> glenn@qed.physics.su.oz.au writes:

>	I'm trying to write a program which uses a 2-d array of structs to
>represent a matrix of complex numbers: struct complex {double r; double i}.
>The array is dynamically allocated as it can become rather large. I don't
> want to do complex arithmetic in C (we don't have C++ :-)) so I thought I'd
> use Fortran.
> 
> Problem: How does one pass a 2-d C array of structs to a Fortran subroutine?
> 
> I've managed to do it with a 1-d array, but our Manuals (SUN OS 4.1) say
> nothing about 2-d arrays; that part seems to just be a copy (with minor changes)
> of the version 7 UNIX manual.
> ...
> 				Glenn
 
Since you already knew how to do it in one-d array, you can use the same
FORTRAN routine you have written if you want to apply the operation to
all elements of the 2-d array.
I.e., pass the address of the 2-d C array and the total-no-of-elements
to your FORTRAN routine which treats it as 1-d array.
For example, assume your FORTRAN routine looks like:
	subroutine add(aa,bb,n)
	complex aa(n), bb(n)
	...
And your C program contains:
	complex a1[3][5], a2[3][5];  /* you already defined STRUCT complex */
	int tot_ele;

Then, you can call "add" in this way:
	tot_ele=15;	/* 3*5=15 */
	add(a1,a2,&tot_ele)
NOTE the "&" sign! You can not say add(a1,a2,15), this is because :
	IN FORTRAN, parameters are always passed by REFERENCE.
	Thus, the variable "tot_ele" is necessary.

IF you insist to do it in 2-d array,(for example, you want to do
matrix operations in FORTRAN routine), it's not difficult:
    IN C:
	...
	#define CN1 5
	#define CN2 3
	#define CN3 7
	complex a1[CN1][CN2], a2[CN3][CN1];
	complex a3[CN3][CN2];
	int n1,n2,n3;
	...
	n1=CN1;  n2=CN2; n3=CN3;
	doit(a1,a2,a3,&n1,&n2,&n3)
	...
    In FORTRAN:
	subroutine doit(aa,bb,cc,n1,n2,n3)
	complex aa(n2,n1), bb(n1,1), cc(n2,*)
Comm		aa is (n2,n1), bb is (n1,n3), cc is (n2,n3)
	....
NOTE the a1[5][3] in C maps to aa(3,5) in FORTRAN routine, this is because:
    Array in C is arranged in row-major. But array in FORTRAN is column-major.
I.e., aa(1,1) is a1[0][0]; aa(2,1) is a1[0][1]; aa(3,1) is a1[0][2];
      aa(1,2) is a1[1][0];..... ................aa(i,k) is a1[k-1][i-1]
This allows the "aa" can be declared as aa(n2,*) or even aa(n2,1) in FORTRAN.

If it's a 3-d array, say c1[n1][n2][n3], it can be mapped to FORTRAN routine
as c1(n3,n2,n1) and the declaration in FORTRAN looks like:
	subroutine easy(c1,n1,n2,n3)
	complex c1(n3,n2,*)
(The last dimension of dummy(parameter) array always doesn't affect the result.
 So, you can declared it as any one of the following:
     complex c1(n3,n2,*)
     complex c1(n3,n2,1)
     complex c1(n3,n2,2)
     ...
     complex c1(n3,n2,999)
     ...
     complex c1(n3,n2,n1)
===========================Hope this can help you.

Wen-Nung
============================= Wen-Nung Tsai =============================
tsaiwn@eecs.nwu.edu             "Man invented language to satisfy his
                                 deep need to complain." -- Lily Tomlin
=========================================================================