Appendice A : File principali di gestione
A1. function manager.m
% file manager per la gestione delle GUI e delle function finalizzate % al loop di calcolo della vela.
function manager clear all close all %clc
global stop0 % =[] se non scelgo la cartella dove salvare i dati
global stop01 % =[] se non scelgo come importare la vela (matrice o file autometrix) global stop02 % =[] se chiudo la finestra_matrix senza importare le matrici
global stop1 % =[] se chiudo la finestra "1" senza importare il file autometrix
global stop2 % =[] se chiudo la finestra "2" senza scelte per interpolazione e iges
global stop3_0 % =[] se non si sceglie un modello per GAMBIT
global stop3_p % =[] se chiudo la finestra_predef_G senza scelte per l'editor di gambit global stop3_u % =[] se chiudo la finestra_utente_G senza scelte per l'editor di gambit
global stop4_0 % =[] se non si sceglie un modello per FLUENT
global stop4_p % =[] se chiudo la finestra_predef_F senza scelte per l'editor di fluent global stop4_u % =[] se chiudo la finestra_utente_F senza scelte per l'editor di fluent
global stop5 % =[] se chiudo la finestra scelta_metodo_strutt senza scelte accettabili global stop5_1 % =[] se chiudo la finestra_opzioni senza scelte dei vari parametri
global stop6 % =[] se chiudo la finestra_start senza procedere
global conta_scelta % numero delle vele caricate per il calcolo global ind_vele % contatore= 1:conta_scelte
global choice_g % contatore=[1;2;3] per attivare l'editor per il jornal di gambit global choice_f % contatore=[1;2;3] per attivare l'editor per il jornal di fluent global ind_loop % contatore delle iterazioni del ciclo LOOP principale
global ind_vele % contatore delle vele caricate
global stop_cfd % chiude il programma se errori in GAMBIT o FLUENT
global fid_choice % identificatore del file 'impostazioni' con le scelte fatte global fid_loop % identificatore del file 'loop_report'
global choice_cc global choice_scotta % inizializzazione stop0=1; stop01=1; stop02=1; stop1=1; stop2=1; stop3_0=1; stop3_p=1; stop3_u=1; stop4_0=1; stop4_p=1; stop4_u=1; stop5=1; stop5_1=1; stop6=1; stop_cfd=1; %--- %DICHIARAZIONE PATH DELLA CARTELLA 'LOOP'
%SCELTA DELLA CARTELLA DOVE SALVARE LA SESSIONE DI LAVORO, CON I DATI %DIVISI IN TANTE SOTTOCARTELLE QUANTE RISULTERANNO LE ITERAZIONI % %
%NECESSARIE AL LOOP DI CALCOLO PRINCIPALE
finestra0; % richiama la GUI
% ALL'APERTURA DELLA FINESTRA LA CASELLA EDIT6 RIPORTA % LA DIRECTORY CORRENTE
curr_dir=cd;
h_folder=findobj(gcf,'Tag','edit6'); set(h_folder,'String',curr_dir);
% ALL'APERTURA DELLA FINESTRA LA CASELLA EDIT7 RIPORTA % LA DIRECTORY DI DEFAULT PER LA SESSIONE DI LAVORO: % DIRECTORY CORRENTE \ OGGI
h_oggi=findobj(gcf,'Tag','edit7'); str_oggi=[curr_dir,'\oggi']; set(h_oggi,'String',str_oggi); %--- handle_f0=gcf; uiwait(handle_f0); %---
if isempty(stop0) % nessuna scelta, si interrompe il programma fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
return; % si interrompe il programma end
%--- % Si aggiorna il PATH di matlab, per avere accesso alle function
% raccolte in cartelle diverse da quella corrente.
add_path_loop; % cartelle con i file del programma e sessione di lavoro
% ogni volta che una sottocartella ITER# sara'creata % sara' aggiunta al path e salvata nella variabile LOOP_DIR % La stessa variabile sara' usata per rimuovere le
% directoty dal path di matlab al termine della sessione % di calcolo con "remove_path.m"
%--- % CICLO PER SCELTA ED IMPORTAZIONE DI UNA O PIU' VELE
conta_scelta=0; % inizializzazione
for iscelta=1:50
% SCELTA DEL METODO CON CUI IMPORTARE LA VELA
% OPZIONI: file autometrix oppure tre matrici X,Y,Z finestra01; % richiama la GUI
uiwait(gcf);
%---
% LA SCELTA DELLE MATRICI avviene in finestra_matrix % LA SCELTA DEL FILE AUTOMETRIX avviene in finestra1; % SE:
% nessuna scelta relativa al tipo di file da importare % nessuna scelta nella finestra_matrix
% nessuna scelta nella finestra1 (scelta file autometrix)
if isempty(stop01)|isempty(stop02)|isempty(stop1)
break % esce dal ciclo for per interrompere il programma end
% finestra per selezionare un'altra vela
prosegui=questdlg(' Si desidera aggiungere un''altra vela?',... ' Si desidera aggiungere un''altra vela?',... 'AGGIUNGERE','NON AGGIUNGERE',...
'NON AGGIUNGERE');
if strcmp(prosegui,'NON AGGIUNGERE')
break; % esce dal ciclo for/fine fase scelta vele end
end % fine ciclo 'for' per la scelta di una o piu' vele %---
if isempty(stop01)|isempty(stop02)|isempty(stop1) fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return; % rende efficace l'opzione INTERROMPI end
%--- load scelte_folder;
save([path_folder,'\conta_scelta'],'conta_scelta'); % variabile mat con numero vele per il caso corrente
%--- % SCELTE PER L'INTERPOLAZIONE DELLA SUPERFICIE E GENERAZIONE FILE IGES % si sceglie la dimensione dell'iges per ogni vela selezionata
for ind_vele=1:conta_scelta
finestra2; % richiama la GUI
% per gli aggiornamenti del nome vela sulla GUI, si veda il file % finestra2.m uiwait(gcf);
if isempty(stop2) % nessuna scelta per la fase di interpolazione. break % esce dal ciclo 'for' per interrompere il programma end
end %--- fine ciclo for per scelte strutturali relative ad ogni singola vela
if isempty(stop2)
fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return; % si interrompe il programma end
%--- % SCELTA DEL MODELLO PER GAMBIT
% opzioni: modello predefinito per 1 vela piccole def.; % grandi def. per 1 vela;
% modello qualsiasi;
% La variabile choice_g=[1;2;3] fara' attivare l'editor di file journal % relativo alla scelta fatta.
scegli_modello; % richiama la GUI uiwait(gcf);
if isempty(stop3_0) % nessuna scelta per il modello di journal fprintf(1,' IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,' IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return % si interrompe il programma end
%--- % OPZIONI DEL MODELLO DI JOURNAL SCELTO PER GAMBIT:
% finestre attivate dalla GUI precedente in funzione della scelta operata:
% "finestra _predef_G1" per l'uso del modello predefinito E DEF. PICCOLE con 1 vela % "finestra_predef_G2" per il modello predefinito E DEF. GRANDI con 1 vela
% "finestra_utente_G" per usare un journal qualsiasi scritto da un utente
% condizione che puo' arrivare da finestra_predef_G1/2 o % condizione che puo' arrivare da finestra_utente_G: if isempty(stop3_p)|isempty(stop3_u) % nessuna scelta fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return; % si interrompe il programma end
%--- % SCELTA DEL MODELLO PER FLUENT
if choice_g==1; choice_f=1; finestra_predef_f1; uiwait(gcf); elseif choice_g==2; choice_f=2; finestra_predef_f1; uiwait(gcf); elseif choice_g==3; choice_f=3; scelta_utente_f;
scegli_modello_f; % richiama la GUI uiwait(gcf);
end
if isempty(stop4_0) % nessuna scelta per il modello di journal fprintf(1,'\ IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\ IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return % si interrompe il programma end
%--- % MODELLO PER FLUENT
% "finestra_predef_F" per l'uso del modello predefinito di journal
% "finestra_utente_F" per usare un journal qualsiasi scritto da un utente
% condizione che puo' arrivare da finestra_predef_F o % condizione che puo' arrivare da finestra_utente_F:
if isempty(stop4_p)|isempty(stop4_u) % nessuna scelta fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return; % si interrompe il programma end
%--- % SCELTE METODO DI CALCOLO PER LA DEFORMATA
% si esegue la scelta per ogni vela
for ind_vele=1:conta_scelta
scelta_metodo_strutt; % richiama la GUI uiwait(gcf);
if isempty(stop5) % nessuna scelta per il metodo
break % si esce dal ciclo for per la scelta end
end % fine FOR scelta metodo di calcolo
if isempty(stop5) % nessuna scelta per il metodo fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return % si interrompe il programma manager end
%--- % SCELTA OPZIONI METODO DI CALCOLO PER LA DEFORMATA
% condizione che puo' arrivare dalle finestre:
% finestra_aste_SQP, finestra_aste_SUMT, finestra_molle. if isempty(stop5_1) % nessuna scelta
fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return % si interrompe il programma end
%--- % FINESTRA START
% condizione che puo' arrivare dalla finestra_start: %
if isempty(stop6) % nessuna scelta
fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_choice,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
fclose(fid_choice);
return % si interrompe il programma end
%--- % chiusura del file con le impostazioni:
fid_choice=fclose(fid_choice);
%--- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ---INIZIO LOOP DI CALCOLO--- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tempo_loop_INI=cputime; % istante di inizio ciclo LOOP
load scelte_start_loop; % input: max_iter_loop = iterazioni ammesse % toll_def = criterio con spostamento nodo
% toll_energia = criterio con l'energia/energia_iter1 % toll_iso = criterio analisi iso-u e iso-v
for ind_loop=1:max_iter_loop
tempo_iter_INI=cputime; % istante di inizio iterazione i-esima save('ind_loop','ind_loop'); % numero iterazione
save([path_folder,'\ind_loop'],'ind_loop'); % salva nella cartella sessione di lavoro
for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n ---\n');
fprintf(ind_fid,' --- ITERAZIONE %2.0f DEL LOOP DI CALCOLO ---\n',ind_loop); fprintf(ind_fid,' ---\n\n');
end
%--- % LETTURA GRIGLIA X,Y,Z DELLA VELA/VELE, INTERPOLAZIONE E GENERAZIONE IGES
for ind_vele=1:conta_scelta % operazioni ripetute per ogni vela
gestore_Sinterp;
end % fine ciclo FOR per caricare file.dat e generare i relativi IGES %--- % GENERAZIONE DEL FILE JOURNAL PER GAMBIT
% esistono tre opzioni:
% 1) modello predefinito per una vela. Ad ogni iterazione il file.m gambit_jornal_editor1.m
% crea un file journal, aggiornando la destinazione dei file DBS e MSH, salvati in ITER1, ITER2, etc.
% 2) modello predefinito per una vela con maggiori deformazioni (come al punto 1). % 3) lettura di un file journal "esterno", selezione delle righe con i path, riscrittura dei path
% aggiornati ad ogni iterazione medinate scansione del file originale e riscrittura dello stesso
% variabile "choice_g"=[1,2,3] rispettivamente nei casi relativi al punto 1,2,3 sopra descritti. if choice_g==1 gambit_journal_editor1; elseif choice_g==2 gambit_journal_editor3; else
fprintf(1,' opzione non disponibile. STOP PROGRAMMA\n'); fprintf(fid_loop,' opzione non disponibile. STOP PROGRAMMA\n'); remove_path_loop;
st_loop=fclose(fid_loop); fclose('all');
break; % si esce dal LOOP end
%--- % GENERAZIONE DEL FILE JOURNAL PER FLUENT
if choice_g==1
fluent_journal_editor1; elseif choice_g==2
fluent_journal_editor3; else
fprintf(1,' opzione non disponibile. STOP PROGRAMMA\n'); fprintf(fid_loop,' opzione non disponibile. STOP PROGRAMMA\n'); remove_path_loop;
st_loop=fclose(fid_loop); fclose('all');
break; % si esce dal LOOP end
%--- % ATTIVAZIONE GAMBIT E FLUENT
calcolo_CFD; % attiva Gambit;attiva Fluent;aspetta creazione file.dat
% possibile caso:
if isempty(stop_cfd) % errore in esecuzione di gambit o fluent;
% attivata la sez. CATCH di calcolo_CFD save('ind_loop','ind_loop'); % numero ultima iterazione
save([path_folder,'\ind_loop'],'ind_loop'); % nella cartella sessione di lavoro
fprintf(1,'\n IL PROGRAMMA E'' STATO INTERROTTO\n');
fprintf(fid_loop,'\n IL PROGRAMMA E'' STATO INTERROTTO\n'); remove_path_loop;
st_loop=fclose(fid_loop); fclose('all');
end
%--- % ATTIVAZIONE DEL CALCOLO DELLA DEFORMATA
% il calcolo si esegue per ogni vela:
% - il file strutturale carica i valori di pressione relativi alla vela % - si valutano i carichi sui nodi della griglia strutturale
% - si stima la deformata % - si salva la nuova griglia
for ind_vele=1:conta_scelta
attiva_analisi_strutt(ind_vele); end
%--- % CRITERIO DI CONVERGENZA DEL LOOP DI CALCOLO
if ind_loop>1 % criterio attivato solo dalla seconda iterazione
for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n ANALISI DEI CRITERI DI CONVERGENZA PER IL LOOP DI CALCOLO\n'); end for ind_vele=1:conta_scelta ans_criterio(ind_vele)=criterio_loop(ind_loop,ind_vele); end
% ans_criterio=1 SE il criterio e' soddisfatto per la vela i-esima % ans_criterio=0 SE il criterio non e' soddisfatto per la vela i-esima
test_ok=all(ans_criterio); % =1 se tutti i valori diversi da zero
if test_ok==1 % criterio di convergenza ok per ogni vela
% griglie strutturali finali trasformate in :
% 1) griglie iso-u/iso-v con dimensione uguale alle matrici vela importate % 2) matrici iso-u/iso-v con dimensione della griglia strutturale
for ind_vele=1:conta_scelta
elabora1(ind_vele,ind_loop,toll_iso); end
% operazioni di chiusura
tempo_loop_END=cputime; % istante di FINE ciclo LOOP
tempo_calcolo=tempo_loop_END-tempo_loop_INI; % tempo esecuzione ciclo loop tempo_iter_END=cputime; % istante fine iterazione
tempo_iter=tempo_iter_END-tempo_iter_INI; % durata iterazione
for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n IL LOOP DI CALCOLO HA RAGGIUNTO LA CONVERGENZA\n'); fprintf(ind_fid,' ITERAZIONI DEL CICLO LOOP UTILIZZATE: %3.0f\n',ind_loop); fprintf(ind_fid,' TEMPO DI CALCOLO ULTIMA ITERAZIONE : %4.1f
(min)\n',tempo_iter/60);
fprintf(ind_fid,' TEMPO DI CALCOLO TOTALE : %4.1f (min)\n',tempo_calcolo/60);
fprintf(ind_fid,' TERMINE LOOP DI CALCOLO: %s\n',datestr(now)); end
fprintf(fid_loop,'\n --- FINE DEL LOOP DI CALCOLO ---\n'); fprintf(fid_loop,'\n SE LA CARTELLA CORRENTE E'' LOOP_NVELE:\n');
fprintf(fid_loop,' DIGITARE ''POST_PROCESSING'' PER ANALIZZARE I RISULTATI\n'); fprintf(fid_loop,' ---\n');
save('ind_loop','ind_loop'); % numero ultima iterazione
save([path_folder,'\ind_loop'],'ind_loop'); % nella cartella sessione di lavoro %---
remove_path_loop; % cancella le cartelle di LOOP dal path di matlab st_loop=fclose(fid_loop);
fclose('all');
break; % esco da ciclo LOOP else % test non soddisfatto for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n CRITERIO DI CONVERGENZA DEL CICLO LOOP NON SODDISFATTO\n'); end
end % fine ciclo if test==ok end % fine ciclo if ind_loop>1
%--- % ESAURIMENTO ITERAZIONI A DISPOSIZIONE DEL LOOP PRINCIPALE
if ind_loop==max_iter_loop % esaurite le iterazioni per ind_loop
% griglie strutturali finali trasformate in :
% 1) griglie iso-u/iso-v con dimensione uguale alle matrici vela importate % 2) matrici iso-u/iso-v con dimensione della griglia strutturale
for ind_vele=1:conta_scelta
elabora1(ind_vele,ind_loop,toll_iso); end
% operazioni di chiusura
tempo_loop_END=cputime; % istante di FINE ciclo LOOP
tempo_calcolo=tempo_loop_END-tempo_loop_INI; % tempo esecuzione ciclo loop tempo_iter_END=cputime; % istante fine iterazione
tempo_iter=tempo_iter_END-tempo_iter_INI; % durata iterazione
for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n IL LOOP DI CALCOLO HA ESAURITO IL NUMERO DI ITERAZIONI AMMESSE = %3.0f\n\n',max_iter_loop);
fprintf(ind_fid,' TEMPO DI CALCOLO ULTIMA ITERAZIONE : %4.1f (min)\n',tempo_iter/60);
fprintf(ind_fid,' TEMPO DI CALCOLO TOTALE : %4.1f (min)\n',tempo_calcolo/60);
fprintf(ind_fid,' TERMINE LOOP DI CALCOLO: %s\n',datestr(now)); end
fprintf(fid_loop,'\n --- LOOP DI CALCOLO TERMINATO ---\n'); fprintf(fid_loop,'\n SE LA CARTELLA CORRENTE E'' LOOP_NVELE:\n');
fprintf(fid_loop,' DIGITARE ''post_processing'' PER ANALIZZARE I RISULTATI\n'); fprintf(fid_loop,' ---\n');
remove_path_loop; % esclude le cartelle di LOOP dal path di matlab st_loop=fclose(fid_loop);
fclose('all'); % si chiudono tutti i file in w/r save('ind_loop','ind_loop'); % numero ultima iterazione
save([path_folder,'\ind_loop'],'ind_loop'); % nella cartella sessione di lavoro break; % esco dal ciclo LOOP
end
%--- % SE I CRITERI NON SONO SODDISFATTI SI PREPARA L'ITERAZIONE SUCCESSIVA: %--- pause(15); % per osservare i plot della vela
close all; % chiude i plot della griglia
%--- % CREAZIONE CARTELLA PER I DATI DELLA ITERAZIONE SUCCESSIVA
% ( ed aggiornamento del path di matlab)
[path_sub_folder]=crea_sub_cartella(ind_loop+1); % crea ed aggiorna il path
%--- % RIELABORAZIONE GRIGLIA_NEW PER RISPETTARE LA CONDIZIONE LINEE ISO-U E ISO-V % E SALVATAGGIO GRIGLIA NELLA CARTELLA ITER(ind_loop+1) COME
% INPUT PER L'ITERAZIONE SUCCESSIVA
fprintf(1,'\n INIZIO ELABORAZIONE ISO-U E ISO-V\n');
for ind_vele=1:conta_scelta
elabora2(ind_vele,ind_loop,toll_iso); end
fprintf(1,'\n FINE ELABORAZIONE ISO-U E ISO-V\n');
%--- % se criteri di convergenza non soddisfatti e iterazioni ancora disponibili tempo_iter_END=cputime;
tempo_iter=tempo_iter_END-tempo_iter_INI; % durata iterazione
for ind_fid=[1,fid_loop]
fprintf(ind_fid,'\n TEMPO DI CALCOLO ITERAZIONE %s : %4.1f (min)\n',num2str(ind_loop),tempo_iter/60);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end % --- FINE CICLO FOR PER IL LOOP DI CALCOLO --- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fclose('all');
%--- fprintf(1,'\n --- LOOP DI CALCOLO TERMINATO ---\n'); fprintf(1,' SE LA CARTELLA CORRENTE E'' LOOP_NVELE:\n');
fprintf(1,' DIGITARE ''post_processing'' PER ANALIZZARE I RISULTATI\n'); fprintf(1,' ---\n');