yueleiz456 发表于 2011-7-1 11:36:35

Flac3D一个例子,fish语言

各位大侠,请看看这个例子,怎么运行时出现错误呀,显示为"unbalanced quote marks” 命令如下 。请不吝赐教!

new
;新建文本
;
def in_def
;用 fish语言定义函数 in_def(此函数产生的对输入参数进行交互式控制)
xx = in(msg+'('+'default:'+string(default)+'):')
;对xx赋予的值为字符串、数字,它主要用于下面的一些命令中
if type(xx) = 3
    in_def = default
else
    in_def = xx
endif
;条件句的应用,这里的 type()是用户的 fish函数决定的返回值。 3表示字符串
end
;用于in_def函数的结尾,表结束。
def tunnel_data
;fish定义函数 tunnel_data
default = 0.0
msg='tunnel center x-coordinate (x0) '
x0 = in_def
;
;交互式输入x0(隧道中心x的坐标)的坐标(输入时,会在命令窗口中产生提
;示,默认时为0)
;默认值由上面的default = 0.0决定,注意:命令x0 = in_def调用了 in_def函数。
;下面的命令和此处一样。
;
default = 0.0
msg='tunnel minimum y-coordinate (y1) '
y1 = in_def
;交互式输入y1(隧道y坐标最小值)的坐标(同理,默认时为0)
;
default = 0.0
msg='tunnel center z-coordinate (z0) '
z0 = in_def
;交互式输入 z0(隧道中心 z的坐标)的坐标(同理,默认时为0)
;
default = 1.0
msg='tunnel radius above tunnel center (rad) '
rad = in_def
;交互式输入 rad(隧道中心上部的半径)的坐标(同理,默认时为1)
;
default = .7
msg=' tunnel base half-width below tunnel center (base : fails if base >= rad) '
base = in_def
;交互式输入隧道中心以下的底部宽度,注意:其值不能大于隧道半径。
;
default = 0.5
msg='tunnel "height" from base to center (height) '
height = in_def
;交互式输入模型底部到隧道中心的的高度,默认为0.5
;
default = 2.0
msg='extent of inner primitive in x-direction (dx: extent = x0-dx to x0+dx) '
dx = in_def
;在x方向上对内部的原始坐标进行扩展,分别增加、减少dx
;
default = 2.0
msg='extent of inner primitive in z-direction (dz: extent = z0-dz to z0+dz) '
dz = in_def
;在z方向上对内部的原始坐标进行扩展,分别增加、减少dz
;
default = 5.0
msg='uniform-grid tunnel maximum in y-direction (y2) '
y2 = in_def
;统一网格坐标下,y坐标方向上的最大值
;
default = 15.0
msg='radial-grid tunnel maximum in y-direction (y3) '
y3 = in_def
;放射性网格在y方向上的最大值
;
dummy=out(' model inner width = '+string(rad+dx))
default = 4.0
msg='extent of entire tunnel in x-direction from tunnel center (xr: extent = xr-x0)`
xr = in_def + x0
;执行命令out(s)是为了在屏幕上显示其后面的信息。string(var)是转化变量
;为字符串。并在x方向上从隧道中心扩展整个坐标系
;
dummy=out(' model inner height = '+string(rad+dz))
default = 4.0
msg='extent of entire tunnel in z-direction above tunnel center (zt: extent = zt-z0) '
zt = in_def + z0
;和上面的命令一样,在 z方向上从隧道中心扩展整个坐标系
;
default = 4
msg='number of zones along top of tunnel primitive (nx) '
nx = in_def
;初始隧道顶部的单元数
;
default = 3
msg='number of zones in radial direction (nr) '
nr = in_def
;放射性网格在放射方向上的单元个数
;
default = 4
msg='number of zones in tunnel u-shaped wrap (nu) '
nu= in_def
;u型隧道单元的数量

default = 4
msg='number of zones along bottom rightside (nz1 : must be even number) '
nz1 = in_def
if (nz1/2)*2#nz1 then
    nz1=nz1+1
end_if
;隧道底部的单元数量,这里用 if语句控制 nz1的输入
;
if xr-x0<1e-3 then
    nx=0
else
    default = 5
    msg='number of zones on far right region (nxr) '
    nxr = in_def
end_if
;此if语句主要是控制隧道上部右侧的单元数量,和网格的合理性
;
if zt-z0<1e-3 then
    nzt=0
else
    default = 5
    msg='number of zones on far top region (nzt) '
    nzt = in_def
end_if
;此if语句主要是控制隧道上部的单元数量和网格的合理性
;
default = 8
msg='number of zones along y-axis in tunnel primitive (ny1) '
ny1 = in_def
;在y轴线上,最初隧道的单元数量
;
if y3-y2<1e-3 then
    ny2=0
else
    default = 4
    msg='number of zones along y-axis in far region (ny2) '
ny2 = in_def
;用来修正y轴线的单元数量
;
    default = 1.2
    msg='radial zoning ratio for ny2 zones (raty) '
    raty = in_def
end_if
;y轴线上单元的依次放大比率
;
default = 1.5
msg='radial zoning ratio for nr zones (ratr) '
ratr = in_def
;放射性单元的依次放大比率
;
;*** DERIVED PARAMETERS ***
;初始的参数
nz2 = 2*nx ; upper-right and top zones
;此式子为隧道上部右边和顶部的关系
ratr2=1/ratr
;Compute x-coordinates
;以下为计算x坐标
x1 = x0+rad
x2 = x0+dx
x3 = x0+base
; Compute arc center (x4,z0) to fit arc-points (x1,z0) and (x0+base,z0-height)
;下式是为了使中心坐标(x4,z0)he弧形处的坐标相适应
x4=x0+(rad*rad-base*base-height*height)/(2.0*(rad-base))
; Compute radius of lower arc
;计算半径的弧度
rad2=rad-(x4-x0)
x7=x0+sqrt(2.0)/2*rad
; compute inner points for radtunnel - adjust based on nx,nu zones
;计算放射性网格点—调整nx,nu单元数
x5=(x0*nu+x7*nx)/(nx+nu)
x5c=(nu*x0+nx*x7)/(nx+nu)
x5b=(nu*x0+2*nx*x7)/(2*nx+nu)
x6=(x0*nu+x2*nx)/(nx+nu)
;Compute z coordinates
;计算z坐标
z1 = z0+rad
z2 = z0+dz
z4 = z0-dz
z5 = z0-height
z6 = (z0+z4)/2
z8=z0+sqrt(2.0)/2*rad
z7=(z0*nu+z8*nx)/(nx+nu)
z7c=(nu*z0+nx*z8)/(nx+nu)
z7b=(nu*z0+2*nx*z8)/(2*nx+nu)
;slope constant of lower arc
;光滑下部的弧线
dxz=(x3-x1)/(z5-z0)
;slope constants of upper arc
;光滑上部的弧线
dxz2=(z8-z0)/(x7-x1)
dxz3=(x7-x0)/(z8-z1)
end
;函数tunnel_data结束,这一部分主要是参数的输入

def make1
;fish语言定义的 make1函数,此函数是为了建立隧道顶部和上边右侧外边的网格
if y1#y2 then
command
; top and upper-right outside
;下面的命令是在y1 ≠ y2时,建立隧道的放射性网格
    gen zone radcyl size nx ny1 nz2 nr ratio 1 1 1 ratr group 'g1' &
    p0x0 y1 z0 &
    p1x2 y1 z0 &
    p2x0 y2 z0 &
    p3x0 y1 z2 &
    p4x2 y2 z0 &
    p5x0 y2 z2 &
    p6x2 y1 z2 &
    p7x2 y2 z2 &
    p8x1 y1 z0 &
    p9x0 y1 z1 &
    p10 x1 y2 z0 &
    p11 x0 y2 z1
