Sto scrivendo del codice in Fortran 2003 che esegue molta algebra lineare con matrici sparse. Sto cercando di sfruttare alcune delle caratteristiche più astratte del nuovo standard, quindi ho programmi più semplici senza troppo codice ripetuto.polimorfismo di run-time in fortran 2003
Ho una procedura solver
che contiene una matrice, alcuni vettori, la tolleranza per il metodo iterativo utilizzato ecc. Sto passando un puntatore a una procedura denominata matvec
; matvec
è la subroutine che usiamo per le moltiplicazioni del vettore matrice.
Il problema è che a volte matvec
è una procedura che accetta argomenti aggiuntivi colorlist, color1, color2
superiori a quelli usuali inviati a questa procedura. Posso pensare a diversi modi di affrontare questo.
Prima idea: definire due diverse interfacce astratte matvec1
, matvec2
e due diversi risolutori. Funziona ma significa duplicare del codice, che è proprio quello che sto cercando di evitare.
Un'altra idea: mantenere la stessa interfaccia astratta matvec
, e rendere gli argomenti extra , color1
, color2
opzionale. Ciò significa renderli opzionali in ogni routine MATVEC, anche quelli per i quali non sono realmente opzionali, e per le routine in cui non vengono neppure utilizzati. Abbastanza sicuro andrò all'inferno se lo faccio.
Posso pensare a molte altre soluzioni meno che ottimali. Mi piacerebbe un po 'di input su questo - Sono sicuro che c'è un modo elegante per farlo, non sono sicuro di cosa sia.