From 2820cb0086fd153951896d967d38f2372bb43bcf Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 28 Feb 2017 16:58:24 -0500 Subject: [PATCH 01/47] after modifying time_modification I was assigning to the same time_modification which has different classname folder --- optimization_7_repro_multiple_2.asv | 206 ++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.m | 32 +++-- 2 files changed, 224 insertions(+), 14 deletions(-) create mode 100644 optimization_7_repro_multiple_2.asv diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv new file mode 100644 index 0000000..00af6e4 --- /dev/null +++ b/optimization_7_repro_multiple_2.asv @@ -0,0 +1,206 @@ +clear all +% close all + + +%test +classnumb=[4 6]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +fuel_sim={'modify_class4_class6_success'}; + +%% read modification ignition delay time +% mechanism={'MFC'}; +mechanism={'Ra_Reitz'}; +% currentloc = pwd; +date = {'01_30_2017'}; +% fuel_name = {'n_dodecane'}; +fuel_name = {'n_heptane'}; +equi=1; + +currentloc = 'C:\Users\unghee\Dropbox\post_process'; + + + + + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +k = 2 +directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; +% location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] +location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +cd(location_rateParam) +load rateParam.mat; + + +% load rateParam.mat; + +% real_fuel_ID; +% pure_component_ID; +% Target_data = Shen_hep_40atm; +% % Target_data = Vasu_40atm; +% % Target_data = Wang_40atm; +% Temp = Target_data(:,2); +% Temp_un = Target_data(:,1); + +num_cases_target=25; +location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +cd(location_target) +addpath(currentloc) +time_struct_target=read_ignition_delay(location_target,num_cases_target); +Temp=time_struct_target.table.data(:,6)/1000; % do we have to include temp? + +Target_data=time_struct_target.table.data(:,10); +range = 13:20; +Temp = Temp(range); +Target_data = Target_data(range); + +cd ../../.. + + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +equi=1; + +% class_numb_text{1} = ['class6']; + + + A = rateParam.(class_numb_text{1})(:,1); + E = rateParam.(class_numb_text{1})(:,2); +%% read modification ignition delay time +mechanism={'Ra_Reitz'}; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= size(A,1); +date = {'01_30_2017'}; +fuel_name = {'n_heptane'}; +directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; +for j = 1: size(Temp,1) + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + end + +end + + +%% coefficient +for k = 1 : size(Temp,1) +% for k = 1 : 1 + + Temp_current = Temp(k); + time_current = time_modification(:,k); +% type = fittype({'log(x)','log(Temp_current)','y','log(x)*y','(log(x))^2','y^2'}... % linear term3 +% ,'independent', {'x', 'y'},'dependent','z','problem','Temp_current'); +% options=fitoptions('Method','LinearLeastSquares') +% sf = fit([A,E],log(time_current),type,options, 'problem',Temp_current); +% +% coefs(k,:)=coeffvalues(sf); +% plot(sf,[A,E],log(time_current)); +% zlim([4 9]); + totalM = []; + for n = 1: numbOfClass + A = rateParam.(class_numb_text{n})(:,1); + E = rateParam.(class_numb_text{n})(:,2); + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; + totalM = [totalM M]; + d = log(time_current.(class_numb_text{n})); + end + + coefs_inv = lsqlin(totalM,d); + coefs_element = coefs_inv'; + coefsTotal = []; + + for n = 1: length(class_numb_text) + coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefsTotal =[coefsTotal coefs.(class_numb_text{n})(k,:)]; + end + + + + prediction{:,k}=totalM*coefsTotal'-d; + +% Model_igtime=@(x,y) coefs(k,1)*log(x)+coefs(k,2)*log(Temp_current)+coefs(k,3)*y... +% + coefs(k,4)*log(x)*y + coefs(k,5)*(log(x))^2+coefs(k,6)*y^2; % linear term3 +% +% for i= 1: size(A,1) +% prediction{:,k}(i,1)=exp(Model_igtime(A(i),E(i))); +% end +% prediction{:,k}(:,2)=time_current; +% prediction{:,k}(:,3)= prediction{:,k}(:,1)-prediction{:,k}(:,2); +% prediction{:,k}(:,4)= mean(abs(prediction{:,k}(:,3))); + +end + +% coefs=coefs.class4; + +%% OPTIMIZER + +% Target Temp value + +% te(:,1) = Target_data(:,3); + +te(:,1) = Target_data; +numberOftempPoints = size(te(:,1),1); +%% objective function +% ObjectiveFunction=ObjectiveFunction_array5(numberOftempPoints,numbOfClass,te,Temp,coefs); +% ObjectiveFunction=ObjectiveFunction_array6(numberOftempPoints,numbOfClass,te,Temp,coefs,class_numb_text); +ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); + +LB =[]; +UB =[]; + +% class4 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) +% LB =[0.706e+14*0.13 37904-2000 ]; +% LB =[0.706e+14*0.13 0 ]; +% UB =[0.706e+14*10 37904+2000]; +LB =[42360000000000*0.13 0 ]; +UB =[42360000000000*10 35904+2000]; +end + +% class6 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) +LB =[LB 19955000000000*0.13 0]; +UB =[UB 19955000000000*10 16232.712+2000]; +end + +nvars=2*numbOfClass; +options=gaoptimset('PopulationSize',500); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); + +X = result_ga; + +error=ObjectiveFunction(X) + +for i = 1 : numbOfClass +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +end + +location_save=[currentloc,'\',mechanism{1},'\',directory]; +cd(location_save) + +save('final_result.mat','final_result') +%% read final ignition delay time after optimization plug into plot part. +% mechanism={'Ra_Reitz'}; +% fuel_sim={'afteroptimize_class6_temp_all_shen' }; +% pressure = 40; +% num_cases=25; +% currentloc = pwd; +% location=[currentloc,'\',mechanism{i},'\',fuel_sim{1},'_',num2str(pressure(1)),'atm_phi1']; +% +% % +% time_struct=read_ignition_delay(location,num_cases); +% time=time_struct.table.data(:,10)/1000; diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 241c849..267586c 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -89,18 +89,18 @@ % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification(:,j)=time_struct_modification.table.data(:,10); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); end end %% coefficient -for k = 1 : size(Temp,1) +for j = 1 : size(Temp,1) % for k = 1 : 1 - Temp_current = Temp(k); - time_current = time_modification(:,k); + Temp_current = Temp(j); + % type = fittype({'log(x)','log(Temp_current)','y','log(x)*y','(log(x))^2','y^2'}... % linear term3 % ,'independent', {'x', 'y'},'dependent','z','problem','Temp_current'); % options=fitoptions('Method','LinearLeastSquares') @@ -110,26 +110,30 @@ % plot(sf,[A,E],log(time_current)); % zlim([4 9]); totalM = []; - for n = 1: numbOfClass - A = rateParam.(class_numb_text{n})(:,1); - E = rateParam.(class_numb_text{n})(:,2); + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; totalM = [totalM M]; - - end d = log(time_current); coefs_inv = lsqlin(totalM,d); coefs_element = coefs_inv'; - coefsTotal = []; - for n = 1: length(class_numb_text) - coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); - coefsTotal =[coefsTotal coefs.(class_numb_text{n})(k,:)]; + + +% coefsTotal = []; + +% for n = 1: length(class_numb_text) +% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefs.(class_numb_text{k})(j,:)=coefs_element; +% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; + prediction.(class_numb_text{k}){:,j}=totalM*coefs_element'-d; end - prediction{:,k}=totalM*coefsTotal'-d; + % Model_igtime=@(x,y) coefs(k,1)*log(x)+coefs(k,2)*log(Temp_current)+coefs(k,3)*y... % + coefs(k,4)*log(x)*y + coefs(k,5)*(log(x))^2+coefs(k,6)*y^2; % linear term3 From 56231c87dc15293c325e885680bd55aea0777526 Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 28 Feb 2017 17:11:47 -0500 Subject: [PATCH 02/47] individual not working.. seems it overestimate --- optimization_7_repro_multiple_2.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 267586c..4a1b017 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -109,15 +109,15 @@ % coefs(k,:)=coeffvalues(sf); % plot(sf,[A,E],log(time_current)); % zlim([4 9]); - totalM = []; +% totalM = []; for k = 1: numbOfClass time_current = time_modification.(class_numb_text{k})(:,j); A = rateParam.(class_numb_text{k})(:,1); E = rateParam.(class_numb_text{k})(:,2); M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; - totalM = [totalM M]; +% totalM = [totalM M]; d = log(time_current); - coefs_inv = lsqlin(totalM,d); + coefs_inv = lsqlin(M,d); coefs_element = coefs_inv'; @@ -128,7 +128,7 @@ % coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); coefs.(class_numb_text{k})(j,:)=coefs_element; % coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; - prediction.(class_numb_text{k}){:,j}=totalM*coefs_element'-d; + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; end From 3e396f40f7877d27f9729a482e753c6b9cd6eb4c Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 28 Feb 2017 22:22:07 -0500 Subject: [PATCH 03/47] temp range change not matching --- optimization_7_repro_multiple_2.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 4a1b017..dc099dd 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -57,8 +57,12 @@ time_struct_target=read_ignition_delay(location_target,num_cases_target); Temp=time_struct_target.table.data(:,6)/1000; % do we have to include temp? + Target_data=time_struct_target.table.data(:,10); range = 13:20; + +Temp=flip(Temp); +Target_data=flip(Target_data); Temp = Temp(range); Target_data = Target_data(range); @@ -84,17 +88,20 @@ date = {'01_30_2017'}; fuel_name = {'n_heptane'}; directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; -for j = 1: size(Temp,1) +for j = range for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); end end - - +for k = 1: numbOfClass + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); + temp_modification.(class_numb_text{k})(:)=temp_modification.(class_numb_text{k})(:,range); +end %% coefficient for j = 1 : size(Temp,1) % for k = 1 : 1 From 40fa07d3e720caa34f012aa1c4d4980a163f4355 Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 28 Feb 2017 22:45:25 -0500 Subject: [PATCH 04/47] change classnumb to one.. it works well for one --- optimization_7_repro_multiple_2.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index dc099dd..a8ced2c 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -3,7 +3,7 @@ %test -classnumb=[4 6]; +classnumb=[6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -100,7 +100,7 @@ end for k = 1: numbOfClass time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); - temp_modification.(class_numb_text{k})(:)=temp_modification.(class_numb_text{k})(:,range); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); end %% coefficient for j = 1 : size(Temp,1) From 73013ece9ec06d1d042020d60aaa04ac7a699a26 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 12:06:26 -0500 Subject: [PATCH 05/47] add weighting factor in objective function --- find_rate_weighting.m | 32 +++++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.m | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 find_rate_weighting.m diff --git a/find_rate_weighting.m b/find_rate_weighting.m new file mode 100644 index 0000000..69bcbbc --- /dev/null +++ b/find_rate_weighting.m @@ -0,0 +1,32 @@ +function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data) +differTotal= 0; +timeTotal =zeros(length(Temp),1) ; +time = zeros(length(Temp),numbOfClass); +for j= 1: length(Temp) + + for i = 1: numbOfClass + + time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... + +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; + W(2*i-1) + W(2*i) + + + timeTotal(j)=time(j,i)+timeTotal(j); + + + + end + + differ(j) = abs(log10(Target_data(j))-W(2*i-1)*log10(exp(timeTotal(j)))); + differ(j) = abs(log10(Target_data(j))-W(2*i)*log10(exp(timeTotal(j)))); + + differTotal = differ(j) + differTotal; +end + + + + +end + diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index a8ced2c..6cc5b91 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -3,7 +3,7 @@ %test -classnumb=[6]; +classnumb=[4 6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass From 3a3f89343b5354ed7ddd0290e1d8f36b3125ec6c Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 16:09:10 -0500 Subject: [PATCH 06/47] w4*f4+w6*f6 = 2*target --- find_rate_weighting.asv | 40 +++++++++++++++++++++++++++++++ find_rate_weighting.m | 26 ++++++++++++-------- optimization_7_repro_multiple_2.m | 14 +++++------ 3 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 find_rate_weighting.asv diff --git a/find_rate_weighting.asv b/find_rate_weighting.asv new file mode 100644 index 0000000..12b359c --- /dev/null +++ b/find_rate_weighting.asv @@ -0,0 +1,40 @@ +function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data) +differTotal= 0; +timeTotal =zeros(length(Temp),1) ; +time = zeros(length(Temp),numbOfClass); +time_weight = zeros(length(Temp),numbOfClass); +for j= 1: length(Temp) + + for i = 1: numbOfClass + + X(3*i-1)=W; + X(3*i-2)=A; + X(3*i-3)=E; + + time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... + +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; + + time(j,i)=coefs.(classnumb_text{i})(j,1)*A+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... + +coefs.(classnumb_text{i})(j,5)*(A)^2+coefs.(classnumb_text{i})(j,6)*(E)^2; + + time_weight(j,i) = W*time(j,i); + + timeTotal(j)=time(j,i)+timeTotal(j); + + + + end + + differ(j) = abs(log10(Target_data(j))-W(2*i-1)*log10(exp(timeTotal(j)))); + differ(j) = abs(log10(Target_data(j))-W(2*i)*log10(exp(timeTotal(j)))); + + differTotal = differ(j) + differTotal; +end + + + + +end + diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 69bcbbc..620202b 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -2,26 +2,32 @@ differTotal= 0; timeTotal =zeros(length(Temp),1) ; time = zeros(length(Temp),numbOfClass); +time_weight = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) for i = 1: numbOfClass - - time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... - +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... - +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; - W(2*i-1) - W(2*i) + + A=X(3*i-2); + E=X(3*i-1); + W=X(3*i); + +% time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... +% +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... +% +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; + + time(j,i)=coefs.(classnumb_text{i})(j,1)*A+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... + +coefs.(classnumb_text{i})(j,5)*(A)^2+coefs.(classnumb_text{i})(j,6)*(E)^2; + time_weight(j,i) = W*time(j,i); - timeTotal(j)=time(j,i)+timeTotal(j); + timeTotal(j)=time_weight(j,i)+timeTotal(j); end - differ(j) = abs(log10(Target_data(j))-W(2*i-1)*log10(exp(timeTotal(j)))); - differ(j) = abs(log10(Target_data(j))-W(2*i)*log10(exp(timeTotal(j)))); - + differ(j) = abs(log10(numbOfClass*Target_data(j))-log10(exp(timeTotal(j)))); differTotal = differ(j) + differTotal; end diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 6cc5b91..20ac7c2 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -167,8 +167,8 @@ %% objective function % ObjectiveFunction=ObjectiveFunction_array5(numberOftempPoints,numbOfClass,te,Temp,coefs); % ObjectiveFunction=ObjectiveFunction_array6(numberOftempPoints,numbOfClass,te,Temp,coefs,class_numb_text); -ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); - +% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); LB =[]; UB =[]; @@ -177,17 +177,17 @@ % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[42360000000000*0.13 0 ]; -UB =[42360000000000*10 35904+2000]; +LB =[42360000000000*0.13 1 1]; +UB =[42360000000000*10 35904+2000 10]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 0]; -UB =[UB 19955000000000*10 16232.712+2000]; +LB =[LB 19955000000000*0.13 1 1]; +UB =[UB 19955000000000*10 16232.712+2000 10]; end -nvars=2*numbOfClass; +nvars=3*numbOfClass; options=gaoptimset('PopulationSize',500); [result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); [result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); From ec35b56bf71501a131a87b7b9a0f36978ad46506 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 16:44:18 -0500 Subject: [PATCH 07/47] w4(f4-target) +w6(f6-target) --- find_rate_weighting.asv | 18 ++++++++---------- find_rate_weighting.m | 10 +++++----- optimization_7_repro_multiple_2.m | 12 +++++++----- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/find_rate_weighting.asv b/find_rate_weighting.asv index 12b359c..620202b 100644 --- a/find_rate_weighting.asv +++ b/find_rate_weighting.asv @@ -7,13 +7,13 @@ for j= 1: length(Temp) for i = 1: numbOfClass - X(3*i-1)=W; - X(3*i-2)=A; - X(3*i-3)=E; + A=X(3*i-2); + E=X(3*i-1); + W=X(3*i); - time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... - +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... - +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; +% time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... +% +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... +% +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; time(j,i)=coefs.(classnumb_text{i})(j,1)*A+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... @@ -21,15 +21,13 @@ for j= 1: length(Temp) time_weight(j,i) = W*time(j,i); - timeTotal(j)=time(j,i)+timeTotal(j); + timeTotal(j)=time_weight(j,i)+timeTotal(j); end - differ(j) = abs(log10(Target_data(j))-W(2*i-1)*log10(exp(timeTotal(j)))); - differ(j) = abs(log10(Target_data(j))-W(2*i)*log10(exp(timeTotal(j)))); - + differ(j) = abs(log10(numbOfClass*Target_data(j))-log10(exp(timeTotal(j)))); differTotal = differ(j) + differTotal; end diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 620202b..632ad95 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -2,7 +2,7 @@ differTotal= 0; timeTotal =zeros(length(Temp),1) ; time = zeros(length(Temp),numbOfClass); -time_weight = zeros(length(Temp),numbOfClass); +time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) for i = 1: numbOfClass @@ -19,16 +19,16 @@ +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... +coefs.(classnumb_text{i})(j,5)*(A)^2+coefs.(classnumb_text{i})(j,6)*(E)^2; - time_weight(j,i) = W*time(j,i); + time_weight_differ(j,i)= W*abs(log10(Target_data(j))-log10(exp(time(j,i)))); - timeTotal(j)=time_weight(j,i)+timeTotal(j); + timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class end - differ(j) = abs(log10(numbOfClass*Target_data(j))-log10(exp(timeTotal(j)))); - differTotal = differ(j) + differTotal; + + differTotal = timeTotal(j) + differTotal; % sum up Temp end diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 20ac7c2..3c25534 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -177,14 +177,14 @@ % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[42360000000000*0.13 1 1]; -UB =[42360000000000*10 35904+2000 10]; +LB =[42360000000000*0.13 0 0]; +UB =[42360000000000*10 35904+2000 100]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 1 1]; -UB =[UB 19955000000000*10 16232.712+2000 10]; +LB =[LB 19955000000000*0.13 0 0]; +UB =[UB 19955000000000*10 16232.712+2000 100]; end nvars=3*numbOfClass; @@ -199,7 +199,9 @@ for i = 1 : numbOfClass final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; end - +% for i = 1 : numbOfClass +% final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; +% end location_save=[currentloc,'\',mechanism{1},'\',directory]; cd(location_save) From f4fed97169c4dd996176f49e4a142ccad4df41a6 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 20:48:22 -0500 Subject: [PATCH 08/47] multiple class first success!! after changing the weight to 1 !! --- find_rate_weighting.m | 10 +++++----- optimization_7_repro_multiple_2.m | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 632ad95..2605daa 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -9,15 +9,15 @@ A=X(3*i-2); E=X(3*i-1); - W=X(3*i); - +% W=X(3*i); + W =1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; - time(j,i)=coefs.(classnumb_text{i})(j,1)*A+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... - +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... - +coefs.(classnumb_text{i})(j,5)*(A)^2+coefs.(classnumb_text{i})(j,6)*(E)^2; + time(j,i)=coefs.(classnumb_text{i})(j,1)*log(A)+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*log(A)*E... + +coefs.(classnumb_text{i})(j,5)*(log(A))^2+coefs.(classnumb_text{i})(j,6)*(E)^2; time_weight_differ(j,i)= W*abs(log10(Target_data(j))-log10(exp(time(j,i)))); diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 3c25534..70da224 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -197,7 +197,7 @@ error=ObjectiveFunction(X) for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +final_result.(class_numb_text{i})= [result_ga(1,3*i-2:3*i-1); result_fmin(1,3*i-2:3*i-1)]; end % for i = 1 : numbOfClass % final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; From faa97909e2cf832af50f4d0771e48c610ad60edf Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 21:01:02 -0500 Subject: [PATCH 09/47] finally working.. now what is X(3*i) ? I didn't define any like this --- find_rate_weighting.m | 2 +- optimization_7_repro_multiple_2.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 2605daa..a09413d 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -23,7 +23,7 @@ timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class - + X(3*i) end diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 70da224..90edd1d 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -197,7 +197,7 @@ error=ObjectiveFunction(X) for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,3*i-2:3*i-1); result_fmin(1,3*i-2:3*i-1)]; +final_result.(class_numb_text{i})= [result_ga(1,3*i-2:3*i); result_fmin(1,3*i-2:3*i)]; end % for i = 1 : numbOfClass % final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; From 95209e3515cdefcb56316ec942661ec6576c6a12 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 21:17:31 -0500 Subject: [PATCH 10/47] works with 2*i seems that defining the objective function was a problem. Then what is the difference with just 2*target data... which is the no weighting branch? --- find_rate_weighting.m | 6 +-- optimization_7_repro_multiple_2.asv | 67 +++++++++++++++++------------ optimization_7_repro_multiple_2.m | 14 +++--- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/find_rate_weighting.m b/find_rate_weighting.m index a09413d..457ea9f 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -7,8 +7,8 @@ for i = 1: numbOfClass - A=X(3*i-2); - E=X(3*i-1); + A=X(2*i-1); + E=X(2*i); % W=X(3*i); W =1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... @@ -23,7 +23,7 @@ timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class - X(3*i) +% X(3*i) end diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index 00af6e4..11c08d7 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -57,8 +57,12 @@ addpath(currentloc) time_struct_target=read_ignition_delay(location_target,num_cases_target); Temp=time_struct_target.table.data(:,6)/1000; % do we have to include temp? + Target_data=time_struct_target.table.data(:,10); range = 13:20; + +Temp=flip(Temp); +Target_data=flip(Target_data); Temp = Temp(range); Target_data = Target_data(range); @@ -84,23 +88,26 @@ num_cases_modification= size(A,1); date = {'01_30_2017'}; fuel_name = {'n_heptane'}; directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; -for j = 1: size(Temp,1) +for j = range for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); end end - - +for k = 1: numbOfClass + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); +end %% coefficient -for k = 1 : size(Temp,1) +for j = 1 : size(Temp,1) % for k = 1 : 1 - Temp_current = Temp(k); - time_current = time_modification(:,k); + Temp_current = Temp(j); + % type = fittype({'log(x)','log(Temp_current)','y','log(x)*y','(log(x))^2','y^2'}... % linear term3 % ,'independent', {'x', 'y'},'dependent','z','problem','Temp_current'); % options=fitoptions('Method','LinearLeastSquares') @@ -109,27 +116,31 @@ for k = 1 : size(Temp,1) % coefs(k,:)=coeffvalues(sf); % plot(sf,[A,E],log(time_current)); % zlim([4 9]); - totalM = []; - for n = 1: numbOfClass - A = rateParam.(class_numb_text{n})(:,1); - E = rateParam.(class_numb_text{n})(:,2); +% totalM = []; + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; - totalM = [totalM M]; - d = log(time_current.(class_numb_text{n})); - end - - coefs_inv = lsqlin(totalM,d); +% totalM = [totalM M]; + d = log(time_current); + coefs_inv = lsqlin(M,d); coefs_element = coefs_inv'; - coefsTotal = []; - for n = 1: length(class_numb_text) - coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); - coefsTotal =[coefsTotal coefs.(class_numb_text{n})(k,:)]; + + +% coefsTotal = []; + +% for n = 1: length(class_numb_text) +% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefs.(class_numb_text{k})(j,:)=coefs_element; +% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; end - prediction{:,k}=totalM*coefsTotal'-d; + % Model_igtime=@(x,y) coefs(k,1)*log(x)+coefs(k,2)*log(Temp_current)+coefs(k,3)*y... % + coefs(k,4)*log(x)*y + coefs(k,5)*(log(x))^2+coefs(k,6)*y^2; % linear term3 @@ -156,8 +167,8 @@ numberOftempPoints = size(te(:,1),1); %% objective function % ObjectiveFunction=ObjectiveFunction_array5(numberOftempPoints,numbOfClass,te,Temp,coefs); % ObjectiveFunction=ObjectiveFunction_array6(numberOftempPoints,numbOfClass,te,Temp,coefs,class_numb_text); -ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); - +% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); LB =[]; UB =[]; @@ -167,13 +178,13 @@ if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; LB =[42360000000000*0.13 0 ]; -UB =[42360000000000*10 35904+2000]; +UB =[42360000000000*10 35904+2000 ]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 0]; -UB =[UB 19955000000000*10 16232.712+2000]; +LB =[LB 19955000000000*0.13 0 ]; +UB =[UB 19955000000000*10 16232.712+2000 ]; end nvars=2*numbOfClass; @@ -186,9 +197,11 @@ X = result_ga; error=ObjectiveFunction(X) for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-2:3*i)]; end - +% for i = 1 : numbOfClass +% final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; +% end location_save=[currentloc,'\',mechanism{1},'\',directory]; cd(location_save) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 90edd1d..a9a6121 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -59,7 +59,7 @@ Target_data=time_struct_target.table.data(:,10); -range = 13:20; +range = 13:24; Temp=flip(Temp); Target_data=flip(Target_data); @@ -177,17 +177,17 @@ % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[42360000000000*0.13 0 0]; -UB =[42360000000000*10 35904+2000 100]; +LB =[42360000000000*0.13 0 ]; +UB =[42360000000000*10 35904+2000 ]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 0 0]; -UB =[UB 19955000000000*10 16232.712+2000 100]; +LB =[LB 19955000000000*0.13 0 ]; +UB =[UB 19955000000000*10 16232.712+2000 ]; end -nvars=3*numbOfClass; +nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); [result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); [result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); @@ -197,7 +197,7 @@ error=ObjectiveFunction(X) for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,3*i-2:3*i); result_fmin(1,3*i-2:3*i)]; +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; end % for i = 1 : numbOfClass % final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; From 8c60289d45cb94ae2a0358482a8519c2a5c85ae3 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 1 Mar 2017 23:51:46 -0500 Subject: [PATCH 11/47] 3class sort of working,,? --- optimization_7_repro_multiple_2.m | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index a9a6121..f68c42a 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -3,14 +3,14 @@ %test -classnumb=[4 6]; +classnumb=[2 4 6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class4_class6_success'}; +fuel_sim={'modify_class2_class4_class6'}; %% read modification ignition delay time % mechanism={'MFC'}; @@ -59,7 +59,7 @@ Target_data=time_struct_target.table.data(:,10); -range = 13:24; +range = 12:22; Temp=flip(Temp); Target_data=flip(Target_data); @@ -171,14 +171,21 @@ ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); LB =[]; UB =[]; - +% class2 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) +% LB =[0.706e+14*0.13 37904-2000 ]; +% LB =[0.706e+14*0.13 0 ]; +% UB =[0.706e+14*10 37904+2000]; +LB =[LB 0.478e+10*0.13 0 ]; +UB =[UB 0.478e+10*10 690+2000 ]; +end % class4 if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[42360000000000*0.13 0 ]; -UB =[42360000000000*10 35904+2000 ]; +LB =[LB 42360000000000*0.13 0 ]; +UB =[UB 42360000000000*10 35904+2000 ]; end % class6 From 22e74a929e51009f9abf69a304c2e39416d907f3 Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 2 Mar 2017 13:21:32 -0500 Subject: [PATCH 12/47] now test with entire range! 3class succes!! seems that if I changed class 2 moderately it worked !!! and automatized the LB UB --- find_rate_weighting.asv | 38 ----- optimization_7_repro_multiple_2.asv | 219 ---------------------------- 2 files changed, 257 deletions(-) delete mode 100644 find_rate_weighting.asv delete mode 100644 optimization_7_repro_multiple_2.asv diff --git a/find_rate_weighting.asv b/find_rate_weighting.asv deleted file mode 100644 index 620202b..0000000 --- a/find_rate_weighting.asv +++ /dev/null @@ -1,38 +0,0 @@ -function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data) -differTotal= 0; -timeTotal =zeros(length(Temp),1) ; -time = zeros(length(Temp),numbOfClass); -time_weight = zeros(length(Temp),numbOfClass); -for j= 1: length(Temp) - - for i = 1: numbOfClass - - A=X(3*i-2); - E=X(3*i-1); - W=X(3*i); - -% time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... -% +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... -% +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; - - time(j,i)=coefs.(classnumb_text{i})(j,1)*A+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... - +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*A*E... - +coefs.(classnumb_text{i})(j,5)*(A)^2+coefs.(classnumb_text{i})(j,6)*(E)^2; - - time_weight(j,i) = W*time(j,i); - - timeTotal(j)=time_weight(j,i)+timeTotal(j); - - - - end - - differ(j) = abs(log10(numbOfClass*Target_data(j))-log10(exp(timeTotal(j)))); - differTotal = differ(j) + differTotal; -end - - - - -end - diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv deleted file mode 100644 index 11c08d7..0000000 --- a/optimization_7_repro_multiple_2.asv +++ /dev/null @@ -1,219 +0,0 @@ -clear all -% close all - - -%test -classnumb=[4 6]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end -fuel_sim={'modify_class4_class6_success'}; - -%% read modification ignition delay time -% mechanism={'MFC'}; -mechanism={'Ra_Reitz'}; -% currentloc = pwd; -date = {'01_30_2017'}; -% fuel_name = {'n_dodecane'}; -fuel_name = {'n_heptane'}; -equi=1; - -currentloc = 'C:\Users\unghee\Dropbox\post_process'; - - - - - -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -k = 2 -directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; -% location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] -location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; -cd(location_rateParam) -load rateParam.mat; - - -% load rateParam.mat; - -% real_fuel_ID; -% pure_component_ID; -% Target_data = Shen_hep_40atm; -% % Target_data = Vasu_40atm; -% % Target_data = Wang_40atm; -% Temp = Target_data(:,2); -% Temp_un = Target_data(:,1); - -num_cases_target=25; -location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -cd(location_target) -addpath(currentloc) -time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp=time_struct_target.table.data(:,6)/1000; % do we have to include temp? - - -Target_data=time_struct_target.table.data(:,10); -range = 13:20; - -Temp=flip(Temp); -Target_data=flip(Target_data); -Temp = Temp(range); -Target_data = Target_data(range); - -cd ../../.. - - -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -equi=1; - -% class_numb_text{1} = ['class6']; - - - A = rateParam.(class_numb_text{1})(:,1); - E = rateParam.(class_numb_text{1})(:,2); -%% read modification ignition delay time -mechanism={'Ra_Reitz'}; -currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= size(A,1); -date = {'01_30_2017'}; -fuel_name = {'n_heptane'}; -directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; -for j = range - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); - end - -end -for k = 1: numbOfClass - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); -end -%% coefficient -for j = 1 : size(Temp,1) -% for k = 1 : 1 - - Temp_current = Temp(j); - -% type = fittype({'log(x)','log(Temp_current)','y','log(x)*y','(log(x))^2','y^2'}... % linear term3 -% ,'independent', {'x', 'y'},'dependent','z','problem','Temp_current'); -% options=fitoptions('Method','LinearLeastSquares') -% sf = fit([A,E],log(time_current),type,options, 'problem',Temp_current); -% -% coefs(k,:)=coeffvalues(sf); -% plot(sf,[A,E],log(time_current)); -% zlim([4 9]); -% totalM = []; - for k = 1: numbOfClass - time_current = time_modification.(class_numb_text{k})(:,j); - A = rateParam.(class_numb_text{k})(:,1); - E = rateParam.(class_numb_text{k})(:,2); - M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; -% totalM = [totalM M]; - d = log(time_current); - coefs_inv = lsqlin(M,d); - coefs_element = coefs_inv'; - - - -% coefsTotal = []; - -% for n = 1: length(class_numb_text) -% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); - coefs.(class_numb_text{k})(j,:)=coefs_element; -% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; - prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; - end - - - - - -% Model_igtime=@(x,y) coefs(k,1)*log(x)+coefs(k,2)*log(Temp_current)+coefs(k,3)*y... -% + coefs(k,4)*log(x)*y + coefs(k,5)*(log(x))^2+coefs(k,6)*y^2; % linear term3 -% -% for i= 1: size(A,1) -% prediction{:,k}(i,1)=exp(Model_igtime(A(i),E(i))); -% end -% prediction{:,k}(:,2)=time_current; -% prediction{:,k}(:,3)= prediction{:,k}(:,1)-prediction{:,k}(:,2); -% prediction{:,k}(:,4)= mean(abs(prediction{:,k}(:,3))); - -end - -% coefs=coefs.class4; - -%% OPTIMIZER - -% Target Temp value - -% te(:,1) = Target_data(:,3); - -te(:,1) = Target_data; -numberOftempPoints = size(te(:,1),1); -%% objective function -% ObjectiveFunction=ObjectiveFunction_array5(numberOftempPoints,numbOfClass,te,Temp,coefs); -% ObjectiveFunction=ObjectiveFunction_array6(numberOftempPoints,numbOfClass,te,Temp,coefs,class_numb_text); -% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -LB =[]; -UB =[]; - -% class4 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) -% LB =[0.706e+14*0.13 37904-2000 ]; -% LB =[0.706e+14*0.13 0 ]; -% UB =[0.706e+14*10 37904+2000]; -LB =[42360000000000*0.13 0 ]; -UB =[42360000000000*10 35904+2000 ]; -end - -% class6 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 0 ]; -UB =[UB 19955000000000*10 16232.712+2000 ]; -end - -nvars=2*numbOfClass; -options=gaoptimset('PopulationSize',500); -[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); -[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); - -X = result_ga; - -error=ObjectiveFunction(X) - -for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-2:3*i)]; -end -% for i = 1 : numbOfClass -% final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; -% end -location_save=[currentloc,'\',mechanism{1},'\',directory]; -cd(location_save) - -save('final_result.mat','final_result') -%% read final ignition delay time after optimization plug into plot part. -% mechanism={'Ra_Reitz'}; -% fuel_sim={'afteroptimize_class6_temp_all_shen' }; -% pressure = 40; -% num_cases=25; -% currentloc = pwd; -% location=[currentloc,'\',mechanism{i},'\',fuel_sim{1},'_',num2str(pressure(1)),'atm_phi1']; -% -% % -% time_struct=read_ignition_delay(location,num_cases); -% time=time_struct.table.data(:,10)/1000; From c726d99f64d1edbe266e4b2f130263250aebe9d0 Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 2 Mar 2017 13:22:19 -0500 Subject: [PATCH 13/47] 3class worked! seems that moderate change of class2 worked! automatized UB LB --- optimization_7_repro_multiple_2.m | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index f68c42a..609366e 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -10,7 +10,7 @@ % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class2_class4_class6'}; +fuel_sim={'modify_class2_class4_class6_moderate'}; %% read modification ignition delay time % mechanism={'MFC'}; @@ -59,8 +59,9 @@ Target_data=time_struct_target.table.data(:,10); -range = 12:22; - +% range = 12:22; % works slightly well ?? +% range = 12:25; % works slightly as well.. +range = 1:25; Temp=flip(Temp); Target_data=flip(Target_data); Temp = Temp(range); @@ -176,22 +177,29 @@ % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[LB 0.478e+10*0.13 0 ]; -UB =[UB 0.478e+10*10 690+2000 ]; +% LB =[LB 9.5600e+09*0.13 0 ]; +% UB =[UB 9.5600e+09*10 590+2000 ]; +LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; + end % class4 if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) % LB =[0.706e+14*0.13 37904-2000 ]; % LB =[0.706e+14*0.13 0 ]; % UB =[0.706e+14*10 37904+2000]; -LB =[LB 42360000000000*0.13 0 ]; -UB =[UB 42360000000000*10 35904+2000 ]; +% LB =[LB 42360000000000*0.13 0 ]; +% UB =[UB 42360000000000*10 35904+2000 ]; +LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB 19955000000000*0.13 0 ]; -UB =[UB 19955000000000*10 16232.712+2000 ]; +% LB =[LB 19955000000000*0.13 0 ]; +% UB =[UB 19955000000000*10 16232.712+2000 ]; +LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end nvars=2*numbOfClass; From 3ca5f9761ded7ef97c4ba1e284940a3e93902d5f Mon Sep 17 00:00:00 2001 From: JordLee Date: Fri, 3 Mar 2017 22:14:15 -0500 Subject: [PATCH 14/47] oneclass two pressure working! --- optimization_7_repro_multiple_2.asv | 224 ++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.m | 134 ++++++++--------- 2 files changed, 286 insertions(+), 72 deletions(-) create mode 100644 optimization_7_repro_multiple_2.asv diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv new file mode 100644 index 0000000..4059b19 --- /dev/null +++ b/optimization_7_repro_multiple_2.asv @@ -0,0 +1,224 @@ +clear all +% close all + + +%test +classnumb=[6]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +fuel_sim={'modify_class6_time0.1'}; + +%% read modification ignition delay time +% mechanism={'MFC'}; +mechanism={'Ra_Reitz'}; +% currentloc = pwd; +date = {'01_30_2017'}; +% fuel_name = {'n_dodecane'}; +fuel_name = {'n_heptane'}; +equi=1; + +currentloc = 'C:\Users\unghee\Dropbox\post_process'; + + + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +m = 2 +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] +location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +cd(location_rateParam) +load rateParam.mat; + +%% exp data +% load rateParam.mat; + +% real_fuel_ID; +% pure_component_ID; +% Target_data = Shen_hep_40atm; +% % Target_data = Vasu_40atm; +% % Target_data = Wang_40atm; +% Temp = Target_data(:,2); +% Temp_un = Target_data(:,1); +%% dummy target + +num_cases_target=25; +m = 1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +cd(location_target) +addpath(currentloc) +time_struct_target=read_ignition_delay(location_target,num_cases_target); +Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? + + +Target_data1=time_struct_target.table.data(:,10); +range = 12:22; % works slightly well ?? +% range = 12:25; % works slightly as well.. +% range = 1:25; +Temp1=flip(Temp1); +Target_data1=flip(Target_data1); +Temp1 = Temp1(range); +Target_data1 = Target_data1(range); + +cd ../../.. + +num_cases_target=25; +m = 2; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +cd(location_target) +addpath(currentloc) +time_struct_target=read_ignition_delay(location_target,num_cases_target); +Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? + + +Target_data2=time_struct_target.table.data(:,10); +% range = 12:22; % works slightly well ?? +% range = 12:25; % works slightly as well.. +% range = 1:25; +Temp2=flip(Temp2); +Target_data2=flip(Target_data2); +Temp2 = Temp2(range); +Target_data2 = Target_data2(range); + +cd ../../.. +Temp = [Temp1; Temp2]; +Target_data = [Target_data1 Target_data2]; + + + A = rateParam.(class_numb_text{1})(:,1); + E = rateParam.(class_numb_text{1})(:,2); +%% read modification ignition delay time +mechanism={'Ra_Reitz'}; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= size(A,1); +date = {'01_30_2017'}; +fuel_name = {'n_heptane'}; + +m=1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +for j = range + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); + end + +end +for k = 1: numbOfClass + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); +end + +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +for j = 1: length(range) + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + end + +end +% for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% end + + + +%% coefficient +for j = 1 : size(Temp,1) +% for k = 1 : 1 + + Temp_current = Temp(j); + + + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; +% totalM = [totalM M]; + d = log(time_current); + coefs_inv = lsqlin(M,d); + coefs_element = coefs_inv'; + + + +% coefsTotal = []; + +% for n = 1: length(class_numb_text) +% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefs.(class_numb_text{k})(j,:)=coefs_element; +% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; + end + + +end + +% coefs=coefs.class4; + +%% OPTIMIZER + +% Target Temp value + +% te(:,1) = Target_data(:,3); + +% te(:,1) = Target_data; +numberOftempPoints = size(Target_data,1); +%% objective function + +% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +LB =[]; +UB =[]; +% class2 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) +LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; + +end +% class4 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) +LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; +end + +% class6 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) +LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; +end + +nvars=2*numbOfClass; +options=gaoptimset('PopulationSize',500); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); + +X = result_ga; + +error=ObjectiveFunction(X) + +for i = 1 : numbOfClass +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +end + +location_save=[currentloc,'\',mechanism{1},'\',directory]; +cd(location_save) + +save('final_result.mat','final_result') + diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 609366e..5aa1346 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -3,14 +3,14 @@ %test -classnumb=[2 4 6]; +classnumb=[6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class2_class4_class6_moderate'}; +fuel_sim={'modify_class6_time3'}; %% read modification ignition delay time % mechanism={'MFC'}; @@ -25,21 +25,19 @@ - - pressure=[20 40]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; end -k = 2 -directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; +m = 2 +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; % location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) load rateParam.mat; - +%% exp data % load rateParam.mat; % real_fuel_ID; @@ -49,35 +47,51 @@ % % Target_data = Wang_40atm; % Temp = Target_data(:,2); % Temp_un = Target_data(:,1); +%% dummy target num_cases_target=25; +m = 1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; cd(location_target) addpath(currentloc) time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -Target_data=time_struct_target.table.data(:,10); +Target_data1=time_struct_target.table.data(:,10); % range = 12:22; % works slightly well ?? % range = 12:25; % works slightly as well.. range = 1:25; -Temp=flip(Temp); -Target_data=flip(Target_data); -Temp = Temp(range); -Target_data = Target_data(range); +Temp1=flip(Temp1); +Target_data1=flip(Target_data1); +Temp1 = Temp1(range); +Target_data1 = Target_data1(range); cd ../../.. +num_cases_target=25; +m = 2; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +cd(location_target) +addpath(currentloc) +time_struct_target=read_ignition_delay(location_target,num_cases_target); +Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; -end -equi=1; +Target_data2=time_struct_target.table.data(:,10); +% range = 12:22; % works slightly well ?? +% range = 12:25; % works slightly as well.. +% range = 1:25; +Temp2=flip(Temp2); +Target_data2=flip(Target_data2); +Temp2 = Temp2(range); +Target_data2 = Target_data2(range); -% class_numb_text{1} = ['class6']; +cd ../../.. +Temp = [Temp1; Temp2]; +Target_data = [Target_data1 Target_data2]; A = rateParam.(class_numb_text{1})(:,1); @@ -88,7 +102,9 @@ num_cases_modification= size(A,1); date = {'01_30_2017'}; fuel_name = {'n_heptane'}; -directory=[fuel_name{1},'_',pressure_text{k},'_','phi',num2str(equi),'_',date{1}]; + +m=1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; for j = range for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; @@ -103,21 +119,33 @@ time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); end + +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +for j = 1: length(range) + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + end + +end +% for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% end + + + %% coefficient for j = 1 : size(Temp,1) % for k = 1 : 1 Temp_current = Temp(j); -% type = fittype({'log(x)','log(Temp_current)','y','log(x)*y','(log(x))^2','y^2'}... % linear term3 -% ,'independent', {'x', 'y'},'dependent','z','problem','Temp_current'); -% options=fitoptions('Method','LinearLeastSquares') -% sf = fit([A,E],log(time_current),type,options, 'problem',Temp_current); -% -% coefs(k,:)=coeffvalues(sf); -% plot(sf,[A,E],log(time_current)); -% zlim([4 9]); -% totalM = []; + for k = 1: numbOfClass time_current = time_modification.(class_numb_text{k})(:,j); A = rateParam.(class_numb_text{k})(:,1); @@ -140,19 +168,6 @@ end - - - -% Model_igtime=@(x,y) coefs(k,1)*log(x)+coefs(k,2)*log(Temp_current)+coefs(k,3)*y... -% + coefs(k,4)*log(x)*y + coefs(k,5)*(log(x))^2+coefs(k,6)*y^2; % linear term3 -% -% for i= 1: size(A,1) -% prediction{:,k}(i,1)=exp(Model_igtime(A(i),E(i))); -% end -% prediction{:,k}(:,2)=time_current; -% prediction{:,k}(:,3)= prediction{:,k}(:,1)-prediction{:,k}(:,2); -% prediction{:,k}(:,4)= mean(abs(prediction{:,k}(:,3))); - end % coefs=coefs.class4; @@ -163,41 +178,28 @@ % te(:,1) = Target_data(:,3); -te(:,1) = Target_data; -numberOftempPoints = size(te(:,1),1); +% te(:,1) = Target_data; +numberOftempPoints = size(Target_data,1); %% objective function -% ObjectiveFunction=ObjectiveFunction_array5(numberOftempPoints,numbOfClass,te,Temp,coefs); -% ObjectiveFunction=ObjectiveFunction_array6(numberOftempPoints,numbOfClass,te,Temp,coefs,class_numb_text); + % ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); LB =[]; UB =[]; % class2 if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) -% LB =[0.706e+14*0.13 37904-2000 ]; -% LB =[0.706e+14*0.13 0 ]; -% UB =[0.706e+14*10 37904+2000]; -% LB =[LB 9.5600e+09*0.13 0 ]; -% UB =[UB 9.5600e+09*10 590+2000 ]; LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; end % class4 if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) -% LB =[0.706e+14*0.13 37904-2000 ]; -% LB =[0.706e+14*0.13 0 ]; -% UB =[0.706e+14*10 37904+2000]; -% LB =[LB 42360000000000*0.13 0 ]; -% UB =[UB 42360000000000*10 35904+2000 ]; LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; end % class6 if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -% LB =[LB 19955000000000*0.13 0 ]; -% UB =[UB 19955000000000*10 16232.712+2000 ]; LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end @@ -214,21 +216,9 @@ for i = 1 : numbOfClass final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; end -% for i = 1 : numbOfClass -% final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i)]; -% end + location_save=[currentloc,'\',mechanism{1},'\',directory]; cd(location_save) save('final_result.mat','final_result') -%% read final ignition delay time after optimization plug into plot part. -% mechanism={'Ra_Reitz'}; -% fuel_sim={'afteroptimize_class6_temp_all_shen' }; -% pressure = 40; -% num_cases=25; -% currentloc = pwd; -% location=[currentloc,'\',mechanism{i},'\',fuel_sim{1},'_',num2str(pressure(1)),'atm_phi1']; -% -% % -% time_struct=read_ignition_delay(location,num_cases); -% time=time_struct.table.data(:,10)/1000; + From cd61b84a6e4c6a5e7cee546a93b3b4d797311408 Mon Sep 17 00:00:00 2001 From: JordLee Date: Sat, 4 Mar 2017 22:54:34 -0500 Subject: [PATCH 15/47] mutilple pressures and classes success!! --- optimization_7_repro_multiple_2.asv | 27 +++++++++------------------ optimization_7_repro_multiple_2.m | 25 +++++++------------------ 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index 4059b19..ce150d3 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -1,21 +1,17 @@ clear all % close all - -%test -classnumb=[6]; +classnumb=[2 4 6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class6_time0.1'}; +fuel_sim={'modify_class2_class4_class6_moderate'}; %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'Ra_Reitz'}; -% currentloc = pwd; date = {'01_30_2017'}; % fuel_name = {'n_dodecane'}; fuel_name = {'n_heptane'}; @@ -30,13 +26,12 @@ for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; end -m = 2 +m = 2; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) load rateParam.mat; - +clea %% exp data % load rateParam.mat; @@ -60,9 +55,9 @@ Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? Target_data1=time_struct_target.table.data(:,10); -range = 12:22; % works slightly well ?? +% range = 12:22; % works slightly well ?? % range = 12:25; % works slightly as well.. -% range = 1:25; +range = 1:25; Temp1=flip(Temp1); Target_data1=flip(Target_data1); Temp1 = Temp1(range); @@ -157,20 +152,16 @@ for j = 1 : size(Temp,1) coefs_element = coefs_inv'; - -% coefsTotal = []; - -% for n = 1: length(class_numb_text) -% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefs.(class_numb_text{k})(j,:)=coefs_element; -% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; end end -% coefs=coefs.class4; + %% OPTIMIZER diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 5aa1346..4e9c7b8 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,21 +1,17 @@ clear all % close all - -%test -classnumb=[6]; +classnumb=[2 4 6]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class6_time3'}; +fuel_sim={'modify_class2_class4_class6_moderate'}; %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'Ra_Reitz'}; -% currentloc = pwd; date = {'01_30_2017'}; % fuel_name = {'n_dodecane'}; fuel_name = {'n_heptane'}; @@ -30,13 +26,12 @@ pressure_text{k}=[num2str(pressure(k)),'atm']; end -m = 2 +m = 2; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_rateParam = [currentloc,'\',mechanism{1},'\',fuel_name] location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) load rateParam.mat; - +clear m; %% exp data % load rateParam.mat; @@ -157,27 +152,21 @@ coefs_element = coefs_inv'; - -% coefsTotal = []; - -% for n = 1: length(class_numb_text) -% coefs.(class_numb_text{n})(k,:)=coefs_element(1,6*n-5:6*n); + coefs.(class_numb_text{k})(j,:)=coefs_element; -% coefsTotal =[coefsTotal coefs.(class_numb_text{k})(j,:)]; + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; end end -% coefs=coefs.class4; + %% OPTIMIZER % Target Temp value - % te(:,1) = Target_data(:,3); - % te(:,1) = Target_data; numberOftempPoints = size(Target_data,1); %% objective function From 31894d353462fb0b5ff4b79bd4b6a69aad7d975e Mon Sep 17 00:00:00 2001 From: JordLee Date: Sun, 5 Mar 2017 01:51:23 -0500 Subject: [PATCH 16/47] oneclass 2 pressure kind of success? more classes information are needed --- Ra_Reitz_plot_2.asv | 218 +++++++++++++++++++++++++++ Ra_Reitz_plot_2.m | 226 ++++++++++++++++++++++++++++ modification.m | 53 +++---- optimization_7_repro_multiple_2.asv | 137 +++++++++-------- optimization_7_repro_multiple_2.m | 154 +++++++++++-------- 5 files changed, 644 insertions(+), 144 deletions(-) create mode 100644 Ra_Reitz_plot_2.asv create mode 100644 Ra_Reitz_plot_2.m diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv new file mode 100644 index 0000000..a2bc6be --- /dev/null +++ b/Ra_Reitz_plot_2.asv @@ -0,0 +1,218 @@ +clear all +% close all +%% Ra&Reitz +mechanism={'Ra_Reitz' }; +% fuel_sim={'base','v1','v2','v3'}; + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +num_cases=25; + + +pure_component_ID; +real_fuel_ID; + +exp_markers={'ro' 'g*' 'b^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +i=1; %mechanism + +%% 20atm condition + +% h2=figure('position',[20 50 580 480]); +% set(gca,'Fontsize',13) +% %plot exp data +% %/4 convert to ms +% +% +% +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); +% +% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) +% +% +% +% % legend_text{2}='Vasu et al.40atm, Shock Tube'; +% % legend_text{1}='Vasu et al.20atm, Shock Tube'; +% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; +% % legend_text{1}=' '; +% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; +% % legend_text{3}='Dooley et al., RCM'; +% % legend_text{2}='Shen et al., Shock Tube'; +% %plot sim data +% +% +% +% +% hold on +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% k=1; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; +% legend_text{end+1}=[mechanism{i},'_','before']; +% end +% +% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue = yvalue(locs); +% hold on +% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); +% +% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue2 = yvalue2(locs2); +% hold on +% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); +% +% difference=abs(locsValue-Vasu_dode_20atm(:,2)); +% [minDifference,idx] = min(difference); +% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); +% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); +% +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% +% fuel_sim={'afteroptimize'}; +% k=1; +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'b-','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; +% +% end +% +% +% +% legend(legend_text,'location','SouthEast','interpreter','none') +% legend('boxoff') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (micros)') +% % ylim([0.1 10000]) +% % axis([0.7 1.6 0.1 10]) +% % clear legend_text +% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... +% 'String',{'n-dodecane',... +% '/Air', '\phi=1'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... +% 'String',{' 20 atm'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +%% 40atm condition + +for k = 1: length(pressure) + +h3=figure('position',[20 50 580 480]); +set(gca,'Fontsize',13) +clear legend_text +% % legend_text{1}='Vasu et al.40atm, Shock Tube'; +% legend_text{1}='Shen et al.40atm, Shock Tube'; +% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) + +% legend_text{1}=['ERC',pressure_text{k},'Dummy']; +% legend_text{2}=['ERC',pressure_text{k},'target(original)']; +% legend_text{3}=['ERC',pressure_text{k},'after optimize']; + +legend_text{1}=['MFC',pressure_text{k},'beforeoptimiz']; +legend_text{2}=['Shen,Vasu',pressure_text{k},'target']; +legend_text{3}=['MFC',pressure_text{k},'after optimize']; + +% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; + + load('simulation_result_beforeoptimize_20atm_phi_1.mat') + fuel_sim={'beforeoptimize'}; + + for j=1:length(fuel_sim) + + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end + + + + + hold on + + +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize'}; + + + for j=1:length(fuel_sim) + + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'r*','markersize',marker_size) + end + +% hold on +% +% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + + + hold on + + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; + + + for j=1:length(fuel_sim) + + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'go','markersize',marker_size) + % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','40atm']; + + + end + + legend(legend_text,'location','SouthEast','interpreter','none') + legend('boxoff') + xlabel('1000/T (1/K)') + ylabel('Ignition Delay Time (micros)') + % axis([0.7 1.6 20 40000]) + % clear legend_text + annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... + 'String',{'n-heptane',... + '/Air','class2_class4_class6_moderate_SUCCESS', '\phi=1'},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... + 'String',{pressure_text{k}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m new file mode 100644 index 0000000..79a835e --- /dev/null +++ b/Ra_Reitz_plot_2.m @@ -0,0 +1,226 @@ +clear all +% close all +%% Ra&Reitz +mechanism={'MFC' }; +% fuel_sim={'base','v1','v2','v3'}; + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +num_cases=25; + + +pure_component_ID; +real_fuel_ID; + +exp_markers={'ro' 'g*' 'b^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +i=1; %mechanism + +%% 20atm condition + +% h2=figure('position',[20 50 580 480]); +% set(gca,'Fontsize',13) +% %plot exp data +% %/4 convert to ms +% +% +% +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); +% +% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) +% +% +% +% % legend_text{2}='Vasu et al.40atm, Shock Tube'; +% % legend_text{1}='Vasu et al.20atm, Shock Tube'; +% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; +% % legend_text{1}=' '; +% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; +% % legend_text{3}='Dooley et al., RCM'; +% % legend_text{2}='Shen et al., Shock Tube'; +% %plot sim data +% +% +% +% +% hold on +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% k=1; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; +% legend_text{end+1}=[mechanism{i},'_','before']; +% end +% +% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue = yvalue(locs); +% hold on +% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); +% +% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue2 = yvalue2(locs2); +% hold on +% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); +% +% difference=abs(locsValue-Vasu_dode_20atm(:,2)); +% [minDifference,idx] = min(difference); +% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); +% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); +% +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% +% fuel_sim={'afteroptimize'}; +% k=1; +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'b-','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; +% +% end +% +% +% +% legend(legend_text,'location','SouthEast','interpreter','none') +% legend('boxoff') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (micros)') +% % ylim([0.1 10000]) +% % axis([0.7 1.6 0.1 10]) +% % clear legend_text +% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... +% 'String',{'n-dodecane',... +% '/Air', '\phi=1'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... +% 'String',{' 20 atm'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +%% 40atm condition + +for k = 1: length(pressure) + +h3=figure('position',[20 50 580 480]); +set(gca,'Fontsize',13) +clear legend_text +% % legend_text{1}='Vasu et al.40atm, Shock Tube'; +% legend_text{1}='Shen et al.40atm, Shock Tube'; +% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) + +% legend_text{1}=['ERC',pressure_text{k},'Dummy']; +% legend_text{2}=['ERC',pressure_text{k},'target(original)']; +% legend_text{3}=['ERC',pressure_text{k},'after optimize']; + +legend_text{1}=['MFC',pressure_text{k},'beforeoptimize']; +legend_text{2}=['Shen,Vasu',pressure_text{k},'target']; +legend_text{3}=['MFC',pressure_text{k},'after optimize']; + +% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; + + load('simulation_result_beforeoptimize_20atm_phi_1.mat') + fuel_sim={'beforeoptimize'}; + + for j=1:length(fuel_sim) + + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end + + + + + hold on + + +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize'}; + + +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'r*','markersize',marker_size) +% end + + + + + +% hold on +% +% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + if strcmp(pressure_text{k},'P20atm') + semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) + else + semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) + end + + hold on + + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; + + + for j=1:length(fuel_sim) + + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'go','markersize',marker_size) + % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','40atm']; + + + end + + legend(legend_text,'location','SouthEast','interpreter','none') + legend('boxoff') + xlabel('1000/T (1/K)') + ylabel('Ignition Delay Time (micros)') + % axis([0.7 1.6 20 40000]) + % clear legend_text + annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... + 'String',{'n-heptane',... + '/Air','class2_class4_class6_moderate_SUCCESS', '\phi=1'},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... + 'String',{pressure_text{k}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end diff --git a/modification.m b/modification.m index f744b93..c98c5c3 100644 --- a/modification.m +++ b/modification.m @@ -17,10 +17,11 @@ % cd mechanisms/; %% Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% -fuel_name='n_heptane'; -mechanism='Ra_Reitz'; +fuel_name='n_dodecane'; +mechanism='MFC'; % class_numb =6; -numbOfClass = 9; +class_numb = [27]; +numbOfClass = length(class_numb); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %filename = [mechanism,'_',fuel_name,'_','class6.inp']; filename = [mechanism,'_','base.inp']; @@ -68,7 +69,7 @@ -for class_numb = 1 : numbOfClass +for k = 1 : numbOfClass rawCellColumns2=rawCellColumns; class_numb_text{1} = ['class' num2str(class_numb)]; @@ -85,28 +86,28 @@ end %% classes modification - if class_numb == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... - |(class_numb == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - |(class_numb == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - |(class_numb == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - |(class_numb == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - | class_numb == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... - |(class_numb == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - |(class_numb == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - |(class_numb == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... - & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% if class_numb == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% | class_numb == 27 & (strfind(rawCellColumns{i,j},'C12OOH') == 1)... % n dodecane ske_361 -% & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... -% & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1); + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') == 1)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1); %% if variation_numb == 1 rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; @@ -229,7 +230,7 @@ % rateParam=struct(field); fclose(fileID); -% exit +exit %type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp %% Clear temporary variables diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index ce150d3..debf10f 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -1,20 +1,20 @@ clear all % close all -classnumb=[2 4 6]; +classnumb=[27]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class2_class4_class6_moderate'}; +fuel_sim={'modify'}; %% read modification ignition delay time % mechanism={'MFC'}; -mechanism={'Ra_Reitz'}; -date = {'01_30_2017'}; -% fuel_name = {'n_dodecane'}; -fuel_name = {'n_heptane'}; +mechanism={'MFC'}; +date = {'03_04_2017'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; @@ -31,12 +31,24 @@ directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1} location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) load rateParam.mat; -clea +clear m; %% exp data % load rateParam.mat; -% real_fuel_ID; -% pure_component_ID; +real_fuel_ID; +pure_component_ID; +Target_data1 = Vasu_dode_20atm; +Temp1 = Target_data1(:,2); +numbOftarget1 =length(Target_data1); + +Target_data2 = Shen_dode_40atm; +Temp2 = Target_data2(:,2); +numbOftarget2 =length(Target_data2); + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1 Target_data2]; +cd ../../. + % Target_data = Shen_hep_40atm; % % Target_data = Vasu_40atm; % % Target_data = Wang_40atm; @@ -44,49 +56,49 @@ clea % Temp_un = Target_data(:,1); %% dummy target -num_cases_target=25; -m = 1; % pressure 20atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -cd(location_target) -addpath(currentloc) -time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? - - -Target_data1=time_struct_target.table.data(:,10); -% range = 12:22; % works slightly well ?? -% range = 12:25; % works slightly as well.. -range = 1:25; -Temp1=flip(Temp1); -Target_data1=flip(Target_data1); -Temp1 = Temp1(range); -Target_data1 = Target_data1(range); - -cd ../../.. - -num_cases_target=25; -m = 2; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -cd(location_target) -addpath(currentloc) -time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? - - -Target_data2=time_struct_target.table.data(:,10); -% range = 12:22; % works slightly well ?? -% range = 12:25; % works slightly as well.. +% num_cases_target=25; +% m = 1; % pressure 20atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data1=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. % range = 1:25; -Temp2=flip(Temp2); -Target_data2=flip(Target_data2); -Temp2 = Temp2(range); -Target_data2 = Target_data2(range); - -cd ../../.. -Temp = [Temp1; Temp2]; -Target_data = [Target_data1 Target_data2]; +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); +% Temp1 = Temp1(range); +% Target_data1 = Target_data1(range); +% +% cd ../../.. +% +% num_cases_target=25; +% m = 2; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data2=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% % range = 1:25; +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); +% Temp2 = Temp2(range); +% Target_data2 = Target_data2(range); +% +% cd ../../.. +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1 Target_data2]; A = rateParam.(class_numb_text{1})(:,1); @@ -100,7 +112,8 @@ fuel_name = {'n_heptane'}; m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -for j = range +% for j = range +for j = 1: numbOftarget1 for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; @@ -111,19 +124,24 @@ for j = range end for k = 1: numbOfClass - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end m =2 ; % pressure 40atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -for j = 1: length(range) +% for j = 1: length(range) +for j = 1: numbOftarget2 for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); +% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); end end @@ -166,9 +184,7 @@ end %% OPTIMIZER % Target Temp value - % te(:,1) = Target_data(:,3); - % te(:,1) = Target_data; numberOftempPoints = size(Target_data,1); %% objective function @@ -195,6 +211,9 @@ LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end +% ndodecane + + nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); [result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 4e9c7b8..d629ae4 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,20 +1,20 @@ clear all % close all -classnumb=[2 4 6]; +classnumb=[27]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; end -fuel_sim={'modify_class2_class4_class6_moderate'}; +fuel_sim={'modify'}; %% read modification ignition delay time % mechanism={'MFC'}; -mechanism={'Ra_Reitz'}; -date = {'01_30_2017'}; -% fuel_name = {'n_dodecane'}; -fuel_name = {'n_heptane'}; +mechanism={'MFC'}; +date = {'03_04_2017'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; @@ -35,8 +35,30 @@ %% exp data % load rateParam.mat; -% real_fuel_ID; -% pure_component_ID; +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2 =length(Target_data2); +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); + + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; +% Temp = Temp1; +% Target_data = Target_data1; + +cd ../../.. + % Target_data = Shen_hep_40atm; % % Target_data = Vasu_40atm; % % Target_data = Wang_40atm; @@ -44,63 +66,64 @@ % Temp_un = Target_data(:,1); %% dummy target -num_cases_target=25; -m = 1; % pressure 20atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -cd(location_target) -addpath(currentloc) -time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? - - -Target_data1=time_struct_target.table.data(:,10); -% range = 12:22; % works slightly well ?? -% range = 12:25; % works slightly as well.. -range = 1:25; -Temp1=flip(Temp1); -Target_data1=flip(Target_data1); -Temp1 = Temp1(range); -Target_data1 = Target_data1(range); - -cd ../../.. - -num_cases_target=25; -m = 2; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -cd(location_target) -addpath(currentloc) -time_struct_target=read_ignition_delay(location_target,num_cases_target); -Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? - - -Target_data2=time_struct_target.table.data(:,10); -% range = 12:22; % works slightly well ?? -% range = 12:25; % works slightly as well.. +% num_cases_target=25; +% m = 1; % pressure 20atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data1=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. % range = 1:25; -Temp2=flip(Temp2); -Target_data2=flip(Target_data2); -Temp2 = Temp2(range); -Target_data2 = Target_data2(range); - -cd ../../.. -Temp = [Temp1; Temp2]; -Target_data = [Target_data1 Target_data2]; +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); +% Temp1 = Temp1(range); +% Target_data1 = Target_data1(range); +% +% cd ../../.. +% +% num_cases_target=25; +% m = 2; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data2=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% % range = 1:25; +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); +% Temp2 = Temp2(range); +% Target_data2 = Target_data2(range); +% +% cd ../../.. +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1 Target_data2]; A = rateParam.(class_numb_text{1})(:,1); E = rateParam.(class_numb_text{1})(:,2); %% read modification ignition delay time -mechanism={'Ra_Reitz'}; +% mechanism={'Ra_Reitz'}; currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= size(A,1); -date = {'01_30_2017'}; -fuel_name = {'n_heptane'}; +% date = {'01_30_2017'}; +% fuel_name = {'n_heptane'}; m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -for j = range +% for j = range +for j = 1: numbOftarget1 for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; @@ -111,22 +134,29 @@ end for k = 1: numbOfClass - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end m =2 ; % pressure 40atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -for j = 1: length(range) +% for j = 1: length(range) +for j = 1: numbOftarget2 for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); +% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); end end + + % for k = 1: numbOfClass % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); @@ -193,6 +223,12 @@ UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end +% ndodecane +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end + nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); [result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); From d1bfdf0e9f5815822d27715ab762bc2e71367b1b Mon Sep 17 00:00:00 2001 From: JordLee Date: Sun, 5 Mar 2017 16:41:21 -0500 Subject: [PATCH 17/47] modification for MFC n_dodecane --- Ra_Reitz_plot_2.asv | 218 -------------------------- Ra_Reitz_plot_2.m | 17 +- modification.m | 40 +++-- optimization_7_repro_multiple_2.asv | 234 ---------------------------- 4 files changed, 34 insertions(+), 475 deletions(-) delete mode 100644 Ra_Reitz_plot_2.asv delete mode 100644 optimization_7_repro_multiple_2.asv diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv deleted file mode 100644 index a2bc6be..0000000 --- a/Ra_Reitz_plot_2.asv +++ /dev/null @@ -1,218 +0,0 @@ -clear all -% close all -%% Ra&Reitz -mechanism={'Ra_Reitz' }; -% fuel_sim={'base','v1','v2','v3'}; - -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=['P',num2str(pressure(k)),'atm']; -end -num_cases=25; - - -pure_component_ID; -real_fuel_ID; - -exp_markers={'ro' 'g*' 'b^'}; -sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; -marker_size=8; -line_width=2; - -i=1; %mechanism - -%% 20atm condition - -% h2=figure('position',[20 50 580 480]); -% set(gca,'Fontsize',13) -% %plot exp data -% %/4 convert to ms -% -% -% -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) -% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); -% -% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) -% -% -% -% % legend_text{2}='Vasu et al.40atm, Shock Tube'; -% % legend_text{1}='Vasu et al.20atm, Shock Tube'; -% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; -% % legend_text{1}=' '; -% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; -% % legend_text{3}='Dooley et al., RCM'; -% % legend_text{2}='Shen et al., Shock Tube'; -% %plot sim data -% -% -% -% -% hold on -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% k=1; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; -% legend_text{end+1}=[mechanism{i},'_','before']; -% end -% -% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue = yvalue(locs); -% hold on -% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); -% -% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue2 = yvalue2(locs2); -% hold on -% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); -% -% difference=abs(locsValue-Vasu_dode_20atm(:,2)); -% [minDifference,idx] = min(difference); -% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); -% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); -% -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% -% fuel_sim={'afteroptimize'}; -% k=1; -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'b-','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; -% -% end -% -% -% -% legend(legend_text,'location','SouthEast','interpreter','none') -% legend('boxoff') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (micros)') -% % ylim([0.1 10000]) -% % axis([0.7 1.6 0.1 10]) -% % clear legend_text -% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... -% 'String',{'n-dodecane',... -% '/Air', '\phi=1'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... -% 'String',{' 20 atm'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -%% 40atm condition - -for k = 1: length(pressure) - -h3=figure('position',[20 50 580 480]); -set(gca,'Fontsize',13) -clear legend_text -% % legend_text{1}='Vasu et al.40atm, Shock Tube'; -% legend_text{1}='Shen et al.40atm, Shock Tube'; -% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) - -% legend_text{1}=['ERC',pressure_text{k},'Dummy']; -% legend_text{2}=['ERC',pressure_text{k},'target(original)']; -% legend_text{3}=['ERC',pressure_text{k},'after optimize']; - -legend_text{1}=['MFC',pressure_text{k},'beforeoptimiz']; -legend_text{2}=['Shen,Vasu',pressure_text{k},'target']; -legend_text{3}=['MFC',pressure_text{k},'after optimize']; - -% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; - - load('simulation_result_beforeoptimize_20atm_phi_1.mat') - fuel_sim={'beforeoptimize'}; - - for j=1:length(fuel_sim) - - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end - - - - - hold on - - -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize'}; - - - for j=1:length(fuel_sim) - - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'r*','markersize',marker_size) - end - -% hold on -% -% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) - - - hold on - - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - - for j=1:length(fuel_sim) - - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'go','markersize',marker_size) - % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','40atm']; - - - end - - legend(legend_text,'location','SouthEast','interpreter','none') - legend('boxoff') - xlabel('1000/T (1/K)') - ylabel('Ignition Delay Time (micros)') - % axis([0.7 1.6 20 40000]) - % clear legend_text - annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-heptane',... - '/Air','class2_class4_class6_moderate_SUCCESS', '\phi=1'},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... - 'String',{pressure_text{k}},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - - -end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 79a835e..6fd0a13 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -137,9 +137,14 @@ % legend_text{2}=['ERC',pressure_text{k},'target(original)']; % legend_text{3}=['ERC',pressure_text{k},'after optimize']; -legend_text{1}=['MFC',pressure_text{k},'beforeoptimize']; -legend_text{2}=['Shen,Vasu',pressure_text{k},'target']; -legend_text{3}=['MFC',pressure_text{k},'after optimize']; +legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; + if strcmp(pressure_text{k},'P20atm') + legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + else + legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + end + +legend_text{3}=['MFC ',pressure_text{k},', after optimize']; % load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') % fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; @@ -195,7 +200,7 @@ semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'go','markersize',marker_size) + 'b','markersize',marker_size) % ,sim_line{j}, 'linewidth',line_width) % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','40atm']; @@ -209,8 +214,8 @@ % axis([0.7 1.6 20 40000]) % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-heptane',... - '/Air','class2_class4_class6_moderate_SUCCESS', '\phi=1'},... + 'String',{'n-dodecane',... + '/Air','one class', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/modification.m b/modification.m index c98c5c3..3fabbac 100644 --- a/modification.m +++ b/modification.m @@ -20,7 +20,7 @@ fuel_name='n_dodecane'; mechanism='MFC'; % class_numb =6; -class_numb = [27]; +class_numb = [15 26 27]; numbOfClass = length(class_numb); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %filename = [mechanism,'_',fuel_name,'_','class6.inp']; @@ -72,7 +72,7 @@ for k = 1 : numbOfClass rawCellColumns2=rawCellColumns; - class_numb_text{1} = ['class' num2str(class_numb)]; + class_numb_text{k} = ['class' num2str(class_numb(k))]; for variation_numb = 1:7; ModStart = 0; @@ -105,44 +105,50 @@ % |(class_numb == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... % & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') == 1)... % n dodecane ske_361 - & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1); + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + %% if variation_numb == 1 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2}); % same lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2}); lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); % lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2}); % lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); elseif variation_numb == 2 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*2; % A*2 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*2; lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); % lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2})*2; % lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); elseif variation_numb == 3 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.5; % A*0.5 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.5; lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); elseif variation_numb == 4 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*7.5; % A>>1, A*7.5 rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*7.5; lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; elseif variation_numb == 5 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*1.6;% A>1 rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*1.6;% A>1 - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; % E+2000 - + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; % E+2000 elseif variation_numb == 6 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.6; % A<1 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.6; if str2num(rawCellColumns{i,4})-2000>0; @@ -153,7 +159,7 @@ lsqfit(variation_numb,2) = 0; end elseif variation_numb == 7 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.13; % A<<1 lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.13; if str2num(rawCellColumns{i,4})-2000>0; @@ -169,7 +175,7 @@ %%saving files % save mech_ERC-MultiChem+Bio_Brakora2012_v1_test.mat rawCellColumns2 % file_name=[mechanism,'_',fuel_name,'_','class',class_numb,'_','v_',num2str(variation_numb),'.inp']; - file_name=[mechanism,'_',fuel_name,'_','class',num2str(class_numb),'_','v_',num2str(variation_numb),'.inp']; + file_name=[mechanism,'_',fuel_name,'_','class',num2str(class_numb(k)),'_','v_',num2str(variation_numb),'.inp']; % fileID = fopen('mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp','w'); fileID = fopen(file_name,'w'); output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); @@ -220,7 +226,7 @@ end % clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns2 rawNumericColumns R; - rateParam.(class_numb_text{1})=lsqfit; + rateParam.(class_numb_text{k})=lsqfit; save('rateParam.mat','rateParam'); clear rawCellColumns2; end @@ -230,7 +236,7 @@ % rateParam=struct(field); fclose(fileID); -exit +% exit %type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp %% Clear temporary variables diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv deleted file mode 100644 index debf10f..0000000 --- a/optimization_7_repro_multiple_2.asv +++ /dev/null @@ -1,234 +0,0 @@ -clear all -% close all - -classnumb=[27]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end -fuel_sim={'modify'}; - -%% read modification ignition delay time -% mechanism={'MFC'}; -mechanism={'MFC'}; -date = {'03_04_2017'}; -fuel_name = {'n_dodecane'}; -% fuel_name = {'n_heptane'}; -equi=1; - -currentloc = 'C:\Users\unghee\Dropbox\post_process'; - - - -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -m = 2; -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; -cd(location_rateParam) -load rateParam.mat; -clear m; -%% exp data -% load rateParam.mat; - -real_fuel_ID; -pure_component_ID; -Target_data1 = Vasu_dode_20atm; -Temp1 = Target_data1(:,2); -numbOftarget1 =length(Target_data1); - -Target_data2 = Shen_dode_40atm; -Temp2 = Target_data2(:,2); -numbOftarget2 =length(Target_data2); - -Temp = [Temp1; Temp2]; -Target_data = [Target_data1 Target_data2]; -cd ../../. - -% Target_data = Shen_hep_40atm; -% % Target_data = Vasu_40atm; -% % Target_data = Wang_40atm; -% Temp = Target_data(:,2); -% Temp_un = Target_data(:,1); -%% dummy target - -% num_cases_target=25; -% m = 1; % pressure 20atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data1=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% range = 1:25; -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); -% Temp1 = Temp1(range); -% Target_data1 = Target_data1(range); -% -% cd ../../.. -% -% num_cases_target=25; -% m = 2; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data2=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% % range = 1:25; -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -% Temp2 = Temp2(range); -% Target_data2 = Target_data2(range); -% -% cd ../../.. -% Temp = [Temp1; Temp2]; -% Target_data = [Target_data1 Target_data2]; - - - A = rateParam.(class_numb_text{1})(:,1); - E = rateParam.(class_numb_text{1})(:,2); -%% read modification ignition delay time -mechanism={'Ra_Reitz'}; -currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= size(A,1); -date = {'01_30_2017'}; -fuel_name = {'n_heptane'}; - -m=1; % pressure 20atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = range -for j = 1: numbOftarget1 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); - end - -end -for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); -end - -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = 1: length(range) -for j = 1: numbOftarget2 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); - time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); - end - -end -% for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); -% end - - - -%% coefficient -for j = 1 : size(Temp,1) -% for k = 1 : 1 - - Temp_current = Temp(j); - - - for k = 1: numbOfClass - time_current = time_modification.(class_numb_text{k})(:,j); - A = rateParam.(class_numb_text{k})(:,1); - E = rateParam.(class_numb_text{k})(:,2); - M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; -% totalM = [totalM M]; - d = log(time_current); - coefs_inv = lsqlin(M,d); - coefs_element = coefs_inv'; - - - - coefs.(class_numb_text{k})(j,:)=coefs_element; - - prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; - end - - -end - - - -%% OPTIMIZER - -% Target Temp value -% te(:,1) = Target_data(:,3); -% te(:,1) = Target_data; -numberOftempPoints = size(Target_data,1); -%% objective function - -% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -LB =[]; -UB =[]; -% class2 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) -LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; - -end -% class4 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) -LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; -end - -% class6 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; -end - -% ndodecane - - -nvars=2*numbOfClass; -options=gaoptimset('PopulationSize',500); -[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); -[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); - -X = result_ga; - -error=ObjectiveFunction(X) - -for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; -end - -location_save=[currentloc,'\',mechanism{1},'\',directory]; -cd(location_save) - -save('final_result.mat','final_result') - From 12815ec65c3f05a7dcb87655d0c663088ef122b3 Mon Sep 17 00:00:00 2001 From: JordLee Date: Sun, 5 Mar 2017 21:57:45 -0500 Subject: [PATCH 18/47] senstitivity analysis for n-dodecane --- optimization_7_repro_multiple_2.asv | 256 ++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.m | 12 +- optimization_driver_2.m | 111 ++++++++++++ sensitivity_analysis_3.m | 195 +++++++++++++++++++++ 4 files changed, 572 insertions(+), 2 deletions(-) create mode 100644 optimization_7_repro_multiple_2.asv create mode 100644 optimization_driver_2.m create mode 100644 sensitivity_analysis_3.m diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv new file mode 100644 index 0000000..232dd6f --- /dev/null +++ b/optimization_7_repro_multiple_2.asv @@ -0,0 +1,256 @@ +clear all +% close all + +classnumb=[27]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +fuel_sim={'modify'}; + +%% read modification ignition delay time +% mechanism={'MFC'}; +mechanism={'MFC'}; +date = {'03_04_2017'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; +equi=1; + +currentloc = 'C:\Users\unghee\Dropbox\post_process'; + + + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +m = 2; +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +cd(location_rateParam) +load rateParam.mat; +clear m; +%% exp data +% load rateParam.mat; +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2 =length(Target_data2); +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); + + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; +% Temp = Temp1; +% Target_data = Target_data1; + +cd ../../.. + +% Target_data = Shen_hep_40atm; +% % Target_data = Vasu_40atm; +% % Target_data = Wang_40atm; +% Temp = Target_data(:,2); +% Temp_un = Target_data(:,1); +%% dummy target + +% num_cases_target=25; +% m = 1; % pressure 20atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data1=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% range = 1:25; +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); +% Temp1 = Temp1(range); +% Target_data1 = Target_data1(range); +% +% cd ../../.. +% +% num_cases_target=25; +% m = 2; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data2=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% % range = 1:25; +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); +% Temp2 = Temp2(range); +% Target_data2 = Target_data2(range); +% +% cd ../../.. +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1 Target_data2]; + + + A = rateParam.(class_numb_text{1})(:,1); + E = rateParam.(class_numb_text{1})(:,2); +%% read modification ignition delay time +% mechanism={'Ra_Reitz'}; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= size(A,1); +% date = {'01_30_2017'}; +% fuel_name = {'n_heptane'}; + +m=1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% for j = range +for j = 1: numbOftarget1 + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); + end + +end +for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); +end + +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% for j = 1: length(range) +for j = 1: numbOftarget2 + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); + end + +end + + +% for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% end + + + +%% coefficient +for j = 1 : size(Temp,1) +% for k = 1 : 1 +% for j = 1 : 1 + Temp_current = Temp(j); + + + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; +% totalM = [totalM M]; + d = log(time_current); + coefs_inv = lsqlin(M,d); + coefs_element = coefs_inv'; + + + + coefs.(class_numb_text{k})(j,:)=coefs_element; + + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; +% plotregression(d,M*coefs_element') + end + + +end +%% plot regression + +% for k = 1: numbOfClass +% plotregression(Temp,prediction.(class_numb_text{k}) +% end + + + + +%% OPTIMIZER + +% Target Temp value +% te(:,1) = Target_data(:,3); +% te(:,1) = Target_data; +numberOftempPoints = size(Target_data,1); +%% objective function + +% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +LB =[]; +UB =[]; +% class2 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) +LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; + +end +% class4 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) +LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; +end + +% class6 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) +LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; +end + +% ndodecane +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end + +nvars=2*numbOfClass; +options=gaoptimset('PopulationSize',500); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); + +X = result_ga; + +error=ObjectiveFunction(X) + +for i = 1 : numbOfClass +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +end + +location_save=[currentloc,'\',mechanism{1},'\',directory]; +cd(location_save) + +save('final_result.mat','final_result') + diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index d629ae4..5c0f2a0 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -34,7 +34,7 @@ clear m; %% exp data % load rateParam.mat; - +addpath('C:\Users\unghee\Dropbox\post_process'); real_fuel_ID; pure_component_ID; Target_fuel1 = Vasu_dode_20atm; @@ -167,7 +167,7 @@ %% coefficient for j = 1 : size(Temp,1) % for k = 1 : 1 - +% for j = 1 : 1 Temp_current = Temp(j); @@ -186,10 +186,18 @@ coefs.(class_numb_text{k})(j,:)=coefs_element; prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; + predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; +% plotregression(d,M*coefs_element') end end +%% plot regression + +for k = 1: numbOfClass +plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) +end + diff --git a/optimization_driver_2.m b/optimization_driver_2.m new file mode 100644 index 0000000..a87b209 --- /dev/null +++ b/optimization_driver_2.m @@ -0,0 +1,111 @@ +clear; +close all; +mechanism={'Ra_Reitz'}; +fuel_name={'n_heptane'}; +date = {'01_30_2017'}; +fuel_sim={'modify_class2_class4_class6_moderate'}; +equi = 1; +pressure=[40]; +classnumb=[2 4 6]; + +sensitivity_analysis_3; + +clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi +% Determine classes with overall sensitivity +classnumb_optimize.entire.(pressure_text{1}) = []; +% classnumb_optimize.entire.(pressure_text{1}) = sturct([]); +pressure_optimize_text =[]; +pressure_optimize =[]; +for m = 1 : length(pressure) + for k=1:length(classnumb) + + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) + classnumb_optimize.entire.(pressure_text{m}) = [ classnumb_optimize.entire.(pressure_text{m}) classnumb(k)]; + + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end + + for m = 1 : length(pressure_optimize) + classnumb=classnumb_optimize.entire.(pressure_text{m}); %have to change for multiple pressure in optimization.m + end +%% HTR optimize +% add sgr information for the future work +classnumb_optimize.HTR.(pressure_text{1}) = []; +pressure_optimize_text =[]; +pressure_optimize =[]; +for m = 1 : length(pressure) + for k=1:length(classnumb) + + if (abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(4))) > 1 + classnumb_optimize.HTR.(pressure_text{m}) = [classnumb_optimize.HTR.(pressure_text{m}) classnumb(k)]; + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end +for m = 1 : length(pressure_optimize) +classnumb=classnumb_optimize.HTR.(pressure_text{m}); +end +pressure = pressure_optimize; + +clearvars -except classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity +range = 1:10; +% optimization_10; +optimization_7_repro_multiple_2; +%% +% final result for HTR, and LockDouwn +clearvars -except final_result pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity pressure_text + +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end + +classnumb_optimize.NTC.(pressure_text{1})=[]; +pressure_optimize_text =[]; +pressure_optimize =[]; +Entire = classnumb_optimize.entire.(pressure_text{1}); +HTR = classnumb_optimize.HTR.(pressure_text{1}); + +classnumb_optimize.NTC.(pressure_text{1})... + = setxor(Entire,HTR); +numbOfClass_NTC = length(classnumb_optimize.NTC.(pressure_text{1})); + +class_numb_text_NTC = {}; +for k=1:numbOfClass_NTC +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text_NTC=[class_numb_text_NTC ['class',num2str(classnumb_optimize.NTC.(pressure_text{1})(k))]]; +end + +classnumbOfNTC = []; +for m = 1 : length(pressure) + for k=1:numbOfClass_NTC + + if (abs(sensitivity.(pressure_text{m}).(class_numb_text_NTC{k}).Sig(2)) > 1) + classnumbOfNTC = [classnumbOfNTC classnumb_optimize.NTC.(pressure_text{1})(k)]; + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end +classnumb_optimize.NTC.(pressure_text{m}) = classnumbOfNTC; + +for m = 1 : length(pressure_optimize) +classnumb=classnumb_optimize.NTC.(pressure_text{m}); +end +pressure = pressure_optimize; + + +clearvars -except final_result classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity +range = 12:20; + +optimization_7_repro_multiple_2; + +%modification after optimize + +%load + +% load -> output rightaway bash \ No newline at end of file diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m new file mode 100644 index 0000000..8aeb25d --- /dev/null +++ b/sensitivity_analysis_3.m @@ -0,0 +1,195 @@ + +%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? +% mechanism={'MFC' }; +% fuel_sim={'base','v1','v2','v3'}; + +% pressure=[20 40]; +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +% classnumb=[1 2 3 4 5 6 7 8 9]; +numbOfClass=length(classnumb) ; +for k=1:numbOfClass + classnumb_text{k}=['class',num2str(classnumb(k))]; +end + +exp_markers={'ro' 'g*' 'g^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') + +%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % i=1 ; +% m=2 ; % pressure +% % j=1 ; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% sensitivity analysis +% mechanism={'Ra_Reitz'}; +% fuel_sim={'modify_sensitivity'}; +% fuel_name={'n_heptane'} +% equi = 1; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= 3; +% date = {'01_30_2017'}; + +for m = 1 : numbOfPressure + for k = 1 :numbOfClass + for j = 1: 25 + % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(j)]; + location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... + 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification{j}.data=time_struct_modification.table.data(:,10); +% classnumb_text{k}.(time_modification(:,j))=time_struct_modification.table.data(:,10); + +% time_modification =ones(3,25); +% class.(time_modification(1:3,j))=time_struct_modification.table.data(:,10); +% field = classnumb_text{k}; +% value(:,j) = time_struct_modification.table.data(:,10); +% sensitivity=struct(field,value); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + + end + + + temp=700:25:1300; + h =25; + tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base + tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 + tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 + d_log_tk1=diff(log10(tk1)); + d_log_tk2=diff(log10(tk2)); + dh = log(h); + k1 = 2; + k2 = 0.5; + + [peaks,locs] = findpeaks(tbase/1000); +% yvalue=tbase/1000; + locsValue = temp(locs); + [peaks2,locs2] = findpeaks(-tbase/1000); +% yvalue=tbase/1000; + locsValue2 = temp(locs2); + + p_tempPoints_ig =[1, locs2, locs, length(temp)]; + temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; + +%translational sensitivity +%change the normalize contant log10?e.x. log10^3 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); + for i = 1 : length(p_tempPoints_ig) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... + = 100*(log10(tk1(p_tempPoints_ig(i))) - log10(tk2(p_tempPoints_ig(i))))/(log10(tbase(i))*log10(k1/k2)); % translational shift + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig)); + + + p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point + + temp_p_tempPoints_gr=[temp(locs2),temp(locs)]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)); + %rotational sensitivity + for i = 1 : length(p_tempPoints_gr) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... + = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr)); + end + +end +%% plotting +% figure; +% figure('position',[20 50 580 480]); +% hFig = figure(1); +% set(hFig, 'Position', [20 50 580 3500]) + +% for m = 1 : numbOfPressure +% for k = 1 : numbOfClass +% h=figure('position',[20 50 1200 480]); +% subplot(1,2,1); +% set(gca,'Fontsize',13) +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); +% % legend('baseline','k=2''k=1') +% +% % legend_text{1}='baseline'; +% % legend_text{2}='k=2'; +% % legend_text{3}='k=1'; +% % +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% % 'k--','markersize',marker_size) +% % legend_text{end+1}=[mechanism{i},'_','before']; +% % +% % +% +% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... +% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... +% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... +% ,'gp','markersize',12); +% hold on +% semilogy(locsValue,peaks,'gp','markersize',12); +% hold on +% semilogy(locsValue2,-peaks2,'gp','markersize',12); +% +% legend('baseline','k=2','k=1','extreme points') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% +% +% +% +% subplot(1,2,2); +% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +% ylim([-25 25]) +% hold on +% % figure +% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); +% +% ylim([-30 25]) +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% legend('ignition delay sensitivity','gradient sensitivity') +% +% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... +% 'String',{'n-heptane',... +% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% +% % legend(legend_text,'location','SouthEast','interpreter','none') +% % legend('boxoff') +% % xlabel('1000/T (1/K)') +% % ylabel('Ignition Delay Time (ms)') +% % % axis([0.7 1.6 20 40000]) +% % % clear legend_text +% % annotation(h,'textbox',[0.413 0.38 0.279 0.05],... +% % 'String',{'n-heptane',... +% % '/Air',classnumb_text{k}, '\phi=1'},... +% % 'FontSize',13,... +% % 'FontName','Arial',... +% % 'FitBoxToText','off',... +% % 'LineStyle','none'); +% % annotation(h,'textbox',[0.25 0.8 0.279 0.05],... +% % 'String',{' 20 atm'},... +% % 'FontSize',13,... +% % 'FontName','Arial',... +% % 'FitBoxToText','off',... +% % 'LineStyle','none'); +% +% end +% end \ No newline at end of file From aeb2aac5cc58b084baad22ff9005996e2d85246a Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 6 Mar 2017 00:33:24 -0500 Subject: [PATCH 19/47] multiple class modification ongoing.. Need to individually optimize for accuracy... --- modification.asv | 252 +++++++++++++++++++++++++++ modification.m | 11 +- optimization_7_repro_multiple_2.asv | 256 ---------------------------- optimization_7_repro_multiple_2.m | 4 +- 4 files changed, 264 insertions(+), 259 deletions(-) create mode 100644 modification.asv delete mode 100644 optimization_7_repro_multiple_2.asv diff --git a/modification.asv b/modification.asv new file mode 100644 index 0000000..750eaac --- /dev/null +++ b/modification.asv @@ -0,0 +1,252 @@ + +clear all; +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; + +%% Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% +fuel_name='n_dodecane'; +mechanism='MFC'; +% class_numb =6; +class_numb = [2 11 15 26 27 28]; +numbOfClass = length(class_numb); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%filename = [mechanism,'_',fuel_name,'_','class6.inp']; +filename = [mechanism,'_','base.inp']; +delimiter = ' '; + + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; + +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + + + + +for k = 1 : numbOfClass + + rawCellColumns2=rawCellColumns; + class_numb_text{k} = ['class' num2str(class_numb(k))]; + + for variation_numb = 1:7; + ModStart = 0; + for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if (strcmp('REACTIONS',rawCellColumns{i,j}) == 1 || strcmp('reactions',rawCellColumns{i,j})==1); + ModStart = 1; + end + + %% classes modification +% if class_numb == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + +%% + if variation_numb == 1 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2}); % same + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2}); + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); +% lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2}); +% lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); + elseif variation_numb == 2 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*2; % A*2 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*2; + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); +% lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2})*2; +% lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); + elseif variation_numb == 3 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.5; % A*0.5 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.5; + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); + elseif variation_numb == 4 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*7.5; % A>>1, A*7.5 + rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*7.5; + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; + elseif variation_numb == 5 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*1.6;% A>1 + rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*1.6;% A>1 + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; % E+2000 + elseif variation_numb == 6 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.6; % A<1 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.6; + if str2num(rawCellColumns{i,4})-2000>0; + rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})-2000; % E-2000 + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})-2000; + else + rawCellColumns2{i,4} = 0; + lsqfit(variation_numb,2) = 0; + end + elseif variation_numb == 7 + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; + rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.13; % A<<1 + lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.13; + if str2num(rawCellColumns{i,4})-2000>0; + rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})-2000; % E-2000 + lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})-2000; + else + rawCellColumns2{i,4} = 0; + lsqfit(variation_numb,2) = 0; + end + + end + +%%saving files + % save mech_ERC-MultiChem+Bio_Brakora2012_v1_test.mat rawCellColumns2 + % file_name=[mechanism,'_',fuel_name,'_','class',class_numb,'_','v_',num2str(variation_numb),'.inp']; + file_name=[mechanism,'_',fuel_name,'_','class',num2str(class_numb(k)),'_','v_',num2str(variation_numb),'.inp']; + % fileID = fopen('mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp','w'); + fileID = fopen(file_name,'w'); + output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + clear i j; + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + + end + + end + end + + + +%% for future class determination +% if (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1) & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1); +% % rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*2; +% rawCellColumns2{i,2} = '***ClASS1****';; + +% end +% elseif (strfind(rawCellColumns{i,j},'IC8H18')==1 ) & (isempty(strfind(rawCellColumns{i,j},'C8H17'))==0) & (ModStart == 1); +% % rawCellColumns2{i,2} = '***ClASS2****'; +% end + + + end +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns2 rawNumericColumns R; + rateParam.(class_numb_text{k})=lsqfit; + save('rateParam.mat','rateParam'); + clear rawCellColumns2; +end + +% save('lsqfit.mat','lsqfit'); +% field = 'class'; +% rateParam=struct(field); + +fclose(fileID); +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification.m b/modification.m index 3fabbac..78d1a50 100644 --- a/modification.m +++ b/modification.m @@ -20,7 +20,7 @@ fuel_name='n_dodecane'; mechanism='MFC'; % class_numb =6; -class_numb = [15 26 27]; +class_numb = [2 11 15 26 27 28]; numbOfClass = length(class_numb); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %filename = [mechanism,'_',fuel_name,'_','class6.inp']; @@ -107,6 +107,15 @@ if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv deleted file mode 100644 index 232dd6f..0000000 --- a/optimization_7_repro_multiple_2.asv +++ /dev/null @@ -1,256 +0,0 @@ -clear all -% close all - -classnumb=[27]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end -fuel_sim={'modify'}; - -%% read modification ignition delay time -% mechanism={'MFC'}; -mechanism={'MFC'}; -date = {'03_04_2017'}; -fuel_name = {'n_dodecane'}; -% fuel_name = {'n_heptane'}; -equi=1; - -currentloc = 'C:\Users\unghee\Dropbox\post_process'; - - - -pressure=[20 40]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -m = 2; -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; -cd(location_rateParam) -load rateParam.mat; -clear m; -%% exp data -% load rateParam.mat; -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -Temp1 = Target_fuel1(:,2); -numbOftarget1 =length(Target_data1); -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); - -Target_fuel2 = Shen_dode_40atm; -Target_data2=Target_fuel2(:,5); -Temp2 = Target_fuel2(:,2); -numbOftarget2 =length(Target_data2); -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); - - -Temp = [Temp1; Temp2]; -Target_data = [Target_data1; Target_data2]; -% Temp = Temp1; -% Target_data = Target_data1; - -cd ../../.. - -% Target_data = Shen_hep_40atm; -% % Target_data = Vasu_40atm; -% % Target_data = Wang_40atm; -% Temp = Target_data(:,2); -% Temp_un = Target_data(:,1); -%% dummy target - -% num_cases_target=25; -% m = 1; % pressure 20atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data1=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% range = 1:25; -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); -% Temp1 = Temp1(range); -% Target_data1 = Target_data1(range); -% -% cd ../../.. -% -% num_cases_target=25; -% m = 2; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data2=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% % range = 1:25; -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -% Temp2 = Temp2(range); -% Target_data2 = Target_data2(range); -% -% cd ../../.. -% Temp = [Temp1; Temp2]; -% Target_data = [Target_data1 Target_data2]; - - - A = rateParam.(class_numb_text{1})(:,1); - E = rateParam.(class_numb_text{1})(:,2); -%% read modification ignition delay time -% mechanism={'Ra_Reitz'}; -currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= size(A,1); -% date = {'01_30_2017'}; -% fuel_name = {'n_heptane'}; - -m=1; % pressure 20atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = range -for j = 1: numbOftarget1 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); - end - -end -for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); -end - -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = 1: length(range) -for j = 1: numbOftarget2 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); - time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); - end - -end - - -% for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); -% end - - - -%% coefficient -for j = 1 : size(Temp,1) -% for k = 1 : 1 -% for j = 1 : 1 - Temp_current = Temp(j); - - - for k = 1: numbOfClass - time_current = time_modification.(class_numb_text{k})(:,j); - A = rateParam.(class_numb_text{k})(:,1); - E = rateParam.(class_numb_text{k})(:,2); - M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; -% totalM = [totalM M]; - d = log(time_current); - coefs_inv = lsqlin(M,d); - coefs_element = coefs_inv'; - - - - coefs.(class_numb_text{k})(j,:)=coefs_element; - - prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; -% plotregression(d,M*coefs_element') - end - - -end -%% plot regression - -% for k = 1: numbOfClass -% plotregression(Temp,prediction.(class_numb_text{k}) -% end - - - - -%% OPTIMIZER - -% Target Temp value -% te(:,1) = Target_data(:,3); -% te(:,1) = Target_data; -numberOftempPoints = size(Target_data,1); -%% objective function - -% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -LB =[]; -UB =[]; -% class2 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) -LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; - -end -% class4 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) -LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; -end - -% class6 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; -end - -% ndodecane -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) -LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; -end - -nvars=2*numbOfClass; -options=gaoptimset('PopulationSize',500); -[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); -[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); - -X = result_ga; - -error=ObjectiveFunction(X) - -for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; -end - -location_save=[currentloc,'\',mechanism{1},'\',directory]; -cd(location_save) - -save('final_result.mat','final_result') - diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 5c0f2a0..2ec379e 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,7 +1,7 @@ clear all % close all -classnumb=[27]; +classnumb=[15 26 27]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -12,7 +12,7 @@ %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'MFC'}; -date = {'03_04_2017'}; +date = {'03_05_2017'}; fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; equi=1; From 055d8e1e6bd7257ab413c76f50c1d940314ba2d8 Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 6 Mar 2017 12:06:09 -0500 Subject: [PATCH 20/47] doubling the number of target --- modification.asv | 252 -------------------------- modification.m | 23 ++- optimization_7_repro_multiple_2.asv | 270 ++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.m | 25 ++- 4 files changed, 311 insertions(+), 259 deletions(-) delete mode 100644 modification.asv create mode 100644 optimization_7_repro_multiple_2.asv diff --git a/modification.asv b/modification.asv deleted file mode 100644 index 750eaac..0000000 --- a/modification.asv +++ /dev/null @@ -1,252 +0,0 @@ - -clear all; -%% Import data from text file. -% Script for importing data from the following text file: -% -% /home/jordan/Documents/Research/matlabfolder/mech.dat -% -% To extend the code to different selected data or a different text file, -% generate a function instead of a script. - -% Auto-generated by MATLAB on 2016/08/24 17:10:49 - -%% Initialize variables. -% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; -currentFolder = pwd; -cd(pwd); -% cd mechanisms/; - -%% Settings %%%%%%%%%%%%%%%%%%%%%%%%%%% -fuel_name='n_dodecane'; -mechanism='MFC'; -% class_numb =6; -class_numb = [2 11 15 26 27 28]; -numbOfClass = length(class_numb); -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%filename = [mechanism,'_',fuel_name,'_','class6.inp']; -filename = [mechanism,'_','base.inp']; -delimiter = ' '; - - -%% Read columns of data as strings: -% For more information, see the TEXTSCAN documentation. -formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; - -%% Open the text file. -fileID = fopen(filename,'r'); - -%% Read columns of data according to format string. -% This call is based on the structure of the file used to generate this -% code. If an error occurs for a different file, try regenerating the code -% from the Import Tool. -dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); - -%% Close the text file. -fclose(fileID); - -%% Convert the contents of columns containing numeric strings to numbers. -% Replace non-numeric strings with NaN. -raw = repmat({''},length(dataArray{1}),length(dataArray)-1); -for col=1:length(dataArray)-1 - raw(1:length(dataArray{col}),col) = dataArray{col}; -end -numericData = NaN(size(dataArray{1},1),size(dataArray,2)); - - -%% Split data into numeric and cell columns. -rawNumericColumns = {}; -rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); - - - %% Replace non-numeric cells with NaN - -[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); - -locationClass = [A B]; - -[rowCellNumber,] = size(rawCellColumns); - - - - -for k = 1 : numbOfClass - - rawCellColumns2=rawCellColumns; - class_numb_text{k} = ['class' num2str(class_numb(k))]; - - for variation_numb = 1:7; - ModStart = 0; - for i=1 : rowCellNumber - [ ~, columnCellNumber] = size(rawCellColumns(i,:)); -% for j= 1 : cellfun('length',rawCellColumns{i,:}) - for j= 1 : 1: columnCellNumber - - if (strcmp('REACTIONS',rawCellColumns{i,j}) == 1 || strcmp('reactions',rawCellColumns{i,j})==1); - ModStart = 1; - end - - %% classes modification -% if class_numb == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% | class_numb == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - - if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 - & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - -%% - if variation_numb == 1 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2}); % same - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2}); - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); -% lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2}); -% lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); - elseif variation_numb == 2 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*2; % A*2 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*2; - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); -% lsqfit(variation_numb+1,1) = str2num(rawCellColumns{i,2})*2; -% lsqfit(variation_numb+1,2) = str2num(rawCellColumns{i,4}); - elseif variation_numb == 3 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.5; % A*0.5 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.5; - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4}); - elseif variation_numb == 4 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*7.5; % A>>1, A*7.5 - rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*7.5; - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; - elseif variation_numb == 5 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*1.6;% A>1 - rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})+2000; % E+2000 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*1.6;% A>1 - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})+2000; % E+2000 - elseif variation_numb == 6 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.6; % A<1 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.6; - if str2num(rawCellColumns{i,4})-2000>0; - rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})-2000; % E-2000 - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})-2000; - else - rawCellColumns2{i,4} = 0; - lsqfit(variation_numb,2) = 0; - end - elseif variation_numb == 7 - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','v_',num2str(variation_numb)]; - rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*0.13; % A<<1 - lsqfit(variation_numb,1) = str2num(rawCellColumns{i,2})*0.13; - if str2num(rawCellColumns{i,4})-2000>0; - rawCellColumns2{i,4} = str2num(rawCellColumns{i,4})-2000; % E-2000 - lsqfit(variation_numb,2) = str2num(rawCellColumns{i,4})-2000; - else - rawCellColumns2{i,4} = 0; - lsqfit(variation_numb,2) = 0; - end - - end - -%%saving files - % save mech_ERC-MultiChem+Bio_Brakora2012_v1_test.mat rawCellColumns2 - % file_name=[mechanism,'_',fuel_name,'_','class',class_numb,'_','v_',num2str(variation_numb),'.inp']; - file_name=[mechanism,'_',fuel_name,'_','class',num2str(class_numb(k)),'_','v_',num2str(variation_numb),'.inp']; - % fileID = fopen('mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp','w'); - fileID = fopen(file_name,'w'); - output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); - clear i j; - for i = 1:size(rawCellColumns2,1) - for j = 1:size(rawCellColumns2,2) - if numel(rawCellColumns2{i,j}) == 0 - output{i,j} = ''; - % Check whether the content of cell i,j is - % numeric and convert numbers to strings. - elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) - output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); - - % If the cell already contains a string, nothing has to be done. - elseif ischar(rawCellColumns2{i,j}) - output{i,j} = rawCellColumns2{i,j}; - end; - - % Cell i,j is written to the output file. A delimiter is appended for - % all but the last element of each row. At the end of a row, a newline - % is written to the output file. - if j < size(rawCellColumns2,2) - fprintf(fileID,['%s',delimiter],output{i,j}); - else - fprintf(fileID,'%s\r\n',output{i,j}); - end - end; - end; - - - end - - end - end - - - -%% for future class determination -% if (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1) & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1); -% % rawCellColumns2{i,2} = str2num(rawCellColumns{i,2})*2; -% rawCellColumns2{i,2} = '***ClASS1****';; - -% end -% elseif (strfind(rawCellColumns{i,j},'IC8H18')==1 ) & (isempty(strfind(rawCellColumns{i,j},'C8H17'))==0) & (ModStart == 1); -% % rawCellColumns2{i,2} = '***ClASS2****'; -% end - - - end -% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns2 rawNumericColumns R; - rateParam.(class_numb_text{k})=lsqfit; - save('rateParam.mat','rateParam'); - clear rawCellColumns2; -end - -% save('lsqfit.mat','lsqfit'); -% field = 'class'; -% rateParam=struct(field); - -fclose(fileID); -% exit -%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp - -%% Clear temporary variables -% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification.m b/modification.m index 78d1a50..bb9394e 100644 --- a/modification.m +++ b/modification.m @@ -20,7 +20,7 @@ fuel_name='n_dodecane'; mechanism='MFC'; % class_numb =6; -class_numb = [2 11 15 26 27 28]; +class_numb = [15]; numbOfClass = length(class_numb); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %filename = [mechanism,'_',fuel_name,'_','class6.inp']; @@ -108,11 +108,25 @@ if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... @@ -122,6 +136,9 @@ & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... %% diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv new file mode 100644 index 0000000..eeda8bf --- /dev/null +++ b/optimization_7_repro_multiple_2.asv @@ -0,0 +1,270 @@ +clear all +% close all + +classnumb=[15 26 27]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +fuel_sim={'modify'}; + +%% read modification ignition delay time +% mechanism={'MFC'}; +mechanism={'MFC'}; +date = {'03_05_2017'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; +equi=1; + +currentloc = 'C:\Users\unghee\Dropbox\post_process'; + + + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +m = 2; +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +cd(location_rateParam) +load rateParam.mat; +clear m; +%% exp data +% load rateParam.mat; +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); + +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); +%% +%double the targetvalue!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +Temp2 = [Temp2; Temp2]; +Target_data2 = [Target_data2; Target_data2]; +%%%%%%%%%%%%%%%%%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +%% +numbOftarget2 =length(Target_data2); +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; +% Temp = Temp1; +% Target_data = Target_data1; + +cd ../../.. + +% Target_data = Shen_hep_40atm; +% % Target_data = Vasu_40atm; +% % Target_data = Wang_40atm; +% Temp = Target_data(:,2); +% Temp_un = Target_data(:,1); +%% dummy target + +% num_cases_target=25; +% m = 1; % pressure 20atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data1=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% range = 1:25; +% Temp1=flip(Temp1); +% Target_data1=flip(Target_data1); +% Temp1 = Temp1(range); +% Target_data1 = Target_data1(range); +% +% cd ../../.. +% +% num_cases_target=25; +% m = 2; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; +% cd(location_target) +% addpath(currentloc) +% time_struct_target=read_ignition_delay(location_target,num_cases_target); +% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? +% +% +% Target_data2=time_struct_target.table.data(:,10); +% % range = 12:22; % works slightly well ?? +% % range = 12:25; % works slightly as well.. +% % range = 1:25; +% Temp2=flip(Temp2); +% Target_data2=flip(Target_data2); +% Temp2 = Temp2(range); +% Target_data2 = Target_data2(range); +% +% cd ../../.. +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1 Target_data2]; + + + A = rateParam.(class_numb_text{1})(:,1); + E = rateParam.(class_numb_text{1})(:,2); +%% read modification ignition delay time +% mechanism={'Ra_Reitz'}; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= size(A,1); +% date = {'01_30_2017'}; +% fuel_name = {'n_heptane'}; + +m=1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% for j = range +for j = 1: numbOftarget1 + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); + end + +end +for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); +end + +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% for j = 1: length(range) +for j = 1: numbOftarget2 + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); + end + +end + + +% for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% end + + + +%% coefficient +for j = 1 : size(Temp,1) +% for k = 1 : 1 +% for j = 1 : 1 + Temp_current = Temp(j); + + + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; +% totalM = [totalM M]; + d = log(time_current); + coefs_inv = lsqlin(M,d); + coefs_element = coefs_inv'; + + + + coefs.(class_numb_text{k})(j,:)=coefs_element; + + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; + predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; +% plotregression(d,M*coefs_element') + end + + +end +%% plot regression + +for k = 1: numbOfClass +plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) +end + + + + +%% OPTIMIZER + +% Target Temp value +% te(:,1) = Target_data(:,3); +% te(:,1) = Target_data; +numberOftempPoints = size(Target_data,1); +%% objective function + +% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +LB =[]; +UB =[]; +% class2 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) +LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; + +end +% class4 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) +LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; +end + +% class6 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) +LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; +end + +% ndodecane +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end + +nvars=2*numbOfClass; +options=gaoptimset('PopulationSize',500); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); + +X = result_ga; + +error=ObjectiveFunction(X) + +for i = 1 : numbOfClass +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +end + +location_save=[currentloc,'\',mechanism{1},'\',directory]; +cd(location_save) + +save('final_result.mat','final_result') + diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 2ec379e..cc6036b 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -47,9 +47,18 @@ Target_fuel2 = Shen_dode_40atm; Target_data2=Target_fuel2(:,5); Temp2 = Target_fuel2(:,2); -numbOftarget2 =length(Target_data2); + % Temp2=flip(Temp2); % Target_data2=flip(Target_data2); +%% +%double the targetvalue!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +Temp2 = [Temp2; Temp2]; +Target_data2 = [Target_data2; Target_data2]; + +numbOftarget2 =length(Target_data2); + +%%%%%%%%%%%%%%%%%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +%% Temp = [Temp1; Temp2]; @@ -194,9 +203,9 @@ end %% plot regression -for k = 1: numbOfClass -plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) -end +% for k = 1: numbOfClass +% plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) +% end @@ -233,6 +242,14 @@ % ndodecane if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; end From 220496507b07f214111e7816297fa2f52d2584bd Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 6 Mar 2017 13:33:37 -0500 Subject: [PATCH 21/47] onepressure multipleclass ongoing changed UB LB --- optimization_7_repro_multiple_2.asv | 14 ++++-- optimization_7_repro_multiple_2.m | 71 +++++++++++++---------------- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index eeda8bf..3b0124d 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -12,7 +12,7 @@ fuel_sim={'modify'}; %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'MFC'}; -date = {'03_05_2017'}; +date = {'03_06_2017'}; fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; equi=1; @@ -54,9 +54,13 @@ Temp2 = Target_fuel2(:,2); %double the targetvalue!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Temp2 = [Temp2; Temp2]; Target_data2 = [Target_data2; Target_data2]; + +numbOftarget2 =length(Target_data2); + %%%%%%%%%%%%%%%%%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %% -numbOftarget2 =length(Target_data2); + + Temp = [Temp1; Temp2]; Target_data = [Target_data1; Target_data2]; % Temp = Temp1; @@ -199,9 +203,9 @@ for j = 1 : size(Temp,1) end %% plot regression -for k = 1: numbOfClass -plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) -end +% for k = 1: numbOfClass +% plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) +% end diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index cc6036b..196fb27 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -12,7 +12,7 @@ %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'MFC'}; -date = {'03_05_2017'}; +date = {'03_06_2017'}; fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; equi=1; @@ -26,7 +26,7 @@ pressure_text{k}=[num2str(pressure(k)),'atm']; end -m = 2; +m = 1; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) @@ -44,21 +44,14 @@ % Temp1=flip(Temp1); % Target_data1=flip(Target_data1); -Target_fuel2 = Shen_dode_40atm; -Target_data2=Target_fuel2(:,5); -Temp2 = Target_fuel2(:,2); - -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -%% -%double the targetvalue!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Temp2 = [Temp2; Temp2]; -Target_data2 = [Target_data2; Target_data2]; - -numbOftarget2 =length(Target_data2); - -%%%%%%%%%%%%%%%%%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -%% +% Target_fuel2 = Shen_dode_40atm; +% Target_data2=Target_fuel2(:,5); +% Temp2 = Target_fuel2(:,2); +% +% % Temp2=flip(Temp2); +% % Target_data2=flip(Target_data2); +% +% numbOftarget2 =length(Target_data2); Temp = [Temp1; Temp2]; @@ -149,27 +142,27 @@ temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = 1: length(range) -for j = 1: numbOftarget2 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); - time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); - end - -end - - -% for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% m =2 ; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% % for j = 1: length(range) +% for j = 1: numbOftarget2 +% for k = 1: numbOfClass +% % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; +% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; +% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% % time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% % temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); +% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); +% end +% % end +% +% +% % for k = 1: numbOfClass +% % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% % end @@ -241,11 +234,11 @@ end % ndodecane -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; end -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +if strcmp(mechanism{1},'MFC') && ismember(26,classnumb) LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; end From 4a7b2cbee02abbe6bac92ff5a071ad3b829635a2 Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 6 Mar 2017 16:38:40 -0500 Subject: [PATCH 22/47] senstivity for one pressure and now can plot modify range --- MFC_load_range.m | 52 +++++++ Ra_Reitz_plot_2.asv | 228 ++++++++++++++++++++++++++++ Ra_Reitz_plot_2.m | 89 +++++++---- optimization_7_repro_multiple_2.asv | 139 +++++++++-------- optimization_7_repro_multiple_2.m | 92 ++++++----- optimization_driver_2.asv | 50 ++++++ optimization_driver_2.m | 132 +++++----------- optimization_driver_2_lockdown.m | 111 ++++++++++++++ sensitivity_analysis_3.asv | 192 +++++++++++++++++++++++ sensitivity_analysis_3.m | 16 +- 10 files changed, 871 insertions(+), 230 deletions(-) create mode 100644 MFC_load_range.m create mode 100644 Ra_Reitz_plot_2.asv create mode 100644 optimization_driver_2.asv create mode 100644 optimization_driver_2_lockdown.m create mode 100644 sensitivity_analysis_3.asv diff --git a/MFC_load_range.m b/MFC_load_range.m new file mode 100644 index 0000000..52123f1 --- /dev/null +++ b/MFC_load_range.m @@ -0,0 +1,52 @@ +clear all +close all + +%% +mechanism={'MFC'}; +% fuel_sim={'base','v1','v2','v3' }; +fuel_sim={'modify'}; +fuel_name={'n_dodecane'}; +date = {'03_05_2017'}; +equi =1; +% pressure=[20 40 ]; +pressure = [20 40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end + +classnumb=[15 26 27]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end +%% + +for i=1:length(mechanism) + for j=1:length(fuel_sim) + for k = 1: length(classnumb) +% phi=1 simulation results + for m=1:length(pressure) + for q=1:num_cases(m) + location=['C:\Users\unghee\Dropbox\post_process','\',mechanism{i},'\',fuel_name{1},'_',num2str(pressure(m))... + ,'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{j},'\',class_numb_text{k},'\',num2str(q)]; + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{m}).(num_cases_text{q})=read_ignition_delay(location,7); + end + end + + end + end +end + + +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(1))... + ,'atm','_','phi',num2str(equi),'_',date{1}]; +cd(directory); +cd(fuel_sim{1}); +filename = ['simulation_result','_',fuel_sim{1},'_',num2str(pressure(1)),'atm','_','phi','_',num2str(equi),'.mat']; +save(filename,'sim') diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv new file mode 100644 index 0000000..ab36255 --- /dev/null +++ b/Ra_Reitz_plot_2.asv @@ -0,0 +1,228 @@ +clear all +% close all +%% Ra&Reitz +mechanism={'MFC' }; +% fuel_sim={'base','v1','v2','v3'}; + +pressure=[20 40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +num_cases=25; + + +pure_component_ID; +real_fuel_ID; + +exp_markers={'ro' 'g*' 'b^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +i=1; %mechanism + +%% 20atm condition + +% h2=figure('position',[20 50 580 480]); +% set(gca,'Fontsize',13) +% %plot exp data +% %/4 convert to ms +% +% +% +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); +% +% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) +% +% +% +% % legend_text{2}='Vasu et al.40atm, Shock Tube'; +% % legend_text{1}='Vasu et al.20atm, Shock Tube'; +% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; +% % legend_text{1}=' '; +% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; +% % legend_text{3}='Dooley et al., RCM'; +% % legend_text{2}='Shen et al., Shock Tube'; +% %plot sim data +% +% +% +% +% hold on +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% k=1; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; +% legend_text{end+1}=[mechanism{i},'_','before']; +% end +% +% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue = yvalue(locs); +% hold on +% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); +% +% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue2 = yvalue2(locs2); +% hold on +% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); +% +% difference=abs(locsValue-Vasu_dode_20atm(:,2)); +% [minDifference,idx] = min(difference); +% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); +% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); +% +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% +% fuel_sim={'afteroptimize'}; +% k=1; +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'b-','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; +% +% end +% +% +% +% legend(legend_text,'location','SouthEast','interpreter','none') +% legend('boxoff') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (micros)') +% % ylim([0.1 10000]) +% % axis([0.7 1.6 0.1 10]) +% % clear legend_text +% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... +% 'String',{'n-dodecane',... +% '/Air', '\phi=1'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... +% 'String',{' 20 atm'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +%% 40atm condition +num_cases=[26 11]; +for k = 1: length(pressure) + +h3=figure('position',[20 50 580 480]); +set(gca,'Fontsize',13) +clear legend_text +% % legend_text{1}='Vasu et al.40atm, Shock Tube'; +% legend_text{1}='Shen et al.40atm, Shock Tube'; +% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) + +% legend_text{1}=['ERC',pressure_text{k},'Dummy']; +% legend_text{2}=['ERC',pressure_text{k},'target(original)']; +% legend_text{3}=['ERC',pressure_text{k},'after optimize']; + +legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; + if strcmp(pressure_text{k},'P20atm') + legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + else + legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + end + +legend_text{3}=['MFC ',pressure_text{k},', after optimize']; + +% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; + + load('simulation_result_beforeoptimize_20atm_phi_1.mat') + fuel_sim={'beforeoptimize'}; + + + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + + + + + + hold on + + +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize'}; + + +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'r*','markersize',marker_size) +% end + + + + + +% hold on +% +% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + if strcmp(pressure_text{k},'P20atm') + semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) + else + semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) + end + + hold on + + + load('simulation_result_modify_20atm_phi_1.mat') + fuel_sim={'modify'}; + + + for j=1:length(fuel_sim) + for q= 1: num_causes + semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).q.table.data(:,10),... + 'bo','markersize',marker_size); + end + + end + + legend(legend_text,'location','SouthEast','interpreter','none') + legend('boxoff') + xlabel('1000/T (1/K)') + ylabel('Ignition Delay Time (micros)') + % axis([0.7 1.6 20 40000]) + % clear legend_text + annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... + 'String',{'n-dodecane',... + '/Air','one class', '\phi=1'},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... + 'String',{pressure_text{k}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 6fd0a13..8932ecd 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -122,7 +122,11 @@ % 'FitBoxToText','off',... % 'LineStyle','none'); %% 40atm condition - +num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end for k = 1: length(pressure) h3=figure('position',[20 50 580 480]); @@ -152,35 +156,48 @@ load('simulation_result_beforeoptimize_20atm_phi_1.mat') fuel_sim={'beforeoptimize'}; - for j=1:length(fuel_sim) - - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end hold on + load('simulation_result_beforeoptimize_20atm_phi_1.mat') + fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize'}; + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'r*','markersize',marker_size) -% end + hold on + + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; -% hold on + + semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... + 'b--','markersize',marker_size) + + + + + + +hold on % % semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) if strcmp(pressure_text{k},'P20atm') @@ -192,21 +209,41 @@ hold on - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; + load('simulation_result_modify_20atm_phi_1.mat') + fuel_sim={'modify'}; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% 'bo','markersize',marker_size); +% end +% end +% hold on; + %upper bound & lowerbond + x=[]; y=[]; for j=1:length(fuel_sim) - - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'b','markersize',marker_size) - % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','40atm']; - - + for q= 1: num_cases(k) + x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); + y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); + + + end end + semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); + x=[]; y=[]; + for j=1:length(fuel_sim) + for q= 1: num_cases(k) + x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); + y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); + + + end + end + semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); + legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') xlabel('1000/T (1/K)') diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index 3b0124d..42c20a1 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -1,7 +1,7 @@ clear all % close all -classnumb=[15 26 27]; +classnumb=[11 15 21 22 23 24 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -26,53 +26,42 @@ for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; end -m = 2; +m = 1; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; cd(location_rateParam) load rateParam.mat; clear m; %% exp data -% load rateParam.mat; -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -Temp1 = Target_fuel1(:,2); -numbOftarget1 =length(Target_data1); -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); - -Target_fuel2 = Shen_dode_40atm; -Target_data2=Target_fuel2(:,5); -Temp2 = Target_fuel2(:,2); - -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -%% -%double the targetvalue!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Temp2 = [Temp2; Temp2]; -Target_data2 = [Target_data2; Target_data2]; - -numbOftarget2 =length(Target_data2); - -%%%%%%%%%%%%%%%%%%%%%%%%%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -%% +% addpath('C:\Users\unghee\Dropbox\post_process'); +% real_fuel_ID; +% pure_component_ID; +% Target_fuel1 = Vasu_dode_20atm; +% Target_data1=Target_fuel1(:,5); +% Temp1 = Target_fuel1(:,2); +% numbOftarget1 =length(Target_data1); +% % Temp1=flip(Temp1); +% % Target_data1=flip(Target_data1); +% +% Target_fuel2 = Shen_dode_40atm; +% Target_data2=Target_fuel2(:,5); +% Temp2 = Target_fuel2(:,2); +% +% % Temp2=flip(Temp2); +% % Target_data2=flip(Target_data2); +% +% numbOftarget2 =length(Target_data2); +% +% +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1; Target_data2]; +% % Temp = Temp1; +% % Target_data = Target_data1; +% +% cd ../../.. -Temp = [Temp1; Temp2]; -Target_data = [Target_data1; Target_data2]; -% Temp = Temp1; -% Target_data = Target_data1; - -cd ../../.. -% Target_data = Shen_hep_40atm; -% % Target_data = Vasu_40atm; -% % Target_data = Wang_40atm; -% Temp = Target_data(:,2); -% Temp_un = Target_data(:,1); %% dummy target % num_cases_target=25; @@ -149,35 +138,35 @@ for k = 1: numbOfClass temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = 1: length(range) -for j = 1: numbOftarget2 - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); - time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); - end - -end - - -% for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% m =2 ; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% % for j = 1: length(range) +% for j = 1: numbOftarget2 +% for k = 1: numbOfClass +% % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; +% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; +% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% % time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% % temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); +% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); +% end +% % end +% +% +% % for k = 1: numbOfClass +% % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% % end %% coefficient -for j = 1 : size(Temp,1) +for j = 1 : size(Temp.pressure_text{1},1) % for k = 1 : 1 % for j = 1 : 1 - Temp_current = Temp(j); + Temp_current = Temp.pressure_text{1}(j); for k = 1: numbOfClass @@ -241,11 +230,31 @@ UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end % ndodecane -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) +LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(22,classnumb) +LB =[LB rateParam.('class22')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(23,classnumb) +LB =[LB rateParam.('class23')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(24,classnumb) +LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) +LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; end -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +if strcmp(mechanism{1},'MFC') && ismember(26,classnumb) LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; end @@ -253,6 +262,10 @@ if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; end +if strcmp(mechanism{1},'MFC') && ismember(28,classnumb) +LB =[LB rateParam.('class28')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 196fb27..ea8702f 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,7 +1,7 @@ -clear all +% clear all % close all -classnumb=[15 26 27]; +% classnumb=[11 15 21 22 23 24 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -11,17 +11,17 @@ %% read modification ignition delay time % mechanism={'MFC'}; -mechanism={'MFC'}; -date = {'03_06_2017'}; -fuel_name = {'n_dodecane'}; -% fuel_name = {'n_heptane'}; -equi=1; +% mechanism={'MFC'}; +% date = {'03_06_2017'}; +% fuel_name = {'n_dodecane'}; +% % fuel_name = {'n_heptane'}; +% equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; -pressure=[20 40]; +% pressure=[20 40]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -33,17 +33,17 @@ load rateParam.mat; clear m; %% exp data -% load rateParam.mat; -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -Temp1 = Target_fuel1(:,2); -numbOftarget1 =length(Target_data1); -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); +% addpath('C:\Users\unghee\Dropbox\post_process'); +% real_fuel_ID; +% pure_component_ID; +% Target_fuel1 = Vasu_dode_20atm; +% Target_data1=Target_fuel1(:,5); +% Temp1 = Target_fuel1(:,2); +% numbOftarget1 =length(Target_data1); +% % Temp1=flip(Temp1); +% % Target_data1=flip(Target_data1); +% % Target_fuel2 = Shen_dode_40atm; % Target_data2=Target_fuel2(:,5); % Temp2 = Target_fuel2(:,2); @@ -52,20 +52,16 @@ % % Target_data2=flip(Target_data2); % % numbOftarget2 =length(Target_data2); +% +% +% Temp = [Temp1; Temp2]; +% Target_data = [Target_data1; Target_data2]; +% % Temp = Temp1; +% % Target_data = Target_data1; +% +% cd ../../.. -Temp = [Temp1; Temp2]; -Target_data = [Target_data1; Target_data2]; -% Temp = Temp1; -% Target_data = Target_data1; - -cd ../../.. - -% Target_data = Shen_hep_40atm; -% % Target_data = Vasu_40atm; -% % Target_data = Wang_40atm; -% Temp = Target_data(:,2); -% Temp_un = Target_data(:,1); %% dummy target % num_cases_target=25; @@ -125,7 +121,7 @@ m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; % for j = range -for j = 1: numbOftarget1 +for j = 1: numbOftarget.pressure_text{m} for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; @@ -138,22 +134,22 @@ for k = 1: numbOfClass % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); end % m =2 ; % pressure 40atm % directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; % % for j = 1: length(range) -% for j = 1: numbOftarget2 +% for j = 1: numbOftarget.pressure_text{m} % for k = 1: numbOfClass % % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; % location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; % time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); % % time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); % % temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); -% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); +% time_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,6); % end % % end @@ -234,6 +230,26 @@ end % ndodecane +if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) +LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(22,classnumb) +LB =[LB rateParam.('class22')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(23,classnumb) +LB =[LB rateParam.('class23')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(24,classnumb) +LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) +LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; @@ -246,6 +262,10 @@ LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; end +if strcmp(mechanism{1},'MFC') && ismember(28,classnumb) +LB =[LB rateParam.('class28')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); diff --git a/optimization_driver_2.asv b/optimization_driver_2.asv new file mode 100644 index 0000000..558cf55 --- /dev/null +++ b/optimization_driver_2.asv @@ -0,0 +1,50 @@ +clear; +mechanism={'MFC'}; +fuel_name={'n_dodecane'}; +date = {'03_06_2017'}; +equi = 1; +classnumb=[1 2 3 4 5 6 7 8 9]; + +pressure=[20]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +%% +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data.pressure_text{1}=Target_fuel1(:,5); +Temp.pressure_text{1} = Target_fuel1(:,2); +numbOftarget.pressure_text{1} =length(Target_data.pressure_text{1}); + +Temp = [Temp.pressure_text{1}]; +Target_data = [Temp.pressure_text{1}]; + + +%% +sensitivity_analysis_3; + +clearvars -except sensitivity classnumb pressure classnumb_text pressure_text +class_to_optimize = []; +for k=1:length(classnumb) + + if (sensitivity.(pressure_text{k}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) + pressure_text{k}.class_to_optimize = [class_to_optimize k]; + end +end + + +classnumb=pressure_text{k}.class_to_optimize; +classnumb = [4,6]; + +clearvars -except classnumb Temp numberOftarget Target_data +optimization_10; + + +%modification after optimize + +%load + +% load -> output rightaway bash \ No newline at end of file diff --git a/optimization_driver_2.m b/optimization_driver_2.m index a87b209..d3a6528 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,111 +1,63 @@ clear; -close all; -mechanism={'Ra_Reitz'}; -fuel_name={'n_heptane'}; -date = {'01_30_2017'}; +mechanism={'MFC'}; +fuel_name={'n_dodecane'}; +date = {'03_06_2017'}; fuel_sim={'modify_class2_class4_class6_moderate'}; equi = 1; -pressure=[40]; -classnumb=[2 4 6]; - +classnumb=[11 15 21 22 23 24 26 27 28]; +pressure=[20]; +%% sensitivity sensitivity_analysis_3; - clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi -% Determine classes with overall sensitivity -classnumb_optimize.entire.(pressure_text{1}) = []; -% classnumb_optimize.entire.(pressure_text{1}) = sturct([]); -pressure_optimize_text =[]; -pressure_optimize =[]; -for m = 1 : length(pressure) - for k=1:length(classnumb) - - if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) - classnumb_optimize.entire.(pressure_text{m}) = [ classnumb_optimize.entire.(pressure_text{m}) classnumb(k)]; - - end - end - pressure_optimize_text = [pressure_optimize pressure_text{m}]; - pressure_optimize = [pressure_optimize pressure(m)]; -end - - for m = 1 : length(pressure_optimize) - classnumb=classnumb_optimize.entire.(pressure_text{m}); %have to change for multiple pressure in optimization.m - end -%% HTR optimize -% add sgr information for the future work -classnumb_optimize.HTR.(pressure_text{1}) = []; -pressure_optimize_text =[]; -pressure_optimize =[]; -for m = 1 : length(pressure) - for k=1:length(classnumb) - - if (abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(4))) > 1 - classnumb_optimize.HTR.(pressure_text{m}) = [classnumb_optimize.HTR.(pressure_text{m}) classnumb(k)]; - end - end - pressure_optimize_text = [pressure_optimize pressure_text{m}]; - pressure_optimize = [pressure_optimize pressure(m)]; -end -for m = 1 : length(pressure_optimize) -classnumb=classnumb_optimize.HTR.(pressure_text{m}); -end -pressure = pressure_optimize; -clearvars -except classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity -range = 1:10; -% optimization_10; -optimization_7_repro_multiple_2; -%% -% final result for HTR, and LockDouwn -clearvars -except final_result pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity pressure_text -numbOfPressure=length(pressure) ; -for k=1:length(pressure) - pressure_text{k}=['P',num2str(pressure(k)),'atm']; +m =1; +disp('looking at sensitivity at one pressure condition') +class_to_optimize.(pressure_text{m}) = []; +for k=1:length(classnumb) + +% if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) + class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; + end end -classnumb_optimize.NTC.(pressure_text{1})=[]; -pressure_optimize_text =[]; -pressure_optimize =[]; -Entire = classnumb_optimize.entire.(pressure_text{1}); -HTR = classnumb_optimize.HTR.(pressure_text{1}); +classnumb = class_to_optimize.(pressure_text{m}) -classnumb_optimize.NTC.(pressure_text{1})... - = setxor(Entire,HTR); -numbOfClass_NTC = length(classnumb_optimize.NTC.(pressure_text{1})); -class_numb_text_NTC = {}; -for k=1:numbOfClass_NTC -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text_NTC=[class_numb_text_NTC ['class',num2str(classnumb_optimize.NTC.(pressure_text{1})(k))]]; -end +%% Target setting +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data.pressure_text{1}=Target_fuel1(:,5); +Temp.pressure_text{1} = Target_fuel1(:,2); +numbOftarget.pressure_text{1} =length(Target_data.pressure_text{1}); -classnumbOfNTC = []; -for m = 1 : length(pressure) - for k=1:numbOfClass_NTC - - if (abs(sensitivity.(pressure_text{m}).(class_numb_text_NTC{k}).Sig(2)) > 1) - classnumbOfNTC = [classnumbOfNTC classnumb_optimize.NTC.(pressure_text{1})(k)]; - end - end - pressure_optimize_text = [pressure_optimize pressure_text{m}]; - pressure_optimize = [pressure_optimize pressure(m)]; -end -classnumb_optimize.NTC.(pressure_text{m}) = classnumbOfNTC; +Temp = [Temp.pressure_text{1}]; +Target_data = [Temp.pressure_text{1}]; -for m = 1 : length(pressure_optimize) -classnumb=classnumb_optimize.NTC.(pressure_text{m}); -end -pressure = pressure_optimize; +%% Optimization -clearvars -except final_result classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity -range = 12:20; +clearvars -except classnumb Temp numberOftarget Target_data +optimization_10; -optimization_7_repro_multiple_2; %modification after optimize - +% clearvars -except sensitivity classnumb pressure classnumb_text +% class_to_optimize = []; +% for k=1:length(classnumb) +% +% if (sensitivity.(pressure_text{k}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) +% pressure_text{k}.class_to_optimize = [class_to_optimize k]; +% end +% end +% +% +% classnumb=pressure_text{k}.class_to_optimize; +% classnumb = [4,6]; %load % load -> output rightaway bash \ No newline at end of file diff --git a/optimization_driver_2_lockdown.m b/optimization_driver_2_lockdown.m new file mode 100644 index 0000000..a87b209 --- /dev/null +++ b/optimization_driver_2_lockdown.m @@ -0,0 +1,111 @@ +clear; +close all; +mechanism={'Ra_Reitz'}; +fuel_name={'n_heptane'}; +date = {'01_30_2017'}; +fuel_sim={'modify_class2_class4_class6_moderate'}; +equi = 1; +pressure=[40]; +classnumb=[2 4 6]; + +sensitivity_analysis_3; + +clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi +% Determine classes with overall sensitivity +classnumb_optimize.entire.(pressure_text{1}) = []; +% classnumb_optimize.entire.(pressure_text{1}) = sturct([]); +pressure_optimize_text =[]; +pressure_optimize =[]; +for m = 1 : length(pressure) + for k=1:length(classnumb) + + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) + classnumb_optimize.entire.(pressure_text{m}) = [ classnumb_optimize.entire.(pressure_text{m}) classnumb(k)]; + + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end + + for m = 1 : length(pressure_optimize) + classnumb=classnumb_optimize.entire.(pressure_text{m}); %have to change for multiple pressure in optimization.m + end +%% HTR optimize +% add sgr information for the future work +classnumb_optimize.HTR.(pressure_text{1}) = []; +pressure_optimize_text =[]; +pressure_optimize =[]; +for m = 1 : length(pressure) + for k=1:length(classnumb) + + if (abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(4))) > 1 + classnumb_optimize.HTR.(pressure_text{m}) = [classnumb_optimize.HTR.(pressure_text{m}) classnumb(k)]; + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end +for m = 1 : length(pressure_optimize) +classnumb=classnumb_optimize.HTR.(pressure_text{m}); +end +pressure = pressure_optimize; + +clearvars -except classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity +range = 1:10; +% optimization_10; +optimization_7_repro_multiple_2; +%% +% final result for HTR, and LockDouwn +clearvars -except final_result pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity pressure_text + +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end + +classnumb_optimize.NTC.(pressure_text{1})=[]; +pressure_optimize_text =[]; +pressure_optimize =[]; +Entire = classnumb_optimize.entire.(pressure_text{1}); +HTR = classnumb_optimize.HTR.(pressure_text{1}); + +classnumb_optimize.NTC.(pressure_text{1})... + = setxor(Entire,HTR); +numbOfClass_NTC = length(classnumb_optimize.NTC.(pressure_text{1})); + +class_numb_text_NTC = {}; +for k=1:numbOfClass_NTC +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text_NTC=[class_numb_text_NTC ['class',num2str(classnumb_optimize.NTC.(pressure_text{1})(k))]]; +end + +classnumbOfNTC = []; +for m = 1 : length(pressure) + for k=1:numbOfClass_NTC + + if (abs(sensitivity.(pressure_text{m}).(class_numb_text_NTC{k}).Sig(2)) > 1) + classnumbOfNTC = [classnumbOfNTC classnumb_optimize.NTC.(pressure_text{1})(k)]; + end + end + pressure_optimize_text = [pressure_optimize pressure_text{m}]; + pressure_optimize = [pressure_optimize pressure(m)]; +end +classnumb_optimize.NTC.(pressure_text{m}) = classnumbOfNTC; + +for m = 1 : length(pressure_optimize) +classnumb=classnumb_optimize.NTC.(pressure_text{m}); +end +pressure = pressure_optimize; + + +clearvars -except final_result classnumb pressure mechanism fuel_name date fuel_sim equi classnumb_optimize sensitivity +range = 12:20; + +optimization_7_repro_multiple_2; + +%modification after optimize + +%load + +% load -> output rightaway bash \ No newline at end of file diff --git a/sensitivity_analysis_3.asv b/sensitivity_analysis_3.asv new file mode 100644 index 0000000..9c9f833 --- /dev/null +++ b/sensitivity_analysis_3.asv @@ -0,0 +1,192 @@ + +%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? + +% pressure=[20 40]; +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +% classnumb=[1 2 3 4 5 6 7 8 9]; +numbOfClass=length(classnumb) ; +for k=1:numbOfClass + classnumb_text{k}=['class',num2str(classnumb(k))]; +end + +exp_markers={'ro' 'g*' 'g^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + + +%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % i=1 ; +% m=2 ; % pressure +% % j=1 ; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% sensitivity analysis +% mechanism={'Ra_Reitz'}; +% fuel_sim={'modify_sensitivity'}; +% fuel_name={'n_heptane'} +% equi = 1; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= 3; +% date = {'01_30_2017'}; + +for m = 1 : numbOfPressure + for k = 1 :numbOfClass + for j = 1: 25 + % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(j)]; + location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... + 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification{j}.data=time_struct_modification.table.data(:,10); +% classnumb_text{k}.(time_modification(:,j))=time_struct_modification.table.data(:,10); + +% time_modification =ones(3,25); +% class.(time_modification(1:3,j))=time_struct_modification.table.data(:,10); +% field = classnumb_text{k}; +% value(:,j) = time_struct_modification.table.data(:,10); +% sensitivity=struct(field,value); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + + end + + + temp=700:25:1300; +% Temp.pressure_text{1} + h =25; + tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base + tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 + tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 + d_log_tk1=diff(log10(tk1)); + d_log_tk2=diff(log10(tk2)); + dh = log(h); + k1 = 2; + k2 = 0.5; + + [peaks,locs] = findpeaks(tbase/1000); +% yvalue=tbase/1000; + locsValue = temp(locs); + [peaks2,locs2] = findpeaks(-tbase/1000); +% yvalue=tbase/1000; + locsValue2 = temp(locs2); + + p_tempPoints_ig =[1, locs2, locs, length(temp)]; + temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; + +%translational sensitivity +%change the normalize contant log10?e.x. log10^3 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); + for i = 1 : length(p_tempPoints_ig) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... + = 100*(log10(tk1(p_tempPoints_ig(i))) - log10(tk2(p_tempPoints_ig(i))))/(log10(tbase(i))*log10(k1/k2)); % translational shift + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig)); + + + p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point + + temp_p_tempPoints_gr=[temp(locs2),temp(locs)]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)); + %rotational sensitivity + for i = 1 : length(p_tempPoints_gr) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... + = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr)); + end + +end +%% plotting +% figure; +% figure('position',[20 50 580 480]); +% hFig = figure(1); +% set(hFig, 'Position', [20 50 580 3500]) + +% for m = 1 : numbOfPressure +% for k = 1 : numbOfClass +% h=figure('position',[20 50 1200 480]); +% subplot(1,2,1); +% set(gca,'Fontsize',13) +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); +% % legend('baseline','k=2''k=1') +% +% % legend_text{1}='baseline'; +% % legend_text{2}='k=2'; +% % legend_text{3}='k=1'; +% % +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% % 'k--','markersize',marker_size) +% % legend_text{end+1}=[mechanism{i},'_','before']; +% % +% % +% +% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... +% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... +% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... +% ,'gp','markersize',12); +% hold on +% semilogy(locsValue,peaks,'gp','markersize',12); +% hold on +% semilogy(locsValue2,-peaks2,'gp','markersize',12); +% +% legend('baseline','k=2','k=1','extreme points') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% +% +% +% +% subplot(1,2,2); +% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +% ylim([-25 25]) +% hold on +% % figure +% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); +% +% ylim([-30 25]) +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% legend('ignition delay sensitivity','gradient sensitivity') +% +% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... +% 'String',{'n-heptane',... +% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% +% % legend(legend_text,'location','SouthEast','interpreter','none') +% % legend('boxoff') +% % xlabel('1000/T (1/K)') +% % ylabel('Ignition Delay Time (ms)') +% % % axis([0.7 1.6 20 40000]) +% % % clear legend_text +% % annotation(h,'textbox',[0.413 0.38 0.279 0.05],... +% % 'String',{'n-heptane',... +% % '/Air',classnumb_text{k}, '\phi=1'},... +% % 'FontSize',13,... +% % 'FontName','Arial',... +% % 'FitBoxToText','off',... +% % 'LineStyle','none'); +% % annotation(h,'textbox',[0.25 0.8 0.279 0.05],... +% % 'String',{' 20 atm'},... +% % 'FontSize',13,... +% % 'FontName','Arial',... +% % 'FitBoxToText','off',... +% % 'LineStyle','none'); +% +% end +% end \ No newline at end of file diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 8aeb25d..2906011 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -1,7 +1,5 @@ %1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? -% mechanism={'MFC' }; -% fuel_sim={'base','v1','v2','v3'}; % pressure=[20 40]; numbOfPressure=length(pressure) ; @@ -19,8 +17,6 @@ marker_size=8; line_width=2; -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') %%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % i=1 ; @@ -40,20 +36,10 @@ for m = 1 : numbOfPressure for k = 1 :numbOfClass for j = 1: 25 - % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(j)]; location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification{j}.data=time_struct_modification.table.data(:,10); -% classnumb_text{k}.(time_modification(:,j))=time_struct_modification.table.data(:,10); - -% time_modification =ones(3,25); -% class.(time_modification(1:3,j))=time_struct_modification.table.data(:,10); -% field = classnumb_text{k}; -% value(:,j) = time_struct_modification.table.data(:,10); -% sensitivity=struct(field,value); - sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); end From de9af67ec84ebe9cb5d1d27fa87a6ecc6ab4607f Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 6 Mar 2017 16:50:13 -0500 Subject: [PATCH 23/47] afteroptimize included --- Ra_Reitz_plot_2.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 8932ecd..e432426 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -167,8 +167,8 @@ hold on - load('simulation_result_beforeoptimize_20atm_phi_1.mat') - fuel_sim={'beforeoptimize'}; + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; for j=1:length(fuel_sim) semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... From 741605e0e8e368197ff1c2515f8ce9ba08700ceb Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 7 Mar 2017 15:18:38 -0500 Subject: [PATCH 24/47] commit 3_6 merging all the branches --- find_rate_weighting.m | 12 +- modification_afteroptimize_github.m | 220 ++++++++++++++++++++++++++++ optimization_7_repro_multiple_2.asv | 66 ++++----- optimization_7_repro_multiple_2.m | 62 +++----- 4 files changed, 287 insertions(+), 73 deletions(-) create mode 100644 modification_afteroptimize_github.m diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 457ea9f..ae31c68 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -1,16 +1,22 @@ -function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data) +function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data,numbOftarget1,numbOftarget2) differTotal= 0; timeTotal =zeros(length(Temp),1) ; time = zeros(length(Temp),numbOfClass); time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) + if j<=numbOftarget1 + W = 1/numbOftarget1; + else + W = 1/numbOftarget2; + end + for i = 1: numbOfClass A=X(2*i-1); E=X(2*i); % W=X(3*i); - W =1; + % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; @@ -36,3 +42,5 @@ end + + diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m new file mode 100644 index 0000000..a8068b7 --- /dev/null +++ b/modification_afteroptimize_github.m @@ -0,0 +1,220 @@ + +clear all; +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; +% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; +filename = 'MFC_base.inp'; +delimiter = ' '; + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + +rawCellColumns2=rawCellColumns; + +ModStart = 0; + +mechanism='MFC'; +fuel_name='n_dodecane'; +date = '03_06_2017'; + +class_numb=[15 22 26 27 28]; +numbOfClass = length(class_numb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; +end +pressure=[20 40]; +equi=1; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +load final_result.mat + + +for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if strmatch('reactions',rawCellColumns{i,j})==1; + ModStart = 1; + end + + + for k = 1: numbOfClass +% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; + + rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A + rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E + + + end + end + end +end + +%% +% datename = '01_19_2017' +% save_filename=[mechanism,'_','output','_',datename]; + + +save_filename='output'; + +for k = 1 :length(pressure) +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; +% location=[currentloc,'\',mechanism,'\',directory]; +cd(directory) + +mkdir(save_filename); +cd(save_filename); + +class_numb_text = []; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; +end +file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; + +fileID = fopen(file_name,'w'); +output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + + + + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + +fclose(fileID); + +end +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index 42c20a1..69bf31d 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -1,7 +1,7 @@ -clear all +% clear all % close all -classnumb=[11 15 21 22 23 24 26 27 28]; +% classnumb=[11 15 21 22 23 24 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -11,17 +11,17 @@ fuel_sim={'modify'}; %% read modification ignition delay time % mechanism={'MFC'}; -mechanism={'MFC'}; -date = {'03_06_2017'}; -fuel_name = {'n_dodecane'}; -% fuel_name = {'n_heptane'}; -equi=1; +% mechanism={'MFC'}; +% date = {'03_06_2017'}; +% fuel_name = {'n_dodecane'}; +% % fuel_name = {'n_heptane'}; +% equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; -pressure=[20 40]; +% pressure=[20 40]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -121,7 +121,7 @@ num_cases_modification= size(A,1); m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; % for j = range -for j = 1: numbOftarget1 +for j = 1: numbOftarget.pressure_text{m} for k = 1: numbOfClass % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; @@ -134,39 +134,39 @@ end for k = 1: numbOfClass % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); end -% m =2 ; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% % for j = 1: length(range) -% for j = 1: numbOftarget2 -% for k = 1: numbOfClass -% % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; -% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; -% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% % time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% % temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); -% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); -% end -% +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% for j = 1: length(range) +for j = 1: numbOftarget.pressure_text{m} + for k = 1: numbOfClass +% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); + time_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,6); + end + +end + + +% for k = 1: numbOfClass +% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); +% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); % end -% -% -% % for k = 1: numbOfClass -% % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); -% % end %% coefficient -for j = 1 : size(Temp.pressure_text{1},1) +for j = 1 : size(Temp,1) % for k = 1 : 1 % for j = 1 : 1 - Temp_current = Temp.pressure_text{1}(j); + Temp_current = Temp(j); for k = 1: numbOfClass diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index ea8702f..bc51c10 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -20,7 +20,6 @@ currentloc = 'C:\Users\unghee\Dropbox\post_process'; - % pressure=[20 40]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -112,18 +111,16 @@ A = rateParam.(class_numb_text{1})(:,1); E = rateParam.(class_numb_text{1})(:,2); %% read modification ignition delay time -% mechanism={'Ra_Reitz'}; + currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= size(A,1); -% date = {'01_30_2017'}; -% fuel_name = {'n_heptane'}; m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = range -for j = 1: numbOftarget.pressure_text{m} + +for j = 1: numbOftarget1 for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); @@ -132,40 +129,32 @@ end for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); + + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end -% m =2 ; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% % for j = 1: length(range) -% for j = 1: numbOftarget.pressure_text{m} -% for k = 1: numbOfClass -% % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; -% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; -% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% % time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% % temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); -% time_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,6); -% end -% -% end -% -% -% % for k = 1: numbOfClass -% % time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% % temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); -% % end +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; + +for j = 1: numbOftarget2 + for k = 1: numbOfClass + + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); + end + +end + + %% coefficient for j = 1 : size(Temp,1) -% for k = 1 : 1 -% for j = 1 : 1 + Temp_current = Temp(j); @@ -174,7 +163,6 @@ A = rateParam.(class_numb_text{k})(:,1); E = rateParam.(class_numb_text{k})(:,2); M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; -% totalM = [totalM M]; d = log(time_current); coefs_inv = lsqlin(M,d); coefs_element = coefs_inv'; @@ -202,12 +190,10 @@ %% OPTIMIZER % Target Temp value -% te(:,1) = Target_data(:,3); -% te(:,1) = Target_data; + numberOftempPoints = size(Target_data,1); %% objective function -% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); LB =[]; UB =[]; From f2fa8a9852e57d1f5d6f05065956ffda40559bf1 Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 7 Mar 2017 15:24:21 -0500 Subject: [PATCH 25/47] optimization driver update --- optimization_driver_2.m | 49 ++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/optimization_driver_2.m b/optimization_driver_2.m index d3a6528..510a7be 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -2,21 +2,20 @@ mechanism={'MFC'}; fuel_name={'n_dodecane'}; date = {'03_06_2017'}; -fuel_sim={'modify_class2_class4_class6_moderate'}; +fuel_sim={'modify_sensitivity'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; -pressure=[20]; +pressure=[40]; %% sensitivity +addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); sensitivity_analysis_3; clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi - m =1; disp('looking at sensitivity at one pressure condition') class_to_optimize.(pressure_text{m}) = []; for k=1:length(classnumb) - -% if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; @@ -31,33 +30,23 @@ real_fuel_ID; pure_component_ID; Target_fuel1 = Vasu_dode_20atm; -Target_data.pressure_text{1}=Target_fuel1(:,5); -Temp.pressure_text{1} = Target_fuel1(:,2); -numbOftarget.pressure_text{1} =length(Target_data.pressure_text{1}); -Temp = [Temp.pressure_text{1}]; -Target_data = [Temp.pressure_text{1}]; +Target_data1=Target_fuel1(:,5); +numbOftarget1=length(Target_data1); +Temp1=Target_fuel1(:,2); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2=length(Target_data2); + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; %% Optimization -clearvars -except classnumb Temp numberOftarget Target_data -optimization_10; - - -%modification after optimize -% clearvars -except sensitivity classnumb pressure classnumb_text -% class_to_optimize = []; -% for k=1:length(classnumb) -% -% if (sensitivity.(pressure_text{k}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) -% pressure_text{k}.class_to_optimize = [class_to_optimize k]; -% end -% end -% -% -% classnumb=pressure_text{k}.class_to_optimize; -% classnumb = [4,6]; -%load - -% load -> output rightaway bash \ No newline at end of file +clearvars -except classnumb Temp numberOftarget Target_data sensitivity pressure fuel_name +optimization_7_repro_multiple_2 + + From 992e498a05fb9654bde483bde138ae5b0f363d4d Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 7 Mar 2017 15:26:39 -0500 Subject: [PATCH 26/47] sensitivity_analysis_update --- sensitivity_analysis_3.m | 150 +++++++++++++++------------------------ 1 file changed, 59 insertions(+), 91 deletions(-) diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 2906011..7d2e2bc 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -31,10 +31,11 @@ % equi = 1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= 3; -% date = {'01_30_2017'}; + for m = 1 : numbOfPressure - for k = 1 :numbOfClass + + for k = 1 :1 for j = 1: 25 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; @@ -79,10 +80,10 @@ p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point - temp_p_tempPoints_gr=[temp(locs2),temp(locs)]; - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)); + temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); %rotational sensitivity - for i = 1 : length(p_tempPoints_gr) + for i = 1 : length(p_tempPoints_gr)-1 sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); end @@ -93,89 +94,56 @@ end %% plotting -% figure; -% figure('position',[20 50 580 480]); -% hFig = figure(1); -% set(hFig, 'Position', [20 50 580 3500]) - -% for m = 1 : numbOfPressure -% for k = 1 : numbOfClass -% h=figure('position',[20 50 1200 480]); -% subplot(1,2,1); -% set(gca,'Fontsize',13) -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); -% hold on -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); -% hold on -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); -% % legend('baseline','k=2''k=1') -% -% % legend_text{1}='baseline'; -% % legend_text{2}='k=2'; -% % legend_text{3}='k=1'; -% % -% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% % 'k--','markersize',marker_size) -% % legend_text{end+1}=[mechanism{i},'_','before']; -% % -% % -% -% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... -% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... -% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... -% ,'gp','markersize',12); -% hold on -% semilogy(locsValue,peaks,'gp','markersize',12); -% hold on -% semilogy(locsValue2,-peaks2,'gp','markersize',12); -% -% legend('baseline','k=2','k=1','extreme points') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (ms)') -% -% -% -% -% subplot(1,2,2); -% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); -% ylim([-25 25]) -% hold on -% % figure -% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); -% -% ylim([-30 25]) -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (ms)') -% legend('ignition delay sensitivity','gradient sensitivity') -% -% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... -% 'String',{'n-heptane',... -% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% -% % legend(legend_text,'location','SouthEast','interpreter','none') -% % legend('boxoff') -% % xlabel('1000/T (1/K)') -% % ylabel('Ignition Delay Time (ms)') -% % % axis([0.7 1.6 20 40000]) -% % % clear legend_text -% % annotation(h,'textbox',[0.413 0.38 0.279 0.05],... -% % 'String',{'n-heptane',... -% % '/Air',classnumb_text{k}, '\phi=1'},... -% % 'FontSize',13,... -% % 'FontName','Arial',... -% % 'FitBoxToText','off',... -% % 'LineStyle','none'); -% % annotation(h,'textbox',[0.25 0.8 0.279 0.05],... -% % 'String',{' 20 atm'},... -% % 'FontSize',13,... -% % 'FontName','Arial',... -% % 'FitBoxToText','off',... -% % 'LineStyle','none'); -% -% end -% end \ No newline at end of file + + +for m = 1 : numbOfPressure +for k = 1 : numbOfClass +h=figure('position',[20 50 1200 480]); +subplot(1,2,1); +set(gca,'Fontsize',13) +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); + + +semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... + [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... + ,'gp','markersize',12); +hold on +semilogy(locsValue,peaks,'gp','markersize',12); +hold on +semilogy(locsValue2,-peaks2,'gp','markersize',12); + +legend('baseline','k=2','k=1','extreme points') +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') + + + + +subplot(1,2,2); +plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +ylim([-25 25]) +hold on +% figure +plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); + +ylim([-30 25]) +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') +legend('ignition delay sensitivity','gradient sensitivity') + +annotation(h,'textbox',[0.213 0.38 0.279 0.05],... + 'String',{fuel_name{1},... + '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end +end \ No newline at end of file From 89053f8e7ea4708dba2b66d618ac742f12b016c2 Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 7 Mar 2017 16:32:35 -0500 Subject: [PATCH 27/47] why error is so big --- find_rate_weighting.m | 11 +-- optimization_7_repro_multiple_2.m | 127 +++++++++--------------------- 2 files changed, 44 insertions(+), 94 deletions(-) diff --git a/find_rate_weighting.m b/find_rate_weighting.m index ae31c68..15e52ce 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -5,11 +5,12 @@ time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) - if j<=numbOftarget1 - W = 1/numbOftarget1; - else - W = 1/numbOftarget2; - end +% if j<=numbOftarget1 +% W = 1/numbOftarget1; +% else +% W = 1/numbOftarget2; +% end + W=1; for i = 1: numbOfClass diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index bc51c10..42c3ab4 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,7 +1,7 @@ -% clear all -% close all +clear all +close all -% classnumb=[11 15 21 22 23 24 26 27 28]; +classnumb=[11 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -10,17 +10,17 @@ fuel_sim={'modify'}; %% read modification ignition delay time -% mechanism={'MFC'}; -% mechanism={'MFC'}; -% date = {'03_06_2017'}; -% fuel_name = {'n_dodecane'}; -% % fuel_name = {'n_heptane'}; -% equi=1; +mechanism={'MFC'}; +mechanism={'MFC'}; +date = {'03_06_2017'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; +equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; -% pressure=[20 40]; +pressure=[20]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -33,79 +33,28 @@ clear m; %% exp data -% addpath('C:\Users\unghee\Dropbox\post_process'); -% real_fuel_ID; -% pure_component_ID; -% Target_fuel1 = Vasu_dode_20atm; -% Target_data1=Target_fuel1(:,5); -% Temp1 = Target_fuel1(:,2); -% numbOftarget1 =length(Target_data1); -% % Temp1=flip(Temp1); -% % Target_data1=flip(Target_data1); -% +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); + + % Target_fuel2 = Shen_dode_40atm; % Target_data2=Target_fuel2(:,5); % Temp2 = Target_fuel2(:,2); -% -% % Temp2=flip(Temp2); -% % Target_data2=flip(Target_data2); -% % numbOftarget2 =length(Target_data2); -% -% + % Temp = [Temp1; Temp2]; % Target_data = [Target_data1; Target_data2]; -% % Temp = Temp1; -% % Target_data = Target_data1; -% -% cd ../../.. +numbOftarget2=0; +Temp = Temp1; +Target_data = Target_data1; -%% dummy target - -% num_cases_target=25; -% m = 1; % pressure 20atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data1=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% range = 1:25; -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); -% Temp1 = Temp1(range); -% Target_data1 = Target_data1(range); -% -% cd ../../.. -% -% num_cases_target=25; -% m = 2; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data2=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% % range = 1:25; -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -% Temp2 = Temp2(range); -% Target_data2 = Target_data2(range); -% -% cd ../../.. -% Temp = [Temp1; Temp2]; -% Target_data = [Target_data1 Target_data2]; +cd ../../.. A = rateParam.(class_numb_text{1})(:,1); @@ -134,19 +83,19 @@ temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; - -for j = 1: numbOftarget2 - for k = 1: numbOfClass - - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); - end - -end +% m =2 ; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% +% for j = 1: numbOftarget2 +% for k = 1: numbOfClass +% +% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; +% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); +% end +% +% end @@ -194,7 +143,7 @@ numberOftempPoints = size(Target_data,1); %% objective function -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data,numbOftarget1,numbOftarget2); LB =[]; UB =[]; % class2 From 3cf634c9ad0e7acd9b6f76744bd9636dbbe7fc64 Mon Sep 17 00:00:00 2001 From: JordLee Date: Tue, 7 Mar 2017 17:49:38 -0500 Subject: [PATCH 28/47] kinda worked?.. fine_class_onepressure --- Ra_Reitz_plot_2.asv | 102 +++++++++++++++++++--------- Ra_Reitz_plot_2.m | 70 +++++++++---------- find_rate_weighting.m | 4 +- modification_afteroptimize_github.m | 2 +- optimization_7_repro_multiple_2.m | 2 +- 5 files changed, 110 insertions(+), 70 deletions(-) diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv index ab36255..1c37132 100644 --- a/Ra_Reitz_plot_2.asv +++ b/Ra_Reitz_plot_2.asv @@ -4,7 +4,7 @@ clear all mechanism={'MFC' }; % fuel_sim={'base','v1','v2','v3'}; -pressure=[20 40]; +pressure=[20]; for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; end @@ -123,6 +123,10 @@ i=1; %mechanism % 'LineStyle','none'); %% 40atm condition num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end for k = 1: length(pressure) h3=figure('position',[20 50 580 480]); @@ -152,34 +156,48 @@ legend_text{3}=['MFC ',pressure_text{k},', after optimize']; load('simulation_result_beforeoptimize_20atm_phi_1.mat') fuel_sim={'beforeoptimize'}; - - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end hold on + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize'}; + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'r*','markersize',marker_size) -% end + hold on + + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; -% hold on + + semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... + 'b--','markersize',marker_size) + + + + + + +hold on % % semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) if strcmp(pressure_text{k},'P20atm') @@ -187,23 +205,45 @@ legend_text{3}=['MFC ',pressure_text{k},', after optimize']; else semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) end +%% upper bound & lowerbond +% hold on +% +% +% load('simulation_result_modify_20atm_phi_1.mat') +% fuel_sim={'modify'}; +% +% +% % for j=1:length(fuel_sim) +% % for q= 1: num_cases(k) +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% % 'bo','markersize',marker_size); +% % end +% % end +% % hold on; +% +% x=[]; y=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); +% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); +% +% +% end +% end +% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); +% x=[]; y=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); +% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); +% +% +% end +% end +% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); - hold on - - - load('simulation_result_modify_20atm_phi_1.mat') - fuel_sim={'modify'}; - - - for j=1:length(fuel_sim) - for q= 1: num_causes - semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).q.table.data(:,10),... - 'bo','markersize',marker_size); - end - - end - +%% legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') xlabel('1000/T (1/K)') diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index e432426..1c37132 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -4,7 +4,7 @@ mechanism={'MFC' }; % fuel_sim={'base','v1','v2','v3'}; -pressure=[20 40]; +pressure=[20]; for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; end @@ -205,45 +205,45 @@ else semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) end - - hold on - - - load('simulation_result_modify_20atm_phi_1.mat') - fuel_sim={'modify'}; - - +%% upper bound & lowerbond +% hold on +% +% +% load('simulation_result_modify_20atm_phi_1.mat') +% fuel_sim={'modify'}; +% +% +% % for j=1:length(fuel_sim) +% % for q= 1: num_cases(k) +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% % 'bo','markersize',marker_size); +% % end +% % end +% % hold on; +% +% x=[]; y=[]; % for j=1:length(fuel_sim) % for q= 1: num_cases(k) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... -% 'bo','markersize',marker_size); +% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); +% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); +% +% % end % end -% hold on; - %upper bound & lowerbond - x=[]; y=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); - y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); - - - end - end - semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); - x=[]; y=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); - y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); - - - end - end - semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); +% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); +% x=[]; y=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); +% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); +% +% +% end +% end +% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); - +%% legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') xlabel('1000/T (1/K)') diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 15e52ce..98f4faa 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -10,14 +10,14 @@ % else % W = 1/numbOftarget2; % end - W=1; + for i = 1: numbOfClass A=X(2*i-1); E=X(2*i); % W=X(3*i); - + W=1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index a8068b7..ef4a08e 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -72,7 +72,7 @@ % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; end -pressure=[20 40]; +pressure=[20]; equi=1; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 42c3ab4..c120af3 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,7 +1,7 @@ clear all close all -classnumb=[11 22 26 27 28]; +classnumb=[15 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass From cf026297c133863508e3883e59bfd88f0fd46187 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 8 Mar 2017 11:21:00 -0500 Subject: [PATCH 29/47] sesnsitivity for modify, merged different version --- MFC_load_range.asv | 52 +++++++++ MFC_load_range.m | 8 +- Ra_Reitz_plot_2.m | 83 ++++++++------ modification_afteroptimize_github.m | 2 +- optimization_7_repro_multiple_2.m | 2 +- optimization_driver_2.asv | 58 +++++----- optimization_driver_2.m | 43 ++++---- sensitivity_analysis_3.asv | 164 +++++++++++----------------- sensitivity_analysis_3.m | 4 +- sensitivity_analysis_3_modify.m | 154 ++++++++++++++++++++++++++ 10 files changed, 378 insertions(+), 192 deletions(-) create mode 100644 MFC_load_range.asv create mode 100644 sensitivity_analysis_3_modify.m diff --git a/MFC_load_range.asv b/MFC_load_range.asv new file mode 100644 index 0000000..27e07a7 --- /dev/null +++ b/MFC_load_range.asv @@ -0,0 +1,52 @@ +clear all +close all + +%% +mechanism={'MFC'}; +% fuel_sim={'base','v1','v2','v3' }; +fuel_sim={'modify'}; +fuel_name={'n_dodecane'}; +date = {'03_06_2017_'}; +equi =1; +% pressure=[20 40 ]; +pressure = [20 40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end + +classnumb=[15 26 27]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end +%% + +for i=1:length(mechanism) + for j=1:length(fuel_sim) + for k = 1: length(classnumb) +% phi=1 simulation results + for m=1:length(pressure) + for q=1:num_cases(m) + location=['C:\Users\unghee\Dropbox\post_process','\',mechanism{i},'\',fuel_name{1},'_',num2str(pressure(m))... + ,'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{j},'\',class_numb_text{k},'\',num2str(q)]; + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{m}).(num_cases_text{q})=read_ignition_delay(location,7); + end + end + + end + end +end + + +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(1))... + ,'atm','_','phi',num2str(equi),'_',date{1}]; +cd(directory); +cd(fuel_sim{1}); +filename = ['simulation_result','_',fuel_sim{1},'_',num2str(pressure(1)),'atm','_','phi','_',num2str(equi),'.mat']; +save(filename,'sim') diff --git a/MFC_load_range.m b/MFC_load_range.m index 52123f1..9239f27 100644 --- a/MFC_load_range.m +++ b/MFC_load_range.m @@ -6,15 +6,15 @@ % fuel_sim={'base','v1','v2','v3' }; fuel_sim={'modify'}; fuel_name={'n_dodecane'}; -date = {'03_05_2017'}; +date = {'03_06_2017'}; equi =1; % pressure=[20 40 ]; -pressure = [20 40]; +pressure = [20]; for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; end -classnumb=[15 26 27]; +classnumb=[15 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -35,7 +35,7 @@ for q=1:num_cases(m) location=['C:\Users\unghee\Dropbox\post_process','\',mechanism{i},'\',fuel_name{1},'_',num2str(pressure(m))... ,'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{j},'\',class_numb_text{k},'\',num2str(q)]; - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{m}).(num_cases_text{q})=read_ignition_delay(location,7); + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{m}).(class_numb_text{k}).(num_cases_text{q})=read_ignition_delay(location,7); end end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 1c37132..3b6aa72 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -127,6 +127,12 @@ for k=1:num_cases(1) num_cases_text=[num_cases_text ['numcases',num2str(k)]]; end +classnumb=[15 22 26 27 28]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end for k = 1: length(pressure) h3=figure('position',[20 50 580 480]); @@ -190,7 +196,7 @@ semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... - 'b--','markersize',marker_size) + 'b','markersize',marker_size) @@ -206,43 +212,50 @@ semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) end %% upper bound & lowerbond -% hold on -% -% -% load('simulation_result_modify_20atm_phi_1.mat') -% fuel_sim={'modify'}; -% -% -% % for j=1:length(fuel_sim) -% % for q= 1: num_cases(k) -% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... -% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... -% % 'bo','markersize',marker_size); -% % end -% % end -% % hold on; -% -% x=[]; y=[]; -% for j=1:length(fuel_sim) -% for q= 1: num_cases(k) -% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); -% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); -% -% -% end -% end -% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); -% x=[]; y=[]; + hold on + + + load('simulation_result_modify_20atm_phi_1.mat') + fuel_sim={'modify'}; + + % for j=1:length(fuel_sim) % for q= 1: num_cases(k) -% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); -% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); -% -% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% 'bo','markersize',marker_size); % end % end -% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); - +% hold on; + + x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; + for j=1:length(fuel_sim) + for q= 1: num_cases(k) + for m = 1: length(classnumb) + x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); + y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); + end + + end + end + for m = 1: length(classnumb) +% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); + hold on; + end + x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; + for j=1:length(fuel_sim) + for q= 1: num_cases(k) + for m = 1: length(classnumb) + x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); + y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); + end + + end + end + for m = 1: length(classnumb) +% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); + hold on; + end %% legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') @@ -252,7 +265,7 @@ % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... 'String',{'n-dodecane',... - '/Air','one class', '\phi=1'},... + '/Air','class 2, 6, 7, 8, 9', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index ef4a08e..9434c4c 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -63,7 +63,7 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_06_2017'; +date = '03_06_2017_increased'; class_numb=[15 22 26 27 28]; numbOfClass = length(class_numb); diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index c120af3..1dfe455 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -12,7 +12,7 @@ %% read modification ignition delay time mechanism={'MFC'}; mechanism={'MFC'}; -date = {'03_06_2017'}; +date = {'03_06_2017_increased'}; fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; equi=1; diff --git a/optimization_driver_2.asv b/optimization_driver_2.asv index 558cf55..1d1ddd1 100644 --- a/optimization_driver_2.asv +++ b/optimization_driver_2.asv @@ -1,50 +1,54 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_06_2017'}; +date = {'03_07_2017'}; +fuel_sim={'modify_sensitivity'}; equi = 1; -classnumb=[1 2 3 4 5 6 7 8 9]; - +classnumb=[11 15 21 22 23 24 26 27 28]; pressure=[20]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -%% +%% Target setting addpath('C:\Users\unghee\Dropbox\post_process'); real_fuel_ID; pure_component_ID; Target_fuel1 = Vasu_dode_20atm; -Target_data.pressure_text{1}=Target_fuel1(:,5); -Temp.pressure_text{1} = Target_fuel1(:,2); -numbOftarget.pressure_text{1} =length(Target_data.pressure_text{1}); -Temp = [Temp.pressure_text{1}]; -Target_data = [Temp.pressure_text{1}]; +Target_data1=Target_fuel1(:,5); +numbOftarget1=length(Target_data1); +Temp1=Target_fuel1(:,2); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2=length(Target_data2); +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; -%% +%% sensitivity +addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); sensitivity_analysis_3; +clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi -clearvars -except sensitivity classnumb pressure classnumb_text pressure_text -class_to_optimize = []; +m =1; +disp('looking at sensitivity at one pressure condition') +class_to_optimize.(pressure_text{m}) = []; for k=1:length(classnumb) - - if (sensitivity.(pressure_text{k}).(classnumb_text{k}).Sig_avg > 1) && (sensitivity.(classnumb_text{k}).Sgr_avg > 0.5) - pressure_text{k}.class_to_optimize = [class_to_optimize k]; - end + + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) + class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; + end end +classnumb = class_to_optimize.(pressure_text{m}) + + -classnumb=pressure_text{k}.class_to_optimize; -classnumb = [4,6]; -clearvars -except classnumb Temp numberOftarget Target_data -optimization_10; +%% Optimization -%modification after optimize +clearvars -except classnumb Temp numberOftarget Target_data sensitivity pressure fuel_name +optimization_7_repro_multiple_2 -%load -% load -> output rightaway bash \ No newline at end of file diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 510a7be..56a817a 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,14 +1,33 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_06_2017'}; -fuel_sim={'modify_sensitivity'}; +date = {'03_07_2017'}; +fuel_sim={'modify'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; -pressure=[40]; +pressure=[20]; +%% Target setting +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; + +Target_data1=Target_fuel1(:,5); +numbOftarget1=length(Target_data1); +Temp1=Target_fuel1(:,2); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2=length(Target_data2); + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; + %% sensitivity addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); -sensitivity_analysis_3; +% sensitivity_analysis_3; +sensitivity_analysis_modify; clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi m =1; @@ -25,23 +44,7 @@ classnumb = class_to_optimize.(pressure_text{m}) -%% Target setting -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -numbOftarget1=length(Target_data1); -Temp1=Target_fuel1(:,2); - -Target_fuel2 = Shen_dode_40atm; -Target_data2=Target_fuel2(:,5); -Temp2 = Target_fuel2(:,2); -numbOftarget2=length(Target_data2); - -Temp = [Temp1; Temp2]; -Target_data = [Target_data1; Target_data2]; %% Optimization diff --git a/sensitivity_analysis_3.asv b/sensitivity_analysis_3.asv index 9c9f833..6f83c8e 100644 --- a/sensitivity_analysis_3.asv +++ b/sensitivity_analysis_3.asv @@ -31,31 +31,21 @@ line_width=2; % equi = 1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= 3; -% date = {'01_30_2017'}; + for m = 1 : numbOfPressure - for k = 1 :numbOfClass + + for k = 1 :1 for j = 1: 25 - % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - % location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(j)]; location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification{j}.data=time_struct_modification.table.data(:,10); -% classnumb_text{k}.(time_modification(:,j))=time_struct_modification.table.data(:,10); - -% time_modification =ones(3,25); -% class.(time_modification(1:3,j))=time_struct_modification.table.data(:,10); -% field = classnumb_text{k}; -% value(:,j) = time_struct_modification.table.data(:,10); -% sensitivity=struct(field,value); - sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); end temp=700:25:1300; -% Temp.pressure_text{1} h =25; tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 @@ -90,10 +80,10 @@ for m = 1 : numbOfPressure p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point - temp_p_tempPoints_gr=[temp(locs2),temp(locs)]; - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)); + temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); %rotational sensitivity - for i = 1 : length(p_tempPoints_gr) + for i = 1 : length(p_tempPoints_gr)-1 sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); end @@ -104,89 +94,57 @@ for m = 1 : numbOfPressure end %% plotting -% figure; -% figure('position',[20 50 580 480]); -% hFig = figure(1); -% set(hFig, 'Position', [20 50 580 3500]) - -% for m = 1 : numbOfPressure -% for k = 1 : numbOfClass -% h=figure('position',[20 50 1200 480]); -% subplot(1,2,1); -% set(gca,'Fontsize',13) -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); -% hold on -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); -% hold on -% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); -% % legend('baseline','k=2''k=1') -% -% % legend_text{1}='baseline'; -% % legend_text{2}='k=2'; -% % legend_text{3}='k=1'; -% % -% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% % 'k--','markersize',marker_size) -% % legend_text{end+1}=[mechanism{i},'_','before']; -% % -% % -% -% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... -% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... -% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... -% ,'gp','markersize',12); -% hold on -% semilogy(locsValue,peaks,'gp','markersize',12); -% hold on -% semilogy(locsValue2,-peaks2,'gp','markersize',12); -% -% legend('baseline','k=2','k=1','extreme points') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (ms)') -% -% -% -% -% subplot(1,2,2); -% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); -% ylim([-25 25]) -% hold on -% % figure -% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); -% -% ylim([-30 25]) -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (ms)') -% legend('ignition delay sensitivity','gradient sensitivity') -% -% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... -% 'String',{'n-heptane',... -% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% -% % legend(legend_text,'location','SouthEast','interpreter','none') -% % legend('boxoff') -% % xlabel('1000/T (1/K)') -% % ylabel('Ignition Delay Time (ms)') -% % % axis([0.7 1.6 20 40000]) -% % % clear legend_text -% % annotation(h,'textbox',[0.413 0.38 0.279 0.05],... -% % 'String',{'n-heptane',... -% % '/Air',classnumb_text{k}, '\phi=1'},... -% % 'FontSize',13,... -% % 'FontName','Arial',... -% % 'FitBoxToText','off',... -% % 'LineStyle','none'); -% % annotation(h,'textbox',[0.25 0.8 0.279 0.05],... -% % 'String',{' 20 atm'},... -% % 'FontSize',13,... -% % 'FontName','Arial',... -% % 'FitBoxToText','off',... -% % 'LineStyle','none'); -% -% end -% end \ No newline at end of file + +save('se.mat','final_result') + +for m = 1 : numbOfPressure +for k = 1 : numbOfClass +h=figure('position',[20 50 1200 480]); +subplot(1,2,1); +set(gca,'Fontsize',13) +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); + + +semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... + [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... + ,'gp','markersize',12); +hold on +semilogy(locsValue,peaks,'gp','markersize',12); +hold on +semilogy(locsValue2,-peaks2,'gp','markersize',12); + +legend('baseline','k=2','k=1','extreme points') +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') + + + + +subplot(1,2,2); +plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +ylim([-25 25]) +hold on +% figure +plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); + +ylim([-30 25]) +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') +legend('ignition delay sensitivity','gradient sensitivity') + +annotation(h,'textbox',[0.213 0.38 0.279 0.05],... + 'String',{fuel_name{1},... + '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end +end \ No newline at end of file diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 7d2e2bc..3a4c6f2 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -93,9 +93,11 @@ end end -%% plotting +save('sensitivity.mat','sensitivity') + +%% plotting for m = 1 : numbOfPressure for k = 1 : numbOfClass h=figure('position',[20 50 1200 480]); diff --git a/sensitivity_analysis_3_modify.m b/sensitivity_analysis_3_modify.m new file mode 100644 index 0000000..c5b3577 --- /dev/null +++ b/sensitivity_analysis_3_modify.m @@ -0,0 +1,154 @@ + +%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? + +% pressure=[20 40]; +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +% classnumb=[1 2 3 4 5 6 7 8 9]; +numbOfClass=length(classnumb) ; +for k=1:numbOfClass + classnumb_text{k}=['class',num2str(classnumb(k))]; +end + +exp_markers={'ro' 'g*' 'g^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + + +%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % i=1 ; +% m=2 ; % pressure +% % j=1 ; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% sensitivity analysis +% mechanism={'Ra_Reitz'}; +% fuel_sim={'modify_sensitivity'}; +% fuel_name={'n_heptane'} +% equi = 1; +currentloc = 'C:\Users\unghee\Dropbox\post_process'; +num_cases_modification= 3; + + +for m = 1 : numbOfPressure + + for k = 1 :1 + for j = 1: 25 + location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... + 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + + end + + +% temp=700:25:1300; +% h =25; + temp=Temp1; + h = numbOftarget1; + + tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base + tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 + tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 + d_log_tk1=diff(log10(tk1)); + d_log_tk2=diff(log10(tk2)); + dh = log(h); + k1 = 2; + k2 = 0.5; + + [peaks,locs] = findpeaks(tbase/1000); +% yvalue=tbase/1000; + locsValue = temp(locs); + [peaks2,locs2] = findpeaks(-tbase/1000); +% yvalue=tbase/1000; + locsValue2 = temp(locs2); + + p_tempPoints_ig =[1, locs2, locs, length(temp)]; + temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; + +%translational sensitivity +%change the normalize contant log10?e.x. log10^3 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); + for i = 1 : length(p_tempPoints_ig) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... + = 100*(log10(tk1(p_tempPoints_ig(i))) - log10(tk2(p_tempPoints_ig(i))))/(log10(tbase(i))*log10(k1/k2)); % translational shift + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig)); + + + p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point + + temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); + %rotational sensitivity + for i = 1 : length(p_tempPoints_gr)-1 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... + = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr)); + end + +end + + +save('sensitivity.mat','sensitivity') + +%% plotting +for m = 1 : numbOfPressure +for k = 1 : numbOfClass +h=figure('position',[20 50 1200 480]); +subplot(1,2,1); +set(gca,'Fontsize',13) +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +hold on +semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); + + +semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... + [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... + ,'gp','markersize',12); +hold on +semilogy(locsValue,peaks,'gp','markersize',12); +hold on +semilogy(locsValue2,-peaks2,'gp','markersize',12); + +legend('baseline','k=2','k=1','extreme points') +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') + + + + +subplot(1,2,2); +plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +ylim([-25 25]) +hold on +% figure +plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); + +ylim([-30 25]) +xlabel('1000/T (1/K)') +ylabel('Ignition Delay Time (ms)') +legend('ignition delay sensitivity','gradient sensitivity') + +annotation(h,'textbox',[0.213 0.38 0.279 0.05],... + 'String',{fuel_name{1},... + '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end +end \ No newline at end of file From 1a30c5f28ae84b269a7a49f32379cc85072e6947 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 8 Mar 2017 12:20:23 -0500 Subject: [PATCH 30/47] found k = 1: 1 class?? --- optimization_driver_2.m | 4 ++-- sensitivity_analysis_3_modify.m | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 56a817a..b49334a 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -27,8 +27,8 @@ %% sensitivity addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); % sensitivity_analysis_3; -sensitivity_analysis_modify; -clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi +sensitivity_analysis_3_modify; +% clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi m =1; disp('looking at sensitivity at one pressure condition') diff --git a/sensitivity_analysis_3_modify.m b/sensitivity_analysis_3_modify.m index c5b3577..c564996 100644 --- a/sensitivity_analysis_3_modify.m +++ b/sensitivity_analysis_3_modify.m @@ -36,7 +36,7 @@ for m = 1 : numbOfPressure for k = 1 :1 - for j = 1: 25 + for j = 1: numbOftarget1 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); From 1dc11cfc6eb92fff9f2338d5265ec7916b12629d Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 9 Mar 2017 00:34:34 -0500 Subject: [PATCH 31/47] commit 3_8_night --- Ra_Reitz_plot_2.m | 2 +- modification_afteroptimize_github.m | 6 +- optimization_7_repro_multiple_2.asv | 145 ++++++++-------------------- optimization_7_repro_multiple_2.m | 46 ++++----- optimization_driver_2.asv | 7 +- optimization_driver_2.m | 14 +-- sensitivity_analysis_3.asv | 12 ++- sensitivity_analysis_3.m | 9 +- sensitivity_analysis_3_modify.m | 2 +- 9 files changed, 92 insertions(+), 151 deletions(-) diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 3b6aa72..c0bb03e 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -265,7 +265,7 @@ % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... 'String',{'n-dodecane',... - '/Air','class 2, 6, 7, 8, 9', '\phi=1'},... + '/Air','class 26,27', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 9434c4c..499a689 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_base.inp'; +filename = 'MFC_n_dodecane_class26_class27_afteroptimize.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_06_2017_increased'; +date = '03_07_2017_2_iteration'; -class_numb=[15 22 26 27 28]; +class_numb=[24 26 27]; numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv index 69bf31d..b563057 100644 --- a/optimization_7_repro_multiple_2.asv +++ b/optimization_7_repro_multiple_2.asv @@ -1,7 +1,7 @@ % clear all % close all -% classnumb=[11 15 21 22 23 24 26 27 28]; +% classnumb=[15 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -12,7 +12,7 @@ fuel_sim={'modify'}; %% read modification ignition delay time % mechanism={'MFC'}; % mechanism={'MFC'}; -% date = {'03_06_2017'}; +% date = {'03_06_2017_increased'}; % fuel_name = {'n_dodecane'}; % % fuel_name = {'n_heptane'}; % equi=1; @@ -20,8 +20,7 @@ fuel_sim={'modify'}; currentloc = 'C:\Users\unghee\Dropbox\post_process'; - -% pressure=[20 40]; +% pressure=[20]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -34,96 +33,43 @@ load rateParam.mat; clear m; %% exp data -% addpath('C:\Users\unghee\Dropbox\post_process'); -% real_fuel_ID; -% pure_component_ID; -% Target_fuel1 = Vasu_dode_20atm; -% Target_data1=Target_fuel1(:,5); -% Temp1 = Target_fuel1(:,2); -% numbOftarget1 =length(Target_data1); -% % Temp1=flip(Temp1); -% % Target_data1=flip(Target_data1); -% +addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); + + % Target_fuel2 = Shen_dode_40atm; % Target_data2=Target_fuel2(:,5); % Temp2 = Target_fuel2(:,2); -% -% % Temp2=flip(Temp2); -% % Target_data2=flip(Target_data2); -% % numbOftarget2 =length(Target_data2); -% -% + % Temp = [Temp1; Temp2]; % Target_data = [Target_data1; Target_data2]; -% % Temp = Temp1; -% % Target_data = Target_data1; -% -% cd ../../.. +numbOftarget2=0; +Temp = Temp1; +Target_data = Target_data1; -%% dummy target - -% num_cases_target=25; -% m = 1; % pressure 20atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp1=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data1=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% range = 1:25; -% Temp1=flip(Temp1); -% Target_data1=flip(Target_data1); -% Temp1 = Temp1(range); -% Target_data1 = Target_data1(range); -% -% cd ../../.. -% -% num_cases_target=25; -% m = 2; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_target=[currentloc,'\',mechanism{1},'\',directory,'\','beforeoptimize']; -% cd(location_target) -% addpath(currentloc) -% time_struct_target=read_ignition_delay(location_target,num_cases_target); -% Temp2=time_struct_target.table.data(:,6)/1000; % do we have to include temp? -% -% -% Target_data2=time_struct_target.table.data(:,10); -% % range = 12:22; % works slightly well ?? -% % range = 12:25; % works slightly as well.. -% % range = 1:25; -% Temp2=flip(Temp2); -% Target_data2=flip(Target_data2); -% Temp2 = Temp2(range); -% Target_data2 = Target_data2(range); -% -% cd ../../.. -% Temp = [Temp1; Temp2]; -% Target_data = [Target_data1 Target_data2]; +cd ../../.. A = rateParam.(class_numb_text{1})(:,1); E = rateParam.(class_numb_text{1})(:,2); %% read modification ignition delay time -% mechanism={'Ra_Reitz'}; + currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= size(A,1); -% date = {'01_30_2017'}; -% fuel_name = {'n_heptane'}; m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = range -for j = 1: numbOftarget.pressure_text{m} + +for j = 1: numbOftarget1 for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; + location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); @@ -132,40 +78,32 @@ for j = 1: numbOftarget.pressure_text{m} end for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,range); - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget.pressure_text{m}); -end -m =2 ; % pressure 40atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% for j = 1: length(range) -for j = 1: numbOftarget.pressure_text{m} - for k = 1: numbOfClass -% location_modification=[currentloc,'\',mechanism{1},'_','modify','_',date{1},'\',num2str(Temp_un(j))]; - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,length(range)+j)=time_struct_modification.table.data(:,6); - time_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,numbOftarget.pressure_text{m-1}+j)=time_struct_modification.table.data(:,6); - end - + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end - -% for k = 1: numbOfClass -% time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,length(range)+range); -% temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,length(range)+range); +% m =2 ; % pressure 40atm +% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% +% for j = 1: numbOftarget2 +% for k = 1: numbOfClass +% +% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; +% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); +% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); +% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); +% end +% % end + + %% coefficient for j = 1 : size(Temp,1) -% for k = 1 : 1 -% for j = 1 : 1 + Temp_current = Temp(j); @@ -174,7 +112,6 @@ for j = 1 : size(Temp,1) A = rateParam.(class_numb_text{k})(:,1); E = rateParam.(class_numb_text{k})(:,2); M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; -% totalM = [totalM M]; d = log(time_current); coefs_inv = lsqlin(M,d); coefs_element = coefs_inv'; @@ -202,13 +139,11 @@ end %% OPTIMIZER % Target Temp value -% te(:,1) = Target_data(:,3); -% te(:,1) = Target_data; + numberOftempPoints = size(Target_data,1); %% objective function -% ObjectiveFunction = @(X) find_rate_3(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data); +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data,numbOftarget1,numbOftarget2); LB =[]; UB =[]; % class2 diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 1dfe455..5dd5efc 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,7 +1,7 @@ -clear all -close all +% clear all +% close all -classnumb=[15 22 26 27 28]; +% classnumb=[15 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -10,17 +10,17 @@ fuel_sim={'modify'}; %% read modification ignition delay time -mechanism={'MFC'}; -mechanism={'MFC'}; -date = {'03_06_2017_increased'}; -fuel_name = {'n_dodecane'}; -% fuel_name = {'n_heptane'}; -equi=1; +% mechanism={'MFC'}; +% mechanism={'MFC'}; +% date = {'03_06_2017_increased'}; +% fuel_name = {'n_dodecane'}; +% % fuel_name = {'n_heptane'}; +% equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; -pressure=[20]; +% pressure=[20]; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -33,13 +33,13 @@ clear m; %% exp data -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -Temp1 = Target_fuel1(:,2); -numbOftarget1 =length(Target_data1); +% addpath('C:\Users\unghee\Dropbox\post_process'); +% real_fuel_ID; +% pure_component_ID; +% Target_fuel1 = Vasu_dode_20atm; +% Target_data1=Target_fuel1(:,5); +% Temp1 = Target_fuel1(:,2); +% numbOftarget1 =length(Target_data1); % Target_fuel2 = Shen_dode_40atm; @@ -167,23 +167,23 @@ % ndodecane if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class21')(1,2)+2000 ]; end if strcmp(mechanism{1},'MFC') && ismember(22,classnumb) LB =[LB rateParam.('class22')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class22')(1,2)+2000 ]; end if strcmp(mechanism{1},'MFC') && ismember(23,classnumb) LB =[LB rateParam.('class23')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class23')(1,2)+2000 ]; end if strcmp(mechanism{1},'MFC') && ismember(24,classnumb) LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class24')(1,2)+2000 ]; end if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class11')(1,2)+2000 ]; end if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; @@ -199,7 +199,7 @@ end if strcmp(mechanism{1},'MFC') && ismember(28,classnumb) LB =[LB rateParam.('class28')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class28')(1,2)+2000 ]; end nvars=2*numbOfClass; diff --git a/optimization_driver_2.asv b/optimization_driver_2.asv index 1d1ddd1..b49334a 100644 --- a/optimization_driver_2.asv +++ b/optimization_driver_2.asv @@ -2,7 +2,7 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; date = {'03_07_2017'}; -fuel_sim={'modify_sensitivity'}; +fuel_sim={'modify'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; pressure=[20]; @@ -26,8 +26,9 @@ Target_data = [Target_data1; Target_data2]; %% sensitivity addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); -sensitivity_analysis_3; -clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi +% sensitivity_analysis_3; +sensitivity_analysis_3_modify; +% clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi m =1; disp('looking at sensitivity at one pressure condition') diff --git a/optimization_driver_2.m b/optimization_driver_2.m index b49334a..45b53f1 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,8 +1,8 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_07_2017'}; -fuel_sim={'modify'}; +date = {'03_06_2017'}; +fuel_sim={'modify_sensitivity'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; pressure=[20]; @@ -26,8 +26,8 @@ %% sensitivity addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); -% sensitivity_analysis_3; -sensitivity_analysis_3_modify; +sensitivity_analysis_3; +% sensitivity_analysis_3_modify; % clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi m =1; @@ -36,7 +36,7 @@ for k=1:length(classnumb) if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... - && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.4) class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; end end @@ -48,8 +48,8 @@ %% Optimization - -clearvars -except classnumb Temp numberOftarget Target_data sensitivity pressure fuel_name +% classnumb= [26 27] +clearvars -except classnumb Temp Temp1 Temp2 numberOftarget Target_data Target_data1 numbOftarget1 sensitivity pressure fuel_name equi fuel_name mechanism fuel_sim date optimization_7_repro_multiple_2 diff --git a/sensitivity_analysis_3.asv b/sensitivity_analysis_3.asv index 6f83c8e..1d1c829 100644 --- a/sensitivity_analysis_3.asv +++ b/sensitivity_analysis_3.asv @@ -35,7 +35,7 @@ num_cases_modification= 3; for m = 1 : numbOfPressure - for k = 1 :1 + for k = 1 :numbOfClass for j = 1: 25 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; @@ -93,10 +93,11 @@ for m = 1 : numbOfPressure end end -%% plotting -save('se.mat','final_result') +save('sensitivity.mat','sensitivity') + +%% plotting for m = 1 : numbOfPressure for k = 1 : numbOfClass h=figure('position',[20 50 1200 480]); @@ -144,7 +145,8 @@ annotation(h,'textbox',[0.213 0.38 0.279 0.05],... 'FontName','Arial',... 'FitBoxToText','off',... 'LineStyle','none'); - - +mkdir(sensitivity) +cd(sensitivity) +saveas(h,classnumb_text{k},'fig') end end \ No newline at end of file diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 3a4c6f2..852a028 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -35,7 +35,7 @@ for m = 1 : numbOfPressure - for k = 1 :1 + for k = 1 :numbOfClass for j = 1: 25 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; @@ -145,7 +145,10 @@ 'FontName','Arial',... 'FitBoxToText','off',... 'LineStyle','none'); - - +mkdir('sensitivity'); +cd('sensitivity'); +saveas(h,classnumb_text{k},'fig') +saveas(h,classnumb_text{k},'jpg') +cd ../ end end \ No newline at end of file diff --git a/sensitivity_analysis_3_modify.m b/sensitivity_analysis_3_modify.m index c564996..aa1b5f6 100644 --- a/sensitivity_analysis_3_modify.m +++ b/sensitivity_analysis_3_modify.m @@ -35,7 +35,7 @@ for m = 1 : numbOfPressure - for k = 1 :1 + for k = 1 :numbOfClass for j = 1: numbOftarget1 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; From 4fa1345ca1ebc51189d476453310945a39aeb54c Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 9 Mar 2017 12:27:17 -0500 Subject: [PATCH 32/47] 3_8_ suddenly optimizer not working.. --- MFC_load_range.m | 2 +- modification_afteroptimize_github.m | 6 +++--- optimization_driver_2.m | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/MFC_load_range.m b/MFC_load_range.m index 9239f27..9a95a25 100644 --- a/MFC_load_range.m +++ b/MFC_load_range.m @@ -6,7 +6,7 @@ % fuel_sim={'base','v1','v2','v3' }; fuel_sim={'modify'}; fuel_name={'n_dodecane'}; -date = {'03_06_2017'}; +date = {'03_08_2017'}; equi =1; % pressure=[20 40 ]; pressure = [20]; diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 499a689..c375604 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_n_dodecane_class26_class27_afteroptimize.inp'; +filename = 'MFC_base.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_07_2017_2_iteration'; +date = '03_08_2017'; -class_numb=[24 26 27]; +class_numb=[11 15 22 24 26 27 28]; numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 45b53f1..41d1c56 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,7 +1,7 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_06_2017'}; +date = {'03_08_2017'}; fuel_sim={'modify_sensitivity'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; From 59cdb5d91b476ac6bc503a98f767790c324c2560 Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 9 Mar 2017 14:50:10 -0500 Subject: [PATCH 33/47] boundary fixed --- optimization_7_repro_multiple_2.m | 16 ++++++++-------- optimization_driver_2.m | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 5dd5efc..73a59cb 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -165,6 +165,14 @@ end % ndodecane +if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) +LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class11')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) +LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class21')(1,2)+2000 ]; @@ -181,14 +189,6 @@ LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class24')(1,2)+2000 ]; end -if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) -LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class11')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) -LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end if strcmp(mechanism{1},'MFC') && ismember(26,classnumb) LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 41d1c56..f475cb7 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -36,7 +36,7 @@ for k=1:length(classnumb) if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... - && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.4) + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.38) class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; end end From e2ec01116b490ab198a1efbed435d473f1dc76cb Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 9 Mar 2017 15:38:32 -0500 Subject: [PATCH 34/47] changeofclassnumb --- optimization_7_repro_multiple_2.m | 1 + 1 file changed, 1 insertion(+) diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 73a59cb..8ec8c4a 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -2,6 +2,7 @@ % close all % classnumb=[15 22 26 27 28]; +classnumb=[11 15 22 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass From b1a2ded8e4c6dbc29e2047a8caa475d37d5ba7d5 Mon Sep 17 00:00:00 2001 From: JordLee Date: Fri, 10 Mar 2017 14:46:24 -0500 Subject: [PATCH 35/47] changed weight expression. match with equi version now --- Ra_Reitz_plot_2.asv | 268 ---------------------------- find_rate_weighting.m | 12 +- modification_afteroptimize_github.m | 2 +- optimization_7_repro_multiple_2.asv | 222 ----------------------- optimization_7_repro_multiple_2.m | 4 +- optimization_driver_2.asv | 55 ------ sensitivity_analysis_3.asv | 152 ---------------- 7 files changed, 9 insertions(+), 706 deletions(-) delete mode 100644 Ra_Reitz_plot_2.asv delete mode 100644 optimization_7_repro_multiple_2.asv delete mode 100644 optimization_driver_2.asv delete mode 100644 sensitivity_analysis_3.asv diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv deleted file mode 100644 index 1c37132..0000000 --- a/Ra_Reitz_plot_2.asv +++ /dev/null @@ -1,268 +0,0 @@ -clear all -% close all -%% Ra&Reitz -mechanism={'MFC' }; -% fuel_sim={'base','v1','v2','v3'}; - -pressure=[20]; -for k=1:length(pressure) - pressure_text{k}=['P',num2str(pressure(k)),'atm']; -end -num_cases=25; - - -pure_component_ID; -real_fuel_ID; - -exp_markers={'ro' 'g*' 'b^'}; -sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; -marker_size=8; -line_width=2; - -i=1; %mechanism - -%% 20atm condition - -% h2=figure('position',[20 50 580 480]); -% set(gca,'Fontsize',13) -% %plot exp data -% %/4 convert to ms -% -% -% -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) -% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); -% -% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) -% -% -% -% % legend_text{2}='Vasu et al.40atm, Shock Tube'; -% % legend_text{1}='Vasu et al.20atm, Shock Tube'; -% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; -% % legend_text{1}=' '; -% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; -% % legend_text{3}='Dooley et al., RCM'; -% % legend_text{2}='Shen et al., Shock Tube'; -% %plot sim data -% -% -% -% -% hold on -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% k=1; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; -% legend_text{end+1}=[mechanism{i},'_','before']; -% end -% -% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue = yvalue(locs); -% hold on -% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); -% -% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue2 = yvalue2(locs2); -% hold on -% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); -% -% difference=abs(locsValue-Vasu_dode_20atm(:,2)); -% [minDifference,idx] = min(difference); -% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); -% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); -% -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% -% fuel_sim={'afteroptimize'}; -% k=1; -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'b-','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; -% -% end -% -% -% -% legend(legend_text,'location','SouthEast','interpreter','none') -% legend('boxoff') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (micros)') -% % ylim([0.1 10000]) -% % axis([0.7 1.6 0.1 10]) -% % clear legend_text -% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... -% 'String',{'n-dodecane',... -% '/Air', '\phi=1'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... -% 'String',{' 20 atm'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -%% 40atm condition -num_cases=[26 11]; -num_cases_text = {}; -for k=1:num_cases(1) - num_cases_text=[num_cases_text ['numcases',num2str(k)]]; -end -for k = 1: length(pressure) - -h3=figure('position',[20 50 580 480]); -set(gca,'Fontsize',13) -clear legend_text -% % legend_text{1}='Vasu et al.40atm, Shock Tube'; -% legend_text{1}='Shen et al.40atm, Shock Tube'; -% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) - -% legend_text{1}=['ERC',pressure_text{k},'Dummy']; -% legend_text{2}=['ERC',pressure_text{k},'target(original)']; -% legend_text{3}=['ERC',pressure_text{k},'after optimize']; - -legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; - if strcmp(pressure_text{k},'P20atm') - legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; - else - legend_text{2}=['Shen, ',pressure_text{k},', ','target']; - end - -legend_text{3}=['MFC ',pressure_text{k},', after optimize']; - -% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; - - load('simulation_result_beforeoptimize_20atm_phi_1.mat') - fuel_sim={'beforeoptimize'}; - - for j=1:length(fuel_sim) - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end - - - - - hold on - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - for j=1:length(fuel_sim) - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end - - - - - hold on - - - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - - - semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... - 'b--','markersize',marker_size) - - - - - - -hold on -% -% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) - if strcmp(pressure_text{k},'P20atm') - semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) - else - semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) - end -%% upper bound & lowerbond -% hold on -% -% -% load('simulation_result_modify_20atm_phi_1.mat') -% fuel_sim={'modify'}; -% -% -% % for j=1:length(fuel_sim) -% % for q= 1: num_cases(k) -% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... -% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... -% % 'bo','markersize',marker_size); -% % end -% % end -% % hold on; -% -% x=[]; y=[]; -% for j=1:length(fuel_sim) -% for q= 1: num_cases(k) -% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); -% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(4,10); -% -% -% end -% end -% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); -% x=[]; y=[]; -% for j=1:length(fuel_sim) -% for q= 1: num_cases(k) -% x(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(1,6); -% y(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(7,10); -% -% -% end -% end -% semilogy(x,y,'k','markersize',marker_size,'LineWidth',1.5); - -%% - legend(legend_text,'location','SouthEast','interpreter','none') - legend('boxoff') - xlabel('1000/T (1/K)') - ylabel('Ignition Delay Time (micros)') - % axis([0.7 1.6 20 40000]) - % clear legend_text - annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-dodecane',... - '/Air','one class', '\phi=1'},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... - 'String',{pressure_text{k}},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - - -end diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 98f4faa..d5b3291 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -5,11 +5,11 @@ time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) -% if j<=numbOftarget1 -% W = 1/numbOftarget1; -% else -% W = 1/numbOftarget2; -% end + if j<=numbOftarget1 + W = 1/numbOftarget1; + else + W = 1/numbOftarget2; + end for i = 1: numbOfClass @@ -17,7 +17,7 @@ A=X(2*i-1); E=X(2*i); % W=X(3*i); - W=1; +% W=1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index c375604..9e5963e 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -65,7 +65,7 @@ fuel_name='n_dodecane'; date = '03_08_2017'; -class_numb=[11 15 22 24 26 27 28]; +class_numb=[11 15 22 26 27 28]; numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_7_repro_multiple_2.asv b/optimization_7_repro_multiple_2.asv deleted file mode 100644 index b563057..0000000 --- a/optimization_7_repro_multiple_2.asv +++ /dev/null @@ -1,222 +0,0 @@ -% clear all -% close all - -% classnumb=[15 22 26 27 28]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end -fuel_sim={'modify'}; - -%% read modification ignition delay time -% mechanism={'MFC'}; -% mechanism={'MFC'}; -% date = {'03_06_2017_increased'}; -% fuel_name = {'n_dodecane'}; -% % fuel_name = {'n_heptane'}; -% equi=1; - -currentloc = 'C:\Users\unghee\Dropbox\post_process'; - - -% pressure=[20]; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -m = 1; -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; -cd(location_rateParam) -load rateParam.mat; -clear m; -%% exp data - -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; -Target_data1=Target_fuel1(:,5); -Temp1 = Target_fuel1(:,2); -numbOftarget1 =length(Target_data1); - - -% Target_fuel2 = Shen_dode_40atm; -% Target_data2=Target_fuel2(:,5); -% Temp2 = Target_fuel2(:,2); -% numbOftarget2 =length(Target_data2); - -% Temp = [Temp1; Temp2]; -% Target_data = [Target_data1; Target_data2]; - -numbOftarget2=0; -Temp = Temp1; -Target_data = Target_data1; - -cd ../../.. - - - A = rateParam.(class_numb_text{1})(:,1); - E = rateParam.(class_numb_text{1})(:,2); -%% read modification ignition delay time - -currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= size(A,1); - -m=1; % pressure 20atm -directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; - -for j = 1: numbOftarget1 - for k = 1: numbOfClass - - location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); - temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); - end - -end -for k = 1: numbOfClass - - time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); - temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); -end - -% m =2 ; % pressure 40atm -% directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% -% for j = 1: numbOftarget2 -% for k = 1: numbOfClass -% -% location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; -% time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); -% time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); -% temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); -% end -% -% end - - - - - -%% coefficient -for j = 1 : size(Temp,1) - - Temp_current = Temp(j); - - - for k = 1: numbOfClass - time_current = time_modification.(class_numb_text{k})(:,j); - A = rateParam.(class_numb_text{k})(:,1); - E = rateParam.(class_numb_text{k})(:,2); - M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; - d = log(time_current); - coefs_inv = lsqlin(M,d); - coefs_element = coefs_inv'; - - - - coefs.(class_numb_text{k})(j,:)=coefs_element; - - prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; - predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; -% plotregression(d,M*coefs_element') - end - - -end -%% plot regression - -% for k = 1: numbOfClass -% plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) -% end - - - - -%% OPTIMIZER - -% Target Temp value - -numberOftempPoints = size(Target_data,1); -%% objective function - -ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data,numbOftarget1,numbOftarget2); -LB =[]; -UB =[]; -% class2 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) -LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; - -end -% class4 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) -LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; -end - -% class6 -if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) -LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; -end - -% ndodecane -if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) -LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(22,classnumb) -LB =[LB rateParam.('class22')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(23,classnumb) -LB =[LB rateParam.('class23')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(24,classnumb) -LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) -LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) -LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(26,classnumb) -LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) -LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; -end -if strcmp(mechanism{1},'MFC') && ismember(28,classnumb) -LB =[LB rateParam.('class28')(1,1)*0.13 0 ]; -UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; -end - -nvars=2*numbOfClass; -options=gaoptimset('PopulationSize',500); -[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); -[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); - -X = result_ga; - -error=ObjectiveFunction(X) - -for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; -end - -location_save=[currentloc,'\',mechanism{1},'\',directory]; -cd(location_save) - -save('final_result.mat','final_result') - diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 8ec8c4a..a96ed59 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -128,8 +128,8 @@ end -%% plot regression - +% plot regression +% % for k = 1: numbOfClass % plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) % end diff --git a/optimization_driver_2.asv b/optimization_driver_2.asv deleted file mode 100644 index b49334a..0000000 --- a/optimization_driver_2.asv +++ /dev/null @@ -1,55 +0,0 @@ -clear; -mechanism={'MFC'}; -fuel_name={'n_dodecane'}; -date = {'03_07_2017'}; -fuel_sim={'modify'}; -equi = 1; -classnumb=[11 15 21 22 23 24 26 27 28]; -pressure=[20]; -%% Target setting -addpath('C:\Users\unghee\Dropbox\post_process'); -real_fuel_ID; -pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; - -Target_data1=Target_fuel1(:,5); -numbOftarget1=length(Target_data1); -Temp1=Target_fuel1(:,2); - -Target_fuel2 = Shen_dode_40atm; -Target_data2=Target_fuel2(:,5); -Temp2 = Target_fuel2(:,2); -numbOftarget2=length(Target_data2); - -Temp = [Temp1; Temp2]; -Target_data = [Target_data1; Target_data2]; - -%% sensitivity -addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); -% sensitivity_analysis_3; -sensitivity_analysis_3_modify; -% clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi - -m =1; -disp('looking at sensitivity at one pressure condition') -class_to_optimize.(pressure_text{m}) = []; -for k=1:length(classnumb) - - if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... - && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg > 0.5) - class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; - end -end - -classnumb = class_to_optimize.(pressure_text{m}) - - - - - -%% Optimization - -clearvars -except classnumb Temp numberOftarget Target_data sensitivity pressure fuel_name -optimization_7_repro_multiple_2 - - diff --git a/sensitivity_analysis_3.asv b/sensitivity_analysis_3.asv deleted file mode 100644 index 1d1c829..0000000 --- a/sensitivity_analysis_3.asv +++ /dev/null @@ -1,152 +0,0 @@ - -%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? - -% pressure=[20 40]; -numbOfPressure=length(pressure) ; -for k=1:length(pressure) - pressure_text{k}=['P',num2str(pressure(k)),'atm']; -end -% classnumb=[1 2 3 4 5 6 7 8 9]; -numbOfClass=length(classnumb) ; -for k=1:numbOfClass - classnumb_text{k}=['class',num2str(classnumb(k))]; -end - -exp_markers={'ro' 'g*' 'g^'}; -sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; -marker_size=8; -line_width=2; - - -%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % i=1 ; -% m=2 ; % pressure -% % j=1 ; -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% sensitivity analysis -% mechanism={'Ra_Reitz'}; -% fuel_sim={'modify_sensitivity'}; -% fuel_name={'n_heptane'} -% equi = 1; -currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= 3; - - -for m = 1 : numbOfPressure - - for k = 1 :numbOfClass - for j = 1: 25 - location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... - 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); - sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); - - end - - - temp=700:25:1300; - h =25; - tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base - tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 - tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 - d_log_tk1=diff(log10(tk1)); - d_log_tk2=diff(log10(tk2)); - dh = log(h); - k1 = 2; - k2 = 0.5; - - [peaks,locs] = findpeaks(tbase/1000); -% yvalue=tbase/1000; - locsValue = temp(locs); - [peaks2,locs2] = findpeaks(-tbase/1000); -% yvalue=tbase/1000; - locsValue2 = temp(locs2); - - p_tempPoints_ig =[1, locs2, locs, length(temp)]; - temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; - -%translational sensitivity -%change the normalize contant log10?e.x. log10^3 - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); - for i = 1 : length(p_tempPoints_ig) - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... - = 100*(log10(tk1(p_tempPoints_ig(i))) - log10(tk2(p_tempPoints_ig(i))))/(log10(tbase(i))*log10(k1/k2)); % translational shift - end - - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg... - = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig)); - - - p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point - - temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); - %rotational sensitivity - for i = 1 : length(p_tempPoints_gr)-1 - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... - = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); - end - - sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg... - = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr)); - end - -end - - -save('sensitivity.mat','sensitivity') - -%% plotting -for m = 1 : numbOfPressure -for k = 1 : numbOfClass -h=figure('position',[20 50 1200 480]); -subplot(1,2,1); -set(gca,'Fontsize',13) -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); -hold on -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); -hold on -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); - - -semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... - [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... - sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... - ,'gp','markersize',12); -hold on -semilogy(locsValue,peaks,'gp','markersize',12); -hold on -semilogy(locsValue2,-peaks2,'gp','markersize',12); - -legend('baseline','k=2','k=1','extreme points') -xlabel('1000/T (1/K)') -ylabel('Ignition Delay Time (ms)') - - - - -subplot(1,2,2); -plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); -ylim([-25 25]) -hold on -% figure -plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); - -ylim([-30 25]) -xlabel('1000/T (1/K)') -ylabel('Ignition Delay Time (ms)') -legend('ignition delay sensitivity','gradient sensitivity') - -annotation(h,'textbox',[0.213 0.38 0.279 0.05],... - 'String',{fuel_name{1},... - '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); -mkdir(sensitivity) -cd(sensitivity) -saveas(h,classnumb_text{k},'fig') -end -end \ No newline at end of file From 86cdfe09cb0b24f1c23fc28db14481c703cacf3a Mon Sep 17 00:00:00 2001 From: JordLee Date: Thu, 16 Mar 2017 10:59:16 -0400 Subject: [PATCH 36/47] seems there is an error in optimizaiton --- Ra_Reitz_plot_2.asv | 281 ++++++++++++++++++++++++++ Ra_Reitz_plot_2.m | 92 ++++----- find_rate_weighting.m | 12 +- modification_afteroptimize_github.asv | 220 ++++++++++++++++++++ modification_afteroptimize_github.m | 7 +- optimization_7_repro_multiple_2.m | 2 +- optimization_driver_2.m | 2 +- sensitivity_analysis_3.m | 4 + 8 files changed, 563 insertions(+), 57 deletions(-) create mode 100644 Ra_Reitz_plot_2.asv create mode 100644 modification_afteroptimize_github.asv diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv new file mode 100644 index 0000000..4b2f075 --- /dev/null +++ b/Ra_Reitz_plot_2.asv @@ -0,0 +1,281 @@ +clear all +% close all +%% Ra&Reitz +mechanism={'MFC' }; +% fuel_sim={'base','v1','v2','v3'}; + +pressure=[20]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +num_cases=25; + + +pure_component_ID; +real_fuel_ID; + +exp_markers={'ro' 'g*' 'b^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +i=1; %mechanism + +%% 20atm condition + +% h2=figure('position',[20 50 580 480]); +% set(gca,'Fontsize',13) +% %plot exp data +% %/4 convert to ms +% +% +% +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); +% +% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) +% +% +% +% % legend_text{2}='Vasu et al.40atm, Shock Tube'; +% % legend_text{1}='Vasu et al.20atm, Shock Tube'; +% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; +% % legend_text{1}=' '; +% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; +% % legend_text{3}='Dooley et al., RCM'; +% % legend_text{2}='Shen et al., Shock Tube'; +% %plot sim data +% +% +% +% +% hold on +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% k=1; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; +% legend_text{end+1}=[mechanism{i},'_','before']; +% end +% +% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue = yvalue(locs); +% hold on +% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); +% +% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue2 = yvalue2(locs2); +% hold on +% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); +% +% difference=abs(locsValue-Vasu_dode_20atm(:,2)); +% [minDifference,idx] = min(difference); +% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); +% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); +% +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% +% fuel_sim={'afteroptimize'}; +% k=1; +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'b-','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; +% +% end +% +% +% +% legend(legend_text,'location','SouthEast','interpreter','none') +% legend('boxoff') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (micros)') +% % ylim([0.1 10000]) +% % axis([0.7 1.6 0.1 10]) +% % clear legend_text +% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... +% 'String',{'n-dodecane',... +% '/Air', '\phi=1'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... +% 'String',{' 20 atm'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +%% 40atm condition +num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end +classnumb=[22 24 27 28]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +for k = 1: length(pressure) + +h3=figure('position',[20 50 580 480]); +set(gca,'Fontsize',13) +clear legend_text +% % legend_text{1}='Vasu et al.40atm, Shock Tube'; +% legend_text{1}='Shen et al.40atm, Shock Tube'; +% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) + +% legend_text{1}=['ERC',pressure_text{k},'Dummy']; +% legend_text{2}=['ERC',pressure_text{k},'target(original)']; +% legend_text{3}=['ERC',pressure_text{k},'after optimize']; + +legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; + if strcmp(pressure_text{k},'P20atm') + legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + else + legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + end + +legend_text{3}=['MFC ',pressure_text{k},', after optimize']; + +% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; + + load('simulation_result_beforeoptimize_20atm_phi_1.mat') + fuel_sim={'beforeoptimize'}; + + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end + + + + + hold on + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; + + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end + + + + + hold on + + + + load('simulation_result_afteroptimize_20atm_phi_1.mat') + fuel_sim={'afteroptimize'}; + + + + semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... + 'b','markersize',marker_size) + + + + + + +hold on +% +% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + if strcmp(pressure_text{k},'P20atm') + semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) + else + semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) + end +%% upper bound & lowerbond + hold on + + + load('simulation_result_modify_20atm_phi_1.mat') + fuel_sim={'modify'}; + + +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% 'bo','markersize',marker_size); +% end +% end +% hold on; + + x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; + for j=1:length(fuel_sim) + for q= 1: num_cases(k) + for m = 1: length(classnumb) + x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); + y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); + end + + end + end + for m = 1: length(classnumb) +% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); + hold on; + end + x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; + for j=1:length(fuel_sim) + for q= 1: num_cases(k) + for m = 1: length(classnumb) + x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); + y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); + end + + end + end + for m = 1: length(classnumb) +% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); + hold on; + end +%% + legend(legend_text,'location','SouthEast','interpreter','none') + legend('boxoff') + xlabel('1000/T (1/K)') + ylabel('Ignition Delay Time (micros)') + % axis([0.7 1.6 20 40000]) + % clear legend_text + annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... + 'String',{'n-dodecane',... + '/Air','class 26,27', '\phi=1'},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... + 'String',{pressure_text{k}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index c0bb03e..a4ddff2 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -127,12 +127,12 @@ for k=1:num_cases(1) num_cases_text=[num_cases_text ['numcases',num2str(k)]]; end -classnumb=[15 22 26 27 28]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end +% classnumb=[22 24 26 28]; +% numbOfClass = length(classnumb); +% class_numb_text = {}; +% for k=1:numbOfClass +% class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +% end for k = 1: length(pressure) h3=figure('position',[20 50 580 480]); @@ -212,50 +212,50 @@ semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) end %% upper bound & lowerbond - hold on - - - load('simulation_result_modify_20atm_phi_1.mat') - fuel_sim={'modify'}; - - +% hold on +% +% +% load('simulation_result_modify_20atm_phi_1.mat') +% fuel_sim={'modify'}; +% +% +% % for j=1:length(fuel_sim) +% % for q= 1: num_cases(k) +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% % 'bo','markersize',marker_size); +% % end +% % end +% % hold on; +% +% x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; % for j=1:length(fuel_sim) % for q= 1: num_cases(k) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... -% 'bo','markersize',marker_size); +% for m = 1: length(classnumb) +% x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); +% y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); +% end +% % end % end -% hold on; - - x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - for m = 1: length(classnumb) - x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); - y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); - end - - end - end - for m = 1: length(classnumb) -% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); - hold on; - end - x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - for m = 1: length(classnumb) - x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); - y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); - end - - end - end - for m = 1: length(classnumb) -% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); - hold on; - end +% for m = 1: length(classnumb) +% % semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); +% hold on; +% end +% x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% for m = 1: length(classnumb) +% x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); +% y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); +% end +% +% end +% end +% for m = 1: length(classnumb) +% % semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); +% hold on; +% end %% legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') diff --git a/find_rate_weighting.m b/find_rate_weighting.m index d5b3291..98f4faa 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -5,11 +5,11 @@ time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) - if j<=numbOftarget1 - W = 1/numbOftarget1; - else - W = 1/numbOftarget2; - end +% if j<=numbOftarget1 +% W = 1/numbOftarget1; +% else +% W = 1/numbOftarget2; +% end for i = 1: numbOfClass @@ -17,7 +17,7 @@ A=X(2*i-1); E=X(2*i); % W=X(3*i); -% W=1; + W=1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; diff --git a/modification_afteroptimize_github.asv b/modification_afteroptimize_github.asv new file mode 100644 index 0000000..7ef788f --- /dev/null +++ b/modification_afteroptimize_github.asv @@ -0,0 +1,220 @@ + +% clear all; +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; +% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; +filename = 'MFC_n_dodecane_class11_class15_class22_class26_class27_class28_afteroptimize.inp'; +delimiter = ' '; + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + +rawCellColumns2=rawCellColumns; + +ModStart = 0; + +mechanism='MFC'; +fuel_name='n_dodecane'; +date = '03_09_2017_2_iteration'; + +class_numb=[22 24 26 27]; +numbOfClass = length(class_numb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; +end +pressure=[20]; +equi=1; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +load final_result.mat + + +for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if strmatch('reactions',rawCellColumns{i,j})==1; + ModStart = 1; + end + + + for k = 1: numbOfClass +% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; + + rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A + rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E + + + end + end + end +end + +%% +% datename = '01_19_2017' +% save_filename=[mechanism,'_','output','_',datename]; + + +save_filename='output'; + +for k = 1 :length(pressure) +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; +% location=[currentloc,'\',mechanism,'\',directory]; +cd(directory) + +mkdir(save_filename); +cd(save_filename); + +class_numb_text = []; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; +end +file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; + +fileID = fopen(file_name,'w'); +output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + + + + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + +fclose(fileID); + +end +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 9e5963e..77b8c16 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -1,5 +1,5 @@ -clear all; +% clear all; %% Import data from text file. % Script for importing data from the following text file: % @@ -63,9 +63,10 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_08_2017'; +date = '03_16_2017_1_iteration'; -class_numb=[11 15 22 26 27 28]; +% class_numb=[22 24 26 27]; +class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index a96ed59..010db03 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -2,7 +2,7 @@ % close all % classnumb=[15 22 26 27 28]; -classnumb=[11 15 22 26 27 28]; +classnumb=[11 15 22 24 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_driver_2.m b/optimization_driver_2.m index f475cb7..6b48967 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,7 +1,7 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_08_2017'}; +date = {'03_16_2017_1_iteration'}; fuel_sim={'modify_sensitivity'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 852a028..45238ce 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -145,6 +145,10 @@ 'FontName','Arial',... 'FitBoxToText','off',... 'LineStyle','none'); + +% location_save=[currentloc,'\',mechanism{1},'\',directory]; +% cd(location_save) + mkdir('sensitivity'); cd('sensitivity'); saveas(h,classnumb_text{k},'fig') From 7443cfabb4fa9e61ea0ddf18fce23c9cbe6d62db Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 29 Mar 2017 18:48:36 -0400 Subject: [PATCH 37/47] commit 3/24 --- Ra_Reitz_plot_2.asv | 281 -------------------------- Ra_Reitz_plot_2.m | 24 +-- find_rate_weighting.m | 6 +- modification_afteroptimize_github.asv | 220 -------------------- modification_afteroptimize_github.m | 8 +- optimization_7_repro_multiple_2.m | 15 +- optimization_driver_2.m | 2 +- 7 files changed, 29 insertions(+), 527 deletions(-) delete mode 100644 Ra_Reitz_plot_2.asv delete mode 100644 modification_afteroptimize_github.asv diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv deleted file mode 100644 index 4b2f075..0000000 --- a/Ra_Reitz_plot_2.asv +++ /dev/null @@ -1,281 +0,0 @@ -clear all -% close all -%% Ra&Reitz -mechanism={'MFC' }; -% fuel_sim={'base','v1','v2','v3'}; - -pressure=[20]; -for k=1:length(pressure) - pressure_text{k}=['P',num2str(pressure(k)),'atm']; -end -num_cases=25; - - -pure_component_ID; -real_fuel_ID; - -exp_markers={'ro' 'g*' 'b^'}; -sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; -marker_size=8; -line_width=2; - -i=1; %mechanism - -%% 20atm condition - -% h2=figure('position',[20 50 580 480]); -% set(gca,'Fontsize',13) -% %plot exp data -% %/4 convert to ms -% -% -% -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) -% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); -% -% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) -% -% -% -% % legend_text{2}='Vasu et al.40atm, Shock Tube'; -% % legend_text{1}='Vasu et al.20atm, Shock Tube'; -% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; -% % legend_text{1}=' '; -% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; -% % legend_text{3}='Dooley et al., RCM'; -% % legend_text{2}='Shen et al., Shock Tube'; -% %plot sim data -% -% -% -% -% hold on -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% k=1; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; -% legend_text{end+1}=[mechanism{i},'_','before']; -% end -% -% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue = yvalue(locs); -% hold on -% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); -% -% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue2 = yvalue2(locs2); -% hold on -% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); -% -% difference=abs(locsValue-Vasu_dode_20atm(:,2)); -% [minDifference,idx] = min(difference); -% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); -% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); -% -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% -% fuel_sim={'afteroptimize'}; -% k=1; -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'b-','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; -% -% end -% -% -% -% legend(legend_text,'location','SouthEast','interpreter','none') -% legend('boxoff') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (micros)') -% % ylim([0.1 10000]) -% % axis([0.7 1.6 0.1 10]) -% % clear legend_text -% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... -% 'String',{'n-dodecane',... -% '/Air', '\phi=1'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... -% 'String',{' 20 atm'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -%% 40atm condition -num_cases=[26 11]; -num_cases_text = {}; -for k=1:num_cases(1) - num_cases_text=[num_cases_text ['numcases',num2str(k)]]; -end -classnumb=[22 24 27 28]; -numbOfClass = length(classnumb); -class_numb_text = {}; -for k=1:numbOfClass - class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -end -for k = 1: length(pressure) - -h3=figure('position',[20 50 580 480]); -set(gca,'Fontsize',13) -clear legend_text -% % legend_text{1}='Vasu et al.40atm, Shock Tube'; -% legend_text{1}='Shen et al.40atm, Shock Tube'; -% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) - -% legend_text{1}=['ERC',pressure_text{k},'Dummy']; -% legend_text{2}=['ERC',pressure_text{k},'target(original)']; -% legend_text{3}=['ERC',pressure_text{k},'after optimize']; - -legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; - if strcmp(pressure_text{k},'P20atm') - legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; - else - legend_text{2}=['Shen, ',pressure_text{k},', ','target']; - end - -legend_text{3}=['MFC ',pressure_text{k},', after optimize']; - -% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; - - load('simulation_result_beforeoptimize_20atm_phi_1.mat') - fuel_sim={'beforeoptimize'}; - - for j=1:length(fuel_sim) - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end - - - - - hold on - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - for j=1:length(fuel_sim) - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end - - - - - hold on - - - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - - - semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... - 'b','markersize',marker_size) - - - - - - -hold on -% -% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) - if strcmp(pressure_text{k},'P20atm') - semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) - else - semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) - end -%% upper bound & lowerbond - hold on - - - load('simulation_result_modify_20atm_phi_1.mat') - fuel_sim={'modify'}; - - -% for j=1:length(fuel_sim) -% for q= 1: num_cases(k) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... -% 'bo','markersize',marker_size); -% end -% end -% hold on; - - x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - for m = 1: length(classnumb) - x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); - y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); - end - - end - end - for m = 1: length(classnumb) -% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); - hold on; - end - x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; - for j=1:length(fuel_sim) - for q= 1: num_cases(k) - for m = 1: length(classnumb) - x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); - y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); - end - - end - end - for m = 1: length(classnumb) -% semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); - hold on; - end -%% - legend(legend_text,'location','SouthEast','interpreter','none') - legend('boxoff') - xlabel('1000/T (1/K)') - ylabel('Ignition Delay Time (micros)') - % axis([0.7 1.6 20 40000]) - % clear legend_text - annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-dodecane',... - '/Air','class 26,27', '\phi=1'},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... - 'String',{pressure_text{k}},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - - -end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index a4ddff2..c50930a 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -170,17 +170,17 @@ - - hold on - - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; - - for j=1:length(fuel_sim) - semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... - sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... - 'k--','markersize',marker_size) - end +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% fuel_sim={'afteroptimize'}; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% end @@ -203,7 +203,7 @@ -hold on +% hold on % % semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) if strcmp(pressure_text{k},'P20atm') diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 98f4faa..915223f 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -29,13 +29,15 @@ time_weight_differ(j,i)= W*abs(log10(Target_data(j))-log10(exp(time(j,i)))); timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class - +% timeTotal(j)= time(j,i) +timeTotal(j); % X(3*i) end - +% differ_tempj =W*abs(log10(Target_data(j))-log10(exp(timeTotal(j)))); differTotal = timeTotal(j) + differTotal; % sum up Temp + +% differTotal = differ_tempj + differTotal; % sum up Temp end diff --git a/modification_afteroptimize_github.asv b/modification_afteroptimize_github.asv deleted file mode 100644 index 7ef788f..0000000 --- a/modification_afteroptimize_github.asv +++ /dev/null @@ -1,220 +0,0 @@ - -% clear all; -%% Import data from text file. -% Script for importing data from the following text file: -% -% /home/jordan/Documents/Research/matlabfolder/mech.dat -% -% To extend the code to different selected data or a different text file, -% generate a function instead of a script. - -% Auto-generated by MATLAB on 2016/08/24 17:10:49 - -%% Initialize variables. -% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; -currentFolder = pwd; -cd(pwd); -% cd mechanisms/; -% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_n_dodecane_class11_class15_class22_class26_class27_class28_afteroptimize.inp'; -delimiter = ' '; - -%% Read columns of data as strings: -% For more information, see the TEXTSCAN documentation. -% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; -formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; -%% Open the text file. -fileID = fopen(filename,'r'); - -%% Read columns of data according to format string. -% This call is based on the structure of the file used to generate this -% code. If an error occurs for a different file, try regenerating the code -% from the Import Tool. -dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); - -%% Close the text file. -fclose(fileID); - -%% Convert the contents of columns containing numeric strings to numbers. -% Replace non-numeric strings with NaN. -raw = repmat({''},length(dataArray{1}),length(dataArray)-1); -for col=1:length(dataArray)-1 - raw(1:length(dataArray{col}),col) = dataArray{col}; -end -numericData = NaN(size(dataArray{1},1),size(dataArray,2)); - - -%% Split data into numeric and cell columns. -rawNumericColumns = {}; -rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); - - - %% Replace non-numeric cells with NaN - -[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); - -locationClass = [A B]; - -[rowCellNumber,] = size(rawCellColumns); - -rawCellColumns2=rawCellColumns; - -ModStart = 0; - -mechanism='MFC'; -fuel_name='n_dodecane'; -date = '03_09_2017_2_iteration'; - -class_numb=[22 24 26 27]; -numbOfClass = length(class_numb); -class_numb_text = {}; -for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; -end -pressure=[20]; -equi=1; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -load final_result.mat - - -for i=1 : rowCellNumber - [ ~, columnCellNumber] = size(rawCellColumns(i,:)); -% for j= 1 : cellfun('length',rawCellColumns{i,:}) - for j= 1 : 1: columnCellNumber - - if strmatch('reactions',rawCellColumns{i,j})==1; - ModStart = 1; - end - - - for k = 1: numbOfClass -% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 - & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... - & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; - - rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A - rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E - - - end - end - end -end - -%% -% datename = '01_19_2017' -% save_filename=[mechanism,'_','output','_',datename]; - - -save_filename='output'; - -for k = 1 :length(pressure) -directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; -% location=[currentloc,'\',mechanism,'\',directory]; -cd(directory) - -mkdir(save_filename); -cd(save_filename); - -class_numb_text = []; -for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; -end -file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; - -fileID = fopen(file_name,'w'); -output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); - - - - for i = 1:size(rawCellColumns2,1) - for j = 1:size(rawCellColumns2,2) - if numel(rawCellColumns2{i,j}) == 0 - output{i,j} = ''; - % Check whether the content of cell i,j is - % numeric and convert numbers to strings. - elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) - output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); - - % If the cell already contains a string, nothing has to be done. - elseif ischar(rawCellColumns2{i,j}) - output{i,j} = rawCellColumns2{i,j}; - end; - - % Cell i,j is written to the output file. A delimiter is appended for - % all but the last element of each row. At the end of a row, a newline - % is written to the output file. - if j < size(rawCellColumns2,2) - fprintf(fileID,['%s',delimiter],output{i,j}); - else - fprintf(fileID,'%s\r\n',output{i,j}); - end - end; - end; - - -fclose(fileID); - -end -% exit -%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp - -%% Clear temporary variables -% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 77b8c16..8d3a0f4 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -1,5 +1,5 @@ -% clear all; +clear all; %% Import data from text file. % Script for importing data from the following text file: % @@ -63,10 +63,10 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_16_2017_1_iteration'; +date = '03_23_2017_1_iteration'; -% class_numb=[22 24 26 27]; -class_numb=classnumb; +class_numb=[11 15 22 24 26 27 28]; +% class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 010db03..8c3eb47 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -2,7 +2,7 @@ % close all % classnumb=[15 22 26 27 28]; -classnumb=[11 15 22 24 26 27 28]; +% classnumb=[11 15 22 24 26 27 28]; numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -12,11 +12,11 @@ %% read modification ignition delay time % mechanism={'MFC'}; -% mechanism={'MFC'}; -% date = {'03_06_2017_increased'}; -% fuel_name = {'n_dodecane'}; -% % fuel_name = {'n_heptane'}; -% equi=1; +mechanism={'MFC'}; +date = {'03_16_2017_1_iteration'}; +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; +equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; @@ -122,7 +122,7 @@ coefs.(class_numb_text{k})(j,:)=coefs_element; prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; - predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; +% predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; % plotregression(d,M*coefs_element') end @@ -218,6 +218,7 @@ location_save=[currentloc,'\',mechanism{1},'\',directory]; cd(location_save) +cd ../ save('final_result.mat','final_result') diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 6b48967..735763e 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,7 +1,7 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_16_2017_1_iteration'}; +date = {'03_16_2017_5_iteration'}; fuel_sim={'modify_sensitivity'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; From efb873c3564cd8389a12b20e01d36b5feee34875 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 5 Apr 2017 16:33:10 -0400 Subject: [PATCH 38/47] updtate --- modification_afteroptimize_github.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 8d3a0f4..f43d3e6 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_base.inp'; +filename = 'MFC_n_dodecane_class11_class15_class22_class24_class26_class27_class28_afteroptimize.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_23_2017_1_iteration'; +date = '03_23_2017_2_iteration'; -class_numb=[11 15 22 24 26 27 28]; +class_numb=[11 22 24 26 27]; % class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; From c182acbc2a0bae56ab0dd65d9234ae37874a587b Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 10 Apr 2017 23:59:08 -0400 Subject: [PATCH 39/47] added flux ver --- find_rate_weighting.m | 12 +- flux_version/find_rate_weighting.m | 49 +++ .../modification_afteroptimize_github.m | 221 +++++++++++++ .../modification_afteroptimize_github_func.m | 223 ++++++++++++++ .../optimization_7_repro_multiple_2.m | 227 ++++++++++++++ flux_version/optimization_driver_2.m | 55 ++++ flux_version/pure_component_ID.m | 290 ++++++++++++++++++ flux_version/read_ignition_delay.m | 138 +++++++++ flux_version/real_fuel_ID.m | 226 ++++++++++++++ flux_version/sensitivity_analysis_3.m | 159 ++++++++++ modification_afteroptimize_github.m | 14 +- 11 files changed, 1601 insertions(+), 13 deletions(-) create mode 100644 flux_version/find_rate_weighting.m create mode 100644 flux_version/modification_afteroptimize_github.m create mode 100644 flux_version/modification_afteroptimize_github_func.m create mode 100644 flux_version/optimization_7_repro_multiple_2.m create mode 100644 flux_version/optimization_driver_2.m create mode 100644 flux_version/pure_component_ID.m create mode 100644 flux_version/read_ignition_delay.m create mode 100644 flux_version/real_fuel_ID.m create mode 100644 flux_version/sensitivity_analysis_3.m diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 915223f..172d434 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -5,11 +5,11 @@ time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) -% if j<=numbOftarget1 -% W = 1/numbOftarget1; -% else -% W = 1/numbOftarget2; -% end + if j<=numbOftarget1 + W = 1/numbOftarget1; + else + W = 1/numbOftarget2; + end for i = 1: numbOfClass @@ -17,7 +17,7 @@ A=X(2*i-1); E=X(2*i); % W=X(3*i); - W=1; +% W=1; % time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... % +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... % +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; diff --git a/flux_version/find_rate_weighting.m b/flux_version/find_rate_weighting.m new file mode 100644 index 0000000..172d434 --- /dev/null +++ b/flux_version/find_rate_weighting.m @@ -0,0 +1,49 @@ +function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data,numbOftarget1,numbOftarget2) +differTotal= 0; +timeTotal =zeros(length(Temp),1) ; +time = zeros(length(Temp),numbOfClass); +time_weight_differ = zeros(length(Temp),numbOfClass); +for j= 1: length(Temp) + + if j<=numbOftarget1 + W = 1/numbOftarget1; + else + W = 1/numbOftarget2; + end + + + for i = 1: numbOfClass + + A=X(2*i-1); + E=X(2*i); +% W=X(3*i); +% W=1; +% time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... +% +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... +% +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; + + time(j,i)=coefs.(classnumb_text{i})(j,1)*log(A)+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... + +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*log(A)*E... + +coefs.(classnumb_text{i})(j,5)*(log(A))^2+coefs.(classnumb_text{i})(j,6)*(E)^2; + + time_weight_differ(j,i)= W*abs(log10(Target_data(j))-log10(exp(time(j,i)))); + + timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class +% timeTotal(j)= time(j,i) +timeTotal(j); +% X(3*i) + + end +% differ_tempj =W*abs(log10(Target_data(j))-log10(exp(timeTotal(j)))); + + differTotal = timeTotal(j) + differTotal; % sum up Temp + +% differTotal = differ_tempj + differTotal; % sum up Temp +end + + + + +end + + + diff --git a/flux_version/modification_afteroptimize_github.m b/flux_version/modification_afteroptimize_github.m new file mode 100644 index 0000000..cca1453 --- /dev/null +++ b/flux_version/modification_afteroptimize_github.m @@ -0,0 +1,221 @@ + +clear all; +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; +% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; +filename = 'MFC_base.inp'; +delimiter = ' '; + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + +rawCellColumns2=rawCellColumns; + +ModStart = 0; + +mechanism='MFC'; +fuel_name='n_dodecane'; +date = '03_23_2017_1_iteration'; +iteration_numb = 1; +class_numb=[11 15 22 24 26 27 28]; +% class_numb=classnumb; +numbOfClass = length(class_numb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; +end +pressure=[20 40]; +equi=1; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +load final_result.mat + + +for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if strmatch('reactions',rawCellColumns{i,j})==1; + ModStart = 1; + end + + + for k = 1: numbOfClass +% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; + + rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A + rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E + + + end + end + end +end + +%% +% datename = '01_19_2017' +% save_filename=[mechanism,'_','output','_',datename]; + + +save_filename='output'; + +for k = 1 :length(pressure) +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; +% location=[currentloc,'\',mechanism,'\',directory]; +cd(directory) + +mkdir(save_filename); +cd(save_filename); + +class_numb_text = []; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; +end +% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; +file_name=[mechanism,'_',num2str(iteration_numb),'_'class_numb_text,'_','afteroptimize','.inp']; +fileID = fopen(file_name,'w'); +output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + + + + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + +fclose(fileID); + +end +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/flux_version/modification_afteroptimize_github_func.m b/flux_version/modification_afteroptimize_github_func.m new file mode 100644 index 0000000..c3f0329 --- /dev/null +++ b/flux_version/modification_afteroptimize_github_func.m @@ -0,0 +1,223 @@ +function modification_afteroptimize_github_func(filename,mechanism,fuel_name,iteration_numb) +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; +% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; +% filename = 'MFC_base.inp'; +delimiter = ' '; + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + +rawCellColumns2=rawCellColumns; + +ModStart = 0; + +% mechanism='MFC'; +% fuel_name='n_dodecane'; +date = '03_23_2017_1_iteration'; +% iteration_numb = 1; +class_numb=[11 15 22 24 26 27 28]; +% class_numb=classnumb; +numbOfClass = length(class_numb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; +end +pressure=[20 40]; +equi=1; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +load final_result.mat + + +for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if strmatch('reactions',rawCellColumns{i,j})==1; + ModStart = 1; + end + + + for k = 1: numbOfClass +% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; + + rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A + rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E + + + end + end + end +end + +%% +% datename = '01_19_2017' +% save_filename=[mechanism,'_','output','_',datename]; + + +save_filename='output'; + +for k = 1 :length(pressure) +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; +% location=[currentloc,'\',mechanism,'\',directory]; +cd(directory) + +mkdir(save_filename); +cd(save_filename); + +class_numb_text = []; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; +end +% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; +file_name=[mechanism,'_',num2str(iteration_numb),'_'class_numb_text,'_','afteroptimize','.inp']; +fileID = fopen(file_name,'w'); +output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + + + + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + +fclose(fileID); + +end + + +end +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/flux_version/optimization_7_repro_multiple_2.m b/flux_version/optimization_7_repro_multiple_2.m new file mode 100644 index 0000000..6d2beb0 --- /dev/null +++ b/flux_version/optimization_7_repro_multiple_2.m @@ -0,0 +1,227 @@ +% clear all +% close all + +% classnumb=[15 22 26 27 28]; +% classnumb=[11 15 22 24 26 27 28]; +numbOfClass = length(classnumb); +class_numb_text = {}; +for k=1:numbOfClass + class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +end +fuel_sim={'modify'}; + +%% read modification ignition delay time +% mechanism={'MFC'}; +% mechanism={'MFC'}; +% date = {'03_23_2017_1_iteration'}; +% date = {'03_06_2017_increased'} +fuel_name = {'n_dodecane'}; +% fuel_name = {'n_heptane'}; +equi=1; + +currentloc = '/scratch/engin_flux/unghee/chemkin'; + + +% pressure=[20]; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +m = 1; +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; +% location_rateParam=[currentloc,'/',mechanism{1},'/',directory,'/',fuel_sim{1},'/',class_numb_text{1}]; +location_rateParam=[currentloc,'/',mechanism{1},'/',directory,'/',fuel_sim{1},'/']; +cd(location_rateParam) +load rateParam.mat; +clear m; +%% exp data + +% addpath('C:\Users\unghee\Dropbox\post_process'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; +Target_data1=Target_fuel1(:,5); +Temp1 = Target_fuel1(:,2); +numbOftarget1 =length(Target_data1); + + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2 =length(Target_data2); + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; + +% numbOftarget2=0; +% Temp = Temp1; +% Target_data = Target_data1; + +cd ../../.. + + + A = rateParam.(class_numb_text{1})(:,1); + E = rateParam.(class_numb_text{1})(:,2); +%% read modification ignition delay time + +currentloc = '/scratch/engin_flux/unghee/chemkin'; +num_cases_modification= size(A,1); + +m=1; % pressure 20atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; + +for j = 1: numbOftarget1 + for k = 1: numbOfClass + + location_modification=[currentloc,'/',mechanism{1},'/',directory,'/',fuel_sim{1},'/',class_numb_text{k},'/',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,j)=time_struct_modification.table.data(:,6); + end + +end +for k = 1: numbOfClass + + time_modification.(class_numb_text{k})=time_modification.(class_numb_text{k})(:,1: numbOftarget1); + temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); +end + +m =2 ; % pressure 40atm +directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; + +for j = 1: numbOftarget2 + for k = 1: numbOfClass + + location_modification=[currentloc,'/',mechanism{1},'/',directory,'/',fuel_sim{1},'/',class_numb_text{k},'/',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,10); + temp_modification.(class_numb_text{k})(:,numbOftarget1+j)=time_struct_modification.table.data(:,6); + end + +end + + + + + +%% coefficient +for j = 1 : size(Temp,1) + + Temp_current = Temp(j); + + + for k = 1: numbOfClass + time_current = time_modification.(class_numb_text{k})(:,j); + A = rateParam.(class_numb_text{k})(:,1); + E = rateParam.(class_numb_text{k})(:,2); + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; + d = log(time_current); + coefs_inv = lsqlin(M,d); + coefs_element = coefs_inv'; + + + + coefs.(class_numb_text{k})(j,:)=coefs_element; + + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; +% predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; +% plotregression(d,M*coefs_element') + end + + +end +% plot regression +% +% for k = 1: numbOfClass +% plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) +% end + + + + +%% OPTIMIZER + +% Target Temp value + +numberOftempPoints = size(Target_data,1); +%% objective function + +ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data,numbOftarget1,numbOftarget2); +LB =[]; +UB =[]; +% class2 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) +LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class2')(1,1)*10 rateParam.('class2')(1,2)+2000 ]; + +end +% class4 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(4,classnumb) +LB =[LB rateParam.('class4')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class4')(1,1)*10 rateParam.('class4')(1,2)+2000 ]; +end + +% class6 +if strcmp(mechanism{1},'Ra_Reitz') && ismember(6,classnumb) +LB =[LB rateParam.('class6')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; +end + +% ndodecane +if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) +LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class11')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(15,classnumb) +LB =[LB rateParam.('class15')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class15')(1,1)*10 rateParam.('class15')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(21,classnumb) +LB =[LB rateParam.('class21')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class21')(1,1)*10 rateParam.('class21')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(22,classnumb) +LB =[LB rateParam.('class22')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class22')(1,1)*10 rateParam.('class22')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(23,classnumb) +LB =[LB rateParam.('class23')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class23')(1,1)*10 rateParam.('class23')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(24,classnumb) +LB =[LB rateParam.('class24')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class24')(1,1)*10 rateParam.('class24')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(26,classnumb) +LB =[LB rateParam.('class26')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class26')(1,1)*10 rateParam.('class26')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(27,classnumb) +LB =[LB rateParam.('class27')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class27')(1,1)*10 rateParam.('class27')(1,2)+2000 ]; +end +if strcmp(mechanism{1},'MFC') && ismember(28,classnumb) +LB =[LB rateParam.('class28')(1,1)*0.13 0 ]; +UB =[UB rateParam.('class28')(1,1)*10 rateParam.('class28')(1,2)+2000 ]; +end + +nvars=2*numbOfClass; +options=gaoptimset('PopulationSize',500); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); + +X = result_ga; + +error=ObjectiveFunction(X) + +for i = 1 : numbOfClass +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +end + +% location_save=[currentloc,'\',mechanism{1},'\',directory]; +location_save='/scratch/engin_flux/unghee/chemkin/MFC'; +cd(location_save) +% cd ../ + +save('final_result.mat','final_result') + diff --git a/flux_version/optimization_driver_2.m b/flux_version/optimization_driver_2.m new file mode 100644 index 0000000..864d8df --- /dev/null +++ b/flux_version/optimization_driver_2.m @@ -0,0 +1,55 @@ +clear; +mechanism={'MFC'}; +fuel_name={'n_dodecane'}; +date = {'03_23_2017_1_iteration'}; +fuel_sim={'modify_sensitivity_3'}; +equi = 1; +classnumb=[11 15 21 22 23 24 26 27 28]; +pressure=[20 40]; +%% Target setting +addpath('/scratch/engin_flux/unghee/chemkin/MFC'); +real_fuel_ID; +pure_component_ID; +Target_fuel1 = Vasu_dode_20atm; + +Target_data1=Target_fuel1(:,5); +numbOftarget1=length(Target_data1); +Temp1=Target_fuel1(:,2); + +Target_fuel2 = Shen_dode_40atm; +Target_data2=Target_fuel2(:,5); +Temp2 = Target_fuel2(:,2); +numbOftarget2=length(Target_data2); + +Temp = [Temp1; Temp2]; +Target_data = [Target_data1; Target_data2]; + +%% sensitivity +% addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); +sensitivity_analysis_3; +% sensitivity_analysis_3_modify; +% clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi + +m =1; +disp('looking at sensitivity at one pressure condition') +class_to_optimize.(pressure_text{m}) = []; +for k=1:length(classnumb) + + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.38) + class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; + end +end + +classnumb = class_to_optimize.(pressure_text{m}) + + + +%% Optimization +% classnumb= [26 27] +clearvars -except classnumb Temp Temp1 Temp2 numberOftarget Target_data Target_data1 numbOftarget1 sensitivity pressure fuel_name equi fuel_name mechanism fuel_sim date +optimization_7_repro_multiple_2 + +%% call modification func. if the tolerance is larger than.. and loop back to optimization driver + +% if error < k , run optimization_driver_2 diff --git a/flux_version/pure_component_ID.m b/flux_version/pure_component_ID.m new file mode 100644 index 0000000..8728257 --- /dev/null +++ b/flux_version/pure_component_ID.m @@ -0,0 +1,290 @@ +Pfahl_dec_20atm=[ + 1297.87234 0.770491803 12 90.83238519 54.49943112 +1234.817814 0.809836066 12 189.938161 113.9628966 +1204.235463 0.830402385 12 251.9098497 151.1459098 +1095.689092 0.91266766 12 870.0784243 522.0470546 +1066.433566 0.937704918 12 791.2576649 474.7545989 +1013.289037 0.986885246 12 1680.364423 1008.218654 +936.1049107 1.068256334 12 1931.573337 1158.944002 +932.2033898 1.072727273 12 2816.325604 1689.795362 +915.4160982 1.092399404 12 3735.30403 2241.182418 +857.1793562 1.16661699 12 2765.596281 1659.357768 +836.6583541 1.195230999 12 2989.461373 1793.676824 +798.4293194 1.252459016 12 2471.89845 1483.13907 +764.0628558 1.308792846 12 2076.368423 1245.821054 +731.0960994 1.36780924 12 2464.440492 1478.664295 +697.3602162 1.433979136 12 3587.468327 2152.480996 +]; + +Shen_dec_20atm=[ + 1011 0.989119683 12 1135 681 +1041 0.960614793 11 881 484.55 +1085 0.921658986 11.7 615 359.775 +1088 0.919117647 11.4 513 292.41 +1145 0.873362445 10.4 359 186.68 +1175 0.85106383 10.9 311 169.495 +1263 0.791765637 10.5 108 56.7 +1276 0.78369906 9.9 114 56.43 +1378 0.725689405 10.6 40 21.2 +836 1.196172249 37.2 757 1408.02 +900 1.111111111 43.1 692 1491.26 +928 1.077586207 43.1 625 1346.875 +929 1.076426265 42.5 551 1170.875 +938 1.066098081 42.4 565 1197.8 +955 1.047120419 42.5 597 1268.625 +970 1.030927835 45.6 397 905.16 +976 1.024590164 43.3 471 1019.715 +1003 0.997008973 41.9 364 762.58 +1032 0.968992248 39.5 351 693.225 +1079 0.926784059 39.8 186 370.14 +1133 0.882612533 38.9 135 262.575 +1144 0.874125874 33.9 128 216.96 +1158 0.863557858 37.7 113 213.005 +1271 0.786782061 35.8 37 66.23 +]; + + +Fieweger_ioct_20atm=[ %% + 1208.053691 0.827777778 33.6 67.64376051 100.8592862 +1113.402062 0.898148148 33.6 293.7033517 437.9222885 +990.8256881 1.009259259 33.6 1148.263098 1712.101685 +980.9264305 1.019444444 33.6 1159.263587 1728.503812 +961.7097061 1.039814815 33.6 1251.147431 1865.505937 +926.2435678 1.07962963 33.6 2195.911873 3274.183788 +917.5870858 1.089814815 33.6 2632.024061 3924.442787 +800 1.25 33.6 10388.74645 15489.99558 +781.4761216 1.27962963 33.6 8107.793734 12089.01283 +729.7297297 1.37037037 33.6 9004.328811 13425.77896 +699.0291262 1.430555556 33.6 10792.60528 16092.16367 +1186.813187 0.842592593 16.8 191.2376943 167.2124265 +1055.718475 0.947222222 16.8 1105.295141 966.4364717 +980.0362976 1.02037037 16.8 2392.6655 2092.073979 +951.5418502 1.050925926 16.8 2813.684268 2460.199991 +]; + +Davidson_ioct_20atm=[ + 984 1.016260163 18.1 1511 1396.422513 +995 1.005025126 16.3 1535 1305.938997 +1043 0.958772771 17.1 927 819.0925291 +1077 0.928505107 18.4 604 565.4957199 +1109 0.901713255 15.9 516 430.4668708 +1159 0.86281277 14.9 214 169.5966341 +]; + +Shen_ioct_20atm=[ +1021 0.979431929 19.8 1059 1051.04753 +1032 0.968992248 25.5 850 1019.885845 +1045 0.956937799 26 645 785.2667863 +1058 0.945179584 24.5 704 819.7373542 +1072 0.932835821 22.8 509 561.5603303 +1078 0.927643785 23.9 439 501.7535446 +1084 0.922509225 24.2 494 569.9227281 +1085 0.921658986 24.1 429 493.3982188 +1088 0.919117647 25.9 449 545.0654663 +1118 0.894454383 23.5 295 332.9280721 +1132 0.883392226 23.2 220 245.9043281 +1142 0.875656743 19 220 211.6973321 +1145 0.873362445 21.3 207 217.0114013 +1205 0.829875519 20.7 104 106.7182271 +1223 0.817661488 20.4 91 92.36161562 +]; + +Oehlschlaeger_hmn_20atm=[ + 993 1.007049345 14 984 739.7305083 +972 1.028806584 31.2 813 1160.353253 +1039 0.962463908 31.8 299 433.3001983 +1074 0.931098696 27 193 245.3716164 +1083 0.923361034 25.4 183 221.5613826 +1179 0.848176421 28.5 63 83.63584343 +1195 0.836820084 26.5 62 77.65410026 +]; + +% Oehlschlaeger_hmn_20atm=[ +% 993 14 984 1.007049345 688.8 +% 1046 11.7 662 0.956022945 387.27 +% 1098 9.8 472 0.910746812 231.28 +% 1161 12.5 173 0.861326443 108.125 +% 1210 10.9 119 0.826446281 64.855 +% 1304 10.4 59 0.766871166 30.68 +% 1309 9.9 49 0.76394194 24.255 +% 953 46.9 1014 1.049317943 2377.83 +% 968 37.1 963 1.033057851 1786.365 +% 972 31.2 813 1.028806584 1268.28 +% 986 43.8 600 1.014198783 1314 +% 1039 31.8 299 0.962463908 475.41 +% 1074 27 193 0.931098696 260.55 +% 1083 25.4 183 0.923361034 232.41 +% 1179 28.5 63 0.848176421 89.775 +% 1195 26.5 62 0.836820084 82.15 +% ]; + +Oehlschlaeger_hmn_40atm=[ + 953 1.049317943 46.9 1014 1151.670483 +968 1.033057851 37.1 963 906.728824 +972 1.028806584 31.2 813 666.4479367 +986 1.014198783 43.8 600 645.1824505 +1039 0.962463908 31.8 299 248.8656125 +1074 0.931098696 27 193 140.928986 +1083 0.923361034 25.4 183 127.2535978 +1179 0.848176421 28.5 63 48.03617788 +1195 0.836820084 26.5 62 44.60056861 +]; + +Shen_dode_20atm=[ +924 1.082251082 17.8 1299 1156.11 +999 1.001001001 12.1 822 497.31 +1014 0.986193294 13.9 713 495.535 +1014 0.986193294 13.8 740 510.6 +1030 0.970873786 12.3 656 403.44 + +1103 0.906618314 12.8 343 219.52 + +1135 0.881057269 13.9 257 178.615 + +1177 0.849617672 14.9 162 120.69 +1178 0.848896435 12.4 194 120.28 +1210 0.826446281 13.4 123 82.41]; +Shen_dode_40atm=[ +877 1.140250855 45 801 901.125 +913 1.095290252 41.8 757 791.065 +945 1.058201058 43.2 737 795.96 +978 1.022494888 43.8 506 554.07 +1020 0.980392157 45.2 342 386.46 +1043 0.958772771 41 270 276.75 +1080 0.925925926 40.6 206 209.09 +1097 0.911577028 41.3 157 162.1025 +1102 0.907441016 44.2 155 171.275 +1114 0.897666068 38.6 129 124.485 +1122 0.891265597 42.6 120 127.8 +]; +Vasu_dode_20atm=[ + 727 1.375515818 27 809 1092.15 +773 1.293661061 28.7 556 797.86 +818 1.222493888 26.9 881 1184.945 +822 1.216545012 23.3 805 937.825 +855 1.169590643 25.9 875 1133.125 +869 1.150747986 22.5 1040 1170 +907 1.102535832 23.4 1081 1264.77 +942 1.061571125 21 1116 1171.8 +953 1.049317943 20 1141 1141 +957 1.044932079 19.8 1064 1053.36 +976 1.024590164 20.5 800 820 +978 1.022494888 22.9 912 1044.24 +987 1.013171226 22 699 768.9 +991 1.009081736 21.8 645 703.05 +992 1.008064516 20.4 739 753.78 +1008 0.992063492 22.4 570 638.4 +1015 0.985221675 22.3 508 566.42 +1036 0.965250965 22.1 432 477.36 +1087 0.919963201 19.4 403 390.91 +1102 0.907441016 20.8 268 278.72 +1107 0.903342367 23.3 298 347.17 +1109 0.901713255 23 278 319.7 +1118 0.894454383 33.7 183 308.355 +1123 0.89047195 24 262 314.4 +1125 0.888888889 18.7 188 175.78 +1135 0.881057269 20.6 178 183.34 +]; +Oehlschlaeger_decalin_20atm=[ +1037 0.964320154 15.2 867 699.9285351 +1049 0.953288847 13.5 871 641.0251926 +1057 0.946073794 12.5 825 571.7950114 +1063 0.940733772 13.9 627 472.0800943 +1074 0.931098696 12.2 580 394.4439188 +1105 0.904977376 14.1 371 282.4629047 +1134 0.881834215 10.5 315 190.5613454 +1164 0.859106529 11.4 200 129.0067348]; +Zhu_decalin_20atm = [ + 1202 0.831946755 16.6 109 90.47 +1193 0.838222967 18.8 106 99.64 +1145 0.873362445 20.5 157 160.925 +1100 0.909090909 18.9 284 268.38 +1090 0.917431193 19.9 261 259.695 +1068 0.936329588 19.2 381 365.76 +1059 0.944287063 20.5 396 405.9 +1051 0.951474786 19.3 440 424.6 +1014 0.986193294 26.8 553 741.02 +1012 0.988142292 23.3 788 918.02 +990 1.01010101 22.1 917 1013.285 +951 1.051524711 24.1 1271 1531.555 +914 1.094091904 19.5 2644 2577.9 +876 1.141552511 20.2 3291 3323.91 +830 1.204819277 24 3049 3658.8 +802 1.246882793 19.3 5341 5154.065 +769 1.300390117 15.5 8746 6778.15 +]; +Zhu_decalin_50atm = [ + 1043 0.958772771 46 264 242.88 +1011 0.989119683 50.4 413 416.304 +1006 0.994035785 46.4 443 411.104 +962 1.03950104 47.9 891 853.578 +961 1.040582726 50.1 804 805.608 +941 1.062699256 50.6 1024 1036.288 +912 1.096491228 48.9 903 883.134 +883 1.132502831 56.6 638 722.216 +852 1.17370892 37.8 1984 1499.904 +831 1.203369434 48.3 3411 3295.026 +]; + +Shen_tol_20atm=[ + 1129 0.885739593 13.4 1380 891.8680812 +1164 0.859106529 13.5 934 608.5384005 +1197 0.835421888 12.4 798 473.9252337 +1235 0.809716599 11.3 483 259.2268239 +1239 0.807102502 14.5 471 331.7335027 +1290 0.775193798 11.2 281 149.358956 +1371 0.729394602 13.2 137 87.10106333 +]; +Davidson_tol_20atm=[ + 971 1.029866117 17.2 1314 1142.033714 +995 1.005025126 16.5 1100 919.8030754 +1053 0.949667616 17.1 1288 1113.382395 +1067 0.937207123 16.1 1646 1345.302656 +1076 0.92936803 16.5 1174 981.6807368 +1097 0.911577028 16.6 1223 1028.416611 +1138 0.878734622 22.2 716 788.9752734 +1173 0.852514919 14.9 767 583.3117135 +]; + +Shen_tol_50atm = [ + 1021 0.979431929 53.8 1255 1350.38 +1041 0.960614793 47.6 1203 1145.256 +1082 0.924214418 46.9 757 710.066 +1085 0.921658986 51 546 556.92 +1116 0.896057348 49.5 492 487.08 +1117 0.895255148 46.2 459 424.116 +1135 0.881057269 50.9 346 352.228 +1218 0.821018062 51.4 117 120.276 +1232 0.811688312 57.5 97 111.55 +1256 0.796178344 61.5 61 75.03 +1305 0.766283525 60.7 44 53.416 +]; + +Davidson_tol_50atm = [ + 977 1.023541453 54.3 1173 1273.878 +990 1.01010101 50.5 952 961.52 +1005 0.995024876 50.4 870 876.96 +1068 0.936329588 48 605 580.8 +1111 0.900090009 46.7 397 370.798 +1166 0.857632933 44.6 276 246.192 +1179 0.848176421 41.5 273 226.59 +1183 0.845308538 46.2 191 176.484 +1242 0.805152979 42.4 121 102.608 +]; + +%n heptane +Shen_hep_40atm=[ +788 1.269035533 295 +797 1.254705144 379 +799 1.251564456 319 +834 1.199040767 284 +862 1.160092807 295 +899 1.112347052 381 +967 1.034126163 491 +991 1.009081736 447 +996 1.004016064 336 +1003 0.997008973 344 +1022 0.978473581 282 +1029 0.971817298 297 +1050 0.952380952 259]; + diff --git a/flux_version/read_ignition_delay.m b/flux_version/read_ignition_delay.m new file mode 100644 index 0000000..13b2cbe --- /dev/null +++ b/flux_version/read_ignition_delay.m @@ -0,0 +1,138 @@ +%updated for DTIG ouput - 3/28/2014 +%For MFL_2013, ignition delay prediction based on delta T of 400K is added +%to data output file. To accomodate this, code is updated. + + +function A = read_ignition_delay(location,num_cases) + + + if ~isempty(findstr(location,'MFL_2013')) || ~isempty(findstr(location,'MFL_2014')) || ~isempty(findstr(location,'MFC_2012'))||... + ~isempty(findstr(location,'Ra_Reitz')) || ~isempty(findstr(location,'MFC')) + % if the mechanism was wither MFL_2013, MFL_2014, or MFC_2012 + + for i=1:num_cases +% file_path=[location,'/id_',num2str(i),'/CKSoln_solution_point_value_vs_solution_number.csv']; + % location of the file +% cd([location,'/id_',num2str(i)]) + +% [data{i}.num data{i}.txt data{i}.raw]=csvread('CKSoln_solution_point_value_vs_solution_number.csv',1,0); + + + cd([location,'/id_',num2str(i)]) + + num=csvread('CKSoln_solution_point_value_vs_solution_number.csv',1,0); +% file_path=['/scratch/engin_flux/unghee/chemkin/MFC/n_dodecane_20atm_phi1_03_16_2017_5_iteration/modify_sensitivity/class11/1/id_1/','CKSoln_solution_point_value_vs_solution_number.csv']; + file_path=[location,'/id_',num2str(i),'/','CKSoln_solution_point_value_vs_solution_number.csv']; + formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; + delimiter = ','; + fileID=fopen(file_path,'r'); + dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + for j = 1 : 12 + text{1,j} = dataArray{1,j}(1,1); + + rawdat{1,j} = dataArray{1,j}(2,1); + end + raw = [text{1,:}; rawdat{1,:}]; + + data{i}.num = num; + data{i}.txt = text; + data{i}.raw = raw; + % read the file + + fclose(fileID); + + + + + table.data(i,1:6)=data{i}.num(1:6); + % keep the first 6 columns + + [m n]=size(data{i}.num); + + if n<7 % when the data file is only 6 columns wide, igntion was not achieved (or + % both DT and OH peak ignition criteria were not met). + display(['Warning: no ID data for ',location,', case#',num2str(i)]); + table.data(i,7:8)=0; + % then send warning and ignition delay time is set to zero. + + else if n==7 && strcmp(data{i}.txt{7},' Ignition_time_1_by_ignition_T_(sec)') + % when the data file is 7 columns wide and the header + % of 7th column is as above, ignition delay time is + % from DTIG criteria only, and OH peak criteria is not + % met. + display(['Warning: Only DTIG ID data for ',location,', case#',num2str(i)]); + table.data(i,7)=data{i}.num(7); %delta T + table.data(i,8)=data{i}.num(7); %delta T + % Then, send warning and ignition delay time for OH + % peak is same as DTIG igintion delay time. + else + + % For the rest of the case, 7th column is DTIG ignition + % delay time, 8th ~ end columns are OH peak ignition + % delay time. OH peak ignition delay time can be + % multiple, since it looks for local minimum. + % Typically, the last one is responsible for the real + % ignition delay time, while + % + table.data(i,7)=data{i}.num(7); %delta T + table.data(i,8)=max(data{i}.num(8:end)); %oh peak + end + end + end + + + table.data=sortrows(table.data,6); %sort based on 1000/T + + temp=table.data(:,7:8); % to rearrange the table + + table.data(:,7)=temp(:,2); % oh peak to 7th and 8th column + table.data(:,8)=table.data(:,7)*1000000; + table.data(:,9)=temp(:,1); % delta T to 9th and 10th column + table.data(:,10)=table.data(:,9)*1000000; + + for j=1:6 + table.header{j}=data{1}.txt{j}; + end + table.header{7}='ignition_time_oh(s)'; + table.header{8}='ignition_time_oh(micros)'; + table.header{9}='ignition_time_dt(s)'; + table.header{10}='ignition_time_dt(micros)'; + + + + + + else % for rest of the mechanisms (previous) + +% for i=1:num_cases +% file_path=[location,'\id_',num2str(i),'\CKSoln_solution_point_value_vs_solution_number.csv']; +% [data{i}.num data{i}.txt data{i}.raw]=xlsread(file_path); +% table.data(i,1:6)=data{i}.num(1:6); +% [m n]=size(data{i}.num); +% if n>6 +% table.data(i,7)=max(data{i}.num(7:end)); +% else +% table.data(i,7)=0; +% +% display(['Warning: no ID data for ',location,', case#',num2str(i)]); +% +% end +% end +% table.data=sortrows(table.data,6); +% table.data(:,8)=table.data(:,7)*1000000; +% for j=1:6 +% table.header{j}=data{1}.txt{j}; +% end +% table.header{7}='ignition_time_(s)'; +% table.header{8}='ignition_time_(micros)'; + + end + + A.raw=data; + A.table=table; + +end + + + + diff --git a/flux_version/real_fuel_ID.m b/flux_version/real_fuel_ID.m new file mode 100644 index 0000000..52f426e --- /dev/null +++ b/flux_version/real_fuel_ID.m @@ -0,0 +1,226 @@ +% experimental data +% Jet-A 4658 +% Vasu -> Vasu et al. +% Wang -> Wang and Oehlschlaeger +% Dooley -> Dooley et al. + +% T 1000/T P ID_raw ID_scaled +% scaling factor of -1 was used + +Vasu_20atm=[ + 715 1.399 21.7 3286 3565.31 +753 1.328 21.8 2584 2816.56 +763 1.311 21.5 2423 2604.725 +774 1.292 19.4 2566 2489.02 +785 1.274 21.1 2484 2620.62 +786 1.272 19.7 2742 2700.87 +808 1.238 20.8 2628 2733.12 +874 1.144 23.3 3109 3621.985 +880 1.136 25.1 2355 2955.525 +952 1.05 24 1358 1629.6 +958 1.044 22.5 1287 1447.875 +963 1.038 21.7 1412 1532.02 +987 1.013 21.3 984 1047.96 +1035 0.966 21.9 539 590.205 +1042 0.96 22 486 534.6 +1130 0.885 24.8 138 171.12 +]; + +Vasu_40atm=[ +934 1.071 31.4 1230 965.55 +974 1.027 32.5 777 631.3125 +997 1.003 32.1 641 514.4025 +961 1.041 49.3 528 650.76 +1009 0.991 50.9 286 363.935 +1090 0.917 50.5 115 145.1875 +1124 0.89 47.8 80 95.6 +]; + +Wang_20atm=[ + 674 1.483679525 20.8 8974 9332.96 +680 1.470588235 21.8 6703 7306.27 +681 1.468428781 21.3 5821 6199.365 +700 1.428571429 23.5 3887 4567.225 +703 1.422475107 23.7 4216 4995.96 +704 1.420454545 23.4 3204 3748.68 +717 1.394700139 24.3 2737 3325.455 +723 1.383125864 20 2287 2287 +737 1.356852103 23.7 1871 2217.135 +750 1.333333333 20.9 1842 1924.89 +753 1.328021248 20.8 1894 1969.76 +755 1.324503311 21.2 1788 1895.28 +757 1.321003963 20.5 1757 1800.925 +797 1.254705144 23 1618 1860.7 +797 1.254705144 24.8 1618 2006.32 +802 1.246882793 21.5 1616 1737.2 +803 1.245330012 23.2 1625 1885 +815 1.226993865 22.1 1742 1924.91 +820 1.219512195 19.1 2102 2007.41 +826 1.210653753 21.2 1896 2009.76 +831 1.203369434 21.7 1789 1941.065 +836 1.196172249 20.5 2038 2088.95 +845 1.183431953 20.9 2138 2234.21 +849 1.177856302 21.2 2059 2182.54 +849 1.177856302 22.1 1897 2096.185 +851 1.175088132 21.8 1908 2079.72 +871 1.148105626 22.8 1843 2101.02 +882 1.133786848 21.6 2032 2194.56 +904 1.10619469 21.5 2031 2183.325 +931 1.074113856 20.9 1749 1827.705 +940 1.063829787 22.7 1675 1901.125 +955 1.047120419 21.1 1354 1428.47 +973 1.027749229 21.7 1236 1341.06 +984 1.016260163 19.9 1140 1134.3 +991 1.009081736 18.9 1050 992.25 +1025 0.975609756 19.2 816 783.36 +1043 0.958772771 16.7 706 589.51 +1046 0.956022945 21.6 563 608.04 +1050 0.952380952 21 458 480.9 +1072 0.932835821 19.3 464 447.76 +1083 0.923361034 19.1 375 358.125 +1092 0.915750916 18.4 318 292.56 +1100 0.909090909 16.9 355 299.975 +1106 0.904159132 18.2 261 237.51 +1109 0.901713255 18.1 249 225.345 +1117 0.895255148 17.7 225 199.125 +1126 0.888099467 19.2 185 177.6 +1138 0.878734622 18.7 181 169.235 +1143 0.874890639 18.1 176 159.28 +1145 0.873362445 17.2 184 158.24 +1177 0.849617672 18.1 104 94.12 +1187 0.842459983 16.3 116 94.54 +1197 0.835421888 16.5 95 78.375 +1222 0.818330606 16.8 77 64.68 +]; + +Wang_40atm=[ + 741 1.349527665 36.6 1885 1724.775 +763 1.31061599 40.3 1707 1719.8025 +812 1.231527094 38.5 1644 1582.35 +832 1.201923077 36 1661 1494.9 +848 1.179245283 40.1 1727 1731.3175 +852 1.17370892 36.9 1423 1312.7175 +854 1.170960187 36.9 1423 1312.7175 +855 1.169590643 35.7 1824 1627.92 +888 1.126126126 39.3 1550 1522.875 +896 1.116071429 38.1 1640 1562.1 +904 1.10619469 34.5 1689 1456.7625 +916 1.091703057 39.9 1483 1479.2925 +945 1.058201058 36.5 1192 1087.7 +964 1.037344398 41.1 819 841.5225 +978 1.022494888 40.2 821 825.105 +1007 0.993048659 38.8 542 525.74 +1008 0.992063492 40.3 689 694.1675 +1021 0.979431929 38.8 462 448.14 +1030 0.970873786 38.6 456 440.04 +1034 0.967117988 40.9 495 506.1375 +1054 0.948766603 38.5 298 286.825 +1103 0.906618314 40.2 169 169.845 +1132 0.883392226 39.6 107 105.93 +1161 0.861326443 40.3 92 92.69 +1162 0.860585198 40.9 79 80.7775 +1163 0.859845228 38.7 96 92.88 +1224 0.816993464 40.9 40 40.9 +1229 0.81366965 38.8 38 36.86 +]; + +Dooley_20atm=[ + 653.3 1.530690341 22 24100 26510 +663.4 1.507386192 22 18700 20570 +671.5 1.489203276 22 12980 14278 +680 1.470588235 22 8380 9218 +690.8 1.447596989 22 6600 7260 +699.4 1.429796969 22 4600 5060 +709.6 1.409244645 22 3480 3828 +]; + +Wang_20atm_rich=[ + 662 1.510574018 19.8 8311 8227.89 +670 1.492537313 20 6770 6770 +672 1.488095238 20.1 5285 5311.425 +684 1.461988304 21.1 3656 3857.08 +701 1.426533524 18.8 2811 2642.34 +706 1.416430595 23 2528 2907.2 +710 1.408450704 23.5 2331 2738.925 +717 1.394700139 19.7 1720 1694.2 +724 1.38121547 21.1 1973 2081.515 +743 1.34589502 18.7 1709 1597.915 +759 1.317523057 19.6 1832 1795.36 +774 1.291989664 20.6 1481 1525.43 +810 1.234567901 21 1678 1761.9 +813 1.2300123 18.4 1651 1518.92 +832 1.201923077 19.6 2052 2010.96 +837 1.19474313 19.1 1761 1681.755 +854 1.170960187 19.2 2064 1981.44 +880 1.136363636 22.2 1655 1837.05 +894 1.118568233 23.4 1662 1944.54 +901 1.109877913 20.4 1931 1969.62 +910 1.098901099 20.5 1612 1652.3 +972 1.028806584 20.2 1024 1034.24 +989 1.011122346 23.2 816 946.56 +1004 0.996015936 18.9 756 714.42 +1014 0.986193294 21.2 628 665.68 +1014 0.986193294 21.7 522 566.37 +1020 0.980392157 20.9 524 547.58 +1021 0.979431929 20.4 541 551.82 +1049 0.953288847 22.4 371 415.52 +1075 0.930232558 21.9 279 305.505 +1088 0.919117647 22.3 291 324.465 +1101 0.908265213 21.9 243 266.085 +1121 0.89206066 23.4 140 163.8 +1142 0.875656743 20.5 130 133.25 +1132 0.883392226 18.9 155 146.475 +1157 0.864304235 20.3 119 120.785 +1160 0.862068966 19.9 114 113.43 +1185 0.843881857 21.1 83 87.565 +]; + +Wang_IPK_20atm=[ +681 1.468428781 21.5 6642 7140.15 +687 1.455604076 20.4 5995 6114.9 +734 1.36239782 20.4 3060 3121.2 +805 1.242236025 20.6 3332 3431.96 +869 1.150747986 20 2686 2686 +914 1.094091904 20.2 1910 1929.1 +977 1.023541453 20.2 1162 1173.62 +989 1.011122346 20 1038 1038 +1033 0.968054211 20.4 563 574.26 +1080 0.925925926 21.5 303 325.725 +1151 0.868809731 20.3 135 137.025 +1213 0.824402308 20.5 70 71.75 +1252 0.798722045 20.8 45 46.8 +1323 0.755857899 21.9 27 29.565]; + +Wang_S8_20atm=[ +673 1.485884101 20.2 2676 2702.76 +700 1.428571429 22.5 1621 1823.625 +717 1.394700139 20.6 1334 1374.02 +732 1.366120219 20.1 1245 1251.225 +759 1.317523057 19.6 1453 1423.94 +804 1.243781095 20.3 1457 1478.855 +832 1.201923077 20 1295 1295 +857 1.166861144 19.8 1674 1657.26 +870 1.149425287 18.7 1547 1446.445 +926 1.079913607 18.7 1362 1273.47 +942 1.061571125 20.9 1142 1193.39 +956 1.046025105 20.1 1037 1042.185 +1016 0.984251969 19.6 593 581.14 +1044 0.957854406 24 423 507.6 +1046 0.956022945 20.8 387 402.48 +1066 0.938086304 20 343 343 +1086 0.920810313 19 292 277.4 +1119 0.893655049 20.3 221 224.315 +1142 0.875656743 19.8 161 159.39 +1179 0.848176421 19.8 103 101.97 +1180 0.847457627 20 83 83 +1260 0.793650794 20.8 39 40.56]; + + + + + + + + + + diff --git a/flux_version/sensitivity_analysis_3.m b/flux_version/sensitivity_analysis_3.m new file mode 100644 index 0000000..12e6f29 --- /dev/null +++ b/flux_version/sensitivity_analysis_3.m @@ -0,0 +1,159 @@ + +%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? + +% pressure=[20 40]; + +numbOfPressure=length(pressure) ; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +% classnumb=[1 2 3 4 5 6 7 8 9]; +numbOfClass=length(classnumb) ; +for k=1:numbOfClass + classnumb_text{k}=['class',num2str(classnumb(k))]; +end + +exp_markers={'ro' 'g*' 'g^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + + +%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % i=1 ; +% m=1 ; % pressure +% % j=1 ; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% sensitivity analysis +% mechanism={'Ra_Reitz'}; +% fuel_sim={'modify_sensitivity'}; +% fuel_name={'n_heptane'} +% equi = 1; +currentloc = '/scratch/engin_flux/unghee/chemkin/MFC'; +num_cases_modification= 3; + + +% for m = 1 : numbOfPressure +for m = 1 : 1 %% sensitivity analysis for only one pressure + for k = 1 :numbOfClass + for j = 1: 25 + location_modification=['/scratch/engin_flux/unghee/chemkin','/',mechanism{1},'/',fuel_name{1},'_',num2str(pressure(m)),... + 'atm','_','phi',num2str(equi),'_',date{1},'/',fuel_sim{1},'/',classnumb_text{k},'/',num2str(j)]; + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); + + end + + + temp=700:25:1300; + h =25; + tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base + tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 + tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 + d_log_tk1=diff(log10(tk1)); + d_log_tk2=diff(log10(tk2)); + dh = log(h); + k1 = 2; + k2 = 0.5; + + [peaks,locs] = findpeaks(tbase/1000); +% yvalue=tbase/1000; + locsValue = temp(locs); + [peaks2,locs2] = findpeaks(-tbase/1000); +% yvalue=tbase/1000; + locsValue2 = temp(locs2); + + p_tempPoints_ig =[1, locs2, locs, length(temp)]; + temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; + +%translational sensitivity +%change the normalize contant log10?e.x. log10^3 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); + for i = 1 : length(p_tempPoints_ig) + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... + = 100*(log10(tk1(p_tempPoints_ig(i))) - log10(tk2(p_tempPoints_ig(i))))/(log10(tbase(i))*log10(k1/k2)); % translational shift + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig)); + + + p_tempPoints_gr =[1, locs2, locs, length(temp)]; % added end point + + temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); + %rotational sensitivity + for i = 1 : length(p_tempPoints_gr)-1 + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... + = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); + end + + sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg... + = mean(abs(sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr)); + end + +end + + +save('sensitivity.mat','sensitivity') + +%% plotting +% for m = 1 : numbOfPressure +% for k = 1 : numbOfClass +% h=figure('position',[20 50 1200 480]); +% subplot(1,2,1); +% set(gca,'Fontsize',13) +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); +% +% +% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... +% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... +% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... +% ,'gp','markersize',12); +% hold on +% semilogy(locsValue,peaks,'gp','markersize',12); +% hold on +% semilogy(locsValue2,-peaks2,'gp','markersize',12); +% +% legend('baseline','k=2','k=1','extreme points') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% +% +% +% +% subplot(1,2,2); +% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +% ylim([-25 25]) +% hold on +% % figure +% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); +% +% ylim([-30 25]) +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% legend('ignition delay sensitivity','gradient sensitivity') +% +% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... +% 'String',{fuel_name{1},... +% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% +% % location_save=[currentloc,'\',mechanism{1},'\',directory]; +% % cd(location_save) +% +% mkdir('sensitivity'); +% cd('sensitivity'); +% saveas(h,classnumb_text{k},'fig') +% saveas(h,classnumb_text{k},'jpg') +% cd ../ +% end +% end \ No newline at end of file diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index f43d3e6..cca1453 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_n_dodecane_class11_class15_class22_class24_class26_class27_class28_afteroptimize.inp'; +filename = 'MFC_base.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_23_2017_2_iteration'; - -class_numb=[11 22 24 26 27]; +date = '03_23_2017_1_iteration'; +iteration_numb = 1; +class_numb=[11 15 22 24 26 27 28]; % class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; @@ -73,7 +73,7 @@ % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; end -pressure=[20]; +pressure=[20 40]; equi=1; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -178,8 +178,8 @@ % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; end -file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; - +% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; +file_name=[mechanism,'_',num2str(iteration_numb),'_'class_numb_text,'_','afteroptimize','.inp']; fileID = fopen(file_name,'w'); output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); From fd5af353f3d3cfea1617c169a129a49128a727b5 Mon Sep 17 00:00:00 2001 From: JordLee Date: Wed, 19 Apr 2017 12:28:18 -0400 Subject: [PATCH 40/47] bash backup --- Ra_Reitz_plot_2.m | 6 +- bash_backup/afteroptimize.pbs | 72 +++++++++++++++ bash_backup/beforeoptimize.pbs | 57 ++++++++++++ bash_backup/beforeoptimize_dummy.pbs | 58 ++++++++++++ bash_backup/case_chemkinrun.pbs | 34 +++++++ bash_backup/copy.sh | 34 +++++++ bash_backup/modify.pbs | 86 ++++++++++++++++++ bash_backup/modify_loop.pbs | 84 ++++++++++++++++++ bash_backup/modify_loop_2.pbs | 93 ++++++++++++++++++++ bash_backup/modify_loop_matlab.pbs | 51 +++++++++++ bash_backup/modify_sensitivity.pbs | 80 +++++++++++++++++ bash_backup/modify_sensitivity_2.pbs | 77 ++++++++++++++++ bash_backup/modify_sensitivity_case.pbs | 88 ++++++++++++++++++ bash_backup/modify_sensitivity_case_past.pbs | 74 ++++++++++++++++ bash_backup/modify_sensitivity_loop.pbs | 82 +++++++++++++++++ bash_backup/modify_sensitivity_loop_2.pbs | 79 +++++++++++++++++ modification_afteroptimize_github.m | 10 +-- optimization_driver_2.m | 4 +- 18 files changed, 1059 insertions(+), 10 deletions(-) create mode 100644 bash_backup/afteroptimize.pbs create mode 100644 bash_backup/beforeoptimize.pbs create mode 100644 bash_backup/beforeoptimize_dummy.pbs create mode 100644 bash_backup/case_chemkinrun.pbs create mode 100644 bash_backup/copy.sh create mode 100644 bash_backup/modify.pbs create mode 100644 bash_backup/modify_loop.pbs create mode 100644 bash_backup/modify_loop_2.pbs create mode 100644 bash_backup/modify_loop_matlab.pbs create mode 100644 bash_backup/modify_sensitivity.pbs create mode 100644 bash_backup/modify_sensitivity_2.pbs create mode 100644 bash_backup/modify_sensitivity_case.pbs create mode 100644 bash_backup/modify_sensitivity_case_past.pbs create mode 100644 bash_backup/modify_sensitivity_loop.pbs create mode 100644 bash_backup/modify_sensitivity_loop_2.pbs diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index c50930a..0d1ebfb 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -189,8 +189,8 @@ - load('simulation_result_afteroptimize_20atm_phi_1.mat') - fuel_sim={'afteroptimize'}; + load('simulation_result_afteroptimize_3_20atm_phi_1.mat') + fuel_sim={'afteroptimize_3'}; @@ -265,7 +265,7 @@ % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... 'String',{'n-dodecane',... - '/Air','class 26,27', '\phi=1'},... + '/Air','class', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/bash_backup/afteroptimize.pbs b/bash_backup/afteroptimize.pbs new file mode 100644 index 0000000..11e74e5 --- /dev/null +++ b/bash_backup/afteroptimize.pbs @@ -0,0 +1,72 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=00:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-25 +#PBS -joe + +cd $PBS_O_WORKDIR + + +##setting +pressure="40" +mechanism="MFC"; +fuel_name="n_dodecane"; +#class_name="class11_class15_class22_class24_class26_class27_class28"; +iteration_numb="3"; +equi="1"; +matlabdate="04_12_2017" +## + +## count number of file +#cd /scratch/engin_flux/unghee/chemkin/Ra_Reitz/${fuel_name}_${pressure}atm_phi${equi}_$matlabdate +#numfiles=(*) +#numfiles=${#numfiles[@]} +#echo "number of temperature points" +#echo $numfiles +## + +## access and make file +#cd /scratch/engin_flux/unghee/chemkin/Ra_Reitz +#now=$(date +"%m_%d_%Y") +#mkdir ${fuel_name}_${pressure} +#cd ${fuel_name}_${pressure} + + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + + +mkdir afteroptimize_${iteration_numb} +cd afteroptimize_${iteration_numb} +## + + + +##calculate chemkin + + echo "calcultating temp ${PBS_ARRAYID}" + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/${PBS_ARRAYID}/${mechanism}_${fuel_name}.inp ./ +# cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_afteroptimize_${iteration_numb}_iteration.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + +# $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_afteroptimize_${iteration_numb}_iteration.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/chem -i ${mechanism}_afteroptimize_${iteration_numb}_iteration.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + + + diff --git a/bash_backup/beforeoptimize.pbs b/bash_backup/beforeoptimize.pbs new file mode 100644 index 0000000..2ba7440 --- /dev/null +++ b/bash_backup/beforeoptimize.pbs @@ -0,0 +1,57 @@ +#PBS -A engin_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=00:10:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-25 +#PBS -joe + +cd $PBS_O_WORKDIR + + +##setting +pressure="40" +mechanism="MFC"; +fuel_name="n_dodecane"; +equi="1"; +matlabdate="03_23_2017_1_iteration" +## + + +## access and make file + + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + + +mkdir beforeoptimize +cd beforeoptimize +## + + + +##calculate chemkin + + echo " calcultating temp ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/${PBS_ARRAYID}/${mechanism}_${fuel_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + + $CHEMKIN_BIN/chem -i ${mechanism}_base.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + + + diff --git a/bash_backup/beforeoptimize_dummy.pbs b/bash_backup/beforeoptimize_dummy.pbs new file mode 100644 index 0000000..28851ca --- /dev/null +++ b/bash_backup/beforeoptimize_dummy.pbs @@ -0,0 +1,58 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=00:10:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-25 +#PBS -joe + +cd $PBS_O_WORKDIR + + +##setting +pressure="20" +mechanism="Ra_Reitz"; +fuel_name="n_heptane"; +class_name="class2_class4_class6_moderate"; +equi="1"; +matlabdate="01_30_2017" +## + + +## access and make file + + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + + +mkdir beforeoptimize_dummy +cd beforeoptimize_dummy +## + + + +##calculate chemkin + + echo " calcultating temp ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/${PBS_ARRAYID}/${mechanism}_${fuel_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_${fuel_name}_${class_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_${class_name}.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + + + diff --git a/bash_backup/case_chemkinrun.pbs b/bash_backup/case_chemkinrun.pbs new file mode 100644 index 0000000..c2c17df --- /dev/null +++ b/bash_backup/case_chemkinrun.pbs @@ -0,0 +1,34 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-7 +#PBS -joe + +#cd $PBS_O_WORKDIR +#echo $PBS_O_WORKDIR + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} +cd modify_sensitivity_${iteration_numb}_iteration +cd class${classnumb} +cd $casenumber + + + echo " calcultating v ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify_sensitivity_${iteration_numb}_iteration/${mechanism}_${fuel_name}_class${classnumb}_v_${PBS_ARRAYID}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/$casenumber/${mechanism}_${fuel_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${classnumb}_v_${PBS_ARRAYID}.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. \ No newline at end of file diff --git a/bash_backup/copy.sh b/bash_backup/copy.sh new file mode 100644 index 0000000..f6626eb --- /dev/null +++ b/bash_backup/copy.sh @@ -0,0 +1,34 @@ +#!/bin/bash +#PBS -A engin_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=00:01:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -joe + +#cd $PBS_O_WORKDIR +#cd Ra_Reitz +# afterwards do it as a loop i=1:10 v{i}.. +#cd afteroptimize_test_40atm_phi1 +dir=$(pwd) +cd $dir +echo $dir + +for((i=1;i<=25;i++)) + do + mkdir id_$i + cd id_$i + + cp ../ck_$i/CKSoln_solution_point_value_vs_solution_number.csv ./ + cp ../ck_$i/*.inp ./ + cp ../ck_$i/*.out ./ + cp ../ck_$i/XMLdata.zip ./ + cp ../ck_$i/chem.asc ./ + cp ../ck_$i/chemkindata.dtd ./ + cd .. + + rm -rf ck_$i +done diff --git a/bash_backup/modify.pbs b/bash_backup/modify.pbs new file mode 100644 index 0000000..19cbab6 --- /dev/null +++ b/bash_backup/modify.pbs @@ -0,0 +1,86 @@ +#PBS -A engin_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=3 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 11,15,21,22,23,24,26,27,28 +#PBS -joe + +# 11,15,21,22,23,24,26,27,28 + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="40" +equi="1" +matlabdate="03_23_2017_1_iteration" +#numbOfClass=2 +#classnumb="class6" +numbOfTemp=11; +mechanism="MFC"; +file_name="${mechanism}_base.inp"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify +cd modify + +echo "running modifcation.m" +#cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${file_name} ./ +#cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +cp /scratch/engin_flux/unghee/chemkin/modification_func.m ./ + +echo $file_name + +#matlab -nodisplay -r "modification_func('${file_name}','${mechanism}','${fuel_name}')" +mkdir class${PBS_ARRAYID} +cd class${PBS_ARRAYID} + + + + +for j in $(seq 1 ${numbOfTemp}) +#for j in $(seq 1 1) +do + mkdir $j + + cd $j + + + + + + for i in {1..7} + do + echo " calcultating v $i " + mkdir ck_$i + cd ck_$i + +# cp ../$i/* ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify/${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/input/$j/${mechanism}_$fuel_name.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + done + +cd .. + +done + diff --git a/bash_backup/modify_loop.pbs b/bash_backup/modify_loop.pbs new file mode 100644 index 0000000..c813958 --- /dev/null +++ b/bash_backup/modify_loop.pbs @@ -0,0 +1,84 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=3 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 28 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_16_2017_2_iteration" +#numbOfClass=2 +#classnumb="class6" +class_name="class11_class15_class22_class24_class26_class27_class28"; +numbOfTemp=26; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify +cd modify + + + + +mkdir class${PBS_ARRAYID} +cd class${PBS_ARRAYID} + + +echo "running modifcation.m" +#cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + +#for j in $(seq 1 ${numbOfTemp}) +for j in $(seq 26 26) +do + mkdir $j + + cd $j + + + + + + for i in {1..7} + do + echo " calcultating v $i " + mkdir ck_$i + cd ck_$i + +# cp ../$i/* ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify/class${PBS_ARRAYID}/${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/input/$j/${mechanism}_$fuel_name.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + done + +cd .. + +done + diff --git a/bash_backup/modify_loop_2.pbs b/bash_backup/modify_loop_2.pbs new file mode 100644 index 0000000..c369a17 --- /dev/null +++ b/bash_backup/modify_loop_2.pbs @@ -0,0 +1,93 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=4 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-7 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_16_2017_3_iteration" +class_name="class26_class27"; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify +cd modify + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + + +for i in 11 +do + +mkdir class$i +cd class$i + + +#echo "running modifcation.m" +#cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +#cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ +#cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +#matlab -nodisplay -r modification + + + for j in $(seq 1 ${numbOfTemp}) + do +#for j in $(seq 1 1) +#for j in 11 15 21 22 23 24 26 27 28 + + mkdir $j + + cd $j + + + + + +# for ${PBS_ARRAYID} in {1..7} +# do + echo " calcultating v ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + +# cp ../$i/* ./ + #cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify/class${PBS_ARRAYID}/${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify/${mechanism}_${fuel_name}_class$i_v_${PBS_ARRAYID}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/input/$j/${mechanism}_$fuel_name.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + #$CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class$i_v_${PBS_ARRAYID}.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + +# done + done +cd .. + +done + diff --git a/bash_backup/modify_loop_matlab.pbs b/bash_backup/modify_loop_matlab.pbs new file mode 100644 index 0000000..19b39de --- /dev/null +++ b/bash_backup/modify_loop_matlab.pbs @@ -0,0 +1,51 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=3 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 11,15,21,22,23,24,26,27,28 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_23_2017_1_iteration" +#numbOfClass=2 +#classnumb="class6" +#class_name="class26_class27"; +numbOfTemp=26; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify +cd modify + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +#cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + + + +mkdir class${PBS_ARRAYID} +cd class${PBS_ARRAYID} + + + + + diff --git a/bash_backup/modify_sensitivity.pbs b/bash_backup/modify_sensitivity.pbs new file mode 100644 index 0000000..5facef0 --- /dev/null +++ b/bash_backup/modify_sensitivity.pbs @@ -0,0 +1,80 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=20:20:00,pmem=2500mb,procs=3 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 11,15,21,22,23,24,26,27,28 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_09_2017_3_iteration" +numbOfTemp=25; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity +cd modify_sensitivity + + + + +mkdir class${PBS_ARRAYID} +cd class${PBS_ARRAYID} + + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + +for j in $(seq 1 ${numbOfTemp}) +#for j in $(seq 10 10) +do + mkdir $j + + cd $j + + + + + + for i in {1..7} + do + echo " calcultating v $i " + mkdir ck_$i + cd ck_$i + +# cp ../$i/* ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify_sensitivity/class${PBS_ARRAYID}/${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/$j/${mechanism}_$fuel_name.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + done + +cd .. + +done + diff --git a/bash_backup/modify_sensitivity_2.pbs b/bash_backup/modify_sensitivity_2.pbs new file mode 100644 index 0000000..4f660d1 --- /dev/null +++ b/bash_backup/modify_sensitivity_2.pbs @@ -0,0 +1,77 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-7 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_23_2017_1_iteration" +numbOfTemp=25; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity_2 +cd modify_sensitivity_2 + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + + +for i in 23 24 +do + +mkdir class$i +cd class$i + + + + + for j in $(seq 1 ${numbOfTemp}) + do + + mkdir $j + + cd $j + + echo " calcultating v ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify_sensitivity_2/${mechanism}_${fuel_name}_class${i}_v_${PBS_ARRAYID}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/$j/${mechanism}_${fuel_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${i}_v_${PBS_ARRAYID}.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + cd .. + done + +cd .. + +done + diff --git a/bash_backup/modify_sensitivity_case.pbs b/bash_backup/modify_sensitivity_case.pbs new file mode 100644 index 0000000..7c1e5af --- /dev/null +++ b/bash_backup/modify_sensitivity_case.pbs @@ -0,0 +1,88 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=8:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-25 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR + +##setting######################### + +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="04_12_2017" +mechanism="MFC"; +iteration_numb="3"; +#class_name="class11_class15_class22_class24_class26_class27_class28"; +#file_name="${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp"; +#file_name="${mechanism}_base.inp"; +file_name="${mechanism}_afteroptimize_${iteration_numb}_iteration.inp"; +#################################### + +##count numb of iteration############## + +#cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} +#cd output/ +#numfiles=(*) +#numfiles=${#numfiles[@]} +#echo "number of iteration" +#numfiles=$(expr $numfiles) +#echo $numfiles + +##################################### + + + + + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity_${iteration_numb}_iteration +cd modify_sensitivity_${iteration_numb}_iteration + +#echo "running modifcation.m" +#cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${file_name} ./ + + +cp /scratch/engin_flux/unghee/chemkin/modification_func.m ./ +echo $file_name +matlab -nodisplay -r "modification_func('${file_name}','${mechanism}','${fuel_name}')" + + +for i in 11 15 21 22 23 24 26 27 28 +#for i in 28 +do + +mkdir class$i +cd class$i + + + mkdir ${PBS_ARRAYID} + + cd ${PBS_ARRAYID} + cp /scratch/engin_flux/unghee/chemkin/case_chemkinrun.pbs ./ + qsub -v casenumber=${PBS_ARRAYID},fuel_name=${fuel_name},pressure=${pressure},equi=${equi},matlabdate=${matlabdate},mechanism=${mechanism},classnumb=${i},iteration_numb=${iteration_numb} case_chemkinrun.pbs + cd .. + +cd .. + +done + + + +########### + +#matlab -nodisplay -r "modification_afteroptimize_github_func('${file_name}','${mechanism}','${fuel_name}','${numfiles}')" + + + + diff --git a/bash_backup/modify_sensitivity_case_past.pbs b/bash_backup/modify_sensitivity_case_past.pbs new file mode 100644 index 0000000..581d80c --- /dev/null +++ b/bash_backup/modify_sensitivity_case_past.pbs @@ -0,0 +1,74 @@ +#PBS -A engin_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-25 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_23_2017_2_iteration" +#numbOfTemp=25; +mechanism="MFC"; +class_name="class11_class15_class22_class24_class26_class27_class28"; +file_name="${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp"; +#file_name="${mechanism}_base.inp"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity_4 +cd modify_sensitivity_4 + +#echo "running modifcation.m" +#cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${file_name} ./ +#cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +#matlab -nodisplay -r modification +cp /scratch/engin_flux/unghee/chemkin/modification_func.m ./ +echo $file_name +#matlab -nodisplay -r "modification_func('${file_name}','${mechanism}','${fuel_name}')" + + +for i in 11 15 21 22 23 24 26 27 28 +#for i in 11 +do + +mkdir class$i +cd class$i + + + + +# for j in $(seq 1 ${numbOfTemp}) +# for j in $(seq 1 1) +# do + +# mkdir $j + mkdir ${PBS_ARRAYID} +# cd $j + cd ${PBS_ARRAYID} + cp /scratch/engin_flux/unghee/chemkin/case_chemkinrun.pbs ./ +# qsub -v casenumber=$j fuel_name="${fuel_name}" pressure=$pressure equi=$equi matlabdate=$matlabdate mechanism=$mechanism case_chemkinrun.pbs +# qsub -v casenumber=$j,fuel_name=\"${fuel_name}\" case_chemkinrun.pbs + qsub -v casenumber=${PBS_ARRAYID},fuel_name=${fuel_name},pressure=${pressure},equi=${equi},matlabdate=${matlabdate},mechanism=${mechanism},classnumb=${i} case_chemkinrun.pbs + cd .. +# done + +cd .. + +done + diff --git a/bash_backup/modify_sensitivity_loop.pbs b/bash_backup/modify_sensitivity_loop.pbs new file mode 100644 index 0000000..0ed797f --- /dev/null +++ b/bash_backup/modify_sensitivity_loop.pbs @@ -0,0 +1,82 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=20:20:00,pmem=2500mb,procs=3 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 11,15,21,22,23,24,26,27,28 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_16_2017_5_iteration" +numbOfTemp=25; +mechanism="MFC"; +class_name="class22_class24_class26_class27" +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity +cd modify_sensitivity + + + + +mkdir class${PBS_ARRAYID} +cd class${PBS_ARRAYID} + + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + +for j in $(seq 1 ${numbOfTemp}) +#for j in $(seq 21 21) +do + mkdir $j + + cd $j + + + + + + for i in {1..7} +# for i in 2 + do + echo " calcultating v $i " + mkdir ck_$i + cd ck_$i + +# cp ../$i/* ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify_sensitivity/class${PBS_ARRAYID}/${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/$j/${mechanism}_$fuel_name.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${PBS_ARRAYID}_v_$i.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + done + +cd .. + +done + diff --git a/bash_backup/modify_sensitivity_loop_2.pbs b/bash_backup/modify_sensitivity_loop_2.pbs new file mode 100644 index 0000000..9a72009 --- /dev/null +++ b/bash_backup/modify_sensitivity_loop_2.pbs @@ -0,0 +1,79 @@ +#PBS -A jmartz_flux +#PBS -M unghee@umich.edu +#PBS -m abe +#PBS -V +#PBS -N Ra_Reitz +#PBS -l walltime=6:20:00,pmem=2500mb,procs=1 +#PBS -l qos=flux +#PBS -q flux +#PBS -t 1-7 +#PBS -joe + + +cd $PBS_O_WORKDIR +echo $PBS_O_WORKDIR +#DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#echo $DIR + +##setting +# check matlab setting as well!! +fuel_name="n_dodecane" +pressure="20" +equi="1" +matlabdate="03_16_2017_5_iteration" +class_name="class22_class24_class26_class27"; +numbOfTemp=25; +mechanism="MFC"; +## + +cd /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate} + +mkdir modify_sensitivity_2 +cd modify_sensitivity_2 + +echo "running modifcation.m" +cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_base.inp ./ +cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/output/${mechanism}_${fuel_name}_${class_name}_afteroptimize.inp ./ +cp /scratch/engin_flux/unghee/chemkin/modification.m ./ +matlab -nodisplay -r modification + + + +for i in 23 24 +do + +mkdir class$i +cd class$i + + + + + for j in $(seq 1 ${numbOfTemp}) + do + + mkdir $j + + cd $j + + echo " calcultating v ${PBS_ARRAYID} " + mkdir ck_${PBS_ARRAYID} + cd ck_${PBS_ARRAYID} + + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/modify_sensitivity_2/${mechanism}_${fuel_name}_class${i}_v_${PBS_ARRAYID}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/${mechanism}/${fuel_name}_${pressure}atm_phi${equi}_${matlabdate}/result/$j/${mechanism}_${fuel_name}.inp ./ + cp /scratch/engin_flux/unghee/chemkin/mechanisms/${mechanism}_therm.dat ./ + cp /scratch/engin_flux/unghee/chemkin/chemkindata.dtd ./ + + $CHEMKIN_BIN/chem -i ${mechanism}_${fuel_name}_class${i}_v_${PBS_ARRAYID}.inp -o ${mechanism}_chem.out -d ${mechanism}_therm.dat + $CHEMKIN_BIN/CKReactorGenericClosed -i ${mechanism}_${fuel_name}.inp -o ${mechanism}_reg.out + $CHEMKIN_BIN/GetSolution + $CHEMKIN_BIN/CKSolnTranspose + cd .. + + cd .. + done + +cd .. + +done + diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index cca1453..2bee4ad 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_base.inp'; +filename = 'MFC_afteroptimize_2_iteration.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '03_23_2017_1_iteration'; -iteration_numb = 1; -class_numb=[11 15 22 24 26 27 28]; +date = '04_12_2017'; +iteration_numb = 3; +class_numb=[11 22 24 26 27]; % class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; @@ -179,7 +179,7 @@ class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; end % file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; -file_name=[mechanism,'_',num2str(iteration_numb),'_'class_numb_text,'_','afteroptimize','.inp']; +file_name=[mechanism,'_','afteroptimize','_',num2str(iteration_numb),'_','iteration','.inp']; fileID = fopen(file_name,'w'); output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 735763e..6924ab6 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,8 +1,8 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'03_16_2017_5_iteration'}; -fuel_sim={'modify_sensitivity'}; +date = {'04_10_2017'}; +fuel_sim={'modify_sensitivity_1_iteration'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; pressure=[20]; From 22d35e7d0bd9ae5e42ead63baf04eedfea0eaab1 Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 8 May 2017 10:46:02 -0400 Subject: [PATCH 41/47] update before finalize --- Ra_Reitz_plot_2.asv | 295 ++++++++++++++++++++++++++ Ra_Reitz_plot_2.m | 47 ++-- modification_afteroptimize_github.asv | 221 +++++++++++++++++++ modification_afteroptimize_github.m | 10 +- optimization_7_repro_multiple_2.m | 9 +- optimization_driver_2.m | 4 +- sensitivity_analysis_3.m | 116 +++++----- 7 files changed, 621 insertions(+), 81 deletions(-) create mode 100644 Ra_Reitz_plot_2.asv create mode 100644 modification_afteroptimize_github.asv diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv new file mode 100644 index 0000000..9f3f5b1 --- /dev/null +++ b/Ra_Reitz_plot_2.asv @@ -0,0 +1,295 @@ +clear all +% close all +%% Ra&Reitz +mechanism={'MFC' }; +% fuel_sim={'base','v1','v2','v3'}; + +pressure=[40]; +phi=1; +iteration_numb=2; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; + + simulation_result_beforeoptimize_text{k}=['simulation_result_beforeoptimize_',num2str(pressure(k)),'atm','_',... + 'phi','_',num2str(phi),'.mat']; + for i= 1 : length(iteration_numb) + simulation_result_afteroptimize_text{k}=['simulation_result_afteroptimize_',num2str(iteration_numb(i)),'_',... + num2str(pressure(k)),'atm','_','phi','_',num2str(phi),'.mat']; + end + fuel_sim_text = ['afteroptimize','_',num2str(iteration_numb(i))]; +end + +num_cases=25; + + +pure_component_ID; +real_fuel_ID; + +exp_markers={'ro' 'g*' 'b^'}; +sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; +marker_size=8; +line_width=2; + +i=1; %mechanism + +%% 20atm condition + +% h2=figure('position',[20 50 580 480]); +% set(gca,'Fontsize',13) +% %plot exp data +% %/4 convert to ms +% +% +% +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); +% +% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) +% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) +% +% +% +% % legend_text{2}='Vasu et al.40atm, Shock Tube'; +% % legend_text{1}='Vasu et al.20atm, Shock Tube'; +% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; +% % legend_text{1}=' '; +% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; +% % legend_text{3}='Dooley et al., RCM'; +% % legend_text{2}='Shen et al., Shock Tube'; +% %plot sim data +% +% +% +% +% hold on +% fuel_sim={'beforeoptimize'}; +% load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% k=1; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; +% legend_text{end+1}=[mechanism{i},'_','before']; +% end +% +% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue = yvalue(locs); +% hold on +% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); +% +% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); +% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); +% locsValue2 = yvalue2(locs2); +% hold on +% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); +% +% difference=abs(locsValue-Vasu_dode_20atm(:,2)); +% [minDifference,idx] = min(difference); +% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); +% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); +% +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% +% fuel_sim={'afteroptimize'}; +% k=1; +% for j=1:length(fuel_sim) +% +% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'b-','markersize',marker_size) +% % ,sim_line{j}, 'linewidth',line_width) +% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; +% +% end +% +% +% +% legend(legend_text,'location','SouthEast','interpreter','none') +% legend('boxoff') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (micros)') +% % ylim([0.1 10000]) +% % axis([0.7 1.6 0.1 10]) +% % clear legend_text +% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... +% 'String',{'n-dodecane',... +% '/Air', '\phi=1'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... +% 'String',{' 20 atm'},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +%% 40atm condition +num_cases=[26 11]; +num_cases_text = {}; +for k=1:num_cases(1) + num_cases_text=[num_cases_text ['numcases',num2str(k)]]; +end +% classnumb=[22 24 26 28]; +% numbOfClass = length(classnumb); +% class_numb_text = {}; +% for k=1:numbOfClass +% class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; +% end +for k = 1: length(pressure) + +h3=figure('position',[20 50 580 480]); +set(gca,'Fontsize',13) +clear legend_text +% % legend_text{1}='Vasu et al.40atm, Shock Tube'; +% legend_text{1}='Shen et al.40atm, Shock Tube'; +% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) + +% legend_text{1}=['ERC',pressure_text{k},'Dummy']; +% legend_text{2}=['ERC',pressure_text{k},'target(original)']; +% legend_text{3}=['ERC',pressure_text{k},'after optimize']; + +legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; + if strcmp(pressure_text{k},'P20atm') + legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + else + legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + end + +legend_text{3}=['MFC ',pressure_text{k},', after optimize']; + +% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') +% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; + +% load('simulation_result_beforeoptimize_40atm_phi_1.mat') + load(simulation_result_beforeoptimize_text{1}) + fuel_sim={'beforeoptimize'}; + + for j=1:length(fuel_sim) + semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... + 'k--','markersize',marker_size) + end + + + +% +% hold on +% +% load('simulation_result_afteroptimize_20atm_phi_1.mat') +% fuel_sim={'afteroptimize'}; +% +% for j=1:length(fuel_sim) +% semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... +% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... +% 'k--','markersize',marker_size) +% end + + + + + hold on + + + +% load('simulation_result_afteroptimize_1_40atm_phi_1.mat') + load(simulation_result_afteroptimize_text{1}) +% fuel_sim={'afteroptimize_1'}; + fuel_sim={fuel_sim_text}; + + + + semilogy(sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... + sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... + 'b','markersize',marker_size) + + + + + + +% hold on +% +% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + if strcmp(pressure_text{k},'P20atm') + semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) % pure dodecane + else + semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) + end +%% upper bound & lowerbond +% hold on +% +% +% load('simulation_result_modify_20atm_phi_1.mat') +% fuel_sim={'modify'}; +% +% +% % for j=1:length(fuel_sim) +% % for q= 1: num_cases(k) +% % semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,6),... +% % sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(num_cases_text{q}).table.data(:,10),... +% % 'bo','markersize',marker_size); +% % end +% % end +% % hold on; +% +% x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% for m = 1: length(classnumb) +% x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); +% y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(4,10); +% end +% +% end +% end +% for m = 1: length(classnumb) +% % semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); +% hold on; +% end +% x.(class_numb_text{1})=[]; y.(class_numb_text{1})=[]; +% for j=1:length(fuel_sim) +% for q= 1: num_cases(k) +% for m = 1: length(classnumb) +% x.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(1,6); +% y.(class_numb_text{m})(q)=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).(class_numb_text{m}).(num_cases_text{q}).table.data(7,10); +% end +% +% end +% end +% for m = 1: length(classnumb) +% % semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); +% hold on; +% end +%% + legend(legend_text,'location','SouthEast','interpreter','none') + legend('boxoff') + xlabel('1000/T (1/K)') + ylabel('Ignition Delay Time (micros)') + % axis([0.7 1.6 20 40000]) + % clear legend_text + annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... + 'String',{'n-dodecane',... + '/Air','class', '\phi=1'},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + annotation(h3,'textbox',[0.25 0.8 0.279 0.05],... + 'String',{pressure_text{k}},... + 'FontSize',13,... + 'FontName','Arial',... + 'FitBoxToText','off',... + 'LineStyle','none'); + + +end diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 0d1ebfb..1e5cdf5 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -4,10 +4,21 @@ mechanism={'MFC' }; % fuel_sim={'base','v1','v2','v3'}; -pressure=[20]; +pressure=[40]; +phi=1; +iteration_numb=3; for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; + + simulation_result_beforeoptimize_text{k}=['simulation_result_beforeoptimize_',num2str(pressure(k)),'atm','_',... + 'phi','_',num2str(phi),'.mat']; + for i= 1 : length(iteration_numb) + simulation_result_afteroptimize_text{k}=['simulation_result_afteroptimize_',num2str(iteration_numb(i)),'_',... + num2str(pressure(k)),'atm','_','phi','_',num2str(phi),'.mat']; + end + fuel_sim_text = ['afteroptimize','_',num2str(iteration_numb(i))]; end + num_cases=25; @@ -149,17 +160,21 @@ legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; if strcmp(pressure_text{k},'P20atm') - legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; +% legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + legend_text{3}=['exp, ',pressure_text{k},', ','target']; + else - legend_text{2}=['Shen, ',pressure_text{k},', ','target']; +% legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + legend_text{3}=['exp, ',pressure_text{k},', ','target']; end -legend_text{3}=['MFC ',pressure_text{k},', after optimize']; +legend_text{2}=['MFC ',pressure_text{k},', after optimize']; % load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') % fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; - load('simulation_result_beforeoptimize_20atm_phi_1.mat') +% load('simulation_result_beforeoptimize_40atm_phi_1.mat') + load(simulation_result_beforeoptimize_text{1}) fuel_sim={'beforeoptimize'}; for j=1:length(fuel_sim) @@ -189,8 +204,10 @@ - load('simulation_result_afteroptimize_3_20atm_phi_1.mat') - fuel_sim={'afteroptimize_3'}; +% load('simulation_result_afteroptimize_1_40atm_phi_1.mat') + load(simulation_result_afteroptimize_text{1}) +% fuel_sim={'afteroptimize_1'}; + fuel_sim={fuel_sim_text}; @@ -199,7 +216,7 @@ 'b','markersize',marker_size) - +ylim([0 10^5]); @@ -207,9 +224,15 @@ % % semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) if strcmp(pressure_text{k},'P20atm') - semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) % pure dodecane + semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5),'r^','markersize',marker_size,'markerface','r') + hold on; + semilogy(Wang_20atm(:,2),Wang_20atm(:,5),'r^','markersize',marker_size,'markerface','r') + hold on; + semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),'r^','markersize',marker_size,'markerface','r') else - semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size)% pure dodecane + semilogy(Wang_40atm(:,2),Wang_40atm(:,5),'rd','markersize',marker_size,'markerface','r') end %% upper bound & lowerbond % hold on @@ -264,8 +287,8 @@ % axis([0.7 1.6 20 40000]) % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-dodecane',... - '/Air','class', '\phi=1'},... + 'String',{'JetA',... + '/Air', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/modification_afteroptimize_github.asv b/modification_afteroptimize_github.asv new file mode 100644 index 0000000..e679170 --- /dev/null +++ b/modification_afteroptimize_github.asv @@ -0,0 +1,221 @@ + +clear all; +%% Import data from text file. +% Script for importing data from the following text file: +% +% /home/jordan/Documents/Research/matlabfolder/mech.dat +% +% To extend the code to different selected data or a different text file, +% generate a function instead of a script. + +% Auto-generated by MATLAB on 2016/08/24 17:10:49 + +%% Initialize variables. +% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; +currentFolder = pwd; +cd(pwd); +% cd mechanisms/; +% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; +filename = 'MFC_afteroptimize_1_iteration.inp'; +delimiter = ' '; + +%% Read columns of data as strings: +% For more information, see the TEXTSCAN documentation. +% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; +formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; +%% Open the text file. +fileID = fopen(filename,'r'); + +%% Read columns of data according to format string. +% This call is based on the structure of the file used to generate this +% code. If an error occurs for a different file, try regenerating the code +% from the Import Tool. +dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); + +%% Close the text file. +fclose(fileID); + +%% Convert the contents of columns containing numeric strings to numbers. +% Replace non-numeric strings with NaN. +raw = repmat({''},length(dataArray{1}),length(dataArray)-1); +for col=1:length(dataArray)-1 + raw(1:length(dataArray{col}),col) = dataArray{col}; +end +numericData = NaN(size(dataArray{1},1),size(dataArray,2)); + + +%% Split data into numeric and cell columns. +rawNumericColumns = {}; +rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); + + + %% Replace non-numeric cells with NaN + +[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); + +locationClass = [A B]; + +[rowCellNumber,] = size(rawCellColumns); + +rawCellColumns2=rawCellColumns; + +ModStart = 0; + +mechanism='MFC'; +fuel_name='n_dodecane'; +date = '04_29_2017'; +iteration_numb = 1; +class_numb=[11 15 22 24 26 27 28]; +% class_numb=classnumb; +numbOfClass = length(class_numb); +class_numb_text = {}; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; +end +pressure=[0]; +equi=1; +for k=1:length(pressure) + pressure_text{k}=[num2str(pressure(k)),'atm']; + +end +load final_result.mat + + +for i=1 : rowCellNumber + [ ~, columnCellNumber] = size(rawCellColumns(i,:)); +% for j= 1 : cellfun('length',rawCellColumns{i,:}) + for j= 1 : 1: columnCellNumber + + if strmatch('reactions',rawCellColumns{i,j})==1; + ModStart = 1; + end + + + for k = 1: numbOfClass +% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... +% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... + if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 + & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... + & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... + & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... + & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... + & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... + + rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; + + rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A + rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E + + + end + end + end +end + +%% +% datename = '01_19_2017' +% save_filename=[mechanism,'_','output','_',datename]; + + +save_filename='output'; + +for k = 1 :length(pressure) +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; +% location=[currentloc,'\',mechanism,'\',directory]; +cd(directory) + +mkdir(save_filename); +cd(save_filename); + +class_numb_text = []; +for k=1:numbOfClass +% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; +end +% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; +file_name=[mechanism,'_','afteroptimize','_',num2str(iteration_numb),'_','iteration','.inp']; +fileID = fopen(file_name,'w'); +output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); + + + + for i = 1:size(rawCellColumns2,1) + for j = 1:size(rawCellColumns2,2) + if numel(rawCellColumns2{i,j}) == 0 + output{i,j} = ''; + % Check whether the content of cell i,j is + % numeric and convert numbers to strings. + elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) + output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); + + % If the cell already contains a string, nothing has to be done. + elseif ischar(rawCellColumns2{i,j}) + output{i,j} = rawCellColumns2{i,j}; + end; + + % Cell i,j is written to the output file. A delimiter is appended for + % all but the last element of each row. At the end of a row, a newline + % is written to the output file. + if j < size(rawCellColumns2,2) + fprintf(fileID,['%s',delimiter],output{i,j}); + else + fprintf(fileID,'%s\r\n',output{i,j}); + end + end; + end; + + +fclose(fileID); + +end +% exit +%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp + +%% Clear temporary variables +% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 2bee4ad..783fd6e 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -16,7 +16,7 @@ cd(pwd); % cd mechanisms/; % filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_afteroptimize_2_iteration.inp'; +filename = 'MFC_base.inp'; delimiter = ' '; %% Read columns of data as strings: @@ -63,9 +63,9 @@ mechanism='MFC'; fuel_name='n_dodecane'; -date = '04_12_2017'; -iteration_numb = 3; -class_numb=[11 22 24 26 27]; +date = '04_29_2017'; +iteration_numb = 1; +class_numb=[11 15 22 24 26 27 28]; % class_numb=classnumb; numbOfClass = length(class_numb); class_numb_text = {}; @@ -73,7 +73,7 @@ % classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; end -pressure=[20 40]; +pressure=[20]; equi=1; for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 8c3eb47..189987a 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -13,10 +13,10 @@ %% read modification ignition delay time % mechanism={'MFC'}; mechanism={'MFC'}; -date = {'03_16_2017_1_iteration'}; -fuel_name = {'n_dodecane'}; +% date = {'03_16_2017_1_iteration'}; +% fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; -equi=1; +% equi=1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; @@ -28,7 +28,8 @@ end m = 1; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +% location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; +location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1}]; cd(location_rateParam) load rateParam.mat; clear m; diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 6924ab6..0217bdb 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,8 +1,8 @@ clear; mechanism={'MFC'}; fuel_name={'n_dodecane'}; -date = {'04_10_2017'}; -fuel_sim={'modify_sensitivity_1_iteration'}; +date = {'04_29_2017'}; +fuel_sim={'modify_sensitivity_0_iteration'}; equi = 1; classnumb=[11 15 21 22 23 24 26 27 28]; pressure=[20]; diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index 45238ce..f0208d3 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -98,61 +98,61 @@ save('sensitivity.mat','sensitivity') %% plotting -for m = 1 : numbOfPressure -for k = 1 : numbOfClass -h=figure('position',[20 50 1200 480]); -subplot(1,2,1); -set(gca,'Fontsize',13) -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); -hold on -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); -hold on -semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); - - -semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... - [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... - sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... - ,'gp','markersize',12); -hold on -semilogy(locsValue,peaks,'gp','markersize',12); -hold on -semilogy(locsValue2,-peaks2,'gp','markersize',12); - -legend('baseline','k=2','k=1','extreme points') -xlabel('1000/T (1/K)') -ylabel('Ignition Delay Time (ms)') - - - - -subplot(1,2,2); -plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); -ylim([-25 25]) -hold on -% figure -plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); - -ylim([-30 25]) -xlabel('1000/T (1/K)') -ylabel('Ignition Delay Time (ms)') -legend('ignition delay sensitivity','gradient sensitivity') - -annotation(h,'textbox',[0.213 0.38 0.279 0.05],... - 'String',{fuel_name{1},... - '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... - 'FontSize',13,... - 'FontName','Arial',... - 'FitBoxToText','off',... - 'LineStyle','none'); - -% location_save=[currentloc,'\',mechanism{1},'\',directory]; -% cd(location_save) - -mkdir('sensitivity'); -cd('sensitivity'); -saveas(h,classnumb_text{k},'fig') -saveas(h,classnumb_text{k},'jpg') -cd ../ -end -end \ No newline at end of file +% for m = 1 : numbOfPressure +% for k = 1 : numbOfClass +% h=figure('position',[20 50 1200 480]); +% subplot(1,2,1); +% set(gca,'Fontsize',13) +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:)/1000,'k-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:)/1000,'rs-','markersize',marker_size); +% hold on +% semilogy(temp,sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:)/1000,'bx-','markersize',marker_size); +% +% +% semilogy([temp_p_tempPoints_ig(1),temp_p_tempPoints_ig(end)],... +% [sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,1)/1000,... +% sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,end)/1000]... +% ,'gp','markersize',12); +% hold on +% semilogy(locsValue,peaks,'gp','markersize',12); +% hold on +% semilogy(locsValue2,-peaks2,'gp','markersize',12); +% +% legend('baseline','k=2','k=1','extreme points') +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% +% +% +% +% subplot(1,2,2); +% plot(temp_p_tempPoints_ig,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig,'k^-','markersize',marker_size); +% ylim([-25 25]) +% hold on +% % figure +% plot(temp_p_tempPoints_gr,sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr,'ko-','markersize',marker_size); +% +% ylim([-30 25]) +% xlabel('1000/T (1/K)') +% ylabel('Ignition Delay Time (ms)') +% legend('ignition delay sensitivity','gradient sensitivity') +% +% annotation(h,'textbox',[0.213 0.38 0.279 0.05],... +% 'String',{fuel_name{1},... +% '/Air',classnumb_text{k}, '\phi=1',pressure_text{m}},... +% 'FontSize',13,... +% 'FontName','Arial',... +% 'FitBoxToText','off',... +% 'LineStyle','none'); +% +% % location_save=[currentloc,'\',mechanism{1},'\',directory]; +% % cd(location_save) +% +% mkdir('sensitivity'); +% cd('sensitivity'); +% saveas(h,classnumb_text{k},'fig') +% saveas(h,classnumb_text{k},'jpg') +% cd ../ +% end +% end \ No newline at end of file From 806caf31f0cfe6aa55aa04a4dd18fdabbb60b001 Mon Sep 17 00:00:00 2001 From: JordLee Date: Mon, 8 May 2017 12:07:54 -0400 Subject: [PATCH 42/47] documentation_1 --- Ra_Reitz_load_data.m | 39 +++++ Ra_Reitz_plot_2.asv | 158 +++--------------- Ra_Reitz_plot_2.m | 177 +++------------------ chemkin_input_writer_Ra_Reitz.m | 135 ++++++++++++++++ find_rate_weighting.m | 23 ++- modification_afteroptimize_github.asv | 221 -------------------------- modification_afteroptimize_github.m | 29 ++-- optimization_7_repro_multiple_2.m | 75 ++++----- optimization_driver_2.m | 26 +-- sensitivity_analysis_3.m | 46 +++--- 10 files changed, 325 insertions(+), 604 deletions(-) create mode 100644 Ra_Reitz_load_data.m create mode 100644 chemkin_input_writer_Ra_Reitz.m delete mode 100644 modification_afteroptimize_github.asv diff --git a/Ra_Reitz_load_data.m b/Ra_Reitz_load_data.m new file mode 100644 index 0000000..3d0c7c8 --- /dev/null +++ b/Ra_Reitz_load_data.m @@ -0,0 +1,39 @@ +clear all +close all + +%% +mechanism={'MFC'}; + +fuel_sim={'afteroptimize_3'}; +fuel_name={'JetA'}; +date = {'05_03_2017'}; +equi =1; + +pressure = [40]; +for k=1:length(pressure) + pressure_text{k}=['P',num2str(pressure(k)),'atm']; +end +num_cases=25; + + +for i=1:length(mechanism) + for j=1:length(fuel_sim) + +% phi=1 simulation results + for k=1:length(pressure) + location=['C:\Users\unghee\Dropbox\post_process','\',mechanism{i},'\',fuel_name{1},'_',num2str(pressure(k)),'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{j}]; + + sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k})=read_ignition_delay(location,num_cases); + + end + + + end +end + +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(1)),'atm','_','phi',num2str(equi),'_',date{1}]; + +cd(directory); +cd(fuel_sim{1}); +filename = ['simulation_result','_',fuel_sim{1},'_',num2str(pressure(1)),'atm','_','phi','_',num2str(equi),'.mat']; +save(filename,'sim') diff --git a/Ra_Reitz_plot_2.asv b/Ra_Reitz_plot_2.asv index 9f3f5b1..331e208 100644 --- a/Ra_Reitz_plot_2.asv +++ b/Ra_Reitz_plot_2.asv @@ -1,12 +1,14 @@ clear all % close all %% Ra&Reitz + +%%%%%% setting %%%%%%%%%%%%%%%%%%%%%%%%%%% mechanism={'MFC' }; -% fuel_sim={'base','v1','v2','v3'}; pressure=[40]; phi=1; -iteration_numb=2; +iteration_numb=3; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; @@ -32,107 +34,7 @@ line_width=2; i=1; %mechanism -%% 20atm condition -% h2=figure('position',[20 50 580 480]); -% set(gca,'Fontsize',13) -% %plot exp data -% %/4 convert to ms -% -% -% -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) -% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); -% -% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) -% -% -% -% % legend_text{2}='Vasu et al.40atm, Shock Tube'; -% % legend_text{1}='Vasu et al.20atm, Shock Tube'; -% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; -% % legend_text{1}=' '; -% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; -% % legend_text{3}='Dooley et al., RCM'; -% % legend_text{2}='Shen et al., Shock Tube'; -% %plot sim data -% -% -% -% -% hold on -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% k=1; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; -% legend_text{end+1}=[mechanism{i},'_','before']; -% end -% -% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue = yvalue(locs); -% hold on -% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); -% -% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue2 = yvalue2(locs2); -% hold on -% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); -% -% difference=abs(locsValue-Vasu_dode_20atm(:,2)); -% [minDifference,idx] = min(difference); -% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); -% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); -% -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% -% fuel_sim={'afteroptimize'}; -% k=1; -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'b-','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; -% -% end -% -% -% -% legend(legend_text,'location','SouthEast','interpreter','none') -% legend('boxoff') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (micros)') -% % ylim([0.1 10000]) -% % axis([0.7 1.6 0.1 10]) -% % clear legend_text -% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... -% 'String',{'n-dodecane',... -% '/Air', '\phi=1'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... -% 'String',{' 20 atm'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -%% 40atm condition num_cases=[26 11]; num_cases_text = {}; for k=1:num_cases(1) @@ -160,17 +62,17 @@ clear legend_text legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; if strcmp(pressure_text{k},'P20atm') - legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; +% legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; + legend_text{3}=['exp, ',pressure_text{k},', ','target']; + else - legend_text{2}=['Shen, ',pressure_text{k},', ','target']; +% legend_text{2}=['Shen, ',pressure_text{k},', ','target']; + legend_text{3}=['exp, ',pressure_text{k},', ','target']; end -legend_text{3}=['MFC ',pressure_text{k},', after optimize']; +legend_text{2}=['MFC ',pressure_text{k},', after optimize']; -% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; -% load('simulation_result_beforeoptimize_40atm_phi_1.mat') load(simulation_result_beforeoptimize_text{1}) fuel_sim={'beforeoptimize'}; @@ -181,29 +83,12 @@ legend_text{3}=['MFC ',pressure_text{k},', after optimize']; end - -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% fuel_sim={'afteroptimize'}; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% end - - - - hold on -% load('simulation_result_afteroptimize_1_40atm_phi_1.mat') + load(simulation_result_afteroptimize_text{1}) -% fuel_sim={'afteroptimize_1'}; fuel_sim={fuel_sim_text}; @@ -213,19 +98,26 @@ legend_text{3}=['MFC ',pressure_text{k},', after optimize']; 'b','markersize',marker_size) - +ylim([0 10^5]); % hold on -% -% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) + if strcmp(pressure_text{k},'P20atm') - semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) % pure dodecane +% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) % pure dodecane + semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A + hold on; + semilogy(Wang_20atm(:,2),Wang_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A + hold on; + semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A else - semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size) +% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size)% pure dodecane + semilogy(Wang_40atm(:,2),Wang_40atm(:,5),'rd','markersize',marker_size,'markerface','r') % Jet A end %% upper bound & lowerbond +% The below shows the range of the variation + % hold on % % @@ -278,8 +170,8 @@ legend_text{3}=['MFC ',pressure_text{k},', after optimize']; % axis([0.7 1.6 20 40000]) % clear legend_text annotation(h3,'textbox',[0.413 0.38 0.279 0.05],... - 'String',{'n-dodecane',... - '/Air','class', '\phi=1'},... + 'String',{'JetA',... + '/Air', '\phi=1'},... 'FontSize',13,... 'FontName','Arial',... 'FitBoxToText','off',... diff --git a/Ra_Reitz_plot_2.m b/Ra_Reitz_plot_2.m index 1e5cdf5..275370d 100644 --- a/Ra_Reitz_plot_2.m +++ b/Ra_Reitz_plot_2.m @@ -1,12 +1,14 @@ clear all % close all -%% Ra&Reitz -mechanism={'MFC' }; -% fuel_sim={'base','v1','v2','v3'}; +% This function is used to plot the optimized ignition delay time results +% and compare with the target(experimental) data. +%%%%%% setting %%%%%%%%%%%%%%%%%%%%%%%%%%% +mechanism={'MFC' }; pressure=[40]; phi=1; iteration_numb=3; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; @@ -19,8 +21,7 @@ fuel_sim_text = ['afteroptimize','_',num2str(iteration_numb(i))]; end -num_cases=25; - +num_cases=25; % 25 temperature points pure_component_ID; real_fuel_ID; @@ -32,132 +33,19 @@ i=1; %mechanism -%% 20atm condition - -% h2=figure('position',[20 50 580 480]); -% set(gca,'Fontsize',13) -% %plot exp data -% %/4 convert to ms -% -% -% -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{1},'markersize',marker_size) -% semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),exp_markers{1},'markersize',marker_size); -% -% % semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),exp_markers{3},'markersize',marker_size) -% % semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% % semilogy(Shen_40atm(:,2),Shen_40atm(:,3)/1000,exp_markers{2},'markersize',marker_size) -% -% -% -% % legend_text{2}='Vasu et al.40atm, Shock Tube'; -% % legend_text{1}='Vasu et al.20atm, Shock Tube'; -% legend_text{1}='Vasu et al.20atm dodecane, Shock Tube'; -% % legend_text{1}=' '; -% % legend_text{1}='Wang and Oehlschlaeger, Shock Tube'; -% % legend_text{3}='Dooley et al., RCM'; -% % legend_text{2}='Shen et al., Shock Tube'; -% %plot sim data -% -% -% -% -% hold on -% fuel_sim={'beforeoptimize'}; -% load('simulation_result_beforeoptimize_20atm_phi_1.mat') -% k=1; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% % legend_text{end+1}=[mechanism{i},'_',fuel_sim{j}]; -% legend_text{end+1}=[mechanism{i},'_','before']; -% end -% -% [peaks,locs] = findpeaks(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue = yvalue(locs); -% hold on -% semilogy(locsValue,peaks,exp_markers{2},'markersize',marker_size); -% -% [peaks2,locs2] = findpeaks(-sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10)); -% yvalue2=sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6); -% locsValue2 = yvalue2(locs2); -% hold on -% semilogy(locsValue2,-peaks2,exp_markers{3},'markersize',marker_size); -% -% difference=abs(locsValue-Vasu_dode_20atm(:,2)); -% [minDifference,idx] = min(difference); -% yvalueLocalMinTemp = Vasu_dode_20atm(:,2); -% semilogy(yvalueLocalMinTemp(idx),-peaks2,exp_markers{3},'markersize',marker_size); -% -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% -% fuel_sim={'afteroptimize'}; -% k=1; -% for j=1:length(fuel_sim) -% -% semilogy(sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'b-','markersize',marker_size) -% % ,sim_line{j}, 'linewidth',line_width) -% legend_text{end+1}=[mechanism{i},'_',fuel_sim{j},'_','20atm']; -% -% end -% -% -% -% legend(legend_text,'location','SouthEast','interpreter','none') -% legend('boxoff') -% xlabel('1000/T (1/K)') -% ylabel('Ignition Delay Time (micros)') -% % ylim([0.1 10000]) -% % axis([0.7 1.6 0.1 10]) -% % clear legend_text -% annotation(h2,'textbox',[0.413 0.38 0.279 0.05],... -% 'String',{'n-dodecane',... -% '/Air', '\phi=1'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -% annotation(h2,'textbox',[0.25 0.8 0.279 0.05],... -% 'String',{' 20 atm'},... -% 'FontSize',13,... -% 'FontName','Arial',... -% 'FitBoxToText','off',... -% 'LineStyle','none'); -%% 40atm condition num_cases=[26 11]; num_cases_text = {}; for k=1:num_cases(1) num_cases_text=[num_cases_text ['numcases',num2str(k)]]; end -% classnumb=[22 24 26 28]; -% numbOfClass = length(classnumb); -% class_numb_text = {}; -% for k=1:numbOfClass -% class_numb_text=[class_numb_text ['class',num2str(classnumb(k))]]; -% end + for k = 1: length(pressure) h3=figure('position',[20 50 580 480]); set(gca,'Fontsize',13) clear legend_text -% % legend_text{1}='Vasu et al.40atm, Shock Tube'; -% legend_text{1}='Shen et al.40atm, Shock Tube'; -% % semilogy(Vasu_40atm(:,2),Vasu_40atm(:,5)/1000,exp_markers{2},'markersize',marker_size) -% semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),exp_markers{2},'markersize',marker_size) - -% legend_text{1}=['ERC',pressure_text{k},'Dummy']; -% legend_text{2}=['ERC',pressure_text{k},'target(original)']; -% legend_text{3}=['ERC',pressure_text{k},'after optimize']; +%% defines the legend legend_text{1}=['MFC ',pressure_text{k},', ','beforeoptimize']; if strcmp(pressure_text{k},'P20atm') % legend_text{2}=['Vasu, ',pressure_text{k},', ','target']; @@ -169,11 +57,9 @@ end legend_text{2}=['MFC ',pressure_text{k},', after optimize']; +%% loading the ignition delay times -% load('simulation_result_beforeoptimize_dummy_class2_class4_class6_moderate_20atm_phi_1.mat') -% fuel_sim={'beforeoptimize_dummy_class2_class4_class6_moderate'}; - -% load('simulation_result_beforeoptimize_40atm_phi_1.mat') +% loads the base mechanism's ignition delay time result load(simulation_result_beforeoptimize_text{1}) fuel_sim={'beforeoptimize'}; @@ -184,29 +70,11 @@ end - -% -% hold on -% -% load('simulation_result_afteroptimize_20atm_phi_1.mat') -% fuel_sim={'afteroptimize'}; -% -% for j=1:length(fuel_sim) -% semilogy(sim.(mechanism{i}).(fuel_sim{1}).(pressure_text{k}).table.data(:,6),... -% sim.(mechanism{i}).(fuel_sim{j}).(pressure_text{k}).table.data(:,10),... -% 'k--','markersize',marker_size) -% end - - - - hold on - - -% load('simulation_result_afteroptimize_1_40atm_phi_1.mat') + +% loads the optimized mechanism's ignition delay time result load(simulation_result_afteroptimize_text{1}) -% fuel_sim={'afteroptimize_1'}; fuel_sim={fuel_sim_text}; @@ -215,26 +83,27 @@ sim.(mechanism{1}).(fuel_sim{1}).(pressure_text{k}).table.data(:,10),... 'b','markersize',marker_size) - +% fixes the axes ylim([0 10^5]); - -% hold on -% -% semilogy(Shen_hep_40atm(:,2),Shen_hep_40atm(:,3),'r*','markersize',marker_size) +% loads the target(experimental data) ignition delay time result if strcmp(pressure_text{k},'P20atm') % semilogy(Vasu_dode_20atm(:,2),Vasu_dode_20atm(:,5),'r*','markersize',marker_size) % pure dodecane - semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5),'r^','markersize',marker_size,'markerface','r') + semilogy(Vasu_20atm(:,2),Vasu_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A hold on; - semilogy(Wang_20atm(:,2),Wang_20atm(:,5),'r^','markersize',marker_size,'markerface','r') + semilogy(Wang_20atm(:,2),Wang_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A hold on; - semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),'r^','markersize',marker_size,'markerface','r') + semilogy(Dooley_20atm(:,2),Dooley_20atm(:,5),'r^','markersize',marker_size,'markerface','r') % Jet A else % semilogy(Shen_dode_40atm(:,2),Shen_dode_40atm(:,5),'r*','markersize',marker_size)% pure dodecane - semilogy(Wang_40atm(:,2),Wang_40atm(:,5),'rd','markersize',marker_size,'markerface','r') + semilogy(Wang_40atm(:,2),Wang_40atm(:,5),'rd','markersize',marker_size,'markerface','r') % Jet A end %% upper bound & lowerbond +% The below shows the range of the variation. This can be use to check the +% range of ignition time when the rate parameters are varied(7 variations). + + % hold on % % @@ -279,7 +148,7 @@ % % semilogy(x.(class_numb_text{m}),y.(class_numb_text{m}),'k','markersize',marker_size,'LineWidth',1.5); % hold on; % end -%% +%% setting the position of the figure legend(legend_text,'location','SouthEast','interpreter','none') legend('boxoff') xlabel('1000/T (1/K)') diff --git a/chemkin_input_writer_Ra_Reitz.m b/chemkin_input_writer_Ra_Reitz.m new file mode 100644 index 0000000..440c119 --- /dev/null +++ b/chemkin_input_writer_Ra_Reitz.m @@ -0,0 +1,135 @@ +%% +clear all +close all + +addpath(pwd) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% change + +mechanism='MFC'; %mechanism + +fuel_name='JetA'; %surrogate fuel name + + +pressure_list=[40]; +for k=1:length(pressure_list) + pressure_text{k}=[num2str(pressure_list(k)),'atm']; + +end + +temp=700:25:1300; %K +% temp=975; +equi=1; %equivalence ratio +date = '05_03_2017'; + + + +% change +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +file_name=[mechanism,'_',fuel_name,'.inp']; + + +for k = 1:length(pressure_list) + + pressure = pressure_list(k); +directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; + +mkdir(directory) +cd(directory) + + + +mkdir('result') +cd('result') + +%% problem type definition + +problem_type='CONV'; % problem type, CONV: constant volume, solve energy equation +energy_eq='ENRG'; % ENRG, solve gas energy equation +sol='TRAN'; % Transient solver + +%% physical property +% pressure=20; %atm +% temp=700:25:1300; %K +% +% equi=1.5; %equivalence ratio + +ifac=0.1; %ignition noise filtering factor +% klim='oh'; %species maximum fraction +if strcmp(mechanism,'MFC') + klim='OH'; %species maximum fraction +elseif strcmp(mechanism,'Ra_Reitz') + klim='oh'; + +end +dtig=400; %K, ignition delay definition - the time that the ambient I increases dtig +qlos=0; %heat loss + +%% species property +if strcmp(mechanism,'MFC') +comb_product={'CO2' 'H2O' 'N2'}; +elseif strcmp(mechanism,'Ra_Reitz') +comb_product={'co2' 'h2o' 'n2'}; +end + +load_surrogate_composition +% +% %UM1 +% fuel={'nc12h26' 'hmn' 'mch' 'c6h5ch3'}; +% fuel_composition=[0.3844 0.1484 0.2336 0.2336]; %mole fraction + +% %UM2 +% fuel={'nc12h26' 'hmn' 'decalin' 'c6h5ch3'}; +% fuel_composition=[0.2897 0.1424 0.3188 0.2491]; %mole fraction + + +% fuel={'nc12h26'}; +% fuel_composition=[1]; %mole fraction + +if strcmp(fuel_name,'n_heptane') + fuel={'nc7h16'}; + fuel_composition=[1]; %mole fraction + +elseif strcmp(fuel_name,'n_dodecane') + fuel={'NC12H26'}; + fuel_composition=[1]; %mole fraction + +elseif strcmp(fuel_name,'JetA') +fuel={'NC12H26' 'HMN' 'DECALIN' 'C6H5CH3'}; +fuel_composition=[0.4706 0.1669 0.2419 0.1206]; %mole fraction +end + + +if strcmp(mechanism,'MFC') +oxidizer={'N2' 'O2'}; +elseif strcmp(mechanism,'Ra_Reitz') +oxidizer={'n2' 'o2'}; +end +oxidizer_composition=[0.79 0.21]; %mole fraction + +%% solver control +time=1; %sec + +%% + + +% mkdir(directory); +% cd(directory); +for i=1:length(temp) + dir=num2str(i); + mkdir(dir); + cd(dir); + temperature=temp(i); + write_input_file; + cd .. +end +cd .. +cd .. + + + +end + diff --git a/find_rate_weighting.m b/find_rate_weighting.m index 172d434..b1f6bf1 100644 --- a/find_rate_weighting.m +++ b/find_rate_weighting.m @@ -1,11 +1,14 @@ function differTotal = find_rate_weighting(X,coefs,Temp,numbOfClass,classnumb_text,Target_data,numbOftarget1,numbOftarget2) +%% This function automatically writes the quadratic function for defining objective function i.e. obj = (target-f(A,E)) + + differTotal= 0; timeTotal =zeros(length(Temp),1) ; time = zeros(length(Temp),numbOfClass); time_weight_differ = zeros(length(Temp),numbOfClass); for j= 1: length(Temp) - if j<=numbOftarget1 + if j<=numbOftarget1 % normalizing weighting W = 1/numbOftarget1; else W = 1/numbOftarget2; @@ -16,12 +19,10 @@ A=X(2*i-1); E=X(2*i); -% W=X(3*i); -% W=1; -% time(j,i)=coefs.(classnumb_text{i})(j,1)*log(X(2*i-1))+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... -% +coefs.(classnumb_text{i})(j,3)*X(2*i)+coefs.(classnumb_text{i})(j,4)*log(X(2*i-1))*X(2*i)... -% +coefs.(classnumb_text{i})(j,5)*(log(X(2*i-1)))^2+coefs.(classnumb_text{i})(j,6)*(X(2*i))^2; - +% W=X(3*i); % setting weight as variable +% W=1; % equal weighting + +% automatically writing the second order polynomial func. time(j,i)=coefs.(classnumb_text{i})(j,1)*log(A)+coefs.(classnumb_text{i})(j,2)*log(Temp(j))... +coefs.(classnumb_text{i})(j,3)*E+coefs.(classnumb_text{i})(j,4)*log(A)*E... +coefs.(classnumb_text{i})(j,5)*(log(A))^2+coefs.(classnumb_text{i})(j,6)*(E)^2; @@ -29,15 +30,13 @@ time_weight_differ(j,i)= W*abs(log10(Target_data(j))-log10(exp(time(j,i)))); timeTotal(j)=time_weight_differ(j,i)+timeTotal(j); % sum up class -% timeTotal(j)= time(j,i) +timeTotal(j); -% X(3*i) + end -% differ_tempj =W*abs(log10(Target_data(j))-log10(exp(timeTotal(j)))); - + differTotal = timeTotal(j) + differTotal; % sum up Temp -% differTotal = differ_tempj + differTotal; % sum up Temp + end diff --git a/modification_afteroptimize_github.asv b/modification_afteroptimize_github.asv deleted file mode 100644 index e679170..0000000 --- a/modification_afteroptimize_github.asv +++ /dev/null @@ -1,221 +0,0 @@ - -clear all; -%% Import data from text file. -% Script for importing data from the following text file: -% -% /home/jordan/Documents/Research/matlabfolder/mech.dat -% -% To extend the code to different selected data or a different text file, -% generate a function instead of a script. - -% Auto-generated by MATLAB on 2016/08/24 17:10:49 - -%% Initialize variables. -% filename = '/scratch/engin_flux/unghee/chemkin/mechanisms/mech_ERC-MultiChem+Bio_Brakora2012.inp'; -currentFolder = pwd; -cd(pwd); -% cd mechanisms/; -% filename = 'mech_ERC-MultiChem+Bio_Brakora2012_base.inp'; -filename = 'MFC_afteroptimize_1_iteration.inp'; -delimiter = ' '; - -%% Read columns of data as strings: -% For more information, see the TEXTSCAN documentation. -% formatSpec = '%s%s%s%s%s%s%s%s%s%[^\n\r]'; -formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]'; -%% Open the text file. -fileID = fopen(filename,'r'); - -%% Read columns of data according to format string. -% This call is based on the structure of the file used to generate this -% code. If an error occurs for a different file, try regenerating the code -% from the Import Tool. -dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'ReturnOnError', false); - -%% Close the text file. -fclose(fileID); - -%% Convert the contents of columns containing numeric strings to numbers. -% Replace non-numeric strings with NaN. -raw = repmat({''},length(dataArray{1}),length(dataArray)-1); -for col=1:length(dataArray)-1 - raw(1:length(dataArray{col}),col) = dataArray{col}; -end -numericData = NaN(size(dataArray{1},1),size(dataArray,2)); - - -%% Split data into numeric and cell columns. -rawNumericColumns = {}; -rawCellColumns = raw(:, [1,2,3,4,5,6,7,8,9]); - - - %% Replace non-numeric cells with NaN - -[A,B]= find(ismember(rawCellColumns,'ELEMENTS')); - -locationClass = [A B]; - -[rowCellNumber,] = size(rawCellColumns); - -rawCellColumns2=rawCellColumns; - -ModStart = 0; - -mechanism='MFC'; -fuel_name='n_dodecane'; -date = '04_29_2017'; -iteration_numb = 1; -class_numb=[11 15 22 24 26 27 28]; -% class_numb=classnumb; -numbOfClass = length(class_numb); -class_numb_text = {}; -for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; -end -pressure=[0]; -equi=1; -for k=1:length(pressure) - pressure_text{k}=[num2str(pressure(k)),'atm']; - -end -load final_result.mat - - -for i=1 : rowCellNumber - [ ~, columnCellNumber] = size(rawCellColumns(i,:)); -% for j= 1 : cellfun('length',rawCellColumns{i,:}) - for j= 1 : 1: columnCellNumber - - if strmatch('reactions',rawCellColumns{i,j})==1; - ModStart = 1; - end - - - for k = 1: numbOfClass -% if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 3 & (strfind(rawCellColumns{i,j},'nc7h16+ho2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 4 & (strfind(rawCellColumns{i,j},'nc7h16+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 5 & (strfind(rawCellColumns{i,j},'c7h15-2+o2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% | class_numb(k) == 6 & (strfind(rawCellColumns{i,j},'c7h15o2+o2=') == 1)... % n heptane erc -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... -% |(class_numb(k) == 7 & (strfind(rawCellColumns{i,j},'c7ket12=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... -% |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... - if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 - & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 21 & (strfind(rawCellColumns{i,j},'NC12H26+H=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+H=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 22 & (strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+OH=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 23 & (strfind(rawCellColumns{i,j},'NC12H26+O=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+O=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 24 & (strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'NC12H26+HO2=C12H25')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 11 & (strfind(rawCellColumns{i,j},'C12H25') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'+O2=C12H25O2')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 28 & (strfind(rawCellColumns{i,j},'C12KET') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=OH+')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 26 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'O2=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - |class_numb(k) == 15 & (strfind(rawCellColumns{i,j},'C12H25O2') ~= 0)... - & (isempty(strfind(rawCellColumns{i,j},'=C12OOH')) == 0)... - & (isempty(strfind(rawCellColumns{i,j},'-1')) == 1)... %except -1 reaction - & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-3')) == 1)... - & (isempty(strfind(rawCellColumns{i,j},'C12OOH6-9')) == 1)... - & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... - - rawCellColumns2{i,9} = ['!***ClASS',num2str(class_numb(k)),'***','after Optimize']; - - rawCellColumns2{i,2} = final_result.(class_numb_text{k})(2,1); % Optimized A - rawCellColumns2{i,4} = final_result.(class_numb_text{k})(2,2); % Optimized E - - - end - end - end -end - -%% -% datename = '01_19_2017' -% save_filename=[mechanism,'_','output','_',datename]; - - -save_filename='output'; - -for k = 1 :length(pressure) -directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; -% location=[currentloc,'\',mechanism,'\',directory]; -cd(directory) - -mkdir(save_filename); -cd(save_filename); - -class_numb_text = []; -for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; - class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; -end -% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; -file_name=[mechanism,'_','afteroptimize','_',num2str(iteration_numb),'_','iteration','.inp']; -fileID = fopen(file_name,'w'); -output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); - - - - for i = 1:size(rawCellColumns2,1) - for j = 1:size(rawCellColumns2,2) - if numel(rawCellColumns2{i,j}) == 0 - output{i,j} = ''; - % Check whether the content of cell i,j is - % numeric and convert numbers to strings. - elseif isnumeric(rawCellColumns2{i,j}) || islogical(rawCellColumns2{i,j}) - output{i,j} = num2str(rawCellColumns2{i,j}(1,1)); - - % If the cell already contains a string, nothing has to be done. - elseif ischar(rawCellColumns2{i,j}) - output{i,j} = rawCellColumns2{i,j}; - end; - - % Cell i,j is written to the output file. A delimiter is appended for - % all but the last element of each row. At the end of a row, a newline - % is written to the output file. - if j < size(rawCellColumns2,2) - fprintf(fileID,['%s',delimiter],output{i,j}); - else - fprintf(fileID,'%s\r\n',output{i,j}); - end - end; - end; - - -fclose(fileID); - -end -% exit -%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp - -%% Clear temporary variables -% clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/modification_afteroptimize_github.m b/modification_afteroptimize_github.m index 783fd6e..36557a1 100644 --- a/modification_afteroptimize_github.m +++ b/modification_afteroptimize_github.m @@ -60,21 +60,21 @@ rawCellColumns2=rawCellColumns; ModStart = 0; - +%%%%%%%%%%%%%%%%%%%%%%%% setting mechanism='MFC'; fuel_name='n_dodecane'; date = '04_29_2017'; iteration_numb = 1; -class_numb=[11 15 22 24 26 27 28]; -% class_numb=classnumb; +class_numb=[11 15 22 24 26 27 28]; % classes which have been optimized : this value should be changed manually by the user +pressure=[20]; +equi=1; +%%%%%%%%%%%%%%%%%%%%%%%% numbOfClass = length(class_numb); class_numb_text = {}; for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; class_numb_text=[class_numb_text ['class',num2str(class_numb(k))]]; end -pressure=[20]; -equi=1; + for k=1:length(pressure) pressure_text{k}=[num2str(pressure(k)),'atm']; @@ -93,6 +93,7 @@ for k = 1: numbOfClass +%% User should add if condition in order to add more classes. % if class_numb(k) == 1 & (strfind(rawCellColumns{i,j},'nc7h16+h=') == 1)... % n heptane erc % & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1)... % |(class_numb(k) == 2 & (strfind(rawCellColumns{i,j},'nc7h16+oh=') == 1)... @@ -110,7 +111,8 @@ % |(class_numb(k) == 8 & (strfind(rawCellColumns{i,j},'c5h11co=') == 1)... % & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... % |(class_numb(k) == 9 & (strfind(rawCellColumns{i,j},'c7h15-2=') == 1)... -% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +% & isempty((strfind(rawCellColumns{i},'!')) == 0)& (ModStart == 1))... +%% if class_numb(k) == 27 & (strfind(rawCellColumns{i,j},'C12OOH') ~= 0)... % n dodecane ske_361 & (isempty(strfind(rawCellColumns{i,j},'O2=C12KET')) == 0)... & (isempty(strfind(rawCellColumns{i},'!')) == 1)& (ModStart == 1)... @@ -159,15 +161,14 @@ end %% -% datename = '01_19_2017' -% save_filename=[mechanism,'_','output','_',datename]; + save_filename='output'; for k = 1 :length(pressure) directory=['C:\Users\unghee\Dropbox\post_process','\',mechanism,'\',fuel_name,'_',pressure_text{k},'_','phi',num2str(equi),'_',date]; -% location=[currentloc,'\',mechanism,'\',directory]; + cd(directory) mkdir(save_filename); @@ -175,10 +176,10 @@ class_numb_text = []; for k=1:numbOfClass -% classnumb_text{classnumb(k)}=['class',num2str(classnumb(k))]; + class_numb_text=[class_numb_text '_' ['class',num2str(class_numb(k))]]; end -% file_name=[mechanism,'_',fuel_name,class_numb_text,'_','afteroptimize','.inp']; + file_name=[mechanism,'_','afteroptimize','_',num2str(iteration_numb),'_','iteration','.inp']; fileID = fopen(file_name,'w'); output = cell(size(rawCellColumns2,1),size(rawCellColumns2,2)); @@ -214,8 +215,8 @@ fclose(fileID); end -% exit -%type mech_ERC-MultiChem+Bio_Brakora2012_v1_test.inp +% exit %this should be uncommented when running in FLUX environment + %% Clear temporary variables % clearvars filename delimiter formatSpec fileID dataArray ans raw col numericData rawCellColumns rawNumericColumns R; \ No newline at end of file diff --git a/optimization_7_repro_multiple_2.m b/optimization_7_repro_multiple_2.m index 189987a..f1a620a 100644 --- a/optimization_7_repro_multiple_2.m +++ b/optimization_7_repro_multiple_2.m @@ -1,8 +1,7 @@ -% clear all -% close all +% clear all % comment out when you want to test optimizer alone +% close all % comment out when you want to test optimizer alone -% classnumb=[15 22 26 27 28]; -% classnumb=[11 15 22 24 26 27 28]; +% classnumb=[11 15 22 24 26 27 28]; % comment out when you want to test optimizer alone numbOfClass = length(classnumb); class_numb_text = {}; for k=1:numbOfClass @@ -11,9 +10,10 @@ fuel_sim={'modify'}; %% read modification ignition delay time -% mechanism={'MFC'}; +% mechanism={'MFC'}; %comment out when you want to test optimizer alone mechanism={'MFC'}; -% date = {'03_16_2017_1_iteration'}; +%comment out when you want to test optimizer alone +% date = {'03_16_2017_1_iteration'}; % fuel_name = {'n_dodecane'}; % fuel_name = {'n_heptane'}; % equi=1; @@ -28,40 +28,41 @@ end m = 1; directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -% location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{1}]; location_rateParam=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1}]; cd(location_rateParam) load rateParam.mat; clear m; -%% exp data +%% exp data : setting target for optimization. % addpath('C:\Users\unghee\Dropbox\post_process'); % real_fuel_ID; % pure_component_ID; -% Target_fuel1 = Vasu_dode_20atm; +% Target_fuel1 = Vasu_dode_20atm; % n_dodecane optimization at 20atm. % Target_data1=Target_fuel1(:,5); % Temp1 = Target_fuel1(:,2); % numbOftarget1 =length(Target_data1); -% Target_fuel2 = Shen_dode_40atm; +% Target_fuel2 = Shen_dode_40atm; % n_dodecane optimization at 40atm. % Target_data2=Target_fuel2(:,5); % Temp2 = Target_fuel2(:,2); % numbOftarget2 =length(Target_data2); % Temp = [Temp1; Temp2]; % Target_data = [Target_data1; Target_data2]; - +%% only optimizing one pressure condition : comment out when optimizing multiple pressure condition. numbOftarget2=0; Temp = Temp1; Target_data = Target_data1; - +%% cd ../../.. A = rateParam.(class_numb_text{1})(:,1); E = rateParam.(class_numb_text{1})(:,2); %% read modification ignition delay time +% loading ignition delay times with 7 variations and save into structure format +% this will be used in the regression model part currentloc = 'C:\Users\unghee\Dropbox\post_process'; num_cases_modification= size(A,1); @@ -69,7 +70,7 @@ m=1; % pressure 20atm directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; -for j = 1: numbOftarget1 +for j = 1: numbOftarget1 for k = 1: numbOfClass location_modification=[currentloc,'\',mechanism{1},'\',directory,'\',fuel_sim{1},'\',class_numb_text{k},'\',num2str(j)]; @@ -85,6 +86,7 @@ temp_modification.(class_numb_text{k})=temp_modification.(class_numb_text{k})(:,1: numbOftarget1); end +%% comment out for only one pressure condition optimization. % m =2 ; % pressure 40atm % directory=[fuel_name{1},'_',pressure_text{m},'_','phi',num2str(equi),'_',date{1}]; % @@ -100,54 +102,53 @@ % end - - - -%% coefficient +%% coefficient : defining regression model. for j = 1 : size(Temp,1) - Temp_current = Temp(j); + Temp_current = Temp(j); % defines regression model for individual temp. for k = 1: numbOfClass time_current = time_modification.(class_numb_text{k})(:,j); - A = rateParam.(class_numb_text{k})(:,1); - E = rateParam.(class_numb_text{k})(:,2); - M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; + A = rateParam.(class_numb_text{k})(:,1); % preexponential + E = rateParam.(class_numb_text{k})(:,2); % activiation energy + M = [log(A) log(Temp_current)*ones(7,1) E log(A).*(E) log(A).*log(A) E.^2]; % form a matrix composed of 7 variation preexponential and activiation energy d = log(time_current); - coefs_inv = lsqlin(M,d); + coefs_inv = lsqlin(M,d); % by least square, define the coefficient of regression model coefs_element = coefs_inv'; - coefs.(class_numb_text{k})(j,:)=coefs_element; + coefs.(class_numb_text{k})(j,:)=coefs_element; % save into structure file + + prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; % check whether regression model matches with the target - prediction.(class_numb_text{k}){:,j}=M*coefs_element'-d; +%% commented out for plotting regression. Does not affect the optimization calculation % predictionreg.(class_numb_text{k}){:,j}=M*coefs_element'; -% plotregression(d,M*coefs_element') +% plotregression(d,M*coefs_element') %plot the regression end end -% plot regression -% +%% plot regression % for k = 1: numbOfClass % plotregression(log(time_modification.(class_numb_text{k})(:,1:10)),predictionreg.(class_numb_text{k})(1:10)) % end - - %% OPTIMIZER -% Target Temp value - numberOftempPoints = size(Target_data,1); %% objective function - ObjectiveFunction = @(X) find_rate_weighting(X,coefs,Temp,numbOfClass,class_numb_text,Target_data,numbOftarget1,numbOftarget2); LB =[]; UB =[]; +%% setting boundry values +% If User want to add more classes, they have to include additional classes +% below. Currently the boundary values are set up for erc bio fuel +% mechansim and 361kp skeletal mechanism + +% erc bio fuel mechanism % class2 if strcmp(mechanism{1},'Ra_Reitz') && ismember(2,classnumb) LB =[LB rateParam.('class2')(1,1)*0.13 0 ]; @@ -166,7 +167,7 @@ UB =[UB rateParam.('class6')(1,1)*10 rateParam.('class6')(1,2)+2000 ]; end -% ndodecane +% ndodecane 361kp skeletal mech if strcmp(mechanism{1},'MFC') && ismember(11,classnumb) LB =[LB rateParam.('class11')(1,1)*0.13 0 ]; UB =[UB rateParam.('class11')(1,1)*10 rateParam.('class11')(1,2)+2000 ]; @@ -206,15 +207,15 @@ nvars=2*numbOfClass; options=gaoptimset('PopulationSize',500); -[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); -[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); +[result_ga,Fval,exitFlag,Output] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,[],options); % save optimized rate params from ga +[result_fmin,Fval,exitFlag,Output] = fmincon(ObjectiveFunction,result_ga,[],[],[],[],LB,UB); % save optimized rate params from ga & fmincon X = result_ga; -error=ObjectiveFunction(X) +error=ObjectiveFunction(X) % outputs the error of the objective function. This shows how the predicted values deviate from the desired(target) value for i = 1 : numbOfClass -final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; +final_result.(class_numb_text{i})= [result_ga(1,2*i-1:2*i); result_fmin(1,2*i-1:2*i)]; % saves optimized value from ga,fmincon end location_save=[currentloc,'\',mechanism{1},'\',directory]; diff --git a/optimization_driver_2.m b/optimization_driver_2.m index 0217bdb..b8fa069 100644 --- a/optimization_driver_2.m +++ b/optimization_driver_2.m @@ -1,22 +1,24 @@ clear; + +%% initial setting mechanism={'MFC'}; fuel_name={'n_dodecane'}; date = {'04_29_2017'}; -fuel_sim={'modify_sensitivity_0_iteration'}; +fuel_sim={'modify_sensitivity_0_iteration'}; % change the number of iteration equi = 1; -classnumb=[11 15 21 22 23 24 26 27 28]; -pressure=[20]; +classnumb=[11 15 21 22 23 24 26 27 28]; % this value can be changed based on what mechanism use. Currently, it is set up for 361kp skeletal mech. +pressure=[20]; % add more pressure for mutiple condition optimization %% Target setting addpath('C:\Users\unghee\Dropbox\post_process'); real_fuel_ID; pure_component_ID; -Target_fuel1 = Vasu_dode_20atm; +Target_fuel1 = Vasu_dode_20atm; % n dodecane target value at 20 atm Target_data1=Target_fuel1(:,5); numbOftarget1=length(Target_data1); Temp1=Target_fuel1(:,2); -Target_fuel2 = Shen_dode_40atm; +Target_fuel2 = Shen_dode_40atm; % n dodecane target value at 40 atm Target_data2=Target_fuel2(:,5); Temp2 = Target_fuel2(:,2); numbOftarget2=length(Target_data2); @@ -26,22 +28,20 @@ %% sensitivity addpath('C:\Users\unghee\Dropbox\JPoptimization_github'); -sensitivity_analysis_3; -% sensitivity_analysis_3_modify; -% clearvars -except sensitivity classnumb classnumb_text pressure_text pressure mechanism fuel_name date fuel_sim equi +sensitivity_analysis_3; % executes sensitivity analysis m =1; disp('looking at sensitivity at one pressure condition') -class_to_optimize.(pressure_text{m}) = []; +class_to_optimize.(pressure_text{m}) = []; % saves sensitivities for pressures. for k=1:length(classnumb) - if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... - && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.38) + if (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig_avg > 1)... % thershold for translational sensitivity, user may change based on their needs + && (sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr_avg >= 0.38) % thershold for rotational sensitivity, user may change based on their needs class_to_optimize.(pressure_text{m}) = [class_to_optimize.(pressure_text{m}) classnumb(k)]; end end -classnumb = class_to_optimize.(pressure_text{m}) +classnumb = class_to_optimize.(pressure_text{m}) % classes to optimize after sensitivity analysis @@ -50,6 +50,6 @@ %% Optimization % classnumb= [26 27] clearvars -except classnumb Temp Temp1 Temp2 numberOftarget Target_data Target_data1 numbOftarget1 sensitivity pressure fuel_name equi fuel_name mechanism fuel_sim date -optimization_7_repro_multiple_2 +optimization_7_repro_multiple_2 % executes mechanism optimizer diff --git a/sensitivity_analysis_3.m b/sensitivity_analysis_3.m index f0208d3..32de71b 100644 --- a/sensitivity_analysis_3.m +++ b/sensitivity_analysis_3.m @@ -1,27 +1,33 @@ -%1. matlab peaks func -> temp ????? sensitivity data (Before,after 25temps) - 4?? -% pressure=[20 40]; +% pressure=[20 40]; % comment out for not using driver file/ numbOfPressure=length(pressure) ; for k=1:length(pressure) pressure_text{k}=['P',num2str(pressure(k)),'atm']; end -% classnumb=[1 2 3 4 5 6 7 8 9]; +% classnumb=[1 2 3 4 5 6 7 8 9]; % comment out for not using driver file numbOfClass=length(classnumb) ; for k=1:numbOfClass classnumb_text{k}=['class',num2str(classnumb(k))]; end + +%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% exp_markers={'ro' 'g*' 'g^'}; sim_line={'k-' 'k-s','k-d','k-^','k-x','k-o','k-p'}; marker_size=8; line_width=2; +% developer note +% currently it is set up to check the sensitivities at one pressure +% condition. Even performing the multiple pressure sensitivity analysis, it +% assumes that at both pressure condtions the sensitivities are similar. +% However, user may want to perform sensitivity for each pressure +% condition. The code works for it, but for the optimizier this is not +% implemented(you cannot send both sensitivities info to optimizer). and +% this does not make since, because there is only one mechanism optimized even for +% multiple pressure optimization. +% m=2 ; % pressure setting pressure for 40 atm if pressure = [20 40] - -%%%%setting%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % i=1 ; -% m=2 ; % pressure -% % j=1 ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% sensitivity analysis @@ -30,7 +36,7 @@ % fuel_name={'n_heptane'} % equi = 1; currentloc = 'C:\Users\unghee\Dropbox\post_process'; -num_cases_modification= 3; +num_cases_modification= 3; % unlike 7 variations, sensitivity analysis only need 3 variations, which is base, k=2, k =0.5 for m = 1 : numbOfPressure @@ -39,7 +45,7 @@ for j = 1: 25 location_modification=['C:\Users\unghee\Dropbox\post_process','\',mechanism{1},'\',fuel_name{1},'_',num2str(pressure(m)),... 'atm','_','phi',num2str(equi),'_',date{1},'\',fuel_sim{1},'\',classnumb_text{k},'\',num2str(j)]; - time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); + time_struct_modification=read_ignition_delay(location_modification,num_cases_modification); % load ignition time variation sensitivity.(pressure_text{m}).(classnumb_text{k}).data(:,j)=time_struct_modification.table.data(:,10); end @@ -50,24 +56,24 @@ tbase = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(1,:); % when base tk1 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(2,:); % when k = 2 tk2 = sensitivity.(pressure_text{m}).(classnumb_text{k}).data(3,:); % when k = 0.5 - d_log_tk1=diff(log10(tk1)); - d_log_tk2=diff(log10(tk2)); + d_log_tk1=diff(log10(tk1)); % difference of ignition time at proximate temps when k =2 + d_log_tk2=diff(log10(tk2)); % difference of ignition time at proximate temps when k =0.5 dh = log(h); k1 = 2; k2 = 0.5; - [peaks,locs] = findpeaks(tbase/1000); -% yvalue=tbase/1000; + [peaks,locs] = findpeaks(tbase/1000); % find two peak temp +% yvalue=tbase/1000; % when it is milisecond locsValue = temp(locs); - [peaks2,locs2] = findpeaks(-tbase/1000); -% yvalue=tbase/1000; + [peaks2,locs2] = findpeaks(-tbase/1000); % find two peak temp +% yvalue=tbase/1000; % when it is milisecond locsValue2 = temp(locs2); - p_tempPoints_ig =[1, locs2, locs, length(temp)]; + p_tempPoints_ig =[1, locs2, locs, length(temp)]; % find 4 temp points(2peak 2end point) for sensitivity analysis temp_p_tempPoints_ig=[temp(1),temp(locs2),temp(locs), temp(length(temp))]; %translational sensitivity -%change the normalize contant log10?e.x. log10^3 +% for definition, refer to Ra&Reitz,2011 CNF paper sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig = ones(1,length(p_tempPoints_ig)); for i = 1 : length(p_tempPoints_ig) sensitivity.(pressure_text{m}).(classnumb_text{k}).Sig(i)... @@ -82,7 +88,7 @@ temp_p_tempPoints_gr=[temp(locs2),temp(locs), temp(length(temp))]; sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr = ones(1,length(p_tempPoints_gr)-1); - %rotational sensitivity +%rotational sensitivity for i = 1 : length(p_tempPoints_gr)-1 sensitivity.(pressure_text{m}).(classnumb_text{k}).Sgr(i)... = 100*(d_log_tk1(p_tempPoints_gr(i))/dh - d_log_tk2(p_tempPoints_gr(i))/dh)/log10(k1/k2); @@ -97,7 +103,7 @@ save('sensitivity.mat','sensitivity') -%% plotting +%% plotting the sensitivities. Currently it is turned off for calculation speed % for m = 1 : numbOfPressure % for k = 1 : numbOfClass % h=figure('position',[20 50 1200 480]); From 5cd32dd0643dbcc574cfed70cc0a4712a8181f2c Mon Sep 17 00:00:00 2001 From: unghee Date: Mon, 7 Oct 2019 14:03:32 -0400 Subject: [PATCH 43/47] Create README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..0421da8 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# JPoptimization_github +Chemical MechanismsOptimizer5/08/2017 Jordan Lee (unghee@umich.edu)1 +#About Mechanisms Optimizer +The optimizer optimizes reaction rate parameters(pre-exponential and activation energyterms) in the selected reactions in the chemicalmechanism in Chemkin format. The optimizerruns in MATLAB framework. Chemkin homogeneous reactor simulationsare usedto calculate 0-D ignition delay time. + +# 2 Files description in the optimizer +The homogeneous reactor code in Chemkin is used. For a detailed description on this code, please refer to CHEMKIN ignition delay calculations manual. The flow chart of the entire process is as below.In whole, the optimizer is composed of sensitivity analysis sectionand From 2b3ee44b79a7da070b0e20cf31fd855158154e46 Mon Sep 17 00:00:00 2001 From: unghee Date: Mon, 7 Oct 2019 14:04:33 -0400 Subject: [PATCH 44/47] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0421da8..df1ee1a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# JPoptimization_github -Chemical MechanismsOptimizer5/08/2017 Jordan Lee (unghee@umich.edu)1 +# Chemical Mechanisms Optimizer +5/08/2017 Jordan Lee (unghee@umich.edu)1 #About Mechanisms Optimizer The optimizer optimizes reaction rate parameters(pre-exponential and activation energyterms) in the selected reactions in the chemicalmechanism in Chemkin format. The optimizerruns in MATLAB framework. Chemkin homogeneous reactor simulationsare usedto calculate 0-D ignition delay time. From 5740492fee3449592d9c273a44562b5e09385e86 Mon Sep 17 00:00:00 2001 From: unghee Date: Mon, 7 Oct 2019 14:06:11 -0400 Subject: [PATCH 45/47] Create optimizer_flow.png --- images/optimizer_flow.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 images/optimizer_flow.png diff --git a/images/optimizer_flow.png b/images/optimizer_flow.png new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/images/optimizer_flow.png @@ -0,0 +1 @@ + From 08f7d37171ea655a1f0ba443c1ed36173f850617 Mon Sep 17 00:00:00 2001 From: unghee Date: Mon, 7 Oct 2019 14:06:21 -0400 Subject: [PATCH 46/47] Add files via upload --- images/optimizer_flow.png | Bin 1 -> 972359 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/optimizer_flow.png b/images/optimizer_flow.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..dd73630f734aeaad25e1accfc430aeba18661131 100644 GIT binary patch literal 972359 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

1V=T9;V}axhuFxz+1>E;$( zjL!1?>o+VyABas0YZhW6p(v$w+ zp}L(odHWP)@;lZkrw4S0o(?PZH@3pz^|T#YtpuZEeZ-j56NiHtj3-aJ9OTLv%f7h% zKla`E|neZ3|ZWRYSJ$)yxE zGsqE9qtcIkQAzUM6@ga>FWp|4)3}guU5IgJReKiRiP3Ga-3y*wqqDtB)J(rvDx;fh zut_t>G4P%#)x$b^@He_0`t{iG(>v;V8_1-{hP|S=Vmp3S1cBe}$_MqG&$&E(FE1x) zu)|U1Y07BF1c~2`xx47N{PFWy(Z@$aoVr}8%n0p9&>dy6yONQX`b`SF^1SV991P}( z*=xCMz*A4LpP=r?I5}(ilxdV^6WLz=Xpane#>wF=)5dbNm*K)yBX1s}j7($dbDDsO zJ?P1?Zi27yE64f;Q;SVO8e<+I7TsV+&s>#4e7T!l*%2-5iSw#XR=C_?opchEpYI6w zK?NihlzW^F^)@6^kWA?sy@^PoB1Tq|JMBrZ^}+R7i#2T4^c6HQ&xB@(Y3aSZel4{( zpBt=<<)`i*P}LNnR{sB29TS2+F;(Ti-;anE@(Z^tWd3$D^P9b7=>QVB-**n|H_l@E z{{i`CjiQy8TpZKhB-uD&A9(KA>c0osctmf~p#Z!XxaD|~ytI?4?~gqlo<FI&@DOoay;{(hT_I_uj;W!O zhtYC^rXh!Am>!RLC`doA%*xC(lK3t(g9DAmDXUEE0 z6<+!SOhQ{*Jp?5RtTuxFS^8O*OV)4z#fQ*#FJf$kdm4F&l%g)rE(b&MottB&8>P#D zmP9yn5|t_Pmj(b1e#D8wj2d&22e(^7a12Ho>UtOOHE)ZXwj?ZQ+j8eH+cE7whxY1~ z4WZtHhO|`iYj;89aXVgZ!WcDA#F~erR~>C<;xmO3T*4^YFZ8&*Z;gNmZ>sdCFMls})@c@Ht{D)3I)kh3KF@CF67)F=CA)X_8=SZo3W31|zhHvEezd6<|2Mfm@l0 z7G3wNe>*29#UhR+%Pjs<;J>NXL&)^)v%a5i(ueH$ru&f$mk_+xR#yS8|ea5y4jI|*JPD<;u$1fg}ysa`DB{LPE1+R+Q!jGkuMZ{^- z*+9${LjMCf(4g3Gy6wU)QFphv(~56S72-stQT=J^1Dqsde=fYVyj5HpNo0Ql6!+!h z)XMw2U91$E-hK^chbC><3gs7g=tATT+AI; zGb{8RBEQk8yB+B-Dcw95GtwMZK|~L+jERZMr4+tln!ndR3lA7*wi6` zm08|EqAvrW+a^3P-~dMGRPYBZLS|;< z<@=;#nZg-YQ^U(PmI~@DPvQQ8r~CkuA&|{UdP5KXx`A@SiPDHHVNE@`i9pTnw>0ft zn4}mZTdcXTT7lXn^)F*TI_?_c>UzLGk-U+7=tqZ8FoiXwgI;N5ljb^N((Y+A+*K1s zYN}@*^$QAYwdigXL$pj5J`1KC2Q-CZb=-p`XLZ_)vMe$Ao1JC%F z^~&(k#Y@y6iV>Pp{97UzIrJ@IrJ?91(iG;MVJxX4FpGaV6LO%De)xyejN0v`_DMYA znS8hGYZ^UJtUVd&X*fpzO7C#jkx+yoLG%FvglY6x^!-BtA%R@#g|@cF*D?rJZVk!O zwJ6?gVWRa6MyiOFu>u|rUc`bV0`j%0D0@3G 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

g{YuGNP8n95$K)rLqw!n~;b7`sE9;Qji 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 j2=(Jh(?8xuAmaPkHsw`>u3)dV03V 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>h@@9>!Y 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

utQJx&beJUr4v2H9!}IsZOr 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%0A@#~%rOeJ?<-6FDK>KfM6{UJEe;`IaS z#OT?fQ;5-9W4Gx{{8-1ufw4h6uwSG6Bc^^vi9pOj@$=U?@%?)~T3%>?gT_yv26qG6 z=@ajKJvAA>@7N#iyB(qN0VGZDY(gJ66u&x~)XoBf$}FxEt24#WK)?qI8m%&x_U*HC+LEhJG6^4<81BdsFt{J%fE9F|*N#(lV;a_q*DlI-?0O(&lHJzcpZi8M-vz&^?m+wf7 zG<5kV-ud)>N?^sHviYsmThE%CZRp~L->PIrX$E@$l1g*^1^Q3R>2euB76;KwM}t-U zB1QzJyk&j$39B6dN5`D9lpO@4fWg<^BXv!Ofm5!1_?DG`fgX9)%WETEXt&P!V-4JzhCTWT(81T#PKMF%K6z6}RQZ#u_=$K!pZC%oi7Ss! zP17%YpW;#=4|JTkuYc3l?29&(_3J@I@e@h`W}FyIUYW9)m$YI>Qyk_S;68E;ix}U< z^6>Ie@&4X@OGq10ABVH=~EZP|a>p_KF?8r9((oBWx8{ zAIt!h9y<=dPsaa_qI%z+|rfe?I2#>5B-m8`5SMVFGIzX1+L2vO6lo(h!b?DB7Qe>Zt7v!P}zmNApiqW9h8fj+^D>V^SFn1n;(J5KmvK%_ zw7M$ZGPtkB>drg3Hr{Rjv>Z%(WSSOjc?7lvRvyW@iHpCI4bl7FAf}g^Wb+m-?>n3@ zvEzb2Gd@TbKn#RjB;`Y|QX&;4Bd;FL$aZ5gaqVZ!HzUtHbx|xg>hwlrl$M%=I=tyh z{#*mq1~Qf!#HB4$xWQYLMTVF~|C7nrg`wXu3PD<(?Z!^`TjMWWuPhtPsgz?mQj;Nw2kgAJ`oK=y!8)AS>MBzp+tk(@dpD1o=zW7J*zER0c)lzwAF z_z}2Kt9vc1G>5Cm3>_Sk1S zdh=}gzEXLh$~POry((ea9((diX9oTO0Kgb@^`y3j3vFpvFQf31sTZxeTNx{@-pbB? z{j2Y3-z-8O=xpX#T2Xxp?A;z$K;UCbHMlU&)A7bEb34_RfPI8u>BJ?T<2vMwrzWC zdBo4kG7#w=f1dksR3A(08?c2!M2QzqS8$I{@!kG!KCIvSXqH~5Tvdqqn*C}f`)E~q zuEpsG%~kTI{H9&^KY1J&c(WqM}5F*veXdbP^trB zqH~TX?Shl}=?8>?2j})lKh^*wCMD`F*cQaAo~$#tA@mMFR$%(*Kah+ecIr0t@TG!W zvMge#r@lA(Bj$WPc4BBMA@i~!0HTEu3K#@1WSMru09O%2r<5n$+5DGz{A%K8VD#pQ z{N*j4`e9FTlspK~Qj{jB|aN}AsBoqY~;vzZuoZ-2FhgB=tAYtJ~D)~{?*0HnpSu&z(SW1@oUi1s3rd4a*s3Mh-Gp`vD-~dC00IvdjS=Ld*UW{%hv4WjX;e6F_R%tR0uFa&P=?!U@(pFc%m170K*AUZ_<3BXO_ z%_fp9Ivq(h{mV{!840o1l@U3+KqpeB6bSL}NFIJy*nSqJ6^L1y8tOz%S2%f|?m1ca zT>cn8tm0aVXEUkVaXy=fXZE10#l40b0zRh;)0=lPhnpIdTU04ji=y>Y5cQjH)(DA% z^5KS-Y2Zn4B-CK!_Slp+uOyNJ4xRSZGHQV+726_0jIc;sZK$f*!8zh0c@3h zLomA=w%iL9=hFUChRQ>twF27mmxxIzg2GsI?-FagrI13IWee^D-xo2wU;D8Ja26UG zn)|fL<%KNC&4AyDOWR=sC|rDy4O-Awgs?A>UYT>dMy_rGn?+h=;8G61*QGolPbid= zih4eKawL^K=rj35VbmV|>Y`;D<)eIP2c=+i?x4Mx)=U^V@qlm>aBiQ|QodH*-rf7K zrEFRB+ZIh;Q1_YgMZt^+@~@wgU5CA_Bz-yvvs?In_tFu^QZtq9QA4R>#%qNFB1GNg zZ<$l1jMi(j1HT9g_?OcNMO{Mc?8Y&2WY2sU>+DkpSujxV>TRvu9U;$}NJ~z?)Fy?+ zT^lllwNdS@k1uGUZ=`t@{U0wcjQNIrlkeJ?wn4m%<-F#xnz8S``E*5N=wEd;Tu4n7 z>)ORk&6t#owSO*>XA}FfJ$TlNt-8JPK z8e8D_>)-emYl#+3^ux>!`qJ4|%qG-do*eDB9f`kj9RWrNFLIo~)E$;&PN zIJ5ryCeYO}g6IJ*aczVgl|bwXB=*cCjN~Dinl?Twc_39h(IdA{-xnhwgV?^jjVeu& z0UHyKW1+aUG+-d!d_DX?cWp}c#zSpGGTwFC5^qId5@f

Zr(B&X5@hXb6iPl{>nh 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

icFo`v=Xed>GQ$3^a=#^@s>0dS28E@ zk}o*J*;dg)P}lLB)KAIHzPynQkarYaX{E=`76=>nfSoZ*c&I#{{2%&<9mGC+LXTeB z*uiTAJz%!7VS@w^YIc=*RJ8ABi0h=Fx36qeEQtrh$#lQrXw5?WeG@{pH|;JHC#XMj z&5K_BV1N*TMc$6~Aso^F5j1p9>d5A@Zr$4{{&(c(-tav{Iq*XTjmAs3pqo%%Nc=`% zx)#nrbM2XT0*v(b)DNkrpYLD=TdvuwyZcZA1`B+dz$pp?4=V?AmnCsWCF1R1>jM-D zA9P`Z#j9^04(?=yF4S|xgdv$A7KQZ`?LCJ* zJAql@K<$XPeq;vLtKQ+%s@t?2Esj2Z`syq`1bUmV?41>g?gIAO86I#co;^1+G?vyI z0gkdg*!&pMDMY!aIJcwzsATlF-krevBpD(%%EQ#BMn91?1(8fZ3Gwp*L@-B@Z&sY8 z-|uWF>}z{{^B3Q&O2n5uLUL(B(9rYb8@Sv^bT!XC!{|Nt~eIS_o)H&-wT8lBB97uXwrH_p5 zq*ExB;wkvTKz@JkI z^`N^LJPZp`=TK-CxyBFkDRzhGQfRlNYS9w;Vur0}FXW7@Bge#GO~R{_5pm(?#oeVJ zpM$vuWoL(rUav$4OEW4SEd)AVBBw%6-RiY^!rsE;M!$~-oj;`n$VQqR^b%$)KJ3nJ z`~W}yr$)W*QUrz7cG-p7)Re*_H=Fii-_DE{a1(VJfEKMiIX9mbaxSr@IKqZa(%HtR z{wo3(Eoi}0Pfpd2K$tGAr7;ACv>(m_`S5;Fe3>0wK_I-|5It!6NtmXPk$`JU1ye^% z6^)%w0AudE=W&%w#}9ZsA0b*YL{_0dakiJw@O5aQ%gs3=Rr7DjV9d&5G;lqac0rWp zbX^kMh!n>}8nRo!ycuu)Rujl`)p;lsx#wZl7s&`mQSc&$fWASnl9CSASiJ|bzX!aG z+7gE}TC;~5b&ji>pQf)Ft@4|cx#~J?jg$8!dk*a(Eg}}+KqHWkEe+hy-eUh5gf%j zheZS>e(@!mJV}DuZCV}yVL6%L1w#VPC@CR%4x-3JtV8dW3_QM3opc7 ztwm7#e<0DqVm1E{;1aHF-&N8uwVZR4>1p%vLDF_+IoeQ|@Otp58y-C8!Kh?WDvd== zt?F+*r$8CJux1vN8{?qP>D>qIg*U%Qe=wju-mDokR&O?py7p6mgVXMdjZk1e?sJw? z2{r-^iB7+@97?uU3Gjq~h_KZIO=TfvEkh>U1o_|s-Rh=z{d=UEIHbE>90RS}vqqUb z6@wOQ5H7K=y8_K-C&H6w9sNO@$-TWk54m3?(8>8=oxvgu^Z}-Gv*Rx*7il0*@pzC; zYsm9&z{OeOpdk&n;%Lo&8gx`z@^OpeXxLdoLo0(xPA9n(v!wp4MDed2L##89ZjCo| zKsW8GZ6Yg|Ey|CJIc~smh#Y20yLmbeC{}cC~)21{v z5t5NuC!GK^z#pIHgRVNyN)tJr7RPv(h^#M9UC!Yf^bgLnT7W&`zhgfY9va4g#;7Ua zuXxiS2^El;dF8^FNS9+f$Oh&wW{Fz?{9Mr0{JEu4eJJm{l$b<~88_f97^2oKv@r0@ zGtKxG5UZM1XW?dMfw}H%Xr$?3D>^=8BW|cE!P6_GEa05jr>2#r5&;KuTJ$tQ znVOC@4c&e4K>Mf3KZU_w+Np12LZfSn4nQ?LIN1ahc8T8ia)=1VJ@Wi(UBi^F*{T?F z=J6t5v3~CQo+M~g0SXZN9nT~Ec0*Wk{TuoOQccdW(Wk{iupsM33|OP`HUi9U!^^CF);rX8onv8bA>g7 ztxu>F3?cGS+d&*mS#eOS6Ow`lPR*5T-7ovn1BgMe*7FK6%Ntz7BQ5u@MG^`xKhkGn4yUid=CmBSN7eBHxM+A+zmz!y1X@}uAX z{ckBo>ahFGUn!>;!8~?!K8d^Ayd%|nUHfUn%clm?Q`Agm&-`AYTbRCA`wB8pZ`US` zdpjTQnfnH<*LjowwyV7RMZzxn#VextT{}nl=M8(X4N4Orv`9_&y=D7Ij7>L7mWYX(O8N{6HT z?REU>Er)wlLaLUg+OELFWQG4xE-BvZBT>FV*G2*l<6B*cnSX{XxKzgzL6VZ1!wB<3H2-i_mq zqVbwj)&<`QgSxsl@W~nTUnzx4a&to*M#YuFffY5a{;Ql&fB~WMGi?)`s$RD7G1hVp zi4sk0W3bGIU z4Lm-6t_Um;`_U^0S1Ff~P?Fh&DtY}VdJOy)YecG^&ePLF+uEWK??PZIIu5R!mw9Pv zQu}f689<~nV0Ns=$_0#%SWw0btBL!5n24x z>^+%qL;dZCdn(ij13Qx+Z=#LU|Gw;PM1{vk2-*?Ep)k%tu(Tfhaf9CNtUdu+A>XF& zq=?iAbHvwN>4dM69JEti(oIRUXQzGzH~cOoIxB6oT~1h!6-)eiyAVmUW=AiRG=Egy zmZibj0N)k!{rghDq3yKTe#F7+BzRwtd~M#0D}vDehBX{ymT;vlXv403%_iq$vo%|s zPNC=cqY+9(mIi`HlHjRA_(h6(m0&LJN(gVEuPjT*=V6>}2jC>)Y3?>3OCMxvCN8dX z&qVQbEhukvT-OeBcur%vTPio|JdMnlzp(t(4X@MTSL;K-q5TMAXZZ_`n%l#WFOkMt zn4FK2%)geV%ZuhV0Vmb}a^U>1K5^ezPte}b7vGP?wWv2XufLyoLQ*@n@g)-$l5$EZ z0fW}s$*K|QN6W8YKL6VC>75DczS+{YyKvnALgnZUhBHm(Xh-!TSD_B23(^t6nF9wM z!NZj0h`B};TGk6&a8N&7e*J|kSd-K-Qs1Y1k*t}V zU+3i<-l=08yKlbcu(<5CIFz$mWJ@&qmRr;l)Kqem#;WUA8cJ-5RT;&3CW-!>GXs?F z8&z{@H+=Z}o4;g?u^se}DBz+U$V%;O{P3K6@cHGOWse*HR{q2Ag&tW)(uO)Fc?hX| z31#)nwl+d7ykls1m|d_XBhvBqSYc$s1&BOnTJ-5xq`PXypFs~8DVD^8n2UYtR7)+hz$GNvIty%+_A?X&R|kcv9epd!WM48OZ)HzyLUA6#Ri^k zSzdQ$fFzId$(4MeSuZe~ClWhxK5%G`*42?94I(VeVq}BEGMg3fv;TcoS0BK*E{^%B zVj|p7+ESRjtEe^p!-_swq7cQcv3IlE!|Bh=*ZXHD6Uk;t04ZoeEEeh5W+L!KG=Y|)l zjPAK8bxP>o>=BUY3p<;&Q)s<`aEi7+yD&%qSw8Ug{0g}@sy-#_BbPOqHtIe! z&!_TCROmjyY)xH`2FcJYE3tz#%wRC-)`YuBbTHO`nd@-9a&55+CG!gRvdshkbLJXD zSzwVd_=A14EOy!HQjpAerskW=M#-|^s0EZfOWry+uF%jC_)z1|64C~q&XIQiKY9>e zu96iu&@K1lEO|Q71!C3j#xNMM>WPVRYrRBH_!y>vZbgEGzv8;ykl7R#c#m#(Tg;*x8CC48v7x&7+@*&waV`gjYY7*zAENHME>)et?z9hgjb9nSi z{DEEs$L02R$-zrN@PuJ<4kLac-Am$wBBt1XOpTK5(!U)Csi@3AQG#tpumPswr^Ei2 zxfUJ^t))0dRnBgJ0Y8sNBG=1+Yn9KM6L>75;VbYva$}T|2y)pZh}xSo_S4+sH%cZHCPgAkEuXCtZx!aZ52Kt*K=m~?&^nwH_JkT$J&Gj`77?7B!Rfs zcDez@cE-r~ggK^o`}en*e;Ev=p`v?u(_<&HfAa9Ot4gG%cQZkW;qIIY-JR!A)`PHp zv7{Xt%7n{b%NJ((gn84;UWFi?rBL!9p+YF(;(PERIqiu0#K)h4t?A2HtMpA4YFpSE zIql68LHz|JJFZ{z0hr9%i)o1Z5od5%dRgSWvT~yXV@b5do=-u|sTL%QDarM77t9t7 z-r=d?HikUWUg1P!jMM+hPyBA#)sFfY&^6-R;j?w}w!&;S4(~j6!t?}ewbr*NPuHUj zly$=Tu~R{%o2|GxxwI2jVUx-c9@%CmaRx_5G=C5P^!IryI&>epVbTHxB@SClI03C@ zf_^L)S{agwNghMqEG5+c&Kt^GcFw)Bo(1}2TxZ{pcNB}b3~tr~6Kx$G3?01Tvi{LJ z=G7j)33=b~;X}L*mG(IyE9`OyD~9?6A7c?@*9RVXzfE>?jjObEAdDh=vx6@70wl47 ztkM(=wwJ#*loySnSsz@%wtI~E3@_AzTt-HVQMO;d{zx;r^p*b*z6UteR1ZIEcI($W zC834Q&CSx|d-Vj;KMg{>z03>h?+1bxfq`J?TTnKYdWl3LacpmOESJu%RONBi##}*a z)Kbo!W0G17i||WYO4=f}ftW-z9QZ&lhYlG=&PE{@_;6{J7-jx7I{ZJj_?Cz7Km1dH zo4NfsSo!kQNzHkDWM}0a{plc5?a31v%Q<8xI-kyJN&v)Z2&5BG1aa);B41UcSYX;L z8Ut-NsCl_s@&SjV%8l0^OSdXa+Ub?Bvn!V6f^`v@Nyq&xwdGPmB4FC=rjs9z#1;<| z7Mu$pwI|3M{@9WAA335-A5huT`7&vro395fpx5Vr9SA*&e%RNW+F;uRx}lc%I#M=+ zkzFfB&7a~T-SDFEI-EPY zFj@q7FAvpC_Zm0}cCbV&iA-4njGPFJKSZ0$UM+uV``uCW&+UfkyBh(Z{ZEuvTLv4M zE_%L<_@ZfA`Cx7?Ev|-5zO-DN+K1&rA(va+jpYjsUR6kBm#7A4--C8z9#H??KTtLW zNG+|bI1D@ATFLC<>8~CT|?lf)KlW{Y;OGO)#t5WFMBrb+6?F( z6mxy!ZKKmXV5{$4#^nFlZA_%>F;V)(P**s-nxOJH3bKoqAHm*xVPB*h;;yKMkdEQ z&_oP{o!eS9#!H=z(*f$3`avBto<$#ajSaUf-=@DM;M9_O$DV(UiX@0fhr{I5s&#~% z52h->TuKA_QXm5l-jzuSmcLv5_d!!s(mOKrl$(i&E5@vO*qYW7s;p+XaGZ(Mt1oR| zCSoShdoDsU8Fa87xi~02?wv{HH=&)W5^!wZ2V6OqN|esrk=WkloCde-EWkfR=(_+vplbd z{olN}?u=VkClmc6dudIE&DX*g+7$GTu`Yl`fv!`C4!Is+#AQw!k$|vFR3t^}k z9ico|HTM%bV(U5$MTmv3x={376J37sKb$*sq1g@uw_NFMeYZb#|x^WU>jUJYN{uq^LlWspC$Yr zGWx+K(sq5c$29r1!0g1reD6A8d|92H%JpPVWQ2z%1;;-*>F?&0fOo_B=}o!sdDth@ zx*wqrW#f9V@Td+9+J@AhL$+{OQXUkp`CP%rCMdS(aZvr;Oz-zQ>My|7WZVsa%w?Fi zb^*XnBC@B5Gu&J(7K@9~hFtMpIJ=#8rT>8NaB(oEaZg?l2 zs47l=Wso!?6^o>m=gFkWt2HFvCM|5o4P>%jvaBbP7SPOp%13C?n_rDcX{@=6-T9GY z>RY8r2i))m#2EbS25r{2RrjzNqf#9>WzG@&*4}5h34%Z*UhI zV}e8pN9pNlfh;walWV2R2+ojQEk)$@(-EXm_2%p3-)e?lHW4xPX0d0$F!ARjZw&?E z?`-)`+O2XBNf=trxt4bNWPg$1Y~yR60oo0LW>Dvy!5ZR@HqTLoY^YI>+ych`fx5nqJlk0;CNqtBQMH#tg19*3mu$+LtLe_YN5-H+E?#oB0i#2|}whCrYRKWdEdIBI#LD`dD!-?bU=JSSb8tf(KC< z+cC(0#owu)`m7!C)W2Xfva|Ft-curOd~D{~(?cfsuOILHD3D| z@#?m%s!bIV$NG;*$!qp8GF%3q9+sC!K;LVQ3feLlQ|YTB1yy=YcsW845$=aw*(pB@T=BZd)J~K zAAn)=%}SE0--;3?!@DBYxiz+QM*T<+k80adubcV!)_t+~NFLt6Zcmzj3n_>cEQ#;f z_>Q+=OMd+@&q9sUku*$^n0MZYw6iUu91Gfx`DzSj*tZaw-VdrupHCkz=3f&cJ_$G) zy#uZWr?Ig zPy0KB&*|n3TvD7WcEizx2a{LZmBk4>E{Ndyciqh71tA%v_=uZg3oOsOB+Ra3f61U& z+l-z|&Jqn89~rDdcp_>;JW66h$lBkd&b+1+eRaEyoKL8wTZgL{SbC+0 z3fn55eX4+~u=~PkF%gqXBHPcrGquY|FdD>S< zn1~Ik{inSQrO4Yz3!SEVK6kJ`?)H{`#37cqTW_7_?+F+JX|JJc;qHw0xU(x!X_KY1lA_A+&JC>j zQ`N+HY#(!7#gd^fcwG$qnSJ}8WP@?@i?eOzcf*adva*Qd${ibe<9d6~hu0W1?+@ci zwh-ZjUw5#3M{e^p6D|q1wWc~C(yowVE(aZ-H2QO{mQv-J??Dbyh3g4hTE;%UtWa%AX5-(bpsFp`MhW|>@bp8c&jeEMbk+|9Z9vHSQ~#Ldy5+phPJt-T^% zd@>`+So)z7rc{^pEHlGlP3l$8MO5T6pBNN>uS^ zylvL5((_}c(^zBx&c;!>uiYv`kV*b$%}_v1mk+}}9zNZ@_5#J}LCg{3!R`y~l2%Dn zNvvO9tHCOZnA@m!JP9Gz>K=a8%Z^X#Y?s5^dHi1-iDK5h5Tko;R%)T++#To*KcX)J zos~H_cC$8O*__sIx%1aXF@}QL(~{2KX#M%O@kO9P?DN&G&shm&<+KY|?uHwkuA1m- zvko78tjl`1zW1bS=)WA5TZsD_Ypi#VF@4SsuQ8gfo^@efW_v!s9<9+X8t-;W;6(PN z>a_>uH5G(+nQ58Cu}9K~-)2#a+SV1rY_1@8OzhdFZ;k_GCfSBu^)64`phP4k8)UvR zqA^cT8F`eC;H{FYv|_sexu1^BztqQ|-~m9}{>5u*zbvSzI0$pkH;2^|v6_*3B-WMX zkBi31YvFJ|sgK+BTpf=daVwU9XeL_SHoKEF9rHCp$K3N^SFhCc{+@{K6V`^;PN{4y1>9z@s{sBCS{&HM^+)1u69|}4Ok9S3)riraX1^E0DvvPh0G#c5 ze(d|62uffVrHG0^yU!LhzlqQEh)BL7+Gm%PYN&6Hb%U#g%D6kybVb{m)(Wvhl)MP{+o-&saq6yJVaT93dHjitw0x^JaZHu0p|B<~H}0Hwf# zEuzaEYc=_?Z*#e2RNi+W6U%X}m~YxWvB%8BpK(Q_Bw4pR2(6un=+=r%D`PC+suP0M za!>hQ7wr!&9*s~tVea>Y3SZeSHnVD2qhovPk1tUj(&Hcmd6SxIb9uR~Bt9Hx1J!zD z|LhLhduFE5D8-klvZA&BT-QeZtY%{F*%pAOD^i-Zm@Cq*r>oW@ zipQBZsgXqga}eh%C`BIENmeGJAx+B7(uo4wK(Rqi?)ul7-50D)c(FIE!IjHGMrz*} z>a#ag3BDwNq6ExP2bP!CrdB!iZ<4h%x))Jj60RB_V?z~r7_&7#ZmWSgHfYtrhKH9% z(lkgx<3?^;#eInT)t&EjS!Z{M8sP@Y`&FN7+n`?IttMT$W2&1f#sbNN>+I;Wj->du z_GwVHNG^tj6K3PRpl*lXA6{X3mQ${}Fnc2UfDvfDOul7(A2wFOrmSvDv+X!qDirb3 zMZP{ktp@A|7Q)B9kKZsg6O+G*MAbO%_B$iVC10@K=_&UqYf*I#Nv}YygVlCBJ1p5O z@;NbANul`63=TX_QQUjH=dpi1rNFWztP{Ik-xM1swSK7FzUrp&Gx8^zJJw@XDTK6qWFnIf@|TJ2)$=vhLxz@w zzSLCmf@Ie*c08ih7GS8^WUiCIb?=CPqHLWO$Gx7L?+|h>ylnr7z8fn#zt8?Ha#G~$eKY+*i?9P0JyQ{w~~`?#aE=rk{FoRthP-YA-00Y${K01c7-u2 zPL2BCH}*tZors_A=T639`kyAY)=d}nWwLCs4A<@pd2;j4yD!AwcP}T7Z>}3B|F)6- z9h8HJk1sv`CBQXfMHO2)&kF7r@{R%aOzQ`+KqbdL^p24d&8DM1xN`?>ul4#WYEH#cDSDyuV4Qr*&!{usb4&2{WYs`iXWDS`13^9w_sOqJnE3}^w2F^?C}j{ z);`r|190p5l;MmX9<98+3Z8s-U)L{fNKs!VrYMvP@h@k7!2iKE{as}*%sk&~AoZC~ zy5w3DzzN{qEkyL>!dGGkl6!7^$)$8t+8%X@|4R&w$Ezz)go1MLnm5{tyghSYZg4GI@5TPRcAOZ z$*XQ{&q=s#`aq~zn>O0-{xBmj#cNkXqJ{A40KI5jxf#0Q?-Z}~N3<}pwjCLu#Akm! zw>c)L#Q?dLUqe3O=<0X!dUVU%p_<&tkqNm<Ph*7jWJiW3}8Wutpppuyk)<04nFTL=63%O(#WpjaI@T^|tQ-2)6|CvMw^K)a1pH?|r&FW>0*HVB zPhUUiXFjomxcS5=;x_rWm4w_t<1a}KWvCzMr;0_~Nabo1?cYrNUV2q|C)KnD8fcx4 zWiQVQw>ZKB^`ux2UCVyEzPY%JK+@rKk;ewUHOSe4VuFEp^ObGU)zN9uuCzNteHfJa zhVP0TviJx3ekHWuDkZ}wT!>R=#|#@wSO$m*z1?HE@xuN z3eIQXqO-<^eg_!NR_o{fgnv*khB&$#+%-~~-mIEIgYJmvulUt;t7N`jpgBZo=_j!w zC)@fkiu}*37X})~#K*s;`5q}vsW2~pJ*7N;QrmD1+IH)>gqDz)p(ofAcI*YVz@@8~ zsZ)EDax!5!#ba{Lk^_oj$$MKQ^SIH*%=;>iR?HqCx2s#l8{Az&OK$b-v<--+6pj5C zN4x9VBS(r@QG8U|-rhO&`N9`tX`>NeXADvt;X1wjV5fWI?cP0K0ule2@@nFu_jQnD zP2T%!?W{yU$nx(YPqEt!(8pf9Y(zTiRL_GY_>oVIVkQ^7D!|?GP!(9`Zg98k%6XhI z@8;dQ>37*!+X|}qbU&}pJO8BV)`s_ScN^XRwT;Q>rv?35N{UZu4`%g5=$GAW%9!wE zBy0tou8fkjW3RA~W&7Do_k{&FuOEX*M}yOQB9^%Ki^!44Jdo|V+fI76#Yr0uD14@q zdF{EF_YL!(rC$<94PShG2Jv)9mwL~-)?~rdB+xVYj;4O=m%3SMDG$>-Hs$Qx9m?oi z5zI+{TnsV^V*l17)7R7sT@ob3zJ<79Q@^Wki)bZS)F|1u!%jD#x%WYbN$=-s z^hq#s$j-Q(;mt57nqO^Zu?j0nAPQ$ims`-gFetaMsy~XfnX5EwD?pyE{JsE>$Ettp znKW!IFiWngV^6fm=Dq?pYy4>XV}bSPEqB+@!xfySDEA2jru2SYXSptG&%Bv?d`nRC zJNLLAKbcBoiNGkrRXAq<|FQR-VNIX=-*7kw+hYK09bpBnQU?MCL^g=D4p2Z)_D~`q zgcaEYf|d#@5Uk1&kbr{7mK|nLMpQyD?k{}9n{nM{Ez2qdfuMv@>Q#M z?%)00>+|JNvlntzt{Oh|WQ1Wj;}7Qn17bMf;U z<}lVciI87GehE~Ta7S&0t3z`{s4VJhS3 zH#$0d;^J*gbE_4k6Mna?Ms=bVFjkU+&dweEjh`slf?4@Cf1)JKH;IpUX7Cr`$880G zn6GI~&j>&PWI}+ZniotKYTD8mxCYuMR&yVC7U>(=$Q17DUO*bM?R%NIFBploGydup z9%#GewSFL~1#3E50>#&?$vkuOycG*z8%F7~A+$P}Zo zAR8vZ-F&M37NW+Ssoa!8mI2X3udb=pN|0+M%}r>kaMfPg%$>2@r^2VKk#=PMU* zxnjLiR<==Y`sYYi?*tlwnmSkLP}{F-PzOzg3I!Mz(jINCXfY|{JkPsSDcv(M$)fcz zEQ4xHfTC9sVFHvy$s^7-s@lWba)6HFHIN&oT3CC&m4y+?o{tf!%6jg@nYHVVyL{W; zC~Du*mE02u?(hZ?t)ID)_peqcfsYIVDfsYVtzrwY7#Y+c3&|2 z``ic1D~O)#(t$^Y8W@BL8_M=cz>N2GkFHv9qqjEX8MgdfrblKQS{r=&QieC=q4`G_ zYJ;X{ai}+?{yM>XmR2A4S=8|dRNn(XM7EXi5QI+4>h1QQpJIcgJ{{n4j zHjG7;NyrpNMwAn~uK%XrA^h@3j|6KTIn&>MBxf@NzdY+jW2%(%xEQ`t`s13tsdf1U z6>*_~!rH-o3EnH%J|mO}vN&I(X5Fpf{ctVX!dBt7uA~w&FqF9AS%?zfxc(R2b-Xd;{;cfGdfQCsYMv& ze)RA$i?-^;7g9G%`ri9UIrTP|=kI(nN=aX9r1*Ed8T7%LEFq>RseI)b`C=JQ<0!{B zjdTLfzH0ee+ld(QHHij}L5qE6GZA^@NaCumiMuTYk=%{VUz}a6^bFtgJ*bbmvBItN ze+FI?Fq|=D)I5E-nSyi&4#Q)m!T>~0n4IgR+_IPaAnOwp;%)uD-13(a_tcbI>r z1WLnPUHK?oT|4LOd}h_$xrf+v+8>Oj$oYFkgP!SXgziI=fP!1GztKW=42*O2R{1e3 zhOnBRvR`*!DZBniyPT9b>gN-IbO5w#aAR!ceV-lpKE|7};MO<9ox`=gB0uW*YJ8}* z`Ibe4cViz~ZMcNs<9?6Nfbcy<;)qD#)|dIch8YakG!wntJCmM}GmKb-{=*9$MJu4p zy^4#sWA=yW@gkR}op4{A(fI&>B&#A$cai)pNRB#sO^|aa(&(-SlBm z;!oK?ye`Cfe6JK~Ne1y3Z{o$F%Kf+Sph&lnmF5x3?zRf!EY5IZI)U9{*1Wco=+Io8 zu@O3FA>QMGUt5xshnN}$g9!Q4w!P1imw`+7E8^V|+&?z+Y4aI}1M_XZ)qm3ragTcb zIMc~yp7(CbacwYveDNp>2y%fbjj3~FgYTKiA~NY~k_>I&+mL zM{cddn$+I?@|qR>YoZ_#0B87Wy+pIibTD$UuM2-VfJ0L7~ViAu_0Czo0ie81$ zU%?dyPpBm87+b&!mt5XrSp?`It#_b9K?ZXa%kaU5O*`kf(`|U%MT7f3{pgkjPH>CI zpS0hI0h+?6`|gIs{5AFx(UX*T8ni`7!?2~DIanRQbx~tc3JC`kG^m8AnSC4iMs4h^<3JBIG`n--3;m`(EO<}M*75v}7eVl+ z<)u?px6l<3XJJ9~v(sF&&YH09xVU_0vD)9`6#J}bS-}+92IL!GhfFDN5UFF$rn~al z22WUbz^^6&=lQEGn*XkH`cSyg?||z!{ey#pAZr{ono_bU8)t5XdviI>Wh}^X@OF#* zvwnfD9{r0hAO;QvodK9vvs8GpOjbU!#;!SDqqmBvaUpdND4UjIbG6rh1jA?>pEt#U zzPGmacQcEqh%~Htn+U*ACM8tP(`c%~ERdY5&VV-r+7Q;=h?XlsObHm#c%o>h-I!Ws zH>0EA_duB4LD*9;`B|JYHpD3tfO-D;=s-ino?%J_4ERrr&a2Oc5-&YTZ%V6zp0Mc* ze(IGs48{r;8h()@*5~a;=OaUEuzj(cP-;%M(G#oRt-Q|H7iu zfmYK^HUXAdfuSlTJ?Z9D4Nx}uY`8q52i5bQP4!YWj&!GZY}2PBclbTju%OWbT9@R8 z5;C2#w$X3F0YyQV3mu=1c-*Zh_kJ*OH7U6Ll@`hQ_t3~^4I9`(KMsu8K{ik7^bRQU z6ZwMTNJop*FXlm0;ZP~nfTznm;=YY2lbGBAaxL>HZ>^tHVAV~#mZ693I~@hwOSWRk zz46+OTbcq3ps7;0?+gmZs9SkfjN;jo)((8F7!LcSQvqVENX&C`CAqRz*Z}yII~&}H z_;)oha#T@6jd5Gw3B(yF6=`+6e z=oe(!7{jy~{wZsfQo{0FvVG4wd{P#+2X{WGKnVAb%n5$nk$I__c)OV`r9};@21ak){%P4NWAm?wJH2vXhz^feJwP^(k4>9!NCk9&x!7l z5O#{s!thC1LM-V5nk5hBYrD9iE9YJ@@Kv*3SqN$=Fc2t|jySU8&M@6Wldh#6AQ_|G zPEGVG)1`(wNL;jE?mH(dMF1Ix1w&lGE3{%y=;WGF(E5e)zB~Bxoiek+)=a+xzh~>B zeXLNGzYR`SKD+D#Xnj82*}1;fO;b4B1%TS;)|M3-%pOH)XPfh{!|G{4qe zFVCP3-M1&dzdKB%=hSX;5fNjS8r2RHW#VeExti<#8b2BtYPT!rxMv}XyxN(w4Q%c4 z0Vo-_TfY45eIH-Qtr(i`Yc7f-fvd3d2up~UzVL!ASr`-@=tW%0or4maNN0k)WLg5( zo7Sp-%JZ6FduDdqC;TxJdnH+{En!cl+kNy{>_nmGg+!W)qb4LI-KkgYERLZ}?=LgJmls`z-xbC8N? zroVhqts=}l5pNffQ>*Aw%hJdbGM4~-b7&d`)D;Q}EzSF`9TZ*U6;G|{iC{6;$`~bb?vGeT z2U6k!m7ToGX$M0jgR_kot$mEuooD-oRp-S+(k^_#xbZ}~{KL(w(&Hcvw(&*GuMQt< z#2jDt)6ut-62LXr<%uq2LdfI@s2lKN3YR z#Cq%uH;s)VZwr^pg7l@-z)n*#&6$BIM~*C%wllhBK^eE55jaa9Zl^GScGX9t;kvBQhiE{sd<@DNVmaMOC2Q4d!!NohsBeJqoRZ!!=m1;X(M7C273jeMBy9TKdUi&1uZXGj|)@HeGXpe>vqeiJ_IF=4*GstkisR@|5wyDnumwWdddIXS0OH>sf$fTRy2JqlZCH7;xo zS`z$19>P7m0|5*04D{{^n!`i4$Ph2p^i)#ej+$k4M;Ej(v}M#Qw5C1r4Oe|_snYMI zjzf&Pzs=fZKnt`Yl`zqK4tS``87~pnR@KQ-B*5+5zm9IU7w=#~if> z#>zUNCKPmu7hK5VE-&``EV`JH33P_;`D*7#n{{{PCn~l)Q)Zh*O3=Qd(XO9GvRbZe zjmIcx`363;Spv#VR%%Zc)4pN$=z^8W*C$i|Zxv_n0bw!GK9Sl(hsZfltlDMOn`O_y z2y8Ng%i>rNi=l^XZNa*|Y}B7O4~BPnediW8jOU?$M+XE{gq0TqER7ur0H*~hVppQS zVjADUL;cR@LoeSgABEX@O${r>!D5d+?JdYtZ{wN7eTOsJf?TRP^p zQ5^?USo8cyWrqo`Z>E997KahDC9%3K29<1 z{W?a)zfnRThq1nn!SjE+l0OZ${qJY~_h|p)w69`U{ZDTGr))M};E!Wp|5KfxhST{{ zof)xQfZmY`W|FmP!`3ljPgXJ)huI_=Xbn1jw|&D)?PORKrViy?{PC55K#$z%pY+bx zg>ugUU$|OV4uG+nvTO_Yx`KT-e>Q1l*l~I|jG(I@-vk=^@9llaoJ(*_IrtY(0t57> zvu>CL8(leteWy)HZs0N#k$l+o3@|g4kTKp3y_svn0>x}&@L|TlHCZ(Q`)lZ#I19p* z{+xlj)#YT~y!G0QMy=u+Ok%xeZZ>}dY^15dzcByVfB)GjjshHY z0BmBcT?gQL9M{h@6mNRP=$w+YGmT-y?OnaYMb!;f=pqy#pYC0QVL6^#2b1*hMFGSRf3)bB_g|22mvnL*yc zsQvP;?tg*k|6;}zActK!5@fm4%e(mqb|%2K2ifc(6=ABI5je~3!hiGT`@mUcIsb*Q zCxNQYUF!?9VA<2Ue6)n^eaORTRVi#fX4}S79Qir_4VA%J8Rp%1`_mm_f4-oiaC)B# zY-A0jHmdbvv*IxRr{nBr(>q9t={#k#82q?{{XQfZ?ecGc702P@rfUcY?$v>z)Y&|4|oa)g{ z2KW0qUe>?y@G|a607$2$nXyhDIObM5=+4&xsRLHQy-ec71+8^prE-M4jhjfs1$@u0 z9%wVjdZ;e@5f`wlTU%@q^&c*263`sa_1h7^(5>YZf}T5!9yagdjEJEH7*xk`oB7S6L;YVS=Z+(wQ-x8 zXL_%>ReDw<_70(MxKXrw%1Q?+71S#lt6=Rek<_q?Ug0dR$LpZ|J+k&EJtUjhPymr2 zb!0)!H8eU!4lz76q`HrI_Cz0r{_#;d0OstUp7pd<-m=9Tn=P3(&w{K?*JAFf+MV*sO(L9kiTNW`^F%^%kh5i$5l&A0d;L0>yq9q=t zT3uPFDf~VaZQMOTJvN{=-3$?d$(4sr`a|(`BKDL=|F9ia2wgL5^og@?sElaeeo1wz z`q@CDg0@)GJhg+S9AAA|EntdnSP)QDOLu>quC#Er1=$NN(lsbVn5(Y!H3AbF&&SZ) zUEhxSYZMcStCHkO^Kd7#2wxca%0;?5Kp!%cez&wSBvkf&tW|J9Ws^y7^z{a^#I$y` zjn;y2`zDv+TvAJEFN+ODc^=R?c|wSxabZIHf{&pPidN{ZwV{)J&zKMC(#u&-g<;%*pr=h`N&sT%ITtk@v#M#)lQy$EVJaDU#m~sH z$>rW_orjK0ps!x@(Y|zA!zjsY%ZD_!snHWMQciBd(mRnh z+rr=3RL?E%puZpTL|sES&u95dHRFgF4_W)Li68}qOT)Ge13vGpb$F83QOuVGkx+lH zjNUSysqbkBTF%|ppN5u6c|XwhEj<#=z3Yf8le(&@TD64mdN=ZJYBg28 zv6dW^=R6^VLTDG0^kvzwgSDwq5^AZjk(Mrn3|a8(Vsl3)5~Y^scUC_1BjbUoJYF2PqfA$3n7YV9^X zd2UVoH{b!tEAwN|GG3>VRK>&|Z@Sccu^Z$snK0!wuN79d{t>$94xG~5(FjB{BLwI{ z&&p2F=<6?ZAuF$8KroMO-F%aNizJyzyh$ZF4z`QfJ*2ou z%-A)V#7h4n7($-iOSvGPqUBEjFpwk}RVTaShs;7^cJ82{Z#QU6MM&%Jqy$VI8-z0? zxRrAn32(YWx3dNZ*%ia)#It>#M5?w)u*bb%%$g6C^dyBywN%SPNEvElCsOrG5HdhX z^a+=H+|*T6P)StqPgPP?Vx<46F<%s$ z>yZ_>3QsF7ovNhzyqeh6H<(6xLBe{pUVPJQ5741|nOdBA7heW(sNnjno>X!f`8%#G zwt|WP&+&fFQmVu4io3_KR210)J=7bE;Ji}L@5%Q=M6N|Zw`wgUM&Xh*?gvg*PTv#8 z(&2=Zz1XFG^+QEBF zOkZ-yUekz5aw9K<|41&+2sP92RLJ+2#`|jKjh38t#}$=hfD4G^%e^=+J{M#J36D;{ z(?rxV^Y~^`527J2ulvL&T#*Q=%mdIZM98LxRd%A?I=ZcW3g`0HFWq$S@g5BCHEMD? zdBk5+(If4>ybM|<38izBRj?Ec;vYEE#Z>j%wN#WTO{hLGz22)x7rsoE zKp%=!r~hWRxu&iOkr0owo(kVx(#}TYxKpf1VWXHR&QfpsI{Xegx_^Yx%gQ7wsx06M zbG7s7t)ZQ1KIGR3vx0px5~zVz^{ly1;?I|wo%lsB8(u%tA@~>(IneCg-7!-}^^-=z zwYYewsEyCWwKx6VZH5)ETz$%k6ASVWly}YJ`?qwOH`LnrwGf9QHB!ZzMZuJ?t2X-al=)20xu0kkcO+~}~>)rZJ4x9b$0<~hL|Aw(n@auQE#w99L!E8SO%(uQ+ zR7iKD%k_@p$1MY@BCqk~g<~bRc)9?rBl^=-r-_VPLTBiZCt63GuT7-rCBu7X08+(J z{j2XNd0;ep^4QP|rP^GP{n+PEHtOgOZ59^?NmSid|I?ul~(r{BZEJuVQ z;>~n7tJy79cb6j94oYg z?98vc+&gv$+GAt=#KnrCecod~G8ZvpZZN#*A!!ra8ab{-N+f#0OEr@;wpGldos1CJ z+<2iov63Zi3NWhfXrQN`RCHhbrD*_t%5g|S!)_yxIhCwIxc(ZLp;Yi0ZoSg#LNK(a ze7f=1A>KBUN?#x`?0tCTs)<`}`frhL4T=qA5z*KK5#nN%mq$L_kp=E34??N?zEe$e ze?1v`%-Y(s%}EL^BN3z%IQzlGe(e|PfYRmmN|)B4Cu0};4}hmXvL&F^|2ARxe*8lU zuU}8Ry?Qaw=EJ;vdlo>{cLs}}97f4(2Yo2rColfAfQOqS<*l9Ay1H0Mvp;&AqwjjwFMpD8?(<7 z1;Hq4^La_5WIsW%QiN?) zD0ybXVf6$NAs^x@C%P=9TpCcM52gcbJa&0OLgeMikD*c;@7C7p@L;~D!Oupl$1dan ztFM&^dpdr1_82o!#HykCaZ+Xqr8x!Q4S;Fz57ek3x`jsS<0%FueiOdJzM@wQjH8X; zuUgmeB3PIC#W>iTfp*K!EWt-7A#kd+xr7nP>cWSfZFHa{H zG~|e2)Je4~4olZp@hR{U#_xn3;cqK~g5eQs#rFWTlnh`Ux5u7lLS;vxdi=Yh}?q;@UWVA)!4yGAGIt$m(| zh`aHiNn|>;V!nRN(81U^lU(~QK6t9BSl?ND;aJg{{u9wyX`fbSv5fpzn6+~k76LY= z$#i)4e(G;a#3jT_nlXz?$nt&^`%8pRUqF|VB==&nx(i%Ndc1}ceVWVS>^ZIn=ykWc zFY6Na4w~|%-Yj5qR+7i7B@OH?r#l?4EPy12b3-xdLG>Wjul+kluiMD@0J%ed!cQ?j zS#6=fSLf-&O;2Dg2w`e`JkqM|2VtuD#5o2vLY znL^7Gq+9f2h#OJb87Gv8J3Gp`=aVjz<4>1~E!Xh6M>>PRqMB{t$7w;un_Og&MT5K~ zr|L)mmN!QokrEFJ^NmAX=FJ8R4h|FrWX^(d8;hJ`0&V3SZwj63{uTc4yT*O$sJjfEO7F6cYH5dLi*9GL{6F{lcN;|WbTJQYOcUsp#dbp_sN9f zji-6^vY6G6))(x~`Lj*iA64zN1pHbF@YO&V;;g!V&f40m!V(7{Kvy3-Og|#4ILg?y z0Biyr59fWQs<7*<3_31!a2c<2`5HGaXUa=xz{Nah4H&tf{-_ApKW@TXq^cgNwT}&~ zLq7OR+FzDDn~ELM z=F{w6yZX_BqE%|YMdwP897Ein)K{6k5%f)z^OcZTu3Jwd(cJW}D2h8S^Twt+{CF^{ zyv049hrPGqRH^e0j<2_HdUb%|EbncTL0f1PAnDh$DOXyL4M5dwd6Sh<(3>`W!yD7B z3w@7<)#Z~FghOHE;Cc_pk1~5O(>yOn zr}=3?%^;SNPn@0IFr`zpMtWQa?IA$zyy9A!Uv?Y8G9dafwGR6QP9-9a@)YkMv;aZ( zEN0jisDZBKWq;d$r@U$_h7`VxR8XaV^*Pd-%u#6Y{?sIOLpT|&H^it{(l zS`PR0?pq9b(m^XOVpF9q=**L$mC8bP+6CvT1EpnK0ULpZ*CDC1!LEJg-G@fCm7PD# zfPTSk2_E)iy_=iHBC0lYt^x)$Kcgz)Uur*3jSE$!>#~@r&UsCjS~RBs&x0yS73*#d!hE3?zyl(QmmmR(^5jPmp7l<;dGXBIz34i(kQJgP)SB>I)woxR#Hr#{H8`JYIT1MC9cIteL3d z$S8%%3(`E{QWnNnXe=n^^ISwEA>?Auu8H4b#P`ZHJOWUE{+TrOU|y_b)t>BQ|5SST z0i#^b=MT1)H+|tjkWJA96SX!=?xr?kfb`a&puPoW#%FV6#yZrgOR`9puwY5j2J z$n>lEdu5?t#}X_jt8JYd(WaJ=`Yw z$N>zm6ZoXGx%Gm3+*i99jb`QtUaQU#d*n{vbB= z3C}HiJrH(_qKJVXJIf*oel{O`#qp+2Z|Ftl`kq7xCHnbYfbqM%;Rc9f?K%>7CyNU? zD;`(?0Cou-S2LSK>K@DlB3&;K?WrTf>BYi$-e7^uXbsffeq%~=G(uLSQM%+IbtR0w zYu+aYzjmf}M@ZLAqV5&H&|K-3OFbIWIe9jD#;8hjr&PH=3~kAZddK>hpKY$oE{iAq z$n(~|4hp~F#s3kZ8&nrTo;Ec}^PPX|Gsa;*%Xf*-AF&6(tRzTn`6p^L96H37+Ab61o zf5o;O$nv3EyDPv1?_!`(jC3!0Vx%J}a1f+Rw(0*$6n!IVwkZRq>z}utm)^v6+=6QB zdJYoDw96s}G0d&8(%h@lTRP*r4=wd_pJqHKlqrEN@oc4LS^Wi?_ED!{DVu>~1HX}f zu^g_XXBCCFyU2L$Ay0J45|1y;GXXBRN`7jt<#^=}zmFECl(Ce`9me1dDkRrWjMc&i z3IZrbHJY^hJb_5WUXMpK-Fel4=-TK+|8>?e&FD;EviE$h{j-t8AC0wjWAVLA&3xSIu;1q%9<#m4;SetG-Q%1Oc7WD91NHd8iySW z!~DxzeSZEOb_ZVy2#E0bmSEx}^08E~#8~$ldFYm21-x;_x7Py_5}lrE7IC6o z{BIH@)e{hwlycrtjPum7H)ep4qPNJ0oxkzg)^MFD`hDHyn~d}W+#}e>&;>0g=&GmX z`&mY=$9hLG`F(tBZLEZv%&%6wSSIE2o26e@F-9#68wQ8e>l5nERm+kpY#5!F5o6-6VvV%Furnlp z%$Chw$bHyy+?GyLsW^lsbuh%;w&Tto3xQDb=Pn5g|J;m=5g+I?fOHN*}G1yqz);d@kk*x84X_r0i zk{aU@g}AQ0QUa%}T27SN@!9wNIiXP+A-{1*M1z znVi~yCyBmioWIbYy@gF<&0T@qGOgw(RhJzKM?cmB_<#qOoyfSZha-k7D@UFN%@0S# z_ha^RH9|lS7dkZ_BtQ2Dh!u(1crxtuPZ(112Wp=n{iBFOCq+`kUhssHD8Si28yG{> z4t=N}ud}6sv*le6`MTYnSbE?Pv^aIQPat|*VQt)L;^i-N%#r%l1cgB|a`9sgmY-1! z4cCir=o2HYyc*on9g3B{!KT|t6ytdU{QhjGx#AfqSQ7kPpSOEE70n3o1|NPi|E7f@lM$pE2Eoh z-mtLmq1hjdZcZL8k8~oY!hyx$7FBYWKQ&j(@D*nASjOMm*-7m^6h5*HfYw$PV{Tuc z%@>}DFaNoD3lrKX*-&M3+aq*>@xatQwnylWans?R#gq%dYqEae?F#_^UzR>u<`D=TdgkYo>b%nM7@y zFX#}>IROGDl_3l}6(7HY9;p&?l<(YM=)fBlxwX8~Guwo6Kug&^vFJgOTW6tl8s{Ob z=+PvzrmChlt(N2tTC=Wh#hO0F^9(ylv9FE@JZf_2P48{tI*95r=%Q5Yca%{H#@k0W znhTD7KCzPPA=9YPf^@;>C`bxL)F+Av(Y7RwKOngm*)x5XP|5N~LDkeKMO9YXsMftMkqL-NBVgCiX*!f#Niskv9|A0ne* z@9U;Xgt_AT279>KB}Hcx*|uc2=#HyV)43RK z!H@PW7P?DU1I|d_USE}SSoK~1p1hsHm@9K~Cm1ih?b=alEGUqs`uoPEPx}i`e|^!p zpa5PPKDV^bA%s2G=Yrd=n-If{k_ju4bbGj4*qIa>>cgFh!c94xwStraXxuqRioK0H zr30zy+eU`6Vmpu;+qkti0$HUx&4u$(I|KwqtpBiS>(exztHIYb$;BndG@s@-Z0Pa9 zt0Vp%*ZfHl_c3cbmf3V1i#!tSM!b}}dm`Z`qH-> zU6kSi3G+Z!#9LSOJ=i551o0+J!`A@8+SY#FEFkdg?|)b<_364t{sXrCGc7W72-YTD zR|^nraqI6-axKoATaWL!O{4Zhyd9e1Yu(0m1B4$01n_71Jo%8B@K40F8AZb4t4?FW ziW^}r3-r15&hFG*d$b58I*EC&PnD4TNx#{7;O9*vyp0c(55B=n%a(gh%uC4dy>W5V*7qSYdgjxw{hDA-LOfaEgp1Ao$FiN%Gme`e42 zpx~wI!aAUp<1wuWE5qf<)Ou$N*trXkzd1gjY!$mY*HV~6S;Qkfy#xdj8-CwH2yE{L zYdrZ6_2PJ%Z(1zAOIm2};TZr_;-8#pG89KpHBGPjMD^3r`ALS)y}swqR3)<0q=_N$v6<6C^V6*BkLB~JO96r^o=7O#FS1*`FC`JETA1 z(}Suw{LO#>#~8dMu1wT>9ccdTI0l}i!*yTp6cF&1a3xso45%R_yxbs=w#%v^ z$xi|>?bbiZv_S=X9PSGWSVnZv^Jt!z7At`^0PO*~NZ5!yW%@0U2shr-9-Q7-Rf&U-3>03L|A^6z{S~vrj-p+L%db%fsUq(^2yyF#&*t+ zcH%-8`qr`%UVS8mjL?7x*xEee|A&>Re@Zboei-X;$?q&s-&GANKO0m9$b#!}g_x>! zR{;S_9X`Jk3m749F^EwL6i5^1mJ`@p4z}sBTo^(Ff&wG)fAV^-e598iK?LfrMvET{ zeNV)NtQZ3JE-{qY;(3jmB|b7l zvfhMW2l|XBAwbhR{w0RCssm(hBH8NmydY+L_0i9gtx>-U9F%h*1+@4NYe20X;8Rk9 z0CuN>A5(8y7#{}kuUGRxQ-cdG)Epd$8Oy~@hXI-K4Chm%J7aa%YZm*EXUG!o>?J*= z3*|6R{B&0*b64fwlRhd;=5pB5&!G>gwqPG%MKhlY9@)Ny^S*?n!_YVu(kj5r!z_>a zMc^ez)&R0hh0VI!6GIZJUj<_YHr2F_@hJ!k_Y~{)V}z4U3-zYSQX`mry$SF%DT31; zJ?mKxp=Idd_*5F6v>vuFP5*gjd5E*< zjGvW8jJ|Du{IUPj?;=nFmgd3(C*OrD2?(@!&92-qLbQ9t!LG8D((H0#d?efQp$UQ< zP34iH^)Y$iMTDAGKjzP8;Pzj1tO*g7J* zmdVz(&nJ|E+eM7H|4rcajD2-KgcnI~TzWh^|bbgQl+Fk9T<6_X;xAgNa?I{oJ$y=%* zR}$Qwa-Z!Nnhq$R7MeyJSyidFqR)#82atR8?o>S9CqGDpn zIHmR7Yhc)x%`)TR{M_}`Q2shKvTPs;6)|oBu7D`x60>D7Hn>`P>I4~Lm(O0fSijm1 z!6(RLM8v%|30&O%C8Z|^y)d0Cz7KY+>jVK{oxP{Cl!T`5k7)gK+ke)8;90w93BxBI3y=Dy=O)bc=O#?S>sKwmSSplbCg}$&nS3$9wnEm zf%kF&G|AN%fe{qAYh&O-&)om-;V0aXNMvzIiSp9>$FX$^yeG>p_ zU*$NwOUHPH+r`84IT9i~aNv2+wvD5oi9+x~0xhqvac_p02n$>+v#WWgF70HzDy5n` z@b-N<3Mn+5g%jiygY*0AP@ah5pta+((t-jPRn$L;T)Eg9L-(GL7I=J9Is~8VZGo%o zuSpuOzB+MrW(NFM2_TeTB?(Ny-B%_R``v_;@Bpj*8aL3W^BPw-qMvj&$^kUT!@~N2 z5aexk`Ch;zp3~pGFuIv=O7z1iaO^|nk%AW7e2klyrQ#Z*;;8eB$bZUpwJB@y|inq3p zz(3j`I$%11k-2}JD6_uY{Z1ejJbjlsIQAirvobOdt~r`OlfFXXWmm~j9k+9zo}}MC zjNYE=QKy6hia-DwQSz<8{uVUTO?d>w>={Gi-WH?f6&1-Aogp?hHm_QM5^?SQ5A3sC ziLZRHQaOE@<7w}%@HR$}Q*Bc#$ccHks^#`z(?BF12s9utwEahcv_q`2T&9;--EUGO zzkv_XaH+SuQN7&SJ>Gp}ILn_rYRtBNbEC-%h%hDu3kF{C_I@W7!dR3q)cd6&7%%~|CNduKnu&z z6^2DJ?!`s5ujqEh#ETQ$EfsVJcXv&Nv8%$H2LK!af8WnDV}8+mzxy_ z5_|2^XJu7R;o^SW6bN20qy3{I?#T()ttGFNiZ!7Ay(YFa79NN!@)w#;W(rNyRgWeW z!bp}4GhcoItL!Aq2>VeSlz7~*H~#{AXZVXZDJMU!6=u|f$9lk;q1g=V+DEZ45yfumDRwvxsvmw-3AMFyd(~GclW%iy9q~$Bh zL)#-o67!)S$W}h}8ajd8KEAXWJpN;k^E#fhTX>45{_tlNI4l!3*YIx3hEyEbFxnmc zbJeV{!llzP5o2G`->L0GKE{BL9y@M9^Mu25`=$XzingCatm?SW;6hbYgv5PSpqvF7 zJ_}!H*wUE!)tejKbbmvoyL$AmP8cWQ<}O)&je+RE^uHtd5h*~bL;QgL-1s5=$+}ec zr*G$irUz@(R$GKkhu5E`5TY;c00vaxFyu4)aw=4ZPl>WOG}I@OoKBE;JOYB+kpMTPa)^!17ct?-v#A7wHUt zd!DXQfY&JOnRyF5nPkH`7vMVyM2vniE6a5&)P;8&j0e6lqm!ox_K`6m%mPyf&GXr; zfcXcxuL|wTss2wq!|pFHJIVWTqqH{(iQ!{|DVq-YRmU2HuDTxd!x^;{PV7#e=eqL# zQVaJwuoRC-x=R`V>7^{(wrHG4L+nCdv1_J09(aoaDz_p>X!;V(wnA_oii#yXy?Dxw zNQuO(kl8AL6J$S&VC1mw{N=0BfD^irXf*n>&3!W1JIK`fRhowPvLooItEpWXVs}epFiQ@{=LKZ4#`zmi6&AG8`_9?+cY{lI;Yb(tK3LC`V&f%y3okH zO(BoJ4~pfcR@L2*yjZX88CKIyY4mW2Ag;al>l`~Ov(rH)mIxK<3B`!12cPv@@`I22 zY$XIpX-}VQTDP0z+<#2mU1z+LjrP1XEVHbYFeC=l-JRMcrk4uq-C?b-xF1#HBFDwl z-(fBx);`Rg18$qELJ`mVsCX?j4HSGzoxLfCdztOW-ucbkcKr|VZ*a@7eVS;Jc3Wly z;tRsUbV5dVzS0BCbUq8pc<7`tkc>aGO~2MIGQ#+F%NT^yyy!_e>}>#vA+DaWqwilG zSGB6(WAvyDcvSvOV3eXC{)I!^@k{;qU>o?Lm%NHgr%zA1L%us zxf8zCq6S2@4?{!tKCePbrj4^5_o@XP4oQU*8@Ui=QU~&-HljZCDSdaro;5V>-Mm=8 zMMc=nqID}O`Rz#9x5t`UyHO7^F-A)EF6ts|^u%e@!)#V}b~L?%$My%ii3Chp5Itg4 z{gcaY-W{b_r?ylP#;tg@6#q~hsF-7CKL;;$P4d~vx{B>2vz4a5&pHq#H?RKV?@!zQ^9t6Rj0 z4CoRpfAfY;l&e-E8KHp zI*S*5L<9uTxZQ`=OAgX9n1X_>dH%+pO<(*PnQv9QOD3Phy$&ydeEd zyu=KI8HipMQ-|75`VEcu#}>+ZkzU9@XYIc9<~t6yuw=lX?x?<-8o|u)gKfbENnf+t zyuxyWDk79VTjH#W&7N%Vy zcXu68yztFf zeS1>oq1N0R{d?T$YQ-S)-)wAE1&#q9@>8gt-gA?CBW4t=y9JGl8Y1{e>%!|Bfs%c% zyXVj9U&)Y*gX?v+0)A6{!m3>Fg=ec}*yeq}gHO(%`wm&aM;MD6fn63Npchk{FA zK1FFArBEo!gs_!as0wQt+RQm?XKXIt(7mt8qo$~u8>`1aH0d&exwJ~dq4@Li6^eCU z3H04{YC^LvL|bG^%#g9 zSu_Vie~qEO_-8+3D-}Y$Ow#5I_#Rn(x-T`*QKJ>6&Eo~1n_CCN)>rRY*au}+W&#ce zvB|j=lcZ%q)NdPM88n%$cqa0xnXZq>U>|x~JmjO71spj%zOru_59zxT_N|`e7oN!c z%rY%jmIyec<7J!pRLtAK@}eOqxt14}RUxKSh0CgMGh8JZF_dk4US_j)HW3&aJEZmy zvKcQAG?!5t5$de+tlNbwr9`d9&|8AE0%{ObDNw5LdO6)Uoie19H~3?n#fqx_Ocmka zbmtE=Qs_w>1vVRK*L0Yh=YS}gT(0^y%AR94zoLD)FZG_Qd|}BV=T%Et*8{2@x>EzO}A7UzQ)FduQ)y!#BuSEv+SPzD-;8k^7^c-N42~eTM$d1}4aQPF)TQ zBUGvi2+V)ZhaAE|uf|@V?;_cUMloU-in}AK&4x=(WKPpg3lF$N(bL}D;V#9*yyE#X ztfQj;-y1y-TXngb2E2k8+woog(NuqF3G8=+3RTfUSp~Wm67=TZpldWHKR}zAr|rx2 zQIgdIxVnaJy9g{z{q?F&Nps>(38VIq+GZwp-Taij%OmJn)+5&Y**wAj*WQ-^HI;Si zruA356}nqRMaEVd859r|6@g%jiX#X(GAf9u2ob^*!k|q9iUulfdm{N z$QYF&41pj+!k7R70)!-Y9|obl3irKwRqxfSoU*FRjyZepZ>{~UwZ6S_4m+ngpJYQO zAE%J3J2bGCq>{{VjtGz`aOzoHEO?dgQL|Lr0eAIrwP++K!5Tgt?zscH+Si(6o=D7u z`;B^yH#lP~x?C`PytDnm8S^WQpMYemIxX0oHCMgmb)jvdol>7sf_b0oLMwmNRX1F; zBC0|yVl_36+1F>{!GB#YJ`_~!8CdL5FG&dUA3geu1P>^!ya_Ua9ggdL2 zD0oqUzPY{L0J=g`y`VV0dw9HLIwCybG)5tIFe^`dEh$%)!CSnjp6ugN?wwD-aiO-B z)-rG!0gAjSo=MaV)GaF?UT~~u=?B;3tuK`H_f33vlruzEB7W)3VLY=W9 zabIxniK-VV2~0O9x-(82*H$sG8{4JP?1dN4%d5yz9*s2a9~Ps^p|m9L zICSsy^vAXhI%xPy*cZh88hmch(ahv6{aN4i^6ju1&W}Es^y7xS{x}@s#~3b_j`A2Q z>Z3KSFP$k4w^%*`NqPaFmsZ>Wj^B$){H49>C`W+J-cL(6kenkLIV7520=`jnZ4ws!n<688eJ3)BI7b?4)YzgNQ=9W6flGy0wot1S0pgu&*Us z;X{yjHn~!r9&a+3w{#Q7ni)ufh*#q6%Rz+(pmuPEag^60{L;6EQRqMcUGkbH8%2&i!Ii_Zum9$9P z<>FcuL3-XdaN8S`OWEdp{rX2rL#BB_?dbvaD>(fDW@toIm1d&do2IF>>n*0)w)w%6 zEnoMV<1&i0NB`R{QO*Ew*n;m22)YQR6K%2|oQD8l8G*b4N4NI9?LiOSpEWwaxbC%t2wO~V${ z;AM1BGePA5et;-m#qtd;(gyMR6X}N_$rHMqI;JbPSl$RtyyPvktqnnZ z_4oJhDzjeOmSfkP>!pRNr&wNhi;Y&Li5|w-bQbry4UCp&e1JJbZ0Hq5>6>LAktr~b zv(?V8HRW7ODpNY86l_wNb~DYSi2m$Nn_9aC{zS@sOxdYP9)It|>WGMRy(mAExx-+4 zL0vnwQ^AzpJe<}6$mB+<*;9iPheK*#F48Gty-@Xo@(DF^bU0GF(U0Wn;t~=e{xthj z+kvIQh+f9dh$DAiw^et%P#f$Se!g=cSI^A;isD$#%T}ae3p|Sp&lD-BJ?N!;rei7u zf89%x>r0W-LJJIbBKW&j9G)!Q*}#e`#Za$yT@B4WmS)Vbs;qNw>_-KrBr5OPZx>gr zdIIdA7w_M{rx{+k6ZkgR&=>3#;tkHV#6fk1>zD@KXa5s}Dqfu@ed+1PySEXp;(}{1 zi@^djqf`p2@#61y&!mJfST(2`CNn?CPJtye^h@A2m6Z%Yh1hN%!V2M7>6)D$=8hlH zAAVx*9AG(jJJ!7DcfZ@J8dLmr*vTF3o=+eUN@{FUH>Jh7t%)t$nN&9Pq61FDLrJz5 zfj4Ru3KIOL|Ir*g2fcY3>Mb&dLzdgT+GYC+3)Z4jv$I9Y5adV^JxM$N)Jk5SM*eVv z6AgBkf)fTxm~Ahwvk;GCCiN(so?ShpONbRrE`IfUw*?pP38=56Cs;dNVgN{vOSaeL z^`A#1{xs}HSzcrPpFPfb`n4T4bl?IbHC&9%xM;jGdHZ4p(ir$*i{~Cq&16|4Q%*oOuyUNzfjiO)8uWf0 z1F-$QzE^2mi@8a+3-wf4+p3U=*hK8Vvq#*jM&g2D~s z=*{1~d-p>xDmW66OLM)as2O2r7}0gA%+qve(l2{xWh!dScUzSgn1<{GgF`(U1kGdL z`d%})SGx{oMwm@aB^`^6$TzJ}#GA)Gwfce#AUA;O>#bjdP1o?`b{K^ZbG807UwyzF zIqM2y;1uWzzM049D2cG3*f;xLFr6k6u=wtoqyj>M*gnM?M@M^o*r7gfP!670ie4w( zYlq9XzK3s;)3~ccTw|X03Gn?HWwY4c-d+)DJMC0*TXq1cmOYLKR_`EZ_D3Mz@ZrsGsb zXbf>f8*swQnLn|Qq`fo`ZUn?B)0~J+wLqk*SqR~N8x%|FH_bk5mT*Ri{RxtL+lGpz zxvx-c-#rUBVz`WVfwS#Y4($oT(i?z((obx#@1YHrfMA#CwcT?7u5i-*4Hxiv)k=o3 zyOw?OXmp?lrge;3Uw>I?4L6p_S1`eP}(LFPAod!}~-p0iJK0qn~hFcTQQ z-meqD{x`SRnEvmEFl@5BzD<1) z(81F3^UQZX1W8Aj1BU~ z^T(#oBch$q{HiH}-~fVHZ2ijh3#jM)>_c-YpKAtl{%P;Hdiu+-*aNW@!B6^>TYCUC zM&pC@pn3GFKRVq7kB@{iEj$Y#3eR(0&9{rr&BvX}p-ykn9Y9An#F?Ypzm)KKqzanZ zx^Bn$BZsl!2(|w3uRO>~+aN0u$ZkVtvow`A%z#3Cmxm9s%tYTK8h(joGf96z}^tP_qN%089EJ0?i{nLwzf1| z@Ac?n=t53vxy8fACJ{Gu4X{=uzV{u3MyL8%?h$s9El8W9Otw*>bC1F8$=3@SpD9-* zhjT82e(-182;fn*w5GM;J_~rrwlY8{u~U4-2S~)O@2wE)wKHmU5YH7|hR7fgV({0p zAhud%^#!CJAZxR1(Q?M69D&GUF|}A?mJg=5lEb!*woidmy|xCZPq? z+!}o2JI9&B>mNjNW7^n6sQ#t`E-kKPB}l2OWk3z%L$GW66!0L4he1y(3EpM*#%cJZnU}%*@RNANMZgfgw_*AKD-Zw4sP&O?*RD^Fw>jLiKG%%26aXjcJaPm|xG;&FJ#AOV} z0@NHDVV2O~*Qo=lQ|siDV7myz*P6Gesbc{UFEr(ffqy!J1gLxt29vQP2NH=ZG`4J! zULbVECyVkA-(3X84Fu!)Refzk4pYE}MJS*Zu6AwKR^Xyv*?qTr+R89t zC1+f81F=yjt=R5BY^cTyC(K$U-ru)SYkAHlU%aq$Vi>mpH$K!}reeQ~neqz1P#il@ zBzhunQ9SW)pyL$_jf{x(YJpRZRO@WfLtvww%LRH6@+e)r+Y1kBKjdA0*m&+mD6W6B z`Z6$VXW6dhTo3B6W+^DB3`SEvyK?|D3;f%qzT2q&#-u4Q{db9lI9nmp`U z)sLH{9v#T-+%q*Rz#dI+*j=N@l~|2fOf^~QGlIH~I~LvIpvkfNLCb(6hXeGadhNtR;EtfOM4TKyt6Cl{)~V-d7h!oKH+eMw z4kcJLGUy8%Wf*aEG6adPD0rRMXzHHrmSPkUa|XZDa>8>ZK?=LZT`%9hg%h@_V3VUi zrHy>D5g9$a4tCN_c`o-Bao%TWKje*ViQcq8q5$4Y$r~eu$m|2BCVETJ%RsJjajV8b z92SdRCx(a(GVpfRZaA216wzl|*5>rt$#f#Qtk6!w%c7O2o$BBam_ zrxc!bGflW7$_wUK9yTi;Xtiyyr*D~^_6~ip&L({`#ziyUwtr;K1*2y{9`N`RN-RQ( zEMEMQcz>ao@eim9!X#FMO}l+tod(z~LYwKgzOYAm21475?e6l~otPpw_C`aj-TmBO zQ-4!nSaoOrnGDrFxQBACTkw7E!FP(gI@KKUqc&#da;(@!kOQ8Hh)Eiz9KD zYD@m!#neR6kJ37610&DhA?v3g(S=UsE0|CP-CMA|lC<+g$U^4K1OZxY3^?tfAYrgy zHu(?^EJZ_AI~g7%YRXijL_crubfPq;-0Xuu={!4n1{@O!X-!D`@QM+j`)-LMD4^{T z7CsYFC;pu`Ut$A^C7ROA&qR^`sj66jS`?uAEq2m4Ux0CH;XZ_-rD&_YxkHzcLPf=- zH%UzG{SMNWKYPeKm_bc5;4p4#Ms8KWPRr1QXHv@+Ggh4JgcsR*f3VQs;KyHv4&3~; zj@vQ}w7Sn%nD5tleZrf(ySh*=aAX`*QE~`wae>^jTM!Gi(i25tdbho$_;6<&yr^?@ zi!2eD21h#6JcVQ#Z3C^G0%z{{AMYz1BsDZNxCcLO4`A+MqN3!aI5`zMnw4sRp+`ns zSZ0j1q{D$}KvXgk3Z`q;I`G?^clKl#YGa1$hEbFCs3)dXJ;-8pM!xPkpqBaY;V0T~ zrdT$RB=k(uw0U(G`7trHm{q6!7cj430~OH}2^#6Oj|Qy-O>vB($NeRS7P~IW6;SWV z)FoNwu-n9r{#o=P$-+gBaHNbk)r^D=dFhbnug1 zumLRu%Na$wo$T)MW3;ma>Dz~$b<~)z;o~-U;FWSroo-vlJt%^XIUBF%McRM~4JAv) z=cnrH7RVK*4Og=~CfGi1sflT~3x|d3MZqyQn8_YU?8xkebo5Dg8B6-l={pOoY+E=9 z?&duR+D}x}kAb*7`KPDB1e~IULM5v9Vc(jCc3@y18WKfrMD z!Kp=rWM1Wdsh2*+Hx;S9y8sI5LU4Y2XbBYVeifSr;qw(0-bB@Pjh^xacHFs5ptX`y zg*gTlPVFC{W-;hbOoC;O7LT&JHfEv013^u^2RAl&G!)BgqlU(TdS>z#nJGmWTV6+m ziC^Ov(FJl&>v}GePl<+HGzt&Yt`gN59AB7CjCFtvaoZT!hf&(~{|QI?c4ux zoH?k4!JY$=@Rr}`C1U_FW>`_7m{Y@`cI%QG^+K1X{^@@Ukdys|lM~ouH-+-j?Nk3$ z{+oK{;^c3yC((+@o(OjP>HJQgsdsk5!oFc1cW}BAD(yA1!wwtQn!A1Rr9E2=+ggNxHw3yZqQsqBACZX1$qbX$<@Eynr{+ zL!@ua&MP~g6~o*iCjr|V@B_Oq=XF@{WXCql8KjHHVPblj%w37%^L($_ligGT4n;$y z|Ct@n&m7h9fOc^)>|xROaX`zew(?qhe%qui^wl#@CUd}p0^BrUP8YxLMg-84#`hR3 zT&;gh%B|&QyT9dE6p4y{jRjzh$3U}6RHzW_@!cP+Q+B15{J>u`oEq}%HD|OfIBN9@ z*!h(M@JO+@XaAfrcKN^S`6*|C!Pfu4#ikq|2D`ZR`&I-EaFf@)x8Fwu^b$^9dza2k z;2Uq7{#-Bt0RjR91PBNa5Fj8xK!AV%0RaL61Ox~O5D*|BKtOsA#2!kpHie<3IoE`H%3f zp_LMqbkGu!vE%ane}4YkJ2tWV<)HhYs~#V^{^HfJ^2~9I#&Yn4m8omF{LDe)CeG9Y zhQR;tlLwCvnY!d3&zws|_D(<40|v{CgMPU`c|E@IZu(I5YP$5)Go4_tk3oyTlVT>X z8;h1tpE*7+@tS(*59py3OhABu00994|IZ;1#2EKNDMuXL^Etc7R2jjfQgaz-SGcz~ z3RS{uO2e?ah6d`{SZpxUJI}Q0Q|)Hr`nJ0c7;}pZRzM+Um_CvcjJ7^{uFEqVY`)o z%)+~0$bXPD`dw4jWb@&>wjX2i&ZX&yDC!RMM+StoVQ(3B+R)dN6;ta^I_S3tVMhu* z@oUj&^R{RtNp2Mj*OX{78hlj3T3F1{Bu?tV_23da29iIL#ULx(MpYyYqn}itE*6IU z{$rMJx%CvL#%4!~owGXJZD@@**hFwrb+L%fJBV^O%~R;0;jFH0Fjz`h3Pz2H)))CZ z?REKtyzR$(IpkO+JHDa=MV-+h%OpQ3zo5kQP0HS554!=MXSq-1H&<{8372S!Rh~q{ z_!9P*yg~jJlcy5#HMrO1k8;9w3c4aogO8>|1Dce}4c0nWfEMV?rCO_c_PuN!;b@{& zu(=jU)W|N=GW3NP5WX$3+^L7!f!}($h=4~zOLD{|r`Bmn*`%xw7ExNaR z^8aCVg=u-eEF9(rEMn99`cQUew+Pk9I@e6K&if3Cb@6G9c(!8?Ckvx%+jmcmur8sl zJLe~u<9rwzult;j$8R|ulAAEtbSUgoZKhMbUHi+P&-LCS1xSX5Nr_l*AIj|g_Vu!@ zN7Wm|h92~E3_7TE5HnB086EsUs{l2wS3FWeZ>c@?yg|?{B)J4U4QlFI zA_Dq?bTh;EHIy}?#SA133L`ZTJ=KaQ>D>Wv+tcgKnA~0+KkgE zk;m$H4zwNlV7&ZZ;-8EjU9!z#U|M=KDMOa@TCds>z`mIjhV?eR!!K7&)s>(Zuy`bG zT}#h^;VtYY-P^XiYopmc+i#=v)pm?{g?p)Jrq?(uh6%m?VPT{)?%srWVLR%krzvh-Loot z+3;OjM1}8Lh_!tCJ|9W3m(28)A&_7< z+UB#1ar!-%PE%~TLuFd2JCjxG+$HXOS7~dILxh--sAR!k!Uk}&xY4ouIr@%Be0;5` zNkbzmx837ur@CtpN0TKqBIzJpieeI*bPa0F(84862(-#|YB%}<e8=p2=PhyRJDBH$y@V2GH~H zCa)8FFD!*!->>l(F&Kt6CH)6OBf8b5r8C?miNYZ0oVg~h^k}-(MTf^rG zTAyC5ctR~+w-4ka8O5FSjt*JRTmqXh;2eC6Fk-d*5&L4N6nHiP28SU>oo1E9Bx6EY z#y&hb+9M5fZCizOjOCpr3=>Zki9XMzFp1zfBTYm-pE2WfEQ#3HDZjWI*=Jkew0g6) z|A9|lR`LCalt%mlIp1#1qir;>9K`zis}7Ep9}%f zwuCalV!`n=Ua)}{i`Gb{rvoP{!V_Sit(9xV@S`0DaCLIR^vqCDCoWGW}-e@a4E3jE? zNFmjPA#lOm8NBPjs&4v$ za4^_q-J4&#HGlG54|}sROa7VU88J${{%_(&gJN{kIIu-fDAZw$gi3y>#%bk&`W!D4 z5%wi}J?u4S^Wfeus6G>SxWNvLhQ7AJKKO%4*XVDyW8&C@5StIK-)S zu15}UkKd1a{y`(XX0ZLkNryhiVpN!Xwz5L1{gqBvs?~ia1g0!~wJZyV99m8K>lfRP ziK^rawmruz?$8m+z}+X;r!$}3j76YC?INj$ge_C^bgz5(xg|?%`-lR$_0q8}7iAO0 ze92rF;PI+#Rs*)s!}1!vN&!8=2@6j#@qypPRoW`0OIwvKVO)U1-GVDK&b>E6KzrmL z3WMq2*C2Y9|7B+39I<1{k$ zFC4Skrp%8)KD(=JJCg4HC~e3K3`!_i2+jbd(sM}FPirWu%q6c(kP zY`Dozr-It@?aZ5KfN}5Gx0Ld2#{J3A_anKiBTiGzHONaZEv-wuts|(46dhlS6gT>L z;+g{@%!nSOA#1xO|5OXlD!U&)au>(9r4!IRc!?wyBa`x%1F1b9jZv~i6;u*pK?r(9 zUN8jd_+}zSegj)x_rYJf3E>YWsk4jT32ar0=$E%uoE)r{hi?`~^2tZa9fEAiz=ni} za_qH%kv-j`jGNP%a7W`Fl0YVf_E;#B+Hvv_=h(n?k?~(2Tw@y01B^xHEzpnU>ZHNZBy3pb2A*}Bc^}?*CsOf=_AZhQ2%kgAz zYQ%=F^pGzEf*Oreh_h{&PL}4&Qm>vnggz>=*+Ruywxcw(tjHm8tt)+SfOAT$O-3i4 zkhLP%q;8z$jz}7-#_PWP3zO|7NxVEZp_D}=qOwOP)8HFzKNb#e$Xqr1+0)(A^M%l! zfYZq0KHZxfD~E|E+lEwectWC#vd&G;AZi3fzz%sd=Z!I;eg4wIU)3-5l&18+Bb*UO z@?J&_`yEu-{wub9>xc$n?`b^qjQuo4R)u69=2V27D=SQn^d)07yDaF!weT$jNyVf`E!`~>|}eGwjwNFfcUAG^t^z?KbjOwOG45HIL6Y@4E; z5(>$dD&bq_P(U0dY97Uwo3+Mj=xXbp^&yJn=w|ocTEf_6f>NP0f)eotH)Ebk!#Mr- zJ*6jX!>-aRoiSNrMzNG5R|fhh9d#D#b6wOJS+!GZwz;~&CG1u)H$tPjHd|Xab{D-&23+~-cKy%~|20g8o6l7Pket!+(OPYP*Q0 ztzOUVpzzVffWpU4SmlC z+t-9IEq>@|)t9K@+Evx_`vEG>fwl_s62vNP%bT3q<@`%xa?a0_;%55qYXC`-#75gK!cs<3c|?cbnzm!Bl`+zacg)+e(6!Kl z8dx}UzZIo2Q08-Y8HY`TU$>uNpVPV0|M2fN`7`EuwZ2##Uy5ozp}vgep3&~n zYF-`_hhcz(P~S#)e5lW{LW&7Tn2lxGTO&vo!Y`>S;wL>TZ(h$jc}U#%Jx+Zn!|!v8 zYFi-Hy3crBv*LBW>T-%S8i=s5i5U4mRIG)^o!~L)#dy+oa;`5y%UeyzEbbO`=rn6> zC53+-!}s_j}^ae(CAx)6z)bTzgWNqv2Zrnr##cvYWU!+}EnM`#loE zKz3S(%&}l6e%HVgQBS@pjS_)$C{bDQ1^$vI(gsa5C<&^PsAsWNJ+|Q80fnZv0aR7j zW)qQ|G%64cG7f4Ysh|$CDMxKI7|CC=oZ_G5r4j}SdN=y!3y2LS8|+*e>8u?6JB~~s z5J;AJKD~(QOJzp%)^ToApC;t&LedHGMF`WzW~hQ*pNrT?3JU-^sW3MiyI*x=*zqvc zSZ{)8bf=p=GEreC%=BFa1*lhc^93mM=4X;dh3;kBWh;yh7+kj(Vk;;)2jRA;V;W@Z ztc319Iq;W@9i&T?%Q4EPOLj9KN08IiBPli|tJu5s3qE+2B3@E4=XE?C0aY6L3#G;Y=Aq*vsWe(> z8Tw3Or$)eK5~$~+ar^5XZc`AV1twhsQtORe#2*<3m@3j9YOs}#241)V0Z?Ic?Cp3) z&%67zk9CRR#Z<#K++F9*rCk^;@TQ^y%2{mxl=_!2uaylq^obaZL`IR$+;*g@uds}} zr|ue?HhAo>-Z<*@%GSo$$bi;v*+PmVy}&v+K5uehxqu2Jy@y`U89fA4_q5Wgf+HUA z(k#sI^Biut0;~Bmi+wr8)@!QvF`5&h|66TmmvqnNMbZ-DeG`X%Q2j_+cUk zi&>OkK=^s}ywpllqOWG77}20e=41dazq`_^GRFIeJy|9qWNi2k@^T%dLi!FPS=U}?Yi~DB09c!sHg{9uoj3eEI7Fg z=rWXM^5fT*FBO%H)9xqP)`AT2qF(?V3)DgINb?2MK^c)8f3-EtgMOv1i2>>L6jb<; zJLx7%7}^JKa&}k+)X){xsT{E#r$t(!(N@>!$ z77^uj!;q{Sx1g*G?JH4Ly8J*z1@?5Tf^h7{%GcGDr?>VjPcku>8f#a=2~do9kiaMo zW)WMuy?Sz;XxntyJt2?M^C6M(*@7hydhxbvV5gYaI9xkEyHiEN_P#_)Gx(`aiB;0zM*BdagKxs#Dl(A^#XDQ)OnLu)W4dbr$E=}d>Rr>|IqQnEF!=Joy)Kn~`vraP zaii~lL4S0Nj>+&9ox9wPF9$hPK95tt=Q1zVJ#$AA6N z#Q9C$oJJ}aB|E79z`Z(IW zf#3c$^3}0nvPBhR=7$zA@LH0Y{;Qe0O#k=Z>@vRj9XF>bslR10wn@?_k z_1AAcxUv7Mi+=OT-lt!Y`sR~AW39JJXIGbSazywqvpaPhH3Sa^%5KsZ^ z{}2_l@EdW9SAkbN{=AQC#6NE;B)oAt0bBX?M^xWrWcz=VdH(*xyzf6>f4ua~y##}N z0|@ljy#lztgNnerz5@zOuo=IHihx$WgNlGwz5@zOKr7!vML;XxLq$L<-$6w{E8hV{ zKr7z^MUbt07Zm}md Date: Mon, 7 Oct 2019 14:07:53 -0400 Subject: [PATCH 47/47] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index df1ee1a..0528377 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,5 @@ The optimizer optimizes reaction rate parameters(pre-exponential and acti # 2 Files description in the optimizer The homogeneous reactor code in Chemkin is used. For a detailed description on this code, please refer to CHEMKIN ignition delay calculations manual. The flow chart of the entire process is as below.In whole, the optimizer is composed of sensitivity analysis sectionand + +