from Laminate Analysis Program by Fahad Al Mahmood
Program analysing each layer in a composite.

Laminate(In,Out)
% -------------------------------------------------------
% -------------      (Laminate 1.0)     -----------------
% -------------                         -----------------
% -------------   By: Fahad Al Mahmood  -----------------
% -------------    November 17, 2003    -----------------
% -------------------------------------------------------
%
%   Laminate(Input File,Output File)
%   Laminate(Input File)
%
%  To run this program, you need to have the following
%   2 files in the same folder:
%
%       * Laminate.m
%       * (Input File)
%
%  To run this program, follow the following steps:
%
%       1)  Open (Input File) and enter the Laminate
%            properties & loads.
%       2)  Run the program.
%
%  The output results will be saved as variables in the main MATLAB
%   workspace and in a file called (Output File).  Default output file
%   is (output.out).
%
%   Copyright 2003 Fahad Al Mahmood
%   Version: 1.0 $  $Date: 17-Nov-2003


function Laminate(In,Out)

clc

if nargin==1
    Out='output.out';
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Reading Program Inputs from (Laminate.dat) %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

[F1t,F2t,F1c,F2c,F6,Del_C,Del_T]=textread(In,'%f %f %f %f %f %f %f',1,'headerlines',2);
[Nx,Ny,Nxy,Mx,My,Mxy]=textread(In,'%f %f %f %f %f %f',1,'headerlines',10);
[th,t,E1,E2,G12,v12,Alpha_1,Alpha_2,Beta_1,Beta_2]=textread(In,'%f %f %f %f %f %f %f %f %f %f','headerlines',15);

N = [Nx ; Ny ; Nxy];
M = [Mx ; My ; Mxy];

A=0;B=0;D=0;NT=0;NH=0;MT=0;MH=0;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Setting the (h) Matrix  %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

h=zeros(size(t,1)+1,1);
h(1,1)=sum(t)/2;
for i=2:size(t,1)+1
    h(i)=h(i-1)-t(i-1);
