void OrthotropicLinearElasticMaterial :: giveTensorRotationMatrix(FloatMatrix &answer, GaussPoint *gp) // // returns [3,3] rotation matrix from local principal axes of material // to local axes used at gp (element) level // { int elementCsFlag; FloatMatrix elementCs; StructuralElement *element = static_cast< StructuralElement * >( gp->giveElement() ); if ( gp->giveMaterialMode() == _1dMat ) { //do not rotate 1D materials on trusses and beams answer.resize(3, 3); answer.beUnitMatrix(); return; } elementCsFlag = element->giveLocalCoordinateSystem(elementCs); // // in localCoordinateSystem the directional cosines are stored columwise (exception) // in elementCs rowwise. // if ( this->cs_type == localCS ) { // // in localCoordinateSystem are stored directional cosines // if ( elementCsFlag ) { answer.beProductOf(elementCs, * this->localCoordinateSystem); } else { answer = * this->localCoordinateSystem; } } else if ( this->cs_type == shellCS ) { FloatArray elementNormal, helpx, helpy; localCoordinateSystem = new FloatMatrix(3, 3); element->computeMidPlaneNormal(elementNormal, gp); helpx.beVectorProductOf(* ( this->helpPlaneNormal ), elementNormal); // test if localCoordinateSystem is uniquely // defined by elementNormal and helpPlaneNormal if ( helpx.computeNorm() < ZERO_LENGTH ) { OOFEM_ERROR("element normal parallel to plane normal encountered"); } helpy.beVectorProductOf(elementNormal, helpx); for ( int i = 1; i < 4; i++ ) { localCoordinateSystem->at(i, 1) = helpx.at(i); localCoordinateSystem->at(i, 2) = helpy.at(i); localCoordinateSystem->at(i, 3) = elementNormal.at(i); } // // possible rotation about local z-axis should be considered in future // /* * // * // GiveZRotationMtrx assembles rotMtrx from cs rotated from curent about rotAngle * // to current cs * // * zRotMtrx = GiveZRotationMtrx (rotAngle); // rotAngle supplied by user * rotatedLocalCoordinateSystem = localCoordinateSystem->Times (zRotMtrx); * delete localCoordinateSystem; * localCoordinateSystem = rotatedLocalCoordinateSystem; */ if ( elementCsFlag ) { answer.beProductOf(elementCs, * this->localCoordinateSystem); } else { answer = * this->localCoordinateSystem; } delete localCoordinateSystem; localCoordinateSystem = NULL; } else { OOFEM_ERROR("internal error no cs defined"); } // t at (i,j) contains cosine of angle between elementAxis(i) and localMaterialAxis(j). }