viernes, 31 de enero de 2020

Hiperelásticidad — Modelo de Ogden

En una entrada anterior hablé sobre la importancia de entender a un alto nivel el involucramiento de potenciales elásticos de deformación para modelar materiales tipo-goma o elastómeros en modelos de elementos finitos. En esa ocasión recurrí al modelo de Mooney-Rivlin para ilustrar el caso. Sin embargo, a decir verdad, ese potencial es muy sencillo y, en general, no tiene una buena capacidad para capturar el comportamiento de algunos materiales cuando son elongados a muy grandes niveles de deformación. Por tal razón, en esta entrada haré un apunte general sobre el modelo de Ogden, que para efectos prácticos es uno de los mejores potenciales energéticos para capturar comportamientos complejos en muchos materiales a grandes niveles de deformación. Incluso biológicos.

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^{*}$:

\begin{equation}
\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}
(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;
}

2 comentarios: