- 积分
- 83
- 注册时间
- 2003-11-14
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2011-1-25 12:52:33
|
显示全部楼层
来自 北京
可以负责地说:不可能。
你原来那个程序如果没猜错,是德国人kattan写、韩来彬翻译的那本书上的源程序:一看那个长长的名字就知道了。
如果抛开教学目的不说,你不觉得他的程序写得很烂吗?哪有这么写MATLAB程序的,这不是给你AK,你抡起来当铁锨用吗?而关于可读性,我认为和代码行数没有直接关系,比如他写的这个总刚集成程序:- function y = BilinearQuadAssemble(K,k,i,j,m,n)
- %BilinearQuadAssemble This function assembles the element
- % stiffness matrix k of the bilinear
- % quadrilateral element with nodes i, j,
- % m, and n into the global stiffness
- % matrix K.
- % This function returns the global stiffness
- % matrix K after the element stiffness matrix
- % k is assembled.
- K(2*i-1,2*i-1) = K(2*i-1,2*i-1) + k(1,1);
- K(2*i-1,2*i) = K(2*i-1,2*i) + k(1,2);
- K(2*i-1,2*j-1) = K(2*i-1,2*j-1) + k(1,3);
- K(2*i-1,2*j) = K(2*i-1,2*j) + k(1,4);
- K(2*i-1,2*m-1) = K(2*i-1,2*m-1) + k(1,5);
- K(2*i-1,2*m) = K(2*i-1,2*m) + k(1,6);
- K(2*i-1,2*n-1) = K(2*i-1,2*n-1) + k(1,7);
- K(2*i-1,2*n) = K(2*i-1,2*n) + k(1,8);
- K(2*i,2*i-1) = K(2*i,2*i-1) + k(2,1);
- K(2*i,2*i) = K(2*i,2*i) + k(2,2);
- K(2*i,2*j-1) = K(2*i,2*j-1) + k(2,3);
- K(2*i,2*j) = K(2*i,2*j) + k(2,4);
- K(2*i,2*m-1) = K(2*i,2*m-1) + k(2,5);
- K(2*i,2*m) = K(2*i,2*m) + k(2,6);
- K(2*i,2*n-1) = K(2*i,2*n-1) + k(2,7);
- K(2*i,2*n) = K(2*i,2*n) + k(2,8);
- K(2*j-1,2*i-1) = K(2*j-1,2*i-1) + k(3,1);
- K(2*j-1,2*i) = K(2*j-1,2*i) + k(3,2);
- K(2*j-1,2*j-1) = K(2*j-1,2*j-1) + k(3,3);
- K(2*j-1,2*j) = K(2*j-1,2*j) + k(3,4);
- K(2*j-1,2*m-1) = K(2*j-1,2*m-1) + k(3,5);
- K(2*j-1,2*m) = K(2*j-1,2*m) + k(3,6);
- K(2*j-1,2*n-1) = K(2*j-1,2*n-1) + k(3,7);
- K(2*j-1,2*n) = K(2*j-1,2*n) + k(3,8);
- K(2*j,2*i-1) = K(2*j,2*i-1) + k(4,1);
- K(2*j,2*i) = K(2*j,2*i) + k(4,2);
- K(2*j,2*j-1) = K(2*j,2*j-1) + k(4,3);
- K(2*j,2*j) = K(2*j,2*j) + k(4,4);
- K(2*j,2*m-1) = K(2*j,2*m-1) + k(4,5);
- K(2*j,2*m) = K(2*j,2*m) + k(4,6);
- K(2*j,2*n-1) = K(2*j,2*n-1) + k(4,7);
- K(2*j,2*n) = K(2*j,2*n) + k(4,8);
- K(2*m-1,2*i-1) = K(2*m-1,2*i-1) + k(5,1);
- K(2*m-1,2*i) = K(2*m-1,2*i) + k(5,2);
- K(2*m-1,2*j-1) = K(2*m-1,2*j-1) + k(5,3);
- K(2*m-1,2*j) = K(2*m-1,2*j) + k(5,4);
- K(2*m-1,2*m-1) = K(2*m-1,2*m-1) + k(5,5);
- K(2*m-1,2*m) = K(2*m-1,2*m) + k(5,6);
- K(2*m-1,2*n-1) = K(2*m-1,2*n-1) + k(5,7);
- K(2*m-1,2*n) = K(2*m-1,2*n) + k(5,8);
- K(2*m,2*i-1) = K(2*m,2*i-1) + k(6,1);
- K(2*m,2*i) = K(2*m,2*i) + k(6,2);
- K(2*m,2*j-1) = K(2*m,2*j-1) + k(6,3);
- K(2*m,2*j) = K(2*m,2*j) + k(6,4);
- K(2*m,2*m-1) = K(2*m,2*m-1) + k(6,5);
- K(2*m,2*m) = K(2*m,2*m) + k(6,6);
- K(2*m,2*n-1) = K(2*m,2*n-1) + k(6,7);
- K(2*m,2*n) = K(2*m,2*n) + k(6,8);
- K(2*n-1,2*i-1) = K(2*n-1,2*i-1) + k(7,1);
- K(2*n-1,2*i) = K(2*n-1,2*i) + k(7,2);
- K(2*n-1,2*j-1) = K(2*n-1,2*j-1) + k(7,3);
- K(2*n-1,2*j) = K(2*n-1,2*j) + k(7,4);
- K(2*n-1,2*m-1) = K(2*n-1,2*m-1) + k(7,5);
- K(2*n-1,2*m) = K(2*n-1,2*m) + k(7,6);
- K(2*n-1,2*n-1) = K(2*n-1,2*n-1) + k(7,7);
- K(2*n-1,2*n) = K(2*n-1,2*n) + k(7,8);
- K(2*n,2*i-1) = K(2*n,2*i-1) + k(8,1);
- K(2*n,2*i) = K(2*n,2*i) + k(8,2);
- K(2*n,2*j-1) = K(2*n,2*j-1) + k(8,3);
- K(2*n,2*j) = K(2*n,2*j) + k(8,4);
- K(2*n,2*m-1) = K(2*n,2*m-1) + k(8,5);
- K(2*n,2*m) = K(2*n,2*m) + k(8,6);
- K(2*n,2*n-1) = K(2*n,2*n-1) + k(8,7);
- K(2*n,2*n) = K(2*n,2*n) + k(8,8);
- y = K;
复制代码 ============================================================================
像下面这样写可读性会变差吗?
- function K=k_assemble_wall(k,i,j,m,n)
- K=zeros(2*length(inputDataForWall.caX));
- K([2*i-1:2*i,2*j-1:2*j,2*m-1:2*m,2*n-1:2*n],[2*i-1:2*i,...
- 2*j-1:2*j,2*m-1:2*m,2*n-1:2*n])=k;
复制代码 我不在家中,自己写的程序都不在身边,这些都是从simwe论坛上反过来down的零星程序,我用自己的电脑跑一个单元的数据(这个积分上下限正好是-1到1,所以不用做变换,如果要变换的话,大家可以再深入讨论),时间如下:- Elapsed time is 0.000260 seconds.
复制代码- % **********************************测试数据***********************************
- x=[0 .25 .25 0];
- y=[0 0 .25 .25];
- NU=.3;
- E=210e6;
- h=.025;
- p=1;
- % 1.四点GAUSS积分计算权值规则
- s=[-.5773 -.5773 .5773 .5773];
- t=[-.5773 .5773 -.5773 .5773];
- a = (y(1)*(s-1)+y(2)*(-1-s)+y(3)*(1+s)+y(4)*(1-s))/4;
- b = (y(1)*(t-1)+y(2)*(1-t)+y(3)*(1+t)+y(4)*(-1-t))/4;
- c = (x(1)*(t-1)+x(2)*(1-t)+x(3)*(1+t)+x(4)*(-1-t))/4;
- d = (x(1)*(s-1)+x(2)*(-1-s)+x(3)*(1+s)+x(4)*(1-s))/4;
- dNs=[-0.3943 0.3943 0.1057 -0.1057;
- -0.3943 0.3943 0.1057 -0.1057;
- -0.1057 0.1057 0.3943 -0.3943;
- -0.1057 0.1057 0.3943 -0.3943];
- dNt=[-0.3943 -0.1057 0.1057 0.3943;
- -0.1057 -0.3943 0.3943 0.1057;
- -0.3943 -0.1057 0.1057 0.3943;
- -0.1057 -0.3943 0.3943 0.1057];
- if p == 1
- D = (E/(1-NU^2))*[1, NU, 0 ; NU, 1, 0 ; 0, 0, (1-NU)/2];
- elseif p == 2
- D = (E/(1+NU)/(1-2*NU))*[1-NU, NU, 0 ; NU, 1-NU, 0 ; 0, 0, (1-2*NU)/2];
- end
- k=zeros(8);
- for i=1:4
- J= .125*x*[0 1-t(i) t(i)-s(i) s(i)-1 ; t(i)-1 0 s(i)+1 -s(i)-t(i) ;
- s(i)-t(i) -s(i)-1 0 t(i)+1 ; 1-s(i) s(i)+t(i) -t(i)-1 0]*y';
- B=[a(i)*dNs(i,1)-b(i)*dNt(i,1),0,a(i)*dNs(i,2)-b(i)*dNt(i,2),0,...
- a(i)*dNs(i,3)-b(i)*dNt(i,3),0,a(i)*dNs(i,4)-b(i)*dNt(i,4),0;...
- 0,c(i)*dNt(i,1)-d(i)*dNs(i,1),0,c(i)*dNt(i,2)-d(i)*dNs(i,2),...
- 0,c(i)*dNt(i,3)-d(i)*dNs(i,3),0,c(i)*dNt(i,4)-d(i)*dNs(i,4);...
- c(i)*dNt(i,1)-d(i)*dNs(i,1),a(i)*dNs(i,1)-b(i)*dNt(i,1),...
- c(i)*dNt(i,2)-d(i)*dNs(i,2),a(i)*dNs(i,2)-b(i)*dNt(i,2),...
- c(i)*dNt(i,3)-d(i)*dNs(i,3),a(i)*dNs(i,3)-b(i)*dNt(i,3),...
- c(i)*dNt(i,4)-d(i)*dNs(i,4),a(i)*dNs(i,4)-b(i)*dNt(i,4)]/J;
- k=k+B'*D*B*J*h;
- end
复制代码 你不妨用他书上程序自己验证一下这个最简单的四节点板单元的计算速度。
另外,他书中很多程序我自己写程序验证过,如果用gauss四点法写数值程序,速度会快出100倍以上,这绝对是个保守数字。
所以顺便问问多少个单元,不妨把你的程序贴上来大家看看,假如单元很多,建议直接放弃MATLAB,这不是干这个事情的软件,就做做算法验证还好。 |
评分
-
1
查看全部评分
-
|