end_command
end_if
;下面的命令是在 y2 ≠y3 时,建立隧道的放射性网格
if y2#y3 then
command
    gen zone radcyl size nx ny2 nz2 nr ratio 1 raty 1 ratr group 'g1' &
    p0x0 y2 z0 &
    p1x2 y2 z0 &
    p2x0 y3 z0 &
    p3x0 y2 z2 &
    p4x2 y3 z0 &
    p5x0 y3 z2 &
    p6x2 y2 z2 &
    p7x2 y3 z2 &
    p8x1 y2 z0 &
    p9x0 y2 z1 &
    p10 x1 y3 z0 &
    p11 x0 y3 z1
end_command
end_if
end
;此函数结束

def make2
;fish语言定义的 make2函数,此函数在是为了建立隧道下边右侧外边的网格
;其它与函数 make1一样
if y1#y2 then
command
; lower-right outside
    gen zone radcyl size nx ny1 nz1 nr ratio 1 1 1 ratr group 'g2' &
      p0x4 y1 z0 &
      p1x2 y1 z4 &
      p2x4 y2 z0 &
      p3x2 y1 z0 &
      p4x2 y2 z4 &
      p5x2 y2 z0 &
      p6x2 y1 z6 &
      p7x2 y2 z6 &
      p8x3 y1 z5 &
      p9x1 y1 z0 &
      p10 x3 y2 z5 &
      p11 x1 y2 z0
end_command
end_if
if y2#y3 then
command
; lower-right outside
    gen zone radcyl size nx ny2 nz1 nr ratio 1 raty 1 ratr group 'g2' &
      p0x4 y2 z0 &
      p1x2 y2 z4 &
      p2x4 y3 z0 &
      p3x2 y2 z0 &
      p4x2 y3 z4 &
      p5x2 y3 z0 &
      p6x2 y2 z6 &
      p7x2 y3 z6 &
      p8x3 y2 z5 &
      p9x1 y2 z0 &
      p10 x3 y3 z5 &
      p11 x1 y3 z0
end_command
end_if
end

def make3
;fish语言定义的 make3函数,此函数在是为了建立隧道底部外边的网格
;其它与函数 make1一样
if y1#y2 then
command
; bottom outside
    gen zone brick size nx ny1 nr ratio 1 1 ratr2 group 'g3' &
      p0 x0 y1 z4 &
      p1 x6 y1 z4 &
      p2 x0 y2 z4 &
      p3 x0 y1 z5 &
      p4 x6 y2 z4 &
      p5 x0 y2 z5 &
      p6 x5 y1 z5 &
      p7 x5 y2 z5
end_command
end_if
if y2#y3 then
command
; bottom outside
    gen zone brick size nx ny2 nr ratio 1 raty ratr2 group 'g3' &
      p0 x0 y2 z4 &
      p1 x6 y2 z4 &
      p2 x0 y3 z4 &
      p3 x0 y2 z5 &
      p4 x6 y3 z4 &
      p5 x0 y3 z5 &
      p6 x5 y2 z5 &
      p7 x5 y3 z5
end_command
end_if
end

def make4
;fish语言定义的 make4函数,此函数在是为了建立隧道底部右侧外边的网格
;其它与函数 make1一样
if y1#y2 then
command
; bottom-right outside
    gen zone brick size nu ny1 nr ratio 1 1 ratr2 group 'g4' &
      p0 x6 y1 z4 &
      p1 x2 y1 z4 &
      p2 x6 y2 z4 &
      p3 x5 y1 z5 &
      p4 x2 y2 z4 &
      p5 x5 y2 z5 &
      p6 x3 y1 z5 &
      p7 x3 y2 z5
