You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

181 lines
10 KiB

//
// 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<double, 8, 8> heatKe;
heatKe.setZero();
Eigen::Matrix<double, 8, 3> 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<double, 8> 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<double, 8> 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<double, 8> 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<double, 3, 8> 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<double, 3, 8> 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<double, 8, 3> 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<double, 8> 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<double, 8> 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<double, 8> 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<double, 3, 8> 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<double, 3, 8> 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<double, 8> 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<double, 8> 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