- 积分
- 0
- 注册时间
- 2010-7-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
; Calculate P-Y Curves at equidistant locations(等距离位置) along pile
;
; set linked lists of equidistant nodes(设置等距离节点连接表)
;
def set_list
ver_head = null
i_pnt = i_head;指向接触面表中第一个接触面的地址
loop while i_pnt # null
node_pnt = i_node_head(i_pnt);接触面的第一个地址
loop while node_pnt # null
z_pos = in_pos(node_pnt,3);node_pnt的z坐标
ver_pnt = ver_head
section
if ver_head = null then
new = get_mem(5)
mem(new) = ver_head
ver_head = new
mem(new+2) = z_pos
mem(new+4) = gp_near(0,0,z_pos)
hnew = get_mem(2)
mem(hnew+1) = node_pnt
mem(new+1) = hnew
mem(hnew) = null
exit section
end_if
loop while ver_pnt # null
ver_pnt_n = mem(ver_pnt)
if abs(mem(ver_pnt+2)-z_pos)<0.1 then
hnew = get_mem(2)
mem(hnew+1) = node_pnt
mem(hnew) = mem(ver_pnt+1)
mem(ver_pnt+1) = hnew
exit section
end_if
if ver_pnt_n = null then
new = get_mem(5)
mem(new) = null
mem(ver_pnt) = new
mem(new+2) = z_pos
mem(new+4) = gp_near(0,0,z_pos)
hnew = get_mem(2)
mem(hnew+1) = node_pnt
mem(new+1) = hnew
mem(hnew) = null
exit section
end_if
ver_pnt = ver_pnt_n
end_loop
end_section
node_pnt = in_next(node_pnt)
end_loop
i_pnt = i_next(i_pnt)
end_loop
;
; --- calculate length corresponding to each segment
;
ver_pnt = ver_head
z_up = mem(ver_pnt+2)
loop while ver_pnt # null
ver_pnt_n = mem(ver_pnt)
if ver_pnt_n # null then
z_down = mem(ver_pnt_n+2)
else
z_down = mem(ver_pnt+2)
end_if
mem(ver_pnt+3) = 0.5*(z_up-z_down)
z_up = mem(ver_pnt+2)
ver_pnt = ver_pnt_n
end_loop
end
set_list
;
; calculate average pressure during simulation
;
def gen_curve
while_stepping
if step-100*int(step/100)=0 then
tot_reac = 0.
vcount = 0
ver_pnt = ver_head
loop while ver_pnt # null
vcount = vcount+1
hor_pnt = mem(ver_pnt+1)
hor_for = 0.
hcount = 0
loop while hor_pnt # null
node_pnt = mem(hor_pnt+1)
hcount = hcount+1
area = 2.0 * in_area(node_pnt)
hor_nor = in_nstr(node_pnt)
hor_she = in_sstr(node_pnt,1)
;
; --- find orientation of the normal ---
;
t_zone = in_ztarget(node_pnt)
t_face = in_ftarget(node_pnt)
t_gp1 = z_facegp(t_zone,t_face,1)
t_gp2 = z_facegp(t_zone,t_face,2)
t_gp3 = z_facegp(t_zone,t_face,3)
;
dx1 = gp_xpos(t_gp2)-gp_xpos(t_gp1)
dy1 = gp_ypos(t_gp2)-gp_ypos(t_gp1)
dz1 = gp_zpos(t_gp2)-gp_zpos(t_gp1)
;
dx2 = gp_xpos(t_gp3)-gp_xpos(t_gp1)
dy2 = gp_ypos(t_gp3)-gp_ypos(t_gp1)
dz2 = gp_zpos(t_gp3)-gp_zpos(t_gp1)
;
dxn = dy1*dz2-dz1*dy2
dyn = dz1*dx2-dx1*dz2
dzn = dx1*dy2-dy1*dx2
dn = sqrt(dxn*dxn+dyn*dyn+dzn*dzn)
dxn = dxn/dn
;
hor_nor = hor_nor*dxn
hor_for = hor_for+(hor_nor+hor_she)*area
hor_pnt = mem(hor_pnt)
end_loop
gp_pile = mem(ver_pnt+4)
hor_dis = gp_xdisp(gp_pile)
tot_reac = tot_reac+hor_for
table(vcount,hor_dis) = hor_for/mem(ver_pnt+3)
ver_pnt = mem(ver_pnt)
end_loop
end_if
end
关于pointer在fish的运用,我已经学习了很久,但是一直没有怎么进步,终于鼓起勇气,把这段程序放上来,希望高手能帮我解释一下这段程序,非常感谢。 |
|