找回密码
 注册
Simdroid-非首页
查看: 898|回复: 23

[命令/FISH] 霍克-布朗(Hoek-Brown)本构模型学习-附自创流程图

[复制链接]
发表于 2009-6-9 10:39:21 | 显示全部楼层 |阅读模式 来自 河南洛阳
霍克-布朗模型应用于岩石工程较为理想,我想将来在掌握其本构关系基础上有所突破
恳请大伙批评指正!
------------------------------------------------------RUN-----------------------------------------------------------------------
static const int e3psum = 0;
const char *UserHoekModel::Run(unsigned uDim,State *ps) {

  if(ps->dHystDampMult > 0.0) HDampInit(ps->dHystDampMult);

  /* --- plasticity indicator:                                  */
  /*     store 'now' info. as 'past' and turn 'now' info off ---*/
  double s1n= 0.0, s2n=0.0, s3n=0.0, F0=0.0, F1=0.0, F2=0.0, e0=0.0, e1=0.0, e2=0.0;
  double de3p=0.0, repStress=0.0, smallStress=0.0, gammaAF=0.0, gammaCV=-1.0;
  double gamma=0.0;
  double mult=1.0;
  int i=0;
  if (ps->mState & mShearNow)
    ps->mState = (unsigned long)(ps->mState | mShearPast);
  ps->mState = (unsigned long)(ps->mState & ~mShearNow);
  /* --- hardening/softening:
  initialize stacks to calculate hardening paramters for zone --- */
  if (!ps->bySubZone) {
    ps->working[e3psum] = 0.0;
  }
  /* --------------------------------------------------*/
  /* --- trial elastic stresses --- */
  double dE11 = ps->stnE.d11;
  double dE22 = ps->stnE.d22;
  double dE33 = ps->stnE.d33;
  ps->stnS.d11 += dE11 * dE1 + (dE22 + dE33) * dE2;
  ps->stnS.d22 += (dE11 + dE33) * dE2 + dE22 * dE1;
  ps->stnS.d33 += (dE11 + dE22) * dE2 + dE33 * dE1;
  ps->stnS.d12 += ps->stnE.d12 * dG2;
  ps->stnS.d13 += ps->stnE.d13 * dG2;
  ps->stnS.d23 += ps->stnE.d23 * dG2;
  double _sMeanOld = ps->stnS.d11 + ps->stnS.d22 + ps->stnS.d33;

  if (dSigci <= 0.0) {        // (no strength)
    double sig0 = (ps->stnS.d11+ps->stnS.d22+ps->stnS.d33) / 3.0;
    ps->stnS.d11 = sig0;
    ps->stnS.d22 = sig0;
    ps->stnS.d33 = sig0;
    ps->stnS.d12 = 0.0;
    ps->stnS.d13 = 0.0;
    ps->stnS.d23 = 0.0;
    ps->bViscous = false;  // inhibit viscous strains
    double _sMeanNew = ps->stnS.d11 + ps->stnS.d22 + ps->stnS.d33;
          ps->dMeanPlasticStressChange = (_sMeanOld - _sMeanNew) / 3.0;
    return(0);
  }
  /* --- calculate and sort ps->incips->l stresses and ps->incips->l directions --- */
  Axes aDir;
  double dPrinMin,dPrinMid,dPrinMax,sdif=0.0,psdif=0.0;
  int icase=0;

  bool bFast=ps->stnS.Resoltopris(&dPrinMin,&dPrinMid,&dPrinMax,&aDir,uDim, &icase, &sdif, &psdif);

  double dPrinMinCopy = dPrinMin;
  double dPrinMidCopy = dPrinMid;
  double dPrinMaxCopy = dPrinMax;
  /* --- Hoek-Brown failure criterion --- */
  double s1 = -dPrinMin; // Use positive compression
  double s2 = -dPrinMid;
  double s3 = -dPrinMax;
  double fac = dMb * s3 / dSigci + dS;
  double fac2 = 0.0;
  if (fac >= 0.0) fac2 = dSigci * pow(fac,dA);
  else            fac2 = -dSigci * pow(fabs(fac),dA);        // Ensure continuity
  double dFsurf = s1 - s3 - fac2;
  dF = dFsurf;
  if (dFsurf > 0.0) {   //以下程式全是在dFsurf > 0时成立
    // yield ...屈服时
    //double SigUCS = dSigci * pow(dS,dA);// Unconfined compressive strength单轴抗压强度
    //double SigTen = -dS * dSigci / dMb;                // Tensile stress at apex顶部抗拉应力
    ps->mState = (unsigned long)(ps->mState | mShearNow);
    ps->bViscous = false; // inhibit viscous strains   禁止粘性应变

    repStress   = __max(fabs(s1),fabs(s3));
    smallStress = __max(repStress,dSigci) * Ftol;        // A small stress取一小应变
    if (dFsurf <= smallStress) return(0);
    // Stress adjustment ...应力调整
    de3p = __max(fabs(dE11),fabs(dE22)); // put starting value into de3p
    de3p = __max(de3p,fabs(dE33));     
    de3p = __max(de3p,fabs(ps->stnE.d12));
    de3p = __max(de3p,fabs(ps->stnE.d13));
    de3p = __max(de3p,fabs(ps->stnE.d23));// 对de3p初始赋值,取应力最大值
    bool converged = false;
    double dConst1 = 0.0;
    double dConst2 = 0.0;
    double dConst3 = 0.0;

    if(de3p != 0.0)
    {   //计算流动系数
      gammaAF = -1.0/(1.0+dA*dSigci*pow(fabs(dS+dMb*s3/dSigci),dA-1.0)*dMb/dSigci);
      gammaCV = -1.0;
      if ((s3<0.0) && (s1<0.0)) {  //当主应力均小于0时
        gamma = s1 / s3;        //径向流动法则
      } else if ((s3<=0.0) && (s1>0.0)) {   //当最大主应力<=0且最小主应力>0时
        gamma = gammaAF;            //相关联流动法则
      } else if ((s3>0.0) && (s3 < dS3cv)) {    //当最小主应力>0且小于sig3max时        gamma = 1.0/((1.0/gammaAF)+((1.0/gammaCV)-(1.0/gammaAF))*s3/dS3cv);// 复合流动法则
      } else {
        gamma = gammaCV;   //恒定体积流动法则
      }
      dConst1 = gamma * dE1 + dE2;//
      dConst3 = gamma * dE2 + dE1;//
      dConst2 = dE2 * (1.0 + gamma);//
      s1n  = s1 - de3p * dConst1; //最终应力
      s3n  = s3 - de3p * dConst3;
      s2n  = s2 - de3p * dConst2;
      fac = dMb * s3n / dSigci + dS;
      if (fac >= 0.0) fac2 = dSigci * pow(fac,dA);
      else            fac2 = -dSigci * pow(fabs(fac),dA);
      F1 = s1n - s3n - fac2; //重新计算F值
      F0 = dFsurf;
      e0 = 0.0;
      e1 = de3p;
      dIts = 0.0;

      for (i=0 ; i<15 ; i++) {//运算15步
        if (F1 == F0) break;
        e2  = (F1 * e0 - F0 * e1) / (F1 - F0);//利用牛顿法插值
        s1n = s1 - e2 * dConst1;
        s3n = s3 - e2 * dConst3;
        s2n = s2 - e2 * dConst2;
        fac = dMb * s3n / dSigci + dS;
        if (fac >= 0.0) fac2 = dSigci * pow(fac,dA);
        else            fac2 = -dSigci * pow(fabs(fac),dA);
        F2 = s1n - s3n - fac2;
        dF = F2;
        dIts = dIts + 1.0;
        if (fabs(F2) < smallStress) //判断新F
        {
          converged = true;
          break;
        }
        F0 = F1;
        F1 = F2;
        e0 = e1;
        e1 = e2;
      }
    }

    // Try a bisection algorithm if solution did not converge.二等分算法
    if(!converged)
    {
      double e2in = (s1 - s3) / ((1.0-gamma) * (dE2 - dE1));  // F <= 0
      double e2out = 0.0; // F > 0

      for(i=0;i<100;i++)
      { //运算100步
        double e2mid = (e2in + e2out) / 2.0;
        s1n = s1 - e2mid * dConst1;
        s3n = s3 - e2mid * dConst3;
        fac = dMb * s3n / dSigci + dS;
        if (fac >= 0.0) fac2 =  dSigci * pow(fac,dA);
        else            fac2 = -dSigci * pow(fabs(fac),dA);
        F2 = s1n - s3n - fac2;
        if (fabs(F2) < smallStress)
        {
          dF = F2;         
          s1n = s1 - e2mid * dConst1;
          s3n = s3 - e2mid * dConst3;
          s2n = s2 - e2mid * dConst2;
          converged = true;
          dIts = i;
          e2 = e2mid;
          break;
        }
        if(F2 < 0.0)
          e2in = e2mid;
        else if(F2 > 0.0)
          e2out = e2mid;
      }
    }

    if (!converged)
      return("Hoek-Brown model failed to converge.");

    /* ---- sum e2 for all sub-zones 对所有子域e2倍递加-----------------------*/
    ps->working[e3psum] += e2 * ps->dSubZoneVolume;
    if (s3n > s1n) {        // Crossed bisector ... set to apex交叉等分线,在顶点设置
      s1n = -dS * dSigci / dMb;
      s2n = s1n;
      s3n = s1n;
    }
    dPrinMin = -s1n;
    dPrinMid = -s2n;
    dPrinMax = -s3n;
    //
    ps->stnS.Resoltoglob(dPrinMin, dPrinMid, dPrinMax, aDir, dPrinMinCopy, dPrinMidCopy, dPrinMaxCopy, uDim, icase, sdif,  psdif, bFast);
    ps->bViscous = false; // inhibit viscous strains禁止粘性应变
    //若存在硬化增量则更新
    if (ps->bySubZone==ps->byTotSubZones-1) {
      double dAux = 1.0 / ps->dZoneVolume;
      if (ps->byOverlay==2) dAux *= 0.5;
      dDEP += ps->working[e3psum] * dAux;
      /* soften properties if plastic strain e2 is non-zero */
      if (ps->working[e3psum] != 0.0) {
        const char *str=0;
        if (uiMULTab) { // update mult更新因子
          str = ConTableList::Instance()->YFromX(uiMULTab,fabs(s3n),&mult);
          if (str) return(str);
        }
        if (uiMTab) { // Update m更新m值
          str = ConTableList::Instance()->YFromX(uiMTab,mult*fabs(dDEP),&dMb);
          if (str) return(str);
        }
        if (uiSTab) { // update s更新s值
          str = ConTableList::Instance()->YFromX(uiSTab,mult*fabs(dDEP),&dS);
          if (str) return(str);
        }
        if (uiATab) { // Update a更新a值
          str = ConTableList::Instance()->YFromX(uiATab,mult*fabs(dDEP),&dA);
          if (str) return(str);
        }
        if (uiCTab) { // update sigci更新sigci值
          str = ConTableList::Instance()->YFromX(uiCTab,mult*fabs(dDEP),&dSigci);
          if (str) return(str);
        }
      }
    }
  }

  if (ps->mState & mShearNow)
  {
    ps->bViscous = false; // inhibit viscous strains禁止粘性应变
    double _sMeanNew = ps->stnS.d11 + ps->stnS.d22 + ps->stnS.d33;
          ps->dMeanPlasticStressChange = (_sMeanOld - _sMeanNew) / 3.0;
  }
  else
  {
    ps->bViscous = true;  // allow viscous strains允许粘性应变
  }

  return(0);
}
 楼主| 发表于 2009-6-9 10:41:14 | 显示全部楼层 来自 河南洛阳
