PDA

View Full Version : MatLab2Fortran question


quZz
Jun10-09, 04:04 PM
What is the shortest way to convert this MatLab line

[x,y] = meshgrid(0:hx:xm, 0:hy:ym);

to F90?
Thanks in advance =)

minger
Jun10-09, 04:36 PM
PROGRAM create_arrays

IMPLICIT NONE

INTEGER :: i,j,hx,hy,mx,my
REAL :: xcount,ycount,xint,yint
REAL,DIMENSION(:,:),ALLOCATBLE :: x,y

xcount = 0.0
ycount = 0.0
xint = REAL( (mx-1)/hx )
yint = REAL( (my-1)/hy )
ALLOCATE( x(mx/hx),&
y(mx/hx) )

DO i=0,xm,hx
DO j=0,ym,hy
x(i,j) = xcount
y(i,j) = ycount
ycount = ycount + yint
END DO
ycount = 0.0
xcount = xcount + xint
END DO

DEALLOCATE( x,y )

END PROGRAM



Note that for laziness I'm assuming that you'll ALWAYS be starting from zero. Also, the allocate will only work if the maximum divided by the "stride" is an integer.

Rather than specify it like matlab does with the meshgrid command (I had to look it up), I would specify and a range and a number of points. That way the allocate is easy (allocate to number of points), and the interval is simply the range divided by the number of points.

Either way, it'll get you close. You'll need to put the actual variables in there somehow, by either direct specification or by read/write commands; up to you.

quZz
Jun11-09, 03:10 AM
Thank you, minger, but I think i found a shorter way: instead of the do cycle

x = SPREAD((/(hx*j, j = 0,Nx)/), 1, Nx+1)
y = SPREAD((/(hy*j, j = 0,Ny)/), 2, Ny+1)

minger
Jun11-09, 08:37 AM
Very nice!