Fortran Coder

标题: Fortran适合科学计算,界面交给Tcl/TK、PureBasic! [打印本页]

作者: lm_lxt    时间: 2014-1-25 12:03
标题: Fortran适合科学计算,界面交给Tcl/TK、PureBasic!
1.Tcl/TK和Fortran编译后的exe文件可以很好沟通,方式是“通道”这个概念;
2.Tcl/TK有良好的跨平台能力;
3.Tcl/TK有完善的图形接口,如OpenGL,VTK等,适合图形后处理;
4.Tcl/TK界面编程简单,和数据库交流方便,如对excel表格的操控;

下面是例子(from sicheng6699的新浪博客:http://blog.sina.com.cn/sicheng6699 ):








作者: fcode    时间: 2014-1-25 12:09
这几个图看起来很不错,是一个好选择。

确实没必要什么事情都用同一个语言或构架来完成,混编不是一件麻烦的事情。我曾见过一个老外用 VC++ & OpenInventor & Fortran 做的效果特别棒。
作者: 珊瑚虫    时间: 2014-1-25 13:37
清风 你总是这么帅!
作者: lm_lxt    时间: 2014-1-25 15:37
继续讨论:
5.Fortran编写exe应该没有什么问题;
6.为了解释执行Tcl/TK脚本(有人反感:lol),你需要一个解释器:
   http://www.activestate.com/activetcl/activetcl-8-6
7.要编写交互性较好的界面,请参考下面的文档(主要讨论TK的用法):
    http://www.tkdocs.com/tutorial/index.html
8.有时候会遇到很多问题,那就去找高手吧:
   http://blog.got7.org/2009/06/tcltk.html
9.如果问题很难处理,那必须到这里寻求解决了:
   http://wiki.tcl.tk/
10.程序完工了,你可能还需要让脚本变得“可执行”,则使用打包工具:
   http://www.bioengineering-research.com/software/vtkit
11.如果你喜欢上了Tcl/TK,请经常抽空到这里看看:
   http://tcl.activestate.com/

作者: cas    时间: 2014-1-25 16:35
楼主画的图很漂亮啊!除了混编之外,数据处理、结果展示等都有多种工具和途径吧。
作者: lm_lxt    时间: 2014-1-25 16:56
前两个是sicheng做的,非楼主所做。
作者: lm_lxt    时间: 2014-1-25 16:58
cas 发表于 2014-1-25 16:35
楼主画的图很漂亮啊!除了混编之外,数据处理、结果展示等都有多种工具和途径吧。 ...

脱离编程的话,可选的软件可能很多。
作者: lm_lxt    时间: 2014-1-25 20:40
本帖最后由 lm_lxt 于 2014-1-25 20:47 编辑

12.Tcl/TK调用Fortran的exe三步走:
   set f [open |quads.exe r+] (打开通道)
   puts $f $entry (向通道传入参数)
   flush $f (立即计算)
   close $f (关闭通道)
13.下面给出一个例子(来自网络,加了一些注释):
  首先是Tcl/TK代码:
[Fortran] 纯文本查看 复制代码
#这是一个用TCL/TK做界面,FORTRAN做计算求解一元二次方程的程序

#wm title命令用来更改标题栏中的标题
wm title . "gui_quads"
#创建名为.msg,内容为Solution of a x^2 + b x + c = 0的文本标签
label .msg -text "Solution of a x^2 + b x + c = 0"
#用pack几何管理器安排文本标签
pack .msg -padx 5 -pady 3 -ipadx 5 -ipady 5 -fill x
#创建名为.f的框架,并在框架内放置三个编辑框和三个文本标签
frame .f
#用pack几何管理器安排容器的位置
pack .f -padx 5 -ipadx 5
#创建三个编辑框和三个文本标签,最后一句安排他们的位置
entry .f.a   -relief sunken
label .f.x2  -text "x^2 + "
entry .f.b   -relief sunken
label .f.x   -text " x + "
entry .f.c   -relief sunken
label .f.rhs -text " = 0"
pack .f.a .f.x2 .f.b .f.x .f.c .f.rhs -in .f -side left -padx 3 -pady 3 -ipadx 2 -ipady 2
#创建名为.zeros的框架,用来输出结果
frame .zeros
pack .zeros
frame .zeros.base1 -bg red
frame .zeros.base2 -bg blue
pack .zeros.base1 -in .zeros -padx 5 -pady 5 -side top
pack .zeros.base2 -in .zeros -padx 5 -pady 5 -side top
label .zeros.x1 -text "x1 = "
label .zeros.x1val -bg yellow
label .zeros.x2 -text "x2 = "
label .zeros.x2val -bg yellow
pack .zeros.x1 .zeros.x1val -side left -in .zeros.base1 -padx 5 -pady 5
pack .zeros.x2 .zeros.x2val -side left -in .zeros.base2 -padx 5 -pady 5

#创建.info框架,用来显示disc和type的值
frame .info
pack .info
frame .info.dum
pack .info.dum -side left
set w .info.dum
label $w.disc
label $w.type
pack $w.disc -padx 5 -pady 5
pack $w.type -padx 5 -pady 5

#创建.bf框架,用来容纳三个按钮
frame .bf
pack .bf -padx 5 -pady 5 -ipadx 4 -ipady 4 -fill x
button .bf.quit -text Quit -command {exit}
button .bf.clear -text Clear -command clearEntries
button .bf.solve -text Solve -command invokeQuads
pack .bf.quit .bf.clear .bf.solve -side right -padx 5 -pady 5 -ipadx 3 -ipady 3
focus .f.a

#创建过程
proc invokeQuads { } {
    set f [open |quads.exe r+]
        foreach e {.f.a .f.b .f.c} {
        set entry [$e get]
         if { [string compare $entry ""] == 0 } {
           puts stdout "Some entry(ies) are null .... enter them Now \n"
                      close $f
                      return
             } else {
                 puts $f $entry
           }
       }

#将以上读取的数据写入一个通道的缓冲区
flush $f   

#下面五行有点意思,应该和Fortran程序里面的几个输出语句按顺序相对应,用来获得输出信息或变量值  
gets $f in_prompt
gets $f disc
gets $f iflag
gets $f root1   
gets $f root2

#关闭通道
close $f            
set w .info.dum
  if { $iflag == 1 } {
          .zeros.x1 config -text "Real Part"
        .zeros.x2 config -text "Imaginary Part"
        $w.type config -text "方程的根是虚根!"
        } else {
        .zeros.x1 config -text "x1"
        .zeros.x2 config -text "x2"
        $w.type config -text "方程的根是实根!"
      }

    .zeros.x1val configure -text $root1
    .zeros.x2val configure -text $root2
    $w.disc configure -text $disc
}

proc clearEntries { } {
       foreach e {.f.a .f.b .f.c} {
             $e delete 0 end
       }
}


  代码执行界面为:



   下面是Fortran源代码:

[Fortran] 纯文本查看 复制代码
!Fortran程序,用来求解一元二次方程
program main
  implicit none
  real(kind=8)::a,b,c,disc,x1,x2
  integer(kind=4)::iflag
  write(*,*) "请输入方程的系数 a,b,c 的值:"
  read(*,*)  a,b,c
  disc = (b*b - 4*a*c)
  write(*,*)"disc : ",disc
    IF (disc .GE. 0) THEN
        iflag=0
        x1 = (- b + sqrt( disc ) )/(2.0*A)
        x2 = (- b - sqrt( disc ) )/(2.0*A)
    ELSE
        iflag=1
        x1 = -b/(2*A)
        x2 = sqrt(-disc)/(2*A)
    END IF
  write(*,*)iflag
  write(*,*)"x1 = ",x1
  write(*,*)"x2 = ",x2
END



作者: lm_lxt    时间: 2014-1-25 21:01
本帖最后由 lm_lxt 于 2014-1-25 21:03 编辑

14. 借助VTK进行数据可视化:
   http://www.vtk.org/
   这个地址可下载最新的VTK函数库。
   其实下载的VTK中包含Tcl/TK解释器、VTK函数库,也就是说成功安装后直接编写代码就行。
   具体例子此处省略,一楼的第三个图片即为VTK三维建模。
15.利用OpenGL进行可视化编程:
   http://www.tcl3d.org/
   这是官网,最新支持OpenGL4.1.
   下面是个最简单的例子:
   
[Fortran] 纯文本查看 复制代码
package require Ttk
package require tcl3d

# 初始化窗口
proc tclReshapeFunc { toglwin { w -1 } { h -1 } }  {
    set w [$toglwin width]
    set h [$toglwin height]

    glViewport 0 0 $w $h        
    glMatrixMode GL_PROJECTION  
    glLoadIdentity         
    gluPerspective 45.0 [expr double($w)/double($h)] 0.1 100.0
    glMatrixMode GL_MODELVIEW   
    glLoadIdentity              
}

# 绘图环境设置
proc tclCreateFunc { toglwin } {
    glShadeModel GL_SMOOTH                 
    glClearColor 0.0 0.0 0.0 0.0           
    glClearDepth 1.0                       
    glEnable GL_DEPTH_TEST                 
    glDepthFunc GL_LEQUAL                  
    glHint GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST  
}

# 绘图程序
proc tclDisplayFunc { toglwin } {
    # 清屏和清除深度缓冲区
    glClear [expr $::GL_COLOR_BUFFER_BIT | $::GL_DEPTH_BUFFER_BIT]
    glViewport 0 0 [$toglwin width] [$toglwin height]
    glLoadIdentity  
        
    glTranslatef -1.5 0.0 -6.0                  
    glBegin GL_TRIANGLES                        
        glColor3f 1.0 0.0 0.0                  
        glVertex3f  0.0  1.0 0.0               
        glColor3f 0.0 1.0 0.0                  
        glVertex3f -1.0 -1.0 0.0               
        glColor3f 0.0 0.0 1.0                  
        glVertex3f  1.0 -1.0 0.0               
    glEnd                                       
    glColor3f 0.5 0.5 1.0                       
    glTranslatef 3.0 0.0 0.0                    
    glBegin GL_QUADS                           
        glVertex3f -1.0  1.0 0.0               
        glVertex3f  1.0  1.0 0.0               
        glVertex3f  1.0 -1.0 0.0               
        glVertex3f -1.0 -1.0 0.0               
    glEnd
    $toglwin swapbuffers
}

# 创建OpenGL窗口
proc CreateWindow {} {
    frame .fr
    pack .fr -expand 1 -fill both
    # 创建OpenGL窗口部件
    togl .fr.toglwin -width 800 -height 600      \
                     -double true -depth true       \
                     -createproc tclCreateFunc      \
                     -reshapeproc tclReshapeFunc \
                     -displayproc tclDisplayFunc

    pack .fr.toglwin -expand 1 -fill both
    # 最大化主窗口
    wm state . zoom
    wm title . "Tcl OpenGl框架"
    # 程序退出
    wm protocol . WM_DELETE_WINDOW "exit"
}

CreateWindow


运行结果为:



   这个经典的图片你是不是经常见到呢?!没错,同样出现在NEHE的网站。

作者: lm_lxt    时间: 2014-1-25 21:09
16.你的程序中可能需要excel存储数据,那么下面的库就很重要:
   http://www.vex.net/~cthuang/tcom/
   要操控excel,大概需要几行语句:
[Fortran] 纯文本查看 复制代码
set application [::tcom::ref createobject "Excel.Application"]             
             set workbooks [$application Workbooks]
             set workbook [$workbooks Add]
             set worksheets [$workbook Worksheets]
             set worksheet [$worksheets Item [expr 1]]         
             set cells [$worksheet Cells]

   没错,这是真的!至少在excel2003中运行良好。

作者: lm_lxt    时间: 2014-1-25 21:20
17.再来看看Tcl/TK的界面描述能力:
    ttk::button .a -text "lm_lxt"
    pack .a
    运行结果:



   好了,接下来只需要发挥你的想象。。。

作者: lm_lxt    时间: 2014-1-26 17:58
18.最大的遗憾就是Tcl好像无法调用Fortran语言编写的dll文件。
   这个问题如能解决,Tcl和Fortran的搭配已经算很完美了。
   期待有人能够解决这个问题并加入讨论!
作者: lm_lxt    时间: 2014-1-26 18:12
本帖最后由 lm_lxt 于 2014-1-26 18:19 编辑

19.有人会说C++、C#等语言都能调用Fortran编写的dll文件,而且其他功能丝毫不逊于Tcl。
   是的,其实这些语言功能都很强大,如果你掌握的不错的话;如果你只会Fortran,则Tcl这样的语言简单易用,很适合你!说到这里,顺便提一下另一个语言——PureBasic,她同样适合你。
20.PureBasic简单易用,不需要什么恼人的.net fra...,她的IDE很小(约30M!),很轻巧;适合游戏开发。
   同时调用Fortran编写的dll文件显得简单而直接,不信你看看:
[Visual Basic] 纯文本查看 复制代码
一、用purebasic调用CVF6.6编译的dll文件

1.用CVF6.6编译下面的fortran程序:

function ARRAYTEST(a,b)
  !DEC$ ATTRIBUTES DLLEXPORT:: ARRAYTEST

  REAL a,b,ARRAYTEST
  ARRAYTEST=a+b
END function ARRAYTEST

2.执行下面的purebasic程序得到结果

a.f = 1.0
b.f = 2.0
PrototypeC.f Arraytest(*a, *b)
If OpenLibrary(0, "dll.dll")
  Global Arraytest.Arraytest = GetFunction(0, "_ARRAYTEST@8")
  If Arraytest
    Debug Arraytest(@a, @b)
  EndIf
  CloseLibrary(0)
EndIf

二、用purebasic调用gfortran编译的dll文件

1.用gfortran编译下面的fortran程序:

function ARRAYTEST(a,b)
  !DEC$ ATTRIBUTES DLLEXPORT:: ARRAYTEST

  REAL a,b,ARRAYTEST
  ARRAYTEST=a+b
END function ARRAYTEST

2.执行下面的purebasic程序得到结果

a.f = 1.0
b.f = 2.0
PrototypeC.f Arraytest(*a, *b)
If OpenLibrary(0, "dll.dll")
  Global Arraytest.Arraytest = GetFunction(0, "arraytest_")
  If Arraytest
    Debug Arraytest(@a, @b)
  EndIf
  CloseLibrary(0)
EndIf


作者: lm_lxt    时间: 2014-1-26 18:17
21.为了表现PureBasic的强大,下面贴出两张图片(声张声势):


     PureBasic的IDE(收费)


    PureBasic自带的例子


作者: fcode    时间: 2014-1-26 19:10
如果 TCL 可以调用其他语言的 DLL,没道理不能调用 Fortran 产生的。

如果 TCL 本身就是有跨平台的成分,那么语法里可能没有 DLL 相关的东西。
作者: lm_lxt    时间: 2014-1-26 19:21
Tcl/TK可以和C/C++语言编写的dll进行良好沟通。但是对于Fortran,目前还不清楚有什么方法。
作者: fcode    时间: 2014-1-26 19:24
lm_lxt 发表于 2014-1-26 19:21
Tcl/TK可以和C/C++语言编写的dll进行良好沟通。但是对于Fortran,目前还不清楚有什么方法。 ...

DLL 做为一种操作系统的可执行文件来说,只有二进制语法,是没有语言特征的。

顶多在调用协定上有一些差别。不应该出现这种 C 的 DLL 可用,而 Fortran 的 DLL 不可以的情况。
作者: lm_lxt    时间: 2014-1-26 19:31
fcode 发表于 2014-1-26 19:24
DLL 做为一种操作系统的可执行文件来说,只有二进制语法,是没有语言特征的。

顶多在调用协定上有一些差 ...

C的dll调用,我做过相应的例子。
至于Fortran的,有空再看。
作者: fcode    时间: 2014-1-26 19:41
lm_lxt 发表于 2014-1-26 19:31
C的dll调用,我做过相应的例子。
至于Fortran的,有空再看。

我觉得应该是不存在问题的。或者说,这些问题应该可以解决。
话说,假如你给我一个DLL,让我判断这是 C 编译出来的,还是 Fortran 编译出来的,我恐怕都不敢保证100%判断正确。
作者: lm_lxt    时间: 2014-1-26 19:45
fcode 发表于 2014-1-26 19:41
我觉得应该是不存在问题的。或者说,这些问题应该可以解决。
话说,假如你给我一个DLL,让我判断这是 C 编 ...

应该可以解决!
作者: lm_lxt    时间: 2014-1-27 16:48
22.为了表明PureBasic的能力,下面给出其描述窗口的一个例子:
[Visual Basic] 纯文本查看 复制代码
  #WINDOW_MAIN = 1
  #FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
  If OpenWindow(#WINDOW_MAIN, 0, 0, 300, 200, "Hello World", #FLAGS)
    Repeat
      Event.l = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
  End




   显然,两步走:打开窗口;事件循环!
   Fortran编程需要界面的,这也是个不错的选择。




作者: fcode    时间: 2014-1-27 17:42
OpenWindow 然后无限 WaitEvent,这就有点Win32 SDK编程的意思了。
作者: lm_lxt    时间: 2014-1-27 18:49
是的,是对win32 API函数的封装。
作者: lm_lxt    时间: 2014-1-28 16:53
本帖最后由 lm_lxt 于 2014-1-28 16:56 编辑



过年了... ...

作者: jason388    时间: 2014-1-30 08:29
本帖最后由 jason388 于 2014-2-21 08:36 编辑

据说Fortran2015会把N1942-TS 29113 Further Interoperability of Fortran with C正式纳入标准之中,因此利用C去开发界面将更有优势,因为C可以直接处理Fortran的可分配数组和指针,因此可以认为是能够做到无缝连接。
作者: jason388    时间: 2014-1-30 08:31
实际上,如果自己用,界面真的不是太重要。如果为了数据可视化,可以用gnuplot和paraview。开发界面还是要花很多工夫的。
作者: fcode    时间: 2014-1-30 09:00
jason388 发表于 2014-1-30 08:31
实际上,如果自己用,界面真的不是太重要。如果为了数据可视化,可以用gnuplot和paraview。开发界面还是要 ...

自己用当然不重要。
如果是公开给别人使用,有一个界面可能更方便。

关于界面有多种解决方案。不止调用exe,dll和lib都可以有。

不管怎么样,如果有一个fortran编译器厂家可以把界面的东西封装得很好,像MFC那样,才应该是最好的解决方案。

其实像楼主介绍的这种,调用exe,通过管道互通,也是不错的方式。我们的IDE和编译器,大多数就是这种关系。
作者: lm_lxt    时间: 2014-1-31 20:15
jason388 发表于 2014-1-30 08:29
据说Fortran2015会把与C的互操作正式纳入标准之中,因此利用C去开发界面将更有优势,因为在界面中可以直接 ...

这样的话代码参数传递方便很多,GUI响应速度会更高,但是开发效率一般。
作者: fcode    时间: 2014-1-31 20:20
lm_lxt 发表于 2014-1-31 20:15
这样的话代码参数传递方便很多,GUI响应速度会更高,但是开发效率一般。 ...

那岂不是 C 的编译器和 Fortran 编译器要捆绑销售了?呵呵...
开发效率和执行效率总是不能兼得。
PS:祝新年好!
作者: lm_lxt    时间: 2014-1-31 20:20
jason388 发表于 2014-1-30 08:31
实际上,如果自己用,界面真的不是太重要。如果为了数据可视化,可以用gnuplot和paraview。开发界面还是要 ...

自己用能加上一点前后处理用起来也方便,比如通过界面将结果写入excel总比从记事本或者UE中粘贴到excel中更方便,如果需要反复观察数据趋势的时候更方便一些。
tcl能够驱动GNUPLOT绘图,paraview不太了解。

作者: fcode    时间: 2014-1-31 20:25
lm_lxt 发表于 2014-1-31 20:20
自己用能加上一点前后处理用起来也方便,比如通过界面将结果写入excel总比从记事本或者UE中粘贴到excel中 ...

嗯,能做后处理,确实方便些。

我现在一般的解决方案是:
1.如果数据不大,一般的曲线,用 Winteracter 成图,三四个函数就可以了。封装得挺到位。
2.只给自己看的话,用 MathCAD 或 Grapher 一类的软件,数据改变时,图形就自动改变了。
3.我还没有必须使用Excel的这种开发要求,一般csv就可以满足要求。
作者: lm_lxt    时间: 2014-1-31 20:30
fcode 发表于 2014-1-30 09:00
自己用当然不重要。
如果是公开给别人使用,有一个界面可能更方便。

调用dll应该是正规的做法。

关于界面,原来偏向于桌面的概念似乎慢慢在弱化,网页UI越来越受到重视,或者说桌面和网页的界限越来越模糊。如微软的界面描述语言XAML,这和HTML感觉是一个东西。

如果对MFC、winform等这些很熟悉,这个帖子似乎不值得讨论。
作者: fcode    时间: 2014-1-31 20:34
lm_lxt 发表于 2014-1-31 20:30
调用dll应该是正规的做法。

关于界面,原来偏向于桌面的概念似乎慢慢在弱化,网页UI越来越受到重视,或 ...

桌面软件有很多弊病,升级问题,安全问题(盗版)之类的。
应该慢慢会被基于浏览器的应用而替代。
将来的应用程序应该是,HTML一类的前台页面响应用户操作和数据,图形。服务器云端后台计算。
目前来说,数据大量交换可能是个问题,但会很快解决。
作者: lm_lxt    时间: 2014-1-31 20:36
fcode 发表于 2014-1-31 20:25
嗯,能做后处理,确实方便些。

我现在一般的解决方案是:

看来Winteracter确实不错,可惜没有供大家练习的D版本,哈哈。
这些解决方案对大家都很重要,总能提供一些值得尝试的方法或者参考的信息。
作者: lm_lxt    时间: 2014-1-31 20:39
fcode 发表于 2014-1-31 20:34
桌面软件有很多弊病,升级问题,安全问题(盗版)之类的。
应该慢慢会被基于浏览器的应用而替代。
将来的 ...

所以学习fortran的同时似乎应该了解一些HTML、Javascript、AJAX以及PHP之类的东西。
当然数值算法唯上的话,其他都是浮云了。
作者: fcode    时间: 2014-1-31 20:43
lm_lxt 发表于 2014-1-31 20:39
所以学习fortran的同时似乎应该了解一些HTML、Javascript、AJAX以及PHP之类的东西。
当然数值算法唯上的 ...

我以前倒是了解一些HTML,Javascript,CSS,ASP,水平还凑合够用。
后来,Ajax,Json,PHP 流行的时代,没跟上。最近恶补了一把。懂了点点皮毛。

这些架构的东西还有一个好处,跨平台效果比较好。
就算计算程序内核是在 Linux 上写的,只要主机是Linux跑得起来,前台页面适合所有操作系统。每一个操作系统的用户都可以使用。
作者: lm_lxt    时间: 2014-1-31 20:43
如果“AutoCAD/C++/MFC”这一套很熟悉的话,显然前后处理具有极大的优势,因为有CAD这个绘图功能强大的开发平台。

作者: lm_lxt    时间: 2014-1-31 20:50
fcode 发表于 2014-1-31 20:43
我以前倒是了解一些HTML,Javascript,CSS,ASP,水平还凑合够用。
后来,Ajax,Json,PHP 流行的时代, ...

所以一般的数值计算程序(数据传输不多),我觉得下面的组合确实不错:
1.前端(Chrome,HTML,Javascript,CSS,AJAX)
2.后台(PHP,FORTRAN)
3.图形后处理利用WEBGL(其实还是opengl)直接在Chrome中完成。
作者: fcode    时间: 2014-1-31 20:54
lm_lxt 发表于 2014-1-31 20:50
所以一般的数值计算程序(数据传输不多),我觉得下面的组合确实不错:
1.前端(Chrome,HTML,Javascrip ...

这样以后的软件恐怕就不是多少钱一套,而是计时或者计量收费了。
作者: jason388    时间: 2014-2-1 20:21
lm_lxt 发表于 2014-1-31 20:15
这样的话代码参数传递方便很多,GUI响应速度会更高,但是开发效率一般。 ...

如果也很熟悉C/C++的话,开发效率不会低啊。因为函数调用和数据交换都能很容易实现,可以很方便地同步开发和调试。
作者: jason388    时间: 2014-2-1 20:29
lm_lxt 发表于 2014-1-31 20:20
自己用能加上一点前后处理用起来也方便,比如通过界面将结果写入excel总比从记事本或者UE中粘贴到excel中 ...

直接在Fortran代码中输出Gnuplot或Paraview格式的数据,再运行这两个软件就可以了。如果用Fortran代码直接调用这两个软件也是可以的。当然在GUI界面中也可以实现同样的功能,只不过弄界面要花点儿时间。如果熟悉这两个软件,基本上不需要excel。
作者: jason388    时间: 2014-2-1 20:30
fcode 发表于 2014-1-31 20:20
那岂不是 C 的编译器和 Fortran 编译器要捆绑销售了?呵呵...
开发效率和执行效率总是不能兼得。
PS:祝 ...

用GCC和GFortran就可以了。
作者: fcode    时间: 2014-2-1 20:34
jason388 发表于 2014-2-1 20:30
用GCC和GFortran就可以了。

语法规范总不能只针对某一款编译器。其他编译器要实现,就得捆绑 C 编译器。

不过,能与 C 有更好的共通方式,是好事。
作者: lm_lxt    时间: 2014-2-3 08:11
jason388 发表于 2014-2-1 20:29
直接在Fortran代码中输出Gnuplot或Paraview格式的数据,再运行这两个软件就可以了。如果用Fortran代码直 ...

这样也不错。
有个软件叫MATFOR,可惜停止开发了,那个用fortran直接调用很方便。
当然还有免费的DISLIN,fortran也能驱动成图。

作者: lm_lxt    时间: 2014-2-7 08:31
DISLIN主页:
http://www.dislin.de/

Using DISLIN to make a GUI for a Fortran Program(这个资料很老了!)
http://www.star.le.ac.uk/~cgp/dislinGUI.html
作者: lm_lxt    时间: 2014-2-7 08:36
这是能编写GUI的几个库,不过都要钱:
http://www.polyhedron.com/graphicsguitools
作者: jason388    时间: 2014-2-7 10:50
lm_lxt 发表于 2014-2-7 08:36
这是能编写GUI的几个库,不过都要钱:
http://www.polyhedron.com/graphicsguitools

除了收费之外,我觉得最大的问题是可移植性。对于我自己来说,在单位用windows系统,在家里很多时间用linux,所以自己用的代码需要适应windows和linux。即使是windows系统,随着系统升级,用老的系统开发的东西重新编译也有问题,比如用fortran powerstation、digital fortran等开发的软件。所以无论是界面还是计算模块,最好从开发伊始就考虑好,避免以后的麻烦。

在必须给fortran代码做界面时,我现在一般选择用wxWidgets,该界面库对于熟悉MFC编程的人来说非常容易上手。
作者: fcode    时间: 2014-2-7 13:16
界面绘图的移植性都不好。所以,计算代码与界面绘图代码尽量分离,以便提高代码将来的重复利用。

Daslin 虽然免费,但相对来说太简单了些,不能满足比较复杂的绘图。
作者: lm_lxt    时间: 2014-2-7 19:53
jason388 发表于 2014-2-7 10:50
除了收费之外,我觉得最大的问题是可移植性。对于我自己来说,在单位用windows系统,在家里很多时间用lin ...

移植性是个问题! 江湖门派各异,需要教主一统江湖。

wxWidgets,又是一个选择!
作者: lm_lxt    时间: 2014-2-7 19:54
fcode 发表于 2014-2-7 13:16
界面绘图的移植性都不好。所以,计算代码与界面绘图代码尽量分离,以便提高代码将来的重复利用。

Daslin  ...

这个确实非常重要。
作者: lm_lxt    时间: 2014-2-7 20:07


用GTK,地址如下(资料很新):
http://fortranwiki.org/fortran/show/GUI+Development
感兴趣的可以大概介绍下。基本扫了一下,感觉需要的东西还不少。

作者: lm_lxt    时间: 2014-2-7 20:13
除了GUI,还有后处理,下面的链接是fortran、opengl的最新绑定:
http://www-stone.ch.cam.ac.uk/pub/f03gl/index.xhtml



作者: lm_lxt    时间: 2014-2-10 18:54
想起了同济大学的结构力学求解器,用FLEX(基于flash?)开发的,其GUI的表达能力也不错。

作者: lm_lxt    时间: 2014-2-10 19:08


最流行的语言中,脚本语言占了不少份额,包括python、tcl。

作者: aliouying    时间: 2014-2-11 15:40
新人膜拜下大神嘛!!!  :lol
作者: fcode    时间: 2014-2-11 15:57
lm_lxt 发表于 2014-2-10 19:08
最流行的语言中,脚本语言占了不少份额,包括python、tcl。

语言的流行,很多程度上,受入门难度,语法难度,(开发)环境安装获取难度等影响。

在中国,e语言有很大的市场,就是这个原因。
作者: lm_lxt    时间: 2014-2-11 19:31
e语言似乎半死不活了。
作者: fcode    时间: 2014-2-11 19:37
lm_lxt 发表于 2014-2-11 19:31
e语言似乎半死不活了。

在中国还是很有市场的,尤其是很多初学者。
作者: lm_lxt    时间: 2014-2-13 16:51
e语言好像很久没有更新了。
作者: lm_lxt    时间: 2014-2-13 17:01
下图是 1956年10月的首个 Fortran 编程手册文档截图(from http://www.oschina.net/news/44413/1st-fortran-program-runs--september-20--1954):



作者: lm_lxt    时间: 2014-2-15 10:05
python这个语言应该入您的法眼。比Tcl/TK更为流行,GUI工具的选择更多,图形库也不少,如著名的OpenCascade。

这些都是可用的GUI开发库:
http://blog.csdn.net/kiki113/article/details/4066828
http://www.oschina.net/project/tag/178/gui?sort=view&lang=25&os=0

图形库:
http://www.pythonocc.org/


作者: jason388    时间: 2014-2-21 08:43
lm_lxt 发表于 2014-2-7 20:07
用GTK,地址如下(资料很新):
http://fortranwiki.org/fortran/show/GUI+Development
感兴趣的可以大概 ...

Gtk-Fortran看起来确实不错,通过Fortran与C的互操作功能,Gtk-fortran实现了Fortran直接编写GUI界面,这对只熟悉Fortran的人来说是个福音,同时因为是采用Gtk,因此可移植性没有问题。
作者: lm_lxt    时间: 2014-2-24 09:42
确实如此。
作者: 楚香饭    时间: 2014-2-24 09:53
看起来GTK确实不错,有时间可以琢磨琢磨,然后跟大伙分享交流下。
作者: lm_lxt    时间: 2014-3-2 21:14
chuxf 发表于 2014-2-24 09:53
看起来GTK确实不错,有时间可以琢磨琢磨,然后跟大伙分享交流下。

期待分享!
作者: pasuka    时间: 2014-3-4 20:40
jason388 发表于 2014-2-21 08:43
Gtk-Fortran看起来确实不错,通过Fortran与C的互操作功能,Gtk-fortran实现了Fortran直接编写GUI界面,这 ...

这个东西不容易上手,实现简单功能都要写上好多行代码
Linux下还是直接上Python+wxpython或者Python+QT,fortran代码打包成动态链接库,通过ctypes调用
仅限于MS OS的话,C#+winforms再调用Fortran的DLL

作者: lm_lxt    时间: 2014-3-5 08:54
pasuka 发表于 2014-3-4 20:40
这个东西不容易上手,实现简单功能都要写上好多行代码
Linux下还是直接上Python+wxpython或者Python+QT, ...

如果对mfc、winform或者wpf等这些东西很熟练的话,就能忽略这个话题了。
作者: pasuka    时间: 2014-3-7 18:29
lm_lxt 发表于 2014-3-5 08:54
如果对mfc、winform或者wpf等这些东西很熟练的话,就能忽略这个话题了。

C#+winform网上可以参考的资源一大把,安装一个sharpdevelop,设计GUI非常傻瓜,新手玩1个月就能入门
Gtk-Fortran,网上资料不多,即使Gtk的文档资料也不是太丰富,不精通C和Fortran的话,半年时间也玩不转
作者: fcode    时间: 2014-3-7 18:47
pasuka 发表于 2014-3-7 18:29
C#+winform网上可以参考的资源一大把,安装一个sharpdevelop,设计GUI非常傻瓜,新手玩1个月就能入门
Gtk ...

这两者还是各有优缺点吧。

GTK 在跨平台和代码重复使用方面会好一些,如果暂时不考虑上手难度的问题,统一使用 Fortran 来书写代码,还是会顺畅很多,毕竟各种变量都是可以完全无阻力访问的。

C#据我所知通用性不好,如果再与 Fortran 进行混编,再考虑跨平台的话,修改量可想而知有多大,另外本人极不喜欢 .NET Framework。且混编流畅度远不及单一的语言, Fortran 与 C 的各种差别,很多变量或结构在混编时都需要额外转换。字符串,可分配数组,指针等等等等。

看个人的喜好和追求吧。我觉得一个函数库,不管是GTK也好,其他的也好,再难也不至于到哪儿去,半年说法有点耸人听闻了。

如果GTK的封装还比较浅,使用起来繁琐,大可自己根据自己的需求进行再封装。就好比我封装了很多 winteracter 的过程和模块一样。
作者: lm_lxt    时间: 2014-3-9 16:51
支持楼上,确实不喜欢肥大臃肿的.NET Framework!所以推荐Tcl/TK和Purebasic。
选什么作为工具,确实和个人喜好有关,和买东西差不多。

作者: jason388    时间: 2014-3-9 21:34
fcode 发表于 2014-3-7 18:47
这两者还是各有优缺点吧。

GTK 在跨平台和代码重复使用方面会好一些,如果暂时不考虑上手难度的问题,统 ...

在windows8下用mingw编译并运行了gtk-fortran自带的例子gtkhello2,感觉用起来并不复杂。当然因为无论是编译还是界面代码都要自己生成,若习惯IDE编程初期会觉得有点麻烦。
作者: lm_lxt    时间: 2014-3-10 15:27
jason388 发表于 2014-3-9 21:34
在windows8下用mingw编译并运行了gtk-fortran自带的例子gtkhello2,感觉用起来并不复杂。当然因为无论是 ...

You will need:
•Fortran compiler (recommended is gfortran 4.6 or higher: included in MinGW http://sourceforge.net/projects/mingw)
•CMake http://www.cmake.org/cmake/resources/software.html
•GTK+ ◦official version: GTK+ 2.24 http://www.gtk.org/download/win32.php (for testwin32gtk2 branch)
◦GTK+ 3.6.1 http://www.tarnyko.net/dl/ (for testwin32gtk3 branch)

•sed http://sourceforge.net/projects/gnuwin32
•PLplot http://sourceforge.net/projects/plplot (optionally)

这需要的也太多了,楼上的大侠举个“hello world!”的例子。

作者: lm_lxt    时间: 2014-3-10 15:32
Linux是一个非常简洁、高效的操作系统,其命令行工作方式更是十分强大,相比Windows和Mac这种“娱乐型”操作系统,Linux非常适合科学计算。
Fortran作为历史上最先出现的高级编程语言,最初就是为科学计算量身定做的。它天生拥有高效的向量/矩阵操作,能够优化为非常高效的代码,一般而言,其运行速度为1.2倍C语言的速度。
下面记述Linux下用Fortran进行科学计算的各个方面。所选用的软件除Intel编译器外均为开源软件,闭源软件,特别是商业软件不予采用。大多数软件都支持Linux/Windows/Mac等平台。


1. 编译器
GNU Fortran
GNU项目的Fortran编译器,属于GNU编译器集合(GCC)之一。目前支持大部分Fortran2008标准,并几乎完整支持Fortran2003. 包含在各大发行版的软件仓库中。


Intel Fortran
Intel久负盛名的Fortran编译器ifort,内涵Intel数学核心库(MKL)。其编译后的代码运行效率之高为业界之最。虽为闭源软件,但用于非商业目的则可免费使用。在下面地址
http://software.intel.com/en-us/ ... -software-download/
下载Intel Fortran Composer XE for Linux,授权文件将通过email获得。安装只需以root身份运行install文件,并在指定的步骤提供授权文件即可。


2. 编辑器
Vim / Emacs
Linux中超强大的两个文本编辑器,二者强大程度不相上下,一起被看作是高手的标志。操作起来与一般文本编辑器的直观方式不同,起初显得难以上手,但一旦熟悉就会极大地提高工作效率。包含在软件仓库中。


3. 调试器
GDB
GNU的调试器,命令行操作方式,功能强大又方便。包含在软件仓库中。
IDB
Intel的调试器,包含在其编译器中一起下载安装。提供了图形界面的调试工具。


4. 开发环境
Code::Blocks
一个很好的C++/Fortran开发环境。包含在软件仓库中。
Eclipse / Photran
Eclipse是一个基于Java的多语言集成开发环境,使用非常广泛,包含在软件仓库中。Photran是它的Fortran插件,需单独下载,并在eclipse中通过安装插件的方式安装。


5. 数据读写
CDI
一个由德国马克思-普朗克气象研究所开发的科学数据读写库,为NetCDF、GRIB、HDF、EXT等多种数据格式提供了统一的编程接口,有C和Fortran版。还提供了一个名为libs4cdo的程序包,用于提供上面几种格式底层库及其他依赖环境的安装。著名的气象数据运算子(CDO)软件就是基于它编写的。安装方式与CDO相同(见本博客)。


6. 数值计算/算法
LAPACK
久负盛名、久经考验的线性代数运算库,已经成为许多数值计算软件的基础。包含在软件仓库中。
GSL / FGSL
GSL是GNU的科学计算函数库,用C语言编写,也兼容C++。提供了非常多的数学计算函数,涵盖了科学计算的各个方面,如随机数、微分方程、矩阵分析、特殊函数、统计等等。包含在软件仓库中。FGSL是它的Fortran接口,需单独下载安装。在某些编译器上可能存在问题。
Muesli
一个用Fortran95写成的矩阵运算库和绘图库。提供了一个矩阵类,以及类似于Matlab的矩阵操作。并同时有一个类似于Matlab的绘图库。


7. 科学绘图
PLplot
非常强大的科学绘图库,提供了C/C++、Fortran、Python、Octave、Java等多种语言接口,能够在X系统、Tcl/TK、wxWidgets窗口上显示,并能输出为多种位图(如GIF、JPEG、PNG)和矢量图(如EPS、SVG、PDF)格式。包含在软件仓库中。
Muesli
如上
MathGL
非常强大的多语言科学绘图库,其绘图能力甚至超过PLplot,绘制的图形非常精美。
DISLIN
德国马克思-普朗克太阳系研究所开发的科学绘图库,提供了Perl、Java、Python、C/C++、Fortran接口。图形质量一般。


8. 图形界面
GTK-Fortran
在Fortran下进行GUI开发一直是一个大问题。因为Fortran专注于科学计算,更加看重程序的可靠性和计算效率,而不侧重于图形界面。只有Windows中的Compaq Visual Fortran在微软基础类库(MFC)的基础上提供了初级的图形界面能力。Fortran2003标准发布以来,由于Fortran与C之间的绑定交互成为可能,Fortran也就具有了利用C/C++的图形界面类库进行GUI编程的潜力。GTK-Fortran就是利用了C语言的GTK+图形界面类库。目前该项目已经基本完成并经过大量测试可用。


9. 论文写作
LaTeX
计算机排版的事实标准。采用类似宏编程的方式进行文档写作和排版,虽不如LibreOffice、Microsoft Word等所见即所得的Office工具来的直观,却具有这类软件无法比拟的高水平的排版效果。

————http://blog.sina.com.cn/s/blog_6cbfce850100xecm.html

有的地方有待商榷,总体值得一读。
作者: jason388    时间: 2014-3-10 16:48
本帖最后由 jason388 于 2014-3-11 08:45 编辑
lm_lxt 发表于 2014-3-10 15:27
You will need:
•Fortran compiler (recommended is gfortran 4.6 or higher: included in MinGW http:/ ...

实际上不需要那么复杂。我是按下述方式处理的:
1. MinGW编译环境,其安装目前有图形界面,当然要确保勾选了gfortran选项。缺省安装到c:\mingw,并设置访问路径到c:\mingw\bin; 如果已有可运行gcc较新版本,这一步可跳过;
2. gtk-fortran,我下载的是gtk3包,解压到任意目录,比如d:\work\gtk-fortran; 把src目录下的*.f90文件均编译为目标文件(当然与unix或linux相关的可以不编),如果愿意可以生成库文件;
3. 下载gtk+3.6.4 all-in-one bundle包并解压到c:\gtk,把c:\gtk\bin加到访问路径中,按readme中给出的测试方法确认gtk3-demo可以运行。这里要注意的是安装的路径中目录名不要有空格,其实所有从linux移植到windows的程序安装时最好都这样做;
4. 到gtk-fortran安装目录的examples目录下按上一级目录的readme编译gtkhello2.f90. 这里要注意的是如果gfortran找不到gtk库,说明pkg-config未起到作用,可以单独运行pkg-config --cflages --libs gtk+-3.0并把其显示内容人为加到gfortran的命令行上即可。
5. 编译后的gtkhello2.exe运行需要相应的dll,把c:\gtk\bin下的dll拷贝到可执行文件目录下就行了。

其他例子应该都可以类似处理,运行后的平面截图gtk-fortran的目录下或其网站下有。

cmake等可以不安装。

作者: jason388    时间: 2014-3-10 17:07
本帖最后由 jason388 于 2014-3-10 17:19 编辑
lm_lxt 发表于 2014-3-10 15:32
Linux是一个非常简洁、高效的操作系统,其命令行工作方式更是十分强大,相比Windows和Mac这种“娱乐型”操 ...

这些东西仁者见仁,智者见智。总的原则是适合自己就好,别人的经验参考一下就行了。比如LaTeX可以生成ps或pdf,非常适合科学排版(写论文比word好用),但学起来有一定难度且国内很多高校和出版社不支持latex文档;linux下写程序,相当多的人用make编译工程并用emacs或vi作为编辑环境,并强调命令行的优势而少用ide,等等。

linux与windows比较起来,占用系统资源少,free或开源的软件资源多,所以还是值得学习的。

作者: jason388    时间: 2014-3-11 13:16
jason388 发表于 2014-3-10 16:48
实际上不需要那么复杂。我是按下述方式处理的:
1. MinGW编译环境,其安装目前有图形界面,当然要确保勾选 ...

第4步可以改为:
4. 把附件test.bat复制到gtk-fortran-gtk3的src目录,并运行即会生成例子中的可执行文件;

test.zip

799 Bytes, 下载次数: 2


作者: lm_lxt    时间: 2014-3-11 16:40
linux下面不熟悉,总体感觉在linux下面的配置都会复杂一些。
作者: lm_lxt    时间: 2014-3-22 14:55
浮起来慢慢下沉。
作者: 我是刚子仔    时间: 2014-4-4 09:35
请问,比如用c做可视化界面的时候,Fortran中的程序和c可以相衔接吗?
作者: fcode    时间: 2014-4-4 09:57
我是刚子仔 发表于 2014-4-4 09:35
请问,比如用c做可视化界面的时候,Fortran中的程序和c可以相衔接吗?

与C 连接还是很容易的,与C++就难了
作者: 我是刚子仔    时间: 2014-4-5 21:14
fcode 发表于 2014-4-4 09:57
与C 连接还是很容易的,与C++就难了

好的,谢谢!
还有,用vb来做可视化界面是不是学起来更简单?实际用处更大呢?还有,它与fortran的可连接性又如何?
作者: fcode    时间: 2014-4-5 21:21
我是刚子仔 发表于 2014-4-5 21:14
好的,谢谢!
还有,用vb来做可视化界面是不是学起来更简单?实际用处更大呢?还有,它与fortran的可连接 ...

如果你只是做一些简单的界面,那么各种语言差别都不大。VB,Delphi 可能更简单,易学。与 Fortran 链接都差不多(windows下通过dll)

如果你是要做较大的工程,或者将来继续在这方面发展,那么 C/C++ 是王道。
作者: 我是刚子仔    时间: 2014-4-5 21:34
fcode 发表于 2014-4-5 21:21
如果你只是做一些简单的界面,那么各种语言差别都不大。VB,Delphi 可能更简单,易学。与 Fortran 链接都 ...

神速度啊,谢谢,赞一个!
作者: lm_lxt    时间: 2014-4-6 19:02
我是刚子仔 发表于 2014-4-5 21:14
好的,谢谢!
还有,用vb来做可视化界面是不是学起来更简单?实际用处更大呢?还有,它与fortran的可连接 ...

关键是掌握一种就好了!

tcl、purebasic不会携带巨大的“库”,所以轻便。
作者: sicheng6699    时间: 2014-5-16 22:37
lm_lxt 发表于 2014-4-6 19:02
关键是掌握一种就好了!

tcl、purebasic不会携带巨大的“库”,所以轻便。 ...

lm_lxt的帖子,不能不顶!

非常同意你的说法,不是专业搞商用软件,小巧好用非常重要。
干不一样的活,用不一样的工具。

另外好像opensee还有ansys都支持tcl,好像也米有很差的说。

推荐一个网站:纯tcl打造的有限元前处理软件,用于机械设计方面,跟Ansys有接口
http://meshparts.de/Software
作者: 山大克鲁士    时间: 2014-5-17 10:19
学习了,收藏~~~
P.S:还有个gnuplot画图的效果不错,适合fortran或C出来的二进制数据做图,和matlab的plot函数差不多~
作者: heyzol    时间: 2014-5-21 21:46
Gnuplot画图不错,但是对于黑白图,他的线形太少了,只能通过三角圆圈什么的区分曲线
作者: zzh_adiy    时间: 2015-9-16 11:55
上面的程序中运行这句“set f [open |quads.exe r+]”,提示错误,怎么解决,具体错误提示如下:
couldn't execute "quads.exe": no such file or directory
couldn't open "C:/Tcl/lib/tclIndex": permission denied
    while executing
"open [file join $dir tclIndex]"

作者: gps99    时间: 2016-8-23 19:52
楼主选择的界面工具,都很有个性,比较小众呀 。purebasic我是刚百度了下,才知道的。。。

要我说就是,跨平台要求的---python!
win平台的---C# !



作者: gps99    时间: 2016-8-23 19:53
本帖最后由 gps99 于 2016-8-23 19:54 编辑

重复了。。。。。。





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2