简介:围绕 ANSYS 中的预应力混凝土分析,这份文档面向结构工程学习者与需要进行有限元建模的工程师,系统梳理等效荷载法与实体力筋法的适用条件、优缺点和建模取舍。文中对等效荷载法建模简便、整体效应易求但细部应力与张拉过程难以模拟的局限,以及实体力筋法可考虑力筋分布和应力损失、但建模工作量更大的特点作了对照,并涉及降温法、初应变法、体分割法、独立建模耦合法及预应力简支梁弹性分析的 APDL 示例,便于读者理解复杂布筋下的建模流程与误差来源。资源包共 1 个 doc 文件,约 59KB,篇幅紧凑,适合作为专题笔记查阅。已有 350 人学习,可作为预应力分析入门梳理与方案比对的参考资料。
1. 预应力混凝土在 ANSYS 里两种建模路线,我为什么把大部分精力压在实体力筋法上
刚接手一个预应力简支梁的弹性校核,第一版按“等效荷载法”建完,跨中挠度和预应力产生的反拱量看上去挺漂亮,交给导师一看,对方只问了一句:力筋曲线段附近混凝土的横向应力分布呢?我调出来后截面应力几乎对称,跟试验趋势对不上。这件事让我重新翻了手头这份预应力分析笔记,从等效荷载法的适用边界,到实体力筋法里体分割、节点耦合、约束方程三条路怎么选,再到降温法与初应变法各自的实常数写法,把一套能复现的流程重新理了一遍。预应力这个关键词在桥、在储罐、在大跨屋盖上出现频率极高,但真正落到有限元里,方法选错,后面网格再密、参数再调,结果也是错的。这份笔记的价值不在于它讲了多少命令,而在于它把“什么时候该放弃等效荷载”这件事讲明白了。
2. 等效荷载法:整体指标够用,但力筋曲线段的“水平分量”被悄悄吞了
2.1 把力筋换成荷载的等价逻辑,以及它的三个硬边界
等效荷载法的核心动作只有一步:不建力筋,把预应力对混凝土的作用换算成一组外荷载施加到结构上。对一根直线力筋,锚固端的偏心力可以拆成轴力加端弯矩,这个换算没有信息损失,整体分析里用来评估反拱、跨中轴力、支座次反力都够用。问题出在曲线段——一根带圆弧的力筋,对混凝土的作用实际上是沿弧长连续分布的径向压力加上切向的摩阻效应,等效荷载法只能把这个连续分布近似成端部集中力,中间段的作用方向被平均化,水平分量则直接被吃掉。
我在笔记里把它的缺点归纳成可操作的判断条件,而不是泛泛谈精度:
- 力筋线形如果是“短直线+曲线+长直线+曲线+短直线”这种典型后张布筋,等效荷载法要分段计算等效荷载,段数一多,荷载叠加的位置和方向很容易写错,而且写错了在结果里看不出来;
- 想拿到结构细部(比如锚下局部承压区、曲线段混凝土横向拉应力),等效荷载法必须把荷载施加在力筋真实位置,那就等于放弃它最大的建模便利,不如直接上实体力筋;
- 外荷载工况下力筋的应力增量,等效荷载法算不出来——它根本没建力筋,没有可读取的力筋单元应力。
注意:等效荷载法用 beam 或 shell 系列单元做整体分析是常见做法,用 solid 系列反而少见,因为 solid 模型本身的网格量已经很大,再用等效荷载省下来的建模时间有限,精度损失却不小。
2.2 一张选型对照表,把“什么时候放弃”写死
我把两种方法的判断条件整理成一张表,每次新建模型前先过一遍,避免做到一半发现路线错了再返工:
| 分析目标 | 等效荷载法 | 实体力筋法 | 说明 |
|---|---|---|---|
| 整体反拱、跨中轴力 | 适用 | 适用 | 等效荷载法效率更高 |
| 曲线段混凝土横向应力 | 不适用 | 适用 | 等效荷载无法表达径向分布 |
| 外荷载下力筋应力增量 | 无法计算 | 可计算 | 必须存在力筋单元 |
| 张拉过程 / 分批张拉 | 不可模拟 | 可模拟 | 需配合单元生死 |
| 预应力损失分布 | 不可模拟 | 可近似模拟 | 降温法可分位置设定 |
| 建模工作量 | 低 | 中到高 | 力筋复杂时差距明显 |
表格右边这一列是我实际踩出来的结论:如果分析目标里出现“局部”“曲线段”“损失分布”“张拉过程”中的任何一个词,等效荷载法就直接出局,不必再纠结。反过来,如果只是做方案比选阶段的反拱估算,用等效荷载法半小时能出结果,没必要上实体力筋。
3. 实体力筋法的三条建模路线:体分割、节点耦合、约束方程,各自的门槛在哪
3.1 体分割法:力筋位置最准,但布尔运算随时可能翻车
体分割法的思路是把混凝土实体按力筋位置切开,让力筋线成为实体上真实存在的一条边,然后对力筋线单独划分 link 单元。力筋位置和混凝土网格严格对齐,不存在节点走动的误差,这是它最大的优势。
操作上,常规做法是用工作平面配合沿力筋线拖拉出来的面去切实体,切完在体上留下一条线,把这条线定义为力筋线,继续切下一根。问题在于力筋一多、线形一复杂,布尔运算失败的几率直线上升,尤其是横向和竖向力筋靠得很近的时候,切出来的小实体碎得没法划分网格。我在一个腹板纵向力筋的模型上试过,切到第七刀就开始报错,最后只能退回节点耦合法。
这段路线适合力筋数量少、线形规整、对位置精度要求高的局部模型,不适合整桥或整层的全模型。
3.2 节点耦合法:APDL 写对了很好用,写错了就是灾难
节点耦合法的逻辑是实体和力筋各建各的几何模型、各自划分单元,然后用耦合方程把力筋节点和最近的混凝土节点在三个平动自由度上绑在一起。它的优点是建模阶段完全解耦,力筋再复杂也不影响混凝土的网格划分。
笔记里给了一段简支梁的示例代码,我把它拆开说明关键段。先看材料与实常数的定义:
/prep7 eg=2e5 ! 力筋弹性模量 ag=140 ! 力筋截面面积 eh=4e4 ! 混凝土弹性模量 r0=9345 ! 圆弧力筋半径 yyl=200000 ! 张拉控制应力 et,1,link8 ! 力筋用杆单元 et,2,solid95 ! 混凝土用实体单元 ! 实常数1:面积 + 初应变,初应变由张拉应力换算 r,1,ag,yyl/eg mp,ex,1,eg mp,prxy,1,0.3 mp,ex,2,eh mp,prxy,2,0.2这里r,1,ag,yyl/eg是初应变法的实常数写法,第二个实常数位置填的是初应变值,不是应力值。把张拉应力直接填进去是最常见的翻车点,算出来的预应力会大出好几个量级。正确做法是先除以弹性模量换算成应变,如果还要考虑混凝土弹性压缩引起的损失,得在此基础上迭代折减。
再看圆弧力筋的建立,笔记用larc命令由三点定义圆弧:
ksel,all *get,kp0,kp,0,num,max ! 取当前最大关键点号,作为新点起点 lsel,none k,kp0+1,50,160 ! 圆弧起点 k,kp0+2,50,160,3000 ! 圆弧终点 k,kp0+3,50,800,1500 ! 曲率控制点,不一定是圆心 larc,kp0+1,kp0+2,kp0+3,r0larc的第三个关键点是曲率中心的参考点,几何上不要求是精确圆心,只要保证三点不共线。这里容易出错的是*get,kp0,kp,0,num,max这一句,它取的是全部关键点里的最大编号,如果模型里已经存在编号更大的点,新点的编号会跳号,后续lsel按线号选择时容易选错。稳妥的做法是每次建力筋前先numcmp,all压缩编号,或者直接用固定的编号段并记录清楚。
网格划分和耦合是这段代码里最需要盯紧的部分:
lsel,s,,,line1 latt,1,1,1 lesize,all,,,50 lmesh,all ! 力筋线单独划分,50段 ! ... 混凝土实体网格划分略 ... ! 耦合:力筋节点与最近混凝土节点绑定三个平动自由度 lsel,s,,,line1 nsll,s,1 cm,cmljnod,node *get,max1,node,0,count *dim,ojd,,max1 *get,nod1,node,0,num,min ojd(1)=nod1 *do,i,2,max1 ojd(i)=ndnext(ojd(i-1)) ! 顺序取出力筋节点号 *enddo allsel,all nsel,all cmsel,u,cmljnod ! 排除力筋节点,只留混凝土节点 *do,i,1,max1 nod1=ojd(i) j=nnear(nod1) ! 搜索距离力筋节点最近的混凝土节点 jd(i)=j *enddo nsel,all ji=1 *do,i,1,max1 cp,ji,ux,ojd(i),jd(i) cp,ji+1,uy,ojd(i),jd(i) cp,ji+2,uz,ojd(i),jd(i) ji=ji+3 *enddonnear是按当前选择集搜索最近节点,所以执行cmsel,u,cmljnod把力筋节点排除这一步不能省,否则可能搜到自己,耦合方程就变成恒等式。另一个坑是cp命令的编号——每对节点占用三个方程号,ji每次加 3,如果中途手动插入过别的耦合方程,编号会冲突报错,稳妥做法是让cp自动编号或者用cpnext查询最大编号后再起。
节点耦合法的精度取决于混凝土网格密度。力筋节点和最近混凝土节点的距离如果超过半个单元尺寸,力筋的实际位置就被“拉”到了混凝土节点上,曲线段的曲率会被抹平。我的经验是曲线段附近的混凝土单元尺寸控制在力筋直径的 2 到 3 倍以内,直线段可以放宽。
3.3 约束方程法:用 ceintf 替代手写耦合,网格密度的要求降下来了
节点耦合法是一个力筋节点对一个混凝土节点,约束方程法则是用ceintf命令让一个力筋节点和周围若干个混凝土单元节点同时建立约束关系,相当于把力筋节点“嵌”进混凝土单元的面上。
! 分别建好混凝土实体和力筋线,各自划分单元后 esel,s,type,,1 ! 选中力筋单元(link8) nsle,s ! 选中力筋节点 esel,inve ! 反选,选中混凝土单元 nsle,s ! 选中混凝土节点 ceintf ! 在两组节点间自动生成约束方程ceintf内部的容差参数控制搜索范围,默认值对常规网格够用,但如果力筋贴着混凝土表面走,容差过大可能把对面表面的节点也拉进来。这条路线对混凝土网格密度要求比节点耦合法低,因为一个力筋节点可以同时约束到多个混凝土节点上,位置偏差被分摊掉了。代价是约束方程数量增多,求解规模会上去一些,对大模型需要考虑这个开销。
三条路线的选择我按这个顺序判断:力筋少且线形简单,体分割;力筋多且线形复杂、手头 APDL 熟,节点耦合;力筋多、又不想把混凝土网格划得太密,约束方程。实际项目里混用也常见,比如纵向曲线力筋用约束方程,竖向短直筋用等效荷载,这在笔记里也有提及。
4. 预应力怎么“加”进去:降温法与初应变法的实常数陷阱
4.1 降温法的本质是把预应力换算成温度收缩,线胀系数必须单独指定
降温法的操作是给力筋单元单独指定一个线胀系数,然后施加负温度,让力筋产生收缩趋势,这个收缩被混凝土约束住,就形成了预应力。关键点是:只给力筋指定的线胀系数,混凝土的线胀系数保持为零或与实际无关,否则整个模型都会热胀冷缩。
mp,alpx,1,1.2e-5 ! 只给力筋材料指定线胀系数 ! 求解段施加温度 bf,all,temp,-200 ! 对力筋单元施加负温度降温法的好处是可以对不同位置的力筋施加不同的温度值,从而近似模拟预应力沿程的损失分布——比如靠近锚固端的力筋温度设得高一些,跨中设得低一些。这比初应变法每个单元写不同实常数的做法要清爽。它的短板在于,降温过程中力筋的收缩会被混凝土的弹性压缩抵消一部分,一次降温算出来的有效预应力往往低于目标值,需要迭代调整温度。后张法分批张拉时,还要配合单元生死,先杀的力筋在后续张拉中会继续产生压缩损失,这个动态过程用一次降温是模拟不出来的。
4.2 初应变法写起来最直接,但每个单元一个实常数意味着不能考虑损失
初应变法就是在力筋单元的实常数里直接填一个初始应变值,力筋一进入求解就带着这个应变参与工作。写法最简单,也最容易被误用。前面代码里r,1,ag,yyl/eg就是这种写法,它对应的是“整根力筋应力处处相等”的假设,等价于体外索或者忽略摩阻的理想情况。
一旦要考虑沿程损失,每个力筋单元的初应变都不一样,就得为每个单元定义独立的实常数。50 段的力筋就是 50 个实常数,手工写不现实,得用循环配合数组:
*dim,eps0,,50 *do,i,1,50 eps0(i)=yyl*(1-0.001*i)/eg ! 示例:沿程线性折减 *enddo *do,i,1,50 r,i,ag,eps0(i) *enddo这里的折减系数只是演示格式,实际值必须来自规范公式或试验。我见过有人直接填一个统一折减 10% 的系数交差,跨中看着没问题,锚固端差出一大截,就是因为损失沿程分布不是线性的。
提示:初应变法还有一个隐蔽问题——如果力筋节点和混凝土节点完全耦合(三个方向都绑死),力筋的初始应变在第一步就被混凝土“顶回去”了,读出来的力筋应力远低于设定值。这时候要么用降温法,要么在耦合时放松力筋纵向自由度,让力筋相对混凝土有滑移空间。
4.3 “初始应力”命令不是万金油
求解器里有一个直接施加初始应力的命令,看起来最省事,但它只对部分单元类型有效,link8 不在其列,能用的是 link180、beam188 这类较新的单元。如果你的模型用的是老单元,这条路走不通。即便单元支持,这个命令施加的初始应力在后续荷载步里是否保持,取决于大变形开关和材料非线性设置,需要单独验证,不能想当然。
5. 避坑与排查:五个我在预应力建模里真实遇到的问题
第一个,力筋应力读出为零。现象是求解完成后plls看力筋应力,整根都是零或者接近零。原因通常是实常数里初应变填成了应力值,或者单位不统一(模量用 MPa、应力用 Pa)。排查时先*get读一个力筋单元的实常数,跟手算的应变值对一下,再看材料模量的单位是否和应力一致。
第二个,反拱方向反了。现象是预应力施加后梁向上拱,结果却向下弯。原因多为温度符号写反,或者等效荷载的偏心弯矩方向搞错。降温法里负温度对应收缩,如果你的力筋在截面下部,收缩应该让梁上拱,符号错一位结果就反过来。解决方法是单独跑一个只有预应力的荷载步,看位移云图的方向是否符合预期。
第三个,曲线段混凝土应力出现异常尖峰。现象是曲线力筋附近的混凝土单元应力比其他区域高一个量级。原因一般是节点耦合时力筋节点被拉到了较远的混凝土节点上,局部产生了附加约束。检查方法是把力筋节点和耦合到的混凝土节点的距离导出来,超过一个单元尺寸的对重新划分网格。
第四个,耦合方程数量爆炸导致求解失败。现象是节点耦合法建完模型,方程数比预期多出几倍,求解直接报内存不足。原因是cp编号冲突或者重复耦合,同一个节点对生成了多组方程。用cpnext查一下最大方程号,和各节点自由度总数核对,数量对不上就是有重复。
第五个,布尔运算切体失败。现象是体分割法切到一半提示布尔运算错误,体变成碎片。原因是力筋线之间的间距小于网格容差,或者切面与已有面重合。处理办法是调整切分顺序,先切大间距的力筋,再切密集区,实在不行换约束方程法,不必在一棵树上吊死。
6. 一个能判生死的验证动作:把力筋节点位移趋势拉出来做趋势比对
模型建完、预应力施加完,别急着看应力云图。我后来养成一个习惯:在求解之前,先单独跑一个只有预应力的荷载步,把力筋上所有节点的位移沿路径取出来,和理论反拱曲线做趋势比对。这一步花不了十分钟,但能拦下大部分建模层面的硬伤。
具体做法是沿力筋路径定义一条路径,用pdef把位移映射上去,再plpath画出来。如果力筋节点的位移趋势和手算的梁反拱曲线在跨中附近吻合、在锚固端收敛到零,说明耦合关系和预应力施加方向都没问题;如果跨中位移方向反了,或者锚固端出现不收敛的跳动,那就回去查温度符号和耦合自由度。这个动作之所以有效,是因为它不依赖任何复杂的后处理,位移是最原始的结果,建模错了位移一定先出问题。
还有一个我常用的补充验证:在同一模型上把等效荷载法和实体力筋法各跑一遍,只对比跨中挠度和支座反力这两个整体指标。两者差在 5% 以内,说明实体力筋模型的整体刚度没跑偏,可以继续做局部应力分析;差得远,问题多半出在力筋的初应变换算或者耦合约束上,而不是网格密度。这个交叉校验在笔记的原始材料里没有明说,但两种方法的对比思路本身就在提示这件事——等效荷载法最大的价值不是拿来出最终结果,而是拿来给实体力筋法当标尺。
从那以后我每次建预应力模型,求解前都强制走一遍“单预应力荷载步+力筋位移趋势比对”,不管模型多简单都不跳过。有一次赶进度跳过了,结果交出去三天后才发现锚固端耦合漏了一排节点,返工重算的时间够我把这个流程走十遍。希望这个习惯能帮到你。
本文还有配套的精品资源,点击获取