添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本代码可用于 平面桁架结构 的计算。

本文是根据 基于Python的结构力学位移法编程求解 的另一版本的更新,内容基本相同,背景介绍此处省略。仅展示最终代码的运行过程。

由于Fortran编程语言使用比较困难一些,所以很少涉及,特别是其缺少一些相应的函数调用,过程要更复杂一些,而且调试过程也较麻烦。但就学习而言,值得去尝试一下,谁知道以后会不会用到呢。本文使用Intel Parallel Studio XE 2020和vs2019。

program main use lapack95 implicit none character*100 path integer num,point,i,j,counter real,dimension(:),allocatable:: angle,length,uv,forces,uv_d,forces_d integer,dimension(:),allocatable:: num1,num2,location,c real,dimension(:,:,:),allocatable:: m real,dimension(:,:),allocatable:: mm,mm_d,a,wq,temp write(*,'("input file road:")') read*,path open(1,file=path) read(1,*)num,point allocate(num1(num)) allocate(num2(num)) allocate(angle(num)) allocate(length(num)) allocate(m(num,4,4)) allocate(uv(point*2)) allocate(forces(point*2)) allocate(mm(point*2,point*2)) allocate(a(point*2,point*2)) allocate(c(point*2)) allocate(location(point*2)) allocate(temp(point*2,2)) !读入杆件位点,计算刚度矩阵 do i=1,num read(1,*)num1(i),num2(i),angle(i),length(i) call mat(angle(i),length(i),i,num,m) enddo !读入结点的力和位移 do i=1,point read(1,*)uv(2*i-1),uv(2*i),forces(2*i-1),forces(2*i) enddo !关闭读入文件 close(1) !扩阶矩阵 forall(i=1:point*2,j=1:point*2)mm(i,j)=0 do i=1,num call rebig(i,m,num,num1(i),num2(i),point,mm) enddo !获取位移向量的非0元素及其位置 counter=count(uv/=0) allocate(mm_d(point*2-counter,point*2-counter)) allocate(uv_d(point*2-counter)) allocate(forces_d(point*2-counter)) allocate(wq(point*2-counter,2)) forall(i=1:2*point)location(i)=0 call get_location(uv,location,counter,point) !获取缩减后的位移和力 call less(forces,forces_d,location,point,counter) call less(uv,uv_d,location,point,counter) !获取缩减后的刚度矩阵 call mless(mm,mm_d,location,point,counter) !刚度矩阵求逆 a=mm_d call getrf(a,c) call getri(a,c) !计算得位移矩阵 forall(i=1:point*2-counter,j=1:1) wq(i,j)=forces_d(i) wq=matmul(a,wq) forall(i=1:point*2-counter,j=1:1) uv_d(i)=wq(i,j) do i=1,point*2-counter uv(location(point*2-counter-i+1))=uv_d(i) enddo !计算得力矩阵 forall(i=1:point*2,j=1:1) temp(i,j)=uv(i) temp=matmul(mm,temp) forall(i=1:point*2,j=1:1) forces(i)=temp(i,j) !输出到结果文档 open(2,file='result.txt') do i=1,point write(2,100)i,uv(2*i-1),uv(2*i) enddo do i=1,point write(2,200)i,forces(2*i-1),forces(2*i) enddo 100 format(1x,'结点',i1,'的位移:',f6.2,',',f6.2) 200 format(1x,'结点',i1,'的力:',f6.2,',',f6.2) close(2) print*,'done' pause contains subroutine mat(a,l,s,n,ma) integer s,n,i,j real lamda,miu,a,l,ma(n,4,4) lamda=cosd(a) miu=sind(a) ma(s,1,:)=(/lamda**2,miu*lamda,-lamda**2,-lamda*miu/) ma(s,2,:)=(/miu*lamda,miu**2,-lamda*miu,-miu**2/) ma(s,3,:)=(/-lamda**2,-miu*lamda,lamda**2,lamda*miu/) ma(s,4,:)=(/-lamda*miu,-miu**2,lamda*miu,miu**2/) forall(i=1:4,j=1:4) ma(s,i,j)=ma(s,i,j)/l end subroutine mat subroutine rebig(s,ma,n,n1,n2,p,mass) integer s,n,n1,n2,p,i,j real ma(n,4,4) real mas(p*2,p*2),mass(p*2,p*2) forall(i=1:p*2,j=1:p*2)mas(i,j)=0 mas(n1*2-1,n1*2-1)=ma(s,1,1);mas(n1*2-1,n1*2)=ma(s,1,2) mas(n1*2-1,n2*2-1)=ma(s,1,3);mas(n1*2-1,n2*2)=ma(s,1,4) mas(n1*2,n1*2-1)=ma(s,2,1);mas(n1*2,n1*2)=ma(s,2,2) mas(n1*2,n2*2-1)=ma(s,2,3);mas(n1*2,n2*2)=ma(s,2,4) mas(n2*2-1,n1*2-1)=ma(s,3,1);mas(n2*2-1,n1*2)=ma(s,3,2) mas(n2*2-1,n2*2-1)=ma(s,3,3);mas(n2*2-1,n2*2)=ma(s,3,4) mas(n2*2,n1*2-1)=ma(s,4,1);mas(n2*2,n1*2)=ma(s,4,2) mas(n2*2,n2*2-1)=ma(s,4,3);mas(n2*2,n2*2)=ma(s,4,4) forall(i=1:p*2,j=1:p*2)mass(i,j)=mass(i,j)+mas(i,j) end subroutine rebig subroutine get_location(uv_,location_,number,p) integer p,number,i,location_(2*p),n real uv_(2*p) n=number do while(n>0) do i=1,p*2 if(uv_(i)/=0)then location(n)=i n=n-1 endif enddo enddo end subroutine get_location subroutine less(old,new_,loca,p,counter_) integer counter_,loca(counter_),p,i,c real new_(p*2-counter_),old(2*point) c=counter_ do while(c>0) new_(i)=old(loca(c)) c=c-1 i=i+1 enddo end subroutine less subroutine mless(mm_,mm_d_,location_,p,count) integer count,location_(count),p,i,j,q,k,s,tf real mm_d_t(p*2-count,p*2-count),mm_d_(p*2-count,p*2-count),mm_(2*p,2*p),temp((p*2-count)**2) do i=1,2*p do j=1,2*p do k=1,2*p-count do s=1,2*p-count if (i==location_(k).and.j==location_(s))then endif enddo enddo if(tf==1)then temp(q)=mm_(i,j) q=q+1 endif enddo enddo mm_d_t=reshape(temp,(/p*2-count,p*2-count/)) forall(i=1:p*2-count,j=1:p*2-count)mm_d_(i,j)=mm_d_t(j,i) end subroutine mless
三维有限元刚度矩阵 编程 fortran 一、刚度矩阵的数值积分表示二、准备文件三、文件读取( fortran )这一部分先到这里后续再陆续更新后面的章节,争取这个月写完吧!!!! 上一部分小编已经将有限元 编程 的整体思路和初始文件的准备讲清楚了,接下来首先是刚度矩阵数学知识的补充,然后是 fortran 编程 的实现 这里有几个要点: 1.刚度矩阵的数值积分形式的表达 2.弹性矩阵D以及三维应变矩阵B的推导 3.各个单元的单元刚度矩阵的组装 4.二维矩阵的一维储存 一、刚度矩阵的数值积分表示 众所周知,刚度矩阵对应的是柔
def circshift(matrix,shiftnum1,shiftnum2): h,w=matrix.shape matrix=np.vstack((matrix[(h-shiftnum1):,:],matrix[:(h-shiftnum1),:])) matrix=np.hstack((matrix[:,(w-shiftnum2):],matrix[:,:(w-shiftnum2)])) return matrix 上述代码中的matrix代
材料力学 求解 器-刚架与桁架杆系的计算机 求解 (附matlab代码)1 刚架的计算机 求解 1.1 位移 与刚度矩阵1.2 matlab程序2 桁架的计算机 求解 材料力学是一门非常成熟的学科,里面有大量的已经成熟的计算方 、计算模型。然而在掌握了基本原理之后, 求解 问题的主要时间都花在了计算上面。这时,则完全可以利用计算机采用数值方 进行快速 求解 。 本文的参考文献很简单,就是 单辉祖 编写的 材料力学第3版下册(或者说是第II册),第18章的内容。 还是惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算 感兴趣才写