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

📄 dkt.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}void dktelem::allip_strains (double **stra,long lcid,long eid,long ri,long ci){  long i,ipp;  vector l(3);  vector eps(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);  ipp=Mt->elements[eid].ipp[ri][ci];        for (i=0;i<intordsm[0][0];i++){    l[0]=gp1[i];  l[1]=gp2[i];  l[2]=1.0-l[0]-l[1];   	if (Mp->strainaver==0)		appval (l,0,tncomp,eps,stra);	if (Mp->strainaver==1)	    appstrain (lcid,eid,l,0,tncomp,eps);	Mm->storestrain (lcid,ipp,eps);	ipp++;  }}void dktelem::strains (long lcid,long eid,long ri,long ci){  long i,naep,ncp,sid;  double **stra;  vector coord,eps,l(3);    if (Mp->strainaver==0){    stra = new double* [nne];    for (i=0;i<nne;i++){      stra[i] = new double [tncomp];    }    elem_strains (stra,lcid,eid,ri,ci);  }  switch (Mm->stra.tape[eid]){  case nowhere:{    break;  }  case intpts:{    allip_strains (stra,lcid,eid,ri,ci);    break;  }  case enodes:{    break;  }  case userdefined:{    //  number of auxiliary element points    naep = Mm->stra.give_naep (eid);    ncp = Mm->stra.give_ncomp (eid);    sid = Mm->stra.give_sid (eid);    allocv (ncp,eps);    allocv (2,coord);    for (i=0;i<naep;i++){      Mm->stra.give_aepcoord (sid,i,coord);      l[0]=coord[0];l[1]=coord[1];l[2]=1-coord[1]-coord[2];      if (Mp->strainaver==0)		appval (l,0,ncp,eps,stra);      if (Mp->strainaver==1)        appstrain (lcid,eid,l,0,ncp,eps);      Mm->stra.storevalues(lcid,eid,i,eps);    }    destrv (eps);    destrv (coord);    break;  }  default:{    fprintf (stderr,"\n\n unknown strain point is required in function planeelemlt::strains (%s, line %d).\n",__FILE__,__LINE__);  }  }  if (Mp->strainaver==0){    for (i=0;i<nne;i++){      delete [] stra[i];    }    delete [] stra;  }}/**   function computes stresses DKT*/void dktelem::res_allip_stresses (long lcid,long eid){  //  blocks of stress components at integration points  mainip_stresses (lcid,eid,0,0);}void dktelem::mainip_stresses (long lcid,long eid,long ri,long ci){  long i,ipp,ij;  double thick;  ivector nodes(nne);  vector l(3),t(nne);  vector eps(ncomp[0]),sig(ncomp[0]),auxsig(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  matrix d(5,5),dd(ncomp[0],ncomp[0]);        Mt->give_elemnodes (eid,nodes);    Mc->give_thickness (eid,nodes,t);    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);    ipp=Mt->elements[eid].ipp[ri][ci];      fprintf (Out,"\n\n stress");  fprintf (Out,"\n\n prvek cislo %ld",eid);  for (i=0;i<intordsm[0][0];i++){      Mm->matstiff (d,ipp);      l[0]=gp1[i]; l[1]=gp2[i];l[2]=1.0-l[0]-l[1];      fillv (0.0,sig);//	  if (Mp->strainaver==0)	    Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps);//	  if (Mp->strainaver==1)//	    appstrain (lcid,eid,l,cncomp[0],ncomp[0],eps);      thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];      dbmat (d,dd,thick);	  mxv (dd,eps,auxsig);	  addv (auxsig,sig,sig);	  Mm->storestress (lcid,ipp,cncomp[0],ncomp[0],sig);            fprintf (Out,"\n");		  for (ij=0;ij<ncomp[0];ij++){ fprintf (Out,"%20.10e",sig[ij]);	}           ipp++;	}		  }void dktelem::nod_stresses (long lcid,long eid,long ri,long ci){  long i,ipp;  double thick,*lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),r,natcoord(2),l(3),t(nne);  vector eps(ncomp[0]),sig(ncomp[0]),auxsig(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  ivector nodes(nne);  matrix gm,d(5,5),dd(ncomp[0],ncomp[0]);    lsm = new double [9];  Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);    nodecoord (nxi,neta);    lhs = new double [ncomp[0]*3];    rhs = new double [ncomp[0]*3];    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);        nullv (lsm,9);    nullv (rhs,ncomp[0]*3);        ipp=Mt->elements[eid].ipp[ri][ci];        for (i=0;i<intordsm[0][0];i++){            Mm->matstiff (d,ipp);      l[0]=gp1[i]; l[1]=gp2[i];l[2]=1.0-l[0]-l[1];      thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];      fillv (0.0,sig);	  if (Mp->strainaver==0)	    Mm->givestrain (lcid,ipp,cncomp[0],ncomp[0],eps);	  if (Mp->strainaver==1)	    appstrain (lcid,eid,l,cncomp[0],ncomp[0],eps);      thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];      dbmat (d,dd,thick);	  mxv (dd,eps,auxsig);	  addv (auxsig,sig,sig);            natcoord[0]=gp1[i];  natcoord[1]=gp2[i];      matassem_lsm (lsm,natcoord);      rhsassem_lsm (rhs,natcoord,sig);            ipp++;    }        solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]);    Mt->stress_nodal_values (nodes,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0],lcid);            delete [] lhs;  delete [] rhs;    delete [] lsm;}void dktelem::elem_stresses (double **stra,double **stre,long lcid,long eid,long ri,long ci){  long i,ipp;  double thick,*lsm,*lhs,*rhs;  vector nxi(nne),neta(nne),r,natcoord(2),l(3),t(nne);  vector eps(ncomp[0]),sig(ncomp[0]),auxsig(ncomp[0]),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);  ivector nodes(nne);  matrix gm,d(5,5),dd(ncomp[0],ncomp[0]);    lsm = new double [9];  Mt->give_elemnodes (eid,nodes);  Mc->give_thickness (eid,nodes,t);    nodecoord (nxi,neta);    lhs = new double [ncomp[0]*3];    rhs = new double [ncomp[0]*3];    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);        nullv (lsm,9);    nullv (rhs,ncomp[0]*3);        ipp=Mt->elements[eid].ipp[ri][ci];        for (i=0;i<intordsm[0][0];i++){            Mm->matstiff (d,ipp);      l[0]=gp1[i]; l[1]=gp2[i];l[2]=1.0-l[0]-l[1];      thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];      fillv (0.0,sig);	  if (Mp->strainaver==0)	    appval (l,cncomp[0],ncomp[0],eps,stra);	  if (Mp->strainaver==1)	    appstrain (lcid,eid,l,cncomp[0],ncomp[0],eps);      thick = t[0]*l[0]+t[1]*l[1]+t[2]*l[2];      dbmat (d,dd,thick);	  mxv (dd,eps,auxsig);	  addv (auxsig,sig,sig);            natcoord[0]=gp1[i];  natcoord[1]=gp2[i];      matassem_lsm (lsm,natcoord);      rhsassem_lsm (rhs,natcoord,sig);            ipp++;    }        solve_lsm (lsm,lhs,rhs,Mp->zero,3,ncomp[0]);    Mt->stress_nodal_values (nodes,nxi,neta,nxi,lhs,2,cncomp[0],ncomp[0],lcid);            delete [] lhs;  delete [] rhs;      delete [] lsm;}void dktelem::appstress (long lcid,long eid,vector &l,long fi,long ncomp,vector &sig){  long i,j,k;  ivector nodes(nne);  vector nodval(nne);    if (ncomp != sig.n){    fprintf (stderr,"\n\n wrong interval of indices in function stress (%s, line %d).\n",__FILE__,__LINE__);    abort ();  }      Mt->give_elemnodes (eid,nodes);  k=0;  for (i=fi;i<fi+ncomp;i++){    for (j=0;j<nne;j++){      nodval[j]=Mt->nodes[nodes[j]].stress[lcid*tncomp+i];    }    sig[k] = nodval[0]*l[0]+nodval[1]*l[1]+nodval[2]*l[2];    k++;  }  }void dktelem::allip_stresses (double **stre,long lcid,long eid,long ri,long ci){  long i,ipp;  vector sig(ncomp[0]),l(3),gp1(intordsm[0][0]),gp2(intordsm[0][0]),w(intordsm[0][0]);    gauss_points_tr (gp1.a,gp2.a,w.a,intordsm[0][0]);  ipp=Mt->elements[eid].ipp[ri][ci];        for (i=0;i<intordsm[0][0];i++){      l[0]=gp1[i]; l[1]=gp2[i];l[2]=1.0-l[0]-l[1];	  if (Mp->stressaver==0)	    appval (l,cncomp[0],ncomp[0],sig,stre);	  if (Mp->stressaver==1)	    appstress (lcid,eid,l,0,tncomp,sig);	Mm->storestress (lcid,ipp,sig);	ipp++;  }}void dktelem::stresses (long lcid,long eid,long ri, long ci){  long i,naep,ncp,sid;  double **stra,**stre;  vector coord,sig,l(3);    if (Mp->stressaver==0){    stra = new double* [nne];    stre = new double* [nne];    for (i=0;i<nne;i++){      stra[i] = new double [tncomp];      stre[i] = new double [tncomp];    }    elem_strains (stra,lcid,eid,ri,ci);    elem_stresses (stra,stre,lcid,eid,ri,ci);  }    switch (Mm->stre.tape[eid]){  case nowhere:{    break;  }  case intpts:{    allip_stresses (stre,lcid,eid,ri,ci);    break;  }  case enodes:{    break;  }  case userdefined:{    //  number of auxiliary element point    naep = Mm->stre.give_naep (eid);    ncp = Mm->stre.give_ncomp (eid);    sid = Mm->stre.give_sid (eid);    allocv (ncp,sig);    allocv (2,coord);    for (i=0;i<naep;i++){      Mm->stre.give_aepcoord (sid,i,coord);      l[0]=coord[0]; l[1]=coord[1];l[2]=1.0-coord[0]-coord[1];      if (Mp->stressaver==0)	appval (l,0,ncp,sig,stre);      if (Mp->stressaver==1)	appstress (lcid,eid,l,0,ncp,sig);      Mm->stre.storevalues(lcid,eid,i,sig);    }    destrv (sig);    destrv (coord);    break;  }  default:{    fprintf (stderr,"\n\n unknown stress point is required in function planeelemlq::stresses (%s, line %d).\n",__FILE__,__LINE__);  }  }  if (Mp->stressaver==0){    for (i=0;i<nne;i++){      delete [] stra[i];      delete [] stre[i];    }    delete [] stra;    delete [] stre;  }  }/**  function computes load vector from edge forces fz of the DKT  15.3.2002*/void dktelem::nodeforces (long eid,long *le,double *nv,vector &nf){  double cn0,sn0,cn1,sn1,cn2,sn2;  ivector nodes(nne);  vector x(nne),y(nne),dl(3);    Mt->give_elemnodes (eid,nodes);  Mt->give_node_coord2d (x,y,eid);  if (le[0]==1){    cn0= (y[1]-y[0])*dl[0]/60.;    sn0=-(x[1]-x[0])*dl[0]/60.;    nf[1]+=-(3.*nv[0]+2.*nv[3])*cn0;    nf[2]+=-(3.*nv[0]+2.*nv[3])*sn0;    nf[4]+= (2.*nv[0]+3.*nv[3])*cn0;    nf[5]+= (2.*nv[0]+3.*nv[3])*sn0;    nf[0]+=((2.-0.1)*nv[0] +(1.+0.1)*nv[3])*dl[0]/6.;    nf[3]+=((1.-0.1)*nv[0] +(2.+0.1)*nv[3])*dl[0]/6.;  }  if (le[1]==1){    cn1= (y[2]-y[1])*dl[1]/60.;    sn1=-(x[2]-x[1])*dl[1]/60.;    nf[4]+=-(3.*nv[1]+2.*nv[0])*cn1;    nf[5]+=-(3.*nv[1]+2.*nv[0])*sn1;    nf[7]+= (2.*nv[1]+3.*nv[0])*cn1;    nf[8]+= (2.*nv[1]+3.*nv[0])*sn1;    nf[3]+=((2.-0.1)*nv[3] +(1.+0.1)*nv[6])*dl[1]/6.;    nf[6]+=((1.-0.1)*nv[3] +(2.+0.1)*nv[6])*dl[1]/6.;  }  if (le[2]==1){    cn2= (y[0]-y[2])*dl[2]/60.;    sn2=-(x[0]-x[2])*dl[2]/60.;    nf[7]+=-(3.*nv[2]+2.*nv[1])*cn2;    nf[8]+=-(3.*nv[2]+2.*nv[1])*sn2;    nf[1]+= (2.*nv[2]+3.*nv[1])*cn2;    nf[2]+= (2.*nv[2]+3.*nv[1])*sn2;    nf[6]+=((2.-0.1)*nv[6] +(1.+0.1)*nv[9])*dl[2]/6.;    nf[0]+=((1.-0.1)*nv[6] +(2.+0.1)*nv[9])*dl[2]/6.;  }}/**  function computes load vector from area forces fz of the DKT  15.3.2002*/void dktelem::areaforces (long eid,double *nv,vector &nf){   double pl,cn0,cn1,cn2,sn0,sn1,sn2;   ivector nodes(nne);   vector x(nne),y(nne);   Mt->give_elemnodes (eid,nodes);   Mt->give_node_coord2d (x,y,eid);     pl = fabs(((x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]))/2.);   cn0= (y[1]-y[0])*pl/360.;   cn1= (y[2]-y[1])*pl/360.;   cn2= (y[0]-y[2])*pl/360.;   sn0=-(x[1]-x[0])*pl/360.;   sn1=-(x[2]-x[1])*pl/360.;   sn2=-(x[0]-x[2])*pl/360.;   nf[1]=-(7.*nv[0]+3.*nv[3]+5.*nv[6])*cn2+(7.*nv[0]+5.*nv[3]+3.*nv[6])*cn0;   nf[2]=-(7.*nv[0]+3.*nv[3]+5.*nv[6])*sn2+(7.*nv[0]+5.*nv[3]+3.*nv[6])*sn0;   nf[4]=-(5.*nv[0]+7.*nv[3]+3.*nv[6])*cn0+(3.*nv[0]+7.*nv[3]+5.*nv[6])*cn1;   nf[5]=-(5.*nv[0]+7.*nv[3]+3.*nv[6])*sn0+(3.*nv[0]+7.*nv[3]+5.*nv[6])*sn1;   nf[7]=-(3.*nv[0]+5.*nv[3]+7.*nv[6])*cn1+(5.*nv[0]+3.*nv[3]+7.*nv[6])*cn2;   nf[8]=-(3.*nv[0]+5.*nv[3]+7.*nv[6])*sn1+(5.*nv[0]+3.*nv[3]+7.*nv[6])*sn2;   nf[0]=(nv[0]/6. +nv[3]/12.+nv[6]/12.)*pl;   nf[3]=(nv[0]/12.+nv[3]/6. +nv[6]/12.)*pl;   nf[6]=(nv[0]/12.+nv[3]/12.+nv[6]/6. )*pl;}void dktelem::inicipval(long eid, long ri, long ci, matrix &nodval, inictype *ictn){  long i, j, k, ipp;  long ii, jj, nv = nodval.n;  long nstra;  double xi, eta;//  double ipval;  vector w, gp1, gp2, anv(nne);  nstra = 0;  for (j = 0; j < nv; j++) // for all initial values  {    for(i = 0; i < nne; i++) // for all nodes on element      anv[i] = nodval[i][j];    for (ii = 0; ii < nb; ii++)    {      for (jj = 0; jj < nb; jj++)      {        ipp=Mt->elements[eid].ipp[ri+ii][ci+jj];        if (intordsm[ii][jj] == 0)          continue;        allocv (intordsm[ii][jj],gp1);        allocv (intordsm[ii][jj],gp2);        allocv (intordsm[ii][jj],w);        gauss_points_tr (gp1.a, gp2.a, w.a, intordsm[ii][jj]);        for (k = 0; k < intordsm[ii][jj]; k++)        {          xi=gp1[k];          eta=gp2[k];          //  value in integration point//          ipval = approx_nat(xi, eta, anv);          if ((ictn[i] & inistrain) && (j < Mm->ip[ipp].ncompstr))          {            //Mm->ip[ipp].strain[j] += ipval;            ipp++;            continue;          }          if ((ictn[i] & inistress) && (j < nstra + Mm->ip[ipp].ncompstr))          {            //Mm->ip[ipp].stress[j] += ipval;            ipp++;            continue;          }          if ((ictn[i] & iniother) && (j < nv))          {            //Mm->ip[ipp].other[j] += ipval;            ipp++;            continue;          }          ipp++;        }        destrv(gp1);  destrv (gp2);  destrv (w);      }    }    if (ictn[i] & inistrain) nstra++;  }}

⌨️ 快捷键说明

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