public void ejecucionSimulacion()
        {
            infiltradorVertical.ejecutarInfiltracionVertical(ref dataSetSimulador);

            int   NT  = parametrosSimulador.tiempoSimulacionHoras;
            int   Nts = parametrosSimulador.escSupPasosNts;
            float dts;
            float dt0 = 1.0f;

            logEvents("Comienzo de Simulacion");

            //To register execution time of tasks.
            Stopwatch stopWatch = new Stopwatch();

            for (int t = 1; t <= NT; t++)
            {
                stopWatch.Start();

                logEvents("\n");
                logEvents(t.ToString() + " horas de simulación.");

                //Actualiza el paso de ejecucion t en el formulario.
                formPadre.Invoke(formPadre.delegadoStep, new Object[] { t.ToString() });
                asignarLluviaASuperficie(t);

                if (Nts > 1)
                {
                    dts = dt0 / Nts * 3600;
                }
                else
                {
                    dts = dt0 * 3600;
                    Nts = 1;
                }

                //dataSetSimulador.aguaSuperficie.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\AguaSuperficie_Prueba_orig_antes.agu");

                //Se pasa como ref para que guarde todos los cambios en el conjunto de datos
                escurridorSuperficial.ejecutarEscurrimientoSuperficial(ref dataSetSimulador, dts);

                //dataSetSimulador.flujoResultanteSuperficie.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\FlujoResultante_Superficie_New.agu");

                //dataSetSimulador.flujoEnXSuperficie.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\FlujoX_Superficie_New.agu");
                //dataSetSimulador.flujoEnYSuperficie.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\FlujoY_Superficie_New.agu");

                Nts = calcPasosEscSupNts(dts, dt0);

                for (int ts = 1; ts <= Nts; ts++)
                {
                    asignarAlturasAgua(dts);
                    escurridorSuperficial.ejecutarEscurrimientoSuperficial(ref dataSetSimulador, dts);
                    crearMatrizFlujos(ts - 1, dataSetSimulador.flujoResultanteSuperficie.anchoEjeX_, dataSetSimulador.flujoResultanteSuperficie.altoEjeY_);
                }

                if (!parametrosSimulador.nohacerPlanchado)
                {
                    // dataSetSimulador.matrizCantVariaciones.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\Variaciones_" + diaEejecucion.ToString() + ".var");
                    clusterizadorPlanchador.ejecutarClusteringPlanchado(ref dataSetSimulador);
                    // dataSetSimulador.matrizClusters.writeDataMatrix(parametrosSimulador.carpetaResultados + @"\Clusters_" + diaEejecucion.ToString() + ".clu");
                }
                evaporador.ejecutarEvapotranspiracion(ref dataSetSimulador);
                infiltradorHorizontal.ejecutarInfiltracionHorizontal(ref dataSetSimulador);
                recalculoVariables(dt0);
                infiltradorVertical.ejecutarInfiltracionVertical(ref dataSetSimulador);
                escribirResultado(t);

                //Finish of watching execution time.
                stopWatch.Stop();
                // Get the elapsed time as a TimeSpan value.
                TimeSpan tst = stopWatch.Elapsed;
                // Format and display the TimeSpan value.
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                                                   tst.Hours, tst.Minutes, tst.Seconds,
                                                   tst.Milliseconds / 10);

                logEvents("RunTime: " + elapsedTime);
            }
        }