Компилятор Фортрана

Привет,

Подскажите пожалуйста каким компилятором фортрана можно собрать следующий код? `gfortran MATRIX.f90` ругается на синтаксис сильно, поставил какой-то интеловский (emerge ifc), тот вообще не пойми что и откуда запускать, так что если не затруднит напишите и полную команду пожалуйста)

Спасибо.

Цитата:
!-----------------------------------------------------------
program MATRIX
!-----------------------------------------------------------

implicit none
call Main(10)
print *, 'Well done.'
read *

!-----------------------------------------------------------
contains
!-----------------------------------------------------------

subroutine Main(dim)
integer i, j, dim
real a(dim, dim), r(dim), x(dim), r2(dim), r3(dim)
open(unit=2, access='sequential', status='old', file='array.dat')
do i=1,dim
read(2, 100) (a(i, j), j=1,dim)
end do
read(2, 100) (r(i), i=1,dim)
100 format(F7.2)
call ThreeDiagonalMatrixSolve(dim, a, r, x)
call Multiplication(dim, a, x, r2)
call Subtraction(dim, r, r2, r3)
open(unit=3, access='sequential', file='output.dat')
write(3, 200) (x(i), i=1,dim)
write(3, 200) (r3(i), i=1,dim)
200 format((F7.2))
end subroutine Main

subroutine ThreeDiagonalMatrixSolve(dim, a, r, x)
integer dim, i, j
real a(dim, dim), r(dim), x(dim), c(dim), d(dim), b(dim)
real l(dim), s(dim)
do i=1,dim
if (i.eq.1) then
b(i) = 0
else
b(i) = a(i, i-1)
end if
c(i) = a(i, i)
if (i.eq.dim) then
d(i) = 0;
else
d(i) = a(i, i+1)
end if
end do
do i=1,dim
if (i.eq.1) then
l(i) = r(i)/c(i)
s(i) = - d(i)/c(i)
else
l(i) = (r(i) - b(i)*l(i-1))/(c(i) + b(i)*s(i-1))
s(i) = - d(i)/(c(i) + b(i)*s(i-1))
end if
end do
do i=1,dim
j = dim - i + 1
if (j.eq.dim) then
x(j) = l(j)
else
x(j) = s(j)*x(j+1) + l(j)
end if
end do
return
end subroutine ThreeDiagonalMatrixSolve

subroutine Multiplication(dim, a, x, r)
integer i, j, dim
real a(dim, dim),x(dim),r(dim)
do i=1,dim
r(i) = 0
do j=1,dim
r(i) = r(i) + a(i,j) * x(j)
end do
end do
return
end subroutine Multiplication

subroutine Subtraction(dim, a, b, c)
integer i, dim
real a(dim), b(dim), c(dim)
do i=1,dim
c(i) = a(i) - b(i)
end do
return
end subroutine Subtraction

!-----------------------------------------------------------
end program MATRIX
!-----------------------------------------------------------

Quote: uvsoft matrix #

Цитата:
uvsoft matrix # gfortran-4.1.1 MATRIX.f90
In file MATRIX.f90:22

100 format(F7.2)
1
Error: Unexpected element in format string at (1)
In file MATRIX.f90:29

200 format((F7.2))
1
Error: Unexpected element in format string at (1)
In file MATRIX.f90:21

read(2, 100) (r(i), i=1,dim)
1
Error: FORMAT label 100 at (1) not defined
In file MATRIX.f90:21

read(2, 100) (r(i), i=1,dim)
1
Error: FORMAT label 100 at (1) not defined
In file MATRIX.f90:28

write(3, 200) (r3(i), i=1,dim)
1
Error: FORMAT label 200 at (1) not defined
In file MATRIX.f90:28

write(3, 200) (r3(i), i=1,dim)
1
Error: FORMAT label 200 at (1) not defined

Цитата:
uvsoft matrix # /opt/intel/compiler70/ia32/bin/f90com
Intel(R) Fortran Compiler for 32-bit applications, Version 7.0 Build 20021028Z
Copyright (C) 1985-2002 Intel Corporation. All rights reserved.
Compiler driver / backend version mismatch: unset != 700
Be sure compiler driver and backend programs are in the same directory.
uvsoft matrix # /opt/intel/compiler70/ia32/bin/f90com MATRIX.f90
Intel(R) Fortran Compiler for 32-bit applications, Version 7.0 Build 20021028Z
Copyright (C) 1985-2002 Intel Corporation. All rights reserved.
Compiler driver / backend version mismatch: unset != 700
Be sure compiler driver and backend programs are in the same directory.

