/// <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); }
/// <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); }
/// <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); }
/// <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); }