// // Created by cflin on 6/12/23. // #include "ThermalLinearFEA.h" namespace da { namespace sha { namespace top { Eigen::MatrixXd ThermalLinearFEA::computeKe() { Eigen::Vector2d GP(-1.0 / sqrt(3.0), 1.0 / sqrt(3.0)); Eigen::Vector2d GW(1.0, 1.0); Eigen::Matrix heatKe; heatKe.setZero(); Eigen::Matrix tmp{ {-a, -b, -c}, {a, -b, -c}, {a, b, -c}, {-a, b, -c}, {-a, -b, c}, {a, -b, c}, {a, b, c}, {-a, b, c} }; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { double x = GP(i), y = GP(j), z = GP(k); Eigen::RowVector dNx{-(1.0 - y) * (1.0 - z) / 8.0, (1.0 - y) * (1.0 - z) / 8.0, (1.0 + y) * (1.0 - z) / 8.0, -(1.0 + y) * (1.0 - z) / 8.0, -(1.0 - y) * (1.0 + z) / 8.0, (1.0 - y) * (1.0 + z) / 8.0, (1.0 + y) * (1.0 + z) / 8.0, -(1.0 + y) * (1.0 + z) / 8.0}; Eigen::RowVector dNy{-(1.0 - x) * (1.0 - z) / 8.0, -(1.0 + x) * (1.0 - z) / 8.0, (1.0 + x) * (1.0 - z) / 8.0, (1.0 - x) * (1.0 - z) / 8.0, -(1.0 - x) * (1.0 + z) / 8.0, -(1.0 + x) * (1.0 + z) / 8.0, (1.0 + x) * (1.0 + z) / 8.0, (1.0 - x) * (1.0 + z) / 8.0}; Eigen::RowVector dNz{-(1.0 - x) * (1.0 - y) / 8.0, -(1.0 + x) * (1.0 - y) / 8.0, -(1.0 + x) * (1.0 + y) / 8.0, -(1.0 - x) * (1.0 + y) / 8.0, (1.0 - x) * (1.0 - y) / 8.0, (1.0 + x) * (1.0 - y) / 8.0, (1.0 + x) * (1.0 + y) / 8.0, (1.0 - x) * (1.0 + y) / 8.0}; Eigen::Matrix tmp1; tmp1(0, Eigen::all) = dNx; tmp1(1, Eigen::all) = dNy; tmp1(2, Eigen::all) = dNz; Eigen::Matrix3d J = tmp1 * tmp; Eigen::Matrix3d JInv = J.inverse(); double JDet = J.determinant(); heatKe = heatKe + GW(i) * GW(j) * GW(k) * JDet * sp_material_->thermal_conductivity * (dNx.transpose() * dNx + dNy.transpose() * dNy + dNz.transpose() * dNz); } } } return heatKe; } Eigen::MatrixXd ThermalLinearFEA::computeBe() { Eigen::Matrix Be_inted; Be_inted.setZero(); Eigen::Vector2d GP(-1.0 / sqrt(3.0), 1.0 / sqrt(3.0)); Eigen::Vector2d GW(1.0, 1.0); Eigen::Matrix tmp{ {-a, -b, -c}, {a, -b, -c}, {a, b, -c}, {-a, b, -c}, {-a, -b, c}, {a, -b, c}, {a, b, c}, {-a, b, c} }; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { for (int k = 0; k < 2; ++k) { double x = GP(i), y = GP(j), z = GP(k); Eigen::RowVector dNx{-(1.0 - y) * (1.0 - z) / 8.0, (1.0 - y) * (1.0 - z) / 8.0, (1.0 + y) * (1.0 - z) / 8.0, -(1.0 + y) * (1.0 - z) / 8.0, -(1.0 - y) * (1.0 + z) / 8.0, (1.0 - y) * (1.0 + z) / 8.0, (1.0 + y) * (1.0 + z) / 8.0, -(1.0 + y) * (1.0 + z) / 8.0}; Eigen::RowVector dNy{-(1.0 - x) * (1.0 - z) / 8.0, -(1.0 + x) * (1.0 - z) / 8.0, (1.0 + x) * (1.0 - z) / 8.0, (1.0 - x) * (1.0 - z) / 8.0, -(1.0 - x) * (1.0 + z) / 8.0, -(1.0 + x) * (1.0 + z) / 8.0, (1.0 + x) * (1.0 + z) / 8.0, (1.0 - x) * (1.0 + z) / 8.0}; Eigen::RowVector dNz{-(1.0 - x) * (1.0 - y) / 8.0, -(1.0 + x) * (1.0 - y) / 8.0, -(1.0 + x) * (1.0 + y) / 8.0, -(1.0 - x) * (1.0 + y) / 8.0, (1.0 - x) * (1.0 - y) / 8.0, (1.0 + x) * (1.0 - y) / 8.0, (1.0 + x) * (1.0 + y) / 8.0, (1.0 - x) * (1.0 + y) / 8.0}; Eigen::Matrix tmp1; tmp1(0, Eigen::all) = dNx; tmp1(1, Eigen::all) = dNy; tmp1(2, Eigen::all) = dNz; Eigen::Matrix3d J = tmp1 * tmp; Eigen::Matrix3d JInv = J.inverse(); double JDet = J.determinant(); Be_inted = Be_inted + GW(i) * GW(j) * GW(k) * JDet * computeBe({x, y, z}); } } } return Be_inted; } Eigen::MatrixXd ThermalLinearFEA::computeBe(const Eigen::Vector3d &P) { double x = P(0), y = P(1), z = P(2); assert(x >= -1.0 && x <= 1.0 && y >= -1.0 && y <= 1.0 && z >= -1.0 && z <= 1.0); Eigen::Matrix dNi; dNi(0, 0) = 0.125 * -1 * (1.0 - y) * (1.0 - z); dNi(0, 1) = 0.125 * 1 * (1.0 - y) * (1.0 - z); dNi(0, 2) = 0.125 * 1 * (1.0 - y) * (1.0 - z); dNi(0, 3) = 0.125 * -1 * (1.0 + y) * (1.0 - z); dNi(0, 4) = 0.125 * -1 * (1.0 + y) * (1.0 - z); dNi(0, 5) = 0.125 * 1 * (1.0 - y) * (1.0 + z); dNi(0, 6) = 0.125 * 1 * (1.0 - y) * (1.0 + z); dNi(0, 7) = 0.125 * -1 * (1.0 + y) * (1.0 + z); dNi(1, 0) = 0.125 * (1.0 - x) * -1 * (1.0 - z); dNi(1, 1) = 0.125 * (1.0 + x) * -1 * (1.0 - z); dNi(1, 2) = 0.125 * (1.0 + x) * -1 * (1.0 - z); dNi(1, 3) = 0.125 * (1.0 - x) * +1 * (1.0 - z); dNi(1, 4) = 0.125 * (1.0 - x) * +1 * (1.0 - z); dNi(1, 5) = 0.125 * (1.0 + x) * -1 * (1.0 + z); dNi(1, 6) = 0.125 * (1.0 + x) * -1 * (1.0 + z); dNi(1, 7) = 0.125 * (1.0 - x) * +1 * (1.0 + z); dNi(2, 0) = 0.125 * (1.0 - x) * (1.0 - y) * -1; dNi(2, 1) = 0.125 * (1.0 + x) * (1.0 - y) * -1; dNi(2, 2) = 0.125 * (1.0 + x) * (1.0 + y) * -1; dNi(2, 3) = 0.125 * (1.0 - x) * (1.0 + y) * -1; dNi(2, 4) = 0.125 * (1.0 - x) * (1.0 - y) * +1; dNi(2, 5) = 0.125 * (1.0 + x) * (1.0 - y) * +1; dNi(2, 6) = 0.125 * (1.0 + x) * (1.0 + y) * +1; dNi(2, 7) = 0.125 * (1.0 - x) * (1.0 + y) * +1; return dNi; } Eigen::MatrixXd ThermalLinearFEA::computeN(const Eigen::Vector3d &P) { Eigen::RowVector Ni; Ni.setZero(); double x = P(0), y = P(1), z = P(2); assert(x >= -1.0 && x <= 1.0 && y >= -1.0 && y <= 1.0 && z >= -1.0 && z <= 1.0); Eigen::RowVector tmp; Ni(0) = 0.125 * (1.0 - x) * (1.0 - y) * (1.0 - z); Ni(1) = 0.125 * (1.0 + x) * (1.0 - y) * (1.0 - z); Ni(2) = 0.125 * (1.0 + x) * (1.0 + y) * (1.0 - z); Ni(3) = 0.125 * (1.0 - x) * (1.0 + y) * (1.0 - z); Ni(4) = 0.125 * (1.0 - x) * (1.0 - y) * (1.0 + z); Ni(5) = 0.125 * (1.0 + x) * (1.0 - y) * (1.0 + z); Ni(6) = 0.125 * (1.0 + x) * (1.0 + y) * (1.0 + z); Ni(7) = 0.125 * (1.0 - x) * (1.0 + y) * (1.0 + z); return Ni; } } // da } // sha } // top