Ciao a tutti,
mi chiamo Marco, sono nuovo nel forum, anche se uso MatLab da circa un decennio. Sono contento di far parte del forum e di fare la vostra conoscenza.
Scrivo questo messaggio per chiedere il vostro aiuto e consiglio su come procedere per tramutare in essere una idea che ho in mente da qualche tempo. Provo a spiegarmi: Il problema, di per se, non è particolarmente complicato ma presenta alcuni aspetti la cui implementazione (strategia su come procedere) richiede, credo, qualche "trucchetto" e gioco di astuzia.
Lavoro nel campo della modellistica e simulazione numerica. Il modello numerico con cui lavoro necessita per girare di un file di comando: si tratta di un mero file di testo con una serie di strani comandi e parole chiave che, però, devono rispettare una certa sequenza (ordine) e struttura (comandi e sottocomandi, dipendendo dal grado di "dettaglio" con cui si vuol specificare un parametro). Oltretutto, e questo è uno dei punti slaienti, alcuni comandi (keywords) sono opzionali, mentre altri sono invece obblgatori. Per gli opzionali, quando non specificati, vengono usati i valori standard (default). Alcuni comando sono di tipo stringa, altri di tipo numerico (ed alcuni sono numeri interi, altri invece dotati di parte decimale). Molti (non tutti) possono avere diverse unità di misura
Intenderei quindi automatizzare la procedura in matlab per scrivere questo tipo di file di testo (model input file, o file di registro), in cui l'utente specifica i comandi obbligatori (imprescindibili, che devono essere presenti) e, se vuole, quelli opzionali. Il tutto secondo una sintassi molto semplificata, del tipo:
generate.input(); %aprire un progetto e creare un file di registro con tutti i valori standard
input.folder = 'somefolder/subfolder1/subfolder2'; %definre la cartella di lavoro contenente dati di entrata e di uscita
%Entrambi questi file (nomi) verranno inseriti poi nel file di testo contenete le istruzioni per far giraer il modello
input.bathymetry = 'Region1.dep'; %definire batimetria
input.grid = 'numerical_grid.grd'; %definrie file reticolo di calcolo
set.input.rhow = 1030 ; %[opzionale] modifcare il valore standard della variabile "rhow" e impostarlo a 1030
set.input.dt = 0.1 ; %[obbligatorio] impostare il passo di tempo, dt, pari a 0.1 secondi
set.input.t_end = 0.1 ; %[obbligatorio] impostare il tempo finale, t_end, pari a 100 secondi
Un esempio di file di resgistro (input file) è reperibile qui:
http://swash.sourceforge.net/examples/l31set02.sw
La mia idea sarebbe quella di creare una struttura, contenente un numero di elementi pari al numero di variabili (circa 300, ma continuamente aggiornata dagli sviluppatori). La struttura avrebbe i seguenti campi:
- nome completo della variabile (BOUNDARY)
- nome abbreviato della variabile(BOU)
- se è o non è obbligatorio, booleano
- in caso sia opzionale, indicare il valore default
- eventuale unità di misura
- tipo booleano, stringa, float o integer (o altro)
- se modificato (invocato) dall'utente (vedi snippet codice qui sopra, "set.input... ", passa da FALSE a TRUE
- se attivato dall'utente
- altri campi?
Per esempio, se il campo "attivato dall'utente"==true, allora quella variabile con quel nome e quella unitò di misura
if keyword(1).useractivaed==true (or keyword(1).ismandatory==true)
fpritnf(1, '%s = %s', keyword(1).name, keyword(1).numVal)
fprintf(1,'\n')
end
Il muro contro cui sono andato a sbattere il grugno è stato il fatto che alcuni comandi possano prevederne altri, in esso annidati. Mi spiego: se decido di attivare (scrivere nel file di testo) una certa funzionalità, questa prevede che altri sotto, -sottosotto e sottosottosotto campi, vengano anche essi definiti. Quindi, se attivo una funzionalità, devo poi riuscire ascrivere in modo "intelligente" anche il codazzo di comandi che seguono, e che il modello si aspetta (e che si aspetta in un certo ordine, e con una certa sintassi), oltre ad essere coerenti con alcuni altri valori già dichiarati in precedenza.
Trattandosi di un qualcosa di molto complesso, vorrei definire bene la strategia prima di procedere a costruire la architettura che, peraltro, mi immagino reciprocamente innervata con mille altre funzioni e sottofunzioni. Una volta stabilita una "base solida" su cui fondare tutto, inzierò a sviluppare da lì. Proprio per questo chiedo a voi quale sia il modo migliore per proseguire.
Molte grazie a chiunque voglia darmi consigli, dritte, suggerimenti o voglia fare critiche (costruttive).
Un saluto a tutti,
Marco