! ============================================================
! M07 - Ampliacion: graficos reproducibles y POST26
! Unidades coherentes: m, kg, s, N, Pa.
! ============================================================
/CLEAR,START                        ! Rampa estatica con 10 substeps; TIME = factor de carga.
/FILNAME,m07_graphics,1
/TITLE,M07 - Graficos y curva carga-respuesta
/UNITS,SI

case_id=0
beam_l=1.0
beam_h=0.10
beam_b=0.05
mesh_h=0.05
young=210E9
nu=0.30
tip_force=-1000
n_substeps=10
select_tol=MIN(beam_h,beam_b)*1E-5
linearity_tol=0.02
graphics_passes=0

/PREP7                              ! --- 1. MODELO HEREDADO DE M07 ---
ET,1,SOLID185
KEYOPT,1,2,3
MP,EX,1,young
MP,PRXY,1,nu
TYPE,1
MAT,1
BLOCK,0,beam_l,0,beam_h,0,beam_b

div_x=beam_l/mesh_h
div_y=beam_h/mesh_h
div_z=beam_b/mesh_h
MSHAPE,0,3D
MSHKEY,1
LSEL,S,LENGTH,,beam_l
LESIZE,ALL,,,div_x,,1
LSEL,S,LENGTH,,beam_h
LESIZE,ALL,,,div_y,,1
LSEL,S,LENGTH,,beam_b
LESIZE,ALL,,,div_z,,1
ALLSEL,ALL
VMESH,ALL

*GET,n_nodes,NODE,0,COUNT
*GET,n_elements,ELEM,0,COUNT

SELTOL,select_tol
CSYS,0
NSEL,S,LOC,X,0
CM,fixed_nodes,NODE
ALLSEL,ALL

NSEL,S,LOC,X,beam_l
CM,tip_nodes,NODE
*GET,n_tip,NODE,0,COUNT
ALLSEL,ALL

NSEL,S,LOC,X,beam_l
NSEL,R,LOC,Y,0
NSEL,R,LOC,Z,0
*GET,corner_node,NODE,0,NUM,MIN
ALLSEL,ALL
SELTOL,

! --- 2. RAMPA ESTATICA CON TODOS LOS SUBSTEPS ---
FINISH
/SOLU
CMSEL,S,fixed_nodes
D,ALL,ALL,0
ALLSEL,ALL

CMSEL,S,tip_nodes
force_per_node=tip_force/n_tip
F,ALL,FY,force_per_node
ALLSEL,ALL

ANTYPE,STATIC
NLGEOM,OFF
KBC,0
NSUBST,n_substeps
OUTRES,ALL,ALL
TIME,1
ALLSEL,ALL
SOLVE
FINISH

! --- 3. POST1: CONTORNOS REPRODUCIBLES EN PNG ---
/POST1                              ! /POST1 prepara la lectura de resultados para graficos y extraccion tabular.
SET,LAST                            ! SET,LAST fija el substep final como referencia visual y numerica.
RSYS,0                              ! RSYS,0 evita rotar componentes de tension sin documentarlo.
/GFILE,1200                         ! /GFILE,1200 eleva la resolucion del raster exportado a PNG.
/DEVICE,VECTOR,1
/GRAPHICS,POWER
/VIEW,1,1,1,1

/SHOW,PNG                           ! /SHOW,PNG redirige la salida grafica a archivo PNG en lugar de pantalla.
/TITLE,M07 - Deformada escalada
/AXLAB,X,X (m)
/AXLAB,Y,Y (m)
PLDISP,2                            ! PLDISP,2 exporta la deformada escalada como evidencia reproducible.
/SHOW,CLOSE

/SHOW,PNG
/TITLE,M07 - UY nodal (PLNSOL)
/AXLAB,X,X (m)
/AXLAB,Y,Y (m)
PLNSOL,U,Y                          ! PLNSOL,U,Y genera contorno nodal de desplazamiento vertical.
/SHOW,CLOSE

/SHOW,PNG
/TITLE,M07 - S,X nodal (PLNSOL)
/AXLAB,X,X (m)
/AXLAB,Y,Y (m)
PLNSOL,S,X                          ! PLNSOL,S,X contornea tension normal de flexion con promediado nodal.
/SHOW,CLOSE

/SHOW,PNG
/TITLE,M07 - S,X elemental (PLESOL)
/AXLAB,X,X (m)
/AXLAB,Y,Y (m)
PLESOL,S,X                          ! PLESOL,S,X muestra discontinuidades elementales de SX (sin promediar).
/SHOW,CLOSE

