Пример #1
0
        /// <summary>
        /// The Balance.
        /// </summary>
        /// <param name="idUC">The idUC<see cref="string"/>.</param>
        /// <param name="fecha">The fecha<see cref="DateTime"/>.</param>
        /// <param name="actualizaFechasEtapas">The actualizaFechasEtapas<see cref="bool"/>.</param>
        /// <param name="usarCache">The usarCache<see cref="bool"/>.</param>
        /// <returns>The <see cref="BalanceHidrico"/>.</returns>
        public static BalanceHidrico Balance(string idUC, DateTime fecha, bool actualizaFechasEtapas = true, bool usarCache = true)
        {
#if DEBUG
            usarCache = false;
#endif
            BalanceHidrico bh = null;
            if (usarCache == true)
            {
                bh = CacheDatosHidricos.Balance(idUC, fecha);
            }
            if (bh == null)
            {
                UnidadCultivoDatosHidricos dh = new UnidadCultivoDatosHidricos(idUC, fecha);
                bh = new BalanceHidrico(dh, actualizaFechasEtapas, dh.FechaFinalDeEstudio());
                if (usarCache)
                {
                    CacheDatosHidricos.Add(bh, fecha);
                }
            }
            return(bh);
        }
Пример #2
0
        /// <summary>
        /// Retorna listado de datos hídricos filtrados por los parámetros indicados.
        /// Pasar '' como parametro en blanco si no se desea filtrar.
        /// </summary>
        /// <param name="idRegante">idCliente<see cref="int?"/>.</param>
        /// <param name="idUnidadCultivo">idUnidadCultivo<see cref="string"/>.</param>
        /// <param name="idMunicipio">idMunicipio<see cref="int?"/>.</param>
        /// <param name="idCultivo">idCultivo<see cref="string"/>.</param>
        /// <param name="fechaStr">fecha.</param>
        /// <param name="roleUsuario">.</param>
        /// <param name="idUsuario">.</param>
        /// <returns><see cref="object"/>.</returns>
        public static object DatosHidricosList(int?idRegante, string idUnidadCultivo, int?idMunicipio, string idCultivo, string fechaStr, string roleUsuario, int idUsuario)
        {
            List <DatosEstadoHidrico> ret = new List <DatosEstadoHidrico>();
            List <string>             lIdUnidadCultivo = null;

            idUnidadCultivo = idUnidadCultivo.Unquoted();
            if (idUnidadCultivo != "")
            {
                lIdUnidadCultivo = new List <string> {
                    idUnidadCultivo
                }
            }
            ;
            else
            {
                lIdUnidadCultivo = DB.ListaUnidadesCultivoQueCumplenFiltro(idMunicipio, idCultivo, idRegante);
            }

            if (!DateTime.TryParse(fechaStr, out DateTime dFecha))
            {
                dFecha = DateTime.Now.Date;
            }

            // De todas las Unidades de Cultivo quitar las que el usuario no puede ver.
            List <string> lValidas = new List <string>();

            if (roleUsuario == "admin")
            {
                lValidas = lIdUnidadCultivo;
            }
            else if (roleUsuario == "asesor")
            {
                List <string> lAsesorUCList = DB.AsesorUnidadCultivoList(idUsuario);
                lValidas = lIdUnidadCultivo.Intersect(lAsesorUCList).ToList();
            }
            else    // usuario
            {
                foreach (string uc in lIdUnidadCultivo)
                {
                    string idTemporada = DB.TemporadaDeFecha(uc, dFecha);
                    if (DB.LaUnidadDeCultivoPerteneceAlReganteEnLaTemporada(uc, idUsuario, idTemporada))
                    {
                        lValidas.Add(uc);
                    }
                }
            }

            DatosEstadoHidrico         datosEstadoHidrico = null;
            UnidadCultivoDatosHidricos dh = null;
            BalanceHidrico             bh = null;
            List <GeoLocParcela>       lGeoLocParcelas = null;

            foreach (string idUc in lValidas)
            {
                try {
                    lGeoLocParcelas = null;
                    string idTemporada = DB.TemporadaDeFecha(idUc, dFecha);
                    if (idTemporada != null)
                    {
                        lGeoLocParcelas = DB.GeoLocParcelasList(idUc, idTemporada);
                        bh = BalanceHidrico.Balance(idUc, dFecha);
                        datosEstadoHidrico            = bh.DatosEstadoHidrico(dFecha);
                        datosEstadoHidrico.GeoLocJson = Newtonsoft.Json.JsonConvert.SerializeObject(lGeoLocParcelas);
                        ret.Add(datosEstadoHidrico);
                    }
                } catch (Exception ex) {
                    dh = bh.unidadCultivoDatosHidricos;
                    dh.ObtenerMunicicioParaje(out string provincias, out string municipios, out string parajes);
                    datosEstadoHidrico = new DatosEstadoHidrico {
                        Fecha           = dFecha,
                        Pluviometria    = dh.Pluviometria,
                        TipoRiego       = dh.TipoRiego,
                        FechaSiembra    = dh.FechaSiembra(),
                        Cultivo         = dh.CultivoNombre,
                        Estacion        = dh.EstacionNombre,
                        IdEstacion      = dh.IdEstacion,
                        IdRegante       = dh.IdRegante,
                        IdUnidadCultivo = idUc,
                        Municipios      = municipios,
                        Parajes         = parajes,
                        Regante         = dh.ReganteNombre,
                        Alias           = dh.Alias,
                        Eficiencia      = dh.EficienciaRiego,
                        IdCultivo       = dh.IdCultivo,
                        IdTemporada     = dh.IdTemporada,
                        IdTipoRiego     = dh.IdTipoRiego,
                        NIF             = dh.ReganteNif,
                        Telefono        = dh.ReganteTelefono,
                        TelefonoSMS     = dh.ReganteTelefonoSMS,
                        SuperficieM2    = dh.UnidadCultivoExtensionM2,
                        NParcelas       = dh.NParcelas,
                        Textura         = "",
                        GeoLocJson      = Newtonsoft.Json.JsonConvert.SerializeObject(lGeoLocParcelas),
                        Status          = "ERROR:" + ex.Message
                    };
                    ret.Add(datosEstadoHidrico);
                }
            }
            return(ret);
        }
Пример #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="BalanceHidrico"/> class.
 /// </summary>
 /// <param name="unidadCultivoDatosHidricos">The unidadCultivoDatosHidricos<see cref="UnidadCultivoDatosHidricos"/>.</param>
 /// <param name="actualizaEtapas">The actualizaEtapas<see cref="bool"/>.</param>
 /// <param name="fechaFinalEstudio">.</param>
 public BalanceHidrico(UnidadCultivoDatosHidricos unidadCultivoDatosHidricos, bool actualizaEtapas, DateTime fechaFinalEstudio)
 {
     this.unidadCultivoDatosHidricos = unidadCultivoDatosHidricos;
     CalculaBalance(actualizaEtapas, fechaFinalEstudio);
 }
Пример #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);
        }