end
h
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Calculating (Qbar)'s, (A,B,& D) Matrices,NT, NH, MT, & MH %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k=1;
disp(['A, B, & D Matrices for [' num2str(th') '] Laminate:'])
for i=size(t,1):-1:1
    Alpha = [Alpha_1(i);Alpha_2(i);0];
    Beta =  [Beta_1(i);Beta_2(i);0];
    S12 =[1/E1(i,1)             -v12(i,1)/E1(i,1)   0; ...
         -v12(i,1)/E1(i,1)       1/E2(i,1)          0
        0                        0                  1/G12(i,1)];
    Q12 = inv(S12);
    disp(['Lamina # ' int2str(k) ': 'num2str(th(i,1))])
    eval(['Qbar' int2str(k) '= T_sig(-th(' int2str(i) '))*Q12*T_eps(th(' int2str(i) '))']);
    Qbar=eval(['Qbar' int2str(k)]);
    Sbar = inv(Qbar);
    A = A - Qbar * (h(i+1,1) - h(i,1));                 % Negative summation since i=size(t,1):-1:1
    B = B - 1/2 * Qbar * (h(i+1,1)^2 - h(i,1)^2);
    D = D - 1/3 * Qbar * (h(i+1,1)^3 - h(i,1)^3);
    
    NTp(:,k) = Del_T * Qbar * T_eps(-th(i)) * Alpha * (h(i,1) - h(i+1,1));
    NHp(:,k) = Del_C * Qbar * T_eps(-th(i)) * Beta  * (h(i,1) - h(i+1,1));
    MTp(:,k) = 1/2 * Del_T * Qbar * T_eps(-th(i)) * Alpha * (h(i,1)^2 - h(i+1,1)^2);
    MHp(:,k) = 1/2 * Del_C * Qbar * T_eps(-th(i)) * Beta  * (h(i,1)^2 - h(i+1,1)^2);    

    NT = NT + Del_T * Qbar * T_eps(-th(i)) * Alpha * (h(i,1) - h(i+1,1));
    NH = NH + Del_C * Qbar * T_eps(-th(i)) * Beta  * (h(i,1) - h(i+1,1));
    MT = MT + 1/2 * Del_T * Qbar * T_eps(-th(i)) * Alpha * (h(i,1)^2 - h(i+1,1)^2);
    MH = MH + 1/2 * Del_C * Qbar * T_eps(-th(i)) * Beta  * (h(i,1)^2 - h(i+1,1)^2);
    
    k=k+1;
end

Nbar = N + NT + NH;
Mbar = M + MT + MH;
ABD = [A B;B D];
abd = inv(ABD);
a = abd(1:3,1:3);
b = abd(1:3,4:6);
bT= abd(4:6,1:3);
d = abd(4:6,4:6);

eps0_k = abd * [Nbar ; Mbar];
eps0 = eps0_k(1:3);
k    = eps0_k(4:6);
Alpha_bar = 1/Del_T * ( a * NT + b * MT);
Beta_bar  = 1/Del_C * ( a * NH + b * MH);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Setting the (z) Matrix  %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

z(1,1)=sum(t)/2;
for i=2:size(t,1)
    z(i-1,1)=z(i-1);
    z(i-1,2)=z(i-1)-t(i-1);
    z(i,1) = z(i-1,2);
end
z(size(t,1),2) = -sum(t)/2;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating [sig]k & [eps]k for each ply %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
j=size(t,1);
for i=1:size(t,1)
    Alpha_p = T_eps(-th(j)) * [Alpha_1(j);Alpha_2(j);0];
    Beta_p =  T_eps(-th(j)) * [Beta_1(j);Beta_2(j);0];
    eval(['eps' int2str(i) '_upper = eps0 + z(' int2str(j) ',1)*k - Alpha_p * Del_T - Beta_p * Del_C;']);
    eval(['eps' int2str(i) '_lower = eps0 + z(' int2str(j) ',2)*k - Alpha_p * Del_T - Beta_p * Del_C;']);
    eval(['sigxy' int2str(i) '_upper = Qbar' int2str(i) ' * eps' int2str(i) '_upper;']);
    eval(['sigxy' int2str(i) '_lower = Qbar' int2str(i) ' * eps' int2str(i) '_lower;']);
    j=j-1;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculating Tsai-Hill Number             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
j=size(t,1);
for i=1:size(t,1)
    eval(['sig' int2str(i) '_upper  = T_sig(th(' int2str(j) ')) * sigxy' int2str(i) '_upper;']);
    eval(['sig = sig' int2str(i) '_upper']);
    if sig(1) > 0
        F1 = F1t;
    else
        F1 = F1c;
    end
    
    if sig(2) > 0
        F2 = F2t;
    else
        F2 = F2c;
    end
    
    %%%%%%%%%%%%%%%%%
    % Max Stress Test
    %%%%%%%%%%%%%%%%%
    if abs(sig(1))>F1 | abs(sig(2))>F2 | abs(sig(3))>F6
        MSRes(i,:) = 'Failed';
    else
        MSRes(i,:) = 'Passed';
    end
    
    %%%%%%%%%%%%%%%%%
    %  Tsai Hill Test
    %%%%%%%%%%%%%%%%%
    
    eval(['TH' int2str(i) '_upper = (sig(1)/F1)^2 + (sig(2)/F2)^2 - (sig(1)*sig(2)/F1^2) + (sig(3)/F6)^2';]);
    if eval(['TH' int2str(i) '_upper']) >= 1
        THRes(i,:) = 'Failed';
    else
        THRes(i,:) = 'Passed';
    end    
    eval(['sig' int2str(i) '_lower  = T_sig(th(' int2str(j) ')) * sigxy' int2str(i) '_lower;']);
    eval(['sig = sig' int2str(i) '_lower;']);
    if sig(1) > 0
        F1 = F1t;
    else
        F1 = F1c;
    end
    
    if sig(2) > 0
        F2 = F2t;
    else
        F2 = F2c;
    end

    %%%%%%%%%%%%%%%%%
    % Max Stress Test
    %%%%%%%%%%%%%%%%%
    if abs(sig(1))>F1 | abs(sig(2))>F2 | abs(sig(3))>F6
        MSRes(i,:) = 'Failed';
    else
        MSRes(i,:) = 'Passed';
    end    
    
    %%%%%%%%%%%%%%%%%
    %  Tsai Hill Test
    %%%%%%%%%%%%%%%%%
    
    eval(['TH' int2str(i) '_lower = (sig(1)/F1)^2 + (sig(2)/F2)^2 - (sig(1)*sig(2)/F1^2) + (sig(3)/F6)^2;']);
    if eval(['TH' int2str(i) '_upper']) >= 1
        THRes(i,:) = 'Failed';
    else
        THRes(i,:) = 'Passed';
    end
    j=j-1;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Outputing to File
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

OUT=fopen(Out,'w');
fprintf(OUT,'%s\n',datestr(now));
fprintf(OUT,'Results for [ %s ] Laminate:\n\n',num2str(th'));

MAT1 = [Nbar,N,NT,NH,Mbar,M,MT,MH];
fprintf(OUT,'\n 	Nbar 	 			N 	 		NT 	 		NH 	 		Mbar 	 		M 	 		MT 	 		MH\n');
fprintf(OUT,'\t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',MAT1');

MAT2 = [eps0,k,Alpha_bar,Beta_bar];
fprintf(OUT,'\n 	eps0 	 			k 	 	Alpha_bar 	 	Beta_bar\n');
fprintf(OUT,'\t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',MAT2');

fprintf(OUT,'\nPly 	 epsxy_upper 	 	epsxy_lower 	 	sigxy_upper 	 	sigxy_lower 	 	sig12_upper 	 	sig12_lower 	 	NT 	 		NH 	 		MT 	 		MH 	 		TH_upper 	 	TH_lower\n\n');

for i=1:size(t,1)
    MAT3 = [i*ones(3,1),eval(['eps' int2str(i) '_upper']),eval(['eps' int2str(i) '_lower']),eval(['sigxy' int2str(i) '_upper']),eval(['sigxy' int2str(i) '_lower']),eval(['sig' int2str(i) '_upper']),eval(['sig' int2str(i) '_lower']),NTp(:,i),NHp(:,i),MTp(:,i),MHp(:,i),eval(['TH' int2str(i) '_upper'])*ones(3,1),eval(['TH' int2str(i) '_lower'])*ones(3,1)];
    fprintf(OUT,'%d \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',MAT3');
    fprintf(OUT,'\n');
    MAT3g(3*i-2:3*i,:)=MAT3;
end

fprintf(OUT,'\nPly \t Status(Tsai-Hill) \t Status(Max-Stress)\n');
for i=1:size(th,1)
    fprintf(OUT,'%d \t %s \t\t %s\n ',th(size(th,1)+1-i),THRes(i,:),MSRes(i,:));
end
fprintf(OUT,'\nEffective Moduli of Laminate:\n');
Ex = 1/a(1,1)/sum(t);
Ey = 1/a(2,2)/sum(t);
Gxy = 1/a(3,3)/sum(t);
vxy = -a(2,1)/a(1,1);
fprintf(OUT,'\tEx 	 		Ey 	 		Gxy 	 		vxy\n');
fprintf(OUT,'\t%+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',Ex,Ey,Gxy,vxy);


fprintf(OUT,'\n \tABD\n');
fprintf(OUT,'\t%+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',ABD);
fprintf(OUT,'\n \tabd\n');
fprintf(OUT,'\t%+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e \t %+7.6e\n',abd);


for i=1:size(unique(th),1)
    ang = unique(th);
    x=find(th==ang(i));
    x=sort(x);
    fprintf(OUT,'\nQbar%s:\n',int2str(x(1)));
    fprintf(OUT,'\t%+7.6e \t %+7.6e \t %+7.6e \n',eval(['Qbar' int2str(x(1))]))
end

fclose(OUT);

clc;


% --------------------------------
%       INTERNAL FUNCTIONS
% --------------------------------

function T_sig=T_sig(ang)

th=ang*pi/180;
m=cos(th);
n=sin(th);

T_sig=[ ...
        m^2 n^2 2*m*n
        n^2 m^2 -2*m*n
        -m*n m*n m^2-n^2];
    
function T_eps=T_eps(ang)

th=ang*pi/180;
m=cos(th);
n=sin(th);

T_eps=[ ...
        m^2 n^2 m*n
        n^2 m^2 -m*n
        -2*m*n 2*m*n m^2-n^2];

Contact us at files@mathworks.com