HELP Optimize code by returning to line 1 if condition not met.
Show older comments
I have the following code I need to iterate if a condition is not met.
So If any value in the 1x3x8 Tsai_Wu_Total matrix >1 I need to iterate LT (at top of code) and re-run entire code iterively until Tsai_Wu_Total matrix <1.
So Only change LT until all values in Tsai_Wu_Total<1. Entire code below. Thanks.
clear all, close all, clc
format short g
%%USER INPUTS
%--------------------------------------------------------------------------
% The thickness is listed first followed by the orientations for desired
% laminate-----------------------------------------------------------------
LT=0.180;%Lamina Thickness
TLT=LT*8; %Laminate Thickness
LAMINATE=[TLT/8 TLT/8 TLT/8 TLT/8 TLT/8 TLT/8 TLT/8 TLT/8;
0 45 -45 90 90 -45 45 0]; %8 plies equal thickness
%--------------------------------------------------------------------------
%%Ply Distance Calculations------------------------------------------------
%--------------------------------------------------------------------------
PC=size(LAMINATE,2); %Ply Count
%--------------------------------------------------------------------------
%Material Properties-------------------------------------------------------
%--------------------------------------------------------------------------
core=0; %<=======================================INPUT CORE THICKNESS HERE
E_1=3*10^7;
E_2=7.5*10^5;
G_12=3.75*10^5;
v_12=0.25;
v_21=v_12*(E_2/E_1);
XT=1.5*10^5;
XC=-1.0*10^5;
YT=6.0*10^3;
YC=-1.7*10^4;
S=1.0*10^4;
SIG_B=0;
Density_Laminate= 0.0625;
Mass_Laminate=Density_Laminate*sum(LAMINATE(1,:));
Density_core=0;
%--------------------------------------------------------------------------
%Thermal and Hygrothermal inputs-------------------------------------------
%--------------------------------------------------------------------------
a_1=-1.7*10^-7;
a_2=1.6*10^-5;
b_1=0;
b_2=0;
Dt=-200;
Dc=0;
for i=1:PC
a_x(i)=a_1*cosd(LAMINATE(2,i))^2+a_2*sind(LAMINATE(2,i))^2;
a_y(i)=a_1*sind(LAMINATE(2,i))^2+a_2*cosd(LAMINATE(2,i))^2;
a_xy(i)=2*cosd(LAMINATE(2,i))*sind(LAMINATE(2,i))*(a_1-a_2);
b_x(i)=b_1*cosd(LAMINATE(2,i))^2+b_2*sind(LAMINATE(2,i))^2;
b_y(i)=b_1*sind(LAMINATE(2,i))^2+b_2*cosd(LAMINATE(2,i))^2;
b_xy(i)=2*cosd(LAMINATE(2,i))*sind(LAMINATE(2,i))*(b_1-b_2);
alpha(:,i)=[a_x(i),a_y(i),a_xy(i)];
end
%--------------------------------------------------------------------------
%Forces and Moments--------------------------------------------------------
%--------------------------------------------------------------------------
F_M=[2000,3000,0,0,5000,0];
%--------------------------------------------------------------------------
%%Q matrix calculations
%--------------------------------------------------------------------------
Q11=E_1/(1-v_12*v_21);
Q22=E_2/(1-v_12*v_21);
Q12=(E_1*v_21)/(1-v_12*v_21);
Q21=(E_1*v_21)/(1-v_12*v_21);
Q66=G_12;
Q_M=[Q11 Q12 0; Q21 Q22 0; 0 0 Q66];
%--------------------------------------------------------------------------
%This For loop calculates the total height of layers-----------------------
%--------------------------------------------------------------------------
t(1,1)=0;
for i=1:PC
t=t+LAMINATE(1,i);
sum_t(1,i+1)=t;
end
for k=1:size(sum_t,2)
if sum_t(1,k)==1000
sum_t(1,k)=[];
else sum_t(1,k)=sum_t(1,k);
end
end
%--------------------------------------------------------------------------
%This For loop indexes where the mid-surf "0" needs to go--------------------
%--------------------------------------------------------------------------
t_2=t/2;
for j=1:PC+1
if sum_t(1,j)<t_2
Zero_check(1,j)=1;
else
Zero_check(1,j)=0;
end
Top_Plies=sum(Zero_check);
end
%--------------------------------------------------------------------------
%This For loop checks to see if a ply lies on a "between layers" boundary--
%--------------------------------------------------------------------------
for m=1:PC+1
if sum_t(1,m)==t_2
Layer_check(1,m)=1;
else
Layer_check(1,m)=0;
end
Ply_layer=sum(Layer_check);
end
if core==0
Mid_Surf="Between layers";
else
Mid_Surf="Middle of Core";
end
%--------------------------------------------------------------------------
%This step calculates the distances for plies to a mid-surf that falls in
%the middle of a ply
%--------------------------------------------------------------------------
if Mid_Surf=="Middle of Core"
Ply_D=zeros(1,PC+1);
sum_t(1,PC+2)=1000;
for k=1:PC+2
p=k-1;
if sum_t(1,k)<t_2
Ply_D(1,k)=sum_t(1,k)-t_2;
else
if k==Top_Plies+1% This statement adds a "0" for
%mid-surf
Ply_D(1,k)=0;
else
Ply_D(1,k)=sum_t(1,p)-t_2;
end
end
end
%--------------------------------------------------------------------------
%This step calculates the distances for plies to a mid-surf that falls in
%the between two plies
%--------------------------------------------------------------------------
else
for n=1:PC+1
if sum_t<t_2
Ply_D(1,n)=t_2-sum_t(1,n);
else
Ply_D(1,n)=sum_t(1,n)-t_2;
end
end
end
if core==0
Ply_D=Ply_D;
else
%--------------------------------------------------------------------------
%Calculates distances for plies in composite core structure----------------
%--------------------------------------------------------------------------
for i=1:PC+2
if Ply_D(i)<0
Ply_D1(i)=Ply_D(i)-core/2;
elseif Ply_D(i)==0
Ply_D1(i)=Ply_D(i)+core/2;
elseif Ply_D(i)>0
Ply_D1(i)=Ply_D(i)+core/2;
end
end
Ply_D=[Ply_D1(1,1:PC/2) 0 Ply_D1(1,PC/2+3:end)]
end
%--------------------------------------------------------------------------
%Transformation Matrix-----------------------------------------------------
%--------------------------------------------------------------------------
R=[1 0 0
0 1 0
0 0 2];
for j= 1: PC
c(j)=cosd(LAMINATE(2,j));
s(j)=sind(LAMINATE(2,j));
end
for i=1:PC
T(:,:,i)=[c(i)^2 s(i)^2 2*c(i)*s(i);s(i)^2 c(i)^2 -2*c(i)*s(i);...
-s(i)*c(i) s(i)*c(i) c(i)^2-s(i)^2];
end
%--------------------------------------------------------------------------
%Q_BAR Matrix-----------------------------------------------------
%--------------------------------------------------------------------------
for z=1:PC
Q_BAR(:,:,z)= inv(T(:,:,z))*Q_M*R*T(:,:,z)*inv(R);
end
%--------------------------------------------------------------------------
%A Matrix-----------------------------------------------------
%--------------------------------------------------------------------------
A=zeros(3,3);
for k=1:PC
A_1= Q_BAR(1,1,k)*(Ply_D(k+1)-Ply_D(k));
A(1,1)=A(1,1)+A_1;
A_2= Q_BAR(1,2,k)*(Ply_D(k+1)-Ply_D(k));
A(1,2)=A(1,2)+A_2;
A_3= Q_BAR(1,3,k)*(Ply_D(k+1)-Ply_D(k));
A(1,3)=A(1,3)+A_3;
A_4= Q_BAR(2,1,k)*(Ply_D(k+1)-Ply_D(k));
A(2,1)=A(2,1)+A_4;
A_5= Q_BAR(2,2,k)*(Ply_D(k+1)-Ply_D(k));
A(2,2)=A(2,2)+A_5;
A_6= Q_BAR(2,3,k)*(Ply_D(k+1)-Ply_D(k));
A(2,3)=A(2,3)+A_6;
A_7= Q_BAR(3,1,k)*(Ply_D(k+1)-Ply_D(k));
A(3,1)=A(3,1)+A_7;
A_8= Q_BAR(3,2,k)*(Ply_D(k+1)-Ply_D(k));
A(3,2)=A(3,2)+A_8;
A_9= Q_BAR(3,3,k)*(Ply_D(k+1)-Ply_D(k));
A(3,3)=A(3,3)+A_9;
end
B=zeros(3,3);
for k=1:PC
B_1= Q_BAR(1,1,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(1,1)=B(1,1)+B_1;
B_2= Q_BAR(1,2,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(1,2)=B(1,2)+B_2;
B_3= Q_BAR(1,3,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(1,3)=B(1,3)+B_3;
B_4= Q_BAR(2,1,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(2,1)=B(2,1)+B_4;
B_5= Q_BAR(2,2,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(2,2)=B(2,2)+B_5;
B_6= Q_BAR(2,3,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(2,3)=B(2,3)+B_6;
B_7= Q_BAR(3,1,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(3,1)=B(3,1)+B_7;
B_8= Q_BAR(3,2,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(3,2)=B(3,2)+B_8;
B_9= Q_BAR(3,3,k)*((Ply_D(k+1)^2-Ply_D(k)^2)/2);
B(3,3)=B(3,3)+B_9;
end
D=zeros(3,3);
for k=1:PC
D_1= Q_BAR(1,1,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(1,1)=D(1,1)+D_1;
D_2= Q_BAR(1,2,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(1,2)=D(1,2)+D_2;
D_3= Q_BAR(1,3,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(1,3)=D(1,3)+D_3;
D_4= Q_BAR(2,1,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(2,1)=D(2,1)+D_4;
D_5= Q_BAR(2,2,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(2,2)=D(2,2)+D_5;
D_6= Q_BAR(2,3,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(2,3)=D(2,3)+D_6;
D_7= Q_BAR(3,1,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(3,1)=D(3,1)+D_7;
D_8= Q_BAR(3,2,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(3,2)=D(3,2)+D_8;
D_9= Q_BAR(3,3,k)*((Ply_D(k+1)^3-Ply_D(k)^3)/3);
D(3,3)=D(3,3)+D_9;
end
ABD=[A,B;B,D];
ABD_I=inv(ABD);
%--------------------------------------------------------------------------
%Thermal Forces and moments------------------------------------------------
%--------------------------------------------------------------------------
for i=1:PC
N_xT(i)=(Q_BAR(1,1,i)*a_x(i)+Q_BAR(1,2,i)*a_y(i)+Q_BAR(1,3,i)*a_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
N_yT(i)=(Q_BAR(1,2,i)*a_x(i)+Q_BAR(2,2,i)*a_y(i)+Q_BAR(2,3,i)*a_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
N_xy(i)=(Q_BAR(1,3,i)*a_x(i)+Q_BAR(2,3,i)*a_y(i)+Q_BAR(3,3,i)*a_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
M_xT(i)=(Q_BAR(1,1,i)*a_x(i)+Q_BAR(1,2,i)*a_y(i)+Q_BAR(1,3,i)*a_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
M_yT(i)=(Q_BAR(1,2,i)*a_x(i)+Q_BAR(2,2,i)*a_y(i)+Q_BAR(2,3,i)*a_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
M_xyT(i)=(Q_BAR(1,3,i)*a_x(i)+Q_BAR(2,3,i)*a_y(i)+Q_BAR(3,3,i)*a_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
end
N_xxT=Dt*sum(N_xT);
N_yyT=Dt*sum(N_yT);
N_xyT=Dt*sum(N_xy);
M_xxT=Dt/2*sum(M_xT);
M_yyT=Dt/2*sum(M_yT);
M_xyT=Dt/2*sum(M_xyT);
%--------------------------------------------------------------------------
%Hygrothermal Forces and moments-------------------------------------------
%--------------------------------------------------------------------------
for i=1:PC
N_xH(i)=(Q_BAR(1,1,i)*b_x(i)+Q_BAR(1,2,i)*b_y(i)+Q_BAR(1,3,i)*b_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
N_yH(i)=(Q_BAR(1,2,i)*b_x(i)+Q_BAR(2,2,i)*b_y(i)+Q_BAR(2,3,i)*b_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
N_xyH(i)=(Q_BAR(1,3,i)*b_x(i)+Q_BAR(2,3,i)*b_y(i)+Q_BAR(3,3,i)*b_xy(i))*...
((Ply_D(i+1)-Ply_D(i)));
M_xH(i)=(Q_BAR(1,1,i)*b_x(i)+Q_BAR(1,2,i)*b_y(i)+Q_BAR(1,3,i)*b_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
M_yH(i)=(Q_BAR(1,2,i)*b_x(i)+Q_BAR(2,2,i)*b_y(i)+Q_BAR(2,3,i)*b_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
M_xyH(i)=(Q_BAR(1,3,i)*b_x(i)+Q_BAR(2,3,i)*b_y(i)+Q_BAR(3,3,i)*b_xy(i))*...
((Ply_D(i+1)^2-Ply_D(i)^2));
end
N_xxH=Dc*sum(N_xH);
N_yyH=Dc*sum(N_yH);
N_xyH=Dc*sum(N_xyH);
M_xxH=Dc/2*sum(M_xH);
M_yyH=Dc/2*sum(M_yH);
M_xyH=Dc/2*sum(M_xyH);
%--------------------------------------------------------------------------
%TOTAL FORCES AND MOMENTS--------------------------------------------------
%--------------------------------------------------------------------------
N_xxTotal=F_M(1,1)+N_xxT+N_xxH;
N_yyTotal=F_M(1,2)+N_yyT+N_yyH;
N_xyTotal=F_M(1,3)+N_xyT+N_xyH;
M_xxTotal=F_M(1,4)+M_xxT+M_xxH;
M_yyTotal=F_M(1,5)+M_yyT+M_yyH;
M_xyTotal=F_M(1,6)+M_xyT+M_xyH;
F_M_T=[N_xxTotal;N_yyTotal;N_xyTotal;M_xxTotal;M_yyTotal;M_xyTotal];
%%
%--------------------------------------------------------------------------
%SOLVES for Laminate STRAINES AND CURVATURES-------------------------------
%--------------------------------------------------------------------------
Ep_k=ABD_I*F_M_T;
%%
%--------------------------------------------------------------------------
%SOLVES for Individual Plys global and local STRAINS and Stresses----------
%--------------------------------------------------------------------------
for n=1:PC+1
if sum_t<t_2
Ply_Dis(1,n)=t_2-sum_t(1,n);
else
Ply_Dis(1,n)=sum_t(1,n)-t_2;
end
end
if core==0
Ply_Dis=Ply_D;
else
for i=1:PC+1
if Ply_Dis(i)<0
Ply_Dis(i)=Ply_Dis(i)-core/2;
elseif Ply_Dis(i)>0
Ply_Dis(i)=Ply_Dis(i)+core/2;
end
end
end
for i=1:length(Ply_Dis)-1
P(:,i)=[Ply_Dis(i),(Ply_Dis(i)+Ply_Dis(i+1))/2, Ply_Dis(i+1)];
end
for i=1:length(P)
Global_Top_Strains_Ply(:,i)=(Ep_k(1:3)+P(1,i).*Ep_k(4:6));
Global_Top_Strains_Ply(:,i)= Global_Top_Strains_Ply(:,i)-(Dt*alpha(:,i));
Global_Middle_Strains_Ply(:,i)=(Ep_k(1:3)+P(2,i).*Ep_k(4:6));
Global_Middle_Strains_Ply(:,i)= Global_Middle_Strains_Ply(:,i)-(Dt*alpha(:,i));
Global_Bottom_Strains_Ply(:,i)=(Ep_k(1:3)+P(3,i).*Ep_k(4:6));
Global_Bottom_Strains_Ply(:,i)= Global_Bottom_Strains_Ply(:,i)-(Dt*alpha(:,i));
Total_Global_Strains_Ply(:,:,i)=[Global_Top_Strains_Ply(:,i),...
Global_Middle_Strains_Ply(:,i),Global_Bottom_Strains_Ply(:,i)];
Total_Local_Strains(:,:,i)=T(:,:,i)*Total_Global_Strains_Ply(:,:,i);
Total_Global_Stresses(:,:,i)=Q_BAR(:,:,i)*...
Total_Global_Strains_Ply(:,:,i);
Total_Local_Stresses(:,:,i)=T(:,:,i)*Total_Global_Stresses(:,:,i);
end
%%
%--------------------------------------------------------------------------
%SOLVES if Failure occures at any location on any ply----------------------
%--------------------------------------------------------------------------
F1=(1/XT)+(1/XC);
F11=-1/(XT*XC);
F2=(1/YT)+(1/YC);
F22=-1/(YT*YC);
F6=0;
F66=1/S^2;
if SIG_B==0;
F12=0;
else
F12=1/(2*SIG_B^2)*(1-((1/XT)+(1/XC)+(1/YT)+(1/YC))*SIG_B+((1/XT*XC)+...
(1/YT*YC)*SIG_B^2));
end
for i= 1:length(Total_Local_Stresses)
Tsai_Wu_Top(:,i)=F1*Total_Local_Stresses(1,1,i)+F2*...
Total_Local_Stresses(2,1,i)+F11*Total_Local_Stresses(1,1,i)^2+ ...
F22*Total_Local_Stresses(2,1,i)^2+F66*Total_Local_Stresses(3,1,i)^2 ...
+2*F12*Total_Local_Stresses(1,1,i)*Total_Local_Stresses(2,1,i);
Tsai_Wu_Middle(:,i)=F1*Total_Local_Stresses(1,2,i)+F2*...
Total_Local_Stresses(2,2,i)+F11*Total_Local_Stresses(1,2,i)^2+ ...
F22*Total_Local_Stresses(2,2,i)^2+F66*Total_Local_Stresses(3,2,i)^2 ...
+2*F12*Total_Local_Stresses(1,2,i)*Total_Local_Stresses(2,2,i);
Tsai_Wu_Bottom(:,i)=F1*Total_Local_Stresses(1,3,i)+F2*...
Total_Local_Stresses(2,3,i)+F11*Total_Local_Stresses(1,3,i)^2+ ...
F22*Total_Local_Stresses(2,3,i)^2+F66*Total_Local_Stresses(3,3,i)^2 ...
+2*F12*Total_Local_Stresses(1,3,i)*Total_Local_Stresses(2,3,i);
Tsai_Wu_Total(:,:,i)=[ Tsai_Wu_Top(:,i), Tsai_Wu_Middle(:,i),...
Tsai_Wu_Bottom(:,i)];
end
Answers (1)
Walter Roberson
on 4 Apr 2023
0 votes
There are a few different logic structures you can use.
- you can start with while true . At some point test whether the variables are all in range; if so, then break the loop
- you can start with while true. At some point test whether any variable are out of range; if so, then continue to return to the top of the loop
- you can initialize the variables to be out of tolerance, and then use while with a condition that tests for them being out of tolerance. No test of conditions within the loop is needed.
- you can set a flag such as KeepGoing = true; and while KeepGoing . At some point in the loop, test the variables and if they are all in range, set KeepGoing = false; . You will not need break or continue if you use this
Categories
Find more on Chemical Process Design in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!