А еще есть

А еще есть вариации на тему... Теперь уже в проге надо использовать подпрограммы IVPRK и IVPAG, входящие в библиотеку IMSL из Compaq Visual Fortran... такое вообще собирается под линухом?

Спасибо.

ну там в коде

ну там в коде есть две ошибки и формат не верный...
а так очень даже собираеться с помощью gfortran

_________________
Gentoo GNU/Linux 2.6.19 GCC 4.1.1 Dual Xeon
Working on Gentoo for iPAQ hx4700 :-)

что значит не

что значит не верный? все компилится нормально в Compaq Visual Fortran

ну он вобщето

ну он вобщето стандарту не соответствует....
я с этим уже сталкивался...
иногда потом если этот же код собереш интелом или гфортраном то прога будет неправильно считать...

если поправить о будет работать и с интелом и с гфортраном...
во всяком случае у меня собралось...
_________________
Gentoo GNU/Linux 2.6.19 GCC 4.1.1 Dual Xeon
Working on Gentoo for iPAQ hx4700 :-)

В таком случае

В таком случае покажи пожалуйста привильный код) и что насчет вот той либы?

Собирающаяся

Собирающаяся версия кода


!-----------------------------------------------------------
      program MATRIX
!-----------------------------------------------------------

      implicit none
      call Main(10)
      print *, 'Well done.'
      read *

!-----------------------------------------------------------
      contains
!-----------------------------------------------------------

      subroutine Main(dim)
      integer i, j, dim
      real a(dim, dim), r(dim), x(dim), r2(dim), r3(dim)
      open(unit=2, access='sequential', status='old', file='array.dat')
      do i=1,dim
      read(2, 100) (a(i, j), j=1,dim)
      end do
      read(2, 100) (r(i), i=1,dim)
100   format(F7.2)
      call ThreeDiagonalMatrixSolve(dim, a, r, x)
      call Multiplication(dim, a, x, r2)
      call Subtraction(dim, r, r2, r3)
      open(unit=3, access='sequential', file='output.dat')
      write(3, 200) (x(i), i=1,dim)
      write(3, 200) (r3(i), i=1,dim)
200   format((F7.2))
      end subroutine Main

      subroutine ThreeDiagonalMatrixSolve(dim, a, r, x)
      integer dim, i, j
      real a(dim, dim), r(dim), x(dim), c(dim), d(dim), b(dim)
      real l(dim), s(dim)
      do i=1,dim
      if (i.eq.1) then
      b(i) = 0
      else
      b(i) = a(i, i-1)
      end if
      c(i) = a(i, i)
      if (i.eq.dim) then
      d(i) = 0;
      else
      d(i) = a(i, i+1)
      end if
      end do
      do i=1,dim
      if (i.eq.1) then
      l(i) = r(i)/c(i)
      s(i) = - d(i)/c(i)
      else
      l(i) = (r(i) - b(i)*l(i-1))/(c(i) + b(i)*s(i-1))
      s(i) = - d(i)/(c(i) + b(i)*s(i-1))
      end if
      end do
      do i=1,dim
      j = dim - i + 1
      if (j.eq.dim) then
      x(j) = l(j)
      else
      x(j) = s(j)*x(j+1) + l(j)
      end if
      end do
      return
      end subroutine ThreeDiagonalMatrixSolve

      subroutine Multiplication(dim, a, x, r)
      integer i, j, dim
      real a(dim, dim),x(dim),r(dim)
      do i=1,dim
      r(i) = 0
      do j=1,dim
      r(i) = r(i) + a(i,j) * x(j)
      end do
      end do
      return
      end subroutine Multiplication

      subroutine Subtraction(dim, a, b, c)
      integer i, dim
      real a(dim), b(dim), c(dim)
      do i=1,dim
      c(i) = a(i) - b(i)
      end do
      return
      end subroutine Subtraction

!-----------------------------------------------------------
      end program MATRIX
!-----------------------------------------------------------

Разница в форматировании в метках и в FORMAT
С той либой собирать не пробовал... Есть другие не хуже...
А в некоторых случаях даже лучше...

_________________
Gentoo GNU/Linux 2.6.19 GCC 4.1.1 Dual Xeon
Working on Gentoo for iPAQ hx4700 :-)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".