Beispiel #1
0
 inline UL& get_rev_diag( UL x )
 {
     if( x <size_max()/2 )
     {
         PUL ind = tri_ind(x , size_x() , size_y() );
         return get_x_y( ind.first , size_y() - ind.second - 1 );
     }
     else
     {
         UL xm = size_max() - x -1;
         PUL ind = tri_ind(xm , size_x() , size_y() );
         return get_x_y( size_x() - ind.first - 1 , ind.second );
     }
 }
Beispiel #2
0
// make C8 element stiffness matrix
void CHak3DCont_8::makeKe()
{
	int i,j,k,inc; //,err;
	double sum, Jdet;
	Coord3D gp;
	Coord3D np[8];

	if(Ke){delete [] Ke;}
	Ke = new double [300]();

	// read in node coordinates
	getNcrd(np);

	// get material property matrix
    double *Em = Mat->getD();

	double B[144];	// Strain displacement matrix (6 x 24)
	double Bt[144];	// Auxillary matrix

	// use 2 point Gauss rule (8 points total)
	for(i=0;i<8;i++)
	{
		gp.x = gauss2 * c8_pos[i].x;
		gp.y = gauss2 * c8_pos[i].y;
		gp.z = gauss2 * c8_pos[i].z;

		// compute isoparametric B matrix (6 x 24)
		Jdet = C8_isoBMat(gp, np, B);

        if(Jdet < 1.0E-12 || Jdet > 1.0E+15)
        {
            std::cout << "\nERROR in makeKe for C8 element, Jdet = " << Jdet;
        }

		// first multiply B^T * D
		cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, 24, 6, 6, 1.0, B, 24, Em, 6, 0.0, Bt, 6);

		// complete multiplication (for upper triangle only)
		for(j=0;j<24;j++) // rows
		{
			for(k=j;k<24;k++) // columns (upper triangle)
			{
				sum = 0.0;
				for(inc=0;inc<6;inc++)
				{
					sum += Bt[index2(j,inc,6)]*B[index2(inc,k,24)];
				}
				Ke[tri_ind(24,j,k)] += sum*Jdet; //*weight;
			}
		}
	}
}