|
|
|
|
L'inizializzazione del sistema prevede, ora, che l'assemblaggio del
|
|
|
|
|
descrittore e quello della matrice possano essere eseguiti
|
|
|
|
|
indipendentemente.
|
|
|
|
|
Durante la sua vita, il descrittore pu<70> trovarsi in due differenti
|
|
|
|
|
stati:
|
|
|
|
|
1. bld: stato di build. in questo stato <20> possibile aggiornare il
|
|
|
|
|
contenuto del descrittore attraverso la routine psb_dscins.
|
|
|
|
|
2. asb: stato assembled. questo <20> lo stato della rappresentazione
|
|
|
|
|
finale del descrittore ed <20> raggiunto a valle di una chiamata alla
|
|
|
|
|
routine psb_dscasb.
|
|
|
|
|
|
|
|
|
|
Durante la sua vita, la matrice pu<70> trovarsi in tre differenti
|
|
|
|
|
stati:
|
|
|
|
|
1. bld: stato di build. in questo stato <20> possibile aggiornare il
|
|
|
|
|
contenuto dela matrice attraverso la routine psb_spins.
|
|
|
|
|
2. asb: stato assembled. questo <20> lo stato della rappresentazione
|
|
|
|
|
finale della matrice ed <20> raggiunto a valle di una chiamata alla
|
|
|
|
|
routine psb_spasb.
|
|
|
|
|
3. upd: stato di update. <20> lo stato in cui <20> possibile (attraverso
|
|
|
|
|
una chiamata alla routine psb_spasb) rigenerare la matrice.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Assemblaggio contestuale di matrice e descrittore
|
|
|
|
|
|
|
|
|
|
Il procedimento da seguire prevede il seguente ordine di chiamate:
|
|
|
|
|
1. psb_dscall: allocazione del descrittore. Alla fine di questo
|
|
|
|
|
step lo stato del descrittore sar<61> bld
|
|
|
|
|
2. psb_spall: allocazione della matrice. Alla fine di questo
|
|
|
|
|
step lo stato della matrice sar<61> bld
|
|
|
|
|
3. psb_spins: in questo caso sia il descrittore che la matrice
|
|
|
|
|
saranno nello stato bld. Quindi la psb_spins invoca la
|
|
|
|
|
psb_dscins per portare il descrittore in uno stato pre-asb e
|
|
|
|
|
poi effettivamente inserisce i coefficienti nella
|
|
|
|
|
matrice (che quindi sar<61> anch'essa in uno stato
|
|
|
|
|
pre-asb). Dunque, nel caso di costruzione/assemblaggio
|
|
|
|
|
contestuale di matrise e descrittore, il contenuto del
|
|
|
|
|
descrittore <20> implicitamente aggiornato da questa
|
|
|
|
|
chiamata. (nel caso separato bisogner<65> esplicitamente
|
|
|
|
|
prevedere questa fase attraverso una chiamata alla psb_dscins)
|
|
|
|
|
4. psb_dscasb: il descrittore viene assemblato e quindi portato
|
|
|
|
|
allo stato asb.
|
|
|
|
|
5. psb_spasb: la matrice viene assemblata e quindi portata
|
|
|
|
|
allo stato asb.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Assemblaggio di descrittore e matrice indipendenti
|
|
|
|
|
|
|
|
|
|
Il procedimento da seguire per costruire/assemblare il descrittore
|
|
|
|
|
prevede il seguente ordine di chiamate:
|
|
|
|
|
1. psb_dscall: allocazione del descrittore. Alla fine di questo
|
|
|
|
|
step lo stato del descrittore sar<61> bld
|
|
|
|
|
2. psb_dscins: il descrittore viene inizializzato a partire dal
|
|
|
|
|
pattern di sparsit<69> della matrice e dal partizionamento. Alla
|
|
|
|
|
fine di questo step sar<61> in uno stato pre-asb
|
|
|
|
|
3. psb_dscasb: il descrittore viene assemblato e quindi portato
|
|
|
|
|
allo stato asb.
|
|
|
|
|
|
|
|
|
|
Il procedimento da seguire per costruire/assemblare la matrice
|
|
|
|
|
prevede il seguente ordine di chiamate:
|
|
|
|
|
1. psb_spall: allocazione della matrice. Alla fine di questo
|
|
|
|
|
step lo stato della matrice sar<61> bld
|
|
|
|
|
2. psb_spins: i coefficienti vengono effettivamente inseriti
|
|
|
|
|
nella matrice che sar<61> portata ad uno stato pre-asb.
|
|
|
|
|
3. psb_spasb: la matrice viene assemblata e quindi portata
|
|
|
|
|
allo stato asb.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Aggiornamento della matrice
|
|
|
|
|
Se il pattern di sparsit<69> della matrice non cambia, la matrice pu<70>
|
|
|
|
|
essere aggiornata attraverso il seguente procedimento:
|
|
|
|
|
1. psb_sprn: reinizializza la matrice. Alla fine di questo step
|
|
|
|
|
la matrice sar<61> nello stato upd
|
|
|
|
|
2. psb_spins: i coefficienti della matrice vengono reinseriti
|
|
|
|
|
3. psb_spasb: la matrice viene assemblata e riportata nello stato
|
|
|
|
|
asb.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
La gestione degli errori
|
|
|
|
|
|
|
|
|
|
La nuova gestione degli errori prevede la creazione di uno stack di
|
|
|
|
|
messaggi di errore che possa consentire di seguire a ritroso la
|
|
|
|
|
sequenza di chiamate di routine fino ad arrivare a quella in cui
|
|
|
|
|
l'errore <20> stato rilevato. Tutte le nuove interfacce prevedono un
|
|
|
|
|
argomento "info" il quale ritorna un valore > 0 se all'interno della
|
|
|
|
|
routine chiamata <20> stato rilevato un errore. Dunque ogni volta che
|
|
|
|
|
si rileva una condizione di errore (o per verifica diretta o perch<63>
|
|
|
|
|
una routine chiamata ha ritornato info>0) occorre mettere l'errore
|
|
|
|
|
in cima allo stack per mezzo della routine
|
|
|
|
|
psb_errpush(info,name,i_err,a_err) in cui:
|
|
|
|
|
info: codice di errore (si veda SRC/F90/errormod.f90 per una
|
|
|
|
|
corrispondenza codice-messaggiodierrore)
|
|
|
|
|
name: stringa di lunghezza 20 contenente il nome della routine
|
|
|
|
|
che invoca la psb_errpush()
|
|
|
|
|
i_err: opzionale. E' un array di 5 interi contenente informazioni
|
|
|
|
|
aggiuntive per il messaggio di errore (si veda errormod.f90)
|
|
|
|
|
a_err: opzionale. E' una stringa di 20 contenente informazioni
|
|
|
|
|
aggiuntive per il messaggio di errore (si veda errormod.f90)
|
|
|
|
|
|
|
|
|
|
attraverso la routine psb_seterrverbosity si pu<70> impostare la
|
|
|
|
|
verbosit<69> del messaggio d'errore (se =1 viene stampato solo l'errore
|
|
|
|
|
in cima allo stack; se >1 vengono stampati tutti)
|
|
|
|
|
|
|
|
|
|
la routine psb_error(ictxt) provoca la stampa degli (dell') errori
|
|
|
|
|
(errore) sullo stack ed, eventualmente, stronca il set di processi.
|
|
|
|
|
l'argomento ictxt <20> opzionale: se <20> assente viene semplicemente
|
|
|
|
|
stampato il messaggio d'errore altrimenti viene anche abortita
|
|
|
|
|
l'esecuzione di tutti i processi.
|
|
|
|
|
|
|
|
|
|
la routine psb_seterraction(action) determina quale azione deve essere
|
|
|
|
|
intrapresa a fronte del rilevamento di un errore:
|
|
|
|
|
action =0 : la routine in cui <20> stato rilevato un errore (e quindi
|
|
|
|
|
dopo che l'errore stesso sia stato inserito sullo stack)
|
|
|
|
|
semplicemente ritorna al chiamante un codice di errore
|
|
|
|
|
action =1 : la routine in cui <20> stato rilevato un errore (e quindi
|
|
|
|
|
dopo che l'errore stesso sia stato inserito sullo stack)
|
|
|
|
|
prima di ritornare invoca la psb_error (e quindi, pu<70>, eventualmente
|
|
|
|
|
stroncare l'esecuzione di tutti i processi).
|