Determinare una strategia per scrivere su file la struttura complessa di un file di registro per un modello numerico

di il
1 risposte

Determinare una strategia per scrivere su file la struttura complessa di un file di registro per un modello numerico

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

1 Risposte

  • Re: Determinare una strategia per scrivere su file la struttura complessa di un file di registro per un modello numerico

    No,no,no.

    Stai affrontando il problema in modo TOTALMENTE sbagliato.

    Per fare queste cose ci sono sistemi STANDARD, concetti CONSOLIDATI, che si devono SOLO USARE nel modo giusto.

    1) il tuo file, per quanto complesso segue UNA GRAMMATICA BEN DEFINITA, e questa GRAMMATICA puo' essere descritta in modo UNIVOCO e NON AMBIGUO usando uno dei tanti linguaggi di descrizione delle grammatice.

    2) il tuo file, una volta letto seguendo la suddetta GRAMMATICA, puo' essere modellato mediante un ALBERO SINTATTICO (AST - Abstract Syntax Tree) che puoi navigare in modo estremamente semplice in modo ricorsivo. Ogni nodo ha il suo set di attributi e se un attributo non e' definito SAI GIA' che esso assume un valore di default.

    E questa e' la parte SWS (file di comandi) -> AST

    Tu, quello che devi fare, e' COSTRUIRE l'ALBERO SINTATTICO mediante quello che ultimamente chiamano "fluent API", che poi NAVIGHERAI per RICREARE il file SWS.

    Quello che ti serve e' una serie di OGGETTI che vengono istanziati, e che hanno dei metodi con i quali costruire i SOTTO OGGETTI (i SOTTO COMMANDI) ed impostare i valori dei PARAMETRI in modo RICORSIVO . Tutti questi OGGETTI hanno il compito di creare l'ALBERO sintattico.

    Una volta creato l'ALBERO, lo devi NAVIGARE per creare il corrispondente file SWS.

    Come si fa tutti questo?
    Non per niente ci facciamo il ma..o/cu..o all'universita e' continuiamo a studiare per anni

    Te tocca studia'!

    https://en.wikipedia.org/wiki/Visitor_patter

    https://en.wikipedia.org/wiki/Abstract_syntax_tre
    https://en.wikipedia.org/wiki/Formal_gramma
    https://en.wikipedia.org/wiki/Fluent_interfac

    e devi fare le pulci al manuale che descrive la sintassi del file SWS

    http://swash.sourceforge.net/online_doc/swashuse/swashuse.html

    Ci sono modi alternativi per farlo? Infiniti
    Ci sono modi piu' semplici? Ovviamente. Uno, ad esempio e': non porsi il problema
Devi accedere o registrarti per scrivere nel forum
1 risposte