blob: e4101173fc2d9e58c24f596910a84db3afaf19f1 [file] [log] [blame]
//#####################################################################
// Copyright 2004, Eftychios Sifakis, Joseph Teran.
// This file is part of PhysBAM whose distribution is governed by the license contained in the accompanying file PHYSBAM_COPYRIGHT.txt.
//#####################################################################
// Class DIAGONALIZED_ISOTROPIC_STRESS_DERIVATIVE_3D
//#####################################################################
#ifndef __DIAGONALIZED_ISOTROPIC_STRESS_DERIVATIVE_3D__
#define __DIAGONALIZED_ISOTROPIC_STRESS_DERIVATIVE_3D__
namespace PhysBAM
{
template<class T> class MATRIX_3X3;
template<class T>
class DIAGONALIZED_ISOTROPIC_STRESS_DERIVATIVE_3D
{
public:
T x1111, x2211, x3311, x2222, x3322, x3333; // 3x3 block
T x2121, x2112; // 2x2 block
T x3131, x3113; // 2x2 block
T x3223, x3232; // 2x2 block
MATRIX_3X3<T> Differential (const MATRIX_3X3<T>& dF) const
{
return MATRIX_3X3<T> (x1111 * dF.x[0] + x2211 * dF.x[4] + x3311 * dF.x[8], x2121 * dF.x[1] + x2112 * dF.x[3], x3131 * dF.x[2] + x3113 * dF.x[6],
x2112 * dF.x[1] + x2121 * dF.x[3], x2211 * dF.x[0] + x2222 * dF.x[4] + x3322 * dF.x[8], x3232 * dF.x[5] + x3223 * dF.x[7],
x3113 * dF.x[2] + x3131 * dF.x[6], x3223 * dF.x[5] + x3232 * dF.x[7], x3311 * dF.x[0] + x3322 * dF.x[4] + x3333 * dF.x[8]);
}
void Fix_Indefinite_Blocks()
{
SYMMETRIC_MATRIX_3X3<T> A1 (x1111, x2211, x3311, x2222, x3322, x3333);
DIAGONAL_MATRIX_3X3<T> D1;
MATRIX_3X3<T> V1;
A1.Fast_Solve_Eigenproblem (D1, V1);
D1 = D1.Max (0);
A1 = SYMMETRIC_MATRIX_3X3<T>::Conjugate (V1, D1);
x1111 = A1.x11;
x2211 = A1.x21;
x3311 = A1.x31;
x2222 = A1.x22;
x3322 = A1.x32;
x3333 = A1.x33;
SYMMETRIC_MATRIX_2X2<T> A2 (x2121, x2112, x2121);
DIAGONAL_MATRIX_2X2<T> D2;
MATRIX_2X2<T> V2;
A2.Solve_Eigenproblem (D2, V2);
D2 = D2.Max (0);
A2 = SYMMETRIC_MATRIX_2X2<T>::Conjugate (V2, D2);
x2121 = A2.x11;
x2112 = A2.x21;
SYMMETRIC_MATRIX_2X2<T> A3 (x3131, x3113, x3131);
DIAGONAL_MATRIX_2X2<T> D3;
MATRIX_2X2<T> V3;
A3.Solve_Eigenproblem (D3, V3);
D3 = D3.Max (0);
A3 = SYMMETRIC_MATRIX_2X2<T>::Conjugate (V3, D3);
x3131 = A3.x11;
x3113 = A3.x21;
SYMMETRIC_MATRIX_2X2<T> A4 (x3232, x3223, x3232);
DIAGONAL_MATRIX_2X2<T> D4;
MATRIX_2X2<T> V4;
A4.Solve_Eigenproblem (D4, V4);
D4 = D4.Max (0);
A4 = SYMMETRIC_MATRIX_2X2<T>::Conjugate (V4, D4);
x3232 = A4.x11;
x3223 = A4.x21;
}
//#####################################################################
};
}
#endif