end_command
end_if
if y2#y3 then
command
; bottom-right outside
    gen zone brick size nu ny2 nr ratio 1 raty ratr2 group 'g4' &
      p0 x6 y2 z4 &
      p1 x2 y2 z4 &
      p2 x6 y3 z4 &
      p3 x5 y2 z5 &
      p4 x2 y3 z4 &
      p5 x5 y3 z5 &
      p6 x3 y2 z5 &
      p7 x3 y3 z5
end_command
end_if
end
def make5
;fish语言定义的 make5函数,此函数在是为了建立隧道顶部内侧的网格
;其它与函数 make1一样
if y1#y2 then
command
; top inside
    gen zone radtunnel size nx ny1 nx nu group 'g5' &
    p0x0 y1 z0 &
    p1x7 y1 z0 &
    p2x0 y2 x0 &
    p3x0 y1 z8 &
    p4x7 y2 z0 &
    p5x0 y2 z8 &
    p6x7 y1 z8 &
    p7x7 y2 z8 &
    p8x5c y1 z0 &
    p9x0 y1 z7c &
    p10 x5c y2 z0 &
    p11 x0 y2 z7c &
    p12 x5b y1 z7b &
    p13 x5b y2 z7b
    gen zone brick size nx ny1 nx group 'g5' &
    p0 x0 y1 z0 &
    p1 x5c y1 z0 &
    p2 x0 y2 z0 &
    p3 x0 y1 z7c &
    p4 x5c y2 z0 &
    p5 x0 y2 z7c &
    p6 x5b y1 z7b &
    p7 x5b y2 z7b
end_command
end_if
if y2#y3 then
command
; top inside
    gen zone radtunnel size nx ny2 nx nu ratio 1 raty 1 group 'g5' &
    p0x0 y2 z0 &
    p1x7 y2 z0 &
    p2x0 y3 x0 &
    p3x0 y2 z8 &
    p4x7 y3 z0 &
    p5x0 y3 z8 &
    p6x7 y2 z8 &
    p7x7 y3 z8 &
    p8x5c y2 z0 &
    p9x0 y2 z7c &
    p10 x5c y3 z0 &
    p11 x0 y3 z7c &
    p12 x5b y2 z7b &
    p13 x5b y3 z7b
    gen zone brick size nx ny2 nx ratio 1 raty 1 group 'g5' &
    p0 x0 y2 z0 &
    p1 x5c y2 z0 &
    p2 x0 y3 z0 &
    p3 x0 y2 z7c &
    p4 x5c y3 z0 &
    p5 x0 y3 z7c &
    p6 x5b y2 z7b &
    p7 x5b y3 z7b
end_command
end_if
end

def make6
;fish语言定义的 make6函数,此函数在是为了建立隧道底部内侧的网格
;其它与函数 make1一样
if y1#y2 then
command
; bottom inside
    gen zone brick size nx ny1 nz1 group 'g6' &
    p0 x0 y1 z5 &
    p1 x5 y1 z5 &
    p2 x0 y2 z5 &
    p3 x0 y1 z0 &
    p4 x5 y2 z5 &
    p5 x0 y2 z0 &
    p6 x5c y1 z0 &
    p7 x5c y2 z0
; bottom-right inside
    gen zone brick size nu ny1 nz1 ratio 1 1 1 group 'g6' &
    p0 x5 y1 z5 &
    p1 x3 y1 z5 &
    p2 x5 y2 z5 &
    p3 x5c y1 z0 &
    p4 x3 y2 z5 &
    p5 x5c y2 z0 &
    p6 x7 y1 z0 &
    p7 x7 y2 z0
end_command
end_if
if y2#y3 then
command
; bottom inside
    gen zone brick size nx ny2 nz1 ratio 1 raty 1 group 'g6' &
    p0 x0 y2 z5 &
    p1 x5 y2 z5 &
    p2 x0 y3 z5 &
    p3 x0 y2 z0 &
    p4 x5 y3 z5 &
    p5 x0 y3 z0 &
    p6 x5c y2 z0 &
    p7 x5c y3 z0
