DEMO_volumetric_SED_eval
This demo was developed as part of the paper: Moerman et al. "Novel Hyperelastic Models for Large Volumetric Deformations".
The demo features: * Implementations of hyperelastic volumetric strain energy density functions (SEDs) * Visualizations of the SED, hydrostatic stress, and tangent as a function of the volume ratio.
Contents
Keywords
- Strain energy density
- Volumetric
- Visualization
clear; close all; clc;
Plot settings
fontSize=36; fontSizeInner=fontSize+15; fontSizeLabel=fontSize+30; plotColors=gjet(4); plotColors=plotColors([1 2 4],:); lineWidth=6; gridAlpha=0.3; LineWidthAxis=2; legendHeight=0.05; numXTicks=5;
Control parameters
formulationCases=1:12; %Choose formulation 1:12 k=1; %Default bulk modulus (except for hyperfoam) J_max=2; numPoints=2000; %Number of points for plotting J=linspace(0.1,J_max,numPoints)'; %The volume ratios xtickRange=linspace(0,max(J),numXTicks); %X-axis tick range
Get or set formulation specific data and parameters
for formulationCase=formulationCases
switch formulationCase case 1 %Hencky formulationName='Hencky'; parSet(1)=k; %Bulk modulus case 2 %Simo formulationName='Simo'; parSet(1)=k; %Bulk modulus case 3 %Bischoff formulationName='Bischoff'; b=2; %Beta parSet(1)=k; %Bulk modulus parSet(2)=b; %Beta case 4 %Modified Ogden formulationName='Modified Ogden'; b=2;%Beta parSet(1)=k; %Bulk modulus parSet(2)=b; %Beta case 5 %Hyperfoam formulationName='Hyperfoam'; mu=1; a=2; %Alpha b=2; %Beta parSet(1)=mu; %Mu parSet(2)=a; %Alpha parSet(3)=b; %Beta case 6 %Doll and Schweizerhoff formulationName='Doll and Schweizerhoff'; a=3; %Alpha b=2; %Beta parSet(1)=k; %Bulk modulus parSet(2)=a; %Alpha parSet(3)=b; %Beta case 7 %Moerman 1 formulationName='Moerman 1'; b1=3; b2=2; parSet(1)=k; %Bulk modulus parSet(2)=b1; %Alpha parSet(3)=b2; %Beta case 8 %Moerman 1A formulationName='Moerman 1A'; b1=3; b2=2; q=0.5; parSet(1)=k; %Bulk modulus parSet(2)=b1; %Alpha parSet(3)=b2; %Beta parSet(4)=q; %Weigthing factor case 9 %Moerman 1B formulationName='Moerman 1B'; b1=3; b2=2; parSet(1)=k; %Bulk modulus parSet(2)=b1; %Alpha parSet(3)=b2; %Beta case 10 %Moerman 2 formulationName='Moerman 2'; J1=max(J)+0.1; J2=0; parSet(1)=k; %Bulk modulus parSet(2)=J1; %J1 parSet(3)=J2; %J2 case 11 %Moerman 2A formulationName='Moerman 2A'; b1=3; b2=2; parSet(1)=k; %Bulk modulus parSet(2)=b1; %Alpha parSet(3)=b2; %Beta case 12 %Moerman 3 formulationName='Moerman 3'; J1=max(J)+0.1; J2=0; s1=0.15; s2=0.15; q1=0.9; q2=0.9; parSet(1)=k; %Bulk modulus parSet(2)=J1; %J1 parSet(3)=J2; %J2 parSet(4)=s1; %s1 parSet(5)=s2; %s2 parSet(6)=q2; %q1 parSet(7)=q2; %q2 end
Calculate SED
%Get normalized SED
[W,S,T]=SED_eval(formulationCase,parSet,J);
Visualize data
hf=cFigure; ht=suptitle(formulationName); ht.FontSize=fontSizeLabel; ht.Interpreter='latex'; subplot(1,3,1); hold on; set(gca,'FontSize',fontSize,'LineWidth',LineWidthAxis,'GridAlpha',gridAlpha); xlabel('$J$','FontSize',fontSizeLabel,'Interpreter','latex'); ylabel('$\Psi/\kappa$','FontSize',fontSizeLabel,'Interpreter','latex'); hp1=plot(J,W,'k-','LineWidth',lineWidth); hp1.Color=plotColors(1,:); grid on; axis tight; axis square; box on; xlim([0 max(J(:))]); set(gca,'XTick',xtickRange); subplot(1,3,2); hold on; set(gca,'FontSize',fontSize,'LineWidth',LineWidthAxis,'GridAlpha',gridAlpha); xlabel('$J$','FontSize',fontSizeLabel,'Interpreter','Latex'); ylabel('$\sigma_{h}/\kappa$','FontSize',fontSizeLabel,'Interpreter','Latex'); grid on; axis tight; axis square; box on; hp2=plot(J,S,'k-','LineWidth',lineWidth); hp2.Color=plotColors(2,:); grid on; axis tight; axis square; box on; xlim([0 max(J(:))]); set(gca,'XTick',xtickRange); subplot(1,3,3); hold on; set(gca,'FontSize',fontSize,'LineWidth',LineWidthAxis,'GridAlpha',gridAlpha); xlabel('$J$','FontSize',fontSizeLabel,'Interpreter','latex'); ylabel('$\frac{\partial^2 \Psi}{\partial J^2} /\kappa$','FontSize',fontSizeLabel,'Interpreter','Latex'); hp3=plot(J,T,'k-','LineWidth',lineWidth); hp3.Color=plotColors(3,:); grid on; axis tight; axis square; box on; xlim([0 max(J(:))]); ylim([0 max(T(:))]); set(gca,'XTick',xtickRange); drawnow;
end
Evaluate SED
function [W,S,T]=SED_eval(formulationCase,parSet,J) switch formulationCase case 1 %Hencky k=parSet(1); W=k/2*log(J).^2; S=k*log(J)./J; T=(k-k*log(J))./J.^2; case 2 %Simo k=parSet(1); W=(k/2).*(J-1).^2; S=(k/2).*(2*J-2); T=k*ones(size(J)); case 3 %Bischoff k=parSet(1); b=parSet(2); W=(k./b.^2).*(cosh(b*(J-1))-1); S=(k./b) .* sinh(b*(J-1)); T=k .* cosh(b*(J-1)); case 4 %Modified Ogden k=parSet(1); b=parSet(2); W=(k./b.^2).*(J.^-b - 1 + b.*log(J)); S=(k./b) .*(1./J - J.^(-b-1)); T=(k./b) .*(-1./J.^2 + (b+1).*J.^(-b-2)); case 5 %Hyperfoam mu=parSet(1); a=parSet(2); b=parSet(3); k=mu.*(b+1/3); W=(2*mu./(a.^2)).*( 3*(J.^(a/3)-1)... +(1./b.*( (J.^(-a.*b))-1 )) ); S=(1./J).*(2*mu./a).*(J.^(a/3)... -J.^(-a.*b) ); T=(1./(J.^2)).*(2*mu/a).*((a./3-1).*J.^(a./3) +... (a.*b+1).*J.^(-a*b) ); case 6 %Doll and Schweizerhoff k=parSet(1); a=parSet(2); b=parSet(3); W=( (k/(a+b)).*( ((1/(a+1)).*(J.^(a+1))) + ((1/(b-1)).*(J.^(-b+1)))) )... -(k.*(1/(a+1)).*(1/(b-1))); S=(k/(a+b)).*(J.^a-J.^(-b)); T=(k/(a+b)).*(a*J.^(a-1)+b*J.^(-b-1)); case 7 %Moerman 1 k=parSet(1); b1=parSet(2); b2=parSet(3); W=(k/4) .*( (1/b1^2).*((J.^ b1)-1).^2 + ... (1/b2^2).*((J.^-b2)-1).^2 ); S=(k/2)./J .*( (1/b1 ).*(J.^( 2*b1) - J.^b1 ) - ... (1/b2 ).*(J.^(-2*b2) - J.^-b2) ); T=(k/2)./J.^2.*( ((2-1/b1)*J.^( 2*b1)-(1-1/b1)*J.^b1) + ... ((2+1/b2)*J.^(-2*b2)-(1+1/b2)*J.^-b2) ); case 8 %Moerman 1A k=parSet(1); b1=parSet(2); b2=parSet(3); q=parSet(4); W1=(k/(2*b1^2)).*( q).*((J.^ b1)-1).^2; W2=(k/(2*b2^2)).*(1-q).*((J.^-b2)-1).^2; W=W1+W2; S1= (k/b1)./J.*( q).*(J.^( 2*b1)-J.^b1 ); S2=-(k/b2)./J.*(1-q).*(J.^(-2*b2)-J.^-b2); S=S1+S2; T1=(k./J.^2).*( q).*((2-1/b1)*J.^( 2*b1)-(1-1/b1)*J.^b1 ); T2=(k./J.^2).*(1-q).*((2+1/b2)*J.^(-2*b2)-(1+1/b2)*J.^-b2); T=T1+T2; case 9 %Moerman 1B k=parSet(1); b1=parSet(2); b2=parSet(3); L1=(J>=1); L2=(J<1); W=zeros(size(J)); W(L1)=(k/(2*b1^2)).*((J(L1).^ b1)-1).^2; W(L2)=(k/(2*b2^2)).*((J(L2).^-b2)-1).^2; S=zeros(size(J)); S(L1)= (k/b1).*(J(L1).^( 2*b1-1)-J(L1).^( b1-1)); S(L2)=-(k/b2).*(J(L2).^(-2*b2-1)-J(L2).^(-b2-1)); T=zeros(size(J)); T(L1)=(k/b1).*((2*b1-1)*J(L1).^( 2*b1-2)-(b1-1)*J(L1).^( b1-2)); T(L2)=(k/b2).*((2*b2+1)*J(L2).^(-2*b2-2)-(b2+1)*J(L2).^(-b2-2)); case 10 %Moerman 2 k=parSet(1); J1=parSet(2); J2=parSet(3); a1=(2/pi)*(J1-1); a2=(2/pi)*(J2-1); W1=(-k*a1.^2)*log(cos((J-1)/a1)); W2=(-k*a2.^2)*log(cos((J-1)/a2)); W=zeros(size(W1)); W(J>=1)=W1(J>=1); W(J<1)=W2(J<1); W=real(W); W(J>=J1)=inf; W(J<=J2)=inf; S1=(k.*a1).*tan((J-1)/a1); S2=(k.*a2).*tan((J-1)/a2); S=zeros(size(S1)); S(J>=1)=S1(J>=1); S(J<1)=S2(J<1); S(J>=J1)=inf; S(J<=J2)=-inf; T1=k*sec((J-1)/a1).^2; T2=k*sec((J-1)/a2).^2; T=zeros(size(T1)); T(J>=1)=T1(J>=1); T(J<1)=T2(J<1); T(J>=J1)=inf; T(J<=J2)=inf; case 11 %Moerman 2A k=parSet(1); b1=parSet(2); b2=parSet(3); W1=(k./b1.^2).*(cosh(b1*(J-1))-1); S1=(k./b1) .* sinh(b1*(J-1)); T1=k .* cosh(b1*(J-1)); W2=(k./b2.^2).*(cosh(b2*(J-1))-1); S2=(k./b2) .* sinh(b2*(J-1)); T2=k .* cosh(b2*(J-1)); W3=k.*(-4/pi^2) .*log(cos(pi/2*(1-J))); S3=k.*(-2/pi) .*tan(pi/2*(1-J)); T3=k .*sec(pi/2*(1-J)).^2; W=W1; S=S1; T=T1; W(J<1)=W2(J<1)/2+W3(J<1)/2; S(J<1)=S2(J<1)/2+S3(J<1)/2; T(J<1)=T2(J<1)/2+T3(J<1)/2; case 12 %Moerman 3
k=parSet(1); J1=parSet(2); J2=parSet(3); s_1=parSet(4); s_2=parSet(5); q1=parSet(6); q2=parSet(7); L=J<1; % PART 1 a1=(pi/2)*(1/(J1-1)); a2=(pi/2)*(1/(J2-1)); %SED W11=(-1/a1.^2)*log(cos((J-1).*a1)); W21=(-1/a2.^2)*log(cos((J-1).*a2)); W1=zeros(size(J)); W1(~L)=W11(~L); W1(L)=W21(L); W1=real(W1); W1(J>J1)=inf; W1(J<J2)=inf; %Stress S11=(1./a1).*tan((J-1).*a1); S21=(1./a2).*tan((J-1).*a2); S1=zeros(size(J)); S1(~L)=S11(~L); S1(L)=S21(L); S1(J>J1)=inf; S1(J<J2)=-inf; %Tangent T11=sec((J-1).*a1).^2; T21=sec((J-1).*a2).^2; T1=zeros(size(J)); T1(~L)=T11(~L); T1(L)=T21(L); T1(J>J1)=inf; T1(J<J2)=inf; % PART 2 b1= k/(s_1); b2= k/(s_2); W12=(1/b1.^2)*log(cosh((J-1).*b1)); W22=(1/b2.^2)*log(cosh((J-1).*b2)); W2=zeros(size(J)); W2(~L)=W12(~L); W2(L)=W22(L); W2=real(W2); S12=1/b1*tanh((J-1)*b1); S22=1/b2*tanh((J-1)*b2); S2=zeros(size(J)); S2(~L)=S12(~L); S2(L)=S22(L); T12=sech((J-1).*b1).^2; T22=sech((J-1).*b2).^2; T2=zeros(size(J)); T2(~L)=T12(~L); T2(L)=T22(L); % SUM W(~L)=k*((1-q1)*W1(~L)+q1*W2(~L)); S(~L)=k*((1-q1)*S1(~L)+q1*S2(~L)); T(~L)=k*((1-q1)*T1(~L)+q1*T2(~L)); W(L)=k*((1-q2)*W1(L)+q2*W2(L)); S(L)=k*((1-q2)*S1(L)+q2*S2(L)); T(L)=k*((1-q2)*T1(L)+q2*T2(L));
W(J>=J1)=inf; W(J<=J2)=inf; S(J>=J1)=inf; S(J<=J2)=-inf; T(J>=J1)=inf; T(J<=J2)=inf;
end %Normalise based on bulk-modulus W=W/k; S=S/k; T=T/k; end
GIBBON www.gibboncode.org
Kevin Mattheus Moerman, [email protected]
GIBBON footer text
License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE
GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.
Copyright (C) 2019 Kevin Mattheus Moerman
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.