4. Implementaci´ on
4.2. Arquitectura del sistema
4.2.1. Generaci´ on de celdas
El m´etodo de lattice Boltzmann utiliza un sistema de grilla para representar la informaci´on. Esta grilla est´a compuesta por celdas de tama˜no uniforme. Para posterior generaci´on de matrices de transici´on que se utilizar´an en la etapa de colisi´on del m´etodo, es necesario primero identificar a que celda corresponde cada parte del modelo a simular.
Las geometr´ıas objetivos son representadas en un formato est´andar (Wavefront OBJ) [33], el cual consta de definici´on de puntos en el espacio y aristas que los unen, formando pol´ıgonos. La Figura 4.2 es un ejemplo de un modelo tridimensional des- cripto en el formato. Para simplificaci´on del trabajo, todas las definiciones de objetos son generadas a partir de tri´angulos, la m´ınima definici´on posible de superficie. Cada triangulo es almacenado como una terna de puntos representando sus v´ertices. Los valores m´aximos y m´ınimos de los v´ertices en cada dimensi´on definen el tama˜no del objeto.
Figura 4.2: Modelado de una habitaci´on.
La cantidad de v´oxeles en la grilla es un par´ametro a asignar al sistema. El tama˜no de las celdas se calcula como el cociente entre el lado m´aximo de la figura y la cantidad de celdas por lado.
La inicializaci´on del sistema consta de la lectura de la geometr´ıa y la creaci´on de la grilla. Una vez cargado todo en memoria, se debe realizar la asociaci´on entre las superficies y los v´oxeles que lo contienen. La asignaci´on es trivial cuando una superficie est´a incluida totalmente en un v´oxel. Si los v´ertices de un triangulo se en- cuentran en distintas celdas, la figura pertenece a varias de ´estas. Una superficie que interseque m´as de una celda no necesariamente pertenece s´olo a las cuales yacen sus v´ertices, sino tambi´en su superficie puede atravesar v´oxeles intermedios. La Figura 4.3 representa el pseudoc´odigo del m´etodo de distribuci´on de tri´angulos en celdas, el cual genera el m´ınimo cubo (Bounding Box) que contiene a la superficie. Las celdas que intersequen con el triangulo, tambi´en insersecar´an al cubo m´ınimo. Encontrar el conjunto de celdas que se superpone con el cubo posee un menor costo computacional que controlar cada celda con la figura. Se calculan entonces, los v´oxeles relativos al cubo m´ınimo, y de estos, se buscaran los que correspondan con la superficie.
4.2.2.
Generaci´on de matrices
El generador de matrices de transici´on toma como par´ametro de entrada cada v´oxel de forma individual y la lista de geometr´ıas asociadas al mismo. No se requiere poseer conocimiento de la posici´on del v´oxel ni de su vecindario para analizar su comportamiento. Se pueden requerir de par´ametros adicionales como especificaciones
BBOX.MIN_Z - TAMA~NO_CELDA < Celda.z < BBOX.MAX_Z + - TAMA~NO_CELDA }
PARA C/ Celda EN Celdas SI Figura EN Celda
Celda->agregar(Figura)
Figura 4.3: Pseudocodigo de inclusi´on de tri´angulos en celdas.
de las propiedades del ambiente en el caso de encontrar v´oxeles vac´ıos.
El sistema posee distintos algoritmos para analizar el comportamiento de la luz dentro de una celda. Los distintos m´etodos son encapsulados en clases que compar- ten una misma interfaz para poder ser usadas indistintamente. En la Figura 4.4 se puede observar el diagrama de clases que componen la generaci´on de las transforma- ciones. La clase abstracta AbstractTransformationsCreator contiene la interfaz que interact´ua con el pipeline. El resto de las clases generadoras de matrices de trans- formaci´on heredan de la anterior, implementando el comportamiento especifico del m´etodo a realizar. La clase abstracta es la encargada de iterar sobre cada celda, lla- mando a la funci´on virtual pura setMatrix(Cell, Transformation), cual implementa el metodo en s´ı.
Adem´as de la geometr´ıa, el comportamiento de la luz es afectado por el tipo de material de la cual la estructura se compone. Los coeficientes de dispersi´on, absor- ci´on, y anisotrop´ıa son generados por una clase de tipo CoefficentSetter. La clase
StaticCoefficientSetter se inicia con valores est´aticos que ser´an entregados cada vez que se los consulte.
S´olo los materiales blancos y negros tienen una interacci´on id´entica para todas las frecuencias de luz. Los objetos cobran color al discriminar las luces a absorber o rebotar. Por esta raz´on se implementa la clase RGBCoefficientSetter, encargada de distinguir el canal de luz a analizar y el color del objeto, para generar los coefi- cientes adecuados. Para generar una imagen a color, se deben generar las reglas de
transformaci´on para 3 canales; Rojo, Verde y Azul. Para generar las reglas para un color, este se debe pre-establecer en RGBCoefficientSetter. Cuando el generador de matriz le consulte el coeficiente para una celda; ´esta, tomar´a el promedio intensidad del color en el canal correspondiente, y devolver´a los coeficientes calculados a partir de la ecuaci´on descrita en la Secci´on 3.4.
Matrices isotr´opicas y anisotr´opicas
Las matrices isotr´opicas son las m´as sencillas, comport´andose de la misma forma en todas las direcciones. La clase IsotropicMatrixCreator utiliza los coeficientes de absorci´on y dispersi´on para generar la matriz isotr´opica. Se distingue la presencia o ausencia de geometr´ıas para decidir si la celda pertenece a un objeto o es parte del espacio vac´ıo.
El generador de matrices anisotr´opicas es similar al anterior, toma como par´ame- tros de entrada la difusi´on y la absorci´on. Tambi´en agrega el uso del coeficiente de anisotrop´ıa para generar una matriz donde la dispersi´on de la luz no sea uniforme a todas las direcciones. As´ı la clase implementa el m´etodo descrito en la Secci´on 2.4.3. La clase TropicMatrixCreator implementa tanto el modelado de s´olidos y vac´ıo sobre el v´oxel. Determina la existencia o no de superficies dentro del v´oxel y despacha la creaci´on de distintas matrices seg´un el caso. Esto permite crear matrices con distinto comportamiento para los s´olidos y el aire.
Generaci´on de plano medio
El generador de matrices por plano medio requiere del v´oxel con las superficies recortadas. Se opt´o por atrasar el recorte de superficies en la etapa de divisi´on de figuras en celdas ya que no siempre es utilizado. Es entonces el generador por plano medio el encargado de recortar las figuras cuando lo requiera. El algoritmo de line- clipping de Cohen-Sutherland es aplicado para el recorte.
El generador requiere de un vector que resuma la geometr´ıa existente dentro del v´oxel. Se obtiene el ´area total de superficies dentro del v´oxel mediante la suma de las superficies. Su origen y direcci´on est´an dados por el promedio de los vectores normales de cada triangulo, ponderado por la superficie de cada uno.
run(Cells) : Transformations setMatrix(Cell,Transformation) = 0 AnisotropicMatrixCreator setMatrix(Triangles,Transformation) IsotropicMatrixCreator setMatrix(Cell,Transformation) MeanSurfaceMatrixCreator setMatrix(Cell,Transformation) TropicMatrixCreator setMatrix(Cell,Transformation) AbstractCoefficientSetter loadVoxel(Cell *) = 0 getScattering() : float = 0 getAbsorption() : float = 0 getExtinction() : float = 0 getG() : float = 0 RGBCoefficientSetter loadVoxel(Cell *) getScattering() : float getAbsorption() : float getExtinction() : float getG() : float StaticCoefficientSetter loadVoxel(Cell *) getScattering() : float getAbsorption() : float getExtinction() : float getG() : float = 0
A partir del vector descriptor de la geometr´ıa y con la matriz de aire se genera la matriz de transformaci´on con las f´ormulas planteadas en la Secci´on 3.4.2.
Fuentes de luz
Las fuentes de luz son implementadas de acuerdo lo descrito en la Secci´on 2.4.1. El valor inicial para la direcci´on nula se establece en 1 y debe mantenerse constante. Esto se implementa con una regla de transformaci´on para esta velocidad hacia si misma que mantenga constante la intensidad de iluminaci´on inicial de la celda. Esto es, que la matriz tenga el valorθ00 = 1. Adem´as, las reglas desde las otras direcciones
a hacia la anterior, debe evitar la transferencia, es decir, θi0 = 0 para 0< i <19.
La generaci´on de luz se logra estableciendo aθ0j los valores deseados de generaci´on
lum´ınica. En el caso de una fuente de iluminaci´on isotr´opica dicho valor es constante. Si en cambio, se requiere una luz direccional, se establecer´an valores mayores a las direcciones correspondientes con la direcci´on de la luz. El resto de las direcciones seguir´an representando el medio en el que se encuentre la fuente de luz.
4.2.3.
Simulaci´on
Antes de iniciar la simulaci´on, se asignan valores uniformes pr´oximos al cero, de luz para todas las celdas. El proceso, descripto en la Secci´on 2.4.4, consta de iteraciones sobre el modelo. En cada una se ejecuta una colisi´on seguida de una de advecci´on, como se ve en el pseudoc´odigo de la Figura 4.5.
La etapa de colisi´on realiza la multiplicaci´on de los valores de la celda por la transformaci´on correspondiente, simulando los efectos de absorci´on y difracci´on de la luz. Los cambios ocurren en cada celda de forma independiente.
En la etapa de advecci´on, las distintas celdas interact´uan con sus vecinas, trans- firiendo la luz de las distintas velocidades a las celdas vecinas correspondientes.
La cantidad de iteraciones depende de la cantidad de celdas. Se realizan N ∗ N +N iteraciones, para asegurar la correcta propagaci´on de las intensidades. Este modelo no tiene un punto de convergencia, ya que, las fuentes de luz impulsan un aumento constante de el volumen total de intensidad del modelo. La alternativa, es buscar la convergencia a trav´es de los valores generados por el cociente entre la
para c/ CELDA:
para c/ DIRECCI´ON:
VECINO = CALCULAR_VECINO(CELDA, DIRECCI´ON) VECINO[DIRECCI´ON] = CELDA[DIRECCI´ON]
Figura 4.5: Pseudocodigo del motor LBM.
intensidad actual de cada celda, y la intensidad total del modelo. Esta alternativa, no fue implementada por su alto costo computacional.
Aceleraci´on por placa gr´afica
La simulaci´on es la fase con mayor procesamiento computacional. Dada que una de las caracter´ısticas del LBM es la capacidad de paralelismo gracias al bajo grado de dependencia de datos, se decidi´o analizar la aceleraci´on del sistema mediante la reimplementaci´on del motor LBM en lenguaje CUDA. Esto permite la ejecuci´on sobre GPUs nVidia de forma paralela, con la t´ecnolog´ıa descrita en la Secci´on 2.5.1. Las placas gr´aficas no comparten el mismo espacio de memoria que el procesador, por lo que todos los datos a utilizar deben ser copiados. Ciertos datos, como la canti- dad de celdas, requeridos por el motor se mantienen constantes durante la ejecuci´on de la simulaci´on. Estos datos se almacenan en una memoria especifica para tal fin. Las matrices de transformaci´on se mantienen constantes pero son almacenadas en la memoria de datos por su gran tama˜no.
Se asignan dos espacios de memoria para almacenar los valores de las celdas. Cada iteraci´on utilizar´a de forma intercalada un espacio como fuente y otro como destino.
En una GPU CUDA, el paralelismo se logra separando operaciones en hilos con- currentes. LBM tiene una atomicidad bien definida, dada por cada celda, debido a su caracter´ıstica de aut´omata celular. Por estas razones, cada hilo encapsular´a la evoluci´on de una celda.
Hilos
Memoria
Figura 4.6: Acceso a memoria no alineado al bloque.
Hilos
Memoria
Figura 4.7: Acceso a memoria alineado al bloque.
ejecuta en un multiprocesador de la GPU. Los multiprocesadores contienen una ´
unica unidad de control que ejecuta las mismas instrucciones en paralelo de cada hilo que le corresponda.
Las instrucciones de acceso a memoria requieren que se carguen datos para cada hilo. Si todos los hilos de un mismo multiprocesador acceden a los datos correspon- dientes a un ´unico bloque, la lectura ser´a m´as r´apida debido a la arquitectura del hardware. A este tipo de acceso, que se puede observar en la Figura 4.7, se le de- nomina alineado al bloque. El acceso a la memoria no alineado, como muestra la Figura 4.6, requiere un mayor tiempo para su realizaci´on.
Como los hilos corresponden a una celda, cada uno acceder´a al dato correspon- diente a la misma. Al ser la instrucci´on concurrente respecto a los hilos, en cada paso todos acceder´an a una misma velocidad de la celda LBM que les correspon- de. Por esto, hacer el acceso m´as eficiente requiere que los valores correspondientes a una velocidad sean contiguos. Para ello se re-estructuran los datos de forma de agrupar estos valores antes de ser copiados al dispositivo. Es decir, los datos de la funci´onfCP U de transici´on (Secci´on 2.3.4) se ordenan seg´un (x, y, z, v), pero en GPU
es conveniente reordenarlos a fGP U de la forma (v, x, y, z).
La ejecuci´on se realiza en un ´unico kernel, que es ejecutado en cada iteraci´on. El kernel es ejecutado en la cantidad m´axima de hilos posibles por bloque en la cantidad de bloques necesarios para cubrir la cantidad de celdas del modelo. Este trae a su memoria local los valores correspondientes a la celda. Estos valores son transformados a partir de las reglas de transformaci´on. Finalmente, el valor de cada
Figura 4.8: Interfaz gr´afica de configuraci´on de la aplicaci´on.
velocidad es almacenado en la celda vecina correspondiente.
Finalizada la ejecuci´on de la simulaci´on, los resultados se encuentran en el dispo- sitivo. Se realiza una copia de los mismos hacia la memoria principal, y son reestruc- turados para recuperar el formato original, con el que trabaja el resto del sistema.
4.2.4.
Interfaz Gr´afica
Para una f´acil selecci´on de los m´etodos a usar, se cre´o una interfaz gr´afica para la aplicaci´on usando Windows Forms. Se eligi´o esta tecnolog´ıa por su integraci´on con Visual Studio y sus herramientas para la edici´on gr´afica de formularios. La Figura 4.8 muestra la ventana de configuraci´on. El formulario permite la selecci´on de distintos m´etodos para cada etapa, y almacenar los datos intermedios.
4.2.5.
Visualizaci´on
El motor LBM resulta en un mapa de intensidades por celda. Estos valores son utilizados para iluminar las figuras a visualizar.
La tecnolog´ıa utilizada para generar la imagen es OpenGL. Es elegida por ser una especificaci´on est´andar, y la amplia existencia de documentaci´on sobre la misma, adem´as de ser compatible con el lenguaje C++. A partir del mapa de intensidades se obtienen la intensidad de la luz para cada canal de la forma
R=F iguraR∗specˆ ∗k+CeldaR∗(1−k) G=F iguraG∗specˆ ∗k+CeldaG∗(1−k) B =F iguraB∗specˆ ∗k+CeldaB∗(1−k)
ˆ spec= h ~ F ig, ~Luzi |F ig~ ||Luz~ | (4.1) Donde:
R,G, y B son los colores resultantes de cada canal.
F iguraX es el color propio de la figura en el canal X.
~
F ig y Luz~ son los vectores normales de la figura y la luz respectivamente.
k es un coeficiente de proporcionalidad.
CeldaX es la intensidad de luz en el canalX correspondiente a la celda donde
se encuentre la figura.
La integraci´on de los valores resultantes del Pipe con OpenGL se realiza alte- rando los colores de las figuras. Todos los valores de color est´an normalizados de 0 a 1. Se calcula el ´angulo specˆ entre la normal de la superficie y la luz para co- nocer la intensidad de la iluminaci´on especular. Cada canal de color de la figura es multiplicado por la luz especular. Los resultados anteriores y el de la celda son sumados para obtener la luz total. El valor total del color no debe ser mayor a 1 para continuar normalizado. Entonces la suma se realiza ponderando por constantes complementarias.
En la Figura 4.9 se muestra la ventana de la herramienta visualizando el resultado en 3 dimensiones con OpenGL.
Figura 4.9: Ventana WindowsForms con una imagen iluminada con el metodo pro- puesto y pintada en pantalla con OpenGL.
Resultados
En este cap´ıtulo se presentar´an casos de pruebas con el objetivo de analizar el comportamiento de la simulaci´on para un conjunto de situaciones y par´ametros diversos. Algunos de ellos se comparar´an con otros modelos de iluminaci´on y se renderizar´an para proveer de un mayor entendimiento visual.
Finalmente, se realizar´an comparaciones de eficiencia mediante la aceleraci´on por placa gr´afica en contraste con procesamiento lineal brindado por CPU. Se analizar´an rendimientos para un rango de casos de pruebas de distintos tama˜nos.
Todos los casos de prueba se han realizado sobre un volumen c´ubico y dividido uniformemente en celdas c´ubicas. Los resultados expuestos sobre iluminaci´on se ex- hiben en 2 dimensiones, utilizando un corte sobre el plano XY (plano horizontal) a menos que se especifique lo contrario. Los valores de iluminaci´on se representan en una escala de grises, lo cual indica mayor valor de iluminaci´on cuanto mayor cla- ridad, en escala logar´ıtmica. Los valores de iluminaci´on son normalizados, es decir, los valores presentados son relativos a la intensidad de la fuente de luz que posee la intensidad m´axima.
5.1.
Luz en el vac´ıo
El primer experimento fue realizado para analizar el modelo sobre el vac´ıo. Este caso es el base al analizar el comportamiento de la luz en las simulaciones.
El caso consta de un espacio sin obst´aculos, donde los extremos dejan escapar
Figura 5.1: Gr´afico de intensidad de luz respecto a la distancia a la fuente en unidades de celdas del LBM. La misma disminuye con la inversa del cuadrado de la distancia.
la luz. La fuente de luz es ubicada en el centro del espacio. Para la simulaci´on se utilizaron matrices isotr´opicas sin absorci´on. Se esper´o as´ı que la propagaci´on de la luz sea uniforme en el espacio. La simulaci´on itera hasta la convergencia de los valores lum´ınicos.
En mec´anica ondulatoria, la ley de la inversa del cuadrado establece que para una onda, en este caso electromagn´etica, que se propaga desde una fuente puntual en todas direcciones por igual, la intensidad de la misma disminuye de acuerdo con el cuadrado de la distancia a la fuente de emisi´on. La Figura 5.1 muestra la intensidad de luz resultante desde una fuente de luz hacia el exterior en cualquier direcci´on. Se puede observar que el decaimiento de la luz obedece la ecuaci´on de la ley anterior. La Figura 5.2 grafica una representaci´on visual de la simulaci´on.
5.1.1.
Variaci´on de coeficientes
Como siguiente paso se procede a estudiar el comportamiento de la luz bajo dis- tintos par´ametros para el generador de matrices anisotr´opicas. A´un sobre un espacio sin obst´aculos y con una fuente de luz en el centro, se alteran los valores de difusi´on
Figura 5.2: Iluminaci´on ambiental en el vac´ıo con σa = 0,0 y g = 0 en escala lo-
gar´ıtmica con perdida absoluta en los bordes. Se muestra una fuente de luz en el centro del dominio y se puede observar el decaimiento de la iluminaci´on sobre los extremos.
Dada la relaci´on entre los coeficientes en (2.11), al disminuir σs aumenta σa
generando matrices con mayor absorci´on y evitando la propagaci´on de luz. Por otro lado, el coeficienteg aporta cambios en la direcci´on en que la luz se propaga (Secci´on