/// <summary>
        /// Retorna los mm de lluvía a una fecha.  0 Si no se dispone de datos en esa fecha.
        /// </summary>
        /// <param name="fecha">.</param>
        /// <returns>.</returns>
        public double LluviaMm(DateTime fecha)
        {
            UnidadCultivoDatosExtra extra = DatoExtra(fecha);

            if (extra?.LluviaMm != null)
            {
                return(extra.LluviaMm ?? 0);
            }
            else
            {
                return((lDatosClimaticos.Find(d => d.Fecha == fecha)?.Precipitacion) ?? 0);
            }
        }
        /// <summary>
        /// Retorna los datos de riego a una fecha. 0 Si no se dispone de datos en esa fecha.
        /// Primero consulta en la tabla datos extra.
        /// </summary>
        /// <param name="fecha">.</param>
        /// <returns>.</returns>
        private double RiegoM3(DateTime fecha)
        {
            UnidadCultivoDatosExtra extra = DatoExtra(fecha);

            if (extra?.RiegoM3 != null)
            {
                return(extra.RiegoM3 ?? 0);
            }
            else
            {
                return((lDatosRiego?.Find(x => x.Fecha == fecha)?.RiegoM3) ?? 0);
            }
        }
Exemple #3
0
        /// <summary>
        /// Calcula la Cobertura a una fecha dada. Tiene en cuenta si se han indicado datos extra.
        /// </summary>
        /// <param name="antCob">.</param>
        /// <param name="tcCob">.</param>
        /// <param name="incT">.</param>
        /// <param name="datoExtra">.</param>
        /// <returns>.</returns>
        public static double Cobertura(double antCob, double tcCob, double incT, UnidadCultivoDatosExtra datoExtra)
        {
            double ret;

            if (datoExtra?.Cobertura != null)
            {
                ret = (double)datoExtra.Cobertura;
            }
            else
            {
                ret = antCob + tcCob * incT;
            }
            return(ret < 1 ? ret : 1);// !!! SIAR limitar cobertura máxima a 1
        }
Exemple #4
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);
        }
Exemple #5
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")
        }
Exemple #6
0
        /// <summary>
        /// Calcula la Altura para una fecha dada. NO Tiene en cuenta si se han indicado datos extra.
        /// </summary>
        /// <param name="antAlt">.</param>
        /// <param name="tcAlt">.</param>
        /// <param name="incT">.</param>
        /// <param name="alturaFinal">.</param>
        /// <param name="datoExtra">.</param>
        /// <returns>.</returns>
        public static double Altura(double antAlt, double tcAlt, double incT, double?alturaFinal, UnidadCultivoDatosExtra datoExtra)
        {
            double ret = 0;

            if (datoExtra?.Altura != null)
            {
                ret = datoExtra.Altura ?? 0;
            }
            else
            {
                ret = (antAlt + tcAlt * incT);
            }
            if (alturaFinal != null && alturaFinal > 0 && ret > alturaFinal)
            {
                ret = (double)alturaFinal;
            }
            return(ret);
        }