El modelo ya contiene una geometría, un elemento y un material coherentes. Ahora debemos decidir cuánta discretización necesita. No elegiremos una malla por su apariencia: construiremos una familia comparable, la auditaremos y dejaremos que una magnitud física determine cuándo refinar deja de cambiar sustancialmente la respuesta.
Tu misión
Generarás tres mallas hexaédricas estructuradas, comprobarás su topología y calidad, medirás el desplazamiento de punta con el mismo banco de ensayo y seleccionarás la primera malla cuya variación frente a la siguiente sea inferior al 2 %.
Regla central: una malla bonita no demuestra convergencia; una diferencia pequeña tampoco sirve si los casos representan problemas distintos.
Objetivos
Al completar M04 podrás demostrar que:
- Distingues refinamiento, calidad y convergencia.
- Construyes una malla hexaédrica mediante divisiones paramétricas.
- Explicas la diferencia entre un control global y uno aplicado a líneas concretas.
- Auditas topología, atributos y advertencias de forma antes de resolver.
- Mantienes constantes geometría, material, carga y punto de medida.
- Calculas la variación respecto a la malla siguiente.
- Seleccionas una malla por un criterio declarado o concluyes que el estudio es insuficiente.
Prerrequisitos y descargas
- Haber completado M03 y reconocer
SOLID185,TYPEyMAT. - Recordar de M02 que una selección es estado temporal y debe recuperarse con
ALLSEL,ALL. - Haber ejecutado la primera simulación de M00. Su bloque de solución se reutiliza como instrumento, no como contenido nuevo.
04_start.mac— punto de partida.04_mesh_convergence.mac— estudio completo.04_bug_hunt.mac— cinco contaminaciones deliberadas.04_challenge.mac— reto con tamaños no divisibles.04_expected_results.csv— contrato de aceptación.
Predicción — ¿Cuánto cuesta dividir h entre dos?
Si refináramos una línea, duplicaríamos su número de elementos. Pero nuestra viga ocupa tres
dimensiones. Al dividir el tamaño entre dos duplicamos simultáneamente
div_x, div_y y div_z:
2 × 2 × 2 = 8El tiempo de cálculo no tiene por qué crecer exactamente con esa proporción: también intervienen los grados de libertad, la conectividad, la memoria y el solver. Pero el crecimiento geométrico explica por qué «refinar por si acaso» es una estrategia cara.
Modelo mental — Tres preguntas diferentes
| Concepto | Pregunta | Evidencia |
|---|---|---|
| Refinamiento | ¿Hemos aumentado la resolución? | Divisiones, nodos y elementos. |
| Calidad | ¿Son geométricamente aceptables los elementos? | SHPP,SUMMARY y CHECK. |
| Convergencia | ¿Se estabiliza una magnitud física relevante? | Variación del desplazamiento entre mallas. |
Ninguna de las tres pruebas sustituye a las otras
Un millón de elementos distorsionados no forman una buena malla. Una malla perfecta pero demasiado gruesa puede dar una respuesta rígida. Dos resultados iguales tampoco prueban nada si se cambiaron simultáneamente la longitud o la carga.
Anatomía de una familia comparable
Un estudio de convergencia cambia una sola decisión: la discretización. En los tres casos conservaremos exactamente:
- la geometría
1.0 × 0.10 × 0.05 m; SOLID185con la misma formulación;- acero con
EX=210E9 PayPRXY=0.30; - el empotramiento, la fuerza total de
-1000 Ny su dirección; - la coordenada del nodo utilizado para medir el desplazamiento.
También conservaremos la familia de elemento y la estrategia de mallado. Comparar tetraedros lineales gruesos con hexaedros finos mezclaría dos cambios y dificultaría interpretar la causa.
Paso 1 — De un tamaño nominal a divisiones
Para la familia base, las dimensiones son múltiplos exactos de los tres tamaños:
div_x=beam_l/mesh_h
div_y=beam_h/mesh_h
div_z=beam_b/mesh_h
No llamamos nx, ny y nz a estos parámetros:
MAPDL reserva esos nombres para funciones intrínsecas de coordenadas nodales.
mesh_h | nx × ny × nz | Elementos | Nodos |
|---|---|---|---|
| 0.0500 m | 20 × 2 × 1 | 40 | 126 |
| 0.0250 m | 40 × 4 × 2 | 320 | 615 |
| 0.0125 m | 80 × 8 × 4 | 2560 | 3645 |
Para un bloque estructurado, los conteos teóricos son:
n_elements = div_x*div_y*div_z
n_nodes = (div_x+1)*(div_y+1)*(div_z+1)Estas ecuaciones forman una prueba fuerte: si no coinciden, la malla obtenida no es la estructurada que el script afirmaba construir.
Paso 2 — ESIZE frente a LESIZE
ESIZE,mesh_size(i)
ESIZE declara el tamaño global predeterminado. MAPDL calcula divisiones a partir
de ese valor, redondeándolas cuando sea necesario. Sin embargo, un control global no expresa
por sí solo cómo queremos repartir elementos en cada dirección.
LSEL,S,LENGTH,,beam_l
LESIZE,ALL,,,div_x(i),,1
LSEL,S,LENGTH,,beam_h
LESIZE,ALL,,,div_y(i),,1
LSEL,S,LENGTH,,beam_b
LESIZE,ALL,,,div_z(i),,1
ALLSEL,ALL
LSEL agrupa las líneas por significado geométrico, no por ID.
LESIZE,ALL aplica divisiones enteras a las líneas seleccionadas. El argumento
KFORC=1 obliga a sustituir cualquier división anterior, algo necesario después
de limpiar una malla y preparar la siguiente.
Paso 3 — Exigir hexaedros mapeados
MSHAPE,0,3D
MSHKEY,1
VMESH,ALL
MSHAPE,0,3D solicita hexaedros y MSHKEY,1 exige mallado mapeado.
No utilizamos MSHKEY,2, porque permitir una malla libre como alternativa podría
ocultar un fallo de nuestra preparación. El bloque rectangular es mapeable y las aristas
opuestas reciben el mismo número de divisiones.
Una malla libre no es «mala». Aquí usamos una estructura regular para aislar el efecto del tamaño. En una geometría industrial, la estrategia deberá adaptarse a la forma.
Paso 4 — Crear el pasaporte de la malla
Antes de resolver, cada malla debe demostrar cuatro propiedades:
*GET,n_nodes(i),NODE,0,COUNT
*GET,n_elems(i),ELEM,0,COUNT
ESEL,S,TYPE,,1
*GET,n_type1(i),ELEM,0,COUNT
ALLSEL,ALL
ESEL,S,MAT,,1
*GET,n_mat1(i),ELEM,0,COUNT
ALLSEL,ALLLa prueba aprueba únicamente cuando:
n_elems = div_x*div_y*div_z
n_nodes = (div_x+1)*(div_y+1)*(div_z+1)
n_type1 = n_elems
n_mat1 = n_elemsAsí conectamos M04 con M03: una malla más fina que pierde sus atributos no es una mejora del mismo modelo, sino otro modelo.
Paso 5 — Convertir la calidad en una prueba
SHPP,DEFAULT
SHPP,ON
...
SHPP,SUMMARY
CHECK,ESEL,WARN
*GET,n_shape_bad(i),ELEM,0,COUNT
ALLSEL,ALL
SHPP,SUMMARY lista el resumen de las pruebas de forma de los elementos seleccionados.
Después, CHECK,ESEL,WARN hace algo especialmente útil: deselecciona los elementos
sin incidencias y conserva únicamente los que producen advertencias o errores. Por tanto,
n_shape_bad=0 es una condición automatizable.
CHECK modifica la selección
Si no ejecutas ALLSEL,ALL después, el banco de ensayo podría actuar únicamente
sobre los elementos problemáticos o sobre un conjunto vacío.
Paso 6 — El banco de ensayo heredado
Para medir convergencia necesitamos una respuesta física. El siguiente bloque reutiliza la ruta vertical que ya ejecutaste en M00:
NSEL,S,LOC,X,0
D,ALL,ALL,0
ALLSEL,ALL
NSEL,S,LOC,X,beam_l
*GET,n_tip,NODE,0,COUNT
force_per_node=tip_force/n_tip
F,ALL,FY,force_per_node
ALLSEL,ALL
FINISH
/SOLU
ANTYPE,STATIC,NEW
SOLVE
FINISH
/POST1
SET,LAST
*GET,uy_tip(i),NODE,probe_node,U,YEn M04 este bloque funciona como un instrumento de laboratorio: todas sus entradas permanecen constantes y solo devuelve una lectura. M05 explicará y auditará las condiciones de contorno; M06, la solución y el equilibrio; M07, la extracción y validación de resultados.
El nodo de medida se selecciona por X=beam_l, Y=0 y Z=0.
Esa coordenada existe en todas las mallas. Escribir un ID mezclaría refinamiento con un cambio
accidental del punto observado.
Paso 7 — Limpiar sin destruir la geometría
/PREP7
ALLSEL,ALL
DDELE,ALL,ALL
FDELE,ALL,ALL
CMDELE,fixed_nodes
CMDELE,tip_nodes
VCLEAR,ALL
VCLEAR,ALL elimina los elementos y nodos asociados al volumen, pero conserva
el modelo sólido y sus atributos. Cambiar ESIZE sin limpiar y volver a mallar no
refina una malla existente: solo cambia una preferencia para operaciones futuras.
Paso 8 — Automatizar la familia
*DIM,mesh_size,ARRAY,3
mesh_size(1)=0.0500
mesh_size(2)=0.0250
mesh_size(3)=0.0125
*DO,i,1,3
! divisiones, mallado, auditoria, medida y limpieza
*ENDDOEl bucle no crea tres estudios independientes escritos a mano. Obliga a que todos recorran exactamente la misma secuencia y reduce las oportunidades de cambiar una condición sin querer.
Paso 9 — Medir la convergencia
change_pct(1)=ABS(uy_tip(2)-uy_tip(1))/ABS(uy_tip(2))*100
change_pct(2)=ABS(uy_tip(3)-uy_tip(2))/ABS(uy_tip(3))*100
change_pct(3)=-1
Cada malla se compara con la siguiente más fina, utilizada como estimación mejorada. La última
no puede compararse consigo misma; el valor -1 significa «sin comparación»,
no convergencia perfecta.
Paso 10 — Tomar una decisión honesta
El algoritmo recorre las comparaciones desde la malla más económica:
selected_case=0
! Si cambio 1→2 < 2 % y ambas mallas pasan:
! selected_case=1
! En caso contrario, probar cambio 2→3.
! Si tampoco cumple:
! selected_case=0Nunca elegimos automáticamente la malla 3 por ser la más fina disponible. Si la última comparación supera el umbral, el estudio es inconcluso y necesita otra malla.
Por qué no usamos la tensión máxima
El empotramiento ideal introduce una transición abrupta entre nodos completamente restringidos y material libre. Una tensión puntual junto a esa frontera puede crecer o desplazarse al refinar, incluso cuando el desplazamiento global ya es estable. Elegirla como único criterio confundiría convergencia de una magnitud global con comportamiento local potencialmente singular.
En M07 compararemos tensiones en regiones justificables y separaremos tensión nominal, concentración física y singularidad numérica.
El CSV como acta del estudio
04_mesh_convergence.mac genera m04_mesh_study.csv:
case,mesh_h,nx,ny,nz,n_nodes,n_elements,n_type1,n_mat1,uy_tip,change_to_next_pct,mesh_pass,selected
Debe contener tres filas. Solo una puede tener selected=1; también es válido que
todas sean cero si ninguna comparación cumple. El CSV registra intención, coste, auditoría,
respuesta y decisión en una misma evidencia reproducible.
Resultado de referencia validado
En MAPDL Student 2025 R2 se obtuvieron variaciones de aproximadamente
1.168 % y 0.501 %. Con un umbral del 2 %, el algoritmo selecciona
el caso 1. El resultado es deliberadamente interesante: «primera malla aceptable» no
significa «malla más fina disponible».
Caza de errores
Ejecuta 04_bug_hunt.mac y redacta para cada defecto: síntoma, causa, evidencia
y corrección. Busca cinco contaminaciones:
- La longitud declarada para el segundo caso ya no coincide con la del primero.
- Se cambia
ESIZEsin ejecutarVCLEARy volver a mallar. - Se aplica
-1000 Na cada nodo de la punta en lugar de conservar la fuerza total. - El punto de medida se identifica mediante un ID fijo.
- Se elige la malla con más elementos sin calcular ninguna variación física.
Reto verificable — Cuando mesh_h no divide la pieza
Completa 04_challenge.mac con tamaños 0.04, 0.02 y
0.01 m. En el primer caso, beam_h/mesh_h=2.5: una línea no puede
contener dos elementos y medio.
Tu script deberá:
- Declarar una política para convertir cada cociente en un número entero de divisiones.
- Informar del tamaño nominal y de las divisiones realmente utilizadas.
- Construir la malla sin IDs de líneas, nodos o elementos.
- Volver a comprobar las ecuaciones topológicas con los enteros adoptados.
- Generar el mismo CSV y seleccionar una malla solo si cumple el 2 %.
La decisión forma parte del modelo
Redondear al entero más cercano aproxima el tamaño nominal. Redondear siempre hacia arriba garantiza que el tamaño real no lo supere. Cualquiera debe quedar explícita y aplicarse de manera coherente; no delegues silenciosamente la decisión al mallador.
Autoevaluación
- ¿Por qué aparecen aproximadamente ocho veces más elementos al dividir el tamaño entre dos?
- ¿Qué diferencia práctica existe entre
ESIZEyLESIZE? - ¿Qué conjunto queda activo después de
CHECK,ESEL,WARN? - ¿Por qué la última malla no puede tener un cambio respecto a sí misma?
- ¿Qué debes concluir si
selected_case=0?
Ver respuestas breves
- Porque se duplican las divisiones en tres direcciones:
2³=8. ESIZEes global;LESIZEcontrola líneas seleccionadas y puede imponer divisiones.- Solo los elementos que producen advertencias o errores de comprobación.
- La convergencia necesita una estimación más fina independiente.
- Que el estudio no permite elegir: debe añadirse otra malla o revisarse la familia.
Evidencia de aprendizaje
m04_mesh_study.csvcon tres casos.- Conteos topológicos coincidentes con las divisiones.
- Resumen
SHPPyn_shape_bad=0. - Una gráfica de
|uy_tip|frente al número de elementos. - La malla seleccionada y una justificación basada en coste y variación.
- El diagnóstico de los cinco defectos.
Checklist de salida
- ☐ Mis tres casos solo difieren en la discretización.
- ☐ Las divisiones se obtienen de parámetros y no de IDs.
- ☐ La topología real coincide con la esperada.
- ☐ TYPE, MAT y forma aprueban antes de resolver.
- ☐ La carga total y el punto de medida permanecen constantes.
- ☐ Cada cambio usa como referencia la malla siguiente.
- ☐ Acepto
selected_case=0como conclusión válida. - ☐ No utilizo la tensión singular del empotramiento como criterio.
Trazabilidad técnica
La lección utiliza Modeling and Meshing Guide para la estrategia mapeada;
Command Reference 2024 R1 para ESIZE, LESIZE,
MSHAPE, MSHKEY, SHPP, CHECK y
VCLEAR; y Element Reference para SOLID185.
Siguiente paso: M05
El banco de ensayo ha mantenido constantes sus condiciones de contorno. En M05 dejaremos de tratarlas como una caja preparada: traduciremos el diagrama físico a restricciones y cargas, y auditaremos su valor total antes de resolver.