CAPITOLO 3
DESCRIZIONE DEL SIMULATORE
3.1 GENERALITA’
In questo capitolo verrà data una descrizione del simulatore
utilizzato, illustrandone le principali caratteristiche di funzionamento e quali debbano essere le strutture dei file da inserire in ingresso al programma. Verrà inoltre data una descrizione delle modifiche apportate al codice originale, scritto in linguaggio Fortran.
Il codice è composto di sette parti, che illustriamo brevemente di seguito:
I. Main - Blocco principale che si occupa di gestire le chiamate di Pre-processing, Processing e Post-processing.
II. Pre-processing - Insieme di routine per il caricamento e l’elaborazione dei dati dai file d’ingresso, per la creazione delle strutture dati necessarie ai blocchi successivi.
III. Processing - Insieme di routine di elaborazione e di calcolo, che costituisce il nucleo del codice; è in questo blocco che sono state apportate le maggiori modifiche.
IV. Post-processing - Insieme di routine necessarie per riordinare i dati nella forma più conveniente per la loro rappresentazione.
V. Utility - Questo blocco contiene la routine che consente di determinare il segno di un elemento triangolare relativamente allo spigolo considerato.
VI. Math - Insieme di routine matematiche per il calcolo di integrali, inversioni di matrici, risoluzione di sistemi e simili.
VII. Commonvar - Questo blocco contiene un modulo in cui sono definite variabili comuni a più routine, la cui dimensione non può essere nota a priori. Esse vengono allocate e deallocate in Main. Inoltre, il programma riceve in ingresso i seguenti file:
1. il file ansys contenente le informazioni relative alla discretizzazione della struttura in esame;
2. il file campo contente la descrizione del campo incidente e parametri riguardanti il calcolo del campo reirradiato e della Radar Cross Section, (significativi solo se stiamo considerando un problema di scattering), nonché informazioni relative ad alcune opzioni presenti nel programma;
3. il file source contente informazioni relative alla sorgente (tale file è necessario solo se stiamo considerando un problema di irradiazione).
3.2 PRE-PROCESSING
Il blocco Pre-processing elabora il file ansys fornito in ingresso, contenente, come già accennato, la geometria della struttura da analizzare, in modo da poter costruire le strutture dati necessarie al simulatore vero e proprio.
Il file in ingresso è chiamato ansys perché la modellizzazione della struttura tramite elementi triangolari, detti anche patch, viene effettuata appunto tramite il software Ansys.
La discretizzazione così realizzata viene fornita da Ansys sotto forma di due file:
• un file elementi, contenente i tre nodi e l’impedenza superficiale relativi ad ogni elemento triangolare;
• un file nodi, contenente le coordinate relative a ciascun nodo.
Le informazioni contenute in questi due file devono essere inserite nel file ansys, in modo da rispettare la seguente struttura:
N11 N12 N13 ... Cη1 1
N21 N22 N23 ... Cη2 2
NNe1 NNe2 NNe3 ... CηNe Ne
-888 k1 k2 ... k12 k13
1 XN1 YN1 ZN1
2 XN2 YN2 ZN2
Nn XNn YNn ZNn
dove:
- Ne è il numero di elementi triangolari,
- Nn è il numero di nodi,
relativi alla struttura in esame. La generica riga:
Nj1 Nj2 Nj3 ... Cηj j
derivata dal file elementi, fornisce la seguente informazione:
“ l’elemento j è costituito dai nodi aventi per etichetta Nj1, Nj2 e Nj3, e la
importante notare come Ansys fornisca i nodi in un ordine tale da far sì che la normale alle facce triangolari sia diretta sempre nello stesso verso; nel caso di corpi chiusi il verso assegnato da Ansys è quello uscente dal corpo.
La riga:
-888 k1 k2 ... k12 k13
serve a comunicare al programma che le informazioni riguardanti i patch sono state interamente acquisite, e che le informazioni scritte nel seguito del file riguardano non più gli elementi triangolari, ma i nodi.
In pratica, quindi, facendo riferimento ai due file originari tramite i quali viene costruito il file ansys, questa riga separa elementi da nodi .
In realtà è il solo numero –888 ad indicare la separazione fra i due tipi di informazione; gli interi k1,k2 ...k13 possono essere assegnati
arbitrariamente dall’utente: essi sono necessari in quanto il programma ha letto, fino a questo momento, quattordici valori, ed avvertirebbe l’utente di un’inconsistenza nel file di ingresso nel caso in cui dovesse trovarne un numero minore.
Infine, la generica riga:
k XNk YNk ZNk
fornisce l’informazione: “ il nodo k ha coordinate XNk ,YNk e ZNk ”
Poiché le incognite del nostro problema sono le densità di corrente relative a ciascuno spigolo non di bordo, il blocco di pre-processing si
occuperà innanzitutto di individuare gli spigoli attraverso i nodi che li delimitano. Questa operazione viene realizzata costruendo la matrice NCONN, la cui generica riga ha la forma:
j NAj NBj
che fornisce l’informazione: “lo spigolo j ha per estremi i nodi NAj e NBj ”
Occorre notare come il programma si occupi di riordinare la matrice in modo che risulti (NAk < NBk) e (NAk < NA(k+1))
∀
k.Successivamente, il blocco di pre-procesing si occupa di individuare gli spigoli di bordo e caricarli nel vettore ITRACK. In questo modo si può capire immediatamente se, su un certo spigolo, devono essere svolte le operazioni di processing.
Vengono inoltre create altre matrici contenti informazioni sulla geometria del corpo considerato, tra le quali:
NBOUND: contiene le informazioni relative a quali spigoli formino ciascun elemento triangolare; gli spigoli di ogni patch sono ordinati in senso antiorario, cosicché la normale ad ogni elemento triangolare risulti orientata verso l’esterno, nel caso in cui si stia considerando un corpo chiuso.
NBOUN1: contiene le informazioni relative a quali nodi formino ciascun elemento triangolare.
CIMPS : contiene le impedenze superficiali relative a ciascun
Le seguenti strutture dati vengono invece create solo nel caso in cui si stia considerando un problema di irradiazione:
SORGEDGE : contiene gli spigoli relativi alla sorgente.
DISTBAR : contiene le coppie di elementi triangolari associati ad ogni spigolo di sorgente, e le distanze fra i loro baricentri.
NORM2 : contiene la direzione del campo elettrico imposto per la simulazione del problema di irradiazione.
E’ necessario un breve cenno sulla subroutine NORM2: la direzione del campo elettrico generato dall’alimentazione viene stabilita calcolando la normale alla regione di alimentazione. Il verso di tale normale viene stabilito secondo la seguente convenzione:
- nel verso delle z positive, nel caso in cui la componente del vettore normale lungo quest’asse risulti diversa da zero;
- nel verso delle x positive, se la componente lungo z dovesse risultare nulla;
- nel verso delle y positive, qualora anche la componente lungo x dovesse risultare nulla.
In realtà, il controllo sulle componenti del vettore normale viene eseguito confrontando i valori ottenuti con 1.0E-9, non con zero, per
tener conto di eventuali approssimazioni introdotte da Ansys durante la discretizzazione.
Nel caso in cui l’utente desideri orientare il campo imposto dalla sorgente nel verso opposto a quello dato per convenzione, potrà aggiungere 180° alla fase della sorgente stessa.
3.3 PROCESSING
Il blocco di processing costituisce il cuore del programma: esso esegue, sui dati elaborati dal pre-processing, le operazioni necessarie a calcolare le distribuzioni di corrente e di carica, l’andamento del campo vicino, l’impedenza di ingresso (nel caso in cui si stia esaminando un
problema di irradiazione) e, se richiesto dall’utente, il campo per r→∞ e
la Radar Cross Section.
Questo blocco provvede innanzitutto ad effettuare il calcolo degli
elementi della matrice
Z
, implementando la (1.26); osservando talerelazione, si può notare come questi elementi dipendano solo dalle caratteristiche fisiche e geometriche della struttura in esame, e dalla frequenza di lavoro.
Per calcolare il vettore dei termini noti V, il programma deve
Tale informazione è contenuta nel file campo, che deve avere la seguente struttura:
estens.
- riga non significativa per un eventuale commento –
tx ld iiii alfa niter tol din jjj nofm C
η
1η
1 Cη
nofmη
nofm freq. nfieldθ φ EθRe EθImm EφRe EφImm ffiled ircs
φmin φmax nφ θmin θmax nθ
d
xmin xmax inumx ymin ymax inumy zmin zmax inumz
dove:
estens. è l’estensione che si desidera fornire al file d’ingresso ansys ed ai file d’uscita;
ld è un intero al quale si dà valore pari ad “1” se si vuole che il
programma si sviluppi nella sua interezza, “2” se si vuole escludere il pre-processing ed il calcolo della matrice delle impedenze (nel caso in cui si voglia, ad esempio, analizzare più volte la stessa struttura con differenti campi incidenti) , “3” se si vuole partire direttamente dai coefficienti di corrente salvati in una precedente esecuzione;
iiii è un intero il quale ha valore pari ad “1” se si vuole che il
programma utilizzi, nel processing, il software RMA_Iterative_Solver per la risoluzione dell’equazione matriciale, 2 se si vuole utilizzare la routine csminv;
alfa è una variabile reale a doppia precisione, necessaria se si utilizza il software RMA_Iterative_Solver per la risoluzione della (1.24);
niter è il numero massimo di iterazioni che permettiamo di far
eseguire al solver iterativo;
tol è la tolleranza entro la quale si decide di accettare il risultato fornito dal solver iterativo;
din è una costante a doppia precisione necessaria alla funzione Exprn presente nel blocco Math, e alla quale è consigliato assegnare il valore 1.0E-6;
jjj è un intero il quale assume valore pari ad “1” se si vuole che il programma utilizzi, nel post-processing, delle routine atte ad una rappresentazione tridimensionale delle densità superficiali di corrente e di carica attraverso l’ausilio di Matlab (tali routine sono valide nel solo caso
di piastra piana disposta sul piano x-y), “2” in caso contrario (la rappresentazione è realizzata, sempre con Matlab, attraverso una scala di colori);
nofm è il numero di materiali contemplati;
C
η
i edη
i sono rispettivamente il descrittore del materiale i-esimopresente in tabella e la relativa impedenza caratteristica; freq è la frequenza di lavoro espressa in GHz;
nfield è il numero di campi incidenti (tale informazione è
significativa solo se stiamo analizzando un problema di scattering, ossia se tx=0);
θ e φ individuano la direzione di propagazione dell’onda
elettromagnetica incidente in un sistema di coordinate sferiche (anche questi dati risultano significativi solo se tx=0);
EθRe ed EθImm sono rispettivamente la parte reale e la parte
immaginaria della componente del campo elettrico incidente lungo la direzione θ , nel caso sia tx=0;
EφRe ed EφImm rappresentano coefficiente reale e coefficiente
immaginario del campo elettrico lungo φ, nel caso risulti tx=0;
ffield è un intero al quale si dà valore pari ad “1” se si vuole che il
programma effettui anche il calcolo del campo lontano, “0” in caso contrario;
ircs è un intero al quale si dà valore pari ad “1” se si vuole che il
programma effettui anche il calcolo della Radar Cross Section, “0” in caso contrario;
La riga successiva è significativa solo se il programma deve calcolare la Radar Cross Section o il campo lontano (cioè se ffield=1 o
ircs=1); in dettaglio:
φmin, φmax, θmin e θmax delimitano la regione lungo φ e lungo θ su cui
si è interessati a conoscere il valore della Radar Cross Section e/o del campo lontano;
nφ e nθ rappresentano il passo con cui scandire la regione
d’interesse;
d è un intero al quale si dà valore pari ad “1” se si vuole che il
programma effettui anche il calcolo del campo elettrico vicino reirradiato, “0” in caso contrario;
r è la distanza alla quale si desidera conoscere il campo elettrico in
zona lontana.
L’ultima riga è significativa solo se d=1; in dettaglio:
xmin, xmax, ymin, ymax, zmin e zmax delimitano la regione lungo x, y e z
su cui si è interessati a conoscere il valore del campo;
inumx, inumy ed inumz rappresentano il passo con cui scandire la
regione d’interesse.
Supponiamo di esaminare un problema di scattering: attraverso la lettura delle informazioni contenute in campo, il blocco di processing è in
grado di valutare il vettore dei termini noti V, implementando la (1.25).
Osservando tale espressione, possiamo notare come essa risulti dipendente sia dalla geometria del corpo in esame, sia dalle caratteristiche del campo elettrico incidente.
Ipotizziamo adesso di esaminare un problema di irradiazione: le informazioni relative alla sorgente vengono fornite dal file source, che deve avere la seguente struttura:
S A1 B1 1 A2 B2 1 Ak Bk j AS Bs Ns Amp1 Phase1 AmpNs PhaseNs Nzin dove:
S è il numero di spigoli di sorgente;
Ak Bk j sono i nodi che individuano lo spigolo k appartenente
alla sorgente j ;
Ampj Phasej sono l’ampiezza e la fase della sorgente j ;
Nzin indica l’alimentazione rispetto alla quale si vuole conoscere
l’impedenza d’ingresso.
In questo caso, il software calcola il vettore dei termini noti implementando non la (1.25), ma la (2.6).
Una volta generati Z e V, il blocco di processing si occupa di risolvere il sistema (1.24):
Z
I
=
V
invertendo la matrice
Z
tramite csminv, oppure utilizzando il solveriterativo RMA_Iterative_Solver, a seconda di quale sia stata la scelta dell’utente. Per una descrizione di quest’ultimo programma, si veda il paragrafo 3.5.
Una volta noto il vettore I, verranno calcolate le distribuzioni di
corrente e di carica e, se richiesti, il campo vicino, il campo lontano e la Radar Cross Section.
Il blocco di processing provvede inoltre al calcolo dell’impedenza d’ingresso tramite la funzione ZIN, nel caso in cui si stia considerando un problema di irradiazione; questo avviene implementando la (2.24) se siamo in presenza di una sola alimentazione, oppure la (2.25) nel caso le sorgenti siano due o più. Il risultato viene fornito nel file di uscita zin.
Per quanto riguarda il calcolo del campo lontano, il programma è in grado di riconoscere se stiamo effettuando un’analisi con φ oppure θ costante: in questo caso crea due file, ephinorm ed ethetanorm nei quali inserire le componenti lungo φ e lungo θ del campo lontano normalizzate al valore massimo; questo per agevolare la rappresentazione dei diagrammi di irradiazione tramite software come Kaleidagraph.
Infine, la Radar Cross Section viene calcolata a partire dall’espressione del campo in zona lontana (2.22), implementando la relazione: 2 2 2
)
0
,
0
(
)
,
(
4
lim
)
,
,
,
(
inc s r inc incr
E
E
θ
φ
π
=
φ
θ
φ
θ
σ
∞ → , (3.1)valida nel caso di onda incidente piana [14]. Poiché sotto questa ipotesi vale:
|H
inc| = |E
inc| / η
M,
(3.2)
con ηM impedenza caratteristica del mezzo circostante, la (3.1)
diventa: 2 2 2 2 ( ) 4 lim ) ( inc s M r r H r E r η π = σ ∞ → . (3.3)
Tenendo conto della (2.22) si ha, infine:
2 2 N 1 n r n c n n M c n r c n r n c n n M c n r c n n n M M 2 jkη µ 2 jω ) exp(jk 2 jkη µ 2 jω ) exp(jk l I µ ε 4π 1 ) σ( inc H i i ρ ρ i r i i ρ ρ i r r
∑
= − − − − + + + + × × + ⋅ + × × + ⋅ ⋅ ⋅ = (3.4)Poiché in zona lontana il campo elettrico reirradiato può essere considerato un’onda piana:
E
s≅ i
θE
θs+ i
φE
φs (3.5)la Radar Cross Section può essere scritta come :
σ
(
θ
,
φ
,
θ
inc,
φ
inc)
=
σ
θ(
θ
,
φ
)
+
σ
φ(
θ
,
φ
)
(3.6)ed il software fornisce l’uscita sia nella forma (3.4) che nella forma (3.6), tramite i file rcs, rcstheta e rcsphi.
Il calcolo della Radar Cross Section è significativo solo nel caso in cui si stia affrontando un problema di scattering, poiché nel caso di un problema di irradiazione non si ha un vero e proprio campo incidente.
3.4 POST-PROCESSING
Diamo ora una breve descrizione del blocco Post-processing.
Esso comprende alcune routine necessarie a riordinare i dati in modo da rendere possibile la visualizzazione delle distribuzioni di carica e di corrente tramite l’ausilio di Matlab.
A questo scopo vengono utilizzati i file di uscita x, y, z, charge_matl e current.
In particolare, se stiamo analizzando una piastra piana, è possibile riportare tali distribuzioni su grafici tridimensionali: per fare ciò, si devono riordinare gli spigoli, ed i relativi coefficienti di corrente, in modo da scandire la superficie dall’ascissa minima a quella massima e, per ogni ascissa, dall’ordinata minima a quella massima.
I coefficienti di corrente I all’interno di ogni faccia vengono calcolati utilizzando la seguente relazione:
1 1 1 2 2 2 3 3
I
32
I
2
I
2
I
ρ
ρ
ρ
A
l
A
l
A
l
+
+
=
(3.7)dove I1, I2, I3 rappresentano i coefficienti della densità di corrente
relativi a ciascuno spigolo del patch considerato, con riferimento alla figura 3.1; A indica l’area del patch.
Il verso del vettore ρi sarà diverso a seconda che il patch sia positivo
o negativo relativamente allo spigolo i. La subroutine sgnfaccia nel blocco Utility si occupa di stabilire tale verso.
3.5 SOLVER ITERATIVO
In questo paragrafo verrà brevemente illustrato l’utilizzo del software RMA_Iterative_Solver. Questo software consente di risolvere l’equazione matriciale (1.24):
Z
I
=
V
tramite un metodo iterativo precondizionato. Se utilizzato su un calcolatore con almeno 512 Kbyte di RAM, è in grado di abbreviare notevolmente i tempi di calcolo, consentendo di infittire la discretizzazione pur mantenendo accettabili i tempi di esecuzione.
ρ3 ρ2 ρ1 l3 l1 l2
Il software è disponibile come file di libreria, e se ne deve effettuare il link tramite l’apposita opzione di Visual Fortran; in alternativa, può essere posto nella stessa directory del programma principale.
La sintassi per la chiamata è.
CALL RMA_iterative_solver(N,Z,V,I, TOL, NITER,ALFA,IERR) dove:
N : Dimensione del sistema lineare di equazioni (intero);
Z : Matrice NxN (complesso a doppia precisione); V : Vettore Nx1 (complesso a doppia precisione);
TOL : Errore residuo percentuale massimo richiesto (reale a
doppia precisione);
ALFA : Variabile reale a doppia precisione;
NITER: Variabile intera che indica il numero massimo di
iterazioni che vogliamo far eseguire al solver: nel caso in cui la tolleranza richiesta non venga raggiunta, l’esecuzione del solver termina dopo NITER passi. Viene consigliato di porre NITER=N.
Il solver restituisce in uscita:
X : Vettore soluzione Nx1 (complesso a doppia precisione); TOL : Errore residuo percentuale ottenuto;
NITER: Numero d’iterazioni effettuate per raggiungere tale errore;
Occorre notare come la scelta di ALFA sia critica per il raggiungimento della tolleranza desiderata. Nel caso in cui N sia inferiore a 1500, un valore di ALFA pari a 0.5 o 1.0 dà solitamente buoni risultati. Con l’aumentare della dimensione del sistema, è consigliabile aumentare anche ALFA.
Se poi stiamo analizzando un problema di irradiazione, la scelta di
ALFA risulta ancora più determinante. A causa dei numerosi termini nulli
presenti nel vettore V, è infatti possibile che una variazione di pochi decimi nel valore di ALFA decida della convergenza o meno della procedura alla tolleranza richiesta.
L’intervallo all’interno del qual far variare il parametro ALFA è compreso tra 0 e 99: per valori esterni a questo intervallo il solver fornisce risultati non attendibili.
L’errore residuo percentuale TOL è definito nel modo seguente:
⋅ − = 100 TOL 2 2 V V ZI %
TABELLA 1
IERR
Descrizione
0 Risoluzione riuscita
(il risultato è collocato in I, il numero d’iterazioni in NITER e l’errore residuo in TOL)
1 Matrice di sistema mal condizionata
(nessun’uscita)
2 Memoria insufficiente
(nessun’uscita)
3 Tutti od alcuni dei seguenti parametri non sono validi:
N, NITER, TOL
(nessun’uscita)
6 La convergenza non è riuscita nel numero N d’iterazioni
richieste