Simdroid开发平台
本帖最后由 whutzll 于 2009-6-19 09:56 编辑

1# whutzll

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-9 10:44:20 | 显示全部楼层 来自 河南洛阳
以下是流程图中公式

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2009-6-9 10:57:23 | 显示全部楼层 来自 安徽淮南
很有意义的讨论
回复 不支持

使用道具 举报

发表于 2009-6-9 11:01:07 | 显示全部楼层 来自 安徽淮南
sig3cv的取值要依靠实验  对位移的分布范围影响比较明显
回复 不支持

使用道具 举报

 楼主| 发表于 2009-6-10 20:03:59 | 显示全部楼层 来自 河南洛阳
5# lookcity
谢谢lookcity的关注!
有关sigci和sig3cv可以参考rocscience.com网站上roclab软件计算。
软件是免费的,较为实用。
回复 不支持

使用道具 举报

发表于 2009-7-1 16:44:20 | 显示全部楼层 来自 陕西西安
很好,很强大,谢谢楼主分享
回复 不支持

使用道具 举报

发表于 2009-7-2 10:31:52 | 显示全部楼层 来自 安徽淮南
5# lookcity
谢谢lookcity的关注!
有关sigci和sig3cv可以参考rocscience.com网站上roclab软件计算。
软件是免费的,较为实用。
whutzll 发表于 2009-6-10 20:03

