Dalle origini a MODFLOW-96
La prima versione di un codice di calcolo simile per caratteristiche a MODFLOW è stata sviluppata fra il 1981 e il 1983 [13] con l’obiettivo di riunire in un unico pacchetto una serie di prodotti già utilizzati in precedenza per eseguire simulazioni di flusso di falda.
I programmi precedentemente disponibili [16]–[18] non erano infatti strutturati in modo da poter essere facilmente aggiornabili e pertanto le modifiche che con il tempo venivano eseguite implicavano spesso variazioni sostanziali di tutto il codice di calcolo.
Per ovviare a questo inconveniente, già dalla versione del 1984 il predecessore del MODFLOW aveva già una chiara struttura modulare, ben esplicitata anche dal nome: Modular three dimensional finite difference ground water flow model.
La struttura modulare e l’apertura verso lo sviluppo di nuovi pacchetti aggiuntivi si coglie molto bene dall’immagine di copertina del manuale d’uso (Figura 1).
Molto significativa la rappresentazione di alcuni pacchetti con un retino puntinato, ad indicare qualcosa che ancora non esiste ma che potrebbe in futuro essere aggiunto ed integrato nell’architettura esistente.
Fin dall’origine il programma è stato strutturato con una parte centrale, chiamata Main e una serie di moduli organizzati in procedure e in Packages. Le procedure vengono eseguite in sequenza in quanto ognuna svolge un compito propedeutico per la successiva. Cioè, ad esempio, la terza procedura può essere eseguita solamente se sono state eseguite la prima e la seconda.
I packages rappresentano invece raggruppamenti di moduli che devono svolgere un compito specifico. Alcuni packages devono sempre essere attivati, altri invece vengono attivati solamente se necessario. Nella versione iniziale i packages sempre attivi sono ad esempio il BAS, che imposta i criteri per il calcolo del flusso nell’acquifero e il SIP, che permette di risolvere il modello con il metodo delle iterazioni. Quelli opzionali sono ad esempio il WEL, che si attiva solamente se nel modello sono presenti pozzi o il RIV, che si attiva solamente in presenza di corsi d’acqua.
Fermo restando l’ordine sequenziale di esecuzione delle procedure, il tipo di moduli richiamati cambia da modello a modello, in funzione dei packages attivati.
La Tabella 1 mostra in modo semplificato il rapporto fra Packages, procedure e moduli. Nelle righe della tabella sono riportate le procedure in ordine di esecuzione (da P1 a Pn) e nelle celle delle colonne i moduli associati ai vari packages. Nella tabella esemplificativa al packages WEL sono associati i moduli WELP2 e WELPn mentre al packages RIV il modulo RIVPn.
Se occorre eseguire un modello nel quale sono presenti unicamente dei pozzi verrà attivato solamente il packages WEL, oltre ai moduli BAS e SIP che devono sempre essere attivati.
La sequenza di elaborazione sarà quindi costituita per la procedura P1 dal modulo BASP1, per procedura P2 dai moduli BASP2, WELP2 e SIPP2 e per la procedura Pn dai moduli BASPn e WELPn. I moduli RCHP2 e RIVPn, relativi ai packages RCH e RIV vengono ignorati in quanto i relativi packages (RCH e RIV) non sono attivati.
Questa struttura modulare, impostata fin dall’origine e mantenuta in tutte le successive versioni di MODFLOW, ha permesso di sviluppare in parallelo modifiche e miglioramenti al codice andando solamente ad agire sui singoli packages del modello.
Nel 1988 venne rilasciata prima versione ufficiale di MODFLOW [12] chiamata appunto MODFLOW-88. Le funzionalità erano sostanzialmente le medesime della versione precedente e cioè una simulazione usando il metodo delle differenze finite a blocchi centrati, la possibilità di utilizzare layer di tipo confinato, non confinato o misto e la possibilità di introdurre nel modello pozzi, dreni corsi d’acqua e di simulare l’effetto di ricarica dell’acquifero e di evapotraspirazione.
La differenza principale rispetto alla versione precedente risiedeva nel linguaggio di programmazione, divenuto conforme allo standard Fortran 77.
Dal 1990 MODFLOW divenne uno degli strumenti più utilizzati per simulare i flussi di falda, venne progressivamente implementato con l’aggiunta di nuove funzionalità e qualche anno più tardi venne rilasciata la versione MODFLOW-96 [4], [5].
Questa nuova versione presentava miglioramenti nella gestione dei dati in fase di immissione ed analisi dei risultati e adattamenti alle mutate tecnologie, come ad esempio le nuove stampanti che mal si adattavano al formato di output del precedente MODFLOW-88.
Il metodo utilizzato per eseguire le simulazioni era rimasto invariato e tutte le funzionalità del MODFLOW-88 erano state inserite nella nuova versione. Inoltre era stata inserita la possibilità di rendere nuovamente attive le celle che nel corso di una determinata fase della simulazione divenivano insature [14] e la possibilità di calcolare in modo più preciso la permeabilità equivalente fra due celle adiacenti del modello [2].
Altre implementazioni importanti inserite durante questa fase di sviluppo di MODFLOW sono state la possibilità di inserire nel modello corsi d’acqua esaminandone l’interazione con l’acquifero sottostante [15], l’implementazione del metodo PCG2 per risolvere le equazioni di flusso [8], la possibilità di simulare la compattazione dei terreni in seguito alla depressione piezometrica indotta dal pompaggio [10], un aumento di flessibilità per la definizione della conduttanza fra le celle del modello [6], la possibilità di simulare limiti impermeabili a sviluppo prevalentemente verticale [9], la possibilità di simulare lo scambio idrico fra un livello acquifero confinato e i livelli sovrastanti e sottostanti di confinamento [10], la possibilità di simulare lo scambio idrico fra aree superficiali allagate e l’acquifero sottostante [1] e la possibilità assegnare a porzioni del modello un carico idraulico e/o una portata di filtrazione predefinita [11].
La struttura costituita da packages, procedure e moduli aveva permesso una facile implementazione di MODFLOW per quello che riguardava l’aggiornamento di packages esistenti e l’inserimento di packages nuovi ma non aveva permesso un’agevole implementazione di nuove soluzioni per le equazioni di flusso. Il programma, infatti, fino a questo livello di sviluppo poteva unicamente ricostruire le distribuzioni dei carichi idraulici e in questo senso poteva essere efficacemente aggiornato, ma non era idoneo a sviluppi più strutturali, come ad esempio la simulazione del trasporto degli inquinanti o la calibrazione.