找回密码
 注册
Simdroid-非首页
查看: 248|回复: 4

[3. Fortran] 如何将Fortran77转换成Fortran90?

[复制链接]
发表于 2011-9-3 18:40:40 | 显示全部楼层 |阅读模式 来自 江苏南京
需要将这程序换成Fortran90,求大伙帮帮~~~subroutine gausseqsolver_sym(n,ma,a,b,ep,kwji)
!- - - - - - - - - - - - - -  -- - - -  -- -  -
!solve sysmmetric linear equation ax=b by using gauss elimination.
!if kwji=1,no solution;if kwji=0,has solution
!input--n,ma,a(ma,n),b(n),ep,
!output--b,kwji
!- - - - - - - - - - - - - - - - - - - - - - - -
        implicit real*8(a-h,o-z)
        dimension a(ma,n),b(n),m(n+1)
        do 10 i=1,n
10    m(i)=i
        do 120 k=1,n
        p=0.0
        do 20 i=k,n
        do 20 j=k,n
           if(dabs(a(i,j)).gt.dabs(p)) then
                p=a(i,j)
                 io=i
                jo=j
                endif
20           continue
               if(dabs(p)-ep) 30,30,35
30    kwji=1
        return
35     continue
         if(jo.eq.k) go to 45
          do 40 i=1,n
          t=a(i,jo)
             a(i,jo)=a(i,k)
             a(i,k)=t
40     continue
            j=m(k)
            m(k)=m(jo)
              m(jo)=j
45           if(io.eq.k) go to 55
            do 50 j=k,n
            t=a(io,j)
             a(io,j)=a(k,j)
             a(k,j)=t
50         continue
        t=b(io)
        b(io)=b(k)
         b(k)=t
55        p=1./p
        in=n-1
        if(k.eq.n) go to 65
        do 60 j=k,in
60      a(k,j+1)=a(k,j+1)*p
65         b(k)=b(k)*p
           if(k.eq.n) go to 120
        do 80 i=k,in
        do 70 j=k,in
70     a(i+1,j+1)=a(i+1,j+1)-a(i+1,k)*a(k,j+1)
80    b(i+1)=b(i+1)-a(i+1,k)*b(k)
120    continue
        do 130 i1=2,n
         i=n+1-i1
        do 130 j=i,in
130   b(i)=b(i)-a(i,j+1)*b(j+1)
        do 140 k=1,n
        i=m(k)
140    a(1,i)=b(k)
        do 150 k=1,n
150    b(k)=a(1,k)
        kwji=0
        return
        end
发表于 2011-9-6 23:47:52 | 显示全部楼层 来自 西安交通大学
Simdroid开发平台
这个77格式的语法也可以用阿
回复 不支持

使用道具 举报

发表于 2011-9-8 21:20:21 | 显示全部楼层 来自 江苏南京
本帖最后由 铁道科学 于 2011-9-9 10:11 编辑

至少用Intel Fortran编译器是可以混合编译的(其他的本人很少用)。不过楼主这个程序还行,流程结构比较清晰,修改起来不会太麻烦,里面涉及到格式的大多是循环语句(还有少部分判断语句),循环的简单的修改是:
  1. !F77
  2.       if(io.eq.k) go to 55
  3.       do 50 j=k,n
  4.       t=a(io,j)
  5.       a(io,j)=a(k,j)
  6.       a(k,j)=t
  7. 50    continue
  8.       t=b(io)
  9.       b(io)=b(k)
  10.       b(k)=t
  11. 55    p=1./p !F90
  12. if(io.ne.k) then
  13.   do j=k,n
  14.     t=a(io,j)
  15.     a(io,j)=a(k,j)
  16.     a(k,j)=t
  17.   end do  t=b(io)
  18.   b(io)=b(k)
  19.   b(k)=t
  20. end if
  21. p=1./p
复制代码

回复 不支持

使用道具 举报

 楼主| 发表于 2011-9-19 19:19:55 | 显示全部楼层 来自 江苏南京
铁道科学 发表于 2011-9-8 21:20
至少用Intel Fortran编译器是可以混合编译的(其他的本人很少用)。不过楼主这个程序还行,流程结构比较清晰 ...

t谢谢~~~
回复 不支持

使用道具 举报

 楼主| 发表于 2011-9-19 19:21:51 | 显示全部楼层 来自 江苏南京
sabergemini 发表于 2011-9-6 23:47
这个77格式的语法也可以用阿

恩是的我主要是要改程序。自己用的是90在编程要求解的时候调用下这个循环来用下。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2026-1-6 11:43 , Processed in 0.028018 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表