; bottom-right inside
    gen zone brick size nu ny2 nz1 ratio 1 raty 1 group 'g6' &
    p0 x5 y2 z5 &
    p1 x3 y2 z5 &
    p2 x5 y3 z5 &
    p3 x5c y2 z0 &
    p4 x3 y3 z5 &
    p5 x5c y3 z0 &
    p6 x7 y2 z0 &
    p7 x7 y3 z0
end_command
end_if
end

define make7
;fish语言定义的 make7函数,此函数是为了建立隧道核心部分以外的块体的网格
if nxr>0 then
    command
;primitive right of inner primitive - near - lower
      gen zone brick size nxr ny1 nz1 ratio 1.0 1.0 1.0 group 'g7' &
      p0 x2 y1 z4 &
      p1 xr y1 z4 &
      p2 x2 y2 z4 &
      p3 x2 y1 z0
;primitive right of inner primitive - far - lower
      gen zone brick size nxr ny2 nz1 ratio 1.0 raty 1.0 group 'g7' &
      p0 x2 y2 z4 &
      p1 xr y2 z4 &
      p2 x2 y3 z4 &
      p3 x2 y2 z0
;primitive right of inner primitive - near - upper
      gen zone brick size nxr ny1 nx ratio 1.0 1.0 1.0 group 'g7' &
      p0 x2 y1 z0 &
      p1 xr y1 z0 &
      p2 x2 y2 z0 &
      p3 x2 y1 z2
;primitive right of inner primitive - far - upper
      gen zone brick size nxr ny2 nx ratio 1.0 raty 1.0 group 'g7' &
      p0 x2 y2 z0 &
      p1 xr y2 z0 &
      p2 x2 y3 z0 &
      p3 x2 y2 z2
    end_command
end_if
if nzt>0 then
    command
    ;primitive above inner primitive - near
      gen zone brick size nx ny1 nzt p0 x0,y1,z2 p1 x2,y1,z2 p2 x0,y2,z2 p3 x0 y1 zt &
      ratio 1.0 1.0 1.0 group g7
    ;primitive above inner primitive - far
      gen zone brick size nx ny2 nzt p0 x0,y2,z2 p1 x2,y2,z2 p2 x0,y3,z2 p3 x0 y2 zt &
      ratio 1.0 raty 1.0 group g7
    ;primitive above right lower primitive - near
    end_command
    if nxr>0 then
      command
      gen zone brick size nxr ny1 nzt p0 x2 y1 z2 p1 xr y1 z2 p2 x2 y2 z2 p3 x2 y1 zt &
          ratio 1.0 1.0 1.0 group g7
    ;primitive above right lower primitive - far
      gen zone brick size nxr ny2 nzt p0 x2 y2 z2 p1 xr y2 z2 p2 x2 y3 z2 p3 x2 y2 zt &
          ratio 1.0 raty 1.0 group g7
      end_command
    end_if
end_if
end

def map1a ; below tunnel center (Correct need for initial points to match)
;此函数是为了使初始化的网格点相互匹配
kx=(x3-x0)/(x7-x0)
;定义一个常变量
p_gp=gp_head
;把网格点的头指针的地址,赋予变量 p_gp
loop while p_gp#null
;loop为循环命令,其条件是 _0 pgp ≠
; if p_gp in group 'g6', apply delta-x transformation from line to circle
    if gp_group(p_gp,1)='g6' then
      xx=gp_xpos(p_gp)-x0
;这里的gp_xpos(p_gp)是取这个地址中的网格点的x坐标
      zz=z0-gp_zpos(p_gp)
;同理,这里的gp_zpos(p_gp)是去这个地址中的网格点的 z坐标
      mu=zz/height
      x37=x3*mu+x7*(1-mu)
      kk=x3/x37
      gp_xpos(p_gp)=x0+xx*kk
    end_if
p_gp=gp_next(p_gp)
;这里的gp_next(p_gp)是取下一个网格点的地址
end_loop
end