! --- 4. TABLA NUMERICA DESDE LOS SETS (POST1) ---
*GET,n_sets,ACTIVE,0,SET,NSET       ! *GET recorre todos los substeps resueltos en la rampa de carga.
*CFOPEN,m07_load_response,csv
*VWRITE
('substep,load_factor,uy_corner_m,uy_ratio_to_final')
substep=0
*DO,i,1,n_sets
  SET,1,1,,,i                       ! SET selecciona el substep i de la serie temporal estatica.
  *GET,load_factor,ACTIVE,0,SET,TIME     ! *GET lee TIME del set activo como factor de carga normalizado.
  *GET,uy_corner,NODE,corner_node,U,Y     ! *GET extrae UY en el nodo de esquina para la fila del CSV.
  substep=i
  uy_ratio=0
  *IF,i,EQ,n_sets,THEN
    uy_final=uy_corner
  *ENDIF
*ENDDO

substep=0
*DO,i,1,n_sets
  SET,1,1,,,i                       ! SET selecciona el substep i de la serie temporal estatica.
  *GET,load_factor,ACTIVE,0,SET,TIME     ! *GET lee TIME del set activo como factor de carga normalizado.
  *GET,uy_corner,NODE,corner_node,U,Y     ! *GET extrae UY en el nodo de esquina para la fila del CSV.
  substep=i
  uy_ratio=uy_corner/uy_final
  *VWRITE,substep,load_factor,uy_corner,uy_ratio
  (F6.0,',',E16.8,',',E16.8,',',E16.8)
*ENDDO
*CFCLOS

half_step=n_substeps/2              ! Comprobar linealidad en el punto intermedio (50 % de carga).
SET,1,1,,,half_step                 ! SET posiciona el substep intermedio para auditar proporcionalidad carga-desplazamiento.
*GET,load_half,ACTIVE,0,SET,TIME     ! *GET lee el factor de carga en el substep intermedio.
*GET,uy_half,NODE,corner_node,U,Y     ! *GET captura UY en 50 % de carga para la prueba de linealidad.
SET,LAST                            ! SET,LAST vuelve al estado de carga plena antes de POST26.
*GET,load_full,ACTIVE,0,SET,TIME     ! *GET confirma TIME y UY en el ultimo substep de la rampa.
*GET,uy_full,NODE,corner_node,U,Y
uy_half_expected=uy_full*load_half/load_full
half_linearity_error=ABS(uy_half-uy_half_expected)/ABS(uy_full)

! --- 5. POST26: PRIMERA CURVA CARGA-RESPUESTA ---
FINISH
/POST26                             ! /POST26 abre el postprocesador de series temporales/historias.
NUMVAR,10
NSOL,2,corner_node,U,Y              ! NSOL registra UY del nodo de esquina como variable 2 frente a TIME.
XVAR,1
/AXLAB,X,Factor de carga (TIME)
/AXLAB,Y,UY en nodo de esquina (m)
/GFILE,1200
/SHOW,PNG
PLVAR,2                             ! PLVAR traza la curva carga-desplazamiento almacenada por NSOL.
/SHOW,CLOSE
PRVAR,1,2                           ! PRVAR imprime la tabla numerica TIME vs UY para auditoria en .out.

*IF,n_sets,EQ,n_substeps,THEN       ! --- 6. CONTRATO DE LA AMPLIACION ---
  graphics_passes=1
*ENDIF
*IF,half_linearity_error,GE,linearity_tol,THEN
  graphics_passes=0
*ENDIF
*IF,n_nodes,NE,126,THEN
  graphics_passes=0
*ENDIF
*IF,n_elements,NE,40,THEN
  graphics_passes=0
*ENDIF

*CFOPEN,m07_graphics_audit,csv
*VWRITE
('case_id,tip_force,n_sets,n_nodes,n_elements,uy_full_m,load_half,uy_half_m,half_linearity_error,graphics_passes')
*VWRITE,case_id,tip_force,n_sets,n_nodes,n_elements,uy_full,load_half,uy_half,half_linearity_error,graphics_passes
(F3.0,',',E16.8,',',F6.0,',',F10.0,',',F10.0,',',E16.8,',',E16.8,',',E16.8,',',E16.8,',',F2.0)
*CFCLOS

*IF,graphics_passes,EQ,1,THEN
  /COM,M07 GRAPHICS LAB PASSED
*ELSE
  /COM,M07 GRAPHICS LAB FAILED - inspect CSV and PNG outputs
*ENDIF

FINISH



