Manual Técnico de HormigonIA

Especificación Matemática y Algorítmica del Core de Cálculo

1. Arquitectura General y Flujo

HormigonIA es una plataforma científica de diseño y ajuste de mezclas de hormigón que opera bajo un flujo lógico estructurado. El sistema conecta parámetros de laboratorio granulométrico, leyes clásicas de empaquetamiento y modelos de reología viscoplástica avanzada para lograr un diseño óptimo tanto en teoría como en obra.

El núcleo de cálculo se divide en seis subsistemas matemáticos autónomos comunicados mediante APIs en formato JSON. En este manual se describen detalladamente las ecuaciones que gobiernan cada módulo.

ℹ️ Nota de Operación Local
Este manual está integrado directamente en la estructura de la aplicación y puede ser consultado sin conexión a internet. Los botones de exportación superior activan la hoja de estilos de impresión del navegador para formatear la entrega en un PDF limpio de tamaño A4.

Módulo de Dosificación Racional y Leyes de Mezcla

Este módulo calcula las proporciones teóricas de agua, cemento y agregados por metro cúbico utilizando el método racional clásico ajustado con la curva límite de Bolomey.

1. Resistencia de Diseño (f'c) y Resistencia Media de Dosificación (f'cm)

La resistencia especificada en el proyecto ($f'_c$) se ingresa libremente como un valor numérico editable (en MPa), eliminando las clases rígidas Hx. Para calcular el dosaje base, la resistencia media requerida en el laboratorio ($f'_{cm}$) se deduce sumando el margen de seguridad probabilístico:

$$f'_{cm} = f'_c + 1.65 \cdot S\text{ (MPa)}$$

Donde la desviación estándar por defecto es $S = 4.0\text{ MPa}$ para control estándar de obra.

2. Relación Agua/Cemento (Ley de Abrams) e Inversión Teórica

La relación $w/c$ teórica se determina a partir de la categoría de cemento (CPC40, CPN50, CPC30, LC3) y la resistencia media deseada aplicando la Ley de Abrams modificada por aire atrapado:

$$f'_{cm} = f'_{cm, cemento} \cdot 1.20 \cdot Corr_{aire}$$

Donde $Corr_{aire}$ representa la corrección por porcentaje de aire atrapado ($Air\%$):

$$Corr_{aire} = \max\left(0.40, 1 - 0.05 \cdot \max(0, Air\% - 1.5)\right)$$

Despejando analíticamente la relación agua/cemento óptima a partir de la constante $K$ del cemento:

