Modelo de Ogden
Este modelo fue desarrollado por Raymond Ogden para simular materiales similares al caucho, aunque actualmente se utiliza también para describir la hiperelásticidad en tejidos biológicos como la piel y algunos órganos y tejidos en animales. Además, como se señala en el libro de Ogden (1997), el modelo captura con muy buena aproximación el comportamiento de rigidez de la relación tensión/deformación para materiales tipo goma y muchos termoplásticos.
La forma matemática del modelo de Ogden está descrita en términos de $\lambda_1^{*}$, $\lambda_2^{*}$ y $\lambda_3^{*}$:
\Psi(\lambda_1^{*},\lambda_2^{*},\lambda_3^{*}) = \sum_{j=1}^{N} \frac{2\mu_j}{\alpha_{j}^2} \bigg[ (\lambda_1^*)^{\alpha_j} + (\lambda_2^*)^{\alpha_j} + (\lambda_3^*)^{\alpha_j} - 3 \bigg] \\ + \sum_{j=1}^{N} \frac{1}{D_j}(J-1)^{2j},
\end{equation}
(1)
donde $\lambda_j^{*}$ corresponden a los ratios principales de deformación del material (principal stretch ratios), y las propiedades o parámetros del modelo corresponden con las constantes $\alpha_{j}$, $\mu_{j}$, y $D_j$.
De la ecuación (1), derivando el potencial energético de Ogden con respecto a cada uno de los $\lambda_j^{*}$, se obtienen los esfuerzos principales del material $\sigma_i$ para $i \in [1, 2, 3]$ como sigue:
\begin{equation}
\sigma_{i} = \frac{2}{M}\sum_{j=1}^{N} \frac{\mu_j}{\alpha_{j}} \bigg[ (\lambda_i^*)^{\alpha_j} + \frac{1}{3}[(\lambda_1^*)^{\alpha_j} + (\lambda_2^*)^{\alpha_j} + \lambda_3^*)^{\alpha_j}] \bigg] \\ + \sum_{j=1}^{N} \frac{2j}{D_j}(J-1)^{2j-1},
\end{equation}
\sigma_{i} = \frac{2}{M}\sum_{j=1}^{N} \frac{\mu_j}{\alpha_{j}} \bigg[ (\lambda_i^*)^{\alpha_j} + \frac{1}{3}[(\lambda_1^*)^{\alpha_j} + (\lambda_2^*)^{\alpha_j} + \lambda_3^*)^{\alpha_j}] \bigg] \\ + \sum_{j=1}^{N} \frac{2j}{D_j}(J-1)^{2j-1},
\end{equation}
(2)
donde $M$ corresponde a una propiedad volumétrica de material. De la ecuación (2), cada uno de los esfuerzos respecto a las direcciones de deformación en estado incompresible de la materia se obtiene como sigue:
\begin{equation}
\sigma_{uniaxial} = \sum_{j=1}^{N} \frac{2\mu_j}{\alpha_{j}} \bigg[\lambda^{\alpha_j} - \bigg(\frac{1}{\sqrt{\lambda}}\bigg)^{\alpha_j}\bigg],
\end{equation}
(4)
\begin{equation}\sigma_{planar} = \sum_{j=1}^{N} \frac{2\mu_j}{\alpha_{j}} \bigg[\lambda^{\alpha_j} - \bigg(\frac{1}{\lambda}\bigg)^{\alpha_j}\bigg],
\end{equation}
(5)
\begin{equation}\sigma_{biaxial} = \sum_{j=1}^{N} \frac{2\mu_j}{\alpha_{j}} \bigg[\lambda^{\alpha_j} - \bigg(\frac{1}{\lambda^2}\bigg)^{\alpha_j}\bigg].
\end{equation}
(6)
Al final de esta entrada se encuentra un código en C++ que implementa en una función el modelo Ogden para el caso uniaxial incompresible de las ecuaciones (4). En dicho código se utilizan las siguientes constantes de material: $\mu_1 = 0.00183344$, $\mu_2 = 0.00911155$, $\mu_3 = 0.390367$, $\alpha_1 = 5.30515$, $\alpha_2 = 2.06632$, y $\alpha_3 = 1.43289$.
El lector ávido notará que el código en C++ tiene además la versatilidad de generar archivos CSV de los vectores del esfuerzo verdadero y la deformación verdadera del material que se modele a través de las constantes ya mencionadas. De hecho, la siguiente figura se construyo a partir de ello.
Figura. Gráfica de Esfuerzo vs Deformación para $\mu_1 = 0.00183344$, $\mu_2 = 0.00911155$, $\mu_3 = 0.390367$, $\alpha_1 = 5.30515$, $\alpha_2 = 2.06632$, y $\alpha_3 = 1.43289$.
Conclusión
Tal como se apunta arriba, el modelo de Ogden es versátil, pues al encontrarse las constantes de un material, a través de dicha ecuación se pueden modelar diferentes modos de deformación en un cuerpo. Asimismo, puede ajustarse a diferentes grados de no-linealidad sí es que se incrementa el número de sus constantes $N$. Aunque la entrada es bastante corta, se sugiere al lector hacer una revisión a la literatura que se hace referencia al final de la misma.
Finalmente, y aunque no está relacionado con la entrada, debo decir que a partir de aquí estaré posteando música que me ayuda construir el blog Materia. Quizás incluso para recordar el ambiente y contexto en que tuve a bien escribir lo que expongo. En este caso, la pieza de Claire de Lune de Debussy, tal como aparece en el juego The Evil Within 1 y 2, me ayudó en gran medida como inspiración para escribir las líneas que están arriba:
Referencias
- Ogden, R.W. (1997). Non-linear elastic deformations, Second Edition. New York.: Dover Publications.
Código del modelo de Ogden C++
/* © 2020 Alejandro E. Rodríguez-Sánchez. All rights reserved. For personal use only.
It is not permitted to distribute verbatim copies of this document.*/
#include <math.h> #include <fstream> #include <vector>
using namespace std; std::vector<double> Ogden(std::vector<double> trueStrain, std::vector<double> muVec, std::vector<double> alphaVec) { std::vector<double> stress(trueStrain.size()); std::vector<double> lam(trueStrain.size()); std::vector<double> mu(muVec.size()); std::vector<double> alpha(muVec.size()); for (int i = 0; i < trueStrain.size(); i++) { lam[i] = exp(trueStrain[i]); } for (int i = 0; i < muVec.size(); i++) { mu[i] = muVec[i]; alpha[i] = alphaVec[i]; } ////shear //for (int i = 0; i < trueStrain.size(); i++) //{ // for (int j = 0; j < muVec.size(); j++) // { // stress[i] += (2 * mu[j] / alpha[j]) * ((pow(lam[i], alpha[j])) - pow((1 / (lam[i]*lam[i])), alpha[j])); // } //} ////Planar //for (int i = 0; i < trueStrain.size(); i++) //{ // for (int j = 0; j < muVec.size(); j++) // { // stress[i] += (2*mu[j]/alpha[j])*((pow(lam[i], alpha[j]))-pow((1 /lam[i]),alpha[j])); // } //} //Tensile for (int i = 0; i < trueStrain.size(); i++) { for (int j = 0; j < muVec.size(); j++) { stress[i] += (2 * mu[j] / alpha[j]) * ((pow(lam[i], alpha[j])) - pow((1 / sqrt(lam[i])), alpha[j])); } } return stress; } int main() { ofstream Sigma; Sigma.open("Sigma.csv"); ofstream Epsilon; Epsilon.open("Epsilon.csv"); std::vector<double> trueStrain(100); for (int i = 0; i < trueStrain.size(); i++) { trueStrain[i] = (0.021) * i; } std::vector<double> muVec{ 0.00183344, 0.00911155, 0.390367};//{ -0.330628743, 1.53931622e-2, 0.724052710 }; std::vector<double> alphaVec{5.30515, 2.06632, 1.43289}; //{ 10.557649, 13.2929248, -20.0136033}; std::vector<double> trueStress(trueStrain.size()); double matrix[100][2]; /// trueStress = Ogden(trueStrain, muVec, alphaVec); for (int i = 0; i < trueStrain.size(); i++) { Epsilon << trueStrain[i] << "\n"; Sigma << trueStress[i] << "\n"; matrix[i][0] = exp(trueStrain[i])-1; //From true strain to engineering strain matrix[i][1] = (trueStress[i])/exp(trueStrain[i]); //_________ From true stress to engineering stress } ///------------------------- Test to see if a matrix can be saved into a CSV file ofstream Matrix; Matrix.open("Matrix.csv"); for (auto& row : matrix) { for (auto col : row) Matrix << col << ','; Matrix << '\n'; } Epsilon.close(); Sigma.close(); Matrix.close(); return 0; }
Gracias por la explicación
ResponderBorrarEncantado por saber que te ha servido ¡Saludos cordiales!
Borrar