Visualización bidimensional de datos con GnuPlot.

De rato en rato voy siguiendo con el pequeño solver en GPU. Ya lo tengo listo pero voy añadiendo opciones y otras formas de plantear el algoritmo. Intento encontrar la manera de sacar el máximo partido a las funciones asíncronas de transferencia y ejecución que proporciona CUDA en situaciones variables, pero cuanto más avanzo más pienso que este tipo de computación es poco flexible; bajo mi punto de vista es perfecta para la computación científica donde tienes claro qué problema quieres resolver, pero no es tan buena cuando tienes que dejar todas las opciones abiertas al público. Los programadores pueden volverse locos.

El caso es que no había encontrado una forma de visualizar los datos en 2D que me convenciesen. Necesitaba algo ligero y la opción vuelve a ser GnuPlot de nuevo, con una sencilla función como la que os dejo podéis mapear una matriz sin ningún esfuerzo.

La función está planteada de forma que tengamos los datos almacenados en un vector, tenedlo en cuenta.

El resultado, como podéis ver, es bueno para hacerse una idea si los solvers se comportan bien mientras los vamos escribiendo. Además es bastante ligero aunque los ficheros que contienen los datos sean grandes. Siempre se pueden afinar las salidas tanto como se quiera con este programa, poner letras griegas, usar LaTeX y todas esas cosas, a mí me sirve por ahora con la versión simple.

Como os dije, os dejo la función en C/C++ que genera el fichero ejecutable (recordad, la extensión es .gp) a partir de un vector de datos. Pasadlo bien.

void salida_GNUPlot (float *A, int N, const char *filename)
{
//abrimos el fichero
FILE *out;
out = fopen(filename,"w");

//preparamos lo necesario para poder ejecutar despues el fichero
fprintf(out, "set title 'Resolucion de la ecuacion de Laplace bidimensional'\n");
fprintf(out, "unset key\n");
fprintf(out, "set tic scale 0\n");
fprintf(out, "\n");
//fprintf(out, "set palette model XYZ rgbformulae 7,5,15\n");
fprintf(out, "set palette rgb 33,13,10\n");
fprintf(out, "set cblabel 'Temperatura'\n");
fprintf(out, "set view map\n");
fprintf(out, "splot '-' matrix with image\n");

//recorremos la matriz para guardar los datos

for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
fprintf(out, "%f\t", A[j+N*i]);
}
fprintf(out, "\n");//salto de linea para separar las filas.
}
}
Esta entrada fue publicada en C/C++, cfd, CUDA, linux. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s