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

📄 quadcg.c

📁 工程中有限元程序,采用C语言编制,包括所有经典的有限元问题!
💻 C
📖 第 1 页 / 共 2 页
字号:
	printf("run bestfitq and then contourA or contourB to plot stresses\n");
	}

     return(0);
   }

integ(xni)
  double xni[][2];
  {
    double c;
   /* ----- integration points xni() ----- */
     c = .57735026919;
     xni[0][0] = -c;
     xni[0][1] = -c;
     xni[1][0] = c;
     xni[1][1] = -c;
     xni[2][0] = c;
     xni[2][1] = c;
     xni[3][0] = -c;
     xni[3][1] = c;
     return(0);
  }

dmatrix(n,pm,mat,npr,pnu1,al1,lc,d)
   int lc,n,npr,*mat;
   double *pm,*pnu1,*al1,d[][3];
  {
     int m;
     double e,c,c1,c2,c3,pnu,al;
   /* -----  d() matrix  ----- */
     /* --- material properties --- */
     m = mat[n]-1;
     e = pm[npr*m];
     pnu= pm[npr*m+1];
     al = pm[npr*m+2];
     *pnu1 = pnu;
     *al1 = al;
     /* --- d() matrix --- */
     if (lc == 1) {
        /* --- plane stress --- */
        c1 = e / (1 - pnu * pnu);
        c2 = c1 * pnu;
        }
     else {
        /* --- plane strain --- */
        c = e / ((1 + pnu) * (1 - 2 * pnu));
        c1 = c * (1 - pnu);
        c2 = c * pnu;
        }
     c3 = .5 * e / (1 + pnu);
     d[0][0] = c1;
     d[0][1] = c2;
     d[0][2] = 0;
     d[1][0] = c2;
     d[1][1] = c1;
     d[1][2] = 0;
     d[2][0] = 0;
     d[2][1] = 0;
     d[2][2] = c3;
     return(0);
  }

  elstif(n,lc,s,tl,xni,d,thick,tempr,x,al,pnu,noc)
    int n,lc,*noc;
    double al,pnu;
    double *x,*tempr,*thick,d[][3],tl[8],s[][8][8],xni[][2];
  {
    int i,j,k,ip;
    double dte,c,xi,eta,th,dj,b[3][8],db[3][8];
    /* -----  element stiffness and temperature load  ----- */
     for (i = 0; i < 8;i++) {
	 for (j = 0; j < 8; j++) {
	     s[n][i][j] = 0.;
	     }
	 tl[i] = 0.;
	 }
     dte = tempr[n];
     /* --- weight factor is one --- */
     /* --- loop on integration points --- */
     for (ip = 0; ip < 4; ip++) {
        /* ---  get db matrix at integration point ip --- */
        xi = xni[ip][0];
	eta = xni[ip][1];
	dbmat(n,x,noc,thick,&th,d,b,db,&dj,xi,eta);
	/* --- element stiffness matrix  se --- */
	for (i = 0; i < 8; i++) {
           for (j = 0; j < 8; j++) {
              c = 0;
              for (k = 0; k < 3; k++) {
                 c = c + b[k][i] * db[k][j] * dj * th;
                 }
              s[n][i][j] = s[n][i][j] + c;
              }
	   }
	/* --- determine temperature load tl --- */
	c = al * dte;
	if (lc == 2)
	    c = (1 + pnu) * c;
        for (i = 0; i < 8; i++) {
           tl[i] = tl[i] + th * dj * c * (db[0][i] + db[1][i]);
           }
	}
     return(0);
   }
