/// <summary> /// Dado un arreglo que contiene rasters de Datos y dos enteros, arma un raster grande pegando los contenidos en el arreglo de acuerdo /// a los argumentos de cantidad de raster por eje. /// </summary> /// <param name="arrayOfRaster">Arreglo de Rasters a pegar</param> /// <param name="divX">Cantidad de rasters del eje X</param> /// <param name="divY">Cantidad de rasters del eje Y</param> /// <returns></returns> public RasterDatos armarRaster(RasterDatos[] arrayOfRaster, int anchoEjeX, int altoEjeY, int divX, int divY) { RasterDatos newRaster = new RasterDatos(anchoEjeX, altoEjeY); int indiceRaster = 0; //For para recorrer los rasters for (int cy=0; cy < divY; cy++) { for(int cx=0; cx < divX; cx++) { for (int i = 0; i < arrayOfRaster[indiceRaster].anchoEjeX_; i++) { for (int j = 0; j < arrayOfRaster[indiceRaster].altoEjeY_; j++) { newRaster.matrizDEM_[(cy * arrayOfRaster[indiceRaster].altoEjeY_) + j, (cx * arrayOfRaster[indiceRaster].anchoEjeX_) + i] = arrayOfRaster[indiceRaster].matrizDEM_[j, i]; } } indiceRaster++; } } return newRaster; }
public DataSet(ConfParameters configurationSet) { anchoEjeX = configurationSet.anchoEjeX; altoEjeY = configurationSet.altoEjeY; dimensionCelda = configurationSet.dimensionCelda; DEM = new RasterDatos(configurationSet.pathDEM, anchoEjeX, altoEjeY); profundidadSuelos = new RasterDatos(configurationSet.pathProfSuelos, anchoEjeX, altoEjeY); alturaSueloPermeable = new RasterDatos(anchoEjeX, altoEjeY); matrizCantVariaciones = new RasterDatos(anchoEjeX, altoEjeY); for (int y = 0; y < altoEjeY; y++) { for (int x = 0; x < anchoEjeX; x++) { alturaSueloPermeable.matrizDEM_[y, x] = DEM.matrizDEM_[y, x] - profundidadSuelos.matrizDEM_[y, x]; } } kConductividadHSuelo = new RasterDatos(configurationSet.pathKConductividadHSuelo, anchoEjeX, altoEjeY); capacidadAlmacenSuelo = new RasterDatos(configurationSet.pathCapacidadAlmacenSuelo, anchoEjeX, altoEjeY); aguaSuperficie = new RasterDatos(configurationSet.pathAguaSuperficial, anchoEjeX, altoEjeY); auxiliarAguaCapaPermeable = new RasterDatos(configurationSet.pathAguaCapaPermeable, anchoEjeX, altoEjeY); aguaCapaPermeable = new RasterDatos(anchoEjeX, altoEjeY); //Llamado antes Normalizacion Inicial, el agua que se lee del archivo es sin tener en cuenta la porosidad //del suelo. for (int x = 0; x < anchoEjeX; x++) { for (int y = 0; y < altoEjeY; y++) { if (capacidadAlmacenSuelo.matrizDEM_[y, x] > 0) { aguaCapaPermeable.matrizDEM_[y, x] = auxiliarAguaCapaPermeable.matrizDEM_[y, x] / capacidadAlmacenSuelo.matrizDEM_[y, x] * (DEM.matrizDEM_[y, x] - alturaSueloPermeable.matrizDEM_[y, x]); } else { aguaCapaPermeable.matrizDEM_[y, x] = 0.0f; } } } coefEvaporacion = (float)configurationSet.coefEvaporacion; coefManning = configurationSet.coefManning; periodoGrabSalidas = configurationSet.periodoGrabacionResult; maxCantidadVariaciones = configurationSet.maxCantidadVariaciones; }
/// <summary> /// Dados datos de dimensiones (por ahora pares) y en cuantas divisiones se debe hacer, crea rasters y los devuelve en una arreglo /// </summary> /// <param name="anchoEjeX">Ancho del Raster original</param> /// <param name="altoEjeY">Alto del Raster original</param> /// <param name="divX">Cantidad de pedazos a dividir en X</param> /// <param name="divY">Cantidad de pedazos a dividir en Y</param> /// <returns></returns> public RasterDatos[] desarmarRaster(int anchoEjeX, int altoEjeY, int divX, int divY) { RasterDatos[] rasterCreated = new RasterDatos[divX * divY]; int anchoRastercito = anchoEjeX / divX; int altoRastercito = altoEjeY / divY; for(int i=0; i <rasterCreated.Length; i++) { rasterCreated[i] = new RasterDatos(anchoRastercito, altoRastercito); } return rasterCreated; }
/// <summary> /// Dados datos de dimensiones (por ahora pares) y en cuantas divisiones se debe hacer, crea rasters y los devuelve en una arreglo /// </summary> /// <param name="anchoEjeX">Ancho del Raster original</param> /// <param name="altoEjeY">Alto del Raster original</param> /// <param name="divX">Cantidad de pedazos a dividir en X</param> /// <param name="divY">Cantidad de pedazos a dividir en Y</param> /// <returns></returns> public RasterDatos[] desarmarRaster(int anchoEjeX, int altoEjeY, int divX, int divY) { RasterDatos[] rasterCreated = new RasterDatos[divX * divY]; int anchoRastercito = anchoEjeX / divX; int altoRastercito = altoEjeY / divY; for (int i = 0; i < rasterCreated.Length; i++) { rasterCreated[i] = new RasterDatos(anchoRastercito, altoRastercito); } return(rasterCreated); }
public void ejecutarEscurrimientoSuperficial(ref DataSet dataSetSimulador, float dts) { float tempValue; //Se hace una copia de los datos que seran leidos para procesar. Ya que no acepta valores por referencia. DataSet copyDataSetSimulador = dataSetSimulador; //Se generan datos RasterDatos tempFlujoEnX = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); RasterDatos tempFlujoEnY = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); int anchoEjeX = dataSetSimulador.anchoEjeX; int altoEjeY = dataSetSimulador.altoEjeY; Parallel.Invoke( () => { tempFlujoEnX = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); }, // close first Action () => { tempFlujoEnY = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); } //close second Action ); //close parallel.invoke dataSetSimulador.flujoEnXSuperficie = tempFlujoEnX; dataSetSimulador.flujoEnYSuperficie = tempFlujoEnY; /* * dataSetSimulador.flujoEnXSuperficie = escurrimientoSuperficialEnX(dataSetSimulador, dts); * dataSetSimulador.flujoEnYSuperficie = escurrimientoSuperficialEnY(dataSetSimulador, dts);*/ dataSetSimulador.flujoResultanteSuperficie = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); for (int x = 1; x < dataSetSimulador.anchoEjeX - 1; x++) { for (int y = 1; y < dataSetSimulador.altoEjeY - 1; y++) { tempValue = (float)((dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x - 1] - dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x] + dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y - 1, x] - dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y, x]) / Math.Pow(dataSetSimulador.dimensionCelda, 2.0)); dataSetSimulador.flujoResultanteSuperficie.matrizDEM_[y, x] = tempValue; } } }
public void ejecutarEscurrimientoSuperficial(ref DataSet dataSetSimulador, float dts) { float tempValue; //Se hace una copia de los datos que seran leidos para procesar. Ya que no acepta valores por referencia. DataSet copyDataSetSimulador = dataSetSimulador; //Se generan datos RasterDatos tempFlujoEnX = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); RasterDatos tempFlujoEnY = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); int anchoEjeX = dataSetSimulador.anchoEjeX; int altoEjeY = dataSetSimulador.altoEjeY; Parallel.Invoke( () => { tempFlujoEnX = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); }, // close first Action () => { tempFlujoEnY = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); } //close second Action ); //close parallel.invoke dataSetSimulador.flujoEnXSuperficie = tempFlujoEnX; dataSetSimulador.flujoEnYSuperficie = tempFlujoEnY; /* dataSetSimulador.flujoEnXSuperficie = escurrimientoSuperficialEnX(dataSetSimulador, dts); dataSetSimulador.flujoEnYSuperficie = escurrimientoSuperficialEnY(dataSetSimulador, dts);*/ dataSetSimulador.flujoResultanteSuperficie = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); for (int x = 1; x < dataSetSimulador.anchoEjeX - 1; x++) { for (int y = 1; y < dataSetSimulador.altoEjeY - 1; y++) { tempValue = (float)((dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x - 1] - dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x] + dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y - 1, x] - dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y, x]) / Math.Pow(dataSetSimulador.dimensionCelda, 2.0)); dataSetSimulador.flujoResultanteSuperficie.matrizDEM_[y, x] = tempValue; } } }
/// <summary> /// Dado un arreglo que contiene rasters de Datos y dos enteros, arma un raster grande pegando los contenidos en el arreglo de acuerdo /// a los argumentos de cantidad de raster por eje. /// </summary> /// <param name="arrayOfRaster">Arreglo de Rasters a pegar</param> /// <param name="divX">Cantidad de rasters del eje X</param> /// <param name="divY">Cantidad de rasters del eje Y</param> /// <returns></returns> public RasterDatos armarRaster(RasterDatos[] arrayOfRaster, int anchoEjeX, int altoEjeY, int divX, int divY) { RasterDatos newRaster = new RasterDatos(anchoEjeX, altoEjeY); int indiceRaster = 0; //For para recorrer los rasters for (int cy = 0; cy < divY; cy++) { for (int cx = 0; cx < divX; cx++) { for (int i = 0; i < arrayOfRaster[indiceRaster].anchoEjeX_; i++) { for (int j = 0; j < arrayOfRaster[indiceRaster].altoEjeY_; j++) { newRaster.matrizDEM_[(cy * arrayOfRaster[indiceRaster].altoEjeY_) + j, (cx * arrayOfRaster[indiceRaster].anchoEjeX_) + i] = arrayOfRaster[indiceRaster].matrizDEM_[j, i]; } } indiceRaster++; } } return(newRaster); }
public void ejecutarEscurrimientoSuperficial(ref DataSet dataSetSimulador, float dts) { float tempValue; //Se hace una copia de los datos que seran leidos para procesar. Ya que no acepta valores por referencia. DataSet copyDataSetSimulador = dataSetSimulador; int anchoEjeX = dataSetSimulador.anchoEjeX; int altoEjeY = dataSetSimulador.altoEjeY; //Se deben generar los raster tanto para X como para Y /*RasterDatos[] rastersFlujoX = new RasterDatos[divXFlujoEnX * divYFlujoEnX]; RasterDatos[] rastersFlujoY = new RasterDatos[divXFlujoEnY * divYFlujoEnY];*/ RasterDatos[] rastersFlujoX = desarmarRaster(anchoEjeX, altoEjeY, 2, 2); RasterDatos[] rastersFlujoY = desarmarRaster(anchoEjeX, altoEjeY, 2, 2); //Se generan datos RasterDatos tempFlujoEnX = new RasterDatos(anchoEjeX, altoEjeY); RasterDatos tempFlujoEnY = new RasterDatos(anchoEjeX, altoEjeY); Parallel.Invoke( () => { rastersFlujoX[0] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX/2, 0, altoEjeY/2); }, () => { rastersFlujoX[1] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, anchoEjeX/2, anchoEjeX, 0, altoEjeY/2); }, () => { rastersFlujoX[2] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX/2, altoEjeY/2, altoEjeY); }, () => { rastersFlujoX[3] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, anchoEjeX/2, anchoEjeX, altoEjeY/2, altoEjeY); }, () => { rastersFlujoY[0] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX/2, 0, altoEjeY/2); }, () => { rastersFlujoY[1] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, anchoEjeX/2, anchoEjeX, 0, altoEjeY/2); }, () => { rastersFlujoY[2] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX/2, altoEjeY/2, altoEjeY); }, () => { rastersFlujoY[3] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, anchoEjeX/2, anchoEjeX, altoEjeY/2, altoEjeY); } ); //close parallel.invoke /* Parallel.Invoke( () => { tempFlujoEnX = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); }, // close first Action () => { tempFlujoEnY = escurrimientoSuperficialEnY(copyDataSetSimulador, dts,0, anchoEjeX, 0, altoEjeY); } //close second Action ); //close parallel.invoke */ dataSetSimulador.flujoEnXSuperficie = armarRaster(rastersFlujoX, anchoEjeX, altoEjeY, 2, 2); dataSetSimulador.flujoEnYSuperficie = armarRaster(rastersFlujoY, anchoEjeX, altoEjeY, 2, 2); //dataSetSimulador.flujoEnXSuperficie = tempFlujoEnX; //dataSetSimulador.flujoEnYSuperficie = tempFlujoEnY; /* dataSetSimulador.flujoEnXSuperficie = escurrimientoSuperficialEnX(dataSetSimulador, dts); dataSetSimulador.flujoEnYSuperficie = escurrimientoSuperficialEnY(dataSetSimulador, dts);*/ dataSetSimulador.flujoResultanteSuperficie = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); for (int x = 1; x < dataSetSimulador.anchoEjeX - 1; x++) { for (int y = 1; y < dataSetSimulador.altoEjeY - 1; y++) { tempValue = (float)((dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x - 1] - dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x] + dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y - 1, x] - dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y, x]) / Math.Pow(dataSetSimulador.dimensionCelda, 2.0)); dataSetSimulador.flujoResultanteSuperficie.matrizDEM_[y, x] = tempValue; } } }
public void ejecutarEscurrimientoSuperficial(ref DataSet dataSetSimulador, float dts) { float tempValue; //Se hace una copia de los datos que seran leidos para procesar. Ya que no acepta valores por referencia. DataSet copyDataSetSimulador = dataSetSimulador; int anchoEjeX = dataSetSimulador.anchoEjeX; int altoEjeY = dataSetSimulador.altoEjeY; //Se deben generar los raster tanto para X como para Y /*RasterDatos[] rastersFlujoX = new RasterDatos[divXFlujoEnX * divYFlujoEnX]; * RasterDatos[] rastersFlujoY = new RasterDatos[divXFlujoEnY * divYFlujoEnY];*/ RasterDatos[] rastersFlujoX = desarmarRaster(anchoEjeX, altoEjeY, 2, 2); RasterDatos[] rastersFlujoY = desarmarRaster(anchoEjeX, altoEjeY, 2, 2); //Se generan datos RasterDatos tempFlujoEnX = new RasterDatos(anchoEjeX, altoEjeY); RasterDatos tempFlujoEnY = new RasterDatos(anchoEjeX, altoEjeY); Parallel.Invoke( () => { rastersFlujoX[0] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX / 2, 0, altoEjeY / 2); }, () => { rastersFlujoX[1] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, anchoEjeX / 2, anchoEjeX, 0, altoEjeY / 2); }, () => { rastersFlujoX[2] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX / 2, altoEjeY / 2, altoEjeY); }, () => { rastersFlujoX[3] = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, anchoEjeX / 2, anchoEjeX, altoEjeY / 2, altoEjeY); }, () => { rastersFlujoY[0] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX / 2, 0, altoEjeY / 2); }, () => { rastersFlujoY[1] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, anchoEjeX / 2, anchoEjeX, 0, altoEjeY / 2); }, () => { rastersFlujoY[2] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, 0, anchoEjeX / 2, altoEjeY / 2, altoEjeY); }, () => { rastersFlujoY[3] = escurrimientoSuperficialEnY(copyDataSetSimulador, dts, anchoEjeX / 2, anchoEjeX, altoEjeY / 2, altoEjeY); } ); //close parallel.invoke /* * Parallel.Invoke( * () => * { * tempFlujoEnX = escurrimientoSuperficialEnX(copyDataSetSimulador, dts, 0, anchoEjeX, 0, altoEjeY); * }, // close first Action * * () => * { * tempFlujoEnY = escurrimientoSuperficialEnY(copyDataSetSimulador, dts,0, anchoEjeX, 0, altoEjeY); * } //close second Action * * ); //close parallel.invoke */ dataSetSimulador.flujoEnXSuperficie = armarRaster(rastersFlujoX, anchoEjeX, altoEjeY, 2, 2); dataSetSimulador.flujoEnYSuperficie = armarRaster(rastersFlujoY, anchoEjeX, altoEjeY, 2, 2); //dataSetSimulador.flujoEnXSuperficie = tempFlujoEnX; //dataSetSimulador.flujoEnYSuperficie = tempFlujoEnY; /* * dataSetSimulador.flujoEnXSuperficie = escurrimientoSuperficialEnX(dataSetSimulador, dts); * * dataSetSimulador.flujoEnYSuperficie = escurrimientoSuperficialEnY(dataSetSimulador, dts);*/ dataSetSimulador.flujoResultanteSuperficie = new RasterDatos(dataSetSimulador.anchoEjeX, dataSetSimulador.altoEjeY); for (int x = 1; x < dataSetSimulador.anchoEjeX - 1; x++) { for (int y = 1; y < dataSetSimulador.altoEjeY - 1; y++) { tempValue = (float)((dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x - 1] - dataSetSimulador.flujoEnXSuperficie.matrizDEM_[y, x] + dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y - 1, x] - dataSetSimulador.flujoEnYSuperficie.matrizDEM_[y, x]) / Math.Pow(dataSetSimulador.dimensionCelda, 2.0)); dataSetSimulador.flujoResultanteSuperficie.matrizDEM_[y, x] = tempValue; } } }