Introduzione
Con questo intervento tecnico vorrei offrire una prospettiva sulla costruzione di un framework di modellazione fisica con software open source. Questo è un lavoro che sto svolgendo da molto tempo e che mi ha dato molto piacere.
Perché – e – Quando
Innanzitutto, dobbiamo tornare alla domanda: perché dovresti farlo? Non è sufficiente Zemax, Comsol o VirtualLab? Nel contesto di questo discorso, ritengo che questi strumenti siano eccellenti per risolvere alcuni problemi ben specifici e mirati, mentre con strumenti come Matlab o la sua alternativa OSS, Octave, puoi affrontare le domande più generali. Ad esempio, con Zemax puoi definire un obiettivo. Per farlo, dovevi aggiungere un certo numero di parametri. Alcuni fattori, come la dimensione del campo o l’ingrandimento, erano ovvi. Altri, come l’apertura numerica o la distorsione, potevano rivelarsi più difficili da determinare. E poi ci sono quelli che si basano su ipotesi ragionevoli, ma che alla fine finiscono per entrare nella funzione di merito. Per “derivare” l’apertura numerica, la modellazione fisica può aiutare a affrontare le domande più generali, che possono essere utilizzate per collegare le esigenze del cliente ai parametri utilizzati per la progettazione dell’obiettivo.
Octave contro Matlab
Ma andiamo a parlare ora Ottava. Quali sono i suoi vantaggi e i suoi svantaggi, in particolare rispetto a Matlab? Uno è la velocità. Matlab è il prodotto più maturo, con più risorse dedicate all’ottimizzazione. Sebbene sia dotato di un compilatore Just-in-Time maturo, quello che era disponibile per Octave è stato eliminato a causa delle difficoltà di maturazione e manutenzione. Qui, tuttavia, vale la pena ricordare le tre regole dell’ottimizzazione:,
- Non farlo
- Non farlo ancora
- Prima il profilo
Per questo motivo, non credo che dovremmo preoccuparci delle differenze di velocità tra questi strumenti. Sì, per i benchmark mirati, Matlab trionferà. Nella maggior parte dei casi, nella risoluzione dei problemi della vita reale, la differenza non sarà così significativa, e dove si verifichi l’interfaccia con i binari compilati è in realtà molto semplice per Octave, mentre con Matlab è molto meno così. Una differenza molto specifica è che è necessario avviare la sessione di Matlab come sessione di debug. Con Octave, è sufficiente “attaccare” e “distaccare” un debugger ogni volta che ne avete bisogno.
L'istruzione è importante
Qualcosa di cui non parlo abbastanza è la diffusione delle conoscenze all’interno di un’organizzazione. La maggior parte delle aziende accetterebbe un costo di licenza di 50 o 100 mila dollari per uno o più sviluppatori che necessitano di uno strumento specifico, ma molto spesso molte altre persone trarrebbero beneficio dal conoscere il funzionamento delle cose. Il valore intangibile dell’OSS è che può essere implementato ovunque e in qualsiasi momento, e questo ha un valore aggiunto. Ad esempio, i programmatori potrebbero aver bisogno di input realistici per testare il loro codice prima di poterlo ottenere da un prodotto che ancora non esiste. Una riunione in cui possiamo dimostrare come funzionano realmente le cose contribuirà a prendere decisioni migliori e a allineare un’organizzazione verso l’obiettivo comune in modo più efficace rispetto al tentativo di convincere gli assistenti attraverso argomentazioni logiche e ragionamenti coerenti. Ricordate: “Convincere un uomo contro la sua volontà, lui rimane comunque dell’opinione opposta”.
Andiamo al punto:
Ok, abbastanza con le chiacchiere frivole. Passiamo ora all’argomento serio. Non parlerò di come parallelizzare il vostro codice in Octave (o Matlab), questo è già trattato in tutto il web. Ciò che mi occuperò di trattare è l’esperienza maturata nell’interfacciamento tra il codice C e la scrittura di codice facile da leggere. Inoltre, c’è anche il tema dei tipi di dati. In Octave, il tipo predefinito è un float a precisione doppia. Sebbene questo sia spesso un buon punto di partenza, spesso non è necessario per la modellazione fisica e, se vi accorgete di averne bisogno, considerereste questo un indicatore che i metodi numerici dovrebbero essere rivisitati. In ogni caso, l’interfaccia tra un linguaggio dinamico come Octave e un linguaggio statico come C richiede almeno un’attenta considerazione prima di tentare di scrivere codice a livello di produzione.
Perciò, andiamo ancora più nel dettaglio. Si dovrebbe usare il compilatore mex o uno strumento come il compilatore GNU, gcc? In questo caso suggerisco di compilare il codice con il compilatore GNU o con Clang. Il compilatore mex non supporta alcuni attributi molto utili come “__attribute__((cleanup))” che permette di allocare e dimenticare. Tutti dimentichiamo qualcosa, quindi perché non ammetterlo e scrivere il codice in modo da poterlo fare senza problemi? Inoltre, non esiste alcun comando “make” o altro strumento di compilazione per Octave. La minima preparazione necessaria per configurare un ambiente di compilazione (come make/Makefile) si ripagherà.
Esistono esempi di codice
Cominciamo dall'ambiente di sviluppo. Lo strumento di compilazione make è spesso sufficiente per il tipo di codice che si può compilare per interfacciarsi con Octave.,
Questo pezzo di Makefile è tratto direttamente da uno degli esempi che troverete sul nostro sito web. server gitlab (scrivete una e-mail con il nome utente preferito a Contatto per ottenere l'accesso).

Tutte le funzioni mex hanno lo stesso prototipo. Inserite questo nel template come quello qui sotto e in pochissimo tempo avrete già compilato il codice. Per il codice C tradizionale, l'utilizzo dell'enum, come sempre, rende il codice più facile da leggere. In[in_sing_values] [0] è molto più facile da leggere rispetto a In[0], e l'enum vi permette addirittura di digitare i numeri senza dover premere il tasto di scelta.

Ma facciamolo un po’ più interessante. Come gestiamo i vari tipi? Per affrontare questo problema, l’interfaccia mex ha una funzione che restituisce il tipo della variabile chiamato mxGetClassID(). Tuttavia, spetta a noi implementare il codice per ogni tipo. Per piccoli frammenti di codice, personalmente non mi sognerei di copiare e incollare il codice e sostituire il tipo utilizzando l’editor.
Per codici più complessi, è sicuramente consigliabile utilizzare il preprocessore C e alcuni template. Di seguito è riportato un esempio:,

e poi, all'interno del codice del boilderplate, usa,

ogni volta che è necessario chiamare la funzione tipicamente abstractata.
Infine, definire tutte le varianti necessarie con,

E all'interno della funzione mex-interface,

Non c’è dubbio che la soluzione del “copia e incolla” sia più veloce rispetto all’inserimento del boilerplate. Non c’è nemmeno dubbio che arriverà il momento in cui dovremo debuggare una sola copia del codice, dimenticando di cambiare il codice per gli altri tipi, e che questo processo richiederà molto più tempo rispetto all’inserimento del boilerplate.
Conclusione
I software open source vantano numerosi vantaggi nell’ambito della distribuzione, e molte delle loro funzionalità sono davvero solide. Ad esempio, Octave semplifica notevolmente lo sviluppo di progetti di ottica fisica grazie alle sue tool di analisi e visualizzazione dei dati facili da usare. Inoltre, funziona perfettamente con linguaggi potenti come C o C++, quindi è possibile affrontare i problemi di prestazioni o approfondire funzionalità avanzate come la programmazione parallela quando si necessita di elaborare dati molto pesanti.
Con OSS si ottiene flessibilità, efficienza e accesso a strumenti all'avanguardia, che possono davvero aumentare la produttività e aiutarti a realizzare progetti migliori.
Se ritenete che questo possa essere vantaggioso per la vostra organizzazione, vi preghiamo di Contatto Per saperne di più e scoprire come Senslogic possa supportarvi.