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.
L×H; la convergencia se decide con CSV, no con suavidad visual.
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.