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 ); } }
// 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; } } } }