Ejemplo n.º 1
0
        /// <summary>
        /// CalculaBalance. Función de uso interno en la clase para calcular el balance. Se ejecuta una única vez para añadir las líneas de balance.
        /// </summary>
        /// <param name="actualizaEtapas">The actualizaEtapas<see cref="bool"/>.</param>
        /// <param name="fechaFinalEstudio">.</param>
        private void CalculaBalance(bool actualizaEtapas, DateTime fechaFinalEstudio)
        {
            LineaBalance lbAnt = new LineaBalance();
            DateTime     fecha = unidadCultivoDatosHidricos.FechaSiembra();
            //DateTime fechaFinalEstudio = unidadCultivoDatosHidricos.FechaFinalDeEstudio();
            int diasDesdeSiembra = 1;

            if (unidadCultivoDatosHidricos.nEtapas <= 0)
            {
                throw new Exception("No se han definido etapas para la unidad de cultivo: " + unidadCultivoDatosHidricos.IdUnidadCultivo);
            }
            while (fecha <= fechaFinalEstudio)
            {
                LineaBalance lineaBalance = CalculosHidricos.CalculaLineaBalance(unidadCultivoDatosHidricos, lbAnt, fecha);
                lineaBalance.DiasDesdeSiembra = diasDesdeSiembra++;
                LineasBalance.Add(lineaBalance);
                lbAnt = lineaBalance;
                fecha = fecha.AddDays(1);
                if (lineaBalance.NumeroEtapaDesarrollo < unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList.Count)
                {
                    fechaFinalEstudio = fecha.AddDays(1);
                }
                else
                {
                    int duracionEtapa = unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList[unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList.Count - 1].DuracionDiasEtapa;
                    fechaFinalEstudio = unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList[unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList.Count - 1].FechaInicioEtapa.AddDays(duracionEtapa);
                }
            }
            if (actualizaEtapas)
            {
                DB.FechasEtapasSave(unidadCultivoDatosHidricos.UnidadCultivoCultivoEtapasList);
            }

            LineasBalance.RemoveAll(x => x.Fecha > DateTime.Today.AddDays(-1));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// The RaizLongitud.
        /// </summary>
        /// <param name="lbAnt">The lbAnt<see cref="LineaBalance"/>.</param>
        /// <param name="nEtapa">The nEtapa<see cref="int"/>.</param>
        /// <param name="it">The it<see cref="double"/>.</param>
        /// <param name="profRaizInicial">The profRaizInicial<see cref="double"/>.</param>
        /// <param name="modRaizCoefB">The modRaizCoefB<see cref="double"/>.</param>
        /// <param name="profRaizMax">The profRaizMax<see cref="double"/>.</param>
        /// <param name="definicionEtapaPorDias">The definicionEtapaPorDias<see cref="bool"/>.</param>
        /// <param name="nDiasEtapas1y2">The nDiasEtapas1y2<see cref="int"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public static double RaizLongitud(LineaBalance lbAnt, int nEtapa, double it, double profRaizInicial, double modRaizCoefB, double profRaizMax, bool definicionEtapaPorDias, int nDiasEtapas1y2)
        {
            double ret;

            if (lbAnt.LongitudRaiz == 0)
            {
                ret = profRaizInicial;
            }
            else if (modRaizCoefB < 0)     //old: if (definicionEtapaPorDias) { // propuestaSIAR esta función es más natural y fácil de entender que tener la tasa de crecimiento por un lado y el calculo crecimiento  en dos funciones distintas. Este modelo de función además permite un cálculo real de la integral térmica ya que sólo la usa si hay fórmula.
            {
                if (nEtapa < 3)
                {
                    ret = lbAnt.LongitudRaiz + (profRaizMax - profRaizInicial) / (nDiasEtapas1y2 - 2);
                    if (ret > profRaizMax)
                    {
                        ret = profRaizMax;
                    }
                }
                else
                {
                    ret = lbAnt.LongitudRaiz;
                }
            }
            else
            {
                ret = lbAnt.LongitudRaiz + modRaizCoefB * it;
                if (ret > profRaizMax)
                {
                    ret = profRaizMax;
                }
            }
            return(ret);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Devuelve un valor entre -1 y 1 indicando es estado hidrico a una fecha.
        /// </summary>
        /// <param name="fecha">.</param>
        /// <returns>.</returns>
        public double IndiceEstres(DateTime fecha)
        {
            LineaBalance lin = LineasBalance.Find(x => x.Fecha == fecha);

            if (lin == null)
            {
                throw new Exception("No se encontraron datos del balance para esa fecha.");
            }
            return(lin.IndiceEstres);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// AguaUtilOptima.
        /// </summary>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public double AguaUtilOptima(DateTime fecha)   // !!! SIAR renombrar a AguaFacilmenteExtraible, también en la salida API si se usase
        {
            LineaBalance lin = LineasBalance.Find(x => x.Fecha == fecha);

            if (lin == null)
            {
                throw new Exception("No se encontraron datos del balance para esa fecha.");
            }
            return(lin.CapacidadCampo - lin.LimiteAgotamiento);
            //return (lin.AguaFacilmenteExtraible); // !!! SIAR es más sencillo así
        }
Ejemplo n.º 5
0
        /// <summary>
        /// AguaUtil.
        /// </summary>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public double AguaUtil(DateTime fecha)   // !!!SIAR esta formula es errónea y se puede eliminar
        {
            double       ret = 0;
            LineaBalance lin = LineasBalance.Find(x => x.Fecha == fecha);

            if (lin == null)
            {
                return(0);
            }
            ret = lin.CapacidadCampo - lin.ContenidoAguaSuelo;
            return(ret);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// AguaUtilTotal.
        /// </summary>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public double AguaUtilTotal(DateTime fecha)   //!!! SIAR renombrar función a AguaDisponibleTotal; también en la salida de la API si se usase
        {
            LineaBalance lin = LineasBalance.Find(x => x.Fecha == fecha);

            if (lin == null)
            {
                throw new Exception("No se encontraron valores en el balance para la fecha indicada.");
            }
            double ret = lin.CapacidadCampo - lin.PuntoMarchitez;

            // double ret = lin.AguaDisponibleTotal; // !!! SIAR, más sencillo así
            return(ret);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// The NumCambiosDeEtapaPendientesDeConfirmar.
        /// </summary>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="int"/>.</returns>
        private int NumCambiosDeEtapaPendientesDeConfirmar(DateTime fecha)   // !!! SIAR, no entendemos muy bien la función pero creemos que lo calcula mal
        {
            int          ret = 0;
            LineaBalance lin = LineasBalance.Find(x => x.Fecha == fecha);

            if (lin != null)
            {
                List <UnidadCultivoCultivoEtapas> etapas = unidadCultivoDatosHidricos?.UnidadCultivoCultivoEtapasList;
                if (etapas != null)
                {
                    etapas.ForEach(e => {
                        if ((e.IdEtapaCultivo > lin.NumeroEtapaDesarrollo) && (e.FechaInicioEtapaConfirmada == null))
                        {
                            ret++;
                        }
                    });
                }
            }
            return(ret);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// The DrenajeEnProdundidad.
        /// </summary>
        /// <param name="lbAnt">The lbAnt<see cref="LineaBalance"/>.</param>
        /// <param name="taw">The taw<see cref="double"/>.</param>
        /// <param name="ETcAdj">The ETcAdj<see cref="double"/>.</param>
        /// <param name="rieEfec">The rieEfec<see cref="double"/>.</param>
        /// <param name="pef">The pef<see cref="double"/>.</param>
        /// <param name="aguaAportadaCrecRaiz">The aguaAportadaCrecRaiz<see cref="double"/>.</param>
        /// <param name="driStart">The driStart<see cref="double"/>.</param>
        /// <param name="escorrentia">The escorrentia<see cref="double"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public static double DrenajeEnProdundidad(LineaBalance lbAnt, double taw, double ETcAdj, double rieEfec, double pef, double aguaAportadaCrecRaiz, double driStart, double escorrentia)
        {
            if (lbAnt.Fecha == null)
            {
                driStart = taw; // el día 1 el "depósito" está vacío
            }
            double ret = rieEfec + pef + aguaAportadaCrecRaiz - (ETcAdj + driStart + escorrentia);

            if (ret < 0)
            {
                ret = 0;
            }
            if (ret > 0)
            {
                double drenajeUmbral = Config.GetDouble("DrenajeUmbral");
                if (ret < drenajeUmbral)
                {
                    ret = 0;
                }
            }
            return(ret);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// ResumenDiario.
        /// </summary>
        /// <param name="fechaDeCalculo">Fecha en la que se desean presentar los datos<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="ResumenDiario"/>.</returns>
        public ResumenDiario ResumenDiario(DateTime fechaDeCalculo)
        {
            if (fechaDeCalculo > unidadCultivoDatosHidricos.FechaFinalDeEstudio())
            {
                fechaDeCalculo = unidadCultivoDatosHidricos.FechaFinalDeEstudio();
            }
            if (fechaDeCalculo > DateTime.Today)
            {
                fechaDeCalculo = DateTime.Today;
            }
            if (fechaDeCalculo < unidadCultivoDatosHidricos.FechaSiembra())
            {
                fechaDeCalculo = unidadCultivoDatosHidricos.FechaSiembra();
            }
            ResumenDiario ret = new ResumenDiario();
            LineaBalance  lb  = LineaBalance(fechaDeCalculo);

            ret.IdUnidadCultivo     = unidadCultivoDatosHidricos.IdUnidadCultivo;
            ret.FechaDeCalculo      = fechaDeCalculo;
            ret.RiegoTotal          = SumaRiegosMm(fechaDeCalculo);           // !!! SIAR ELIMINAR
            ret.RiegoEfectivoTotal  = SumaRiegoEfectivo(fechaDeCalculo);      // !!! SIAR ELIMINAR  y AÑADIR A LA SALIDA DatosHidricos
            ret.LluviaTotal         = SumaLluvias(fechaDeCalculo);            // !!! SIAR ELIMINAR
            ret.LluviaEfectivaTotal = SumaLluviasEfectivas(fechaDeCalculo);   // !!! SIAR ELIMINAR  y AÑADIR A LA SALIDA DatosHidricos
            ret.AguaPerdida         = AguaPerdida(fechaDeCalculo);            // !!! SIAR ELIMINAR
            ret.ConsumoAguaCultivo  = SumaConsumoAguaCultivo(fechaDeCalculo); // !!! SIAR ELIMINAR
            ret.DiasEstres          = NDIasEstres(fechaDeCalculo);            // !!! SIAR ELIMINAR
            ret.DeficitRiego        = double.NaN;                             // Aún no definido // !!! SIAR ELIMINAR y AÑADIR A LA SALIDA DatosHidricos
            ret.CosteDeficitRiego   = double.NaN;                             // Aúno no definido. // !!! SIAR ELIMINAR y AÑADIR A LA SALIDA DatosHidricos
            ret.CosteAguaRiego      = CosteAgua(fechaDeCalculo);              // !!! SIAR ELIMINAR
            ret.CosteAguaDrenaje    = CosteDrenaje(fechaDeCalculo);           // !!! SIAR ELIMINAR y AÑADIR A LA SALIDA DatosHidricos

            ret.CapacidadCampo = lb.CapacidadCampo;

            ret.LimiteAgotamiento  = lb.LimiteAgotamiento;
            ret.PuntoMarchitez     = lb.PuntoMarchitez;
            ret.ContenidoAguaSuelo = lb.ContenidoAguaSuelo;

            ret.CapacidadCampoPorcentaje = 1;
            try {
                ret.LimiteAgotamientoPorcentaje = (ret.LimiteAgotamiento - ret.PuntoMarchitez) / (ret.CapacidadCampo - ret.PuntoMarchitez);
            } catch {
                ret.LimiteAgotamientoPorcentaje = double.NaN;
            }

            ret.PuntoMarchitezPorcentaje = 0;
            try {
                ret.ContenidoAguaSueloPorcentaje = (ret.ContenidoAguaSuelo - ret.PuntoMarchitez) / (ret.CapacidadCampo - ret.PuntoMarchitez);
            } catch {
                ret.ContenidoAguaSueloPorcentaje = double.NaN;
            }

            ret.DrenajeProfundidad = lb.DrenajeProfundidad;
            ret.AvisoDrenaje       = CalculosHidricos.AvisoDrenaje(lb.DrenajeProfundidad);

            ret.AguaHastaCapacidadCampo  = ret.CapacidadCampo - ret.ContenidoAguaSuelo; // esto no lo debería usar Daniel
            ret.RecomendacionRiegoNeto   = lb.RecomendacionRiegoNeto;
            ret.RecomendacionRiegoBruto  = lb.RecomendacionRiegoBruto;                  // añadido SIAR
            ret.RecomendacionRiegoTiempo = lb.RecomendacionRiegoTiempo;

            ret.IndiceEstres      = lb.IndiceEstres;
            ret.MensajeEstres     = lb.MensajeEstres;
            ret.DescripcionEstres = lb.DescripcionEstres;
            ret.ColorEstres       = lb.ColorEstres;

            ret.CapacidadCampoRefPM        = lb.CapacidadCampoRefPM;
            ret.PuntoMarchitezRefPM        = lb.PuntoMarchitezRefPM;
            ret.ContenidoAguaSueloRefPM    = lb.ContenidoAguaSueloRefPM;
            ret.LimiteAgotamientoRefPM     = lb.LimiteAgotamientoRefPM;
            ret.LimiteAgotamientoFijoRefPM = lb.LimiteAgotamientoFijoRefPM;

            ret.AlturaFinal   = unidadCultivoDatosHidricos.CultivoAlturaFinal ?? 0;
            ret.AlturaInicial = unidadCultivoDatosHidricos.CultivoAlturaInicial ?? 0;
            ret.Altura        = lb.AlturaCultivo;

            ret.Cobertura = lb.Cobertura;

            ret.ProfRaizInicial = unidadCultivoDatosHidricos.CultivoProfRaizInicial;
            ret.ProfRaizMaxima  = unidadCultivoDatosHidricos.CultivoProfRaizMax;
            ret.LongitudRaiz    = lb.LongitudRaiz;

            ret.NumeroEtapaDesarrollo = lb.NumeroEtapaDesarrollo;
            ret.NombreEtapaDesarrollo = lb.NombreEtapaDesarrollo;
            return(ret);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// DatosEstadoHidrico.
        /// </summary>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <returns>The <see cref="DatosEstadoHidrico"/>.</returns>
        public DatosEstadoHidrico DatosEstadoHidrico(DateTime fecha)
        {
            if (fecha > DateTime.Today)
            {
                fecha = DateTime.Today;
            }
            if (fecha > unidadCultivoDatosHidricos.FechaFinalDeEstudio())
            {
                fecha = unidadCultivoDatosHidricos.FechaFinalDeEstudio();
            }
            LineaBalance linBalAFecha = LineasBalance.Find(x => x.Fecha == fecha);

            if (linBalAFecha == null)
            {
                linBalAFecha = LineasBalance.Last();
                fecha        = (DateTime)linBalAFecha.Fecha;
            }
            unidadCultivoDatosHidricos.ObtenerMunicicioParaje(out string provincias, out string municipios, out string parajes);
            DatosEstadoHidrico ret = new DatosEstadoHidrico {
                Fecha                   = fecha,
                Eficiencia              = unidadCultivoDatosHidricos.EficienciaRiego,
                Alias                   = unidadCultivoDatosHidricos.Alias,
                IdCultivo               = unidadCultivoDatosHidricos.IdCultivo,
                SuperficieM2            = unidadCultivoDatosHidricos.UnidadCultivoExtensionM2,
                IdTemporada             = unidadCultivoDatosHidricos.IdTemporada,
                IdTipoRiego             = unidadCultivoDatosHidricos.IdTipoRiego,
                NParcelas               = unidadCultivoDatosHidricos.NParcelas,
                Regante                 = unidadCultivoDatosHidricos.ReganteNombre,
                NIF                     = unidadCultivoDatosHidricos.ReganteNif,
                Municipios              = municipios,
                Parajes                 = parajes,
                Telefono                = unidadCultivoDatosHidricos.ReganteTelefono,
                TelefonoSMS             = unidadCultivoDatosHidricos.ReganteTelefonoSMS,
                Pluviometria            = unidadCultivoDatosHidricos.Pluviometria,
                TipoRiego               = unidadCultivoDatosHidricos.TipoRiego,
                FechaSiembra            = unidadCultivoDatosHidricos.FechaSiembra(),
                Cultivo                 = unidadCultivoDatosHidricos.CultivoNombre,
                IdUnidadCultivo         = unidadCultivoDatosHidricos.IdUnidadCultivo,
                Estacion                = unidadCultivoDatosHidricos.EstacionNombre,
                IdRegante               = unidadCultivoDatosHidricos.IdRegante,
                IdEstacion              = unidadCultivoDatosHidricos.IdEstacion,
                SumaLluvia              = SumaLluvias(fecha),
                SumaRiego               = SumaRiegosMm(fecha),
                AguaUtil                = AguaUtil(fecha),
                RegarEnNDias            = RegarEnNDias(fecha),
                AguaUtilTotal           = AguaUtilTotal(fecha),
                Consumo                 = SumaEtc(fecha),
                CapacidadDeCampo        = linBalAFecha.CapacidadCampo,
                PuntoDeMarchited        = linBalAFecha.PuntoMarchitez,
                AguaUtilOptima          = AguaUtilOptima(fecha),
                AguaPerdida             = AguaPerdida(fecha),
                AguaTotalPerdidaDrenaje = AguaTotalPerdidaDrenaje(fecha),
                CosteAgua               = CosteAgua(fecha),
                NDiasEstres             = NDIasEstres(fecha),
                NumDiasEstresPorDrenaje = NumDiasEstresPorDrenaje(fecha),
                EstadoHidrico           = IndiceEstres(fecha),
                Textura                 = unidadCultivoDatosHidricos.TipoSueloDescripcion,
                IndiceEstres            = linBalAFecha.IndiceEstres,
                DescripcionEstres       = linBalAFecha.DescripcionEstres,
                ColorEstres             = linBalAFecha.ColorEstres,
                MensajeEstres           = linBalAFecha.MensajeEstres,
                NumCambiosDeEtapaPendientesDeConfirmar = NumCambiosDeEtapaPendientesDeConfirmar(fecha),
                Status = "OK",
            };

            return(ret);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// CalculaLineaBalance.
        /// </summary>
        /// <param name="dh">dh<see cref="UnidadCultivoDatosHidricos"/>.</param>
        /// <param name="lbAnt">lbAnt<see cref="LineaBalance"/>.</param>
        /// <param name="fecha">fecha<see cref="DateTime"/>.</param>
        /// <returns><see cref="LineaBalance"/>.</returns>
        public static LineaBalance CalculaLineaBalance(UnidadCultivoDatosHidricos dh, LineaBalance lbAnt, DateTime fecha)
        {
            LineaBalance lb = new LineaBalance {
                Fecha = fecha
            };

            if (lbAnt == null)
            {
                lbAnt = new LineaBalance();
            }
            double temperatura = dh.Temperatura(fecha);

            bool   definicionPorDias = dh.UnidadCultivoCultivoEtapasList[lb.NumeroEtapaDesarrollo - 1].DefinicionPorDias;
            double incT = IncrementoTemperatura(temperatura, dh.CultivoTBase, definicionPorDias);// !!! SIAR

            if (lbAnt?.Fecha == null)
            {
                incT = 0;                       // el primero es 0
            }
            UnidadCultivoDatosExtra datoExtra = dh.DatoExtra(fecha);

            lb.IntegralTermica = (lbAnt.IntegralTermica + incT);

            bool   definicionEtapaPorDias = dh.UnidadCultivoCultivoEtapasList[lbAnt.NumeroEtapaDesarrollo - 1].DefinicionPorDias;
            int    nDiasduracionEtapaDias = dh.UnidadCultivoCultivoEtapasList[lbAnt.NumeroEtapaDesarrollo - 1].DuracionDiasEtapa;
            double?coberturaInicial       = dh.UnidadCultivoCultivoEtapasList[lbAnt.NumeroEtapaDesarrollo - 1].CobInicial;
            double?coberturaFinal         = dh.UnidadCultivoCultivoEtapasList[lbAnt.NumeroEtapaDesarrollo - 1].CobFinal;
            int    NDiasEtapas1y2         = dh.CultivoEtapasList_Ndias1y2();

            lb.TasaCrecimientoCobertura = TasaCrecimientoCobertura(lb.IntegralTermica, lbAnt.NumeroEtapaDesarrollo, dh.CultivoIntegralEmergencia, dh.CultivoModCobCoefA, dh.CultivoModCobCoefB, dh.CultivoModCobCoefC, definicionEtapaPorDias, nDiasduracionEtapaDias, coberturaInicial, coberturaFinal);
            lb.TasaCrecimientoAltura    = TasaCrecimientoAltura(lb.IntegralTermica, lbAnt.NumeroEtapaDesarrollo, dh.CultivoIntegralEmergencia, dh.CultivoModAltCoefA, dh.CultivoModAltCoefB, dh.CultivoModAltCoefC, definicionEtapaPorDias, NDiasEtapas1y2, dh.CultivoAlturaInicial, dh.CultivoAlturaFinal);
            lb.Cobertura = Cobertura(lbAnt.Cobertura, lb.TasaCrecimientoCobertura, incT, datoExtra);

            lb.NumeroEtapaDesarrollo = NumeroEtapaDesarrollo(fecha, lb.Cobertura, lbAnt.NumeroEtapaDesarrollo, dh.UnidadCultivoCultivoEtapasList, dh.UnidadCultivoCultivoEtapasList);
            lb.AlturaCultivo         = Altura(lbAnt.AlturaCultivo, lb.TasaCrecimientoAltura, incT, dh.CultivoAlturaFinal, datoExtra);
            lb.LongitudRaiz          = RaizLongitud(lbAnt, lb.NumeroEtapaDesarrollo, incT, dh.CultivoProfRaizInicial, dh.CultivoModRaizCoefB, dh.CultivoProfRaizMax, definicionEtapaPorDias, NDiasEtapas1y2);

            lb.DiasMaduracion        = lbAnt.DiasMaduracion > 0 ? lb.DiasMaduracion = lbAnt.DiasMaduracion + 1 : lb.Cobertura > 0.8 ? 1 : 0;
            lb.NombreEtapaDesarrollo = dh.UnidadCultivoCultivoEtapasList[lb.NumeroEtapaDesarrollo - 1].Etapa;

            // Parámetros de suelo
            lb.CapacidadCampo      = CapacidadCampo(lb.LongitudRaiz, dh.ListaUcSuelo);
            lb.PuntoMarchitez      = PuntoMarchitez(lb.LongitudRaiz, dh.ListaUcSuelo);
            lb.AguaDisponibleTotal = lb.CapacidadCampo - lb.PuntoMarchitez;

            // Parámetros de aporte de agua
            lb.Lluvia         = dh.LluviaMm(fecha);
            lb.LluviaEfectiva = PrecipitacionEfectiva(lb.Lluvia, dh.Eto(fecha));
            lb.Riego          = dh.RiegoMm(fecha);
            lb.RiegoEfectivo  = RiegoEfectivo(lb.Riego, dh.EficienciaRiego);
            lb.AguaCrecRaiz   = AguaAportadaCrecRaiz(0.8, lb.AguaDisponibleTotal, lbAnt.AguaDisponibleTotal);

            // Parámetros de cálculo del balance
            lb.AgotamientoInicioDia = lbAnt.AgotamientoFinalDia;
            lb.Kc = Kc(lb.NumeroEtapaDesarrollo, fecha, lb.Cobertura, dh.UnidadCultivoCultivoEtapasList, dh.UnidadCultivoCultivoEtapasList);
            lb.KcAjustadoClima = KcAdjClima(lb.Kc, lb.AlturaCultivo, dh.VelocidadViento(fecha), dh.HumedadMedia(fecha));

            // Parámetros de estrés en suelo
            lb.FraccionAgotamiento         = DepletionFactor(lb.KcAjustadoClima * dh.Eto(fecha), lb.NumeroEtapaDesarrollo, dh.UnidadCultivoCultivoEtapasList);
            lb.AguaFacilmenteExtraible     = lb.FraccionAgotamiento * lb.AguaDisponibleTotal;                                                       // depletion factor f(ETc)
            lb.AguaFacilmenteExtraibleFija = AguaFacilmenteExtraibleFija(lb.AguaDisponibleTotal, lb.NumeroEtapaDesarrollo, dh.UnidadCultivoCultivoEtapasList);
            lb.LimiteAgotamiento           = (lb.CapacidadCampo - lb.AguaFacilmenteExtraible);                                                      // depletion factor f(ETc)
            lb.LimiteAgotamientoFijo       = (lb.CapacidadCampo - lb.AguaFacilmenteExtraibleFija);                                                  // depletion factor fijo
            lb.CoeficienteEstresHidrico    = CoeficienteEstresHidrico(lb.AguaDisponibleTotal, lb.AguaFacilmenteExtraible, lb.AgotamientoInicioDia); // K de estrés hídrico

            lb.EtcFinal = EtcFinal(dh.Eto(fecha), lb.KcAjustadoClima, lb.CoeficienteEstresHidrico);                                                 //ETc ajustada por clima y estrés

            lb.DrenajeProfundidad  = DrenajeEnProdundidad(lbAnt, lb.AguaDisponibleTotal, lb.EtcFinal, lb.RiegoEfectivo, lb.LluviaEfectiva, lb.AguaCrecRaiz, lb.AgotamientoInicioDia, 0);
            lb.AgotamientoFinalDia = AgotamientoFinalDia(lb.AguaDisponibleTotal, lb.EtcFinal, lb.RiegoEfectivo, lb.LluviaEfectiva, lb.AguaCrecRaiz, lb.AgotamientoInicioDia, lb.DrenajeProfundidad, 0, lbAnt, datoExtra);
            lb.ContenidoAguaSuelo  = lb.CapacidadCampo - lb.AgotamientoFinalDia;

            double CoeficienteEstresHidricoFinalDelDia = CoeficienteEstresHidrico(lb.AguaDisponibleTotal, lb.AguaFacilmenteExtraible, lb.AgotamientoFinalDia);

            lb.IndiceEstres = IndiceEstres(lb.ContenidoAguaSuelo, lb.LimiteAgotamiento, CoeficienteEstresHidricoFinalDelDia, lb.CapacidadCampo, lb.DrenajeProfundidad);

            dh.ClaseEstresUmbralInferiorYSuperior(lb.NumeroEtapaDesarrollo, out double limiteInferior, out double limiteSuperior);

            TipoEstresUmbral tipoEstresUmbral = dh.TipoEstresUmbral(lb.IndiceEstres, lb.NumeroEtapaDesarrollo);

            lb.MensajeEstres     = tipoEstresUmbral.Mensaje;
            lb.DescripcionEstres = tipoEstresUmbral.Descripcion;
            lb.ColorEstres       = tipoEstresUmbral.Color;

            lb.RecomendacionRiegoNeto   = RecomendacionRiegoMm(lb.AguaFacilmenteExtraible, lb.AguaDisponibleTotal, lb.NumeroEtapaDesarrollo, lb.AgotamientoFinalDia, dh.EtapaInicioRiego, limiteInferior, limiteSuperior);
            lb.RecomendacionRiegoBruto  = lb.RecomendacionRiegoNeto / dh.EficienciaRiego;
            lb.RecomendacionRiegoTiempo = lb.RecomendacionRiegoBruto / dh.Pluviometria;

            lb.CapacidadCampoRefPM        = CapacidadCampoRefPuntoMarchitezMm(lb.CapacidadCampo, lb.PuntoMarchitez);
            lb.PuntoMarchitezRefPM        = PuntoMarchitezRefPuntoMarchitezMm();
            lb.ContenidoAguaSueloRefPM    = ContenidoAguaSuelRefPuntoMarchitezMm(lb.ContenidoAguaSuelo, lb.PuntoMarchitez);
            lb.LimiteAgotamientoRefPM     = LimiteOptimoRefClima(lb.LimiteAgotamiento, lb.PuntoMarchitez);
            lb.LimiteAgotamientoFijoRefPM = LimiteOptimoFijoRefClima(lb.LimiteAgotamientoFijo, lb.PuntoMarchitez);
            return(lb);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// The AgotamientoFinalDia.
        /// </summary>
        /// <param name="taw">The taw<see cref="double"/>.</param>
        /// <param name="EtcAdj">The EtcAdj<see cref="double"/>.</param>
        /// <param name="rieEfec">The rieEfec<see cref="double"/>.</param>
        /// <param name="pef">The pef<see cref="double"/>.</param>
        /// <param name="aguaAportadaCrecRaiz">The aguaAportadaCrecRaiz<see cref="double"/>.</param>
        /// <param name="driStart">The driStart<see cref="double"/>.</param>
        /// <param name="dp">The dp<see cref="double"/>.</param>
        /// <param name="escorrentia">The escorrentia<see cref="double"/>.</param>
        /// <param name="lbAnt">The lbAnt<see cref="LineaBalance"/>.</param>
        /// <param name="datoExtra">The datoExtra<see cref="UnidadCultivoDatosExtra"/>.</param>
        /// <returns>The <see cref="double"/>.</returns>
        public static double AgotamientoFinalDia(double taw, double EtcAdj, double rieEfec, double pef, double aguaAportadaCrecRaiz, double driStart, double dp, double escorrentia, LineaBalance lbAnt, UnidadCultivoDatosExtra datoExtra)
        {
            double ret = 0;

            if (datoExtra?.DriEnd != null)  // si existen datos extra prevalecen sobre los calculados.
            {
                return(datoExtra.DriEnd ?? 0);
            }
            if (lbAnt.Fecha == null)
            {
                driStart = taw; // el día 1 el "depósito" está vacío
            }
            ret = driStart - rieEfec - pef - aguaAportadaCrecRaiz + EtcAdj + dp + escorrentia;
            return(ret > 0 ? ret : 0); // !!! modificado SIAR para corregir errores debidos a la eliminación del drenaje (dp) inferiores al umbral Config.GetDouble("DrenajeUmbral")
        }