Nello sviluppo di nuovi risolutori all'interno di OpenFOAM può risultare necessario dichiarare nuove variabili che assumono un valore costante (o variabile) all'interno del dominio analizzato. Queste variabili, solitamente dichiarate all'interno del file createFields.H, possono essere dei semplici scalari, dei vettori di scalari, dei tensori i scalari o dei dizionari. A loro volta questi valori possono essere associati all'interno campo del dominio (all'interno volume) o solamente alla superficie del dominio; in funzione del tipo di variabile da dichiarare si utilizzaranno degli oggetti differenti.
Se consideriamo le variabili che hanno un valore solo sulla superficie abbiamo:
Mentre per variabili che devono assumere valori differenti all'interno del campo di dominio si hanno a disposizione:
Una volta definito il tipo di variabile di cui si necessita si procede ad inizializzarla; questa operazione viene compiuta tramite l'utilizzo dell'oggetto IOobject che permette di effettuare la lettura dei dati contenuti all'interno dei file di partenza o dei differenti step di esecuzione, nel caso si interrompa l'esecuzione e la si riavvi in un secondo momento. La classe IOobject ha due costruttori, nel primo si definisce il nome che la variabile assume che è anche il nome del file che verrà utilizzato in fase di salvataggio; il secondo parametro è l'istanza a cui ci si riferisce. Solitamente come istanza si utilizza un valore costante (usando runTime.constant()) o l'istante temporaale in elaborazione (con runTime.timeName()), ma è possibile usare un qualsiasi testo che si riferisca ad una directory in cui si troverà il file in questione. Come terza variabili in input del costruttore si ha l'oggetto a cui viene assegnata la variabile in questione (solitamente è la mesh in elaborazione). Il quarto parametro si riferisce alle opzioni in lettura del file, che possono essere:
di dafault il valore assegnato, nel caso in cui si ometta questo campo è NO_READ.
Il quinto e ultimo parametro si riferisce alle opzioni di scrittura del file e può assumere il valore:
di default il valore impostato è NO_WRITE.
Il secondo costruttore utilizazbile per la lettura di informazioni del file, decisamente meno usato, aggiunge un ulteriore parametro che si va a inserire tra il secondo e terzo parametro del costruttore precedente e rappresenta il posizionamento locale dei file.
La dichiarazione della variabile, oltre a richiedere l'inizializzazione acquisendo i dati dal file i questione deve essere associato ad un determinato oggetto che rappresenta il dominio, quindi solitamente alla mesh del dominio.
Un esempio abbastanza comune dell'utilizzo di questo metodo per la dichiarazione di variabili è il seguente:
volVectorField U
(
IOobject
(
"U",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
Analizzando questo codice si vede che viene dichiarata una nuova variabile di tipo volVectorField chiamata U. Qusta variabile rappresenta la velocità del fluido all'interno del dominio di clacolo per ogni elemento della mesh, il primo elemento del costruttore della variabile è dato dall'oggetto IOobject, mentre la seconda parte dall'oggetto a cui devone essere applicate le proprietà prelevate dal file (ovvero alla mesh precedentemente creata e inizializzata). L'oggetto IOobject leggerà il file chiamato U che si troverà nella directory che assume il nome del timestep che viene elaborato, che questi dati devono essere applicati alla mesh e che il file deve essere obbligatoriamente presente e leggibile (MUST_READ) e che verrà scritto ogni qualvolta viene richiesto (AUTO_WRITE).
Altro esempio è dato da:
surfaceScalarField phi
(
IOobject
(
"phi",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh
);
In cui viene creata una variabile di tipo surfaceScalarField che definisce un flusso di materia lungo una superficie. L'IOobject ci dice che il file si chiamerà phi e che si troverà nella cartella con il nome uguale al tempo di esecuzione considerato. Il file non deve essere letto ne scritto, opzioni tipiche di variabili utilzizate solo all'interno del codice che non hanno interesse al di fuori di esso.
Grazie ad AlbertoP per avermi fatto rispolverare questo testo :D
Comments
Post new comment