资讯详情

资讯详情

修正剑桥模型显式应力积分与Python实现

简介camclayexp 是一套面向计算力学与岩土工程研究者的剑桥模型显式积分实现聚焦粘土在复杂受力条件下的应力-应变数值模拟。资源将剑桥本构模型与显式算法结合通过逐步积分处理动态、非线性问题适用于岩土数值分析、本构模型验证及显式算法学习实践。压缩包共19个文件以12个m脚本为主包含主程序与屈服面、硬化律、回映校正等关键函数辅以2个mat数据文件、4个bmp结果图和1个db文件整体仅58KB结构紧凑便于快速查阅和二次开发。已有408人学习下载。借助包内代码可系统理解显式积分思路与剑桥模型编程实现掌握从初始条件设定、步长控制到结果后处理的完整流程为地质工程、土木工程中的土壤力学行为预测提供高效工具。1. camclayexp剑桥模型显式应力积分到底在积分什么拿到应变增量还给应力增量这是每个有限元本构子程序都要回答的问题。camclayexp 把范围限定得很清楚本构模型用剑桥模型算法用显式算法落脚点在应力数值积分。典型场景是动力显式有限元增量步短、材料点不迭代只能外推一步。显式积分不需要一致切线刚度实现简单代价是误差累积、屈服面漂移要靠子步划分和修正策略兜底。下文先列修正剑桥模型的必需方程再给可直接运行的 Python 显式积分实现最后用两个试验把结果钉在临界状态线上。适合正写 UMAT/VUMAT、做参数反演或想把教科书公式变成可复现代码的工程师。2. 剑桥模型本构方程与显式积分算法的最小框架本构积分的输入输出很简单输入当前应力、一组历史状态量和应变增量输出更新后的应力。剑桥模型在这个框架里要多管两个状态量——孔隙比 e 和先期固结压力 pc。pc 是唯一的硬化内变量e 参与弹性模量和硬化律的计算漏掉任何一个后面的应力路径都会飘。2.1 修正剑桥模型的三个基本方程屈服面、流动法则、硬化律修正剑桥模型在 p-q 平面定义屈服面f q²/M² p(p - pc) 0p 是平均有效应力q 是偏应力M 是临界状态线斜率pc 是先期固结压力。这是一个以 p 轴为对称轴的椭圆顶点在 p pc临界状态点满足 q M p。流动法则取关联式塑性应变增量方向由屈服面法向直接给出dε_v^p Λ·∂f/∂pdε_s^p Λ·∂f/∂q没有剪胀角没有单独的塑性势函数法向就是加载方向。这是剑桥模型区别于摩尔-库仑系列的最大特点也是数值实现最顺手的地方。硬化律是体积硬化只有塑性体积应变能移动 pcdpc/pc v/(λ-κ)·dε_v^pv 1e 是比容λ 是正常压缩线在 e-ln p 平面的斜率κ 是回弹线斜率。材料常数只有 λ、κ、M 加弹性常数配合初始状态 e0、pc0 就能覆盖一个真实土样的主要力学行为。参数含义常见范围λe-ln p 空间正常压缩线斜率0.10 ~ 0.30κe-ln p 空间回弹线斜率0.01 ~ 0.06M临界状态线斜率 q/p0.80 ~ 1.50ν弹性泊松比0.20 ~ 0.35pc0初始先期固结压力固结试验确定e0初始孔隙比室内试验确定2.2 应变不变量分解与显式积分路径的选择有限元输入的应变张量有 6 个分量剑桥模型只在 p-q 空间工作所以第一件事是把应变分解成体变和偏量两个不变量。三轴轴对称条件下 dε_s 退化为 2/3·|dε_a - dε_r|一般应力状态下用如下函数def strain_invariants(deps): # deps [e11, e22, e33, e12, e13, e23]剪切分量为张量剪应变 dep_v deps[0] deps[1] deps[2] d np.array([deps[0]-dep_v/3.0, deps[1]-dep_v/3.0, deps[2]-dep_v/3.0, deps[3], deps[4], deps[5]]) dnorm np.sqrt(d[0]**2 d[1]**2 d[2]**2 2.0*(d[3]**2 d[4]**2 d[5]**2)) return dep_v, np.sqrt(2.0/3.0) * dnorm多数 FE 主程序给的是工程剪应变 γ 2ε用之前先除以 2否则偏应变被放大一倍后续所有塑性量都会偏大。体变和偏量分开后弹性关系可以分别写dε_v^e κ/v·dp/pdε_s^e dq/(3G)。由此导出的体积模量并非常数而是随 p 变化K v·p/κp 越大同样的体变增量产生的 Δp 越大这是土区别于金属材料的关键刚度特征。显式积分代码里 K 必须在每个子步重新计算不能缓存。积分路径取标准的“弹性预测—塑性修正”先把整个 Δε 当弹性变形算出试探应力 p_tr、q_tr用屈服函数判断落点。落在面内就是弹性步直接接受落在面外按一致性条件算一个塑性乘子把试探应力修正回屈服面。因为修正方向完全由试探状态决定不再回头迭代这就是显式积分也叫前欧拉格式。2.3 一致性条件与显式塑性乘子的闭合形式塑性乘子由一致性条件 ḟ 0 推出即加载过程中应力点必须始终贴在屈服面上。把屈服函数求导代入弹性关系和硬化律得到闭合表达式Λ (A·K·Δε_v 3G·B·Δε_s) / (A²·K 3G·B² p·v·pc·A/(λ-κ))其中 A 2p - pcB 2q/M²都是屈服函数的一阶偏导在试探应力处取值。分子是弹性试探产生的屈服函数超量分母第一、二项来自应力修正第三项来自硬化律对屈服面膨胀的抵抗。这个表达式有两处值得记住。其一分母最后一项带 A而 A 在湿侧为正、干侧为负对应剪缩和剪胀两段显式积分最容易出问题的地方就是 A 变号附近。其二整个公式没有迭代项所有量进入子程序时已经齐备——这正是“显式”二字的含义。把屈服面、流动法则、硬化律和一个闭合乘子放进子程序模型部分的工作就结束了剩下全是数值控制。3. 用 Python 把 camclayexp 单步显式积分写出来这一章的代码就是 camclayexp 的核心一个状态字典、三个子函数组成完整的单步应力更新。为了日后能移植到 VUMAT 这类以数组传参的程序里这里刻意不用类、不用全局变量状态全部放在字典中显式传递。3.1 状态量组织和模型参数初始化商业有限元里本构子程序的状态变量是一个双精度数组每个增量步由主程序传入、子程序更新后传回。Python 原型用字典模拟同样行为键名对应状态变量的编号def make_material(lam0.15, kap0.03, M1.2, nu0.3, pc0200.0, e01.1, p0200.0): return { lam: lam, kap: kap, M: M, nu: nu, pc: pc0, # 先期固结压力唯一的硬化内变量 e: e0, # 当前孔隙比随总体变更新 p: p0, # 当前平均有效应力 q: 0.0, # 当前偏应力 }字典键含义移植到 VUMAT 的建议lam/kap/M/nu模型参数常量传入或 STATEV 前 4 位pc先期固结压力STATEV(1)每步读写e孔隙比STATEV(2)每步读写p, q应力不变量可重算存 STATEV(3:4) 省时间参数和状态放同一个字典在原型阶段很方便移植时拆开参数只读状态量每步读写。pc 和 e 是关键状态p、q 严格说可由应变历史推出但显式算法里一起存下来省得每个增量步从头积分调试时也方便直接打印应力路径。3.2 弹性预测与屈服判断子函数弹性模量和屈服函数各写一个独立函数验证脚本里可以直接调用检查数值def elastic_moduli(mat): v 1.0 mat[e] # 比容 v 1 e K v * mat[p] / mat[kap] # 体积模量随 p 变化 G 3.0 * K * (1 - 2*mat[nu]) / (2.0 2.0*mat[nu]) return K, G def yield_fn(mat, p, q): return q*q/(mat[M]**2) p*(p - mat[pc]) def elastic_predict(mat, dep_v, dep_s): K, G elastic_moduli(mat) p_tr mat[p] K * dep_v q_tr mat[q] 3.0 * G * dep_s return p_tr, q_tr, K, GK 用的是步首 p 而不是试探 p这是正欧拉格式的典型做法模量取自步首张量。由此产生的“模量滞后”是误差来源之一步长越大越明显。G 由 K 和泊松比换算体积模量随 p 增长时剪切模量同步增长比用固定 G 更符合土在高压下的实测刚度趋势。3.3 塑性修正与孔隙比更新的完整单步子程序核心更新函数接收体变增量和偏应变增量就地更新状态字典并返回新应力def stress_update(mat, dep_v, dep_s, tol1e-10): p_tr, q_tr, K, G elastic_predict(mat, dep_v, dep_s) f_tr yield_fn(mat, p_tr, q_tr) if f_tr tol: mat[p], mat[q] p_tr, q_tr else: pc mat[pc] A 2.0*p_tr - pc # ∂f/∂p B 2.0*q_tr/(mat[M]**2) # ∂f/∂q v 1.0 mat[e] num A*K*dep_v 3.0*G*B*dep_s den (A*A*K 3.0*G*B*B p_tr*v*pc*A/(mat[lam] - mat[kap])) dlam num / den mat[p] p_tr - K*dlam*A mat[q] q_tr - 3.0*G*dlam*B mat[pc] v/(mat[lam] - mat[kap]) * pc * dlam * A mat[e] - (1.0 mat[e]) * dep_v # 压缩为正孔隙比减小 return mat[p], mat[q]dlam 的分子是试算应力对屈服面的超量分母是把屈服函数拉回零所需的总刚度。K、G 取步首值A、B 取试探值这套取值方式就是显式和隐式的分界线任何想用更新后的状态再算一遍的改动都会把算法变成半隐式收敛行为完全不同。孔隙比更新放在函数末尾用总应变增量而不是塑性部分——弹性体变同样改变孔隙比。符号约定是压缩为正、e 减小如果 FE 主程序采用张拉为正典型是 ABAQUS进子程序前要把压应变取负。这个符号问题在移植 UMAT 时是最常见的头号 bug第五章的验证试验也会涉及。提示tol 取 1e-10 只是让“明显塑性步”不被误判成弹性。真正控制精度的不是这个阈值而是子步划分策略。4. 显式算法的精度控制子步划分、漂移修正与参数敏感性单步函数能跑通并不代表能直接用于工程计算。前欧拉格式的精度是一阶的同一个应变增量拆成两步算出的应力和一步算出的不一样。要处理的就是这个差。4.1 前欧拉积分的两类误差截断误差与屈服面漂移第一类是截断误差。屈服面法向和弹性模量都在步首求值当应力路径在 p-q 平面里拐弯时一步跨过弯道会切掉一块面积终点偏向屈服面外侧或内侧。第二类是屈服面漂移塑性修正结束后 f(p_new, q_new, pc_new) 理论上应为零但因为导数全部取试探值实际 f 是一个非零小量。单步误差不可怕可怕的是积累。显式有限元一个分析步有几万增量步材料点被调用上万次不控制误差应力路径就会缓偏移典型表现是不排水强度被高估、临界状态点漂移不定。漂移方向有规律加载段通常偏在屈服面外侧f 略大于零卸载再加载的滞回圈则看到屈服面扩张偏慢。把 f/pc² 在每个步末打印出来是判断漂移是否失控的最快指标。4.2 自适应子步划分用屈服超量自动决定增量次数最简单的控制手段是把大增量切成若干子步逐个调用单步函数。子步数由试算屈服超量自动决定def integrate(mat, dep_v, dep_s, tol1e-8, max_sub40): p_tr, q_tr, K, G elastic_predict(mat, dep_v, dep_s) f_tr yield_fn(mat, p_tr, q_tr) n 1 if f_tr tol * mat[pc]**2: n int(min(max_sub, max(2, f_tr / (tol * mat[pc]**2)))) for _ in range(n): stress_update(mat, dep_v/n, dep_s/n)f_tr 相对 pc² 的超量越大说明试探应力穿出屈服面越深需要的子步越多。上限 40 防止一次异常增量把计算拖死下限 2 保证塑性步至少两段。弹性步f_tr ≤ 0一个步长走完即可弹性区没有屈服面约束剩下的只是模量滞后的截断误差。更严格的做法是误差控制型自适应子步即 Sloan 在计算力学文献里提出的方案整个增量算一遍再切成两半各算一遍用两个结果之差估计局部误差超过容差就继续二分。它的适应性比超量比例法强代价是每个增量步要多付几次子程序调用。做高精度参数反演时值得上日常参数扫描用上面的比例法已经足够。4.3 漂移修正的两种做法与关键参数对照子步划分后仍有残余漂移可以通过修正清掉。剑桥模型的硬化只由塑性体积应变驱动修正应力不如修正硬化变量干净固定 p、q反解屈服方程得到pc_new p q²/(M²·p)漂移误差被全部吸收进 pc应力张量不动。对显式算法这是安全的因为不输出一致切线刚度修正造成的导数不连续不会污染全局牛顿迭代。隐式算法里不要这么做——漂移必须交给局部牛顿迭代消掉否则一致切线矩阵的线性化就废了。另一个需要拦截的情况是 dlam 0。正常加载不允许负塑性乘子出现负值说明这个增量实际指向屈服面内侧应该退回纯弹性更新。判断加在 stress_update 的 else 分支里即可。参数/情形典型现象处理方式λ 与 κ 过于接近硬化项分母巨大pc 几乎不动确认输入用的是 λ-κν 取到 0.48 以上G 异常放大q 响应过刚保持 ν ≤ 0.40初始 p 太小K 过小p 可能穿负先固结到 pc 附近再剪每步 f/pc² 1e-4屈服面外侧漂移明显调小 tol 或改误差控制子步5. 两个验证试验把显式积分结果钉在临界状态线上代码写完别急着进有限元先做两个单点试验。它们能立刻暴露积分错误等向压缩检查硬化律不排水三轴剪切检查临界状态终点。两个都跑过塑性部分可以认为没有原则性问题。5.1 等向压缩试验验证硬化律的 λ 斜率对 p pc 的试样逐级施加等向体变增量记录 e 与 ln p 的关系。正常压缩段的斜率必须等于 -λmat make_material(e01.4, pc0100.0, p0100.0) for _ in range(300): integrate(mat, 2e-4, 0.0) slope (mat[e] - 1.4) / math.log(mat[p] / 100.0) print(slope) # 应约等于 -0.15即 -lam斜率对不上先查 e 的更新符号再查硬化律里的 v 是否取了旧值。这个试验顺带验证 pc 的追踪正常压缩段结束时 pc 应等于 p否则塑性乘子的分母项有误。5.2 不排水三轴剪切验证终点 q/Mp 1固结完成后保持体变为零逐级施加偏应变。无论初始固结比如何不排水路径的终点都落在临界状态线上数值上 q/p 收敛到 Mmat make_material(e01.1, pc0200.0, p0200.0) for i in range(2000): integrate(mat, 0.0, 2e-4) if i % 500 0: print(i, mat[q]/mat[p])对正常固结土终点平均有效应力尚有解析参考值 p_f pc0 / 2^ΛΛ (λ-κ)/λ代入参数 p_f ≈ 115 kPa、q_f ≈ 138 kPa。若 q/p 收敛到 1.2 附近而 p 偏离解析值超过 2%查硬化项的符号和试探状态的取值时机。两个试验都通过后把 integrate 里的子步策略换成误差控制版本再按 4.3 的参数表调一遍就是一份可以封装成 VUMAT 的显式剑桥模型代码。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →