Fortran Coder

查看: 78475|回复: 89

[绘图界面库] Fortran适合科学计算,界面交给Tcl/TK、PureBasic!

  [复制链接]

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

发表于 2014-1-25 12:03:01 | 显示全部楼层 |阅读模式
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 ):
609af075gda8b7c64df11&690.jpg

609af075gda8b839c625b&690.jpg

1CF529893C7363369B8B5655BCEB7739_B500_900_500_517.jpg

62500a1bh95b40efaa24c&690.gif

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2014-1-25 12:09:16 | 显示全部楼层
这几个图看起来很不错,是一个好选择。

确实没必要什么事情都用同一个语言或构架来完成,混编不是一件麻烦的事情。我曾见过一个老外用 VC++ & OpenInventor & Fortran 做的效果特别棒。

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

发表于 2014-1-25 13:37:43 | 显示全部楼层
清风 你总是这么帅!

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 15:37:56 | 显示全部楼层
继续讨论:
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/

1

帖子

0

主题

0

精华

新人

F 币
34 元
贡献
8 点
发表于 2014-1-25 16:35:40 | 显示全部楼层
楼主画的图很漂亮啊!除了混编之外,数据处理、结果展示等都有多种工具和途径吧。

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 16:56:14 | 显示全部楼层
前两个是sicheng做的,非楼主所做。

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 16:58:24 | 显示全部楼层
cas 发表于 2014-1-25 16:35
楼主画的图很漂亮啊!除了混编之外,数据处理、结果展示等都有多种工具和途径吧。 ...

脱离编程的话,可选的软件可能很多。

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 20:40:36 | 显示全部楼层
本帖最后由 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
       }
}


  代码执行界面为:

捕获.PNG

   下面是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


98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 21:01:55 | 显示全部楼层
本帖最后由 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


运行结果为:

捕获1.PNG

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

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

 楼主| 发表于 2014-1-25 21:09:51 | 显示全部楼层
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中运行良好。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 02:25

Powered by Tencent X3.4

© 2013-2024 Tencent

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