[Visto: 1299 veces]

Antes que nada un poco de contexto para los que no están familiarizados con el título: ANSYS es un paquete software de FEM y CFD, y MATLAB es un software matemático muy usado en ciencias e ingeniería por su gran versatilidad. Ambos son muy usados en diversas áreas de ingeniería.

ANSYS tiene dos formas: ANSYS Classic (APDL) y ANSYS Workbench. El primero, el clásico, es el más poderoso de los dos, ya que todas las capacidades del programa son accesibles; sin embargo, lo malo es que requiere conocer el lenguaje APDL de ANSYS, y todas las acciones se deben introducir mediante comandos, y conocer con cierta profundidad la teoría de elementos finitos para realizar la programación. Por otro lado, Workbench tiene una interfaz gráfica, muy amigable, que incluso ahora se parece de la de Word o Powerpoint, y gran parte del proceso de cálculo está automatizado y controlado por el software, por lo que no se necesita programar cada detalle; lo malo es que no todas las funciones de ANSYS están disponibles, y al ser todo automático, a veces puede ser difícil acceder a ciertas funciones o modificarlas y/o automatizarlas.

Matlab por otro lado, es un software científico en la que se pueden escribir programas, implementar algoritmos, manipular información, graficar, etc. Es extremadamente versátil y ampliamente usado, además de ser muy fácil de aprender.

¿Por qué quisiera conectarlos?

Implementar bucles en ANSYS para resolver diversos problemas en serie para explorar, por ejemplo, la influencia de la variación de una serie de parámetros en la resistencia de una estructura puede ser una total pesadilla si se trabaja en APDL. Adicionalmente, realizar operaciones de variables en APDL es sumamente trabajoso. Mientras que en MATLAB es una cuestión extremadamente sencilla. Esto hace que escribir un problema de optimización, pueda llegar a ser muy trabajoso en APDL. Por lo tanto, una solución puede ser automatizar la comunicación entre ambos programas, de manera que MATLAB modifique algunos parámetros de ANSYS, este realice los cálculos, y entregue los resultados a MATLAB. El problema es establecer esta comunicación.

Requisitos:

  • Toolbox de MATLAB: ANSYS_aaS 1.1.9 (beta).mltbx – Como su nombre lo indica, es una beta, pero funciona bastante bien. Lo pueden encontrar en el customer portal de ANSYS de manera gratuita.
  • MATLAB 2018b, el toolbox no funcionará con nuevas versiones de MATLAB, lo bueno es que se pueden instalar diversas versiones de MATLAB en una computadora.
  • ANSYS R19.2. En teoría, esta es la última con la que funciona, aun no la he probado con R20. Funciona también con las licencias de estudiantes.
  • Paciencia y buen humor (bastante)

