El problema a resolver consiste en la ecuación del calor
\noindent
sobre un dominio rectangular
La solución mediante el método de elementos finitos se obtiene con el programa Fino utilizando una malla creada con el programa Gmsh. Ambos son libres y abiertos.
En un archivo llamado rect.geo
se genera un rectángulo de nx
y ny
que controlan la cantidad de elementos en cada dirección.
rc = 7e-4; // [ cm ]
h = 0.38e-7; // [ cm ]
// cantidad de elementos en cada dirección
nx = 2000;
ny = 50;
// definición de los puntos del rectángulo
Point(1) = {0, 0, 0};
Point(2) = {rc, 0, 0};
Point(3) = {rc, h, 0};
Point(4) = {0, h, 0};
// líneas
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
// superficie
Curve Loop(1) = {1, 2, 3, 4};
Plane Surface(1) = {1};
// definiciones para obtener una malla estrcturada
Transfinite Curve{1,3} = nx+1;
Transfinite Curve{2,4} = ny+1;
Transfinite Surface{1};
Mesh.RecombineAll = 1; // sin esto se obtendrían triángulos
// definición de entidades físicas que van a tener las condiciones de contorno
Physical Curve("bottom") = {1};
Physical Curve("top") = {3};
Physical Curve("left") = {4};
Physical Curve("right") = {2};
Physical Surface("bulk") = {1};
Para resolver la ecuación en derivadas parciales se utiliza el siguiente archivo llamado rect.fin
:
MESH FILE_PATH rect.msh DIMENSIONS 2 # se lee la malla
FINO_PROBLEM thermal # se indica que se requirere un problema termico
# FINO_SOLVER PROGRESS
# definicion de parametros del problema
rc = 7e-4 # [ cm ]
h = 0.38e-7 # [ cm ]
rho = 54 # [ ohm cm ]
Rb = 53.6 # [ ohm cm^2 ]
Cm = 2 # [ Fe-6 cm^{-2} ]
Zm = 1/(2*pi*Cm)
Vn = 1
Vm = 0
# la variable k es especial e indica la conductividad del problema térmico
k = 1/rho
# las condiciones de contorno
PHYSICAL_GROUP left BC q=0
PHYSICAL_GROUP bottom BC T=Vn
PHYSICAL_GROUP top BC h=+1/Zm Tinf=Vm
PHYSICAL_GROUP right BC h=-rc^2/Rb Tinf=Vm
FINO_STEP # se resuelve el problema
# se escribe la funcion T(x,y) en un archivo ASCII llamado rect.dat
PRINT_FUNCTION FILE_PATH rect.dat T
# por si acaso se generan archivos para ser analizados por postprocesadores
MESH_POST FILE_PATH rect-results.vtk T
MESH_POST FILE_PATH rect-results.msh T
# para controlar que el tamaño de la malla sea razonable mostramos esto
PRINT "nodos: " nodes
PRINT "tiempo: " time_wall_total "segundos"
PRINT "memoria: " memory/(1024*1024*1024) "Gb"
En una terminal, se debe llamar a Gmsh con el archivo de entrada rect.geo
y el parámetro -2
para generar la malla:
$ gmsh -2 rect.geo
Luego de este paso, debería haber un archivo rect.msh
con la malla, que es el que lee Fino.
Si no se indica el argumento -2
se abre una ventana gráfica donde es posible mallar y grabar el archivo de malla manualmente.
Si se desea modificar el tamaño del dominio o la cantidad de elementos se debe abrir el archivo rect.geo
, editar los parámetros, grabarlo y volver a correr gmsh
.
Una vez obtenida la malla, se debe llamar a Fino con el archivo de entrada rect.fin
:
$ fino rect.fin
nodos: 102051
tiempo: 0.395641 segundos
memoria: 0.478649 Gb
El resultado es un archivo llamado rect.dat
con tres columnas, --progress
se indica el progreso del ensamblado de la matrix y de la solución de las ecuaciones con barras de progreso:
$ fino rect.fin --progress
....................................................................................................
----------------------------------------------------------------------------------------------------
nodos: 102051
tiempo: 0.441557 segundos
memoria: 0.476871 Gb