⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j2flow2.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
字号:
#include <math.h>#include "j2flow2.h"#include "global.h"#include "genfile.h"#include "intpoints.h"#include "vecttens.h"#include "alias.h"#include "stochdriver.h"#include "matrix.h"j2flow2::j2flow2 (void){  fs=0.0;  k=0.0;}j2flow2::~j2flow2 (void){}void j2flow2::read (XFILE *in){  xfscanf (in,"%lf %lf",&fs,&k);  sra.read (in);}/**   function returns elastic stiffness matrix      @param d - elastic stiffness matrix      4.8.2001*/void j2flow2::matstiff (matrix &d,long ipp,long ido){  if (Mp->stmat==initial_stiff){    //  initial elastic matrix    Mm->elmatstiff (d,ipp);  }  if (Mp->stmat==tangent_stiff){    //  tangent stiffness matrix    matrix ad(d.m,d.n);    Mm->elmatstiff (ad,ipp);    tangentstiff (ad,d,ipp,ido);  }}void j2flow2::tangentstiff (matrix &d,matrix &td,long ipp,long ido){  long ncomp=Mm->ip[ipp].ncompstr;  double denom,gamma;  vector str,av(d.m),q(1);  matrix sig(3,3),am(d.m,d.n);    gamma=Mm->ip[ipp].eqother[ido+ncomp];  if (gamma<1.0e-10){    copym (d,td);  }  else{        allocv (ncomp,str);        Mm->givestress (0,ipp,str);    vector_tensor (str,sig,Mm->ip[ipp].ssst,stress);    deryieldfsigma (sig,sig);    tensor_vector (str,sig,Mm->ip[ipp].ssst,stress);        if (Mm->ip[ipp].ssst==planestress){      vector auxstr(3);      auxstr[0]=str[0];auxstr[1]=str[1];auxstr[2]=str[2];      destrv (str);      allocv (d.m,str);      str[0]=auxstr[0];str[1]=auxstr[1];str[2]=auxstr[2];    }        mxv (d,str,av);    scprd (av,str,denom);            q[0] = Mm->ip[ipp].eqother[ido+ncomp+1];    denom+= plasmodscalar(q);        if (fabs(denom)<1.0e-10){      copym (d,td);    }    else{      vxv (str,str,am);      mxm (d,am,td);      mxm (td,d,am);            cmulm (1.0/denom,am);            subm (d,am,td);    }  }  }/**   function evaluates yield function for given stresses      @param sig - stresses   @param q - internal parameters (hardening)      4.8.2001*/double j2flow2::yieldfunction (matrix &sig,vector &q){  double f,j2;  matrix dev(3,3);  deviator (sig,dev);  j2=second_invar(dev);    f = j2 - (fs*fs/3.0+q[0]);  return f;}/**   function evaluates derivatives of yield function   with respect of stress components   4.8.2001*/void j2flow2::deryieldfsigma (matrix &sig,matrix &dfds){  dfds[0][0]=1.0/3.0*(2.0*sig[0][0]-sig[1][1]-sig[2][2]);  dfds[1][1]=1.0/3.0*(2.0*sig[1][1]-sig[0][0]-sig[2][2]);  dfds[2][2]=1.0/3.0*(2.0*sig[2][2]-sig[0][0]-sig[1][1]);    dfds[0][1]=2*sig[0][1];  dfds[1][0]=2*sig[0][1];  dfds[0][2]=2*sig[0][2];  dfds[2][0]=2*sig[0][2];  dfds[1][2]=2*sig[1][2];  dfds[2][1]=2*sig[1][2];}/**   function computes second derivatives of yiled function with   respect to stresses*/void j2flow2::deryielddsigmadsigma (matrix &sig,matrix &dfdsds){  fillm (0.0,dfdsds);    dfdsds[0][0] =  2.0/3.0;  dfdsds[0][1] = -1.0/3.0;  dfdsds[0][2] = -1.0/3.0;    dfdsds[1][0] = -1.0/3.0;  dfdsds[1][1] =  2.0/3.0;  dfdsds[1][2] = -1.0/3.0;    dfdsds[2][0] = -1.0/3.0;  dfdsds[2][1] = -1.0/3.0;  dfdsds[2][2] =  2.0/3.0;    dfdsds[3][3] = 2.0;  dfdsds[4][4] = 2.0;  dfdsds[5][5] = 2.0;}/**   function evaluates derivatives of yield function   with respect of internal variable q   27.10.2001*/void j2flow2::deryieldfq (vector &dq){  //dq[0]=k*(-1.0);  dq[0]=-1.0;}void j2flow2::deryieldfdqdq (matrix &dfdqdq){  dfdqdq[0][0]=0.0;}void j2flow2::deryieldfdsigmadq (matrix &dfdsdq){  dfdsdq[0][0]=0.0;  dfdsdq[1][0]=0.0;  dfdsdq[2][0]=0.0;  dfdsdq[3][0]=0.0;  dfdsdq[4][0]=0.0;  dfdsdq[5][0]=0.0;}void j2flow2::plasmod (matrix &h){  h[0][0]=k;}double j2flow2::plasmodscalar(vector &qtr){  double ret;  vector dfq(qtr.n), hp(qtr.n);  matrix h(qtr.n, qtr.n);  deryieldfq(dfq);  plasmod (h);  mxv (h,dfq,hp);  scprd (hp,dfq,ret);  return ret;}void j2flow2::updateq(double dgamma, vector &q){  long j;  vector dfq(q.n), hp(q.n);  matrix h(q.n, q.n);  deryieldfq(dfq);  plasmod (h);  mxv (h,dfq,hp);  for (j=0;j<q.n;j++)    q[j]-=dgamma*hp[j];}void j2flow2::nlstresses (long ipp, long im, long ido)  //{  long i,ni, n = Mm->ip[ipp].ncompstr;  double gamma,err;  vector epsn(n),epsp(n),q(1);  //  initial values  for (i=0;i<n;i++){    epsn[i]=Mm->ip[ipp].strain[i];    epsp[i]=Mm->ip[ipp].eqother[ido+i];  }  gamma = Mm->ip[ipp].eqother[ido+n];  q[0] = Mm->ip[ipp].eqother[ido+n+1];    //  stress return algorithm  if (sra.give_tsra () == cp){    ni=sra.give_ni ();    err=sra.give_err ();        Mm->newton_stress_return (ipp,im,ido,gamma,epsn,epsp,q,ni,err);    //Mm->cutting_plane (ipp,im,ido,gamma,epsn,epsp,q,ni,err);  }  else{    fprintf (stderr,"\n\n wrong type of stress return algorithm is required in nlstresses (file %s, line %d).\n",__FILE__,__LINE__);    abort ();  }    //  new data storage  for (i=0;i<n;i++){    Mm->ip[ipp].other[ido+i]=epsp[i];  }  Mm->ip[ipp].other[ido+n]=gamma;  Mm->ip[ipp].other[ido+n+1]=q[0];  fprintf (Out,"\n q %le",q[0]);  //  new data storage  /*  for (i=0;i<n;i++){    Mm->ip[ipp].other[i]=epsp[i];  }  Mm->ip[ipp].other[n]=gamma;  Mm->ip[ipp].other[n+1]=q[0];  */}void j2flow2::nonloc_nlstresses (long ipp, long im, long ido){  long i,ni, n = Mm->ip[ipp].ncompstr;  double gamma,err;  vector epsn(n),epsp(n),q(1);  //  initial values  for (i=0;i<n;i++){    epsn[i]=Mm->ip[ipp].strain[i];    epsp[i]=Mm->ip[ipp].nonloc[i];  }  gamma = Mm->ip[ipp].eqother[ido+n];  q[0] = Mm->ip[ipp].eqother[ido+n+1];  //  stress return algorithm  if (sra.give_tsra () == cp){    ni=sra.give_ni ();    err=sra.give_err ();        Mm->cutting_plane (ipp,im,ido,gamma,epsn,epsp,q,ni,err);  }  else{    fprintf (stderr,"\n\n wrong type of stress return algorithm is required in nlstresses (file %s, line %d).\n",__FILE__,__LINE__);    abort ();  }    //  new data storage  for (i=0;i<n;i++){    Mm->ip[ipp].other[ido+i]=epsp[i];  }  Mm->ip[ipp].other[ido+n]=gamma;  Mm->ip[ipp].other[ido+n+1]=q[0];    fprintf (Out,"\n q %le",q[0]);}void j2flow2::updateval (long ipp, long im, long ido){  long i,n = Mm->givencompeqother(ipp, im);  for (i=0;i<n;i++){    Mm->ip[ipp].eqother[ido+i]=Mm->ip[ipp].other[ido+i];  }}/**  Function returns irreversible plastic strains.  @param ipp   - integration point number in the mechmat ip array.  @param ido   - index of the first internal variable for given material in the ipp other array  @param epsp  - %vector of irreversible strains   Returns vector of irreversible strains via parameter epsp*/void j2flow2::giveirrstrains (long ipp, long ido, vector &epsp){  long i;  for (i=0;i<epsp.n;i++)    epsp[i] = Mm->ip[ipp].eqother[ido+i];}void j2flow2::changeparam (atsel &atm,vector &val){  long i;    for (i=0;i<atm.num;i++){    switch (atm.atrib[i]){    case 0:{      fs=val[i];      break;    }    case 1:{      k=val[i];      break;    }    default:{      fprintf (stderr,"\n\n wrong number of atribute in function changeparam (file %s, line %d).\n",__FILE__,__LINE__);    }    }  }}double j2flow2::give_consparam (long ipp,long ido){  long ncompstr;  double gamma;    ncompstr=Mm->ip[ipp].ncompstr;  gamma = Mm->ip[ipp].eqother[ido+ncompstr];    return gamma;}long j2flow2::give_num_interparam (){  return 1;}void j2flow2::give_interparam (long ipp,long ido,vector &q){  long ncompstr=Mm->ip[ipp].ncompstr;    q[0]=Mm->ip[ipp].eqother[ido+ncompstr+1];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -