示例#1
0
文件: Tri3.cpp 项目: Luxios/FESolve
void Tri3::GetStiffnessMatrix(Matrix<FEdouble>* S)
{
	Node* node1 = _model->GetNode(_node1);
	Node* node2 = _model->GetNode(_node2);
	Node* node3 = _model->GetNode(_node3);
	Matrix<FEdouble>* Fe = new Matrix<FEdouble>(3,6);
	(*Fe)(0,0) = (*Fe)(2,1) = node2->GetY()-node3->GetY();
	(*Fe)(2,0) = (*Fe)(1,1) = -(node2->GetX()-node3->GetX());
	(*Fe)(0,2) = (*Fe)(2,3) = node3->GetY()-node1->GetY();
	(*Fe)(2,2) = (*Fe)(1,3) = -(node3->GetX()-node1->GetX());
	(*Fe)(0,4) = (*Fe)(2,5) = node1->GetY()-node2->GetY();
	(*Fe)(2,4) = (*Fe)(1,5) = -(node1->GetX()-node2->GetX());

	FEdouble F = 0.5*static_cast<FEdouble>(fabs(
		node1->GetX()*(node2->GetY()-node3->GetY())+
		node2->GetX()*(node3->GetY()-node1->GetY())+
		node3->GetX()*(node1->GetY()-node2->GetY())
		));

	(*Fe)*=1/(2*F);

	Material* mat = _model->GetMaterial(_mat);

	FEdouble D = mat->GetEmodul()*_thickness/(1-(mat->GetNue()*mat->GetNue()));

	Matrix<FEdouble>* E = new Matrix<FEdouble>(3);
	(*E)(0,0) = (*E)(1,1) = D;
	(*E)(1,0) = (*E)(0,1) = D*mat->GetNue();
	(*E)(2,2) = 0.5*D*(1-mat->GetNue());

	Matrix<FEdouble> K = (*E)*(*Fe);
	Fe->Transpose();

	(*S) = (*Fe)*K;
	(*S)*=F;
	
}