LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   [Fortran90] how to declare in 2d arrays (https://www.linuxquestions.org/questions/programming-9/%5Bfortran90%5D-how-to-declare-in-2d-arrays-4175425861/)

s_hy 09-05-2012 10:27 PM

[Fortran90] how to declare in 2d arrays
 
Hi all, I have code for 2d fdtd in fortran as below:

Code:

!problem 3.9, Taflove chapter 3
!to model 2d TMz mode fdtd Simulation using Yee grid.
!time step deltat = (1/sqrt(2)*delta/c) is used

subroutine fd2d
implicit none

double precision                  :: f0              !frequency
double precision                  :: miu
double precision                  :: miur            !permittivity
double precision                  :: miu0
double precision                  :: E0
double precision                  :: delta
double precision                  :: deltat
double precision                  :: deltax
double precision                  :: deltay
double precision                  :: sigma
double precision                  :: sigmastar
double precision                  :: Eps
double precision                  :: Eps0
double precision                  :: Epsr
double precision                  :: lambda
double precision                  :: lambdax
double precision                  :: lambday
double precision                  :: nlambdax
double precision                  :: nlambday
double precision                  :: omega
double precision                  :: S
double precision                  :: k
double precision                  :: c
integer                            :: i,j
integer                            :: m,p
integer                            :: mlast,plast
integer                            :: n
integer                            :: iinit
integer                            :: ilast
integer                            :: jinit
integer                            :: jlast
double precision,dimension(202,202):: Ez
double precision,dimension(202,202):: Hy
double precision,dimension(202,202):: Hx
double precision                  :: EzAmp
double precision                  :: HyAmp
double precision                  :: HxAmp
double precision                  :: Ca
double precision                  :: Cb
double precision                  :: Da
double precision                  :: Db
double precision, parameter        :: pi = 3.14159265
character(len=20)                  :: filename

f0 = 100.0
miu0 = 1.0
miur = 1.0
Eps0 = 1.0
Epsr = 1.0
!delta = 1.e-3
delta = 0.1
lambda = c/f0
c = 1
E0 = 1
deltat = (delta/c)/sqrt(2.0)
k = 2*pi / lambda
omega = c*k

nlambdax = 5
nlambday = 5
lambdax = lambda
lambday = lambda

deltax = delta
deltay = delta

S = 1.0001
iinit = 1
ilast = 100
jinit = 1
jlast = 100
mlast = 2*ilast-1
plast = 2*jlast-1

print*, 'see me?'

!initialize Ez, Hx,Hy to zero at t=0
do p = 1,2*jlast
 Ez(1,p-1) = 0
 Ez(m-1,p-1) = 0

 do m = 1,2*ilast
 Hx(m+1,p) = 0
 Hy(2*m,p) = 0
 Ez(m+1,p-1) = 0
 Ez(m+1,1) = 0
 Ez(m+1,plast+2) = 0
 end do
end do

!medium's properties

  Ca(m,p) = 1.0
  Cb(m,p) = deltat/(1-0.5*deltax)
  !Print *,'Ca, Cb=',Ca, ' ',Cb

  Da(m,p) = 1.0
  Db(m,p) = deltat/deltax
  !Print *, 'Da, Db=',Db, ' ',Db
  !print*, 'see me?1'

!initiate sinusoidal wavepulse at center
do n = 1,100
 do m = 1,2*ilast
  do p = 1,2*jlast

  Ez(101,101) = sin((n+1)*omega*deltat)

  end do
 end do
end do

do n = 1,200
 
  write (filename, "('ez',I3.3,'.dat')") n
  open (unit=130,file=filename)
 
  do m = 1,2*ilast-1
    do p = 1,2*jlast-1
   
      if (Mod(m,2)/=0) then
        if (Mod(p,2)/=0) then
          Ez(m,p) = Ca*Ez(m,p-1)+Cb*(Hy(m+1,p-1)-Hy(i+1,p-1)+Hx(m+1,p+1)-Hx(m,p-1))
        end if
      end if
    end do
  end do

  do m = 1,2*ilast-1
    do p = 1,2*jlast-1

      if (Mod(m,2) == 0) then
        if (Mod(p,2) == 0) then
          Hx(m-1,p+2) = Da*Hx(m-1,p+2)+Db*(Ez(m-1,p+2)-Ez(m-1,p+2))
          Hy(m,p+1) = Da*Hy(m,p+1)+Db*(Ez(m+1,p+1)-Ez(m-1,p+1))
        end if
      end if
    end do
  end do

 ! set boundary condition
 do m = 1,2*ilast-1
  do p = 1, 2*jlast-1
  if (p == 0) then
    Ez(m,p) = 0
  if (p == plast) then
    Ez(1,p-1) = 0
    Ez(mlast+1,p+1) = 0
  end if
  end if
  end do
 end do

 close (unit=130)

end do !n

end SUBROUTINE fd2d

and i got this error msg:

Code:

subroutines.f90:120.15:

  Ca(m,p) = 1.0
              1
Error: Unexpected STATEMENT FUNCTION statement at (1)
subroutines.f90:121.33:

  Cb(m,p) = deltat/(1-0.5*deltax)
                                1
Error: Unexpected STATEMENT FUNCTION statement at (1)
subroutines.f90:124.15:

  Da(m,p) = 1.0
              1
Error: Unexpected STATEMENT FUNCTION statement at (1)
subroutines.f90:125.25:

  Db(m,p) = deltat/deltax
                        1
Error: Unexpected STATEMENT FUNCTION statement at (1)

i think my mistakes are from the array declaration of Ca,Cb, Da and Db....but I have no idea how to solve this. Can anyone tell me how to solve this....thank you very much

evo2 09-06-2012 12:23 AM

Hi,

it has been *many* years since I used fortran, but just from looking at your code I would guess you would need to defince Ca, Cb, Da and Db in the same way that you did for Ez, Hy and Hx.

Evo2.


All times are GMT -5. The time now is 01:28 PM.