ME751 Advanced Computational Multibody Dynamics
November 23, 2016
Antonio Recuero University of Wisconsin-Madison
ME751 Advanced Computational Multibody Dynamics November 23, 2016 - - PowerPoint PPT Presentation
ME751 Advanced Computational Multibody Dynamics November 23, 2016 Antonio Recuero University of Wisconsin-Madison Before we get started Last time, we learned: Plates and shells Introduce Chronos bilinear ANCF shell element
Antonio Recuero University of Wisconsin-Madison
Last time, we learned:
Plates and shells
Introduce Chrono’s bilinear ANCF shell element
Kinematics of ANCF shell element
Curvilinear initial configuration
Inertia forces
Internal forces
This lecture…
Homework
Convergence
Locking Issues
Assumed Natural Strain
Enhanced Assumed Strain
Implementation in Chrono
Examples
2
3
4
5
Current deformed reference
6
7
8
Final expression! These strains are related to constitutive equations
9
10
11
12
13
14
Rigid body Strain modes Hourglass modes
A uniform strain hexahedron and quadrilateral with hourglass control: Flanagan and Belytschko, 1981
15
16
17
18
Substitution
compatible strains in equations
19
20
21
22
23
Substitution of thickness strain
24 void MyForce::Evaluate(ChMatrixNM<double, 54, 1>& result, const double x, const double y, const double z) { // Element shape function ChMatrixNM<double, 1, 8> N; m_element‐>ShapeFunctions(N, x, y, z); // Determinant of position vector gradient matrix: Initial configuration ChMatrixNM<double, 1, 8> Nx; ChMatrixNM<double, 1, 8> Ny; ChMatrixNM<double, 1, 8> Nz; ChMatrixNM<double, 1, 3> Nx_d0; ChMatrixNM<double, 1, 3> Ny_d0; ChMatrixNM<double, 1, 3> Nz_d0; double detJ0 = m_element‐>Calc_detJ0(x, y, z, Nx, Ny, Nz, Nx_d0, Ny_d0, Nz_d0); // ANS shape function ChMatrixNM<double, 1, 4> S_ANS; // Shape function vector for Assumed Natural Strain ChMatrixNM<double, 6, 5> M; // Shape function vector for Enhanced Assumed Strain m_element‐>ShapeFunctionANSbilinearShell(S_ANS, x, y); m_element‐>Basis_M(M, x, y, z); // Transformation : Orthogonal transformation (A and J) ChVector<double> G1xG2; // Cross product of first and second column of double G1dotG1; // Dot product of first column of position vector gradient G1xG2.x = Nx_d0[0][1] * Ny_d0[0][2] ‐ Nx_d0[0][2] * Ny_d0[0][1]; G1xG2.y = Nx_d0[0][2] * Ny_d0[0][0] ‐ Nx_d0[0][0] * Ny_d0[0][2]; G1xG2.z = Nx_d0[0][0] * Ny_d0[0][1] ‐ Nx_d0[0][1] * Ny_d0[0][0]; G1dotG1 = Nx_d0[0][0] * Nx_d0[0][0] + Nx_d0[0][1] * Nx_d0[0][1] + Nx_d0[0][2] * Nx_d0[0][2]; // Tangent Frame ChVector<double> A1; ChVector<double> A2; ChVector<double> A3; A1.x = Nx_d0[0][0]; A1.y = Nx_d0[0][1]; A1.z = Nx_d0[0][2]; A1 = A1 / sqrt(G1dotG1); A3 = G1xG2.GetNormalized(); A2.Cross(A3, A1); Evaluation of 3D shape functions Shape function derivatives Vectors of initial deformation gradient New interpolation for ANS Interpolation for 5 internal parameters Covariant vector base, initial config. Normalization
25 // Direction for orthotropic material double theta = m_element‐>GetLayer(m_kl).Get_theta(); // Fiber angle ChVector<double> AA1; ChVector<double> AA2; ChVector<double> AA3; AA1 = A1 * cos(theta) + A2 * sin(theta); AA2 = ‐A1 * sin(theta) + A2 * cos(theta); AA3 = A3; /// Beta ChMatrixNM<double, 3, 3> j0; ChVector<double> j01; ChVector<double> j02; ChVector<double> j03; ChMatrixNM<double, 9, 1> beta; // Calculates inverse of rd0 (j0) (position vector gradient: Initial Configuration) j0(0, 0) = Ny_d0[0][1] * Nz_d0[0][2] ‐ Nz_d0[0][1] * Ny_d0[0][2]; j0(0, 1) = Ny_d0[0][2] * Nz_d0[0][0] ‐ Ny_d0[0][0] * Nz_d0[0][2]; j0(0, 2) = Ny_d0[0][0] * Nz_d0[0][1] ‐ Nz_d0[0][0] * Ny_d0[0][1]; j0(1, 0) = Nz_d0[0][1] * Nx_d0[0][2] ‐ Nx_d0[0][1] * . . . j0.MatrDivScale(detJ0); j01(0) = j0(0, 0); j02(0) = j0(1, 0); j03(0) = j0(2, 0); . . . j02(2) = j0(1, 2); j03(2) = j0(2, 2); // Coefficients of contravariant transformation beta(0, 0) = Vdot(AA1, j01); beta(1, 0) = Vdot(AA2, j01); beta(2, 0) = Vdot(AA3, j01); . . . beta(7, 0) = Vdot(AA2, j03); beta(8, 0) = Vdot(AA3, j03); // Transformation matrix, function of fiber angle const ChMatrixNM<double, 6, 6>& T0 = m_element‐ >GetLayer(m_kl).Get_T0(); // Determinant of the initial position vector gradient at the element center double detJ0C = m_element‐>GetLayer(m_kl).Get_detJ0C(); // Enhanced Assumed Strain ChMatrixNM<double, 6, 5> G = T0 * M * (detJ0C / detJ0); ChMatrixNM<double, 6, 1> strain_EAS = G * (*m_alpha_eas); ChMatrixNM<double, 8, 1> ddNx; ChMatrixNM<double, 8, 1> ddNy; ChMatrixNM<double, 8, 1> ddNz; ddNx.MatrMultiplyT(m_element‐>m_ddT, Nx); ddNy.MatrMultiplyT(m_element‐>m_ddT, Ny); ddNz.MatrMultiplyT(m_element‐>m_ddT, Nz); Transform orthogonal system with direction of fiber (orthotropic material) Calculate beta coefficients Constant transformation to account for initial configuration EAS calculation
26 ChMatrixNM<double, 8, 1> ddNx; ChMatrixNM<double, 8, 1> ddNy; ChMatrixNM<double, 8, 1> ddNz; ddNx.MatrMultiplyT(m_element‐>m_ddT, Nx); ddNy.MatrMultiplyT(m_element‐>m_ddT, Ny); ddNz.MatrMultiplyT(m_element‐>m_ddT, Nz); ChMatrixNM<double, 8, 1> d0d0Nx; ChMatrixNM<double, 8, 1> d0d0Ny; ChMatrixNM<double, 8, 1> d0d0Nz; d0d0Nx.MatrMultiplyT(m_element‐>m_d0d0T, Nx); d0d0Ny.MatrMultiplyT(m_element‐>m_d0d0T, Ny); d0d0Nz.MatrMultiplyT(m_element‐>m_d0d0T, Nz); Derivatives w.r.t. coordinates
27
// Strain component ChMatrixNM<double, 6, 1> strain_til; strain_til(0, 0) = 0.5 * ((Nx * ddNx)(0, 0) ‐ (Nx * d0d0Nx)(0, 0)); strain_til(1, 0) = 0.5 * ((Ny * ddNy)(0, 0) ‐ (Ny * d0d0Ny)(0, 0)); strain_til(2, 0) = (Nx * ddNy)(0, 0) ‐ (Nx * d0d0Ny)(0, 0); strain_til(3, 0) = N(0, 0) * m_element‐>m_strainANS(0, 0) + N(0, 2) * m_element‐>m_strainANS(1, 0) + N(0, 4) * m_element‐>m_strainANS(2, 0) + N(0, 6) * m_element‐>m_strainANS(3, 0); strain_til(4, 0) = S_ANS(0, 2) * m_element‐>m_strainANS(6, 0) + S_ANS(0, 3) * m_element‐>m_strainANS(7, 0); strain_til(5, 0) = S_ANS(0, 0) * m_element‐>m_strainANS(4, 0) + S_ANS(0, 1) * m_element‐>m_strainANS(5, 0); // For orthotropic material ChMatrixNM<double, 6, 1> strain; strain(0, 0) = strain_til(0, 0) * beta(0) * beta(0) + strain_til(1, 0) * beta(3) * beta(3) + strain_til(2, 0) * beta(0) * beta(3) + strain_til(3, 0) * beta(6) * beta(6) + strain_til(4, 0) * beta(0) * beta(6) + strain_til(5, 0) * beta(3) * beta(6); . . . strain(5, 0) = strain_til(0, 0) * 2.0 * beta(1) * beta(2) + strain_til(1, 0) * 2.0 * beta(4) * beta(5) + strain_til(2, 0) * (beta(2) * beta(4) + beta(1) * beta(5)) + strain_til(3, 0) * 2.0 * beta(7) * beta(8) + strain_til(4, 0) * (beta(2) * beta(7) + beta(1) * beta(8)) + strain_til(5, 0) * (beta(5) * beta(7) + beta(4) * beta(8));
Calculation of covariant compatible strains ANS: Transverse shear and thickness strain Beta matrix/vector multiplication
28 // Strain derivative component ChMatrixNM<double, 6, 24> strainD_til; ChMatrixNM<double, 1, 24> tempB; ChMatrixNM<double, 1, 24> tempBB; ChMatrixNM<double, 1, 3> tempB3; ChMatrixNM<double, 1, 3> tempB31; strainD_til.Reset(); tempB3.MatrMultiply(Nx, m_element‐>m_d); for (int i = 0; i < 8; i++) { for (int j = 0; j < 3; j++) { tempB(0, i * 3 + j) = tempB3(0, j) * Nx(0, i); } } strainD_til.PasteClippedMatrix(&tempB, 0, 0, 1, 24, 0, 0); tempB3.MatrMultiply(Ny, m_element‐>m_d); for (int i = 0; i < 8; i++) { for (int j = 0; j < 3; j++) { tempB(0, i * 3 + j) = tempB3(0, j) * Ny(0, i); } } strainD_til.PasteClippedMatrix(&tempB, 0, 0, 1, 24, 1, 0); tempB31.MatrMultiply(Nx, m_element‐>m_d); for (int i = 0; i < 8; i++) { for (int j = 0; j < 3; j++) { tempB(0, i * 3 + j) = tempB3(0, j) * Nx(0, i) + tempB31(0, j) * Ny(0, i); } } . . . strainD_til.PasteClippedMatrix(&tempB, 0, 0, 1, 24, 5, 0);
// For orthotropic material ChMatrixNM<double, 6, 24> strainD; // Derivative
for (int ii = 0; ii < 24; ii++) { strainD(0, ii) = strainD_til(0, ii) * beta(0) * beta(0) + strainD_til(1, ii) * beta(3) * beta(3) + strainD_til(2, ii) * beta(0) * beta(3) + strainD_til(3, ii) * beta(6) * beta(6) + strainD_til(4, ii) * beta(0) * beta(6) + strainD_til(5, ii) * beta(3) * beta(6); . . . strainD(5, ii) = strainD_til(0, ii) * 2.0 * beta(1) * beta(2) + strainD_til(1, ii) * 2.0 * beta(4) * beta(5) + strainD_til(2, ii) * (beta(2) * beta(4) + beta(1) * beta(5)) + strainD_til(3, ii) * 2.0 * beta(7) * beta(8) + strainD_til(4, ii) * (beta(2) * beta(7) + beta(1) * beta(8)) + strainD_til(5, ii) * (beta(5) * beta(7) + beta(4) * beta(8)); } Derivative of covariant strains w.r.t. coordinates: Needed for generalized forces and Jacobians Calculations Pre- and post- multiplication by beta vector: Derivate of engineering strain
29 // Enhanced Assumed Strain 2nd strain += strain_EAS; // Strain time derivative for structural damping ChMatrixNM<double, 6, 1> DEPS; DEPS.Reset(); for (int ii = 0; ii < 24; ii++) { DEPS(0, 0) = DEPS(0, 0) + strainD(0, ii) * m_element‐>m_d_dt(ii, 0); DEPS(1, 0) = DEPS(1, 0) + strainD(1, ii) * m_element‐>m_d_dt(ii, 0); DEPS(2, 0) = DEPS(2, 0) + strainD(2, ii) * m_element‐>m_d_dt(ii, 0); DEPS(3, 0) = DEPS(3, 0) + strainD(3, ii) * m_element‐>m_d_dt(ii, 0); DEPS(4, 0) = DEPS(4, 0) + strainD(4, ii) * m_element‐>m_d_dt(ii, 0); DEPS(5, 0) = DEPS(5, 0) + strainD(5, ii) * m_element‐>m_d_dt(ii, 0); } // Add structural damping strain += DEPS * m_element‐>m_Alpha; // Matrix of elastic coefficients: the input assumes the material *could* be orthotropic const ChMatrixNM<double, 6, 6>& E_eps = m_element‐>GetLayer(m_kl).GetMaterial()‐>Get_E_eps(); // Internal force calculation ChMatrixNM<double, 24, 6> tempC; tempC.MatrTMultiply(strainD, E_eps); ChMatrixNM<double, 24, 1> Fint = (tempC * strain) * (detJ0 * m_element‐>m_GaussScaling); // EAS terms ChMatrixNM<double, 5, 6> temp56; temp56.MatrTMultiply(G, E_eps); ChMatrixNM<double, 5, 1> HE = (temp56 * strain) * (detJ0 * m_element‐>m_GaussScaling); // EAS residual ChMatrixNM<double, 5, 5> KALPHA = (temp56 * G) * (detJ0 * m_element‐>m_GaussScaling); // EAS Jacobian /// Total result vector result.PasteClippedMatrix(&Fint, 0, 0, 24, 1, 0, 0); Sum enhanced assumed strain Add structural damping (not covered, but straightforward) Generalized force per Gauss point EAS generalized force and Jacobian
30
31
32
33