Rocklab我用过  但里面不包括sig3cv的计算。
Rocklab是基于Hoek的理论的,但只包括峰值之前的,FLAC3D增加了流动准则。
回复 不支持

使用道具 举报

发表于 2009-7-2 12:31:26 | 显示全部楼层 来自 陕西西安
谢谢分享
回复 不支持

使用道具 举报

发表于 2009-7-21 12:00:44 | 显示全部楼层 来自 北京东城
好东西!!!!!!
回复 不支持

使用道具 举报

发表于 2009-7-21 14:39:06 | 显示全部楼层 来自 北京
h-b本来就只是个经验性的强度准则,不包含什么应力应变关系等。
回复 不支持

使用道具 举报

发表于 2010-11-22 10:31:02 | 显示全部楼层 来自 河南郑州
下了,看看!
回复 不支持

使用道具 举报

发表于 2011-3-19 13:11:31 | 显示全部楼层 来自 美国
这样的帖多发点
回复 不支持

使用道具 举报

发表于 2011-3-20 09:10:43 | 显示全部楼层 来自 山东济南
支持一下,希望有所创新
回复 不支持

使用道具 举报

发表于 2011-8-22 23:54:24 | 显示全部楼层 来自 四川成都
支持,很有技术含量!
回复 不支持

使用道具 举报

发表于 2011-8-22 23:54:41 | 显示全部楼层 来自 四川成都
支持,很有技术含量!
回复 不支持

使用道具 举报

发表于 2011-8-24 19:27:38 | 显示全部楼层 来自 陕西西安
楼主 这个怎么这么复杂啊  我还想着用霍克布朗准则验算围岩的破坏呢,,现在怕了
回复 不支持

使用道具 举报

发表于 2011-8-25 08:43:04 | 显示全部楼层 来自 云南昆明
学习了,这个本构的计算效率如何?
回复 不支持

使用道具 举报

发表于 2011-8-25 09:27:57 | 显示全部楼层 来自 四川成都
回复 1# whutzll
请问楼主,在FLAC3D模拟时,怎样使用霍克—布朗本构模型进行数值分析呢?您发的这个程序能直接应用吗?非常感谢
回复 不支持

使用道具 举报

发表于 2011-8-25 15:47:16 | 显示全部楼层 来自 四川成都
回复 1# whutzll

楼主能否指点一下
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-23 18:34 , Processed in 0.046752 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表