def map1 ; below tunnel center
tanmax=height/(base-(x4-x0))
maxang=atan(tanmax)
;这里,atan(tanmax)为tanmax的反正切值
kk=maxang/tanmax
cosmaxang=cos(maxang)
;这里,cos(maxang)为maxang余弦的值
p_gp=gp_head
;同理,把网格点的头指针的地址,赋予变量p_gp
loop while p_gp#null
;loop为循环命令,其条件是 _0 pgp ≠
; if p_gp in group 'g6', apply delta-r transformation from line to circle
    if gp_group(p_gp,1)='g6' then
      xx=gp_xpos(p_gp)-x4
      if xx>0 then
      zz=z0-gp_zpos(p_gp)
;这里的gp_zpos(p_gp)是取这个地址中的网格点的 z坐标
      zx=zz/xx
      if zx<tanmax then
;这里的tan是正切函数
          ang2=kk*zx ; remap from uniform lengths to uniform angles
          rr=xx/cosmaxang ; remap radius from square to sector
          gp_xpos(p_gp)=x4+rr*cos(ang2)
          gp_zpos(p_gp)=z0-rr*sin(ang2)
;这两句话的意思是把后面数值地址放在gp_xpos(p_gp)和gp_zpos(p_gp)中      
end_if
      end_if
end_if
p_gp=gp_next(p_gp)
end_loop
end

def map2 ; above tunnel center
;此函数中的意义可以参看上面的例子,这里就不再赘述了
angmax=pi/4
sqrt2=sqrt(2)
cosangmax=cos(angmax)
p_gp=gp_head
loop while p_gp#null
; if p_gp in group 'g5', apply delta-r transformation from line to circle
    if gp_group(p_gp,1)='g5' then
      xx=gp_xpos(p_gp)-x0
      zz=gp_zpos(p_gp)-z0
      if xx>zz then
      ang2=angmax*zz/xx ; remap direction from uniform lengths to uniform angles
      rr=xx*sqrt2
      gp_xpos(p_gp)=x0+rr*cos(ang2)
      gp_zpos(p_gp)=z0+rr*sin(ang2)
      else
      if zz>xx then
          ang2=angmax*xx/zz ; remap direction from uniform lengths to uniform angles
          rr=zz*sqrt2
          gp_xpos(p_gp)=x0+rr*sin(ang2)
          gp_zpos(p_gp)=z0+rr*cos(ang2)
      end_if
      end_if
    end_if
p_gp=gp_next(p_gp)
end_loop
end

def makeall
tunnel_data
make1 ; outside top
make2 ; outside lower-right
make3 ; outside bottom
make4 ; outside bottom-right
make5 ; inside bottom (call make5 before make6 so common points mapped with map2)
make6 ; inside top
make7 ; far top and right
; remap inner tunnel walls into outer arcs
map1a ; inside bottom (adjust right side to vertical)
map1 ; inside bottom (adjust right side to sector)
map2 ; inside top
end

makeall
;此时,执行上面的所有命令

gen merge 1e-4
; gen zone reflect orig x0 y1 z0 norm 0 0 1
;

plo crea qqq
plo add block group
;plo set perspective off ;easier to see w/o perspective
plo sho
;显示图像,这里用户可以有一些下拉菜单的命令,找出自己想看的内容

pause

;暂停

group 'top heading' range group g5
group invert      range group g6
group rock range group 'top heading' not group invert not
;这里的group命令是建立一些群,方便操作。

pause
;暂停

恐怖猫猫 发表于 2011-7-1 12:49:50

估计是你少打引号了吧?这么长的代码都放上来还不如自己检查一下呢,呵呵。

yueleiz456 发表于 2011-7-1 21:07:20

我就是不知道具体哪个地方出错了哦。。。。
谢谢指引,我先检查看看了。。、
页: [1]
查看完整版本: Flac3D一个例子,fish语言