Primeros intentos:

  1. Abrir MATLAB e instalar el toolbox. Se puede buscar en el panel de navegación del lado izquierdo de la pantalla y hacerle doble click. Se instala en segundos. No se requiere reiniciar MATLAB. Luego de instalar, se tendrán nuevos comandos disponibles, que veremos más adelante.
  2. Abrir APDL Product Launcher. En la pestaña File Management, indicar el directorio y nombre de archivo que se va a trabajar, y en la segunda pestaña Customization/Preferences, introducir “-aas” en Additional Parameters. Esto indicará a ADPL que no debe abrir una interfaz gráfica, y esperar comunicación de otro programa o computadora (sí, puedo usar incluso otro OS mediante la red). Dar click en “Run” para que inicie APDL y aparecerá solo el Output Window. Esto significa que ANSYS está esperando que alguien se conecte. ANSYS creará dos archivos (aaS_MapdlId.txt y aaS_MapdlExceptionHolderServer.txt) en el directorio que indicaron antes.
  3. En MATLAB introducir los siguientes comandos.
    1. orb = initialize_orb(); % inicializar
    2. load_ansys_aas; % inicializar el toolbox
    3. iCoMapdlUnit = actmapdlserver(orb,’DIRECTORIO\aaS_MapdlId.txt’); % Indica a Matlab los detalles de la conexión con ansys.
  4. En este momento, ANSYS está listo para recibir comandos. Pueden mandarlos de esta manera, por ejemplo:
    1. char(iCoMapdlUnit.executeCommandToString(“parametro1 = 1”));
    2. char(iCoMapdlUnit.executeCommandToString(“parametro2 = parametro1 + 5”));
    3. En este momento, si ven el Output Window, verán que ANSYS recibió los comandos anteriores (parametro1 = 1 y parametro2 = parametro1 + 5), y definió ambos parametros. Pretty cool, eh? Si quitan los ; podrán ver que se envía una respuesta a MATLAB 😉
  5. El problema es que cada comando que se envía tiene que estar dentro de un “char(iCoMapdlUnit.executeCommandToString(“INSERTAR COMANDO APDL”))”, lo cual es extremadamente tedioso. El help de ANSYS no provee mayor información. Si ya tienen un archivo .txt con todos los comandos de APDL para alguna simulación, se puede escribir rápidamente un script en MATLAB para colocar el iCoMapdl…. para cada línea. Pero nada garantiza que funcionará. ¿Por qué? Pues porque ambos programas trabajan a distinta “velocidad”, es decir, MATLAB manda de golpe, y muy rápidamente, todos los comandos; pero puede que ANSYS no los procese tan rápido. Este problema es muy notorio durante el mallado y solución. Puede ser que ANSYS reciba el comando de solución en medio del proceso de mallado, y lo interrumpa para resolver el problema incompleto. A pesar de que, supuestamente, ANSYS espera para ejecutar los comandos en el orden que han llegado, he notado que esto no siempre se da, y puede pasar que ANSYS se vuelva loco.
  6. Solución: Dejar el .txt con los comandos de APDL sin modificar, y guardarlo en un directorio conocido. En MATLAB se puede ejecutar: char(iCoMapdlUnit.executeCommandToString(“/input,PROGRAMA_APDL,txt,DIRECTORIO”)). Esto enviará un único comando a ANSYS que le diga: lee los comandos PROGRAMA_APDL.txt ubicado en DIRECTORIO. Y ANSYS lo hará a su propia velocidad, y si se tiene que demorar 10 minutos en la solución… no habrá problema.
  7. Bueno, sí hay un problema. Mientras ANSYS ejecuta el programa PROGRAMA_APDL.txt, notarán que el Command Window de MATLAB volvió a estar en espera de comandos (apareció otra vez el >>). Si nos ponemos sádicos, podríamos enviarle más comandos a ANSYS para que se vuelva loco :). Pero en verdad, esto representa un problema, no por el sadismo, sino porque MATLAB debería poder esperar a ANSYS hasta que termine la ejecución del programa. Nótese que no hay forma de ponerlos en sincronía.
  8. Workaround: ANSYS puede crear y escribir archivos de texto, esto ha sido implementado para escribir los resultados de simulación en dichos archivos (comandos *cfopen y *vwrite). Podríamos incluirlos al final del archivo PROGRAMA_APDL para que se genere el archivo RESULTADOS.txt en DIRECTORIO. Esto quiere decir, que MATLAB enviará los comandos a ANSYS, y este los ejecutará (se demorará lo que se tenga que demorar) y escribirá los resultados en un archivo de texto. MATLAB tiene una función isfile(“DIRECTORIO\FILE”), que devuelve un valor de 1 si el archivo existe, y un 0 si no existe. Ya saben qué sigue, ¿verdad?
  9. Vamos a escribir un script en MATLAB, aprovechando la función pause dentro de un bucle. El bucle tiene esta forma:
    1. contador = 0; % inicia el contador
    2. char(iCoMapdlUnit.executeCommandToString(“/input,PROGRAMA_APDL,txt,DIRECTORIO”);
    3. max_tiempo_espera = 1000; % 1000 segundos de espera máxima
    4. while (isfile(“DIRECTORIO\RESULTADOS.txt”) == 0 )
    5. pause(1) % espera un segundo
    6. contador = contador + 1; % avanza el contador
    7. if count == max_tiempo_espera;
    8. disp(‘No se generó el archivo en el tiempo establecido’);
    9. break
    10. end
    11. end
    12. pause(10) % esta pausa es para darle tiempo a ANSYS de escribir todos los contenidos, 10 segundos debería ser más que suficiente, pero depende del tamaño de archivo de resultados.
  10. De esta manera tienen un bucle que en MATLAB que espera hasta que ANSYS genere un archivo, dado que mandaron los comandos dentro de un /input, ANSYS ejecutará línea por línea a su propio ritmo, mientras que en MATLAB el bucle lo mantiene en pausa. Hasta ahora, este script me está funcionando bastante bien. Según leí, hay un paquete de Python que puede hacer lo mismo. No se si este problema también se da en Python, así que lo probaré eventualmente.
  11. Adicionalmente, suelo hacer inputs anidados en el archivo PROGRAMA_APDL, teniendo un archivo de texto con los parámetros de entrada, los cuales los puedo manipular con MATLAB. Nótese que el Toolbox Ansys aaS, también puede mandar comandos a ANSYS Mechanical y ANSYS Fluent.

Si alguien tiene sugerencias con respecto a mi solución, o una idea para una mejor, o preguntas, no duden en contactarme!

dlavayen at pucp.edu.pe

 

 

Puntuación: 5 / Votos: 5