$$w/c = \frac{\ln\left(\frac{K}{f'_{cm, cemento}}\right)}{\ln(8.5)} \quad \text{donde } f'_{cm, cemento} = \frac{f'_{cm}}{1.20 \cdot Corr_{aire}}$$

Las constantes de calidad de cemento $K$ adoptadas son:

Categoría de Cemento Parámetro A (MPa) Parámetro B Resistencia Límite Nominal
CP30 78.4 2.35 30 MPa
CP40 94.2 2.28 40 MPa
CP50 112.5 2.21 50 MPa

3. Curva Combinada de Agregados (Bolomey)

La distribución óptima del volumen de agregados se calcula para ajustarse a la parábola ideal de Bolomey. El porcentaje acumulado pasante ideal ($P$) para cada tamiz de diámetro $d$ es:

$$P(d) = A + (100 - A) \sqrt{\frac{d}{D}}$$

Donde:

4. Cálculo de Volumen Absoluto

Una vez calculada la dosis de agua libre ($W$) y de cemento ($C = W / (w/c)$), el volumen restante de la mezcla se completa con los agregados para asegurar un volumen de pastón unitario de exactly $1\text{ m}^3$ ($1000\text{ L}$), incorporando el contenido de aire atrapado ($Air\%$):

$$V_{agregados} = 1000 \cdot \left(1 - \frac{Air\%}{100}\right) - \left(\frac{C}{\rho_{cemento}} + \frac{W}{\rho_{agua}} + V_{aditivos}\right)$$

5. Esquemas de Flujo y Sincronización

Para optimizar la ergonomía en obra y el rendimiento de procesamiento en dispositivos de pantalla reducida (móviles), se estructuró la aplicación de manera modular: Los parámetros analíticos de dosificación granulométrica y compacidad física (Módulo de Finura MF, Desviación Granulométrica combinada, Espesor de Pasta MPT y Porosidad de la Matriz MFP bajo el modelo de Larrard) se trasladaron a la pestaña Laboratorio de Hormigón. En la pantalla de la calculadora de hormigón principal se conserva el indicador de asentamiento predicho y se introduce una entrada sincronizada para el cono medido en obra.

A. Control de Resistencia de Diseño y Cálculo Teórico

El siguiente esquema de flujo ilustra la interacción técnica entre la resistencia de diseño ingresada, los mínimos reglamentarios y el recálculo teórico en base a las modificaciones del laboratorio:

flowchart TD classDef input fill:#2a4365,stroke:#3182ce,stroke-width:2px,color:#fff; classDef logic fill:#2d3748,stroke:#4a5568,stroke-width:1px,color:#fff; classDef calc fill:#1a202c,stroke:#805ad5,stroke-width:2px,color:#fff; classDef output fill:#22543d,stroke:#38a169,stroke-width:2px,color:#fff; InStrength[Modificación de Resistencia de Diseño f'c]:::input InManual[Ajuste Manual en Laboratorio w/c, Cemento, etc.]:::input InConstraint[Cambio de Elemento o Exposición Ambiental]:::input CheckMin{¿Es f'c menor al mínimo admisible?}:::logic ClampMin[Limitar f'c al mínimo reglamentario]:::logic AutoAdjust[autoAdjustCustomParamsFromStrength 1. f'cm = f'c + 6.6 MPa 2. w/c = ln K/f'cm_cem / ln 8.5 3. Cemento = Agua / w/c 4. Sincronizar inputs manuales]:::logic CalcEngine[calculateAndUpdate 1. Ejecuta modelo de empaquetamiento 2. Calcula pesos secos y húmedos del pastón]:::calc CalcTheoretical[calculateTheoreticalStrength 1. f'cm lograda = K / 8.5^w/c * 1.2 * CorrAire 2. f'c lograda = f'cm lograda - 6.6 MPa]:::calc UpdateUI[Actualizar UI e Impresión: - f'c / f'cm teóricas junto al input - f'c / f'cm teóricas en resultados - Cantidades del pastón kg y L - Alertas de consistencia y diseño]:::output InConstraint --> CheckMin CheckMin -- Sí --> ClampMin CheckMin -- No --> AutoAdjust ClampMin --> AutoAdjust InStrength --> AutoAdjust AutoAdjust --> CalcEngine InManual --> CalcEngine CalcEngine --> CalcTheoretical CalcTheoretical --> UpdateUI

B. Control del Volumen de Hormigón

El siguiente esquema detalla el proceso de selección de maquinadas, metros cúbicos y el manejo adaptativo de carga de mezclas históricas:

flowchart TD classDef input fill:#2a4365,stroke:#3182ce,stroke-width:2px,color:#fff; classDef logic fill:#2d3748,stroke:#4a5568,stroke-width:1px,color:#fff; classDef calc fill:#1a202c,stroke:#805ad5,stroke-width:2px,color:#fff; classDef output fill:#22543d,stroke:#38a169,stroke-width:2px,color:#fff; UserSelect[Selección de Volumen en Dropdown]:::input LoadMix[Carga de Mezcla Guardada state.batchVolume]:::input CheckExist{¿Existe el volumen en las opciones?}:::logic CreateCustom[Crear opción custom: X L Cargado]:::logic SetSelectValue[Establecer select.value = volumen]:::logic TriggerChange[Evento change o recálculo directo]:::logic CalcEngine[calculateAndUpdate 1. batchVolumeL = select.value 2. volM3 = batchVolumeL / 1000]:::calc UpdateResLabel[Actualizar etiqueta #resVolumeDisplay]:::calc CalcWeights[Multiplicar receta base por volM3: - Cemento, Agua, Aditivos y Áridos]:::calc UpdateUI[Actualizar tarjetas de receta e impresión]:::output UserSelect --> TriggerChange LoadMix --> CheckExist CheckExist -- No --> CreateCustom --> SetSelectValue CheckExist -- Sí --> SetSelectValue SetSelectValue --> TriggerChange TriggerChange --> CalcEngine CalcEngine --> UpdateResLabel CalcEngine --> CalcWeights CalcWeights --> UpdateUI UpdateResLabel --> UpdateUI

C. Sincronización de Consistencia y Ajuste Reológico

Para simplificar el flujo de trabajo del operador en obra, el asentamiento medido en gramos o centímetros se replica bidireccionalmente entre el panel de consistencia de la calculadora principal y el panel de control de calidad de reología. El siguiente esquema ilustra el flujo de sincronización y cómo se alimenta el motor de corrección de dosificación por desvíos:

flowchart TD classDef input fill:#2a4365,stroke:#3182ce,stroke-width:2px,color:#fff; classDef logic fill:#2d3748,stroke:#4a5568,stroke-width:1px,color:#fff; classDef calc fill:#1a202c,stroke:#805ad5,stroke-width:2px,color:#fff; classDef output fill:#22543d,stroke:#38a169,stroke-width:2px,color:#fff; UserCalc[Entrada en Calculador: inputCalculatorSlumpMeasured]:::input UserQC[Entrada en Reología: inputSlumpMeasured]:::input ProgChange[Cambio Programático: Reset o Carga de Mezcla]:::input SyncRoutine[Rutina de Sincronización de Eventos syncSlump]:::logic FallbackSync[Respaldo de Sincronización en calculateAndUpdate]:::logic SyncValues[Ambas entradas unificadas con valor idéntico]:::logic OpRun[Ejecución de Ajuste: - reformulateMixForIdealPaston - runRheologyAdjustment]:::calc CalcCore[Cálculo de dosificación correctiva: - Aditivos SP y Agua W de corrección - Rescaling del volumen real]:::calc UpdateRecipe[Actualizar Receta Corregida e Historial]:::output UserCalc -->|input o change| SyncRoutine UserQC -->|input o change| SyncRoutine ProgChange --> FallbackSync SyncRoutine --> SyncValues FallbackSync --> SyncValues SyncValues --> OpRun OpRun --> CalcCore CalcCore --> UpdateRecipe

D. Cronómetro de Curado Persistente en Tiempo Real

El siguiente esquema de máquina de estados detalla el flujo de inicialización, persistencia en localStorage y la lógica de ejecución del cronómetro de curado húmedo:

flowchart TD classDef input fill:#2a4365,stroke:#3182ce,stroke-width:2px,color:#fff; classDef logic fill:#2d3748,stroke:#4a5568,stroke-width:1px,color:#fff; classDef calc fill:#1a202c,stroke:#805ad5,stroke-width:2px,color:#fff; classDef output fill:#22543d,stroke:#38a169,stroke-width:2px,color:#fff; InitApp[Carga de Aplicación DOMContentLoaded]:::input ReadStorage{¿Existen curingStartTime y curingDurationMs en localStorage?}:::logic BtnStart[Usuario Pulsa: Iniciar Producción]:::input SaveStorage[Guardar curingStartTime = Date.now y curingDurationMs en localStorage]:::logic StartLoop[Iniciar bucle setInterval de 1 segundo]:::calc CalcDiff[Calcular elapsed = Date.now - curingStartTime]:::calc CalcRem[Calcular remaining = curingDurationMs - elapsed]:::calc CheckFinished{¿remaining <= 0?}:::logic UpdateProgress[Actualizar reloj Xd Yh Zm Ss y barra de progreso %]:::output FinishCuring[1. Detener Intervalo 2. Limpiar localStorage 3. Mostrar Curado Completado 4. Disparar Notificación de Escritorio]:::output UserStop[Usuario Pulsa: Detener/Reiniciar Curado]:::input ClearState[1. Detener Intervalo 2. Limpiar localStorage 3. Ocultar contenedor de cuenta regresiva]:::output InitApp --> ReadStorage ReadStorage -- Sí --> StartLoop ReadStorage -- No --> WaitStart[Esperar acción del usuario]:::logic BtnStart --> SaveStorage --> StartLoop StartLoop --> CalcDiff --> CalcRem --> CheckFinished CheckFinished -- No --> UpdateProgress -->|Esperar 1 seg| StartLoop CheckFinished -- Sí --> FinishCuring UserStop --> ClearState

Módulo de Corrección por Humedad de Áridos

Ajusta el pesaje de los agregados húmedos y calcula el balance de agua neta a incorporar a la mezcladora debido al agua libre y la absorción interna.

1. Peso Húmedo de los Agregados

Para compensar el peso de agua contenido en las pilas de acopio en obra y garantizar que la cantidad de esqueleto seco permanezca constante, los pesos secos de diseño de arena ($S_s$) y piedra ($P_s$) se ajustan a pesos húmedos ($S_h$ y $P_h$):

$$S_h = S_s \cdot \left(1 + \frac{h_{sand}}{100}\right) \cdot V_{paston}$$ $$P_h = P_s \cdot \left(1 + \frac{h_{stone}}{100}\right) \cdot V_{paston}$$

Donde $h_{sand}$ y $h_{stone}$ son las humedades gravimétricas medidas en %.

2. Aporte de Agua Libre

El árido sólo aporta agua líquida a la mezcla si su humedad medida excede su capacidad interna de absorción ($abs_{sand}$, $abs_{stone}$):

$$W_{libre, sand} = S_s \cdot \left(\frac{h_{sand} - abs_{sand}}{100}\right) \cdot V_{paston}$$ $$W_{libre, stone} = P_s \cdot \left(\frac{h_{stone} - abs_{stone}}{100}\right) \cdot V_{paston}$$

Si un árido se encuentra extremadamente seco ($h < abs$), el término será negativo. Esto representa agua absorbida por los agregados secos, la cual se compensará adicionando más agua libre de amasado.

3. Agua Neta de Amasado

El agua final a dosificar en el trompo ($W_{amasado, final}$) descuenta las contribuciones de los agregados del agua de diseño corregida por el factor de eficiencia de amasado de laboratorio ($1.1$) y multiplicada por el desvío granulométrico combinatorio ($G$):

$$W_{amasado, final} = \left[ \frac{(W_{objetivo} \cdot V_{paston}) - W_{libre, sand} - W_{libre, stone}}{1.1} \right] \cdot G$$

Módulo de Reología y Predicción de Asentamiento

Resuelve el acoplamiento físico-químico entre el asentamiento del cono de Abrams, la evaporación ambiental y la hidratación térmica del cemento.

1. Conversión Abrams - Esfuerzo de Fluencia (Roussel)

El asentamiento medido ($S$) se traduce en el esfuerzo de fluencia umbral ($\tau_y$) del hormigón fresco expresado en Pascales:

$$\tau_y = \frac{\rho_{real} \cdot g \cdot (H - S)}{225}$$

Donde $H = 0.30\text{ m}$ (altura del cono), $g = 9.81\text{ m/s}^2$ y $\rho_{real}$ es la densidad fresca del hormigón compactado.

2. Tasa de Evaporación Superficial (Menzel)

La evaporación de agua superficial se calcula a partir de las condiciones climatológicas locales (temperatura ambiente $T_{amb}$, temperatura de la masa de hormigón $T_c$, humedad relativa $HR$ y velocidad del viento $V_{viento}$):

$$E_v = 5.0 \cdot \left[ (T_c + 18)^{2.5} - HR \cdot (T_{amb} + 18)^{2.5} \right] \cdot (V_{viento} + 0.4) \cdot 10^{-6}\ (\text{kg/m}^2/\text{h})$$

El decremento de agua líquida libre penaliza la fluidez aumentando el esfuerzo de corte umbral:

$$\tau_{clima}(t) = \frac{\tau(t)}{(w_{remanente} / w_{inicial})^3}$$

3. Cinética de Hidratación (Arrhenius)

La rigidización química temprana debido a la hidratación se calcula empleando el principio de madurez por edad equivalente a $20^\circ\text{C}$:

$$t_e = \int_0^t \exp\left( -\frac{E_a}{R} \cdot \left[ \frac{1}{273.15 + T_c(t)} - \frac{1}{293.15} \right] \right) dt$$ $$\tau_{quimico}(t) = \tau_{inicial} + k_{20} \cdot (t_e)^{1.2}$$

4. Algoritmos de Corrección Reológica

A. Para pastones secos (Falta de fluidez):

1. Aditivo Superplastificante (grams):

$$\Delta SP = \frac{\tau_{fresco} - \tau_{target}}{k_{sp}} \cdot M_{cemento\ (paston)}$$

2. Adición de agua y cemento compensatorio:

$$\Delta W = V_{paston} \cdot W_{1m3} \cdot \left[ \left(\frac{S_1}{S_{target}}\right)^{0.10} - 1.0 \right] \quad \text{y} \quad \Delta C = \frac{\Delta W}{(w/c)_{max}}$$

B. Para pastones fluidos (Exceso de fluidez con riesgo de segregación):

$$\text{Masa de sólidos adicionales: } M_{solidos} = V_{paston} \cdot \left( \frac{\beta}{\tau_{target} - \tau_{fresco}} \right)$$

5. Re-escalado de Rendimiento Volumétrico a 1 m³

Sumadas las masas agregadas por la corrección al pastón, se recalcula el volumen real producido ($V_{real}$) y se re-escala al volumen exacto de $1000\text{ L}$:

$$V_{real} = \frac{\sum M_{componentes\ corregidos}}{\rho_{real}}$$ $$\gamma = \frac{1.0}{V_{real}} \implies Componente_{1m3, final} = Componente_{paston, corregido} \cdot \gamma$$

6. Cronómetro de Curado Persistente en Tiempo Real

Para garantizar el seguimiento continuo del período de curado húmedo sugerido, el sistema integra un cronómetro regresivo que opera bajo las siguientes directrices técnicas:

Módulo de Asistente Inteligente (HormigonIA Chat)

Documenta el flujo de integración de Large Language Models (LLM) con el motor analítico de cálculo.

1. Pipeline de Datos y Contexto

El asistente inteligente utiliza el modelo **Gemini 3.5 Flash** optimizado para razonamiento de ingeniería de materiales. El sistema recopila el estado actual de la dosificación y lo inyecta como contexto estructurado en el system prompt antes de cada consulta del usuario.

[System Context Injected in JSON]
{
  "diseño_actual": {
    "cemento": "CP40",
    "fcm_target": 28.5,
    "relacion_ac": 0.49,
    "agua_m3": 178.2,
    "cemento_m3": 363.7
  },
  "granulometria_combinada": {
    "tamiz_19mm": 98.4,
    "tamiz_4.75mm": 42.1,
    "tamiz_0.075mm": 1.2
  },
  "clima": {
    "temperatura": "28.4°C",
    "evaporacion_menzel": "0.42 kg/m²/h"
  }
}
            

2. Parsing de Parámetros

El backend procesa la respuesta del LLM. Si el asistente sugiere ajustes o detecta anomalías granulométricas (como un desvío crítico respecto a la curva de Bolomey), puede proponer correcciones estructuradas que el frontend lee para disparar eventos visuales.

Módulo de Base de Datos y Sincronización

Detalla el diseño de almacenamiento persistente y las políticas de seguridad a nivel de fila (RLS).

1. Esquema Relacional de Supabase

Las dosificaciones se almacenan en la tabla `saved_mixes` vinculada a la tabla de autenticación nativa de Supabase (`auth.users`):

Table: saved_mixes
+----------------+--------------------------+
| Column Name    | Data Type                |
+----------------+--------------------------+
| id             | UUID (Primary Key)       |
| user_id        | UUID (Foreign Key)       |
| name           | TEXT                     |
| created_at     | TIMESTAMP WITH TIME ZONE |
| concrete_class | TEXT                     |
| design_method  | TEXT                     |
| exposure_class | TEXT                     |
| batch_volume   | NUMERIC                  |
| wc_ratio       | NUMERIC                  |
| cement_base    | NUMERIC                  |
| sieve_data     | JSONB                    |
| additives      | JSONB                    |
| materials      | JSONB                    |
+----------------+--------------------------+
            

2. Row Level Security (RLS)

Para asegurar que ningún usuario pueda leer ni alterar las recetas de otros, la base de datos implementa políticas estrictas en el motor de PostgreSQL:

-- Política SQL para control de lectura propio:
CREATE POLICY "Permitir lectura propia" ON saved_mixes 
    FOR SELECT USING (auth.uid() = user_id);