声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3963|回复: 5

[mathematica] 求VISUAL FORTRAN 的编程实例!!

[复制链接]
发表于 2006-12-5 13:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家有VISUAL FORTRAN的编程的例子没有啊!???我得编捷联惯导 的解算程序,但是自己从来没有接触过这个语言,现在要自学,都要急哭了:'(

[ 本帖最后由 xinyuxf 于 2006-12-19 10:59 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-12-18 14:29 | 显示全部楼层
VISUAL FORTRAN很好学的,和C差不多,在网上搜一下教程FORTRAN95,一个下午就会了
发表于 2006-12-25 17:00 | 显示全部楼层

回复 #1 ocean0107 的帖子

发表于 2006-12-25 17:14 | 显示全部楼层

回复 #1 ocean0107 的帖子

这全是实例,慢慢研究吧,有C或C++的基础,Fortran学取来不难

我有许多,但都不是可用扩展名: gif, jpg, jpeg, png, bmp, txt, dat, doc, ppt, m, fig)的格式
无奈,本人就将用fortran90编写的并行程序给你了

===============================================================
program Jacobi_1
implicit none
include 'mpif.h'
integer ::steps
integer,parameter :: totalsize=16
!定义全局数组的规模
integer,parameter :: mysize=totalsize/4,steps=10
integer :: n,myid,numprocs,i,j,rc
real,dimension :: a(totalsize,mysize+2),b(totalsize,mysize+2)
!定义局部数组
integer :: begin_col,end_col,ierr
integer :: status(MPI_STATUS_SIZE)

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
print *,"Process ",myid," of ",numprocs," is alive."
!数组初始化
do j=1,mysize+2
   do i=1,totalsize
       a(i,j)=0.0
   end do
end do
if(myid==0)then
  do i=1,totalsize
     a(i,2)=8.0
  end do
end if
if(myid==3)then
  do i=1,totalsize
    a(i,mysize+1)=8.0
  end do
end if
do i=1,mysize+2
   a(1,i)=8.0
   a(totalsize,i)=8.0
end do
!Jacobi迭代部分
do n=1,steps
!从右侧的邻居得到数据
if(myid<3)then
  call MPI_RECV(a(:,mysize+2),totalsize,MPI_REAL, &
               myid+1,10,MPI_COMM_WORLD,status,ierr)
end if
!从左侧的邻居发送数据
if(myid>0)then
  call MPI_SEND(a(:,2),totalsize,MPI_REAL, &
               myid-1,10,MPI_COMM_WORLD,status,ierr)
end if
!向右侧的邻居发送数据
if(myid<3)then
  call MPI_SEND(a(:,mysize+1),totalsize,MPI_REAL, &
               myid+1,10,MPI_COMM_WORLD,ierr)
end if
!从左侧的邻居接收数据
if(myid>0)then
  call MPI_RECV(a(:,2),totalsize,MPI_REAL, &
               myid-1,10,MPI_COMM_WORLD,status,ierr)
end if
begin_col=2
end_col=mysize+1
if(myid==0)then
   begin_col=3
end if
if(myid==3)then
   end_col=mysize
end if

do j=begin_col,end_col
   do i=2,totalsize-1
      b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0.25
   end do
end do
do j=begin_col,end_col
   do i=2,totalsize-1
     a(i,j)=b(j,i)
   end do
end do
end do
do i=2,totalsize-1
   print *,myid,(a(i,j),j=begin_col,end_col)
end do

call MPI_Finalize(rc)

end program Jacobi_1
  
==========================================================
  
program Jacobi_2
implicit none
include 'mpif.h'
integer ::steps
integer,parameter :: totalsize=16
!定义全局数组的规模
integer,parameter :: mysize=totalsize/4,steps=10
integer :: n,myid,numprocs,i,j,rc
real,dimension :: a(totalsize,mysize+2),b(totalsize,mysize+2)
!定义局部数组
integer :: begin_col,end_col,ierr
integer :: status(MPI_STATUS_SIZE)

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
print *,"Process ",myid," of ",numprocs," is alive."
!数组初始化
do j=1,mysize+2
   do i=1,totalsize
       a(i,j)=0.0
   end do
end do
if(myid==0)then
  do i=1,totalsize
     a(i,2)=8.0
  end do
end if
if(myid==3)then
  do i=1,totalsize
    a(i,mysize+1)=8.0
  end do
end if
do i=1,mysize+2
   a(1,i)=8.0
   a(totalsize,i)=8.0
end do
!开始迭代
do n=1,steps
!从左向右平移数据
if(myid==0)then
   call MPI_SEND(a(:,mysize+1),totalsize,MPI_REAL, &
                 myid+1,10,MPI_COMM_WORLD,ierr)
else if(myid==3)then
   call MPI_RECV(a(:,1),totalsize,MPI_REAL,myid+1, &
                 10,MPI_COMM_WORLD,status,ierr)
else
   call MPI_SENDRECV(a(:,mysize+1),totalsize,MPI_REAL,&
                    myid+1,10,a(:,1),totalsize,MPI_REAL,&
                    myid-1,10,MPI_COMM_WORLD,status,ierr)
end if
!从右向左平移数据
if(myid==0)then
   call MPI_RECV(a(:,mysize+2),totalsize,MPI_REAL,  &
                 myid+1,10,MPI_COMM_WORLD,status,ierr)
else if(myid==3)then
   call MPI_SEND(a(:,2),totalsize,MPI_REAL,myid-1,  &
                 10,MPI_COMM_WORLD,ierr)
else
   call MPI_SENDRECV(a(:,2),totalsize,MPI_REAL,myid-1,&
                     10,a(:,mysize+2),totalsize,MPI_REAL, &
                     myid+1,10,MPI_COMM_WORLD,status,ierr)
end if
begin_col=2
end_col=mysize+1
if(myid==0)then
   begin_col=3
end if
if(myid==3)then
   end_col=mysize
end if

do j=begin_col,end_col
   do i=2,totalsize-1
      b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0.25
   end do
end do
do j=begin_col,end_col
   do i=2,totalsize-1
     a(i,j)=b(j,i)
   end do
end do
end do
do i=2,totalsize-1
   print *,myid,(a(i,j),j=begin_col,end_col)
end do

call MPI_Finalize(rc)

end program Jacobi_2

=============================================================

program Jacobi_3
implicit none
include 'mpif.h'
integer ::steps
integer,parameter :: totalsize=16
!定义全局数组的规模
integer,parameter :: mysize=totalsize/4,steps=10
integer :: n,myid,numprocs,i,j,rc
real,dimension :: a(totalsize,mysize+2),b(totalsize,mysize+2)
!定义局部数组
integer :: begin_col,end_col,ierr
integer :: left,right,tag1,tag2
integer :: status(MPI_STATUS_SIZE)

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)
print *,"Process ",myid," of ",numprocs," is alive."
!数组初始化
do j=1,mysize+2
   do i=1,totalsize
       a(i,j)=0.0
   end do
end do
if(myid==0)then
  do i=1,totalsize
     a(i,2)=8.0
  end do
end if
if(myid==3)then
  do i=1,totalsize
    a(i,mysize+1)=8.0
  end do
end if
do i=1,mysize+2
   a(1,i)=8.0
   a(totalsize,i)=8.0
end do
tag1=3
tag2=4
!设置当前进程左右两侧的进程标识
if(myid>0)then
  left=myid-1
else
  left=MPI_PROC_NULL
end if
if(myid<3)then
  right=myid+1
else
  right=MPI_PROC_NULL
end if
!Jacobi迭代
do n=1,steps
!从左向右平移数据
  call MPI_SENDRECV(a(:,mysize+1),totalsize,MPI_REAL,  &
                    right,tag1,a(:,1),totalsize,MPI_REAL,&
                    left,tag1,MPI_COMM_WORLD,status,ierr)
!从右向左平移数据
  call MPI_SENDRECV(a(:,2),totalsize,MPI_REAL,left,   &
                     tag2,a(:,mysize+2),totalsize,MPI_REAL, &
                     right,tag2,MPI_COMM_WORLD,status,ierr)

begin_col=2
end_col=mysize+1
if(myid==0)then
   begin_col=3
end if
if(myid==3)then
   end_col=mysize
end if

do j=begin_col,end_col
   do i=2,totalsize-1
      b(i,j)=(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j))*0.25
   end do
end do
do j=begin_col,end_col
   do i=2,totalsize-1
     a(i,j)=b(j,i)
   end do
end do
end do
do i=2,totalsize-1
   print *,myid,(a(i,j),j=begin_col,end_col)
end do

call MPI_Finalize(rc)

end program Jacobi_3

评分

1

查看全部评分

发表于 2007-1-8 10:48 | 显示全部楼层
买本fortran的书,
了解一下语法,
有算法基础后,fortran上手不难。
发表于 2007-1-8 15:01 | 显示全部楼层
原帖由 linqus 于 2007-1-8 10:48 发表
买本fortran的书,
了解一下语法,
有算法基础后,fortran上手不难。


同意,这方面的书籍还是很多的,比如基本语法类的可以看
唐章宏的《Visual Fortran程序设计》
邓巍巍的《Visual FORTRAN编程指南》
周振红的 《Intel Visual Fortran应用程序开发》

实例可以看何光渝的《Visual Fortran常用数值算法集》
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 19:31 , Processed in 0.093860 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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