HELP Optimize code by returning to line 1 if condition not met.

1 view (last 30 days)
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
Walter Roberson on 4 Apr 2023
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

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!