我在OpenSees程序中使用tcl(参见this问题)。 OpenSees在TCL中提供的一个命令是block2D
,其语法如下:
block2d $nx $ny $e1 $n1 element elementArgs {
1 $x1 $y1 <$z1>
2 $x2 $y2 <$z2>
3 $x3 $y3 <$z3>
4 $x4 $y4 <$z4>
}
在我的具体案例中,我正在做以下事情:
#geometric parameters
set nx 4
set ny 2
set elwidth 1.0
set elheight 1.0
set blockwidth [expr $nx*$elwidth]
set blockheight [expr $ny*$elheight]
block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" {
1 0.0 0.0
2 $blockwidth 0.0
3 4.0 2.0
4 0.0 2.0
}
block2D
命令中使用的变量在开头设置。不幸的是,当我运行此脚本时,我收到以下错误:
WARNING block2D numX? numY? startNode? startEle? eleType? eleArgs?: invalid node coordinate for node: 1
expected floating-point number but got "$blockwidth"
我不明白为什么会这样。其他OpenSees命令允许传入变量。为什么这个会有所不同?
我已经在expr
变量上尝试了eval
和blockwidth
命令的不同变体和嵌套......一切都无济于事......
答案 0 :(得分:1)
问题是你在这个命令中要求一个未取代的文字:
block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" {
1 0.0 0.0
2 $blockwidth 0.0
3 4.0 2.0
4 0.0 2.0
}
{
大括号}
实际上的意思是什么。除了你想要替换它之外什么都没关系。有几种明智的方法可以做到这一点:
"
双引号"
字block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" "
1 0.0 0.0
2 $blockwidth 0.0
3 4.0 2.0
4 0.0 2.0
"
subst
命令block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" [subst {
1 0.0 0.0
2 $blockwidth 0.0
3 4.0 2.0
4 0.0 2.0
}]
list
构建列表block2D $nx $ny 1 1 quad "1 PlaneStrain2D 1" [list \
1 0.0 0.0 \
2 $blockwidth 0.0 \
3 4.0 2.0 \
4 0.0 2.0 \
]
第三个选项在性能方面可能是最好的,但第二个选项可能更具可读性(尽管速度最慢),特别是如果你不喜欢像第一个选项那样使用多行“字符串”。