Компилятор Фортрана
Привет,
Подскажите пожалуйста каким компилятором фортрана можно собрать следующий код? `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 Mainsubroutine 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 ThreeDiagonalMatrixSolvesubroutine 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 Multiplicationsubroutine 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
!-----------------------------------------------------------
- Для комментирования войдите или зарегистрируйтесь
А еще есть
А еще есть вариации на тему... Теперь уже в проге надо использовать подпрограммы 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 :-)
- Для комментирования войдите или зарегистрируйтесь
Quote: uvsoft matrix #