dbmat(n,x,noc,thick,th1,d,b,db,dj1,xi,eta)
  double *x,*dj1,*thick,*th1,xi,eta;
  double d[][3],b[][8],db[][8];
  int n,*noc;
  {
   int n1,n2,n3,n4,i,j,k;
   double x1,y1,x2,y2,x3,y3,x4,y4,tj11,tj12,tj21,tj22,dj,c;
   double th,a[3][4],g[4][8];
   /* -----  db()  matrix  ----- */
     /* --- nodal coordinates --- */     
     th = thick[n];
     *th1 = th;
     n1 = noc[4*n];
     n2 = noc[4*n+1];
     n3 = noc[4*n+2];
     n4 = noc[4*n+3];
     x1 = x[2*(n1-1)];
     y1 = x[2*(n1-1)+1];
     x2 = x[2*(n2-1)];
     y2 = x[2*(n2-1)+1];
     x3 = x[2*(n3-1)];
     y3 = x[2*(n3-1)+1];
     x4 = x[2*(n4-1)];
     y4 = x[2*(n4-1)+1];
     /* --- formation of jacobian  tj --- */
     tj11 = ((1 - eta) * (x2 - x1) + (1 + eta) * (x3 - x4)) / 4;
     tj12 = ((1 - eta) * (y2 - y1) + (1 + eta) * (y3 - y4)) / 4;
     tj21 = ((1 - xi) * (x4 - x1) + (1 + xi) * (x3 - x2)) / 4;
     tj22 = ((1 - xi) * (y4 - y1) + (1 + xi) * (y3 - y2)) / 4;
     /* --- determinant of the jacobian --- */
     dj = tj11 * tj22 - tj12 * tj21;
     *dj1 = dj;
     /* --- a[3,4] matrix relates strains to --- */
     /* --- local derivatives of u --- */
     a[0][0] = tj22 / dj;
     a[1][0] = 0;
     a[2][0] = -tj21 / dj;
     a[0][1] = -tj12 / dj;
     a[1][1] = 0;
     a[2][1] = tj11 / dj;
     a[0][2] = 0;
     a[1][2] = -tj21 / dj;
     a[2][2] = tj22 / dj;
     a[0][3] = 0;
     a[1][3] = tj11 / dj;
     a[2][3] = -tj12 / dj;
     /* --- g[4,8] matrix relates local derivatives of u --- */
     /* --- to local nodal displacements q[8] --- */
     for (i = 0; i < 4; i++) {
	     for (j = 0; j < 8; j++) {
             g[i][j] = 0;
	         }
	     }
     g[0][0] = -(1 - eta) / 4;
     g[1][0] = -(1 - xi) / 4;
     g[2][1] = -(1 - eta) / 4;
     g[3][1] = -(1 - xi) / 4;
     g[0][2] = (1 - eta) / 4;
     g[1][2] = -(1 + xi) / 4;
     g[2][3] = (1 - eta) / 4;
     g[3][3] = -(1 + xi) / 4;
     g[0][4] = (1 + eta) / 4;
     g[1][4] = (1 + xi) / 4;
     g[2][5] = (1 + eta) / 4;
     g[3][5] = (1 + xi) / 4;
     g[0][6] = -(1 + eta) / 4;
     g[1][6] = (1 - xi) / 4;
     g[2][7] = -(1 + eta) / 4;
     g[3][7] = (1 - xi) / 4;
     /* --- b[3,8] matrix relates strains to q --- */
     for (i = 0; i < 3; i++) {
        for (j = 0; j < 8; j++) {
           c = 0;
           for (k = 0; k < 4; k++) {
               c = c + a[i][k] * g[k][j];
               }
           b[i][j] = c;
           }
        }
     /* --- db[3,8] matrix relates stresses to q[8] --- */
     for (i = 0; i < 3; i++) {
        for (j = 0; j < 8; j++) {
           c = 0;
           for (k = 0; k < 3; k++) {
               c = c + d[i][k] * b[k][j];
               }
	   db[i][j] = c;
	   }
	}
     return(0);
   }

/* ----- cgsolve ----- */
cgsolve(s,f,q,ad,dd,gg,noc,cnst,nu,mpc,nmpc,beta,nd,nq,ne)
  int nq, *nu, nmpc, nd, ne, *noc, mpc[][2];
  double s[][8][8], *f, *q, *ad, *dd, *gg, cnst, beta[][3];
{
 int i,j,n,ii,jj,i1,j1,i2,il,jl,ig,jg,igy,ilt;
 int igt,jgt,jlt,iter=0;
  double gg1,gg2,dad,c,al,bta;
  /* ----- Conjugate Gradient Method ----- */
  for (i = 0; i < nq; i++) {
      gg[i] = -f[i];
      dd[i] = f[i];
      q[i] = 0.;
      gg1 = gg1 + gg[i] * gg[i];
     }
  /* --- iteration loop --- */
  do {
     iter = iter + 1;
     /* =====  element loop  ===== */
     for (n = 0; n < ne; n++) {
	for (i = 0; i < 4; i++) {

           igt = 2 * (noc[4*n + i] - 1);
	   ilt = 2 * i;
           for (ii = 0; ii < 2; ii++){
              ig = igt + ii;
              il = ilt + ii;
              for (j = 0; j < 4; j++) {
                 jgt = 2 * (noc[4*n +j] - 1);
		 jlt = 2 * j;
                 for (jj = 0; jj < 2; jj++){
                    jg = jgt + jj;
                    jl = jlt + jj;
                    ad[ig] = ad[ig] + s[n][il][jl] * dd[jg];
                 }
              }
           }
         }
      }
     /* --- displacement bc --- */
     for (i = 0; i < nd; i++) {
        n = nu[i] - 1;
	ad[n] = ad[n] + cnst * dd[n];
      }
     /* --- multi-point constraints --- */
     for (i = 0; i < nmpc; i++) {
        i1 = mpc[i][1];
        i2 = mpc[i][2];
	c = beta[i][1] * dd[i1] + beta[i][2] * dd[i2];
        ad[i1] = ad[i1] + cnst * beta[i][1] * c;
        ad[i2] = ad[i2] + cnst * beta[i][2] * c;
      }
        dad = 0.;
        for (i = 0; i < nq; i++) {
           dad = dad + dd[i] * ad[i];
        }
        al = gg1 / dad;
        gg2 = 0.;
        for (i = 0; i < nq; i++) {
           gg[i] = gg[i] + al * ad[i];
           q[i] = q[i] + al * dd[i];
           gg2 = gg2 + gg[i] * gg[i];
	 }
	if (gg2 > 0.00000001) {
          bta = gg2 / gg1;
          gg1 = gg2;
          for (i = 0; i < nq; i++) {
           dd[i] = -gg[i] + bta * dd[i];
          }
          for (i = 0; i < nq; i++) {
            ad[i] = 0.;
          }
        }
   } while (gg2 > 0.00000001);
    return(0);
}

⌨️ 快捷键说明

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