
给一个平面桁架计算程序:
integer2 li(100000)
real4 a(1000000)
logical4 results
CHARACTER20 NAM1,NAM2
! WRITE(,'(A\)') ' PLEASE INPUT YOUR DATE-FILE NAME------>'
! READ(,'(A)') NAM1
! READ(,)
! OPEN(1,FILE=NAM1,STATUS='OLD')
! WRITE(,'(/,A\)') ' PLEASE INPUT YOUR OUT-FILE NAME------>'
! READ(,'(A)') NAM2
! OPEN(2,FILE=NAM2,STATUS='unknown')
open(1,file='trus3in',STATUS='unknown')
open(2,file='trus3out',STATUS='unknown')
open(3,file='trus3mout',STATUS='unknown')
read(1,) nn,ne,nc,np
! nn:节点总数; ne:单元总数; nc:支撑约束数;np:荷载总数
write(2,'(a)') 'INITIAL PARAMETER'
write(2,'(4x,4A6/4x,4I6)') 'nn','ne','nc','np',nn,ne,nc,np
n3=nn3 !总自由度
n=n3-nc
iu=1
iaa=iu+n3
iea=iaa+ne
ix=iea+ne
iy=ix+nn
iz=iy+nn
isq=iz+nn
ish=isq+3
idc=ish+3
ist=idc+3
mal=ist+36
jia=1
jja=jia+ne
jns=jja+ne
nal=jns+2nc
na=10000-mal
nli=1000-nal
call trus3(a(iu),a(iaa),a(iea),a(ix),
& a(iy),a(iz),a(isq),a(ish),a(idc),
& a(ist),a(mal),li(nal),li(jia),li(jja),
& li(jns),nn,ne,nc,np,n3,n,na,nli)
close(1)
close(2)
close(3)
results= SYSTEMQQ('d:\\TEDITEXE
& e:\\WORKfor90\\SPT1_OK\\trus3out ')
results= SYSTEMQQ('d:\\TEDITEXE
& e:\\WORKfor90\\SPT1_OK\\trus3mout ')
stop
end
!
subroutine trus3(u,aa,ea,x,y,z,sq,sh,
& dc,sk,a,li,ia,ja,ns,nn,ne,nc,np,
& n3,n,na,nli)
integer2 ia(ne),ja(ne),ns(nc,2),li(nli),jod(np,2)
real4 u(n3),aa(ne),ea(ne),x(nn),y(nn),z(nn),
& sq(3),sh(3),dc(3),sk(6,6),a(na),qd(np)
!读节点坐标、支座约束、左右节点号、截面面积、d性模量信息
read(1,) (x(i),y(i),z(i),i=1,nn),
& (ns(i,1),ns(i,2),i=1,nc),
& (ia(i),ja(i),aa(i),ea(i),i=1,ne)
write(2,'(1x,a)') 'NODAL COORDINATES'
write(2,'(4x,a4,3a12)') 'NO','X-COOR','Y-COOR','Z-COOR'
write(2,'(4x,i4,3f123)') (i,x(i),y(i),z(i),i=1,nn)
write(2,'(/1x,a)') 'POINTS OF SUPPRESSED DISPLACEMENTS'
write(2,'(2a10/(2i10))') 'NO','DIRECTION',
& (ns(i,1),ns(i,2),i=1,nc)
write(2,'(/1x,a)') 'MEMBER DETAILS'
write(2,'(4x,a4,a6,a3,2a12/
& (3x,''('',i3,'')'',i6,''-'',i2,
& 2e123))') 'NE','I','-J','A','E',
& (i,ia(I),ja(i),aa(i),ea(i),i=1,ne)
!读入荷载数据:
!jod(i,1)受荷节点号;jod(i,2)荷载作用方向(1表示x向;2表示x向;3表示x向);qd(i)荷载大小,
write(2,'(/1x,a)') ' EXTERNAL LOADS'
do 999 i=1,np
jod(i,1)=0
jod(i,2)=0
qd(i)=00
999 continue
read(1,) (jod(i,1), jod(i,2),qd(i),i=1,np)
write(2,'(a10,3x,a10,a13/(2i10,f163))')
& ' NO','DIRECTION','VALUE',
& (jod(i,1),jod(i,2),qd(i),i=1,np)
!求最大带宽
mx=0
do 400 i=1,ne
io=iabs(ja(i)-ia(i)) !左右最大节点号差
if(iogtmx) mx=io
400 continue
nb=(mx+1)3
nt=n3+nb
iia=1
iq=iia+ntnb
ic=iq+nt
iqd=ic+nt
mal=iqd+np+na
jjod=1
nal=jjod+2np+nli
call s410(u,aa,ea,x,y,z,sq,sh,
& dc,sk,a,q,c,qd,jod,ia,ja,ns,nn,ne,
& nc,np,n3,n,nb,nt)
return
end
subroutine s410(u,aa,ea,x,y,z,sq,sh,
& dc,sk,a,q,c,qd,jod,ia,ja,ns,nn,ne,
& nc,np,n3,n,nb,nt)
integer2 ia(ne),ja(ne),ns(nc,2),jod(np,2)
real4 u(n3),aa(ne),ea(ne),x(nn),y(nn),
& z(nn),sq(3),sh(3),dc(3),sk(6,6),
& a(nt,nb),q(nt),c(nt),qd(np),l
检查传入数据
! write(,'(a)') 'INITIAL PARAMETER'
! write(,'(4x,4A6/4x,4I6)') 'nn','ne','nc','np',nn,ne,nc,np
! write(,'(1x,a)') 'NODAL COORDINATES'
! write(,'(4x,a4,3a12)') 'NO','X-COOR','Y-COOR','Z-COOR'
! write(,'(4x,i4,3f123)') (i,x(i),y(i),z(i),i=1,nn)
! write(,'(/1x,a)') 'POINTS OF SUPPRESSED DISPLACEMENTS'
! write(,'(2a10/(2i10))') 'NO','DIRECTION',
! & (ns(i,1),ns(i,2),i=1,nc)
! write(,'(/1x,a)') 'MEMBER DETAILS'
! write(,'(4x,a4,a6,a3,2a12/
! & (3x,''('',i3,'')'',i6,''-'',i2,
! & 2f123))') 'NE','I','-J','A','E',
! & (i,ia(I),ja(i),aa(i),ea(i),i=1,ne)
! write(,'(a10,3x,a10,a13/(2i10,f163))')
! & ' NO','DIRECTION','VALUE',
! & (jod(i,1),jod(i,2),qd(i),i=1,np)
!
! pause 1
!总刚矩阵及荷载列阵清零
do 480 i=1,nt
do 450 j=1,nb
a(i,j)=00
450 continue
q(i)=00
480 continue
!形成荷载向量
do 544 i=1,np
npd=jod(i,1)3+jod(i,2)-3 !相应荷载位置=节点号3+节点方向数(1 2 3)-3
q(npd)=q(npd)+qd(i)
544 continue
!对单元循环形成单元刚度矩阵并加入总刚矩阵
do 1120 me=1,ne
write(3,) me
i=ia(me) !单元左端号
j=ja(me) !单元右端号
ao=aa(me) !单元面积
e=ea(me) !单元d性模量
!求单元方向余弦
l=sqrt((x(j)-x(i))2+(y(j)-y(i))2+(z(j)-z(i))2)
xc=(x(j)-x(i))/l
yc=(y(j)-y(i))/l
zc=(z(j)-z(i))/l
!求单刚元素
sk(1,1)=xc2
sk(1,2)=xcyc
sk(2,1)=sk(1,2)
sk(2,2)=yc2
sk(1,3)=xczc
sk(3,1)=sk(1,3)
sk(3,2)=yczc
sk(2,3)=sk(3,2)
sk(3,3)=zc2
sk(4,1)=-xc2
sk(4,2)=-xcyc
sk(4,3)=-xczc
sk(5,1)=-xcyc
sk(5,2)=-yc2
sk(5,3)=-yczc
sk(6,1)=-xczc
sk(6,2)=-yczc
sk(6,3)=-zc2
do 870 ii=1,3
do 870 jj=1,3
sk(ii+3,jj+3)=sk(ii,jj)
sk(ii,jj+3)=sk(jj+3,ii)
870 continue
cn=aoe/l
do 930 ii=1,6
do 930 jj=1,6
sk(ii,jj)=sk(ii,jj)cn
! write(3,) sk(ii,jj) !!!!!!
930 continue
!将单刚矩阵送入总刚矩阵
i1=3i-3
j1=3j-3
! pause 4 !检测断点
do 1114 jj=1,2
if(jjeq1) nr=i1
if(jjeq2) nr=j1
do 1112 j9=1,3
nr=nr+1
ii=(jj-1)3+j9
do 1110 kk=1,2
if(kkeq1) n9=i1
if(kkeq2) n9=j1
do 1100 k=1,3
ll=(kk-1)3+k
nk=n9+k+1-nr
if(nkle0) goto 1100
a(nr,nk)=a(nr,nk)+sk(ii,ll)
1100 continue
1110 continue
1112 continue
pause 4 !检测断点
1114 continue
1120 continue
!引入支座约束条件
do 1150 i=1,nc
npd=ns(i,1)3+ns(i,2)-3
a(npd,1)=a(npd,1)(1e+12)+(1e+12) !
q(npd)=0
1150 continue
!荷载列阵交给方程右端项
n=n3
do 1190 ii=1,n3
c(ii)=q(ii)
write(3,) c(ii) !!!!!!!!!!!!!!!!!
1190 continue
!调用解方程子程序
call s2000(a,c,n,nb,nt)
!求得位移项交给位移列阵
1220 do 1230 ii=1,n3
1230 u(ii)=c(ii)
!输出位移结果
write(2,'(/1x,a)') 'NODAL DISPLACEMENTS'
write(2,'(a8,a10,2a12/(i8,3f125))') 'no','u','v','w',
& (ii,u(3ii-2),u(3ii-1),u(3ii),ii=1,nn)
!输出内力结果
write(2,'(/1x,a)') 'FORCE IN THE MEMBERS'
write(2,'(4x,a4,a6,a3,a16)') 'ne','i','-j','force'
do 1610 me=1,ne
i=ia(me)
j=ja(me)
ao=aa(me)
e=ea(me)
l=sqrt((x(j)-x(i))2+(y(j)-y(i))2+(z(j)-z(i))2)
xc=(x(j)-x(i))/l
yc=(y(j)-y(i))/l
zc=(z(j)-z(i))/l
dc(1)=xc
dc(2)=yc
dc(3)=zc
i1=3i-3
j1=3j-3
do 1510 i3=1,3
j3=i1+i3
j2=j1+i3
sq(i3)=u(j3)
sh(i3)=u(j2)
1510 continue
a1=00
a2=00
do 1570 ii=1,3
a1=a1+dc(ii)sq(ii)
a2=a2+dc(ii)sh(ii)
1570 continue
!内力=面积d性模量应变(两端位移差与总长比值)
fc=aoe(a2-a1)/l
write(2,'(4x,''('',i2,'')'',i6,''-'',i2,f165)')
& me,ia(me),ja(me),fc
1610 continue
return
end
subroutine s2000(a,cc,n,nb,nt) !半带宽解线性方程组子程序
real4 a(nt,nb),cc(nt)
2000 do 2940 ii=1,n
ik=ii
do 2920 jj=2,nb
ik=ik+1
cn=a(ii,jj)/a(ii,1)
jk=0
do 2890 kk=jj,nb
jk=jk+1
2890 a(ik,jk)=a(ik,jk)-cna(ii,kk)
a(ii,jj)=cn
2920 cc(ik)=cc(ik)-cncc(ii)
2940 cc(ii)=cc(ii)/a(ii,1)
do 3010 iz=2,n
ii=n-iz+1
do 3000 kk=2,nb
jj=ii+kk-1
3000 cc(ii)=cc(ii)-a(ii,kk)cc(jj)
3010 continue
return
end
trus3in
6,9,9,2
0, 0, 40,
0, 0,-40,
0,100, 0,
120,0, 40,
120,0,-40,
120,-70,0,
1,1,1,2,1,3,
2,1,2,2,2,3,
3,1,3,2,3,3,
5,3,30e-4,12e+12,
4,3,30e-4,12e+12,
4,1,30e-4,12e+12,
4,5,30e-4,12e+12,
5,2,30e-4,12e+12,
6,1,30e-4,12e+12,
4,6,30e-4,12e+12,
5,6,30e-4,12e+12,
6,2,30e-4,12e+12,
6,1, 25000,
6,2,-43301,
N = length(x);
interv_x = zeros( 1, N - 1 );
mid_y = zeros( 1, N - 1);
for i = 2 : length(x)
mid_y(i-1) = ( y(i) + y(i-1) ) / 2;
interv_x(i - 1) = x(i) - x(i-1);
end
% 面积
area = interv_x mid_y';
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
世纪公元和年代的算法 本世纪初,美国物理学会(American Institute of Physics)和IEEE计算机社团 (IEEE Computer Society)的一本联合刊物《科学与工程中的计算》发表了由田纳西大学的Jack Dongarra和橡树岭国家实验室的Francis Sullivan 联名撰写的“世纪十大算法”一文,该文“试图整理出在20世纪对科学和工程领域的发展产生最大影响力的十大算法”。作者苦于“任何选择都将是充满争议的, 因为实在是没有最好的算法”,他们只好用编年顺序依次列出了这十项算法领域人类智慧的巅峰之作——给出了一份没有排名的算法排行榜。有趣的是,该期杂志还 专门邀请了这些算法相关领域的“大拿”为这十大算法撰写十篇综述文章,实在是蔚为壮观。本文的目的,便是要带领读者走马观花,一同回顾当年这一算法界的盛 举。
1946 蒙特卡洛方法
在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形 状,呃,能帮我算算这个不规则图形的面积么?蒙特卡洛(Monte Carlo)方法便是解决这个问题的巧妙方法:随机向该正方形内扔N(N 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个:那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的 值便越精确。别小看这个数黄豆的笨办法,大到国家的民意测验,小到中子的移动轨迹,从金融市场的风险分析,到军事演习的沙盘推演,蒙特卡洛方法无处不在背 后发挥着它的神奇威力。
蒙特卡洛方法由美国拉斯阿莫斯国家实验室的三位科学家John von Neumann(看清楚了,这位可是冯诺伊曼同志!),Stan Ulam 和 Nick Metropolis共同发明。就其本质而言,蒙特卡洛方法是用类似于物理实验的近似方法求解问题,它的魔力在于,对于那些规模极大的问题,求解难度随着 问题的维数(自变量个数)的增加呈指数级别增长,出现所谓的“维数的灾难”(Course of Dimensionality)。对此,传统方法无能为力,而蒙特卡洛方法却可以独辟蹊径,基于随机仿真的过程给出近似的结果。
最后八卦一下,Monte Carlo这个名字是怎么来的?它是摩纳哥的一座以博彩业闻名的城市,赌博其实是门概率的高深学问,不是么?
1947 单纯形法
单 纯形法是由大名鼎鼎的“预测未来”的兰德公司的Grorge Dantzig发明的,它成为线性规划学科的重要基石。所谓线性规划,简单的说,就是给定一组线性(所有变量都是一次幂)约束条件(例如a1x1+ b1x2+c1x3>0),求一个给定的目标函数的极值。这么说似乎也太太太抽象了,但在现实中能派上用场的例子可不罕见——比如对于一个公司 而言,其能够投入生产的人力物力有限(“线性约束条件”),而公司的目标是利润最大化(“目标函数取最大值”),看,线性规划并不抽象吧!线性规划作为运 筹学(operation research)的一部分,成为管理科学领域的一种重要工具。而Dantzig提出的单纯形法便是求解类似线性规划问题的一个极其有效的方法,说来惭 愧,本科二年级的时候笔者也学过一学期的运筹学,现在脑子里能想起的居然只剩下单纯形法了——不过这不也正说明了该方法的简单和直观么?
顺便说句题外话,写过《万历十五年》的黄仁宇曾说中国的传统是“不能从数目字上管理”,我们习惯于“拍脑袋”,而不是基于严格的数据做决定,也许改变这一传统的方法之一就是全民动员学习线性规划喔。
1950 Krylov子空间迭代法
1951 矩阵计算的分解方法
50 年代初的这两个算法都是关于线性代数中的矩阵计算的,看到数学就头大的读者恐怕看到算法的名字已经开始皱眉毛了。Krylov子空间叠代法是用来求解形如 Ax=b 的方程,A是一个nn 的矩阵,当n充分大时,直接计算变得非常困难,而Krylov方法则巧妙地将其变为Kxi+1=Kxi+b-Axi的迭代形式来求解。这里的K(来源于作 者俄国人Nikolai Krylov姓氏的首字母)是一个构造出来的接近于A的矩阵,而迭代形式的算法的妙处在于,它将复杂问题化简为阶段性的易于计算的子步骤。
1951年由橡树岭国家实验室的AlstonHouseholder提出的矩阵计算的分解方法,则证明了任何矩阵都可以分解为三角、对角、正交和其他特殊形式的矩阵,该算法的意义使得开发灵活的矩阵计算软件包成为可能。
1957 优化的Fortran编译器
说 实话,在这份学术气息无比浓郁的榜单里突然冒出一个编译器(Compiler)如此工程化的东东实在让人有“关公战秦琼”的感觉。不过换个角度想 想,Fortran这一门几乎为科学计算度身定制的编程语言对于科学家(尤其是数学家,物理学家)们实在是太重要了,简直是他们形影不离的一把瑞士军刀, 这也难怪他们纷纷抢着要把票投给了它。要知道,Fortran是第一种能将数学公式转化为计算机程序的高级语言,它的诞生使得科学家们真正开始利用计算机 作为计算工具为他们的研究服务,这是计算机应用技术的一个里程碑级别的贡献。
话说回来,当年这帮开发Fortran的家伙真是天 才——只用23500行汇编指令就完成了一个Fortran编译器,而且其效率之高令人叹为观止:当年在IBM 主持这一项目的负责人JohnBackus在数十年后,回首这段往事的时候也感慨,说它生成代码的效率“出乎了所有开发者的想象”。看来作为程序员,自己 写的程序跑起来“出乎自己的想象”,有时候还真不一定是件坏事!
1959-61 计算矩阵特征值的QR算法
呼, 又是一个和线性代数有关的算法,学过线性代数的应该还记得“矩阵的特征值”吧?计算特征值是矩阵计算的最核心内容之一,传统的求解方案涉及到高次方程求 根,当问题规模大的时候十分困难。QR算法把矩阵分解成一个正交矩阵(什么是正交矩阵?!还是赶紧去翻书吧!)与一个上三角矩阵的积,和前面提到的 Krylov 方法类似,这又是一个迭代算法,它把复杂的高次方程求根问题化简为阶段性的易于计算的子步骤,使得用计算机求解大规模矩阵特征值成为可能。这个算法的作者 是来自英国伦敦的JGF Francis。
1962 快速排序算法
不少读者恐怕和我一样,看到“快 速排序算法”(Quick Sort)这个条目时,心里的感觉是——“这可总算找到组织了”。相比于其他一些对程序员而言高深莫测的数学物理公式,快速排序算法真是我们朝夕相处的好 伙伴——老板让你写个排序算法,如果你写出来的不是快速排序,你都不好意思跟同事打招呼。其实根本不用自己动手实现, 不论是ANSI C,C++ STL,还是Java SDK,天下几乎所有的SDK里都能找到它的某种实现版本。
快速排序算法最早由Tony Hoare爵士设计,它的基本思想是将待排序列分为两半,左边的一半总是“小的”,右边的一半总是“大的”,这一过程不断递归持续下去,直到整个序列有 序。说起这位Tony Hoare爵士,快速排序算法其实只是他不经意间的小小发现而已,他对于计算机贡献主要包括形式化方法理论,以及ALGOL60 编程语言的发明等,他也因这些成就获得1980 年图灵奖。
快速排序的平均时间复杂度仅仅为O(Nlog(N)),相比于普通选择排序和冒泡排序等而言,实在是历史性的创举。
1965 快速傅立叶变换
如 果要评选对我们的日常生活影响最大的算法,快速傅立叶变换算法应该是当仁不让的总冠军——每天当拿起话筒,打开手机,听mp3,看DVD,用DC拍照 ——毫不夸张的说,哪里有数字信号处理,哪里就有快速傅立叶变换。快速傅立叶算法是离散傅立叶算法(这可是数字信号处理的基石)的一种快速算法,它有 IBM 华生研究院的James Cooley和普林斯顿大学的John Tukey共同提出,其时间复杂度仅为O(Nlog(N));比时间效率更为重要的是,快速傅立叶算法非常容易用硬件实现,因此它在电子技术领域得到极其 广泛的应用。
1977 整数关系探测算法
整数关系探测是个古老的问题,其历史甚至可以追溯到欧几里德的时代。具体的说:
给 定—组实数X1,X2,,Xn,是否存在不全为零的整数a1,a2,an,使得:a 1 x 1 +a 2 x 2 + + a n x n = 0 这一年BrighamYoung大学的Helaman Ferguson 和Rodney Forcade解决了这一问题。至于这个算法的意义嘛,呃,该算法应用于“简化量子场论中的Feynman图的计算”——太深奥的学问拉!
1987 快速多极算法
日 历翻到了1987 年,这一年的算法似乎更加玄奥了,耶鲁大学的Leslie Greengard和Vladimir Rokhlin提出的快速多极算法用来计算“经由引力或静电力相互作用的N 个粒子运动的精确计算——例如银河系中的星体,或者蛋白质中的原子间的相互作用”,天哪,不是我不明白,这世界真是变得快!
所谓浪花淘尽英雄,这些算法的发明者许多已经驾鹤西去。二十一世纪的头五年也已经在不知不觉中从我们指尖滑过,不知下一次十大算法评选的盛事何时再有,也许我们那时已经垂垂老去,也许我们早已不在人世,只是心中唯一的希望——里面该有个中国人的名字吧!
我强烈建议你,对于任何程序,都用 Implicit None !!!这可以避免你很多很多错误。
这一点请你谨记!!
回到你的错误,你的函数名字叫 zhouchang,area,但是返回值却叫 zhouchang_r,area_r
这很矛盾,我是一个人,可以联想这俩可能是一回事,但是编译器不能。你必须统一他们的名字。
所以,我把你的代码修改为:
Module circle
Implicit None
Real , parameter , private :: pi=314
Contains
Real Function zhouchang(r)
Real :: r
zhouchang=2pir
End Function
Real Function area(r)
Real :: r
area=pir2
End Function
End Module circle
Program main
use circle
Implicit None
Real a,l,r
Read,r
l=zhouchang(r)
a=area(r)
print ,'周长:',l,'面积',a
End Program Main
以上就是关于在编写fortran程序的时候遇到这个问题,说是如果环绕结构是数组的话,组成不能是数组,怎么改呢全部的内容,包括:在编写fortran程序的时候遇到这个问题,说是如果环绕结构是数组的话,组成不能是数组,怎么改呢、如何用matlab求面积、关于 世纪 和年代的算法我不是很明白【100分】等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)