TESIS PLEDR
-
Upload
roberto-gabriel-cayampi-gutierrez -
Category
Documents
-
view
66 -
download
1
Transcript of TESIS PLEDR
Universidad Nacional San Cristobal de Huamanga
Facultad de Ingenierıa de Minas, Geologıa y Civil
Escuela Profesional de Ingenierıa Civil
Tesis Para Optar el Tıtulo de Ingeniero Civil
Programa Lluvia Escorrentıa Para Simulacion de
Defensas Riberenas con ObjectARX C++
Presentado por : Ayala Bizarro, Ivan Arturo
Ayacucho Peru
2009
PRESENTACION
La presente tesis lleva por tıtulo Programa Lluvia Escorrentıa Para Simulacion de Defen-
sas Riberenas con ObjectARX C++, como una contribucion a la investigacion y progra-
macion en el area de la ingenierıa hidraulica. La realizacion de esta investigacion sale a luz
luego de haber trabajado en multiples problemas relacionados con el estudio de defensas
riberenas y transito de flujos en cauces naturales, con el afan de plasmar mediante un
programa informatico que involucre analisis hidrologico, analisis hidraulico y finalmente
hidraulica fluvial, se plantea el desarrollo informatico mediante el lenguaje de programa-
cion C++ y ObjectARX. Esperando que su aplicacion sirva a todos aquellos profesionales
y estudiantes inmersos a la hidraulica.
Ayala Bizarro, Ivan Arturo
Escuela Profesional de Ingenierıa Civil
Universidad Nacional San Cristobal de Huamanga
Ayacucho, Agosto de 2009.
i
DEDICATORIA
A DIOS por iluminar y bendecir mi camino. A mis
padres, Manuel Ayala Toscano y Marıa Bizarro Ortız,
quienes me apoyaron de manera incondicional en mi for-
macion academica; gracias a ustedes por apostar siem-
pre en la educacion. A mis hermanos y a ti Jessica por
darme una felicidad y alegrıa incomparable.
ii
AGRADECIMIENTOS
A los docentes de la Universidad Nacional de San Cristobal de Huamanga -
Facultad de Ingenierıa de Minas Geologıa y Civil, por su contribucion durante
mi desarrollo academico y profesional.
Al Ingeniero Joel Ore Iwanaga, que durante mi formacion profesional no solo
se ha dedicado a incentivarme en la investigacion de la ingenierıa hidraulica,
sino que tambien oriento mi futuro academico y personal, a quien considero un
modelo de docente universitario, y muy aparte de ser mi asesor en el presente
proyecto de investigacion es un gran amigo.
Como dejar de agradecer al Ingeniero Cristian Castro Perez, talentoso ami-
go, con muchas ganas de compartir informaciones a todos aquellos que estan
interesados en la investigacion; sus conocimientos son dignos de admiracion.
A la Ingeniera Jessica Zuniga Mendoza, por su colaboracion en la realizacion
de la presente tesis, muchos detalles importantes y primordiales de la presente
investigacion son gracias a sus cualidades de las que no cuento. Gracias por
tu ayuda y tu tiempo desinteresado.
Al Ingeniero Ernesto Estrada Cardenas, por su colaboracion y orientacion y
por permitirme conocer a esa gran persona que hay detras del profesional que
nos muestra.
iii
Al Ingeniero Jaime Bendezu Prado, por su entusiasmo, dinamismo y sobre
todo empeno en las clases academicas.
A mis companeros de la Universidad Nacional de San Cristobal de Huamanga:
Juan Luis Taype Carrasco, Edmundo Canchari Gutierrez, Cesar Yupanqui,
Odiger Tacas, por compartir muchos momentos agradables durante nuestra
permanencia en la Universidad.
A la Universidad Nacional de San Cristobal de Huamanga, alma mater, del
cual me siento muy orgulloso haber pertenecido y egresado de sus aulas.
Al Dr. Hugo Scaletti, Dr. Julio Kuroiwa, Dr. Jorge Abad, personas de gran
conocimiento y sobre todo demostrando sencillez, a ellos por atender mis con-
sultas y despejar mis dudas en mi formacion profesional.
Al Dr. Arturo Leon Cuba por apoyar en la investigacion y brindar oportuni-
dades al respecto.
A mis companeros de la Maestrıa de la Universidad Nacional de Ingenierıa:
Juan Carlos Rodriguez, Freddy Velazquez, Edwin Arapa, grandes amigos y
companeros de carpeta.
En general, agradecer a todos aquellos que no menciono, pero sı contribuyeron
con sus palabras de animos y consejos para seguir siempre adelante, como la
Sra. Cecilia.
RESUMEN
Este proyecto de investigacion nace con el objetivo de contribuir a la Ingenierıa Civil
dentro del area de hidraulica y su desarrollo concierne a trabajos hidrologicos, hidraulicos
e hidraulica fluvial, para ello se crea una herramienta, pretendiendo facilitar y disminuir
aquellos procedimientos tediosos que se nos presentan al momento de realizar el analisis
en los tres parametros mencionados anteriormente.
Especıficamente, la tesis trata del desarrollo de un programa llamado PLEDER, que viene
a ser las iniciales del nombre de la investigacion realizada. EL lenguaje de programacion
utilizado es C++ con enlaces de librerıas ObjectARX, el cual facilita el acceso a las
estructuras de la base de datos de AutoCAD, siendo el acceso directo, tambien facilita
el acceso al sistema grafico, permitiendo definir comandos nativos dentro de programa
AutoCAD, ademas crea objetos personalizados en la base de datos para las aplicaciones
especificas.
El contenido teorico de la presente tesis de investigacion, explica los pasos y los procedi-
mientos a seguir mediante la utilizacion de los diferentes metodos que se desarrollan en los
capıtulos 2, 3, 4 y 5, mas adelante se resume el contenido de estos capıtulos divididos en
etapas. En el capıtulo 6, se hace referencia a la aplicacion practica mediante el programa
elaborado, el cual permitira comprobar la relacion teorico-practico. Finalmente se adjunta
los diagramas de flujo y el codigo fuente del programa.
v
En la etapa Hidrologica, se desarrolla la programacion de los modelos matematicos para
simulacion precipitacion escorrentıa desde generacion de hietogramas, en el cual se utiliza
dos metodologıas como el metodo de IILA-SENAMHI-UNI mediante el metodo del bloque
alterno propuesto por Ven Te Chow, metodo de los hietogramas sinteticos de tormentas
desarrollado por el Servicio de Conservacion de Suelos del Departamento de Agricultura
de los EEUU (1986), en la actualidad (NRCS). Determinacion de abstracciones, mediante
el modelo del numero de curva propuesto por el NRCS de los EEUU. Determinacion de
hidrogramas unitarios, donde se emplea los modelos del Hidrograma Unitario Sintetico de
Snyder y del NRCS. Determinacion de hidrogramas de maximas avenidas: Esta etapa se
desarrollara mediante el metodo de convolucion directa.
La etapa Hidraulica, es la parte fundamental de la presente investigacion, que consiste
en transitar los caudales de maximas avenidas a traves de las secciones transversales
naturales, considerando para el caso flujo permanente gradualmente variado y su solucion
numerica mediante el metodo del paso estandar. La etapa hidraulica permite conocer las
caracterısticas hidraulicas de diseno como son el tirante, velocidades maximas en el canal
principal y las llanuras izquierdo y derecho.
En la etapa Hidraulica Fluvial, corresponde a obtener las socavaciones generales en cada
una de las secciones transversales incluyendo para ello las partıculas inherentes en la zona
en estudio, permitiendo realizar su grafico correspondiente.
Se debe tener en cuenta que la programacion realizada en la presente tesis es a nivel
general, es decir, se puede aplicar a cualquier zona de nuestro paıs o fuera de ella, solamente
se necesita tener criterios prudentes en el ingreso de datos.
Indice general
Portada
Presentacion I
Dedicatoria II
Agradecimientos III
Resumen V
Indice General VII
Indice de Cuadros XII
Indice de Figuras XV
1. INTRODUCCION XVIII
1.1. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii
1.2. Necesidad o motivacion de la investigacion . . . . . . . . . . . . . . . . . . xix
1.3. Objetivos de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
vii
INDICE GENERAL
1.3.1. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
1.3.2. Especıficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xx
1.4. Organizacion de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
2. TEORIA HIDROLOGICA Y DIAGRAMAS DE FLUJO XXIV
2.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv
2.2. Desarrollo de Hietogramas de diseno . . . . . . . . . . . . . . . . . . . . . xxv
2.2.1. IILA-SENAMHI-UNI . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
2.2.2. Hietogramas sinteticos del NRCS . . . . . . . . . . . . . . . . . . . xxvi
2.3. Tasas de Infiltracion - Metodo del NRCS . . . . . . . . . . . . . . . . . . . xxix
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder . . . . . . . . . . . . . . xxxv
2.4.1. Hidrograma Unitario . . . . . . . . . . . . . . . . . . . . . . . . . . xxxv
2.4.2. Hidrograma Unitario Sintetico . . . . . . . . . . . . . . . . . . . . . xxxviii
2.5. Metodo de Convolucion discreta para transformacion precipitacion-
escorrentıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xliv
2.5.1. Sistema Lineal en el tiempo continuo . . . . . . . . . . . . . . . . . xlv
2.5.2. Sistema Lineal en tiempo discreto . . . . . . . . . . . . . . . . . . . xlvi
2.5.3. Funcion respuesta de pulso discreto y Ecuacion de Convolucion Dis-
creta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlviii
2.6. Diagramas de Flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . l
viii
INDICE GENERAL
3. TEORIA HIDRAULICA Y SECCIONES TRANSVERSALES EN
RIOS LIX
3.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lix
3.2. Bases teoricos para el calculo de flujo unidimensional . . . . . . . . . . . . lx
3.2.1. Ecuacion de Movimiento General. . . . . . . . . . . . . . . . . . . . lx
3.2.2. Ecuacion de Movimiento del flujo. . . . . . . . . . . . . . . . . . . . lxi
3.2.3. Flujo Permanente. . . . . . . . . . . . . . . . . . . . . . . . . . . . lxiv
3.2.4. Flujo Uniforme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxiv
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico. . . . . . lxv
3.4. Calculo del Tirante Normal . . . . . . . . . . . . . . . . . . . . . . . . . . lxviii
3.4.1. Calculo Numerico . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxviii
3.5. Caracterısticas y Clasificacion de los Perfiles del Flujo Gradualmente Variadolxxvii
3.6. Ecuaciones para el calculo de perfiles basicos. . . . . . . . . . . . . . . . . lxxxi
4. MODELOS NUMERICOS EN RIOS Y DIAGRAMAS DE FLUJO LXXXV
4.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxv
4.2. Formulacion de Flujos en 1D . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxvi
4.2.1. Ecuaciones Hidrodinamicas 1D . . . . . . . . . . . . . . . . . . . . lxxxvi
4.2.2. Propiedades Hidraulicas Compuestas . . . . . . . . . . . . . . . . . lxxxviii
4.2.3. Propiedades Hidraulicas Compuestas . . . . . . . . . . . . . . . . . xciii
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos . . . . xciv
4.3.1. Calculos de Flujos Permanentes 1-D . . . . . . . . . . . . . . . . . xciv
4.3.2. Resumen de ecuaciones empleados en el programa PLEDER . . . . xcix
4.4. Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . c
ix
INDICE GENERAL
5. SOCAVACION EN RIOS Y DIAGRAMAS DE FLUJO CXII
5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxii
5.2. Clasificacion de los Rıos . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxii
5.2.1. Cauce principal definido . . . . . . . . . . . . . . . . . . . . . . . . cxiii
5.2.2. Cauce principal indefinido . . . . . . . . . . . . . . . . . . . . . . . cxiii
5.3. Socavacion General en cauces definidos . . . . . . . . . . . . . . . . . . . . cxiv
5.3.1. Socavacion General para Suelos Cohesivos . . . . . . . . . . . . . . cxiv
5.3.2. Socavacion General para Suelos No Cohesivos . . . . . . . . . . . . cxix
5.4. Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxi
6. APLICACION PRACTICA DEL PROGRAMA DESARROLLADOCXXVII
6.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxvii
6.2. Descripcion General de Programa PLEDER . . . . . . . . . . . . . . . . . cxxviii
6.3. Calculos y Resultados Hidrologicos . . . . . . . . . . . . . . . . . . . . . . cxxxii
6.3.1. Parametro Cuenca [U] . . . . . . . . . . . . . . . . . . . . . . . . . cxxxiii
6.3.2. Parametro Precipitacion [P] . . . . . . . . . . . . . . . . . . . . . . cxxxv
6.3.3. Parametro Tiempo [T] . . . . . . . . . . . . . . . . . . . . . . . . . cxxxvi
6.3.4. Hidrogramas de Salida . . . . . . . . . . . . . . . . . . . . . . . . . cxxxvi
6.4. Calculos y Resultados Hidraulicos . . . . . . . . . . . . . . . . . . . . . . . cxxxix
6.4.1. Secciones Transversales . . . . . . . . . . . . . . . . . . . . . . . . . cxl
6.4.2. Flujo Permanente . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxli
6.4.3. Resultados y Perfil de superficie libre . . . . . . . . . . . . . . . . . cxlii
6.5. Calculos y Resultados de Socavaciones Generales . . . . . . . . . . . . . . cxliv
x
INDICE GENERAL
7. CONCLUSIONES Y RECOMENDACIONES CXLVI
7.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxlvi
7.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxlviii
Bibliografıa CXLIX
A. HIDROLOGIA CODIGO FUENTE C++ CLIV
B. HIDRAULICA CODIGO FUENTE C++ CCXVIII
C. HIDRAULICA FLUVIAL CODIGO FUENTE C++ CCCXXX
D. RESULTADOS DEL PROGRAMA CCCXLVI
E. PLANOS CCCLXXXVII
xi
Indice de cuadros
2.1. Parametro regional b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
2.2. Clasificacion de clases antecedentes de humedad (AMC) para el metodo de
abstracciones de lluvia del NRCS . . . . . . . . . . . . . . . . . . . . . . . xxxiv
2.3. Grupo de suelo hidrologico, para el calculo del CN . . . . . . . . . . . . . xxxv
5.1. Valores del coeficiente ϕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxv
5.2. Valores de X , para suelos cohesivos y no cohesivos . . . . . . . . . . . . . cxvi
6.1. Datos de la cuenca principal . . . . . . . . . . . . . . . . . . . . . . . . . cxxxii
6.2. Caudales maximos para diferentes Perıodos de Retorno . . . . . . . . . . . cxxxix
D.1. Coordenadas hidrograma TR = 50 anos . . . . . . . . . . . . . . . . . . . . cccxlvi
D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 anos . . . . . . cccxlvii
D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 anos . . . . . . cccxlviii
D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 anos . . . . . . cccxlix
D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 anos . . . . . . cccl
D.2. Coordenadas hidrograma TR = 100 anos . . . . . . . . . . . . . . . . . . . cccl
D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 anos . . . . . cccli
xii
INDICE DE CUADROS
D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 anos . . . . . ccclii
D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 anos . . . . . cccliii
D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 anos . . . . . cccliv
D.3. Coordenadas hidrograma TR = 200 anos . . . . . . . . . . . . . . . . . . . cccliv
D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 anos . . . . . ccclv
D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 anos . . . . . ccclvi
D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 anos . . . . . ccclvii
D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 anos . . . . . ccclviii
D.4. Coordenadas hidrograma TR = 500 anos . . . . . . . . . . . . . . . . . . . ccclviii
D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 anos . . . . . ccclix
D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 anos . . . . . ccclx
D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 anos . . . . . ccclxi
D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 anos . . . . . ccclxii
D.5. Resultados parametros hidraulicos TR = 50 anos . . . . . . . . . . . . . . . ccclxii
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxiii
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxiv
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxv
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxvi
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxvii
D.5. Continuacion de la tabla parametros hidraulicos TR = 50 anos . . . . . . . ccclxviii
D.6. Resultados parametros hidraulicos TR = 100 anos . . . . . . . . . . . . . . ccclxviii
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxix
xiii
INDICE DE CUADROS
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxx
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxxi
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxxii
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxxiii
D.6. Continuacion de la tabla parametros hidraulicos TR = 100 anos . . . . . . . ccclxxiv
D.7. Resultados parametros hidraulicos TR = 200 anos . . . . . . . . . . . . . . ccclxxiv
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxv
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxvi
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxvii
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxviii
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxix
D.7. Continuacion de la tabla parametros hidraulicos TR = 200 anos . . . . . . . ccclxxx
D.8. Resultados parametros hidraulicos TR = 500 anos . . . . . . . . . . . . . . ccclxxx
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxi
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxii
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxiii
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxiv
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxv
D.8. Continuacion de la tabla parametros hidraulicos TR = 500 anos . . . . . . . ccclxxxvi
xiv
Indice de figuras
2.1. Hietograma: Intensidad-Tiempo . . . . . . . . . . . . . . . . . . . . . . . . xxv
2.2. Distribucion de tormenta de 24 horas NRCS . . . . . . . . . . . . . . . . . xxviii
2.3. Distribucion de tormenta de los cuatro tipos NRCS . . . . . . . . . . . . . xxix
2.4. Solucion grafica de la ecuacion Pe = (P−0,2S)2
P+0,8S, (Fuente: Chapter 10 Esti-
mation of Direct Runoff from Storm Rainfall) . . . . . . . . . . . . . . . . xxxiii
2.5. Hidrograma Unitario: Principio de Proporcionalidad . . . . . . . . . . . . . xxxvii
2.6. Hidrograma Unitario Sintetico del NRCS . . . . . . . . . . . . . . . . . . . xxxix
2.7. a) Hidrograma Unitario estandar (tp = 5,5tr); b) Hidrograma Unitario
requerido (tp 6= 5,5tr). Fuente [11] . . . . . . . . . . . . . . . . . . . . . . . xl
2.8. PLEDER: Coordenadas del Hidrograma Unitario Sintetico Snyder . . . . xlii
2.9. Sistema hidrologico: continuidad de agua almacenada. . . . . . . . . . . . . xlv
3.1. Fuerza Actuante en un Fluido . . . . . . . . . . . . . . . . . . . . . . . . . lxi
3.2. Seccion Transversal en Cauces Naturales . . . . . . . . . . . . . . . . . . . lxvi
3.3. Elementos geometricos de las Secciones Transversales en: i, j, k . . . . . . . lxvi
3.4. Pendiente del banco izquierdo a la superficie libre . . . . . . . . . . . . . . lxxiv
3.5. Pendiente del banco derecho a la superficie libre . . . . . . . . . . . . . . . lxxiv
xv
INDICE DE FIGURAS
3.6. Esquema para superficie libre de agua . . . . . . . . . . . . . . . . . . . . . lxxvii
3.7. Sistema de clasificacion de perfiles de flujo gradualmente variado . . . . . . lxxix
3.8. Balance de Energıa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxi
4.1. Representacion de la seccion transversal en el Metodo Alpha . . . . . . . . lxxxix
4.2. Seccion transversal compuesta con llanuras de inundacion . . . . . . . . . . xcii
4.3. Malla Uni-dimensional, Modelo de cauce en 1D . . . . . . . . . . . . . . . xcvi
5.1. Seccion transversal en cauce principal definido . . . . . . . . . . . . . . . . cxiii
5.2. Seccion transversal en cauce principal indefinido . . . . . . . . . . . . . . . cxiii
5.3. Seccion transversal, Socavacion general . . . . . . . . . . . . . . . . . . . . cxvii
5.4. Franja en estudio para la socavacion . . . . . . . . . . . . . . . . . . . . . cxvii
6.1. Icono: PLIILA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxviii
6.2. Icono: PLNRCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxix
6.3. Icono: PLLLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxix
6.4. Icono: PLCNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxix
6.5. Icono: PLHU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxix
6.6. Icono: PLHSTC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxx
6.7. Icono: PLHCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxx
6.8. Icono: PLHPSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxx
6.9. Icono: PLHTST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxi
6.10. Icono: PLHRES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxi
6.11. Icono: PLHDEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxi
xvi
INDICE DE FIGURAS
6.12. Icono: PLHSOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxi
6.13. Icono: PLHSCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxii
6.14. PLEDER, paneles Ribbon . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxii
6.15. PLEDER, datos Transformacion Lluvia Escorrentıa . . . . . . . . . . . . . cxxxiii
6.16. PLEDER, area desde una polilınea . . . . . . . . . . . . . . . . . . . . . . cxxxiv
6.17. PLEDER, curva Numero Compuesto . . . . . . . . . . . . . . . . . . . . . cxxxiv
6.18. PLEDER, calculo del tiempo de retardo . . . . . . . . . . . . . . . . . . . cxxxv
6.19. PLEDER, modelo meteorologico NRCS . . . . . . . . . . . . . . . . . . . . cxxxvi
6.20. Hidrograma TR = 50 anos . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxvii
6.21. Hidrograma TR = 100 anos . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxvii
6.22. Hidrograma TR = 200 anos . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxviii
6.23. Hidrograma TR = 500 anos . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxviii
6.24. Planta Rıo Huallaga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxxxix
6.25. PLEDER, secciones transversales . . . . . . . . . . . . . . . . . . . . . . . cxl
6.26. AutoCAD secciones transversales . . . . . . . . . . . . . . . . . . . . . . . cxli
6.27. PLEDER, calculo del flujo permanente . . . . . . . . . . . . . . . . . . . . cxlii
6.28. PLEDER, resultados-parametros hidraulicos . . . . . . . . . . . . . . . . . cxliii
6.29. Niveles de superficie libre en las secciones transversales . . . . . . . . . . . cxliii
6.30. PLEDER, parametros socavacion general . . . . . . . . . . . . . . . . . . . cxliv
6.31. Socavaciones en las secciones transversales . . . . . . . . . . . . . . . . . . cxlv
xvii
Capıtulo 1
INTRODUCCION
1.1. Antecedentes
A inicios de los anos 60, con la aparicion de las primeras computadoras se realizaron
numerosos programas para calcular y/o transformar la lluvia-escorrentıa y transito de
flujos en canales, aplicando distintas metodologıas, pero en estos anos, aun era limitado
desarrollar programas con variables multiples debido a las limitaciones de las memorias
que ofrecıan en ese entonces; tal es el caso del desarrollo de programas para la hidrologıa
determinıstica y algunos estocasticos con series limitadas debido a las dimensiones cortas
de sus matrices. Conforme pasaron los tiempos y paralelo al avance de la tecnologıa, se
mejoro considerablemente metodologıas computacionales dentro del area de hidraulica e
hidrologıa, realizando softwares en su maxima expresion, considerando modelos tridimen-
sionales en el espacio y no permanentes en el tiempo, con soluciones numericas avanzadas
tales como el Metodo de los Elementos Finitos y/o soluciones mediante la utilizacion de
Inteligencia Artificial, tales como Algoritmos Geneticos, Redes Neuronales Artificiales,
entre otros.
xviii
1.2. Necesidad o motivacion de la investigacion
En la actualidad, existen numerosos programas de otras latitudes, tales como el HEC
RAS, HEC HMS, GSTAR, MIKE 11, RIVER CAD y muchos mas, los mismos que se
utilizan directamente sin conocer el fundamento teorico al detalle, lo que nos conlleva en
muchos casos a una interpretacion inadecuada. Problemas que surgen debido a que estos
programas en su gran mayorıa se encuentran en idioma extranjero y algunos casos con
parametros de acuerdo a su zona de estudio.
PLEDER, en su primera version trata de mejorar muchas dificultades como es la recepcion
de datos dentro del programa AutoCAD, aprovechando las bondades y herramientas que
ofrece este programa, tales como creacion de secciones transversales a partir de polilıneas,
calculo de area de un polıgono (cuencas hidrologicas), calculos de distancias automaticas
a escalas reales, puntos de referencia en coordenadas UTM y mas. Todo esto es posible
gracias a que PLEDER esta programado en el lenguaje C++ y librerıas ObjectARX,
facilitando de manera directa el enlace con el programa AutoCAD.
Se espera que el trabajo constituya una herramienta util, no solo para profesionales in-
mersos en el area de hidraulica e hidrologıa, sino que tambien se convierta en una ayuda
para los estudiantes interesados en el tema.
1.2. Necesidad o motivacion de la investigacion
Este tema de investigacion, surge con la necesidad de contar con una herramienta de tra-
bajo con multiples opciones, de tal forma que faciliten la elaboracion de diversos proyectos
como es el caso de obras hidraulicas e hidrologicas propios de la Ingenierıa Civil; por otro
lado el interes de ampliar y profundizar mis conocimientos de programacion aplicada,
permitieron hacer una realidad y lograr el producto final como es PLEDER en su primera
version.
xix
1.3. Objetivos de la tesis
1.3. Objetivos de la tesis
1.3.1. Generales
Contribuir con las investigaciones de la ingenierıa hidraulica, desarrollando un pro-
grama que incluya el estudio hidrologico, hidraulico e hidraulica fluvial para de-
terminar los niveles de la superficie libre de agua en cauces naturales. La etapa
hidrologica se desarrolla teniendo en cuenta la programacion desde la generacion
de hietogramas hasta la obtencion de hidrogramas de maximas avenidas. La etapa
hidraulica tiene un acercamiento al modelo HEC 2 (en la actualidad HECRAS), pe-
ro en version nacional de la Escuela de Ingenierıa Civil de la Universidad Nacional
de San Cristobal de Huamanga. Finalmente la etapa de Hidraulica Fluvial, permite
determinar la socavacion general de tal manera que se pueda instalar una estructura
fluvial como gaviones o enrocado de manera eficiente y segura.
1.3.2. Especıficos
El objetivo de la presentacion de la tesis Programa Lluvia Escorrentıa Para Si-
mulacion de Defensas Riberenas con ObjectARX C++, es el de obtener el Tıtulo
Profesional de Ingeniero Civil.
Realizar la programacion en a nivel hidrologico, considerando para ello la transfor-
macion lluvia escorrentıa a traves de los siguientes modelos:
• Generacion de Hietogramas: IILA - SENAMHI - UNI y Hietograma sintetico
del SCS.
• Generacion de Hidrogramas unitarios sinteticos: SCS y Snyder.
• Generacion de Hidrogama de maximas avenidas: Metodo de convolucion dis-
creta
xx
1.4. Organizacion de la tesis
Realizar la programacion a nivel hidraulico considerando para ello la programa-
cion de un metodo adecuado para la simulacion de flujo permanente gradualmente
variado, teniendo en cuenta lo siguiente:
• Programacion del metodo del paso estandar para simulacion de cauces aluviales
en flujo permanente gradualmente variado a traves de n secciones transversales
de un rıo.
• Incorporacion de coeficientes de rugosidad de manning por tramos en la seccion
transversal que permita acercarse mas a una situacion real de transito del flujo
a traves de un rıo.
• Perdidas por contraccion y expansion.
Realizar la programacion a nivel de hidraulica fluvial, que permita obtener la so-
cavacion general en cada una de las secciones transversales naturales de un rio,
considerando para ello los datos del material que lo conforman cada una de las
secciones.
Todos los tres aspectos anteriores seran enlazados de tal manera de contar con una
herramienta de programacion sumamente util que permita disenar en forma segura
y optima una defensa riberena.
1.4. Organizacion de la tesis
El Capıtulo 1, describe en forma general la tesis en introduccion, motivacion de la
investigacion, los objetivos de la tesis y la organizacion de la presente investigacion.
En el Capıtulo 2, se presenta conceptos hidrologicos y diagramas de flujos de la
programacion realizada. Este capıtulo resume los metodo empleados en el progra-
ma, ası como la teorıa necesaria tales como hietogramas IILA, NRCS, hidrogramas
xxi
1.4. Organizacion de la tesis
unitarios sinteticos del NRCS, Snyder y el metodo de convolucion para realizar la
transformacion Lluvia - Escorrentıa.
El Capıtulo 3, enfoca la teorıa basica y esencial de la hidraulica, desde conceptos
basicos necesarios para la interpretacion de los flujos en cauces naturales o rıos, tales
como la ecuacion de movimiento y tipos de flujo. Ası mismo, contiene el analisis de
las secciones transversales en cauces naturales principalmente para calcular tirantes
normales en secciones complejas mediante el metodo de Newton Raphson. Estos
resultados son importantes para la ejecucion del perfil de la superficie libre de agua
(ver capıtulo 4) como condicion de borde, ya sea para flujos subcrıticos (downstream)
o flujos supercrıticos (upstream).
El Capıtulo 4, emprende la teorıa de los modelos numericos y los diagramas de flujo
del componente hidraulico, conteniendo la formulacion de los flujos 1D con propie-
dades hidraulicas compuestas del rıo. Es este capıtulo se discretizan las ecuaciones
no lineales de la superficie libre de agua, indicando el metodo de solucion.
El Capıtulo 5, corresponde a la teorıa del componente hidraulica fluvial y su res-
pectivo diagrama de flujo. Se establecen las ecuaciones de las socavaciones generales
mediante el criterio propuesto por Lischtvan-Lebeviev, teniendo en cuenta los mul-
tiples parametros o datos necesarios para este fin.
El Capıtulo 6, es la aplicacion practica de la herramienta en los tres componentes
mencionados, especificando las distintas funciones para su correcto uso. Se detalla La
aplicacion practica desde el ingreso de los datos, ejecucion del programa y obtencion
de los resultados en los tres componentes.
El Capıtulo 7, abarca las conclusiones que se obtuvieron durante la realizacion
de la presente investigacion, ası mismo las recomendaciones segun las experiencias
adquiridas.
xxii
1.4. Organizacion de la tesis
Bibliografıa, Ofrece una amplia relacion de bibliografıa empleada para la realiza-
cion de la investigacion, en los componentes Hidrologıa, Hidraulica, Metodo Nume-
ricos, Programacion C++, Matematicas Avanzadas, Papers, Journals, Manuales de
Aplicacion y algunos Apuntes de Clase.
Apendice A, presenta el contenido del codigo fuente C++ en el componente Hi-
drologico.
Apendice B, presenta el contenido del codigo fuente C++ en el componente Hi-
draulico.
Apendice C, presenta el contenido del codigo fuente C++ en el componente Hi-
draulica Fluvial.
Apendice D, contiene los resultados de la aplicacion practica del programa.
Apendice E, corresponde a los planos, cartograficos, red topologico, altitudinal,
perfiles longitudinales y los planos planta-perfil del rıo Huallaga.
xxiii
Capıtulo 2
TEORIA HIDROLOGICA Y
DIAGRAMAS DE FLUJO
2.1. Introduccion
En la mayorıa de los proyectos de sistema de recursos hıdricos, tales como analisis o
simulacion de cuenca, prevencion de avenidas, diseno de embalses, aliviaderos, entre otros
muchos, conllevan a sustentar un sistema hidrologico que comprende desde la entrada de
datos tales como precipitaciones y/o caudales de registro en el punto de interes, circulacion
o propagacion de flujos (cuenca, tramo del canal, embalse) y finalmente el caudal de salida,
que es el parametro importante para los disenos de prevencion o simulaciones descritas.
En hidrologıa superficial el objetivo central es la de obtener estos caudales de las corrientes
superficiales, para este fin se emplea varios metodos garantizandonos y/o acercandonos lo
mas real posible.
En este capıtulo se hace referencia los datos necesarios que considera el programa para
transformar la lluvia o precipitaciones netas en caudales (hidrogramas) para distintas
variaciones de tiempo, ası mismo, se detalla mediante diagramas de flujo el procedimiento
xxiv
2.2. Desarrollo de Hietogramas de diseno
o comportamiento que realiza PLEDER en esta transformacion, obteniendo los resultados
en tablas dinamicas que facilitan su exportacion a extensiones tipo excel y resultados
graficos del hidrograma.
2.2. Desarrollo de Hietogramas de diseno
La palabra Hietograma proviene del termino griego Hietos, que significa lluvia. Es un
resumen grafico escalonado de un conjunto de datos, donde nos permite ver pautas que
son difıciles de observar en una simple tabla numerica (expresa precipitacion en funcion
del tiempo). En ordenadas puede figurar la precipitacion caıda (mm), o bien la intensidad
de precipitacion (mm/hora). Generalmente se representa como un histograma (grafico
barras), aunque a veces tambien se expresa como un grafico de lıneas.
Figura 2.1: Hietograma: Intensidad-Tiempo
xxv
2.2. Desarrollo de Hietogramas de diseno
2.2.1. IILA-SENAMHI-UNI
Las precipitaciones maximas e intensidades maximas de tormentas han sido estudiadas
regionalmente por el Instituto Italiano Latino Americano IILA (Convenio Internacional
IILA-SENAMHI-UNI) “Estudio de la Hidrologıa del Peru“ 1983, cuyas formulas son:
para 3 ≤ t ≤ 24 horas:
Pt,T = a (1 +KLogT ) tn (2.2.1)
it,T = a (1 +KLogT ) tn−1 (2.2.2)
para t ≤ 3 horas:
Pt,T = a (1 +KLogT ) (t+ b)n−1 t (2.2.3)
it,T = a (1 +KLogT ) (t+ b)n−1 (2.2.4)
Donde Pt,T , it,T son la precipitacion y la intensidad de tormenta para una duracion t (en
horas) y de periodo de retorno T (en anos) dados; a,K y n son constantes regionales. El
parametro b se clasifica segun las regiones naturales del Peru
Cuadro 2.1: Parametro regional b
Region Parametro bCosta, Centro y Sur 0.50
Sierra 0.40Costa Norte y selva 0.20
El valor 0.40 horas (sierra), fue determinado en base a estudios de pluviografos en las
estaciones de Abancay y Chuquibamba.
2.2.2. Hietogramas sinteticos del NRCS
El Natural Resources Conservation Service del US (NRCS) o conocido antes como (SCS)
Soil Conservation Service, desarrollo hidrogramas sinteticos de tormentas para utilizarse
xxvi
2.2. Desarrollo de Hietogramas de diseno
en los Estados Unidos con duraciones de tormentas de 6 y 24 horas. Estos hietogramas se
dedujeron al utilizar la informacion presentada por Hershfield (1961) y Miller Frederick y
Tracey (1973) y datos de tormentas adicionales (Fuente [11]).
La distribucion de precipitaciones SCS tiene una larga historia y este ha demostrado tener
exito a traves de los anos. Se ha desarrollado cuatro tipos de hietogramas Tipo I, Tipo
IA, Tipo II y finalmente el Tipo III, cuyas distribuciones son para 6 y 24 horas, tambien
se incluye un hietograma de 48 horas para el Tipo II.
Los tipos I y IA corresponde al clima marıtimo del pacıfico con inviernos humedos y
veranos secos, el tipo III representa zonas a lo largo del Golfo de Mexico y de las zonas
costeras del Atlantico, donde las tormentas tropicales a las 24 horas del dıa son grandes
cantidades de precipitacion, y el tipo II representa el resto del paıs (NRCS,1986).
xxvii
2.2. Desarrollo de Hietogramas de diseno
0 2 4 6 8 10 12 14 16 18 20 22 240
0.2
0.4
0.6
0.8
1TORMENTA TIPO IA
0 2 4 6 8 10 12 14 16 18 20 22 240
0.2
0.4
0.6
0.8
1TORMENTA TIPO II
0 2 4 6 8 10 12 14 16 18 20 22 240
0,2
0,4
0,6
0,8
1TORMENTA TIPO III
0 2 4 6 8 10 12 14 16 18 20 22 240
0.2
0.4
0.6
0.8
1TORMENTA TIPO I
Tiempo (horas)
Tiempo (horas) Tiempo (horas)
Tiempo (horas)
Pt/P24 Pt/P24
Pt/P24 Pt/P24
Figura 2.2: Distribucion de tormenta de 24 horas NRCS
En la figura, cada tipo de tormenta se distribuye en 24 horas que permite compararlos, en
particular, en las pendientes de las curva durante intervalos de tiempo determinados nos
indica la intensidad de la precipitacion media de ese intervalo de tiempo. Por ejemplo, la
tormenta del tipo tipo IA es la menos intensa, mientras que el tipo II es la mas intensa.
xxviii
2.3. Tasas de Infiltracion - Metodo del NRCS
0 2 4 6 8 10 12 14 16 18 20 22 240
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Tipo I
Tipo IA
Tipo II
Tipo III
Tiempo (horas)
Pt/P24
Figura 2.3: Distribucion de tormenta de los cuatro tipos NRCS
2.3. Tasas de Infiltracion - Metodo del NRCS
El objetivo de esta seccion es conseguir la precipitacion neta1 o precipitacion efectiva la
que produce escorrentıa directa, por lo tanto, previamente debemos separar, que parte de
la precipitacion total va a generar escorrentıa directa. Ası mismo identificar el resto de la
precipitacion que se ha infiltrado o una pequena parte pudo haberse quedado retenida en
depresiones superficiales.
Para obtener estas precipitaciones, empleamos el metodo del NRCS, cuyo procedimiento
1 Precipitacion Neta: generalmente se utiliza para la precipitacion que produce escorrentıa directa,aunque en otros estudios se refiere a la diferencia precipitacion - evaporacion
xxix
2.3. Tasas de Infiltracion - Metodo del NRCS
se establecio empıricamente USA (1964). Este metodo fue producto de investigacion de
anos, donde participaron numerosos investigadores tales como Mockus 1949, Sherman
1942, Andrews 1954 y Ogrosky 1956. 2.
La ecuacion de la escorrentıa efectiva cuando P > Ia es:
Pe =(P − Ia)2
(P − Ia) + S(2.3.1)
y cuando P ≤ Ia
Pe = 0 (2.3.2)
Donde:
Pe = Profundidad en exceso de precipitacion o escorrentıa directa.
P = Profundidad de precipitacion.
Ia = Abstraccion inicial.
S = Potencial de retencion maxima.
Estas relaciones son basados en la conservacion de masa (Mockus) La escorrentıa directa Pe
es siempre menor o igual a la profundidad de precipitacion P , de manera similar, despues
de que la escorrentıa se inicia, la profundidad adicional del agua retenida en la cuenca
Fa es menor o igual a alguna retencion potencial maxima S. Existe una cierta cantidad
de precipitacion Ia (Abstraccion inicial antes del estrechamiento) en donde no ocurrira
escorrentıa, luego la escorrentıa potencial es P − Ia. La hipotesis del metodo de NRCS,
consiste en que las relaciones de las dos cantidades reales y las dos cantidades potenciales
sean iguales. Mockus determino estas relaciones primero, considerando la condicion en
que la abstraccion inicial Ia = 0 y obtuvo.
2Chapter 10. Estimation of Direct Runoff from Storm Rainfall
xxx
2.3. Tasas de Infiltracion - Metodo del NRCS
FaS
=PeP
(2.3.3)
Donde:
Fa = Retencion actual despues de la escorrentıa dada.
Para satisfacer la conservacion de masa se tiene.
Fa = P − Pe (2.3.4)
Sustituyendo la ecuacion 2.3.4 en 2.3.3 se tiene.
P − PeS
=PeP
(2.3.5)
Despejando Pe
Pe =P 2
P + S(2.3.6)
Este es la relacion precipitacion-escorrentıa bajo la condicion de que la abstraccion inicial
es cero (Ia = 0).
Cuando la abstraccion inicial no es cero, la cantidad de la precipitacion disponible para
la escorrentıa es (P − Ia) en lugar de P . Sustituyendo (P − Ia) para P en la ecuacion
2.3.3 resulta.
FaS
=Pe
P − Ia(2.3.7)
Donde:
xxxi
2.3. Tasas de Infiltracion - Metodo del NRCS
Fa ≤ S y Pe ≤ (P − Ia)
Para este caso la conservacion de masa es dado por:
F = (P − Ia)− Pe (2.3.8)
Sustituyendo la ecuacion 2.3.8 en 2.3.7.
(P − Ia)− PeS
=Pe
P − Ia(2.3.9)
Resolviendo para la profundidad en exceso de precipitacion o escorrentıa directa Pe.
Pe =(P − Ia)2
(P − Ia) + S(2.3.10)
Es la ecuacion basica para estimar la profundidad en exceso de precipitacion o escorren-
tıa directa de una tormenta utilizando el metodo NRCS. La abstraccion inicial consiste
principalmente en intercepcion, infiltracion durante los comienzos de la tormenta, y las
depresiones o almacenamientos en la superficie. Establecen una relacion empırica 1 para
estimar esta abstraccion inicial Ia, que esta en funcion al potencial maximo de retencion
S.
Ia = 0,2S (2.3.11)
Reemplazando en la ecuacion 2.3.10.
Pe =(P − 0,2S)2
P + 0,8S(2.3.12)
1Resultado obtenido al estudiar muchas cuencas experimentales pequenas
xxxii
2.3. Tasas de Infiltracion - Metodo del NRCS
AL presentar en graficas la informacion de P y Pe para muchas cuencas, el NRCS encontro
curvas como las que se muestra en la figura 2.4. Para estandarizar estas curvas, se define un
numero adimensional de curva CN , tal que 0 ≤ CN ≤ 100. Para superficies impermeables
y superficies de agua CN = 100, para superficies naturales CN < 100.
Figura 2.4: Solucion grafica de la ecuacion Pe = (P−0,2S)2
P+0,8S, (Fuente: Chapter 10 Estimation
of Direct Runoff from Storm Rainfall)
El Numero de Curva CN en relacion a S en pulgadas (in).
S =1000
CN− 10 (2.3.13)
El Numero de Curva CN en relacion a S en milımetros (mm).
xxxiii
2.3. Tasas de Infiltracion - Metodo del NRCS
CN =25400
254 + S(2.3.14)
Los numeros de curva que se muestran en la figura 2.4 se aplican para condiciones antece-
dentes de Humedad (AMC, por sus siglas en ingles) normales (AMC II). Para condiciones
secas (AMC I) o condiciones humedas (AMC III), los numeros de curva equivalente pue-
den calcularse por
CN(I) =4,2CN(II)
10− 0,058CN(II)(2.3.15)
CN(III) =23CN(II)
10− 0,13CN(II)(2.3.16)
Cuadro 2.2: Clasificacion de clases antecedentes de humedad (AMC) para el metodo deabstracciones de lluvia del NRCS
Lluvia antecedente total de 5 dıas (pulg)Grupo AMC Estacion Estacion
Inactiva de crecimientoI Menor que 0.5 Menor que 1.4II 0.5 a 1.1 1.4 a 2.1III Sobre 1.1 Sobre 2.1
(Fuente: NRCS, 1972.)
En el cuadro 2.2 se muestra el rango para las condiciones antecedentales de humedad para
cada clase. Los numeros de curva han sido tabulados por el NRCS con base en el tipo de
suelo y uso de la tierra. Se definen cuatro tipos de suelo( ver tabla 2.3). Los valores de
CN para varios tipos de uso de tierra en estos tipos de suelo, se pueden obtener la tabla
5.5.2 Hidrologıa Aplicada Vent Te Chow, Pag. 154.
xxxiv
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Cuadro 2.3: Grupo de suelo hidrologico, para el calculo del CN
GRUPOS DESCRIPCIONGrupo A : Bajo potencial de escurrimiento. Suelos que tienen al-
tas velocidades de infiltracion cuando estan mojados yconsisten principalmente de arena y gravas profundas,con bueno a exceso drenaje. Estos suelos tienen altasvelocidades de transmision del agua.
Grupo B : Suelos con moderada velocidad de infiltracion cuandoestan mojados y consisten principalmente de suelos concantidades moderadas de texturas finas y gruesas, condrenaje medio y algo profundo. Son basicamente suelosarenosos.
Grupo C : Suelos que tienen bajas velocidades de infiltracion cuan-do estan mojados, consisten principalmente de suelosque tienen un estrato que impide el flujo del agua. Sonsuelos con texturas finas (margas arcillosas, margas are-nosas poco profundas). Estos suelos tienen bajas veloci-dades de transmision.
Grupo D : Alto potencial de escurrimiento. Suelos que tienen muybajas velocidades de infiltracion cuando estan mojadosy consisten principalmente de suelos arcillosos con altopotencial de hinchamiento, suelos con nivel freatico ypermanente, suelos con estratos arcillosos cerca de sussuperficie, o bien, suelos someros sobre horizontes im-permeables.
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Sny-
der
2.4.1. Hidrograma Unitario
El Hidrograma Unitario es ampliamente utilizado como algoritmo de solucion para la
transformacion lluvia escorrentıa o lluvia efectiva en caudal. El hidrograma unitarios 1
es el hidrograma de escurrimiento superficial que resulta de una lluvia efectiva en exceso
1Conocido originalmente como grafica unitaria. Fue Propuesto por primera vez por Sherman en 1932.
xxxv
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
unitaria, distribuida uniformemente durante un perıodo de tiempo especificado, en un
punto de un curso de agua.
Este metodo se basa en dos hipotesis:
1. La respuesta de la cuenca ante el proceso de escorrentıa directa presenta un com-
portamiento lineal, empleandose los principios de proporcionalidad y superposicion.
2. No se tiene en cuenta la variabilidad temporal de las caracterısticas de la cuenca,
de manera que una misma lluvia efectiva produce siempre el mismo hidrograma de
escorrentıa directa.
Estas hipotesis presenta las siguientes condiciones:
La lluvia en exceso o lluvia efectiva es de intensidad constante dentro de una duracion
efectiva, exigiendo que las tormentas sean de corta duracion (tiempo base corto y
un caudal pico unico).
La lluvia en exceso esta distribuida de manera uniforme sobre toda el area de dre-
naje. El area de drenaje no debe ser muy grande o bien debera ser subdividida en
subcuencas de modo que se cumpla esta suposicion 2
La duracion del escurrimiento directo (tiempo base del hidrograma unitario) que
resulta del exceso de lluvia de duracion conocida es constante.
El hidrograma unitario de una duracion determinada es unico para una cuenca e
invariante en el tiempo. las caracterısticas del cauce no deben tener cambios y la
cuenca no debe tener almacenamientos apreciables (no debe tener embalses).
2El orden de magnitud del lımite superior que se maneja es de 300 a 400 km2 (Martınez Martın 1994)
xxxvi
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Principios Basicos
La derivacion y aplicacion del Hidrograma Unitario esta basada en una teorıa empırica
que esta conformada por dos teoremas o principios basicos que se aplican en todos los
casos:
Principio de Proporcionalidad: Para una lluvia efectiva de una duracion dada, el
volumen de lluvia, que es igual al volumen de escorrentıa directa, es proporcional a la
intensidad de dicha lluvia. Como los hidrogramas de escorrentıa directa correspondiente
a lluvias efectivas de la misma duracion, tienen el mismo tiempo base, se concluye que las
ordenadas de dichos hidrogramas seran proporcionales a la intensidad de la lluvia efectiva
(figura 2.5).
Figura 2.5: Hidrograma Unitario: Principio de Proporcionalidad
xxxvii
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Pe1Pe2
=ie1ie2
=Qe1
Qe2
= k (2.4.1)
Donde Pe es el volumen de lluvia efectiva, ie la intensidad efectiva y Qe, el caudal de
escorrentıa directa.
Principio de Superposicion: Los caudales de un hidrograma total de escorrentıa direc-
ta producidos por lluvias efectivas sucesivas pueden ser hallados sumando los caudales de
los hidrogramas de escorrentıa directa correspondientes a las lluvias efectivas individuales,
teniendo en cuenta los tiempos en que ocurren tales lluvias.
2.4.2. Hidrograma Unitario Sintetico
Para emplear el metodo del hidrograma unitario es necesario conocer los registros de pre-
cipitacion y tener al menos un hidrograma medido a la salida de la cuenca. Sin embargo
en la mayorıa de las cuencas, especialmente en nuestro paıs, no se cuenta con estaciones
hidrometricas o registros pluviograficos que sirven para generar dicho dato importante en
la utilizacion del metodo hidrograma unitario. Para estos casos, podemos utilizar algunas
formulas empıricas que, basandose en las caracterısticas fısicas de la cuenca (superficie,
pendiente media, longitud del cauce, etc.) proporcionan una idea del hidrograma resultan-
te. Los hidrogramas unitarios obtenidos de esta forma se denominan hidrogramas unitarios
sinteticos.
Hidrograma Unitario Sintetico NRCS
Tambien conocido como el hidrograma adimensional del NRCS, es un hidrograma en el
cual se expresa por la relacion del caudal q con respecto al caudal pico qp y el tiempo por
la relacion del tiempo t con respecto al tiempo de ocurrencia del pico en el hidrograma
unitario, Tp. Para este metodo es necesario conocer el caudal pico y el tiempo de retardo
xxxviii
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
para la duracion de exceso de precipitacion, ası se construye el hidrograma unitario a
partir del hidrograma sintetico adimensional para la cuenca dada.
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 50
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
t/Tp
q/qp
Figura 2.6: Hidrograma Unitario Sintetico del NRCS
La figura 2.6 muestra uno de estos hidrogramas adimensionales, con una forma similar a la
que puede esperarse en una cuenca real. Basandose en una gran cantidad de hidrogramas
unitarios, el NRCS sugiere que el tiempo de recesion puede aproximarse a 1,67Tp. Como
el area del hidrograma es igual a 1cm, se demuestra que:
qp =2,08A
Tp(2.4.2)
Donde qp es el caudal pico [m3/s · cm], A es el area de drenaje [km2] y Tp es el tiempo
pico [h]. Un estudio de muchas cuencas rurales grandes y pequenas indica que el tiempo
de retardo o tambien llamado tlag es igual al 60 % del tiempo de concentracion.
tp = tlag = 0,60Tc (2.4.3)
Bajo esta condicion se obtiene el tiempo de ocurrencia del pico Tp que se expresa en
terminos del tiempo de retardo tp y de la duracion de la lluvia efectiva tr.
xxxix
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Tp =tr2
+ tp (2.4.4)
Hidrograma Unitario Sintetico de Snyder
Snyder (1938), realizo estudios en cuencas de los Montes Apalaches (USA), con areas
de 30 a 30000 km2 y encontro relaciones sinteticas de un hidrograma unitarios sintetico
estandar, como se muestra en la figura 2.7a, a partir de las cuales pueden calcularse las
caracterısticas de un hidrograma unitarios requerido 2.7b.
Figura 2.7: a) Hidrograma Unitario estandar (tp = 5,5tr); b) Hidrograma Unitario reque-rido (tp 6= 5,5tr). Fuente [11]
Para una duracion de lluvia efectiva determinada, los parametros del hidrograma unitario
requerido son:
Retardo de la cuenca, tpR: diferencia de tiempo entre el centroide del hietograma
efectivo y el pico del hidrograma unitario.
Caudal punta o pico por unidad de area de la cuenca, qpR.
Tiempo base, tb.
xl
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Ancho W50 [T] del tiempo unitario al 50 % del caudal pico.
Ancho W75 [T] del tiempo unitario al 75 % del caudal pico.
Snyder definio el hidrograma unitario estandar como aquel que cumple que:
tr =tp5,5
(2.4.5)
donde tr es la duracion de la lluvia efectiva y tp el tiempo de retardo, ambos del hidrograma
unitario estandard. Ademas encontro que para un hidrograma unitario estandar el tiempo
de retardo en horas es:
tp = 0,75Ct(LLc)0,3 (2.4.6)
Donde L es la longitud del cauce principal hasta la divisoria de aguas arriba [km], Lc es
la distancia desde la salida de la cuenca hasta el punto del cauce principal mas cercano al
centroide del area de la cuenca [km] y Ct es un coeficiente que varıa entre 1.35 (pendientes
altas) y 1.65 (pendientes bajas). Tambien para el hidrograma unitario estandar se encontro
que el caudal pico por unidad de area [m3/s · km2] es:
qp =2,75Cptp
(2.4.7)
Una forma de calcular los parametros Ct y Cp, es a partir de los datos: area de cuenca A
[km2], longitud del cauce principal L [km], Longitud hasta el centroide de la cuenca Lc
[km], duracion tR [h], retardo de la cuenca tpR [h] y Qp [m3/s/cm], donde:
Si tpR = 5,5tR
tR = tr
tpR = tP
qpR = qp
(2.4.8)
xli
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Si tpR 6= 5,5tR
tp = tpR + tr−tR
4, con tr =
tpR−0,25tR5,25
tpR = tP
qpR = qp
(2.4.9)
Para ambos casos Ct y Cp son calculados mediante las ecuaciones 2.4.6 y 2.4.7.
El programa PLEDER, emplea ecuaciones para cada intervalo de tiempo, segun la figura
2.8, cuyo hidrograma se divide en 6 intervalos (siete vertices).
Figura 2.8: PLEDER: Coordenadas del Hidrograma Unitario Sintetico Snyder
xlii
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder
Calculo de las ecuaciones lineales para cada tramo del hidrograma unitario
sintetico Snyder
PLEDER, evalua para cada tramo mediante la ecuacion de la recta Y − Y1 = m(X −X1)
en el hidrograma dado.
Tramo AB: 0 ≤ T ≤ tR2
+ tpR − 13W50
Q =0,5QpR
tR2
+ tpR − 13W50
T (2.4.10)
Tramo BC: tR2
+ tpR − 13W50 < T ≤ tR
2+ tpR − 1
3W75
Q = 0,5QpR +3QpR
4(W50 −W75)
(T − tR
2− tpR +
1
3W50
)(2.4.11)
Tramo CD: tR2
+ tpR − 13W75 < T ≤ tR
2+ tpR
Q = 0,75QpR +3QpR
4W75
(T − tR
2− tpR +
1
3W75
)(2.4.12)
Tramo DE: tR2
+ tpR < T ≤ tR2
+ tpR + 23W75
Q = QpR −3QpR
8W75
(T − tR
2− tpR
)(2.4.13)
Tramo EF: tR2
+ tpR + 23W75 < T ≤ tR
2+ tpR + 2
3W50
Q = 0,75QpR −3QpR
8(W50 −W75)
(T − tR
2− tpR −
2
3W75
)(2.4.14)
Tramo FG: tR2
+ tpR + 23W50 < T ≤ tb
xliii
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
Q = 0,50QpR −0,5QpR
tb − tR2− tpR − 2
3W50
(T − tR
2− tpR −
2
3W50
)(2.4.15)
Donde: T , es el tiempo que se distribuye a lo ancho del tiempo base tb con un intervalo
fijo en horas.
Q, es la ordenada del hidrograma unitarios sintetico.
2.5. Metodo de Convolucion discreta para transfor-
macion precipitacion-escorrentıa
Antes de demostrar la ecuacion de la convolucion, es necesario conocer la circulacion hi-
drologica del flujo o tambien conocida como Circulacion de flujos a traves de sistemas
globales. Este se refiere a que el agua almacenada en sistema hidrologico S, puede relacio-
narse a los caudales de entrada I y de salida Q, mediante la ecuacion de continuidad.
dS
dt= I −Q (2.5.1)
El almacenamiento S, en cualquier instante, puede expresarse por una funcion de al-
macenamiento (CHOW and VENT T [11]) , donde S varıa en ascenso y/o descen-
so con el tiempo en la respuesta a I y Q y a sus variaciones con respecto al tiempo
dI/dt, d2I/dt2, ...dQ/dt, d2Q/dt2, ....
S = f
(I,dI
dt,d2I
dt2, ...Q,
dQ
dt,d2Q
dt2
)(2.5.2)
xliv
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
Figura 2.9: Sistema hidrologico: continuidad de agua almacenada.
2.5.1. Sistema Lineal en el tiempo continuo
La funcion de almacenamiento, ecuacion 2.5.2, puede expresarse por la ecuacion diferencial
lineal con coeficientes constantes
S = a1I + a2dI
dt+ a3
d2I
dt2+ ...+ an
dn−1I
dtn−1+ b1Q+ b2
dQ
dt+ b3
d2Q
dt2+ ...+ bm
dm−1Q
dtm−1(2.5.3)
Donde a1, a2, ...an, b1, b2, ...bm, son constantes y las derivadas de orden superior se despre-
cian.
Diferenciando esta ecuacion 2.5.3 y reemplazando en la ecuacion de continuidad 2.5.1.
andnI
dtn+ ...+ an−1
dn−1I
dtn−1+ ...+ a2
d2I
dt2+ a1
dI
dt− I+
bmdmQ
dtm+ ...+ bm−1
dm−1Q
dtm−1+ ...+ b2
d2Q
dt2+ b1
dQ
dt+Q = 0
(2.5.4)
simplificando terminos en las operaciones diferenciales se tiene.
N(D) = andn
dtn+ ...+ an−1
dn−1
dtn−1+ ...+ a2
d2
dt2+ a1
d
dt− 1
xlv
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
y
M(D) = −bmdm
dtm− ...− bm−1
dm−1
dtm−1− ...− b2
d2
dt2− b1
d
dt− 1
por lo tanto la ecuacion 2.5.4 en forma compacta es.
N(D)I −M(D)Q = 0 (2.5.5)
Resolviendo queda.
Q(t) =N(D)
M(D)I(t) (2.5.6)
La relacion N(D)/M(D) es llamado funcion de transferencia del sistema, que describe la
respuesta de la salida a una secuencia de entrada dada (CHOW and VENT T [11]), ası
mismo la ecuacion 2.5.4, representa el modelo general del sistema hidrologico. 1
2.5.2. Sistema Lineal en tiempo discreto
En Las aplicaciones practicas, las salidas de los resultados se requieren en intervalos tiempo
discretos 2, ya que la entrada al sistema se especifica como una funcion de tiempo discreto,
por ejemplo, un hietograma de lluvia efectiva que se dan en intervalos de tiempos ∆t; Es
decir, los datos de la lluvia se dan como un conjunto de datos pulso (sistema de informacion
por pulso). Este sistema se utiliza para la precipitacion y el valor de su funcion de entrada
discreta para el m-esimo intervalo de tiempo es:
Pm =
∫ m∆t
(m−1)∆t
I(τ)dt , m = 1, 2, 3, ... (2.5.7)
1Presentada por Chow y Kulandaiswamy2Debido a que la mayor parte de la informacion hidrologica solamente esta disponible en intervalos de
tiempo discretos.
xlvi
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
Pm es la profundidad de la precipitacion que cae durante el intervalo de tiempo [L]. El
valor de la salida del sistema en el n-esimo intervalo de tiempo (t = n∆t) es:
Qn = Q(n∆t) , n = 1, 2, 3, ... (2.5.8)
Qn es el valor instantaneo de la tasa de flujo al final de n-esimo intervalo de tiempo
[L3T−1]. El efecto de un pulso de entrada de duracion ∆t que empieza en el tiempo
(m− 1)∆t sobre la salida en el tiempo t = n∆t, se mide utilizando el valor de la funcion
de respuesta de pulso unitario h[t− (m−1)∆t] = h[n∆t− (m−1)∆t] = h[(n−m+1)∆t].
h[(n−m+ 1)∆t] =1
∆t
∫ (n−m+1)∆t
(n−m)∆t
u(l)dl (2.5.9)
Para el pulso m
I(τ) =Pm∆t
, (m− 1)∆t ≤ τ ≤ m∆t
I(τ) = 0 , τ > M∆t
De la integral de convolucion y separando la integral
Qn =
∫ n∆t
0
I(τ)u(n∆t− τ)dτ
=P1
∆t
∫ ∆t
0
u(n∆t− τ)dτ +P2
∆t
∫ 2∆t
∆t
u(n∆t− τ)dτ + ...
=Pm∆t
∫ m∆t
(m−1)∆
u(n∆− τ)dτ + ...+PM∆t
∫ M∆t
(M−1)∆t
u(n∆t− τ)dτ
(2.5.10)
Realizando la sustitucion de l = n∆t − τ luego dτ = −dl. La m-esima integral en la
ecuacion 2.5.10 se escribe como
xlvii
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
Pm∆t
∫ m∆t
(m−1)∆t
u(n∆t− τ)dτ =Pm∆t
∫ (n−m)∆t
(n−m+1)∆t
−u(l)dl
=Pm∆t
∫ (n−m+1)∆t
(n−m)∆
u(l)dl
= Pmh[(n−m+ 1)∆t]
(2.5.11)
Reemplazando de la ecuacion 2.5.8 y 2.5.10 se obtiene
Qn = P1h[(n∆t)] +P2h[(n−1)∆t] +Pmh[(n−m+ 1)∆t] +PMh[(n−M + 1)∆t] (2.5.12)
Esta representa la ecuacion de convolucion con entrada Pm en pulsos y salida Qn como
una funcion temporal de informacion por muestra.
2.5.3. Funcion respuesta de pulso discreto y Ecuacion de Con-
volucion Discreta
La funcion de datos instantaneos de la salida o respuesta a un pulso de volumen unitario
viene expresado por:
Un−m+1 = h[(n−m+ 1)∆t] (2.5.13)
Se entiende que Un = h[n∆t], Un−1 = h[(n−1)∆t]... y Un−M+1 = h[(n−M+1)∆t]. Reem-
plazando en la ecuacion 2.5.12 la version en tiempo discreto de la integral de convolucion
es:
xlviii
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrentıa
Qn = P1Un + P2Un−1 + ...+ PmUn−m+1 + ..+ PMUn−M+1 =M∑m=1
PmUn−m+1 (2.5.14)
Donde M es el numero de pulsos de intensidad constante, de la funcion de entrada, es
decir, el numero de datos de pulso del hietograma. El resultado final es la ecuacion de
convolucion discreta para un sistema lineal.
Qn =
n≤M∑m=1
PmUn−m+1 (2.5.15)
Donde Qn es el caudal de escorrentıa directa en el instante n ;Pm la precipitacion efectiva
del bloque m y Un+m+1 los caudales por unidad de precipitacion efectiva del hidrograma
unitario. El lımite superior n ≤ M indica que los terminos han de sumarse para m =
1, 2, 3, ...n, siempre que n > M y estando limitada la suma a m = 1, 2, 3, ...M , cuando
n > M .
La misma expresion 2.5.15 se puede expresar de la forma siguiente:
Qn =
min(n,M)∑m=max(1,n−nU+1)
PmUn−m+1 (2.5.16)
Esta ecuacion facilita la solucion numerica, ası mismo cabe senalar que dicha ecuacion
es generalizada para resolver problemas que involucren el metodo de convolucion, por
ejemplo, Matlab contiene el algoritmo (conv.m) para la convolucion discreta, el cual usa
la ecuacion 2.5.16. El programa PLEDER, emplea el mismo algoritmo, mediante la clase
convolucion, con el objetivo de resolver la transformacion lluvia escorrentıa mediante esta
ecuacion.
xlix
2.6. Diagramas de Flujo
2.6. Diagramas de Flujo
A continuacion se presenta la esquematizacion grafica que corresponde a la programacion
hidrologica.
Diagrama de flujo General: Muestra la organizacion del programa en forma
general. El objetivo de este diagrama es obtener los caudales totales (transformacion
lluvia escorrentıa), a partir de los datos de precipitaciones y datos de la cuenca.
Diagrama de flujo Hietograma IILA SENAMHI: El objetivo es calcular las
precipitaciones alternas (mm) a partir de los datos regionales, empleando el metodo
del bloque alterno.
Diagrama de flujo Hietograma NRCS: Recibe como datos, la precipitacion
maxima de 24 horas (obtenidas ya sea mediante analisis de frecuencias) y el tipo de
tormenta (Tipo I, IA, II, III); realizando una multiplicacion directa con las ordenadas
de la tormenta, se obtienen las precipitaciones incrementales (mm).
Diagrama de flujo Hidrograma Unitario Sintetico NRCS: El objetivo es cal-
cular las ordenas del hidrograma unitario, tomando los datos del tiempo de retraso
(tlag) y las variaciones de los tiempos (hietograma - hidrograma); realizando inter-
polaciones lineales para cada intervalo o variacion de tiempo del hidrograma, donde
se obtienen las ordenadas del hidrograma Unitario Sintetico.
Diagrama de flujo Hidrograma Unitario Sintetico Snyder: Es el mismo ob-
jetivo que el anterior, recibiendo los datos de los coeficientes tp, Cp, variacion del
tiempo y el area de la cuenca para calcular las siete coordenadas (A, B, C, D, E, F y
G de la figura 2.8) del hidrograma unitario, ası obtener las ordenadas del hidrograma
unitarios sintetico mediante interpolaciones lineales para cada intervalo o variacion
del tiempo a lo largo del tiempo base (tb).
l
2.6. Diagramas de Flujo
Diagrama de flujo Abstracciones NRCS: EL programa PLEDER separa la pre-
cipitacion total de las infiltraciones o retenciones dadas, segun el metodo NRCS, que
depende directamente como dato de valor Curva Numero, este factor es dependiente
del las caracterısticas de la cuenca, tal como se explica en este capıtulo. Bajo este
dato se obtienen las precipitaciones directas o en exceso que tambien se les llama
pulsos de ingreso.
Diagrama de flujo Convolucion discreta: Transforma la lluvia en escorrentıa
directa, a partir de las ordenadas del hidrograma unitarios (U) y los pulsos de ingreso
(P).
li
2.6. Diagramas de Flujo
V
F
Hietogram
a IILA
SENAMHI
Hietogram
a NRC
S
Parámetros region
ales a, b, k,
n,Δt, t, período
de retorno tr.
INICIO PLEDER
HIDRO
LOGIA
T ≤ 3 ho
ras
Ecuación
2.2.3. C
álculo de
precipita
cion
es acumuladas,
increm
entales y alternas.
Ecuación
2.2.1. C
álculo de
precipita
cion
es acumuladas,
increm
entales y alternas.
Expo
rtar a .csv
Precipita
cion
es m
áxim
as de 24
ho
ras (P24), Tipo de
torm
enta.
Tipo
de To
rmen
ta
Tipo
I Tipo IA Tipo
II TipoIII
Precipita
cion
es acumuladas, incremen
tales
Expo
rtar a .csv
Cálculo Lluvia
Escorren
tía.
Cálculo de
Pulsos o
escorren
tía directa.
Cálculo de
hidrogram
as
Unitarios Sintéticos
Mod
elos M
eteo
rológicos.
Torm
enta NRC
S IILA SEN
AMHI
Precipita
cion
es m
áxim
as de 24
ho
ras (P24), Tipo de
torm
enta.
Parámetros region
ales a, b, k,
n,Δt, t, período
de retornotr.
Abstraccion
es m
ediante
el m
étod
o NRC
S
Pulsos (P
) ó
escorren
tía directa
Pí
,
á,
U
Convolución Discreta
Caud
ales (m
³/s)
FIN PLEDER
HIDRO
LOGIA
Hidrogram
a Unitario
Sintético
H.U.S. NRC
S H
.U.S. SNYD
ER
Tiem
po de
retardo (Tlag)
Tiem
po de retardo
Coeficiente Cp
Orden
adas del Hidrogram
a Unitario (U)
lii
2.6. Diagramas de Flujo
INICIO HIETOGRAMA IILA SENAMHI
N, a, b, k, n, dt, Var, Tr, D
i = 1, hasta N, i = i+1
3
1 1
i = 1, hasta N,i = i+1
/2
1 2
2
Precipitaciones
Alternas (mm)
FIN HIETOGRAMA IILA SENAMHI
V F
V F
liii
2.6. Diagramas de Flujo
INICIO HIETOGRAMA NRCS
P24, Ndt, Tormenta
24/60
24
Precipitaciones
Incrementales (mm)
FIN HIETOGRAMA NRCS
i = 0, hasta N+1, i = i+1
1 24 11 1
Datos hidrológicos, Tormenta NRCS
liv
2.6. Diagramas de Flujo
INICIO HIDROGRAMA UNITARIO
SINTÉTICO NRCS
Tlag, DT, dt
2
12.48
Datos Hidrograma Unitario
adimensional NRCS
i = 1, hasta nU, i = i+1
ó nU, q, t, DT x i
Ordenadas del
Hidrograma Unitario
FIN HIDROGRAMA UNITARIO
SINTÉTICO NRCS
lv
2.6. Diagramas de Flujo
INICIO HIDROGRAMA UNITARIO
SINTÉTICO SNYDER
, , , ,
4
2.75
2.14 .
1.22 .
i = 1, hasta nU, i = i+1
/60, , , , ,
Ordenadas del
Hidrograma Unitario
FIN HIDROGRAMA UNITARIO
SINTÉTICO NRCS
lvi
2.6. Diagramas de Flujo
V F
V F
INICIO ABSTRACCIONES NRCS
FIN ABSTRACCIONES NRCS
Palterna , CN, nP
25400 254
0.2
i= 1, hasta nP,i = i+1
1 alterna
Pacum i
i
0.0
1
)
Precipitación en
Exceso (mm)
lvii
2.6. Diagramas de Flujo
INICIO CONVOLUCIÓN DISCRETA
Ordenadas Hidrograma
Unitario [U], Pulsos [P], nP, nU
M = nP nQ = M+nU‐1
A = máx(1,n‐nU+1) B = mín(n, M)
Caudales (m³/s)
FIN CONVOLUCIÓN DISCRETA
n = 1, hasta nQ, n = n+1
m = A, hasta B, m = m+1
P m xU n m 1
0.0
lviii
Capıtulo 3
TEORIA HIDRAULICA Y
SECCIONES TRANSVERSALES
EN RIOS
3.1. Introduccion
Para conocer el comportamiento del flujo en cauces naturales o simplemente en canales
con secciones conocidas, es necesario contar con la teorıa basica de la hidraulica y las
leyes fısicas que gobiernan su comportamiento. De las ecuaciones basicas y los principios
fısicos de movimiento de fluidos, se aplican a la solucion del flujo gradualmente variado,
obteniendo como resultados los niveles o tirantes a lo largo del cauce. Tambien es nece-
sario contar con metodologıas para calcular el area y el perımetro mojado en una seccion
transversal. El proposito de esta seccion es revisar las definiciones basicas, principios y
leyes con la intencion de aplicarlos en los capıtulos posteriores al estudio de transito de
flujos en rıos.
lix
3.2. Bases teoricos para el calculo de flujo unidimensional
3.2. Bases teoricos para el calculo de flujo unidimen-
sional
Se entiende por flujo unidimensional cuando se ignora las variaciones de los cambios en la
velocidad y la presion en el sentido perpendicular a la direccion principal del flujo. Para
su solucion numerica se tiene como base fundamental los tres principios derivados de la
fısica:
Conservacion de la Masa.
Conservacion de la Energıa.
Impulso-Cantidad de Movimiento: Conservacion del Momentum
3.2.1. Ecuacion de Movimiento General.
Es importante mencionar las ecuaciones que provocan el movimiento de una masa ele-
mental, para caso nuestro la masa elemental es el fluido. De la segunda ley de Newton se
sabe que la fuerza es igual a la masa por la aceleracion (resultado vectorial):
F = ma (3.2.1)
Multiplicando ambos miembros por la componente longitud ’s’ paralela a la direccion
de la fuerza y la aceleracion, e integrando estas expresiones se tiene como resultado la
Ecuacion de Energıa (expresion escalar):
∫ s2
s1
Fds = m
∫ s2
s1
ads =1
2m(v2
2 − v21) (3.2.2)
lx
3.2. Bases teoricos para el calculo de flujo unidimensional
De la misma forma multiplicando ambos miembros por el factor tiempo a la ecuacion
(3.2.1), e integrando se tiene la Ecuacion de Momentum.
∫ t2
t1
Fdt = m
∫ t2
t1
adt =1
2m(v2 − v1) (3.2.3)
Esta ultima expresion muestra que el impulso (fuerza por tiempo) aplicado a un cuerpo
es igual al momentum (masa por velocidad).
Estos enfoques son importantes en las aplicaciones para el movimiento de los flujos (Ecua-
cion de la Energıa, Ecuacion de Momentum).
3.2.2. Ecuacion de Movimiento del flujo.
Considerando un fluido elemental a lo largo de una lınea de corriente, donde la longitud de
este cuerpo es ∆S, normal a la lınea de corriente es ∆n y el espesor unitario (perpendicular
al plano del papel). Para analizar el movimiento del flujo se considera que el flujo es No
viscoso, por lo que no se presentan fuerzas de resistencia en el fluido.
Figura 3.1: Fuerza Actuante en un Fluido
lxi
3.2. Bases teoricos para el calculo de flujo unidimensional
Si p es igual a la intensidad de la presion en la seccion 1, entonces la presion en la seccion
2 es p+ (∂p∂s
)∆s. Ası mismo la Fuerza actuante en cara aguas arriba es:
p∆n (3.2.4)
y la fuerza que actua en la cara aguas abajo es:
(p+∂p
∂s∆s)∆n (3.2.5)
El peso del fluido es:
ρg∆s∆n (3.2.6)
La componente de este peso en la direccion ′s′ es
ρg∆s∆nsin(θ) (3.2.7)
De la figura (3.1) se deduce que sen(θ) = −∂Z∂s
, donde Z es la cota superior medido a
partir del datum (positivo hacia arriba). Por lo tanto la Fuerza Resultante que actua en
el elemento en la direccion aguas abajo es:
Fr = p∆n− (p+∂p
∂s∆s)∆n− ρg∆s∆n
∂Z
∂s(3.2.8)
Simplificando la ecuacion se tiene:
Fr = −∂p∂s
∆s∆n− ρg∆s∆n∂Z
∂s(3.2.9)
Aplicando la segunda ley de movimiento, la fuerza resultante es igual a la masa del fluido
lxii
3.2. Bases teoricos para el calculo de flujo unidimensional
por una aceleracion as
ρ∆s∆nas = −∂P∂s
∆s− ρg∆s∆n∂Z
∂s(3.2.10)
Simplificando
ρas = −∂p∂s− ρg∂Z
∂s=
∂
∂s(p+ γZ) (3.2.11)
la aceleracion as es fundamental en el flujo ya que aparece al aplicar la segunda ley de
Newton a un sistema fluido infinitesimal. Por lo tanto se necesita calcular la derivada del
vector velocidad con respecto al tiempo.
as =dVsdt
=∂Vs∂t
+∂Vs∂s
ds
dt=∂Vs∂t︸︷︷︸Local
+ Vs∂Vs∂s︸ ︷︷ ︸
Convectiva
(3.2.12)
El termino ∂Vs∂t
se denomina aceleracion local y se anula cuando el flujo es Permanente
o Estacionario, es decir, independiente del tiempo. El termino siguiente forma la acele-
racion convectiva, que aparece cuando la partıcula se mueve a traves de regiones donde
la velocidad varıa.
Sustituyendo las ecuacion 3.2.12 en la ecuacion 3.2.11 se tiene:
ρ(∂Vs∂t
+ Vs∂Vs∂s
) +∂
∂s(p+ γZ) = 0 (3.2.13)
La ecuacion 3.2.13, es la conocida ecuacion propuesta en el siglo XVIII, por el matematico
suizo Leonardo Euler y reconocida universalmente como la ecuacion de Euler. En la tesis
esta ecuacion se simplifica la aceleracion local, debido a que el analisis es para flujos
Permanentes.
lxiii
3.2. Bases teoricos para el calculo de flujo unidimensional
3.2.3. Flujo Permanente.
Los flujos permanentes ocurren cuando las aceleraciones locales, son cero, esto es, si ∂Vs∂t
es cero, por lo que en un punto no se tienen cambios en el tiempo, aunque la velocidad
puede variar de un punto a otro, si la velocidad cambia en un punto, el flujo se conoce
como transitorio. Por lo tanto la ecuacion 3.2.13 se reduce una funcion que solo depende
de s, entonces las derivadas parciales se pueden expresar como derivadas ordinarias.
ρVsdVsds
+d
ds(p+ γZ) = 0 (3.2.14)
Multiplicando por el factor ds a toda la expresion e integrando se tiene:
1
2ρV 2
s + p+ γZ = Constante (3.2.15)
Dividiendo entre γ
Z +p
γ+V 2s
2g= H = Constante (3.2.16)
Es una de las formas alternativas de la ecuacion de Bernoulli. Esta ecuacion puede aplicar-
se a lo largo de una lınea de corriente, en un fluido ideal sin rozamiento, pero la aplicacion
de la misma en otra direccion exige que el fluido sea irrotacional. 1
3.2.4. Flujo Uniforme.
En una superficie libre se presenta el flujo uniforme, cuando en sus diferentes secciones,
las caracterısticas de circulacion, velocidad, distribucion de presiones, profundidad de
circulacion, etc son iguales. En los cauces naturales, que corresponde a la aplicacion de
esta tesis, en algunos casos puede considerarse la existencia del regimen uniforme en
1 Flujo Irrotacional: Se da cuando la vorticidad resulta cero, la velocidad debe de ser igual a lagradiente de un escalar, φ, conocido como potencial de velocidad: ∇x(∇φ) = 0
lxiv
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.
ciertos tramos donde se ha alcanzado un equilibrio en la seccion transversal y esta es
sensiblemente constante en una zona recta y sin obstaculos, lo cual posibilita el estudio
de estas conducciones con resultados satisfactorios.
En el flujo uniforme, la aceleracion local y convectiva son cero, por lo tanto, la ecuacion
3.2.13 se reduce.
d
ds(p+ γZ) = 0 (3.2.17)
Integrando se tiene.
p
γ+ Z = Constante (3.2.18)
Esta ecuacion representa a la distribucion de la Presion Hidrostatica, donde el termino
Pγ
+ Z, es la altura piezometrica (piezometric head).
En resumen, el flujo Uniforme ocurre cuando:
EL Tirante, el area hidraulica y la velocidad en cada secciones transversal, son
constantes.
La lınea de gradiente de energıa, la superficie del agua, y el fondo o terreno ( plantilla
del canal), son todos paralelos: esto es Sf = Sw = S0, donde Sf = pendiente de la
lınea de energıa, Sw = Pendiente de la superficie del agua, y S0 = pendiente del
fondo o plantilla del canal.
3.3. Secciones Transversales en Cauces Naturales y
Calculo Numerico.
El estudio de las propiedades de las secciones transversales en cauces naturales tiene
singular importancia ya que dicha seccion es la que define muchas de las caracterısticas
de la conduccion. Estas secciones representan la geometrıa del cauce que estan formados
lxv
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.
por una serie de puntos o coordenadas (X ,Y), cuyos valores de X forman la longitud de la
seccion transversal y los valor de Y las alturas con respecto a un DATUM. En principio,
las formas de estas secciones pueden variar a lo largo del canal (canal no prismatico).
Figura 3.2: Seccion Transversal en Cauces Naturales
El programa PLEDER, divide las secciones transversales en tres partes (i, j, k), donde ”i”
representa las caracterısticas geometricas de la seccion margen izquierda, ”j” los trapecios
conformados por los puntos sucesivos con el lımite de la superficie libre de agua o cota
tirante, finalmente ”k” representa la geometrıa de las seccion en la margen derecha.
Figura 3.3: Elementos geometricos de las Secciones Transversales en: i, j, k
lxvi
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.
En una seccion transversal natural de los cauces, es importantes representar de esta mane-
ra, ya que simplifica las operaciones matematicas para obtener los resultados geometricos
de cada seccion transversal que mas adelante se presenta. En la figura anterior se mues-
tra que, en los extremos se forman triangulos (i, k), esto ocurre cuando existe un angulo
entre la lınea del terreno (plantilla del canal) y la superficie libre. En la parte central se
forman trapecios, cuya area hidraulica y perımetro hidraulico se obtienen despues de una
sumatoria en cada una de ellas.
Las formulas para cada elemento geometricos de la figura son.
Analizando en el Triangulo Izquierdo (A,P):
A = Ai =1
2
[(Y − Yi+1)2
(Xi+1 −Xi
Yi − Yi+1
)](3.3.1)
P = Pi =
√(Y − Yi+1)2 +
[(Y − Yi+1)(Xi+1 −Xi)
Yi − Yi+1
]2
(3.3.2)
Analisis de los Trapecios (A,P):
A =∑
Aj =∑ 1
2[(Y − Yj) + (Y − Yj+1)] (Xj+1 −Xj) (3.3.3)
P =∑
Pj =∑√
(Xj+1 −Xj)2 + (Yj+1 − Yj)2 (3.3.4)
Analisis del Triangulo Derecho(A,P):
A = Ak =1
2
[(Y − Yk)2
(Xk+1 −Xk
Yk+1 − Yk
)](3.3.5)
lxvii
3.4. Calculo del Tirante Normal
P = Pk =
√(Y − Yk)2 +
[(Y − Yk)(Xk+1 −Xk)
Yk+1 − Yk
]2
(3.3.6)
3.4. Calculo del Tirante Normal
Para el analisis y diseno de canales abiertos es necesario conocer el Tirante Normal, que
forma parte de las caracterısticas hidraulicas de un canal. En la mayorıa de los textos
exponen los calculos numericos solo para canales con secciones transversales conocidos
tales como rectangulares, triangulares, trapezoidales, parabolicos y otros que derivan a
ecuaciones lineales en la solucion del tirante normal, entonces, para el analisis en cauces
naturales aproximan a estas secciones mencionadas perdiendo precision y garantıa en
la obtencion de sus resultados. La mejor forma de representar es a traves de los puntos
coordenados, ası se puede generalizar estas secciones transversales obteniendose resultados
mas precisos y mas compactos. Parte del objetivo de esta tesis es tratar en lo posible de
generalizar las ecuaciones, en tal forma que sus resultados cumplan para todo tipo de
secciones transversales (desde los mas comunes hasta las mas complejas).
3.4.1. Calculo Numerico
Para la solucion del tirante normal se tomara en cuenta las ecuaciones de Manning Stric-
kler, Chezy (Antoine de Chezy) y Darcy-Weisbach.
v =R2/3S
1/2f
n(3.4.1)
v = C√RSf (3.4.2)
lxviii
3.4. Calculo del Tirante Normal
v = −(32gRSf )1/2log
[ks
14,8R+
1,255υ
R(32gRSf )1/2
](3.4.3)
Estas tres ecuaciones presentan ecuaciones no lineales, que para su solucion en cauces
naturales requieren de metodos numericos avanzados. Existen varios metodos para resolver
ecuaciones no lineales, tales como el Metodo de Biseccion, Metodo de Aproximaciones
Sucesivas, Metodo de Newton Raphson, entre otros mas y menos eficientes. En esta tesis
usamos el Metodo de Newton Raphson, cuya sintaxis es la siguiente.
F (y) = 0 (3.4.4)
y = Y + ∆Y (3.4.5)
∆Y = − F (y)
F ′(y)(3.4.6)
El proposito en esta seccion es ampliar la aplicacion del metodo de Newton-Raphson
aplicado a las ecuaciones anteriores. Donde F (y) es la funcion principal cuya variable
dependiente es el valor de ”y” (Para este caso Tirante Normal) y F′(y) es la primera
derivada de la funcion principal. Este metodo es iterativo hasta que el valor de (3.4.6)
tienda a cero o que se evalue a un error permisible que el usuarios asigna como conveniente.
Manning Strickler
La Ecuacion de Manning Strickler representado en funcion al caudal viene a ser:
Q =A5/3P−2/3S1/2
n(3.4.7)
lxix
3.4. Calculo del Tirante Normal
Despejando las variables constantes, para formar la Funcion principal.
F (Y ) = A5/3P−2/3 − nQ√S︸︷︷︸
Constante
= 0 (3.4.8)
Derivando la funcion F(Y) con respecto a “Y” ( dFdY
)se tiene:
dF
dY=
d
dy
(A5/3P−2/3 − nQ√
S
)=
5
3P−2/3A2/3
(dA
dY
)− 2
3A5/3P−5/3
(dP
dY
)(3.4.9)
En la seccion transversal, el Area Total es:
A = Ai +∑
Aj + Ak (3.4.10)
Cuya derivada del Area Total en funcion del tirante ”Y”.
(dA
dY
)=
(dAidY
)+
(d
dY
∑Aj
)+
(dAkdY
)(3.4.11)
Calculo de(dAi
dY
)
(dAidY
)=
d
dY
(1
2
[(Y − Yi+1)2
(Xi+1 −Xi
Yi − Yi+1
)])=
1
���2
[���2 (Y − Yi+1)
(Xi+1 −Xi
Yi − Yi+1
)]=
[(Y − Yi+1)
(Xi+1 −Xi
Yi − Yi+1
)] (3.4.12)
Es muy importante simplificar expresiones al mınimo, de esta forma se logra opti-
mizar el tiempo de ejecucion (runtime). Por lo tanto, la ecuacion anterior se puede
lxx
3.4. Calculo del Tirante Normal
representar en funcion al area del triangulo izquierdo (Ai), este se obtendra divi-
diendo la expresion (3.4.12)con (3.3.1).
(dAi
dY
)Ai
=(Y − Yi+1)
(Xi+1−Xi
Yi−Yi+1
)12
(Y − Yi+1)2(Xi+1−Xi
Yi−Yi+1
) =2���
����:
(Yi − Yi+1)������
�:(Y − Yi+1)���
����:
(Xi+1 −Xi)
(Y − Yi+1)���1
2
������
�:(Xi+1 −Xi)���
����:
(Yi − Yi+1)
(dAidY
)=
2Ai(Y − Yi+1)
(3.4.13)
Calculo de(ddY
∑Aj)
(d
dY
∑Aj
)=
d
dY
(∑ 1
2[(Y − Yj) + (Y − Yj+1)] (Xj+1 −Xj)
)
(d
dY
∑Aj
)=∑
(Xj+1 −Xj) (3.4.14)
Calculo de(dAk
dY
)(dAkdY
)=
d
dY
1
2
[(Y − Yk)2
(Xk+1 −Xk
Yk+1 − Yk
)]=
1
���2
[���2 (Y − Yk)
(Xk+1 −Xk
Yk+1 − Yk
)]=
[(Y − Yk)
(Xk+1 −Xk
Yk+1 − Yk
)] (3.4.15)
Para simplificar dividimos (3.4.15) entre (3.3.5).
(dAk
dY
)Ak
=(Y − Yk)
(Xk+1−Xk
Yk+1−Yk
)12
(Y − Yk)2(Xk+1−Xk
Yk+1−Yk
) =2���
����:
(Yk+1 − Yk)������:
(Y − Yk)�������
�:(Xk+1 −Xk)
(Y − Yk)���1
2
������
��:(Xk+1 −Xk)���
����:
(Yk+1 − Yk)(3.4.16)
lxxi
3.4. Calculo del Tirante Normal
(dAkdY
)=
2Ak(Y − Yk)
(3.4.17)
Reemplazando en la ecuacion (3.4.11) se obtendra la derivada del Area total:
(dA
dY
)=
2Ai(Y − Yi+1)
+∑
(Xj+1 −Xj) +2Ak
(Y − Yk)(3.4.18)
De la misma forma calculamos la derivada del Perımetro mojando con respecto al tirante
“Y” ( dPdY
)
(dP
dY
)=
(dPidY
)+��
���
���*
0(d
dY
∑Pj
)+
(dPkdY
)
(dP
dY
)=
(dPidY
)+
(dPkdY
)(3.4.19)
Calculo de(dPi
dY
)(dPidY
)=
d
dY
√(Y − Yi+1)2 +
[(Y − Yi+1)(Xi+1 −Xi)
Yi − Yi+1
]2
=�2 (Y − Yi+1) + �2
(Y−Yi+1)(Xi+1−Xi)�����:(Yi−Yi+1)(Xi+1−Xi)
�����:
(Yi−Yi+1)(Yi−Yi+1)2
�2
√(Y − Yi+1)2 +
[(Y − Yi+1)(Xi+1 −Xi)
Yi − Yi+1
]2
︸ ︷︷ ︸Perimetro(Pi)
=(Y − Yi+1) + (Y−Yi+1)(Xi+1−Xi)
2
(Yi−Yi+1)2
Pi
(dPidY
)=
(Y − Yi+1) (Yi − Yi+1)2 + (Y − Yi+1) (Xi+1 −Xi)2
Pi (Yi − Yi+1)2 (3.4.20)
lxxii
3.4. Calculo del Tirante Normal
Esta ecuacion aun es posible simplificar haciendo algunos arreglos
Se sabe que: Pi =
√(Y − Yi+1)2 +
[(Y−Yi+1)(Xi+1−Xi)
Yi−Yi+1
]2
,
donde
(Pi)2 = (Y − Yi+1)2 +
[(Y − Yi+1)(Xi+1 −Xi)
Yi − Yi+1
]2
=(Y − Yi+1)2 (Yi − Yi+1)2 + (Y − Yi+1)2 (Xi+1 −Xi)
2
(Yi − Yi+1)2
Dividiendo la expresion anterior entre (Pi) (Y − Yi+1)
(Pi)���1
2
���(Pi) (Y − Yi+1)
=(Y − Yi+1) (Yi − Yi+1)2 + (Y − Yi+1) (Xi+1 −Xi)
2
(Pi) (Yi − Yi+1)2 (3.4.21)
Note que la expresion de la derecha viene a ser igual a la ecuacion (3.4.20), por lo
tanto reemplazando se tiene.
Pi(Y − Yi+1)
=
(dPidY
)
Esta ecuacion, tambien podra ser representada en funcion trigonometrica, segun la
figura que se muestra:
(dPidY
)=
Pi(Y − Yi+1)
= cosec (θ1) (3.4.22)
Calculo de(dPk
dY
)Analogamente:
lxxiii
3.4. Calculo del Tirante Normal
Figura 3.4: Pendiente del banco izquierdo a la superficie libre
Pk(Y − Yi)
=
(dPkdY
)
Figura 3.5: Pendiente del banco derecho a la superficie libre
(dPkdY
)=
Pk(Y − Yk)
= cosec (θ2) (3.4.23)
Reemplazando en la ecuacion (3.4.19) se obtendra la derivada del Perımetro total:
(dP
dY
)=
Pi(Y − Yi+1)
+Pk
(Y − Yk)= cosec (θ1) + cosec (θ2) (3.4.24)
lxxiv
3.4. Calculo del Tirante Normal
Chezy
La Ecuacion de Chezy en terminos de caudal:
Q = AC√RSf (3.4.25)
Despejando las variables constantes, para formar la Funcion principal “F(Y)”.
F (Y ) = A3/2P−1/2 − Q
C√Sf︸ ︷︷ ︸
Constante
= 0 (3.4.26)
Derivando la funcion F(Y) con respecto a “Y” ( dFdY
)se tiene:
dF
dY=
d
dy
(A3/2P−1/2 − Q
C√Sf
)=
3
2P−1/2A1/2
(dA
dY
)− 1
2A3/2P−3/2
(dP
dY
)
(3.4.27)
Darcy-Weisbach
Dada la ecuacion de Darcy en funcion del caudal se tiene:
Q = −A(32gRSf )1/2log
[ks
14,8R+
1,255υ
R(32gRSf )1/2
](3.4.28)
Despejando las variables constantes, para formar la Funcion principal “F(Y)”, e igualando
esta funcion cero.
F (Y ) = −A(R)1/2log
[ks
14,8R+
1,255υ
R(32gRSf )1/2
]− Q
(32gRSf )1/2= 0 (3.4.29)
lxxv
3.4. Calculo del Tirante Normal
Derivando la funcion F(Y) con respecto a “Y” ( dFdY
)se tiene:
dF
dY=−A√Rlog(C)− 1
2RLn(C)
(dAdY−R dP
dY
)√RLn(10)
− A√R(D)
CLn(10)(3.4.30)
Donde:
R: Radio Hidraulico R = AP
C, D: Constantes.
C =5Ks
74R+
251
6400
v√
32
R3/2√gSf
(dAdY
P− A
dPdY
P 2
)
=5Ks
74R+
251
6400
���Rv√
32
AR��>3/2√gSf
(dA
dY−RdP
dY
)
Donde:
C =5Ks
74R+
251
6400
v√
32
A√RgSf
(dA
dY−RdP
dY
)(3.4.31)
D = − 5
74
KsPdAdY
A2+
5
74
KsdPdY
A− 753
12800
v√
32(
dAdY
P− A
dPdY
P 2
)R5/2√gs
= − 5
74
KsdAdY
RA+
5
74
KsdPdY
A− 753
12800
v√
32RA
(dAdY−R dP
dY
)R5/2√gs
Donde:
D =5Ks
74A
[dP
dY− 1
R
dA
dy
]− 753
12800
v√
32(dAdY−R dP
dY
)AR3/2
√gSf
(3.4.32)
lxxvi
3.5. Caracterısticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado
3.5. Caracterısticas y Clasificacion de los Perfiles del
Flujo Gradualmente Variado
Al examinar el computo de perfiles de flujo gradualmente variado, se necesita primero
desarrollar un metodo sistematico para clasificar los perfiles que pueden presentarse en
un cauce dado.
Figura 3.6: Esquema para superficie libre de agua
De la figura 3.6, se deduce las ecuaciones:
H = Z + Y +αV 2
2g(3.5.1)
Diferenciando con respecto a X y las velocidad V expresando en funcion del caudal Q
dH
dX=dZ
dX+dY
dX+αQ2
2g
d
dX
(1
A2
)(3.5.2)
lxxvii
3.5. Caracterısticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado
Ahora, por definicion.
dH
dX= −Sf (3.5.3)
dZ
dX= −S0 (3.5.4)
Donde Sf es la pendiente de la gradiente de energıa y S0 es la pendiente del fondo del
cauce.
d
dX
(1
A2
)=
d
dA
(1
A2
)dA
dX
=d
dA
(1
A2
)dA
dY
dY
dX
= −2B
A3
dY
dX
(3.5.5)
Donde dA/dY = B. De las ecuaciones anteriores se tiene la ecuacion de la variacion del
tirante Y con respecto a la distancia X.
dY
dX=
S0 − Sf1− (αBQ2)/(gA3)
(3.5.6)
Donde:
F 2 =αBQ2
gA3=
(Q/A)2
(gA)/(αB)(3.5.7)
dY
dX=S0 − Sf1− F 2
(3.5.8)
Para un valor de Q, y Sf son funciones del tirante Y y en un canal ancho F y Sf varıan
casi en la misma forma que Y dado que P = B y tanto Sf como F tienen una fuerte
lxxviii
3.5. Caracterısticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado
dependencia inversa en el area de flujo. Ademas, al aumentar Y , F y Sf decreceran. Por
definicion Sf = Sf cuando Y = Yn, por ende el siguiente juego de desigualdades debe
cumplirse:
Figura 3.7: Sistema de clasificacion de perfiles de flujo gradualmente variado
Sf ≷ S0 Correspondiente a Y ≶ Yn (3.5.9)
F ≷ 1 Correspondiente a Y ≶ Yc (3.5.10)
Estas desigualdades dividen al canal en tres secciones en la dimension vertical, tal como se
lxxix
3.5. Caracterısticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado
muestra en la figura 3.7. Por convencion, estas secciones se enumeran del 1 al 3 empezando
desde arriba.
Los perfiles del flujo gradualmente variado, se clasifica en cinco categorıas:
Suave (Mild): Corresponde al perfil M , se refiere a canales con pendientes suaves o
subcrıticas. Se obtiene los siguientes resultados donde Y es el tirante real del flujo:
• Zona 1: Y > Yn > Yc; S0 > Sf , F < 1; dY/dX > 0
• Zona 2: Yn > Y > Yc; S0 < Sf , F < 1; dY/dX < 0
• Zona 3: Yn > Yc > Y ; S0 < Sf , F > 1; dY/dX > 0
Fuerte (Steep): Corresponde al perfil S. En estos perfiles, S0 > Sc y Yn < Yc. El
perfil S1 por lo general comienza con un salto en la frontera de aguas arriba y
termina con un perfil tangente a la horizontal en la frontera aguas abajo. El perfil
S2 es una curva de rapida que es comunmente muy corta. En la frontera de aguas
abajo, este perfil es tangente al tirante normal. El perfil S3 es tambien transicional
ya que conecta un flujo supercrıtico con el tirante normal.
Crıtica (Critical): Corresponde al perfil C. En estos perfiles, S0 = Sc y Yn = Yc. El
perfil C1 es asintotico a una linea horizontal, por ejemplo un perfil que conecta a
un canal de pendiente crıtica con un canal de pendiente suave. El perfil C3 puede
conectar un flujo supercrıtico con un almacenamiento en una pendiente crıtica.
Horizontal (pendiente cero): Corresponde al perfil H. En este caso S0 = 0, y los
perfiles H pueden considerarse como un caso lımite de los M . El perfil de la curva
de abatimiento H2 puede encontrarse aguas arriba de una caıda libre, mientras que
el perfil H3 puede conectar un flujo supercrıtico bajo una compuerta con un nivel
en vaso.
lxxx
3.6. Ecuaciones para el calculo de perfiles basicos.
Adverso (Adverse): Corresponde al perfil A. En estos perfiles S0 < 0, En general los
perfiles A2 y A3 se presentan con poca frecuencia y son similares a los H2 y H3.
3.6. Ecuaciones para el calculo de perfiles basicos.
Estos datos son necesarios para calcular los tirantes del cauce, empleando el metodo del
paso estandar.
Flujo Gradualmente Variado: Metodo del paso Estandar
Figura 3.8: Balance de Energıa
De la ecuacion de energıa se tiene:
Z1 + Y1 +α1V
21
2g= Z2 + Y2 +
α2V2
2
2g+ hf (3.6.1)
Para un caudal dado, el tirante Y1 es conocido en la seccion 01. El metodo del paso
Estandar consiste en determinar el tirante en la seccion 02 a una distancia X2. Primero
lxxxi
3.6. Ecuaciones para el calculo de perfiles basicos.
determinamos la velocidad V1 en la seccion 01, V = QA
, y en la ecuacion de la energıa (Ec.
3.6.1) representamos de la forma siguiente:
H1 = Z1 + Y1 +α1V
21
2g(3.6.2)
H2 = H1 − hf (3.6.3)
Donde hf , corresponde a la perdida total 1 entre las secciones 1 y 2
Ası mismo se conoce
hf =1
2(Sf1 + Sf2)(X2 −X1) (3.6.4)
Reemplazando en la ecuacion 3.6.3 tenemos
H2 = H1 −1
2(Sf1 + Sf2)(X2 −X1) (3.6.5)
Sustituyendo las ecuaciones
Z2 + Y2 +α2Q
2
2gA22
+1
2(Sf1 + Sf2)(X2 −X1)−H1 = 0
Y2 +α2Q
2
2gA22
+1
2Sf2(X2 −X1) + Z2 −H1 +
1
2Sf1(X2 −X1) = 0 (3.6.6)
En la ecuacion 3.6.6, A2 y Sf2 son funciones de Y2 y todos los terminos restantes son
conocidos (calculados en la seccion 01). El tirante Y2 puede ser determinado, resolviendo
la siguiente ecuacion algebraica NO-LINEAL con metodo conocidos tales como Biseccion
o el metodo de Newton Raphson.
1Perdida por friccion + perdida local
lxxxii
3.6. Ecuaciones para el calculo de perfiles basicos.
F (Y2) = Y2 +α2Q
2
2gA22
+1
2Sf2(X2 −X1) + Z2 −H1 +
1
2Sf1(X2 −X1) = 0 (3.6.7)
Para usa el metodo de Newton Raphson, es necesario contar la derivada de la funcion con
respecto al tirantes por conocer (Y2).Este se obtiene al diferenciar la expresion 3.6.7
dF
dY2
= 1− α2Q2
gA32
dA2
dY2
+1
2(X2 −X1)
dSf2
dY2
+ 0− 0 + 0
Tambien se sabe:
Sf2 =Q2n2
A22R
4/32
dF
dY2
= 1− α2Q2
gA32
dA2
dY2
+1
2(X2 −X1)
d
dY2
(Q2n2
A22R
4/32
)(3.6.8)
d
dY2
(Q2n2
A22R
4/32
)=−2Q2n2
A32R
4/32
dA2
dY2
− 4Q2n2
3A22R
7/32
dR2
dY2
=−2
A2
Q2n2
A22R
4/32︸ ︷︷ ︸
Sf2
dA2
dY2
− 4
3R2
Q2n2
A22R
4/32︸ ︷︷ ︸
Sf2
dR2
dY2
=−2
A2
Sf2dA2
dY2
− 4
3R2
Sf2dR2
dY2
= −2
(Sf2
A2
dA2
dY2
+2Sf2
3R2
dR2
dY2
)(3.6.9)
Reemplazando la ecuacion 3.6.9 en 3.6.8
dF
dY2
= 1− α2Q2
gA32
dA2
dY2
+1
2(X2 −X1)(−2)
(Sf2
A2
dA2
dY2
+2Sf2
3R2
dR2
dY2
)
dF
dY2
= 1− α2Q2
gA32
dA2
dY2
− (X2 −X1)
(Sf2
A2
dA2
dY2
+2Sf2
3R2
dR2
dY2
)(3.6.10)
lxxxiii
3.6. Ecuaciones para el calculo de perfiles basicos.
La expresion dR2
dY2puede ser reemplazado en funcion del area y el perımetro. Ası:
R =A
P
dR2
dY2
=d
dY2
(A2
P2
)=
1
P2
dA2
dY2
+ A2d
dY2
(1
P2
)=
1
P2
(dA2
dY2
)− A2
P 22
(dP2
dY2
) (3.6.11)
Reemplazando la derivada dA2/dY2 = B2
dF
dY2
= 1− α2Q2
gA32
B2 − (X2 −X1)
[Sf2
B2
A2
+2
3Sf2
(P2
A2
)(B2
P2
− A2dP2
P 22 dY2
)]
dF
dY2
= 1− α2Q2
gA32
B2 − (X2 −X1)
[Sf2
B2
A2
+2
3
Sf2
A2
(B2 −
A2
P2
dP2
dY2
)]
dF
dY2
= 1− α2Q2
gA32
B2 −1
3Sf2(X2 −X1)
(5B2
A2
− 2
P2
dP2
dY2
)(3.6.12)
Estas ecuaciones sirven para calcular la superficie libre de agua (curva de remanso en un
flujo gradualmente variado) en secciones prismaticas y no prismaticas.
lxxxiv
Capıtulo 4
MODELOS NUMERICOS EN RIOS
Y DIAGRAMAS DE FLUJO
4.1. Introduccion
En la actualidad existen diversos modelos numericos para simulaciones de flujos en rıos,
desde modelos simples hasta modelos complejos. En este capıtulo se describe los modelos
clasicos tales como el modelo de la onda dinamica, modelo de la onda de difusion y el
modelo de la onda cinematica, como tambien se describe las propiedades hidraulicas y los
calculos unidimensionales para los flujos permanentes, discretizando las ecuaciones para
su programacion computacional.
lxxxv
4.2. Formulacion de Flujos en 1D
4.2. Formulacion de Flujos en 1D
4.2.1. Ecuaciones Hidrodinamicas 1D
Modelo de la Onda Dinamica
El modelo de la onda dinamica en 1D, para flujos en canales abiertos son gobernados por
las ecuaciones de Barre Saint Venant considerando flujos laterales (inflow/outflow). Se
tiene:
∂A
∂t+∂Q
∂x= ql (4.2.1)
∂A
∂t+
∂
∂x
(βQ2
A
)+ gA
∂Zs∂x
+ gASf = qlUx (4.2.2)
La variable x representa la distancia a lo largo de la misma coordenada espacial, A es
el area mojada de la seccion transversal del flujo y Q viene a ser la descarga del flujo
definido como Q = AU , siendo U la velocidad promedio, sobre la seccion transversal;
Zs es la estacion del agua; β es el factor de correccion para el momentum debido a la
uniformidad de las (corrientes) distribuciones de velocidades sobre al seccion transversal;
ql es el flujo lateral por unidad de largo del canal. Ux es la velocidad de los flujos laterales
en la direccion del eje xi y Sf es la pendiente de friccion, denominado o representado
como:
Sf =Q|Q|K2
(4.2.3)
Donde K viene a ser la conductividad. Para una simple seccion transversal, K = AR2/3
n;
con R Radio Hidraulico y n el coeficiente de rugosidad de Manning del canal.
lxxxvi
4.2. Formulacion de Flujos en 1D
Para una seccion transversal compuesta.
Kj =AjR
2/3j
nj(4.2.4)
Modelo de la Onda Difusion
El modelo de la onda de difusion asume que las aceleraciones local y convectiva en la
ecuacion del momentum son insignificantes, por lo tanto se tiene:
gA∂Zs∂x
+ gASf = qlUx (4.2.5)
La ecuacion de continuidad, aun se usa en este modelo.
Este modelo es mas Estable que el modelo de la onda dinamica, pero este ultimo es mas
exacto y puede ser aplicado en rangos amplios de condiciones de flujo.
Modelo de la Onda Cinematica
Para este modelo, las variaciones en la velocidad del flujo y el tirante son Insignificantes en
comparacion con la variacion en la elevacion del lecho del cauce y por lo tanto la ecuacion
de momentum puede ser simplificado como:
Sf = S0 (4.2.6)
Donde So es la pendiente del fondo del canal en la direccion longitudinal.
Usando la ecuacion de Manning, la ecuacion 4.2.6 puede ser reescrito.
Q =A
nR2/3S
1/20 (4.2.7)
lxxxvii
4.2. Formulacion de Flujos en 1D
La ecuacion de continuidad 4.2.1 aun es usada en este modelo de la onda cinematica.
Este modelo generalmente se aplica si se cumple que:
g∧S0
U2> 10 (4.2.8)
Donde∧
, representa la longitud del canal en estudio y U es la velocidad promedio del flujo
uniforme. La Ecuacion 4.2.8 implica que el modelo de la onda cinematica sea aplicado en
canales empinados o pronunciados (steep).
4.2.2. Propiedades Hidraulicas Compuestas
Si las propiedades hidraulicas, tales como rugosidad, conduccion, no son uniformes, a
traves del canal, sus valores compuestos necesitan ser calculados. Existen varios metodos
que se usan frecuentemente, tales como: El metodo Alpha, Metodo de la division Radio
Hidraulico, Metodo de la division de la pendiente energıa y el metodo de la conduccion o
transportabilidad.
Metodo Alpha
En el metodo Alpha, la seccion transversal es dividida dentro de paneles o franjas entre
dos puntos de coordenadas (estaciones) tal como se muestra en la figura 4.1. La division
entre los paneles son asumidos para ser verticales. En este metodo la seccion transversal
no se distingue entre el canal principal y los bancos de inundacion.
Aj =
[Zs −
1
2(Zb,j + Zb,j+1)
]∆yj (4.2.9)
Pj =√
(Zb,j − Zb,j+1)2 + ∆y2j (4.2.10)
lxxxviii
4.2. Formulacion de Flujos en 1D
Figura 4.1: Representacion de la seccion transversal en el Metodo Alpha
Rj =AjPj
(4.2.11)
Donde Aj es el area del flujo Pj, perımetro mojado, Rj Radio hidraulico. Para Kj de la
franja j, son calculados por las ecuaciones 4.2.9, 4.2.10, 4.2.11 y:
Kj =AjR
2/3j
nj(4.2.12)
Donde Zb,j, es la elevacion del fondo en la estacion j, ∆yj es la distancia entre estaciones
j, j + 1, nj es coeficiente de la rugosidad de manning en la franja j.
La seccion transversal compuesta del area del flujo, es definido como la sumatoria de todos
las franjas (sub areas en los paneles).
La velocidad compuesta es definida como la division de la descarga total entre el area de la
seccion conservando continuidad. El radio hidraulico compuesto (transporte ponderado):
R =M∑j=1
RjKj∑Mj=1 Kj
(4.2.13)
Donde M es el numero de franjas mojadas.
lxxxix
4.2. Formulacion de Flujos en 1D
El Metodo Alpha se limita debido a que ignora el efecto de los muros verticales, lo cual
no es adecuado en situaciones donde existen superficies laterales verticales o pendientes
empinadas, pronunciados en los bancos.
Division de Radio Hidraulico
Propuesto por Einstein (1950), es un metodo mas adecuado para determinar las propie-
dades hidraulicas compuestas para la seccion transversal con superficies verticales rugosos
o pendientes pronunciados en los bancos basados en la division del radio hidraulico. Es-
te metodo asume velocidades iguales en todas las franjas y calcula todas las variables
hidraulicas en un modo normal, excepto para el coeficiente de la rugosidad de Manning.
El esfuerzo de corte en la seccion transversal puede ser calculado como:
Xτ =M∑j=1
Pjτj (4.2.14)
Donde:
P = Perımetro mojado.
El metodo de Einstein determina:
τ = γRSf (4.2.15)
τj = γRjSf (4.2.16)
Aplicando y asumiendo las velocidades iguales y la ecuacion de Manning en la seccion
transversal entera y para cada franja se tiene:
xc
4.2. Formulacion de Flujos en 1D
R =
(nU
S1/2f
)3/2
, Rj =
(njU
S1/2f
)3/2
(4.2.17)
Insertando las ecuaciones 4.2.15y 4.2.17 en la ecuacion 4.2.14 se tiene:
n =
(M∑j=1
Pjn3/2j
P
)2/3
(4.2.18)
Metodo de la division pendiente Energıa
Este metodo es basado en la division de la pendiente energıa originado por Engelund
(1966), es otra opcion para determinar las propiedades hidraulicas compuestas para una
seccion transversal con superficies laterales verticales rugosas o pendientes pronunciadas
en los bancos.
Este metodo da:
τj = γRSf,j (4.2.19)
Y aplica la asuncion de la velocidad igual y la ecuacion de Manning en la seccion trans-
versal entera y cada franja es:
Sf =
(nU
R2/3
)2
, Sf,j =
(njU
R2/3
)2
(4.2.20)
Insertando las ecuaciones 4.2.15, 4.2.19 y 4.2.20 en la ecuacion 4.2.14 se tiene la siguiente
ecuacion para un Manning n compuesto.
n =
[M∑j=1
(Pjn
2j
P
)]1/2
(4.2.21)
xci
4.2. Formulacion de Flujos en 1D
Metodo de la Transportabilidad - Conveyance
La asuncion de las velocidades iguales usados en los metodos anteriores, basado en la
division de cualquiera de los dos radios hidraulicos o pendiente de energıa es solamente
aplicable en canales o cauces simples.
Para un canal compuesto con inundaciones, las velocidades en el canal principal y playas de
inundacion pueden ser significativamente diferentes. Una forma o un metodo mas adecuado
para determinar las propiedades hidraulicas compuestas en canales complejos es el metodo
de transporte (Conveyence Method).
Este metodo divide la seccion transversal en sub secciones de tal forma, que la asuncion
de las velocidades iguales puede ser aproximadamente valida en cada sub seccion. Y
estas sub secciones pueden aun ser ser dividido entre mas franjas. El area del flujo, el
perımetro mojado y la conduccion de cada sub seccion puede ser calculada de manera
normal. Las conducciones de todas las sub secciones se suman para establecer el total de
la transportabilidad para la seccion transversal entera.
Por ejemplo en una seccion transversal compleja.
Figura 4.2: Seccion transversal compuesta con llanuras de inundacion
En la figura 4.2 se divide en tres secciones canal principal, llanura de inundacion izquierda
y llanura de inundacion derecha; y el total de la transportabilidad K es determinado por:
xcii
4.2. Formulacion de Flujos en 1D
K =A
5/3LF
nLFP2/3LF
+A
5/3MC
nMCP2/3MC
+A
5/3RF
nRFP2/3RF
(4.2.22)
Donde los subındices LF denota llanura de inundacion izquierda (Left Foodplain), MC
el canal o cauce principal (Main channel) y RF llanura de inundacion derecha (Right
Floodplain).
Para cada sub seccion, el coeficiente de rugosidad de Manning puede ser determinado
usando el radio hidraulico o el metodo de la division pendiente energıa (energy slope
division method).
Para el ejemplo el coeficiente de rugosidad de Manning n en el canal principal es deter-
minado usando estos dos metodos como sigue:
nMC =
(j=RCB∑j=LCB
Pjn3/2j /PMC
)(4.2.23)
Donde: LCB y RCB representan franjas adyacentes del canal principal hacia la izquierda
y derecha bordes de las llanuras de inundacion (denominados como en LF y RF segun la
figura 4.2).
4.2.3. Propiedades Hidraulicas Compuestas
El factor de correccion β para la ecuacion del momentum en la ecuacion 4.2.2 es consi-
derado solo para una seccion transversal simple. Para una seccion transversal compuesta,
tal como en la figura anterior, el factor β es determinado por:
β =1
QU
∫ ∫A
u2dA =1
QA(QLFULF +QMCUMC +QRFURF ) (4.2.24)
xciii
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
β =A
K2
(K2LF
ALF+K2MC
AMC
+K2RF
ARF
)(4.2.25)
4.3. Calculos Uni-dimensionales para flujos en cana-
les o cauces abiertos
.
4.3.1. Calculos de Flujos Permanentes 1-D
Discretizacion de ecuaciones para Flujos Permanentes
Para flujos permanentes en canales abiertos sin considerar ingresos y/o salidas de flujos
laterales, la ecuacion 4.2.1 se reduce a:
∂Q
∂x= 0 (4.3.1)
Y da lugar a una descarga del flujo constante. Mientras la ecuacion 4.2.2 puede ser reescrito
como la ecuacion de la Energıa.
∂
∂x
(β′Q2
2A2
)+ g
∂Zs∂x
+ gQ|Q|K2
= 0 (4.3.2)
Donde β′ es el factor de correccion de la energıa cinetica debido a la no uniformidad de la
direccion de la corriente en la seccion transversal. Para una seccion transversal compleja
como se muestra en la figura anterior, β′ puede ser determinado mediante el promedio de
la descarga ponderada de la energıa cinetica.
xciv
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
β′ =1
QU2
(QLFU
2LF +QMCU
2MC +QRFU
2RF
)(4.3.3)
β′ =A2
K3
(K3LF
A2LF
+K3MC
A2MC
+K3RF
A2RF
)(4.3.4)
Donde todos los parametros son iguales que en la ecuacion 4.2.25
Asumimos que el dominio computacional de un canal simple es dividido en I − 1 tramos
por I secciones transversales (puntos computacionales) como se muestra en la figura 4.3.
Las secciones transversales son numeradas en la direccion aguas abajo desde 1 hasta I.
Cada seccion transversal es representado por un numero adecuado de puntos (estaciones)
como se muestra en la figura 3.2, con cada punto caracterizado por un par de valores o
coordenadas locales (z, y) distancia elevacion del fondo.
Para un canal simple, la longitud de alcance mide la ruta del flujo principal o canal
Thalweg 1. Para un canal complejo, las rutas del flujo en el canal principal y llanuras de
inundacion pueden ser significativamente diferentes y un promedio (tal como el promedio
de la descarga ponderada) de sus longitudes pueden ser usados como la longitud del
alcance.
Aplicando el metodo del paso standard para discretizar la ecuacion 4.3.2 se tiene.
β′iQ2i
2gA2i
+ Zs,i =β′i+1Q
2i+1
2gA2i+1
+ Zs,i+1 +∆xi+1/2
2
(Qi+1|Qi+1|K2i+1
+Qi|Qi|K2i
)(4.3.5)
Donde xi + 1/2 representa la longitud de cada tramo entre las secciones transversales i y
i+ 1.
1En terminos cientıficos se utiliza el nombre de Thalweg, voz procedente del aleman que significa”camino del valle”, esta lınea que se encuentra en medio de la parte mas profunda del rıo y donde lacorriente es mas rapida.
xcv
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
Figura 4.3: Malla Uni-dimensional, Modelo de cauce en 1D
En la ecuacion 4.3.5 la pendiente de friccion es representado por la media aritmetica entre
las secciones transversales i e i+ 1. Este puede ser representado por:
Media Aritmetica.
Sf,i+1/2 =1
2
(Qi+1|Qi+1|K2i+1
+Qi|Qi|K2i
)(4.3.6)
Media Armonica.
Sf,i+1/2 = 2/
(K2i+1
Qi+1|Qi+1|+
K2i
Qi|Qi|
)(4.3.7)
Media Geometrica.
Sf,i+1/2 =
(Qi+1|Qi+1|K2i+1
Qi|Qi|K2i
)1/2
(4.3.8)
Transporte Medio.
Sf,i+1/2 =
(Qi+1 +Qi
Ki+1 +Ki
)2
(4.3.9)
Si las secciones transversales del estudio, presentan contracciones y/o expansiones, una
perdida local es considerado en la ecuacion 4.3.5, el cual la ecuacion final se tiene:
xcvi
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
β′iQ2i
2gA2i
+ Zs,i =β′i+1Q
2i+1
2gA2i+1
+ Zs,i+1 +∆xi+1/2
2
(Qi+1|Qi+1|K2i+1
+Qi|Qi|K2i
)+ λi+1/2
∣∣∣∣β′i+1Q2i+1
2gA2i+1
− β′iQ2i
2gA2i
∣∣∣∣ (4.3.10)
Donde λi+1/2 es el coeficiente de la perdida local debido a la expansion o contraccion en
el tramo entre las secciones transversales i y i+ 1.
Solucion de las Ecuaciones del Flujo Permanente Discretizados
La solucion para la ecuacion 4.3.10 difiere en casos de flujos sub crıticos y super crıticos.
Para el flujo Subcrıtico: Una descarga del flujo es usualmente especificado en el ingreso y
una estacion del agua es especificado en la salida. Consecuentemente la descarga del flujo
es calculando aplicando la continuidad de masa y la estacion del agua (tirante) puede ser
determinado por calculos de remanso usando la ecuacion 4.3.10. Como se ve, esta ecuacion
es no lineal, por lo tanto, necesita ser resuelto iterativamente bajo un margen de error.
Definimos la siguiente funcion:
F =β′i+1Q
2i+1
2gA2i+1
− β′iQ2i
2gA2i
+ Zs,i+1 − Zs,i +∆xi+1/2
2
(Qi+1|Qi+1|K2i+1
Qi|Qi|K2i
)(4.3.11)
Puesto que Zs,i+1 y la correspondiente Ai+1 y Ki+1 en la seccion transversal i+1 se obtuvo
del calculo previo en el tramo entre las secciones i+ 1 y i+ 2 o del tirante (o estacion del
agua) dado en la salida, ahora el problema es determinar Zs,i y la correspondiente area
Ai y Ki, garantizando F = 0. Aquı se usa el metodo de Biseccion.
Para el flujo Supercrıtico: La descarga del flujo y la estacion del agua (tirante) son ingre-
sadas usualmente en el ingreso (upstream). El procedimiento para los calculos es el mismo
del flujo subcrıtico, con la diferencia del sentido de calculo (upstream - downstream).
xcvii
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
Metodo de Biseccion
Es un metodo de busqueda incremental que divide el intervalo siempre en 2. Si la funcion
cambia de signo un intervalo, se evalua el valor de la funcion en el punto medio. La
posicion de la raız se determina situandola en el punto medio del sub intervalo, donde
exista cambio de signo. El proceso se repite hasta mejorar la aproximacion.
Encontrar un segmento, eligiendo los valores iniciales [Zlower, Zupper], en el cual la
seccion de Zs,i existan, por ejemplo: FupperFlower < 0, con Fupper y Flower, siendo los
valores de F correspondiente a Zupper y Zlower, respectivamente.
Los Zmiddle = (Zupper + Zlower)/2 y se calcula Fmiddle. Los valores de F correspon-
diente a Zmiddle (Zintermedio).
Si Fmiddle = 0 (o inferior a la tolerancia prudente), Zmiddle es la solucion de Zs,i y si
FupperFmiddle < 0, entonces el Zlower = Zmiddle.
Si Zupper − Zlower es inferior a la tolerancia razonable, entonces (Zupper + Zlower)/2
puede ser la solucion de Zs,i y para la iteracion; de otro modo repetir desde el paso
(2) hasta que la solucion converja.
Note que la busqueda en el paso (1) para los lımites inferior y superior (lower, upper)
Zlower y Zupper del segmento inicial donde las soluciones existan puedan estar desde cual-
quier elevacion o fondo del canal Zs,i+1.
xcviii
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos
4.3.2. Resumen de ecuaciones empleados en el programa PLE-
DER
F =β′i+1Q
2i+1
2gA2i+1
− β′iQ2i
2gA2i
+ Zs,i+1 − Zs,i +∆xi+1/2
2
(Qi+1|Qi+1|K2i+1
Qi|Qi|K2i
)(4.3.12)
Sf,i+1/2 =
Media Aritmetica: 12
(Qi+1|Qi+1|
K2i+1
+ Qi|Qi|K2
i
)Media Armonica : 2/
(K2
i+1
Qi+1|Qi+1| +K2
i
Qi|Qi|
)Media Geometrica:
(Qi+1|Qi+1|
K2i+1
Qi|Qi|K2
i
)1/2
Transporte Medio:(Qi+1+Qi
Ki+1+Ki
)2
(4.3.13)
hf,i+1/2 = ∆xi+1/2Sf,i+1/2 (4.3.14)
hc,i+1/2 = λi+1/2
∣∣∣∣β′i+1Q2i+1
2gA2i+1
− β′iQ2i
2gA2i
∣∣∣∣ (4.3.15)
Ki =A
5/3LF,i
nLF,iP2/3LF,i
+A
5/3MC,i
nMC,iP2/3MC,i
+A
5/3RF,i
nRF,iP2/3RF,i
(4.3.16)
β′i =A2i
K3i
(K3LF,i
A2LF,i
+K3MC,i
A2MC,i
+K3RF,i
A2RF,i
)(4.3.17)
xcix
4.4. Diagramas de flujo
4.4. Diagramas de flujo
Para este componente (Hidraulica) se emplea objetos personalizados con aplicaciones de
ObjectDBX. Este es una librerıa dinamica DLL, que es cargado dentro del ambiente
AutoCAD, permitiendo el acceso de los objetos o recurso CAD.
ObjectBDX, es el nombre del API Autodesk que sirve para los desarroladores que usan
la lectura y escritura del autoCAD DWG, DXF, incluyendo soportes para crear entidades
personalizadas.
Los diagramas de flujos son:
Diagrama de flujo Calculo de la Superficie Libre Metodo del Paso Estan-
dar: Recibe los datos de las secciones transversales, geometrıa, caudal de diseno,
condicion de borde inicial dependiendo del tipo de flujo. Para el Flujo Subcrıtico,
las condiciones iniciales son aguas abajo (downstream) y para el Flujo Supercrıtico
las condiciones iniciales son aguas arriba (upstream).
Diagrama de flujo Condiciones Aguas Abajo: Viene a ser la eleccion del flujo
Subcrıtico, donde los calculos son a partir de la ultima seccion transversal hasta
la primera seccion. En el diagrama se toma como dato al tirante hidraulico, area
hidraulica, perımetro mojado y demas caracterısticas que se muestra. Ası mismo
contiene una funcion para calcular los niveles mediante el metodo biseccion que se
detalla posteriormente.
Diagrama de flujo Condiciones Aguas Arriba: El diagrama corresponde al
flujo Supercrıtico. El mecanismo es el mismo del anterior, con la unica diferencia de
que el analisis es desde la primera seccion transversal (upstream) hasta la ultima
seccion.
c
4.4. Diagramas de flujo
Diagrama de flujo Calculo del Area y Perımetro hidraulico: A partir del
tirante asignado o calculado (nivel de superficie libre), en cada seccion transversal
se obtiene las areas y los perımetros. El metodo que emplea es mediante franjas
verticales entre vertices adyacentes. En los extremos de la seccion transversal, se
forman triangulos y en el intermedio pequenos trapecios, donde la sumatoria de ellos
representa el area y el perımetro segun corresponda. El metodo es muy adecuado
para secciones transversales complejas controlando inundaciones laterales (izquierda,
derecha) en cada seccion transversal.
Diagrama de flujo Calculo del Factor de Transporte K: El metodo para cal-
cular el factor de transporte es una fraccion entre el area y el perımetro multiplicado
por el coeficiente de manning. En programacion es recomendable no tener valores
nulos o ceros en el denominador de una fraccion. El diagrama controla este posible
error.
Diagrama de flujo Calculo del Factor de correccion β′: Calcula el factor de
correccion β′ en cada seccion transversal, previniendo los posibles valores nulos en
los denominadores de las fracciones.
Diagrama de flujo Metodo de la Biseccion: El metodo de la Biseccion tambien
es conocido como el metodo de particion en dos intervalos iguales. Este metodo busca
la raız de una funcion en un intervalo propuesto, usando la tecnica de busqueda
incremental, para encontrar donde la funcion cambie de signo, o sea, cuando la
funcion cruza el eje de la coordenada x, por lo tanto, sera el valor de la raız buscada.
Diagrama de flujo Funcion F : Este diagrama corresponde al calcular en forma
directa la funcion F , que es la ecuacion del balance de energıa.
Los resultados son:
ci
4.4. Diagramas de flujo
Graficos, que corresponde a los niveles de superficie libre de agua, tanto en las secciones
transversales como en los perfiles longitudinales.
Tabulares, (tablas) resumen de las caracterısticas hidraulicas del flujo, tales como, caudal
de diseno, tirante, area, perımetro, velocidad, numero de froude, ancho o espejo de agua,
etc.
cii
INICIO CÁLCULO DE LA SUPERFICIE LIBRE METODO DEL PASO ESTANDARD
Datos de las secciones transversales (geometría)
Ordenar consecutivamente las secciones transversales nST = Número de secciones
transversales.
Tipo de Flujo, Caudal de diseño (m3/s), Nivel inicial (m)
Tipo de Flujo
F. Subcrítico F. Supercrítico F. Mixto
Condición Aguas Abajo *(A)
Condición Aguas Arriba *(B)
Condición Aguas Arriba y Aguas Abajo
FIN CÁLCULO DE LA SUPERFICIE
Niveles de la superficie libre de agua y las características hidráulicas.
4.4. Diagramas de flujo
ciii
(A) INICIO CONDICIÓN AGUAS ABAJO
i= nST ‐1, hasta i = 0, i = i‐1
Zsi Cota tiranteArea, Perímetro GetAreaPerimeter * C .K GetConveyanceK * D . Beta GetCorrectionFactorBeta * E Zlower Cota mínima de la sección actual. Zupper Zsi Valor superior. Datos Geométricos de la sección transversal: BL Vértice llanura izquierda. BR Vértice llanura derecha. nL Coeficiente de Manning llanura izquierda. nC Coeficiente de Manning canal central. nR Coeficiente de Manning llanura derecha. LL Longitud por la llanura izquierda. LC Longitud por el canal central. LR Longitud por la llanura derecha. CC Coeficiente de contracción. CE Coeficiente de expansión. Cálculo método de Bisección * F Reasignar valores: Beta Cálculos Beta Area Cálculos Area Zsi Cálculos Zsi K Cálculos K
FIN CONDICIÓN AGUAS ABAJO
Niveles de la superficie libre de agua y las características hidráulicas.
4.4. Diagramas de flujo
civ
i= 1, hasta i = nST, i = i+1
Zsi Cota tiranteArea, Perímetro GetAreaPerimeter * C .K GetConveyanceK * D . Beta GetCorrectionFactorBeta * E Zlower Cota mínima de la sección actual. Zupper Zsi Valor superior. Datos Geométricos de la sección transversal: BL Vértice llanura izquierda. BR Vértice llanura derecha. nL Coeficiente de Manning llanura izquierda. nC Coeficiente de Manning canal central. nR Coeficiente de Manning llanura derecha. LL Longitud por la llanura izquierda. LC Longitud por el canal central. LR Longitud por la llanura derecha. CC Coeficiente de contracción. CE Coeficiente de expansión. Cálculo método de Bisección * F Reasignar valores: Beta Cálculos Beta Area Cálculos Area Zsi Cálculos ZsiK Cálculos K
FIN CONDICIÓN AGUAS ARRIBA
Niveles de la superficie libre de agua y las características hidráulicas.
(B) INICIO CONDICIÓN AGUAS ARRIBA
4.4. Diagramas de flujo
cv
V F
V F
(C) INICIO GETAREAPERIMETER
Cota Tirante, Vértices de la sección transversal, BL, BR.
Inundación vértice derecho = falso. Inundación vértice izquierdo = falso.
Cota Tirante > PrimerVértice[Y]
Incrementar un vértice inicial con coordenadas: X = PrimerVértice[X]. Y = Cota Tirante. Inundación vértice izquierdo = verdadero.
Cota Tirante > PrimerVértice[Y]
Incrementar un vértice Final con coordenadas: X = ÚltimoVértice[X]. Y = Cota Tirante. Inundación vértice derecho = verdadero.
1
4.4. Diagramas de flujo
cvi
V F
... 1
Area (m2), Perímetro (m)
j = 1, hasta N° de Vértices, j= j+1
Cota Tirante <= Vertices[j].y
Y = Cota Tirante
Condición = Verdadero
Condición = Verdadero
∑
J = J+1
Vertices[j+1].y >= Cota Tirante
Vertices[j+1].y < Cota Tirante
Condición = Verdadero Condición = Falso
V
F
V F
V F
FIN GETAREAPERIMETER
4.4. Diagramas de flujo
cvii
(D) INICIO GETCONVEYANCEK
ALF = Área llanura izquierda. AMC = Área Canal Central. ALR = Área llanura derecha. PLF = Perímetro llanura izquierda. PMC = Perímetro Canal Central. PLR = Perímetro llanura derecha. nLF = Coeficiente de Manning llanura izquierda. nMC = Coeficiente de Manning Canal Central. nLR = Coeficiente de Manning llanura derecha. KLF = KMC = KRF = 0.0
PLF != 0.0
/
/
PMC != 0.0
/
/
PRF != 0.0
/
/
K = KLF + KMC + KRF
FIN GETCONVEYANCEK
V
V
V
F
F
F
4.4. Diagramas de flujo
cviii
(E) INICIO GETCORRECTIONFACTORBETA
ALF != 0.0
BetaLF
AMC != 0.0
ARF != 0.0
β' BetaLF BetaMC BetaRF
FIN GETCORRECTIONFACTORBETA
ALF = Área llanura izquierda. AMC = Área Canal Central. ALR = Área llanura derecha. KLF = Perímetro llanura izquierda. KMC = Perímetro Canal Central. KLR = Perímetro llanura derecha. K = KLF+KMC+KRF A = ALF+AMC+ARF BetaLF = 0.0 BetaMC = 0.0 BetaRF = 0.0
BetaMC
BetaRF
F
F
F
V
V
V
4.4. Diagramas de flujo
cix
(F) INICIO MÉTODO DE BISECCIÓN
Zlower = Extremo valor inferior. Zupper = Extremo valor superior. Variables hidráulicas. NoEncontrado = verdadero
NoEncontrado = Verdadero
Area, Perímetro GetAreaPerimeter * C .K GetConveyanceK * D . Beta GetCorrectionFactorBeta * EFmiddle FuncionF * G
V
F
Abs(Fmiddle) < TOL V
Nivel = Zmiddle NoEncontrado = falso
F
Abs(Fmiddle) < TOL V
Zupper = Zmiddle
F
Zlower = Zmiddle
Abs(Zupper ‐Zlower) < TOL
V
NoEncontrado = falso
Niveles de superficie libre Variables Hidráulicas
FIN MÉTODO DE BISECCIÓN
Flower FuncionFFupper FuncionF
F
4.4. Diagramas de flujo
cx
(G) INICIO FUNCIÓNF
2 2 , ,∆ /
2| | | |
Bi1 = Factor de Correción Beta en la estación i+1. Bi = Factor de Correción Beta en la estación i. Qi1 = Descarga del flujo en la estación i+1. Qi = Descarga del flujo en la estación i Ai1 = Area de la sección transversal en la estación i+1. Ai = Area de la sección transversal en la estación i. Zi1 = Cota del nivel de agua en la estación i+1. (valor a encontrar) Zi = Cota del nivel de agua en la estación i. hfi12 = Pérdida por fricción en el tramo i+1/2. hci12 = Pérdida Local en el tramo i+1/2.
F
FIN FUNCIÓNF
4.4. Diagramas de flujo
cxi
Capıtulo 5
SOCAVACION EN RIOS Y
DIAGRAMAS DE FLUJO
5.1. Introduccion
El fenomeno de la socavacion en cauces naturales, ocurre generalmente en presencia de las
maximas avenidas (Max Flood), produciendo alteraciones de la geometrıa de las secciones
transversales tanto en el fondo como en las riberas del cauce. El programa PLEDER, para
determinar la socavacion general utiliza el criterio propuesto por Lischtvan-Lebeviev, para
el cual es necesario conocer las clasificaciones de los cauces de los rıos y de los materiales
que estos lo conforman.
5.2. Clasificacion de los Rıos
Se clasifica en cauce principal definido y cauce principal indefinido.
cxii
5.2. Clasificacion de los Rıos
5.2.1. Cauce principal definido
Se trata de cauces con tres elementos bien definidos, canal principal (main channel),
llanura de inundacion izquierda (Left Floodplain), llanura de inundacion derecha (Right
Floodplain).
Figura 5.1: Seccion transversal en cauce principal definido
En periodos de estiaje, las llanuras de inundacion en muchas ocasiones suelen estar cu-
biertas de vegetacion o arbustos de pequena estatura. El canal principal es por lo general
estable y algo profundo entres las llanuras.
5.2.2. Cauce principal indefinido
Este cauce es cuando existe una superficie casi plana donde el rıo escurre por varias partes
al mismo tiempo.
Figura 5.2: Seccion transversal en cauce principal indefinido
cxiii
5.3. Socavacion General en cauces definidos
En muchos casos se tiene aguas estancadas debido al cambio en el caudal y a la topografıa
del cauce.
5.3. Socavacion General en cauces definidos
El criterio de erosion es producto del incremento del caudal del flujo (mayor velocidad,
siempre en cuando se mantiene el area de la seccion transversal mojada), aumentando la
capacidad de arrastre de la corriente, con la que se inicia a degradar el material de fondo
(generalmente en la lınea de thalweg). Ahora, al descender el fondo, aumenta gradualmente
el area hidraulica, donde se reduce paulatinamente el valor medio de la velocidad de la
corriente y por ende la capacidad de arrastre, hasta el momento en que se alcanza un
estado de equilibrio.
Este equilibrio, existe cuando son iguales la velocidad media real de la corriente Ur, y
la velocidad media que se requiere para que un material de caracterısticas dadas sea
arrastrado Ue.
La velocidad Ur, esta dada en funcion de las caracterısticas hidraulicas del cauce (pen-
diente, tirante, flujo, rugosidad, etc.). Con respecto a la velocidad Ue esta en funcion de
las caracterısticas del material del fondo y del tirante del flujo. Para valuarla, las caracte-
rısticas representativas que se toman en cuenta tratandose de material no cohesivo, es el
diametro medio dm. No se considera el peso especıfico, ya que se supone que para todas
las arenas y gravas una densidad uniforme. Si el suelo es cohesivo, se toma en cuenta el
peso especıfico del material seco.
5.3.1. Socavacion General para Suelos Cohesivos
La magnitud de la erosion es suelos limosos y arcillosos dependen principalmente del peso
volumetrico del suelo seco. El valor de la velocidad media que se requiere para degradar
cxiv
5.3. Socavacion General en cauces definidos
el fondo esta dado por la ecuacion.
Ue = 0,60γ1,18s ϕHX
s (5.3.1)
Donde:
Hs: Tirante considerado a cuya profundidad se desea conocer que valor de Ue se requiere
para arrastrar y levantar el material.
X: Exponente variable esta en funcion del γs, el cual se encuentra en el cuadro 5.2. Se
indica el valor del coeficiente X.
ϕ: Coeficiente de paso, que depende de la frecuencia con que se repite la avenida que se
estudia y cuyo valor se dan en en cuadro 5.1.
γs: Peso volumetrico del material seco que se encuentra a la profundidad Hs(ton/m3)
Cuadro 5.1: Valores del coeficiente ϕ
Probabilidad en %,que se presente Coeficiente ϕ
el gasto de diseno100 0.7750 0.8220 0.8610 0.905 0.942 0.971 1.00
0.3 1.030.2 1.050.1 1.07
cxv
5.3. Socavacion General en cauces definidos
Cuadro 5.2: Valores de X , para suelos cohesivos y no cohesivos
SUELOS COHESIVOS SUELOS NO COHESIVOSγs X dm X
0.80 0.52 0.05 0.430.83 0.51 0.15 0.420.86 0.50 0.50 0.410.88 0.49 1.00 0.400.90 0.48 1.50 0.390.93 0.47 2.50 0.380.96 0.46 4.00 0.370.98 0.45 6.00 0.361.00 0.44 8.00 0.351.04 0.43 10.00 0.341.08 0.42 15.00 0.331.12 0.41 20.00 0.321.16 0.40 25.00 0.311.20 0.39 40.00 0.301.24 0.38 60.00 0.291.28 0.37 90.00 0.281.34 0.36 140.00 0.271.40 0.35 190.00 0.261.46 0.34 250.00 0.251.52 0.33 310.00 0.241.58 0.32 370.00 0.231.64 0.31 450.00 0.221.71 0.30 570.00 0.211.80 0.29 750.00 0.201.89 0.28 1000.00 0.192.00 0.27
La variacion de la velocidad media Ur de la corriente en funcion de la profundidad y para
cada punto de la seccion transversal, puede ser obtenida analizando una franja vertical.
La hipotesis que se formula para realizar el calculo es que el gasto unitario es cada franja
permanece constante mientras dura el proceso de erosion.
Donde:
B, representa el ancho de la superficie, H0 tirante en el punto P antes de la erosion, Hs
tirante supuesto, para el cual se desea conocer el muevo valor de la velocidad, P punto
cxvi
5.3. Socavacion General en cauces definidos
Figura 5.3: Seccion transversal, Socavacion general
cualquiera, en el cual se desea conocer el cambio de velocidad al aumentar el tirante.
Ecuaciones para la socavacion general
Desde la franja considera en la figura 5.3 con espesor ∆B, el caudal del flujo que pasa por
esta seccion esta dada segun la ecuacion de Manning.
∆Q = U∆A =1
nS
1/2f H
5/30 ∆B (5.3.2)
Donde para H0 =Hj+Hj+1
2
Figura 5.4: Franja en estudio para la socavacion
Algunos textos para simplificar operaciones, asumen en las secciones transversales como
rectangulares o trapezoidales, de tal forma que el area del flujo es el ancho de la superficie
por una altura media. Estos criterios son manejados debido a las geometrıas complejas
que se presentan en los cauces naturales.
cxvii
5.3. Socavacion General en cauces definidos
A continuacion se muestra las ecuaciones sin alterar estas caracterısticas, por lo tanto:
Q =µ
nS
1/2f A5/3P−2/3 (5.3.3)
Donde:
µ, es el coeficiente de contraccion por las turbulencias que se presentan. A, es el area total
del flujo en la seccion transversal. P , perımetro total de la seccion transversal.
De las ecuaciones 5.3.2 y 5.3.3 se tiene.
S1/2f
n=QP 2/3
µA5/3(5.3.4)
De las ecuaciones 5.3.4 y 5.3.2, se tiene
∆Q =S
1/2f
nH
5/30 ∆B =
QP 2/3
µA5/3H
5/30 ∆B
∆Q =QP 2/3H
5/30 ∆B
µA5/3(5.3.5)
De la figura 5.4 en la franja en estudio, al incrementarse H0 y al alcanzar un valor cual-
quiera Hs, la velocidad disminuye a un nuevo valor Ur. El caudal del flujo ∆Q en la
misma franja, esta en funcion (directamente proporcional) de esta velocidad y el tirante
se expresa por:
∆Q = UrHs∆B (5.3.6)
igualando la ecuacion 5.3.5 y 5.3.6
cxviii
5.3. Socavacion General en cauces definidos
QP 2/3H5/30 ∆B
µA5/3= UrHs∆B (5.3.7)
Donde se tiene:
Ur =QP 2/3H
5/30
µA5/3Hs
(5.3.8)
Lo que indica que la erosion se detendra cuando a una profundidad cualquiera alcanzada,
el valor de Ur, velocidad de la corriente capaz de producir arrastre, y Ue, velocidad que
se necesita para que el fondo se degrade sean iguales (Condicion de equilibrio).
Ue = Ur (5.3.9)
Por lo tanto
0,60γ1,18s ϕHX
s =QP 2/3H
5/30
µA5/3Hs
H1+Xs =
QP 2/3H5/30
0,60ϕµA5/3γ1,18s
Hs =
(QP 2/3H
5/30
0,60ϕµA5/3γ1,18s
) 11+X
(5.3.10)
Esta ecuacion 5.3.10, cumple para suelos Homogeneos.
5.3.2. Socavacion General para Suelos No Cohesivos
El fenomeno fısico es el mismo para estos tipos de suelos (granos sueltos, arena, gravas,
etc), manteniendo la misma formula para la velocidad real, lo que sı cambia es la velocidad
media que se requiere para degradar el fondo Ue
Ue = 0,68ϕd0,28m HX
s (5.3.11)
cxix
5.3. Socavacion General en cauces definidos
Donde:
dm, diametro medio de los granos del fondo, obtenidos segun la expresion (mm).
dm = 0,01∑
(diPi) (5.3.12)
Donde:
di, diametro de una fraccion en una curva granulometrica de la muestra total que se analiza
(mm). Pi, porcentaje del peso de esta misma porcion, comparada con el peso total de la
muestra. Las fracciones escogidas no deben ser necesariamente iguales entre sı.
Usando el mismo criterio de equilibrio de velocidades Ue = Ur, se tiene:
0,68ϕd0,28m HX
s =QP 2/3H
5/30
µA5/3Hs
H1+Xs =
QP 2/3H5/30
0,68ϕµA5/3d0,28m
Hs =
(QP 2/3H
5/30
0,68ϕµA5/3d0,28m
) 11+X
(5.3.13)
cxx
5.4. Diagramas de flujo
5.4. Diagramas de flujo
Diagrama de flujo Calculo de la Socavacion General: El diagrama, corres-
ponde al calculo de la socavacion general mediante el metodo de Lischtvan-Lebeviev
para cada seccion transversal considerado. Para calcular la socavacion general, es ne-
cesario como dato principal las caracterısticas fısicas del las secciones transversales
y las caracterısticas hidraulicas tales como el area hidraulica, perımetro mojado y el
caudal de diseno. Finalmente obtiene las coordenadas de la nueva seccion transversal
socavada y las alturas en cada vertice.
Diagrama de flujo Coeficiente X: El coeficiente X, es un dato importante que
se emplea en la solucion de la altura de socavacion en lecho cohesivo y no cohesivo
(ecuacion 5.3.10, 5.3.13). El diagrama, depende de dos tipos de materiales (cohesivo
y no cohesivo). Para el material cohesivos, como dato principal es el peso especıfico
del material ingresados en ton/m3 y para el material no cohesivo es el diametro medio
dm de las partıculas en mm. Para cada intervalo se realizo ajustes polinomicas, con
coeficientes de regresion muy aceptables (R2 = 0,99).
Diagrama de flujo Lischtvan-Lebeviev: Corresponde a las aplicacion directa
de las ecuaciones 5.3.10 y 5.3.13, dependiendo del tipo de material asignado en la
seccion transversal.
Los resultados son:
Graficos, (polilıneas) en casa una de las secciones transversales.
Tabulares, (tablas) altura de socavacion en cada vertice de la seccion transversal.
cxxi
i= 1, hasta i = nST, i = i+1
Niveles de la superficie libre de agua y las características hidráulicas.
Tipo de material. % de probabilidad de gasto. Cálculo del coeficiente X: CoeficienteX *(H) Cálculo socavación por LischtvanLebeviev : LischtvanLebeviev *(I)
INICIO CÁLCULO DE LA SOCAVACIÓN GENERAL
FIN CÁLCULO DE LA SOCAVACIÓN GENERAL
Altura de socavación de las secciones transversales
5.4. Diagramas de flujo
cxxii
(H) INICIO CÁLCULO DEL COEFICIENTE X
C = Material Cohesivos (Ton/m3) NC = Material No Cohesivos (mm)
Tipo de Material
Cohesivo No Cohesivo
1 2
FIN CÁLCULO DEL COEFICIENTE X
Valor del coeficiente X
J
5.4. Diagramas de flujo
cxxiii
0 < C < 0.80
0.8 ≤ C ≤ 2.00
X = Interpolación (C)
F
F
V
V
C > 2.00
J
FV
... 1
0.0973C 0.539 1.113 1.117
0.0973C 0.539 1.113 1.117
5.4. Diagramas de flujo
cxxiv
0 <NC < 0.05
0.43
0.05 ≤ NC ≤ 1000
X = Interpolación (NC)
F
F
V
V
NC > 1000
J
1.30 10 NC 2.44 10 0.304
FV
... 2
5.4. Diagramas de flujo
cxxv
(I) INICIO CÁLCULO SOCAVACIÓN LISCHTVANLEBEVIEV
Material Cohesivos Material No Cohesivos
Tipo de Material
Cohesivo No Cohesivo
/ /
0.60 / .
FIN CÁLCULO SOCAVACIÓN LISCHTVANLEBEVIEV
Niveles de socavación en cada vértice de la sección transversal
/ /
0.68 / .
5.4. Diagramas de flujo
cxxvi
Capıtulo 6
APLICACION PRACTICA DEL
PROGRAMA DESARROLLADO
6.1. Introduccion
La aplicacion practica hace referencia al proyecto Construccion de la Defensa Riberena
Rıo Huallaga-Huariaca en el estudio hidrologico - hidraulico e hidraulica fluvial, con el
objetivo de determinar los caudales de maximas avenidas para realizar los dimensiona-
mientos adecuados y optimos de la defensa riberena de la ciudad de Huariaca que se ubica
adyacente al Rıo Huallaga en 2.5 km.
El estudio Hidrologico, corresponde a determinar el caudal de maximas avenidas a partir
de datos de precipitacion maxima de 24 horas registrados en la estacion Yanahuanca,
latitud 10◦29’S, longitud 76◦30’W y altitud 3473 m.s.n.m., en el departamento de Pasco,
provincia Daniel A. Carrion y distrito Yanahuanca.
El estudio Hidraulico, concierne a transitar el caudal de diseno para un perıodo de re-
torno asignado, a traves de las 125 secciones transversales del cauce, espaciadas cada 20.0
metros en tramos longitudinales rectos a traves de la lınea thalweg. El transito del caudal
cxxvii
6.2. Descripcion General de Programa PLEDER
maximo determina encontrar el perfil de la superficie libre de agua, incluyendo parametros
hidraulicos de diseno en cada una de las secciones transversales, a partir de los cuales se
podra proyectarse eficientemente las estructuras hidraulicas de proteccion.
El estudio de Hidraulica Fluvial, permite determinar el ancho estable del cauce, transporte
de sedimentos, socavaciones generales.
Cada uno de estos componentes, seran llevados a cabo mediante el programa PLEDER,
obteniendo los resultados finales graficas y tabulares, que son necesarios para su interpre-
tacion.
6.2. Descripcion General de Programa PLEDER
El programa Lluvia Escorrentıa para Simulacion de Defensas Riberenas (PLEDER), reali-
za el proceso hidrologico, hidraulico e hidraulica fluvial, este ultimo abarca las socavaciones
generales de las secciones transversales, en el ambiente AutoCAD. PLEDER en su prime-
ra version contiene 13 commandos, 5 en el componente hidrologico, 6 en el componente
hidraulico y 2 comandos en hidraulica fluvial.
PLIILA: Componente Hidrologico, muestra la ventana para calcular Hietogramas
mediante el metodo IILA SENAMHI UNI.
Figura 6.1: Icono: PLIILA
PLNRCS: Componente Hidrologico, muestra la ventana para calcular Hietogramas
mediante el metodo NRCS.
cxxviii
6.2. Descripcion General de Programa PLEDER
Figura 6.2: Icono: PLNRCS
PLLLES: Componente Hidrologico, comando principal que muestra la ventana para
calcular la transformacion Lluvia - Escorrentıa.
Figura 6.3: Icono: PLLLES
PLCNC: Componente Hidrologico, comando alternativo para calcular el Numero
de Curva Compuesto.
Figura 6.4: Icono: PLCNC
PLHU: Componente Hidrologico, importar los datos de las coordenadas hidrograma
unitario [U ] y y pulso [P ], para realizar la convolucion discreta.
Figura 6.5: Icono: PLHU
PLHSTC: Componente Hidraulico, comando principal para crear y almacenar
los vertices de las secciones transversales, a partir de una polilınea. Median-
te este comando, el programa PLEDER, crear el objeto personalizado llamado
cxxix
6.2. Descripcion General de Programa PLEDER
CPLEDERCROSSSECTIONS , quien contiene la base de datos de los parametros
de ingreso en las secciones transversales.
Figura 6.6: Icono: PLHSTC
PLHCAL: Componente Hidraulico, calcula los parametros hidraulicos y los niveles
de la superficie libre, mediante el metodo del paso estandar en flujo permanente.
El comando crea el segundo objeto personalizado PLEDERHYDRAULICRESULT ,
donde los resultados se almacena en su base de datos.
Figura 6.7: Icono: PLHCAL
PLHPSL: Componente Hidraulico, plotea la superficie libre de agua en un punto
especificado por el usuario en coordenadas y escalas inalteradas. Este comando es
habilitado, una vez computado o calculado los niveles de las secciones transversales.
Figura 6.8: Icono: PLHPSL
PLHTST: Componente Hidraulico, comando alternativo y utilitario para realizar
informes de las secciones transversales en tablas editables y con opciones a ser ex-
portado a archivos con extension csv.
cxxx
6.2. Descripcion General de Programa PLEDER
Figura 6.9: Icono: PLHTST
PLHRES: Componente Hidraulico, muestra en un cuadro de dialogo los resultados
o parametros hidraulicos calculados en cada seccion transversal.
Figura 6.10: Icono: PLHRES
PLHDEL: Componente Hidraulico, elimina los niveles calculados en
las secciones transversales y la base de datos del objeto personalizado
PLEDERHYDRAULICRESULT .
Figura 6.11: Icono: PLHDEL
PLHSOC: Componente Hidraulica Fluvial, este comando permite ingresar los datos
de las secciones transversales para calcular las socavaciones generales.
Figura 6.12: Icono: PLHSOC
PLHSCC: Componente Hidraulica Fluvial, comando principal para calcular las
socavaciones generales en las secciones transversales. Este comando plotea y muestra
los resultados tabulares de las socavaciones en cada una de las secciones.
cxxxi
6.3. Calculos y Resultados Hidrologicos
Figura 6.13: Icono: PLHSCC
PLEDER, organizada los comandos descritos dentro del AutoCAD en menus, toolbars y
paneles Ribbon. La opcion Ribbon se utiliza a partir de la version 2009, quien muestra
una mejor organizacion, visualizacion en los comandos personalizados.
Figura 6.14: PLEDER, paneles Ribbon
6.3. Calculos y Resultados Hidrologicos
De las informaciones cartograficas, pluviometrica de la zona de estudio, se determina el
caudal de maximas avenidas para diferentes perıodos de retorno, considerando para este
caso los hietogramas sinteticos elaborados por el NRCS en la curva tipo II.
Los datos de la cuenca se resume en la tabla 6.1, ası tambien se adjunta en el apendice E
la cartografıa, red topologica, altitud y el perfil longitudinal del cauce principal.
Cuadro 6.1: Datos de la cuenca principal
Descripcion Medida
Area de la cuenca 581.587 km2.Perımetro de la cuenca 128.713 km.Longitud del cauce 47.110 km.Cota mas baja 2970.000 m.s.n.m.Cota mas alta 4500.000 m.s.n.m.Tiempo de Concentracion 289.350 min
cxxxii
6.3. Calculos y Resultados Hidrologicos
Mediante el comando PLLLES o el ıcono de la figura 6.3, muestra el interfaz grafico para
calcular la transformacion de lluvia - escorrentıa. Contiene 3 parametros importantes de
ingreso:
6.3.1. Parametro Cuenca [U]
Parametro Cuenca [U] corresponde a la obtencion de las coordenadas del hidrograma
unitario, mediante las caracterısticas fısicas de la cuenca y el tipo del hidrograma unitario
sintetico (hidrograma unitario NRCS e hidrograma unitario Snyder).
Figura 6.15: PLEDER, datos Transformacion Lluvia Escorrentıa
Dentro de este parametro, PLEDER presenta utilitarios tales como el calcular las areas
mediante polilıneas cerradas, distancias longitudinales, puntos de referencia en coordena-
das UTM, dentro del ambiente AutoCAD.
cxxxiii
6.3. Calculos y Resultados Hidrologicos
Figura 6.16: PLEDER, area desde una polilınea
El programa contiene una herramienta para calcular en Numero de Curva Compuesto
(expuestos en el capitulo 2), que en una mayorıa de las cuencas la uniformidad de la
vegetacion o tipo de suelo no se presenta en su totalidad, por lo tanto, la subdivision de
las cuencas con las mismas caracterısticas son necesarios para ponderar y obtener este
valor compuesto.
Figura 6.17: PLEDER, curva Numero Compuesto
cxxxiv
6.3. Calculos y Resultados Hidrologicos
La sumatoria de las areas tiene que ser igual al area de la cuenca. En la figura 6.17,
PLEDER presenta hasta 6 subdivisiones para calcular La Curva numero Compuesto.
En la presente aplicacion se usa el hidrograma unitario sintetico NRCS, cuyos datos son el
area de la cuenca y el tiempo de retardo que esta en funcion al tiempo de concentracion de
la cuenca. La Figura 6.18 muestra el calculo de tiempo de retardo, bajo dato o resultado
del tiempo de concentracion. El tiempo de concentracion se puede calcular mediante la
formula de Kirpich o tambien este valor lo puede asignar directamente el usuario. Por lo
tanto, cabe resaltar que el tiempo de concentracion viene a ser resultado, si es calculado
mediante la formula de Kirpich y por otro lado es dato si es asignado por el usuario.
Figura 6.18: PLEDER, calculo del tiempo de retardo
6.3.2. Parametro Precipitacion [P]
Corresponde a asignar el modelo meteorologico (Tormenta NRCS, IILA SENAMHI).
El modelo meteorologico elegido es la tormenta NRCS, tal como se muestra en la figura
6.19, donde la distribucion de tormenta es el tipo II en intervalos de una hora (60 minutos),
con un precipitacion maxima de 24 horas igual a 64.54 mm, calculados para un perıodo
de retorno de 100 anos y ajustando a una distribucion probabilıstica de Gumbel para un
95 % de probabilidad (Smirnov-Kolmogorov).
cxxxv
6.3. Calculos y Resultados Hidrologicos
Figura 6.19: PLEDER, modelo meteorologico NRCS
6.3.3. Parametro Tiempo [T]
Es el intervalo de tiempo para calcular lluvia escorrentıa. Esta opcion indica el incremento
de tiempo para que el programa tenga que realizar los calculos cada 10 minutos segun la
figura 6.15.
El programa controla los posible errores de entrada de los datos ([U], [P] y [T]), especifi-
cando dentro de la consola del AutoCAD el tipo de error o el ingreso de dato incorrecto.
6.3.4. Hidrogramas de Salida
Mediante el boton aceptar y asignado el punto de referencia para los resultados, proce-
demos a calcular el hidrograma de salida y el caudal maximo de diseno para los datos
ingresados. Las figuras 6.20, 6.21, 6.22 y 6.23 corresponden a los hidrogramas de salida
para los perıodos de retorno 50, 100, 200 y 500 respectivamente.
Los resultados de las coordenadas del hidrograma para los distintos perıodos de retorno
mencionados se adjunta en el apendice D.
cxxxvi
6.3. Calculos y Resultados Hidrologicos
Figura 6.20: Hidrograma TR = 50 anos
Figura 6.21: Hidrograma TR = 100 anos
cxxxvii
6.3. Calculos y Resultados Hidrologicos
Figura 6.22: Hidrograma TR = 200 anos
Figura 6.23: Hidrograma TR = 500 anos
cxxxviii
6.4. Calculos y Resultados Hidraulicos
6.4. Calculos y Resultados Hidraulicos
Esta seccion corresponde a transitar el caudal de diseno (QTR=100 = 340m3/s), para
determinar el perfil de la superficie libre de agua, los mismos en cada una de las secciones
transversales. En realidad el transito de caudales sera para los 4 perıodos de retorno
considerados en la determinacion de los hidrogramas.
Cuadro 6.2: Caudales maximos para diferentes Perıodos de Retorno
TR Caudal (m3/s)50 240.69100 339.23200 449.19500 609.92
La batimetrıa del proyecto viene a ser el dato mas importante y primordial para esta
seccion; con ella representamos el proyecto fısico a escala normal en un proyecto digital y
a escala conveniente para realizar todos los calculos correspondientes. El proyecto cuenta
con una batimetrıa minuciosa con densos puntos topograficos y sobre todo dirigidos con
propiedad y conocimientos hidraulicos durante el levantamiento.
Figura 6.24: Planta Rıo Huallaga
En la figura 6.24, muestra la planta del rıo Huallaga con las 125 secciones transversales dis-
tribuidos cada 20 metros en 2480 metros lineales del cauce. La estacion 0+00 corresponde
al puente Acobamba y la estacion 2 + 480 al centro poblado Yanacocha.
cxxxix
6.4. Calculos y Resultados Hidraulicos
6.4.1. Secciones Transversales
Mediante la opcion de las secciones transversales, se ingresan los datos fısicos del proyec-
to, tales como las coordenadas de los vertices que lo conforman, lımites de las llanuras de
inundacion, longitudes izquierda, central y derecha, coeficientes de Manning y los coefi-
cientes de contraccion y expansion; todo ello para cada una de las secciones transversales
del cauce.
El programa PLEDER, presenta opciones graficas muy eficientes para crear las secciones
transversales a partir de polilıneas, asignando los puntos de referencia tales como estacion,
elevacion y permitiendo calcular las coordenadas locales de cada uno de los vertices, tal
como se muestra en la figura 6.25.
Figura 6.25: PLEDER, secciones transversales
Quiza esta opcion de crear las secciones transversales, diferencia mucho de los programas
comerciales existentes en la actualidad, ya que estos programas dependen de otros para
cxl
6.4. Calculos y Resultados Hidraulicos
facilitar los datos que en este caso viene a ser los vertices locales de cada una de las
secciones transversales.
Figura 6.26: AutoCAD secciones transversales
Cada vertice es enumerado de izquierda a derecha, con el fin de almacenar en una matriz
ordenada, ademas elegir los lımites de inundacion izquierda derecha mediante la numera-
cion de los vertices.
En la figura 6.25, la ventana presenta multiples opciones y utilitarios de enlace grafico
con el ambiente AutoCAD, tales como calcular las distancias automaticas, selector de
polilıneas, puntos de referencia entre otros. Ası tambien, el boton Aplicar guarda los
parametros de la ventana actual, en la base de datos del objeto personalizado dentro del
AutoCAD. De esta manera se crea las 125 secciones transversales de la aplicacion, tal
como se muestra en los planos del apendice E.
6.4.2. Flujo Permanente
La ventana del grafico 6.27, muestra las opciones de los parametros de borde y la asig-
nacion del caudal de diseno para transitar el flujo a traves de las secciones transversales
cxli
6.4. Calculos y Resultados Hidraulicos
descritas anteriormente. Para la aplicacion se analiza como flujo subcrıtico, por la tanto
la opcion del tirante aguas abajo es habilitado.
Figura 6.27: PLEDER, calculo del flujo permanente
Los procedimiento para calcular los niveles de la superficie libre de agua se describe
mediante diagramas de flujo en el capıtulo 4, tanto para los flujo subcrıticos y supercrıticos.
6.4.3. Resultados y Perfil de superficie libre
Los resultados son presentados en ventanas independientes de programa AutoCAD y en el
mismo Autocad con opciones de exportacion a otros archivos. PLEDER, presenta dos tipos
de resultados, resultados numericos que son los parametros hidraulicos en cada uno de las
secciones transversales y los resultados graficos que viene a ser el perfil de la superficie
libre de agua a escala normal y los niveles en cada seccion transversal (figura 6.29). Para
el perfil, la cota de terreno es la cota mınima de la seccion transversal o en otros terminos
es cota de la lınea thalweg, por lo tanto para la construccion del perfil, la longitud del
canal central de las secciones es acumulado.
cxlii
6.4. Calculos y Resultados Hidraulicos
Figura 6.28: PLEDER, resultados-parametros hidraulicos
Figura 6.29: Niveles de superficie libre en las secciones transversales
cxliii
6.5. Calculos y Resultados de Socavaciones Generales
6.5. Calculos y Resultados de Socavaciones Genera-
les
Para calcular las socavaciones generales en las secciones transversales, es necesario conocer
el tipo de material (cohesivo y no cohesivo) y el coeficiente segun la probabilidad de
gasto. Para la aplicacion se realizo las curva granulometricas de los materiales incluyendo
cantos rodados y guijarros, de los cuales se obtuvo como resultados los diametro medios
aproximadamente 150 mm y 180 mm.
Es importante mencionar que el programa PLEDER, habilita la ventana de la figura 6.30,
solo si existe el objeto personalizado de los niveles de la superficie libre de agua dentro
del AutoCAD, es decir, si el calculos de los niveles fueron ejecutados.
Figura 6.30: PLEDER, parametros socavacion general
Una vez completado estos datos, se puede calcular las socavaciones mediante el ıcono de
la figura 6.13 o equivalente al comando PLHSCC, cuyos resultados son graficos (lınea
de la nueva seccion transversal socavada) y tabulares (nuevos vertices de las secciones
cxliv
6.5. Calculos y Resultados de Socavaciones Generales
transversales). Estos resultados son necesarios para estimar la profundidad de las cimen-
taciones de las estructuras hidraulicas o estructuras de proteccion ante avenidas maximas,
y siendo mas especıficos en la instalacion de gaviones y enrocados (riprap) representa la
profundidad del colchon reno y la profundidad de las unas respectivamente.
Figura 6.31: Socavaciones en las secciones transversales
cxlv
Capıtulo 7
CONCLUSIONES Y
RECOMENDACIONES
7.1. Conclusiones
La investigacion desarrollada en esta tesis ha llegado a las siguientes conclusiones :
1. Se ha elaborado un programa (PLEDER) que permite calcular los componentes
hidrologicos, hidraulicos e hidraulica fluvial, en un ambiente totalmente organizado,
amigable y sobre todo grafico (AutoCAD).
2. Las caracterısticas de la herramienta, permite disponer de diferentes comandos para
cada componente.
3. Importancia de la asignacion del Numero de Curva, dependiente del tipo o las ca-
racterısticas de suelo.
4. Para emplear el metodo de la convolucion discreta, el factor tiempo o intervalo de
tiempo, selecciona los pulso de entrada y salida mediante interpolaciones lineales.
El cual es determinante y se exige el buen criterio de su eleccion.
cxlvi
7.1. Conclusiones
5. Las precipitaciones acumuladas segun la ecuacion regional IILA SENAMHI muestra
un incremento tipo exponencial, que facilita el procedimiento del bloque alterno
propuesto por Ven Te Chow.
6. En las tormentas NRCS (Tipo II), las precipitaciones acumuladas no se ajustan
con exito (R2 → 1) a ninguna funcion conocida, ası se eleve el grado del polinomio
(aunque no siempre los resultados del ajuste son mejores a mayor grado polinomi-
co), lo que exige a realizar interpolaciones para obtener las ordenadas de diferentes
duraciones de tiempo.
7. Si C = dT→Variacion del tiempo en el hidrograma.dt→Variacion del tiempo en el hietograma.
≥ 1, se obtiene los Pulsos de ingreso di-
rectamente si C = 1 o en forma acumulativa si C > 1. Si C ≤ 1, se interpolan las
precipitaciones totales, y se obtienen las precipitaciones en exceso, donde la canti-
dad de elementos o variacion de tiempo en el hietograma sera siempre igual a la
variacion del tiempo en el hidrograma (C = 1).
8. En todo Hidrograma Unitarios Sintetico, un factor importante es el tiempo de re-
tardo de la cuenca drenante, definido como el tiempo desde el centro de gravedad
del hietograma de lluvia hasta el pico del hidrograma.
9. En el Hidrograma Unitario Sintetico de Snyder, la mejor manera de emplear estas
ecuaciones, es deducir valores de Ct y Cp, a partir de los hidrogramas unitarios de
cuencas medidas (cuencas instrumentadas) de caracterısticas similares a la cuenca
problema (cuenca no instrumentada).
10. Los perfiles de superficie libre de agua, determinan el dimensionamiento de las es-
tructuras hidraulicas de proteccion.
11. Las ecuaciones discretizadas para los calculos de los perfiles de la superficie libre de
agua, son ecuaciones no lineales, por lo tanto, se emplean tecnicas numericas tales
cxlvii
7.2. Recomendaciones
como el Metodo de la Secante (HECRAS), Newton Raphson (GSTAR), Metodo de
Biseccion (PLEDER) , entre otros.
12. La socavacion general en cauces naturales dependera mucho del tipo de material
que lo conforma en cada estacion del cauce, por lo general, se uniformiza en una
estacion.
13. Para calcular la socavacion general del cauce se necesita utilizar criterios prudentes,
ya que existe mucha incertidumbre involucrada en los modelos que se emplea.
7.2. Recomendaciones
1. Para componer artıculos cientıficos o la propia tesis, emplear programas de com-
posicion de textos tal como LATEX o similares, de modo que los textos presenten
alta calidad para publicaciones de todo tipo. Los documentos que producen tienen
una calidad inmejorable, equivalente a la obtenida con las mejores herramientas de
edicion profesionales.
2. Realizar librerıas o clases para las distintas aplicaciones ingenieriles en el lenguaje
de programacion C++, ası facilita los diversos procedimientos que en muchos casos
son repetitivos y de uso perenne.
3. Importancia en el empleo de la programacion y metodos numericos aplicados en
la ingenierıa. De preferencia usar programas orientado a objetos, generando clases
abstractas de lo que uno quiere automatizar o controlar con un programa.
cxlviii
Bibliografıa
[1] A. OSMAN AKAN. Open Channel Hydraulics. Elsevier Ltd, Oxford UK, 2006.
[2] FRANCISCO JAVIER APARACIO. Fundamentos de Hidrololıa de Superficie. Mi-
musa Noriega Editores Mexico,D.F., 2003.
[3] AUTODESK. ObjectARX Developer’s Guide. Autodesk Developer Center EEUU,
1999.
[4] JHON BIRD. Higher Engineering Mathematics. Elsevier Ltd, 2006.
[5] JOSE LUIS SANCHEZ BRIBIESCA. Doce algoritmos para resolver problemas de
hidraulica. Universidad Nacional Autonoma de Mexico, Agosto 1978.
[6] GARY W. BRUNNER. Hec-Ras River Analysis System User’s Manual. US Army
Corps of Engineers EEUU, 2001.
[7] JR C. R. WYLIE. Advanced Engineering Mathematics. McGraw-Hill, Inc. New york
USA, 1960.
[8] STEVEN C. CHAPRA RAYMOND P. CANALE. Metodos numericos para ingenie-
ros. McGraw-Hill Mexico, 1999.
[9] HUBERT CHANSON. Hidraulica del Flujo en Canales Abiertos. McGraw-Hill In-
teramericana, S.A., 2002.
cxlix
BIBLIOGRAFIA
[10] M. HANIF CHAUDHRY. Open - Channel Flow. Springer Science+Business Media,
LLC. New York, USA, 2008.
[11] CHOW, VENT T., MAIDMENT, D.R., and MAYS L. Hidrologıa Aplicada. Mac
Graw Hill Interamericana S.A. Santafe de Bogota, 1994.
[12] VENT TE CHOW. Hidraulica de canales abiertos. Mac Graw Hill Interamericana
S.A. Colombia, 2000.
[13] JAIME SUAREZ DIAS. Control de erosion en zonas tropicales. Instituto de Inves-
tigaciones sobre Erosion y Deslizamientos-Ingenierıa de suelos, Noviembre, 2001.
[14] ROSENDO CHAVEZ DIAS. Hidrologıa para Ingenieros. Fondo Editorial de la Pon-
tificia Universidad. Lima Peru, 1994.
[15] ANIL W. DATE. Introduction Computational Fluid Dynamics. Cambridge University
Press, 2005.
[16] RICHARD H. FRENCH. Hidraulica del Canales Abiertos. McGraw-Hill Interamerica
de Mexico, S.A. de C.V., 1988.
[17] F. M. HENDERSON. Open Channel Flow. Macmillan Publishing Co., Inc. New York
USA, 1966.
[18] CHARLES HIRSCH. Numerical Computation of Internal and External Flows. John
Wiley and Sons Ltd, 2007.
[19] IVOR HORTON. Beginning Visual C++ 2005. Wiley Publishing USA, 2006.
[20] JOEL ORE IWANAGA. Apuntes de clase hidrogıa general. Universidad Nacional
de San Cristobal de Huamanga, 2004.
[21] JOEL ORE IWANAGA. Apuntes de clase estructuras hidraulicas. Universidad Na-
cional de San Cristobal de Huamanga, Noviembre, 2006.
cl
BIBLIOGRAFIA
[22] PIERRE Y. JULIEN. Erosion and Sedimentation. Cambrigde University Press. USA,
1995.
[23] PIERRE Y. JULIEN. River Mechanics. Cambrigde University Press. USA, 2002.
[24] TSUTOMU KAMBE. Elementary Fluid Mechanics. World Scientidic Publishing,
2007.
[25] JAAN KIUSALAAS. Numerical Methods in Engineering with Matlab. Cambridge
University Press, 2005.
[26] NICHOLAS A. SOLTER-SCOTT J. KLEPER. Professional C++. Wiley Publishing
USA, 2005.
[27] ERWIN KREYSZIG. Advanced Engineering Mathematics. John Wiley & Sons, Inc.
USA, 2006.
[28] CUI-LEUNG LU, ZHANG. A numerical analysis of free surface flow in curved
open channel with velocity-pressure-free-surface correction. Computation Mechanics
Springer Verlag, 2003.
[29] M. MORENA G. GRANDE G. FERRANDEZ M. VIDE, L. QUEROL. Uso de
modelos uni-y bidimensionales en llanuras de inundacion, aplicacion del rıo tajo en
talavera de la reina. Ingenierıa del Agua Vol 10, Marzo 2003.
[30] HERON MORALES MARCHENA. Matlab, Metodos numericos y visualizacion gra-
fica. Editorial Megabyte Peru, 1999.
[31] ADRIAN ILINCA MARECELO REGGIO, ANDRE HESS. 3-d multiple-level si-
mulation of free surface flows. Journal of Hydraulic Research, Vol 40, December,
2002.
[32] ANTONIO CRESPO MARTINEZ. Mecanica de Fluidos. Thomson Editores, 2006.
cli
BIBLIOGRAFIA
[33] RICHARD H. McCUEN. Hydrologic Analysis and Design. Person Education, 1998.
[34] NATURAL RESOURSES CONSERVATION SERVICE (NRCS). Hydrology national
engineering hanbook, chapter 10, estimation of direct runoff from storm rainfall.
USDA-NRCS, July, 2004.
[35] JULIAN AGUIRRE PE. Hidraulica de Canales. CIDIAT. Merida, Venezuela, 1974.
[36] JOSE RAMON TEMEZ PELAEZ. Facetas del calculo hidrometeorologico y estadıs-
tico de maximos caudales. Revista de Obras Publicas, Febrero, 2003.
[37] VICTOR MIGUEL PONCE. Engineering Hydrology Principles and Practices. Pren-
tice Hall, 1989.
[38] CRISTIAN CASTRO PEREZ. Apuntes de clase programacion digital. Universidad
Nacional de San Cristobal de Huamanga, 2002.
[39] CRISTIAN CASTRO PEREZ. Apuntes de clase metodos numericos aplicados. Uni-
versidad Nacional de San Cristobal de Huamanga, Noviembre, 2003.
[40] JEFF PROSISE. Programming Windows with MFC. Microsoft Press USA, 1999.
[41] H. M. RAGHUNATH. Hydrology Principles Analysis Design. New Age International
Publishers, 2006.
[42] DAVID G. RHODES. Gradually varied flow solutions in newton raphson form. Jour-
nal of Irrigation and Drainage Engineering, July/August, 1998.
[43] LEO C. VAN RIJN. Principles of Sediment Transport in River Estuaries and Coastal
Seas. Aqua Publications. The Netherlands, 1993.
[44] DAVID HANSEN RIZWANUL BARL. Application of gradually-varied flow algo-
rithms to simulate buried streams. Journal of Hydraulic Research, Vol 40, April,
2002.
clii
BIBLIOGRAFIA
[45] MICHAEL SCHAFER. Computational Engineering-Introduction to Numerical Met-
hods. Springer-Verlag Berlin Heidelberg, 2006.
[46] DARLY B. SIMONS and FUAT SENTURK. Sediment Transport Technology. Water
Resources Publications. USA, 1976.
[47] BJARNE STROUSTRUP. The C++ Programming Language. Addisn Wesley USA,
1997.
[48] TERRY W. STURM. Open Channel Hydraulics. McGraw-Hill Books, 2001.
[49] K.T. TANG. Mathematical Methods for Engineers and Scientists. Springer-Verlag
Berlin Heidelberg. USA, 2007.
[50] JUAN P. MARTIN VIDE. Ingenierıa de Rıos. Alfa Omega Grupo Editor S.A. de
C.A. Mexico, 2003.
[51] FRANK M. WHITE. Mecanica de Fluidos. McGraw-Hill Interamericana de Espana,
S.A.U., 2003.
[52] YORICK HARDY WILLI HANS STEEB. Problems and Solutions in Scientific Com-
puting with C++ and Java simulations. World Scientific Publishing Co. Pte Ltd,
2004.
[53] WEIMING WU. Computational River Dynamics. Taylor & Francis Group, London,
UK, 2008.
[54] CHIH TED YANG. Sediment Transport theory of practice. The McGraw-Hill Com-
panies, Inc, USA, 1996.
cliii
Apendice A
HIDROLOGIA CODIGO FUENTE
C++
EL componente Hidrologico se organiza en 10 librerıas con multiples funciones y 07 ven-
tanas graficas
cliv
ARCHIVOS DE CABECERA: PLEDERCurvaNumeroDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERCurvaNumeroDlg class CPLEDERCurvaNumeroDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERCurvaNumeroDlg) public: CPLEDERCurvaNumeroDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERCurvaNumeroDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_PLCN }; //Declaramos variables del cuadro de diálogo. // Cajas de texto CAcUiNumericEdit m_Edit_AREA1; CString m_a1; CAcUiNumericEdit m_Edit_CN1; CString m_cn1; CAcUiNumericEdit m_Edit_AREA2; CString m_a2; CAcUiNumericEdit m_Edit_CN2; CString m_cn2; CAcUiNumericEdit m_Edit_AREA3; CString m_a3; CAcUiNumericEdit m_Edit_CN3; CString m_cn3; CAcUiNumericEdit m_Edit_AREA4; CString m_a4; CAcUiNumericEdit m_Edit_CN4; CString m_cn4; CAcUiNumericEdit m_Edit_AREA5; CString m_a5; CAcUiNumericEdit m_Edit_CN5; CString m_cn5; CAcUiNumericEdit m_Edit_AREA6; CString m_a6; CAcUiNumericEdit m_Edit_CN6; CString m_cn6; CAcUiNumericEdit m_Edit_CNC;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clv
CString m_cnc; protected: virtual void DoDataExchange(CDataExchange* pDX); afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; // Cajas de texto para controlar mensajes afx_msg void OnKillfocusEdit_AREA1(); afx_msg void OnKillfocusEdit_AREA2(); afx_msg void OnKillfocusEdit_AREA3(); afx_msg void OnKillfocusEdit_AREA4(); afx_msg void OnKillfocusEdit_AREA5(); afx_msg void OnKillfocusEdit_AREA6(); afx_msg void OnKillfocusEdit_CN1(); afx_msg void OnKillfocusEdit_CN2(); afx_msg void OnKillfocusEdit_CN3(); afx_msg void OnKillfocusEdit_CN4(); afx_msg void OnKillfocusEdit_CN5(); afx_msg void OnKillfocusEdit_CN6(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); // Funciones de los botones en el cuadro de diálogo virtual void onCALCLimpiar(); virtual void onCALCCalcularCNC(); DECLARE_MESSAGE_MAP() };
PLEDERHidrogramaUnitariosDlg.h #pragma once #include "adui.h" #include "resource.h" // Cuadro de diálogo de CPLEDERHidrogramaUnitariosDlg class CPLEDERHidrogramaUnitariosDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERHidrogramaUnitariosDlg) public: CPLEDERHidrogramaUnitariosDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERHidrogramaUnitariosDlg(); enum { IDD = IDD_PLHU }; protected: virtual void DoDataExchange(CDataExchange* pDX); afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; //Botones afx_msg void OnButtonImportarHU(); afx_msg void OnButtonImportarPulsos(); public: virtual BOOL OnInitDialog();
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clvi
afx_msg void OnBnClickedOk(); DECLARE_MESSAGE_MAP() }; PLEDERHidrologiaBufer.h #pragma once //Clases Bufer para hidrologia class HidrogramaUnitarioBufer { public: HidrogramaUnitarioBufer(); HidrogramaUnitarioBufer (int n, double HU, double PULSO); public: HidrogramaUnitarioBufer *ObtenerSiguiente(); void PonerSiguiente(HidrogramaUnitarioBufer *p); virtual ~HidrogramaUnitarioBufer(); public: HidrogramaUnitarioBufer *Siguiente; int n; double HU, PULSO; }; PLEDERHidrologiaCalculos.h #pragma once class CPLEDERHidrologiaCalculos {
public: CPLEDERHidrologiaCalculos(void); public: ~CPLEDERHidrologiaCalculos(void); public: // Calcula las precipitaciones acumulas, incrementales y alternas según IILA SENAMHI-UNI. float HietogramaIILA(int N, float a, float b, float k, float n, float dt, float var, float Tr, float* D, float* Pacum, float* Pincr, float* Palte); // Calcula las precipitaciones acumulas, incrementales y alternas según NRCS. float HietogramaNRCS(float P24, float Ndt, int Tormenta, float* ND, float* TipoT, float* NPacum, float* NPincr); // Calcula las abstracciones y el hietograma de exceso según NRCS. float AbstraccionesHietogramaNRCS(int NP,int CN, float* Palt, float* Pacum, float* Ia, float* Fa, float* PexcesoAcum, float* Pexceso); // Cálculo los Pulsos de ingreso.
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clvii
float PulsosP(int NP, int DT, int dt, float* Pexceso, float* Pulsos, int *nP); // Cálculos mediante la convolución discreta Q = PU. int Convolucion(int nP, int nU, float *P, float *U, float *Q);
}; PLEDERHidrologiaDatos.h #pragma once #define PUNFILEEXTHU _T("hu;abia;txt") #define DCEXP 3 #define GETLINEMAXBUFF 1024 #define PUNFILESEP " ,\t\n" class HidrogramaUnitarioBufer; /*------------------------------------------------------------------*/ class CPLEDERHidrologiaDatos { public: CPLEDERHidrologiaDatos(void); public: ~CPLEDERHidrologiaDatos(void); public: // Cálculo de la escorrentía directa, de datos HU versus pulsos int EscorrentiaDirecta1(HidrogramaUnitarioBufer *pPrimerHU); // Importar las ordenadas del Hidrolograma Unitario
int ImportarHidrogramaUnitario(const TCHAR *pNombreArchivo,long *NumeroVertHU);
// Datos de la distribución de Tormentas según el NRCS. float TormentasNRCS(int Tormenta, float *TipoT, float Ndt); // Datos Hidrograma Sintético NRCS. float HidrogramaSinteticoNRCS(float Tp, float qp,float *t, float *q); // Datos Hidrograma Sintético SNYDER float HidrogramaSinteticoSnyder(float T ,float tR, float tpR, float tb, float QpR, float W50, float W75); //Libera el buffer en ristra HU void LiberarBufferHidrogramaUnitario(); public: HidrogramaUnitarioBufer* pPrimerHU; //Puntero primer elemento HU. a la clase HidrogramaUnitarioBufer. public: // Variables HU
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clviii
float *P, // Lista de Pulsos. *U, // Lista de Función respuesta al Pulso. *Q; // Lista de Caudal de escorrentia directa (SALIDA) }; /*------------------------------------------------------------------*/ PLEDERHietogramaIilaSenamhiDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERIilaSenamhiDlg class CPLEDERIilaSenamhiDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERIilaSenamhiDlg) public: CPLEDERIilaSenamhiDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERIilaSenamhiDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_IILA }; //Declaramos variables del cuadro de diálogo. CAcUiNumericEdit m_Edit_a; CString m_a; CAcUiNumericEdit m_Edit_k; CString m_k; CAcUiNumericEdit m_Edit_n; CString m_n; CAcUiNumericEdit m_Edit_duracion; CString m_duracion; CAcUiNumericEdit m_Edit_tr; CString m_tr; CAcUiNumericEdit m_Edit_PX; CString m_PX; CAcUiNumericEdit m_Edit_PY; CString m_PY; // Combo Box CComboBox m_Combo_b; CString m_b; CComboBox m_Combo_Var; CString m_variacion;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clix
// Botones CAcUiPickButton m_PickButton_PUNTO; protected: virtual void DoDataExchange(CDataExchange* pDX); afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnKillfocusEdit_a(); afx_msg void OnKillfocusEdit_k(); afx_msg void OnKillfocusEdit_n(); afx_msg void OnKillfocusEdit_duracion(); afx_msg void OnKillfocusEdit_tr(); afx_msg void OnKillfocusCombob(); afx_msg void OnKillfocusComboVar(); afx_msg void OnButtonPUNTO(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); DECLARE_MESSAGE_MAP() }; PLEDERHietogramaNrcsDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERNRCSDlg class CPLEDERNrcsDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERNrcsDlg) public:
CPLEDERNrcsDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar
virtual ~CPLEDERNrcsDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_NRCS }; //Declaramos variables del cuadro de diálogo. CAcUiNumericEdit m_Edit_P24; CString m_P24; CAcUiNumericEdit m_Edit_NPX; CString m_NPX; CAcUiNumericEdit m_Edit_NPY; CString m_NPY; // Combo Box CComboBox m_Combo_Ndt; CString m_Ndt; CComboBox m_Combo_Tormenta;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clx
CString m_Tipo; int m_Tormenta; //Botones CAcUiPickButton m_PickButton_NPUNTO; protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnKillfocusEdit_P24(); afx_msg void OnKillfocusComboNdt(); afx_msg void OnKillfocusComboTormenta(); afx_msg void OnButtonNPUNTO(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); DECLARE_MESSAGE_MAP() }; PLEDERHUNRCSDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERTiempoRetrasoDlg class CPLEDERHUNRCSDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERHUNRCSDlg) public: CPLEDERHUNRCSDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERHUNRCSDlg();
// Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_HUNRCS }; int m_TipoTc; // Cajas de texto CAcUiNumericEdit m_Edit_long; CString m_long; CAcUiNumericEdit m_Edit_pend; CString m_pend; CAcUiNumericEdit m_Edit_tc; CString m_tc; CAcUiNumericEdit m_Edit_tlag1; CString m_tlag1;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxi
// Botones (CAD) CAcUiPickButton m_PickButton_Long; CAcUiPickButton m_PickButton_Pend; protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; // Radio (Cuando existan cambios en el radio) afx_msg void OnRadioKirpich(); afx_msg void OnRadioUsuario(); // Cajas de texto afx_msg void OnKillfocusEdit_long(); afx_msg void OnKillfocusEdit_pend(); afx_msg void OnKillfocusEdit_tc(); // Botones afx_msg void OnButtonLong(); afx_msg void OnButtonPend(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); // Funciones para realizar cálculos. virtual void onCalcularTc(); virtual void onCalcularTlag(); DECLARE_MESSAGE_MAP() }; PLEDERHUSnyderDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERHUSNYDERDlg class CPLEDERHUSNYDERDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERHUSNYDERDlg) public: CPLEDERHUSNYDERDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERHUSNYDERDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_HUSNYDER }; int m_TipoCalc; // Cajas de texto CAcUiNumericEdit m_Edit_Area; CString m_area; CAcUiNumericEdit m_Edit_L; CString m_L;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxii
CAcUiNumericEdit m_Edit_Lc; CString m_Lc; CAcUiNumericEdit m_Edit_TR; CString m_TR; CAcUiNumericEdit m_Edit_TpR; CString m_TpR; CAcUiNumericEdit m_Edit_Qp; CString m_Qp; CAcUiNumericEdit m_Edit_Ct; CString m_Ct; CAcUiNumericEdit m_Edit_tp; CString m_tp; CAcUiNumericEdit m_Edit_Cp; CString m_Cp; protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; // Radio (Cuando existan cambios en el radio) afx_msg void OnRadioCalcularC(); afx_msg void OnRadioUsuarioC(); // Cajas de texto afx_msg void OnKillfocusEdit_Area(); afx_msg void OnKillfocusEdit_L(); afx_msg void OnKillfocusEdit_Lc(); afx_msg void OnKillfocusEdit_TR(); afx_msg void OnKillfocusEdit_TpR(); afx_msg void OnKillfocusEdit_Qp(); afx_msg void OnKillfocusEdit_Ct(); afx_msg void OnKillfocusEdit_tp(); afx_msg void OnKillfocusEdit_Cp(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); // Funciones para realizar cálculos. virtual void onCalcularCtCp(); virtual void onMensajesCp(); DECLARE_MESSAGE_MAP() }; PLEDERLluviaEscorrentiaDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERLluviaEscorrentiaDlg
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxiii
class CPLEDERLluviaEscorrentiaDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERLluviaEscorrentiaDlg) public: CPLEDERLluviaEscorrentiaDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL); // Constructor estándar virtual ~CPLEDERLluviaEscorrentiaDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRO_HPLEDER }; //Declaramos variables del cuadro de diálogo. // Cajas de texto CAcUiNumericEdit m_Edit_AREA; CString m_area; CAcUiNumericEdit m_Edit_QB; CString m_qb; CAcUiNumericEdit m_Edit_CN; CString m_cn; CAcUiNumericEdit m_Edit_PPX; CString m_ppx; CAcUiNumericEdit m_Edit_PPY; CString m_ppy; // Combo Box CComboBox m_Combo_HUS; int m_hus; CComboBox m_Combo_MM; int m_mm; CComboBox m_Combo_INTERT; CString m_intert; // Botones (Sólo CAD) CAcUiPickButton m_PickButton_AREA; CAcUiPickButton m_PickButton_PPUNTO; // Botones (Dialogo general) CButton m_Button_HUS; // Variables extras de cálculos int pNP, // Número de datos en la lista de precipitaciones. Duracion; // Variación de tiempo de las precipitaciones
float Palternaincremental[1441]; // Lista de precipitaciones alternas o incrementales. float PaltAcum[1441];// Lista de precipitaciones alternas acumuladas
float Tretardo; // Tiempo de retardo. datos HUS NRCS float tp, Cp; // Coeficientes tp, Cp, SNYDER
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxiv
bool computadoMM; // Boleano para verificar si se calculó metodos meteorológicos.
bool computadoHU; // Boleano que verifica si se calculó los H.U. protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnKillfocusEdit_CN(); // Combo Box (Cuando existan cambios en el combo) afx_msg void OnKillfocusComboHUS(); afx_msg void OnKillfocusComboMM(); afx_msg void OnKillfocusComboINTERT(); // Botones (Sólo CAD) afx_msg void OnButtonAREA(); afx_msg void OnButtonPPUNTO(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); // Funciones de los botones en el cuadro de diálogo virtual void OnCALCCurvaNumero(); virtual void OnCALCHidrogramaUnitario(); virtual void OnCALCPrecipitaciones(); DECLARE_MESSAGE_MAP() };
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxv
ARCHIVOS Cpp:
PLEDERCurvaNumeroDlg.cpp /*-------------------------------------------------------------------- PLEDERCurvaNumeroDlg.cpp: archivo de implementación Cuadro de diálogo de CPLEDERCurvaNumeroDlg -> Calcula el número de curva compuesto. --------------------------------------------------------------------*/ #include "stdafx.h" #include "PLEDERCurvaNumeroDlg.h" /*------------------------------------------------------------------*/ IMPLEMENT_DYNAMIC(CPLEDERCurvaNumeroDlg, CAdUiDialog) CPLEDERCurvaNumeroDlg::CPLEDERCurvaNumeroDlg(CWnd *pParent /*=NULL*/,HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERCurvaNumeroDlg::IDD, pParent, hInstance) { m_a1 = _T("0.0"); m_cn1 = _T("0.0"); m_a2 = _T("0.0"); m_cn2 = _T("0.0"); m_a3 = _T("0.0"); m_cn3 = _T("0.0"); m_a4 = _T("0.0"); m_cn4 = _T("0.0"); m_a5 = _T("0.0"); m_cn5 = _T("0.0"); m_a6 = _T("0.0"); m_cn6 = _T("0.0"); m_cnc = _T("0.0"); } CPLEDERCurvaNumeroDlg::~CPLEDERCurvaNumeroDlg() { } BEGIN_MESSAGE_MAP(CPLEDERCurvaNumeroDlg, CAdUiDialog) // Cajas de Texto ON_EN_KILLFOCUS(IDC_EDIT_a1, OnKillfocusEdit_AREA1) ON_EN_KILLFOCUS(IDC_EDIT_a2, OnKillfocusEdit_AREA2) ON_EN_KILLFOCUS(IDC_EDIT_a3, OnKillfocusEdit_AREA3) ON_EN_KILLFOCUS(IDC_EDIT_a4, OnKillfocusEdit_AREA4) ON_EN_KILLFOCUS(IDC_EDIT_a5, OnKillfocusEdit_AREA5) ON_EN_KILLFOCUS(IDC_EDIT_a6, OnKillfocusEdit_AREA6) ON_EN_KILLFOCUS(IDC_EDIT_cn1, OnKillfocusEdit_CN1) ON_EN_KILLFOCUS(IDC_EDIT_cn2, OnKillfocusEdit_CN2) ON_EN_KILLFOCUS(IDC_EDIT_cn3, OnKillfocusEdit_CN3) ON_EN_KILLFOCUS(IDC_EDIT_cn4, OnKillfocusEdit_CN4) ON_EN_KILLFOCUS(IDC_EDIT_cn5, OnKillfocusEdit_CN5) ON_EN_KILLFOCUS(IDC_EDIT_cn6, OnKillfocusEdit_CN6) // Botones incluidos cad ON_BN_CLICKED(IDC_BUTTON_limpiar, onCALCLimpiar)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxvi
ON_BN_CLICKED(IDOK, &CPLEDERCurvaNumeroDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPLEDERCurvaNumeroDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_a1, m_Edit_AREA1); DDX_Control(pDX, IDC_EDIT_cn1, m_Edit_CN1); DDX_Control(pDX, IDC_EDIT_a2, m_Edit_AREA2); DDX_Control(pDX, IDC_EDIT_cn2, m_Edit_CN2); DDX_Control(pDX, IDC_EDIT_a3, m_Edit_AREA3); DDX_Control(pDX, IDC_EDIT_cn3, m_Edit_CN3); DDX_Control(pDX, IDC_EDIT_a4, m_Edit_AREA4); DDX_Control(pDX, IDC_EDIT_cn4, m_Edit_CN4); DDX_Control(pDX, IDC_EDIT_a5, m_Edit_AREA5); DDX_Control(pDX, IDC_EDIT_cn5, m_Edit_CN5); DDX_Control(pDX, IDC_EDIT_a6, m_Edit_AREA6); DDX_Control(pDX, IDC_EDIT_cn6, m_Edit_CN6); DDX_Control(pDX, IDC_EDIT_cnc, m_Edit_CNC); } BOOL CPLEDERCurvaNumeroDlg::OnInitDialog() { CDialog::OnInitDialog(); // Inicializa Cajas de texto m_Edit_AREA1.SetWindowText(m_a1); m_Edit_AREA2.SetWindowText(m_a2); m_Edit_AREA3.SetWindowText(m_a3); m_Edit_AREA4.SetWindowText(m_a4); m_Edit_AREA5.SetWindowText(m_a5); m_Edit_AREA6.SetWindowText(m_a6); m_Edit_CN1.SetWindowText(m_cn1); m_Edit_CN1.SetRange(0, 100); m_Edit_CN2.SetWindowText(m_cn2); m_Edit_CN2.SetRange(0, 100); m_Edit_CN3.SetWindowText(m_cn3); m_Edit_CN3.SetRange(0, 100); m_Edit_CN4.SetWindowText(m_cn4); m_Edit_CN4.SetRange(0, 100); m_Edit_CN5.SetWindowText(m_cn5); m_Edit_CN5.SetRange(0, 100); m_Edit_CN6.SetWindowText(m_cn6); m_Edit_CN6.SetRange(0, 100); m_Edit_CNC.SetWindowText(m_cnc); return TRUE; } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA1()
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxvii
{ onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA2() { onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA3() { onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA4() { onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA5() { onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA6() { onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN1() { m_Edit_CN1.Convert(); if (!m_Edit_CN1.Validate()) { ::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100")); m_Edit_CN1.SetFocus(); m_Edit_CN1.SetSel(0, -1); } CString str; m_Edit_CN1.GetWindowText(m_cn1); acdbRToS(::_wtof(m_cn1), 2, 0, str.GetBuffer(80)); m_Edit_CN1.SetWindowText(str); onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN2() { m_Edit_CN2.Convert(); if (!m_Edit_CN2.Validate()) { ::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100")); m_Edit_CN2.SetFocus(); m_Edit_CN2.SetSel(0, -1); } CString str; m_Edit_CN2.GetWindowText(m_cn2); acdbRToS(::_wtof(m_cn2), 2, 0, str.GetBuffer(80)); -- m_Edit_CN2.SetWindowText(str); onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN3() { m_Edit_CN3.Convert(); if (!m_Edit_CN3.Validate())
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxviii
{ ::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100")); m_Edit_CN3.SetFocus(); m_Edit_CN3.SetSel(0, -1); } CString str; m_Edit_CN3.GetWindowText(m_cn3); acdbRToS(::_wtof(m_cn3), 2, 0, str.GetBuffer(80)); m_Edit_CN3.SetWindowText(str); onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN4() { m_Edit_CN4.Convert(); if (!m_Edit_CN4.Validate()) {
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100"));
m_Edit_CN4.SetFocus(); m_Edit_CN4.SetSel(0, -1); } CString str; m_Edit_CN4.GetWindowText(m_cn4); acdbRToS(::_wtof(m_cn4), 2, 0, str.GetBuffer(80)); m_Edit_CN4.SetWindowText(str); onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN5() { m_Edit_CN5.Convert(); if (!m_Edit_CN5.Validate()) {
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100"));
m_Edit_CN5.SetFocus(); m_Edit_CN5.SetSel(0, -1); } CString str; m_Edit_CN5.GetWindowText(m_cn5); acdbRToS(::_wtof(m_cn5), 2, 0, str.GetBuffer(80)); m_Edit_CN5.SetWindowText(str); onCALCCalcularCNC(); } void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN6() { m_Edit_CN6.Convert(); if (!m_Edit_CN6.Validate()) { ::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @ 100")); m_Edit_CN6.SetFocus(); m_Edit_CN6.SetSel(0, -1); } CString str; m_Edit_CN6.GetWindowText(m_cn6); acdbRToS(::_wtof(m_cn6), 2, 0, str.GetBuffer(80)); m_Edit_CN6.SetWindowText(str); onCALCCalcularCNC(); }
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxix
void CPLEDERCurvaNumeroDlg::onCALCLimpiar() { m_Edit_AREA1.SetWindowText(_T("0.0")); m_Edit_AREA2.SetWindowText(_T("0.0")); m_Edit_AREA3.SetWindowText(_T("0.0")); m_Edit_AREA4.SetWindowText(_T("0.0")); m_Edit_AREA5.SetWindowText(_T("0.0")); m_Edit_AREA6.SetWindowText(_T("0.0")); m_Edit_CN1.SetWindowText(_T("0.0")); m_Edit_CN2.SetWindowText(_T("0.0")); m_Edit_CN3.SetWindowText(_T("0.0")); m_Edit_CN4.SetWindowText(_T("0.0")); m_Edit_CN5.SetWindowText(_T("0.0")); m_Edit_CN6.SetWindowText(_T("0.0")); m_Edit_CNC.SetWindowText(_T("0.0")); } void CPLEDERCurvaNumeroDlg::onCALCCalcularCNC() { m_Edit_AREA1.GetWindowText(m_a1); m_Edit_CN1.GetWindowText(m_cn1); m_Edit_AREA2.GetWindowText(m_a2); m_Edit_CN2.GetWindowText(m_cn2); m_Edit_AREA3.GetWindowText(m_a3); m_Edit_CN3.GetWindowText(m_cn3); m_Edit_AREA4.GetWindowText(m_a4); m_Edit_CN4.GetWindowText(m_cn4); m_Edit_AREA5.GetWindowText(m_a5); m_Edit_CN5.GetWindowText(m_cn5); m_Edit_AREA6.GetWindowText(m_a6); m_Edit_CN6.GetWindowText(m_cn6); float a1, a2, a3,a4, a5,a6, AT, cnc; int cn1, cn2, cn3, cn4, cn5, cn6; a1 = _wtof(m_a1); a2 = _wtof(m_a2); a3 = _wtof(m_a3); a4 = _wtof(m_a4); a5 = _wtof(m_a5); a6 = _wtof(m_a6); cn1 = _wtof(m_cn1); cn2 = _wtof(m_cn2); cn3 = _wtof(m_cn3); cn4 = _wtof(m_cn4); cn5 = _wtof(m_cn5); cn6 = _wtof(m_cn6); //Cálculo de CNC AT = a1+a2+a3+a4+a5+a6; if(AT > 0) { cnc = (a1*cn1 +a2*cn2+a3*cn3+a4*cn4+a5*cn5+a6*cn6)/AT; CString str; m_cnc.Format(_T("%g"), cnc); acdbRToS(::_wtof(m_cnc), 2, 0, str.GetBuffer(80));
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxx
m_Edit_CNC.SetWindowText(str); } else { m_Edit_CNC.SetWindowText(_T("0")); } } void CPLEDERCurvaNumeroDlg::OnBnClickedOk() { // Coge los valores despues de pulsar OK // Cajas de texto m_Edit_AREA1.GetWindowText(m_a1); m_Edit_CN1.GetWindowText(m_cn1); m_Edit_AREA2.GetWindowText(m_a2); m_Edit_CN2.GetWindowText(m_cn2); m_Edit_AREA3.GetWindowText(m_a3); m_Edit_CN3.GetWindowText(m_cn3); m_Edit_AREA4.GetWindowText(m_a4); m_Edit_CN4.GetWindowText(m_cn4); m_Edit_AREA5.GetWindowText(m_a5); m_Edit_CN5.GetWindowText(m_cn5); m_Edit_AREA6.GetWindowText(m_a6); m_Edit_CN6.GetWindowText(m_cn6); m_Edit_CNC.GetWindowText(m_cnc); CDialog::OnOK(); } PLEDERHidrogramaUnitariosDlg.cpp /*-------------------------------------------------------------------- PLEDERHidrogramaUnitariosDlg.cpp: archivo de implementación Cuadro de diálogo de CPLEDERHidrogramaUnitariosDlg --------------------------------------------------------------------*/ #include "stdafx.h" #include "PLEDERHidrogramaUnitariosDlg.h" #include "PLEDERHidrologiaDatos.h" #include "PLEDERRecursosCad.h" /*------------------------------------------------------------------*/ //Creando objetos CPLEDERHidrologiaDatos HU; CRecursosCad RecursosHU; /*------------------------------------------------------------------*/ IMPLEMENT_DYNAMIC(CPLEDERHidrogramaUnitariosDlg, CDialog) BEGIN_MESSAGE_MAP(CPLEDERHidrogramaUnitariosDlg, CDialog) //ON_EN_KILLFOCUS(IDC_EDIT_t, OnKillfocusEdit_t) ON_BN_CLICKED(IDC_BUTTON_HU, OnButtonImportarHU) ON_BN_CLICKED(IDC_BUTTON_PULSOS, OnButtonImportarPulsos)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxi
ON_BN_CLICKED(IDOK, &CPLEDERHidrogramaUnitariosDlg::OnBnClickedOk) END_MESSAGE_MAP() /*------------------------------------------------------------------*/ CPLEDERHidrogramaUnitariosDlg::CPLEDERHidrogramaUnitariosDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERHidrogramaUnitariosDlg::IDD, pParent, hInstance) { //m_t = _T("6.0"); } CPLEDERHidrogramaUnitariosDlg::~CPLEDERHidrogramaUnitariosDlg() { } /*------------------------------------------------------------------*/ void CPLEDERHidrogramaUnitariosDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } /*------------------------------------------------------------------*/ BOOL CPLEDERHidrogramaUnitariosDlg::OnInitDialog() { CDialog::OnInitDialog(); return TRUE; } /*------------------------------------------------------------------*/ void CPLEDERHidrogramaUnitariosDlg::OnButtonImportarHU() { // mensaje de consola
acutPrintf(_T("\nPLEDER: Importar datos de Hidrogramas Unitarios."));
long NumeroVertHU; //Número de ordenadas del H.U. struct resbuf *rb; // resbufs // crear un buffer para el nombre del fichero rb = acutNewRb(RTSTR); if (!rb) { //MDITopoLGCAD.RestSystemVars();
acdbFail(_T("\nError de asignación de memoria [IMPORTAR HU][rb]."));
return; } // solicitar el nombre del fichero
if (acedGetFileD(_T("Fichero de Hidrogramas Unitarios"), NULL, PUNFILEEXTHU, 4, rb) == RTERROR)
{ // se canceló
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxii
acutRelRb(rb); //MDITopoLGCAD.RestSystemVars(); return; } TCHAR *pNombreArchivo; // fichero // tomar la ruta del fichero
pNombreArchivo = (TCHAR*)acad_malloc((_tcslen(rb->resval.rstring) + 1) * sizeof(TCHAR));
if (!pNombreArchivo) { acutRelRb(rb); //MDITopoLGCAD.RestSystemVars();
acdbFail(_T("\nError de asignación de memoria [IMPORTAR HU][pNombreArchivo]."));
return; } ::memset(pNombreArchivo, '\0', _tcslen(rb->resval.rstring) + 1); _tcscpy(pNombreArchivo, rb->resval.rstring); acutRelRb(rb); // importar los ordenadas
if (HU.ImportarHidrogramaUnitario(pNombreArchivo, &NumeroVertHU) != RTNORM)
{ if (pNombreArchivo) { acad_free(pNombreArchivo); } //MDITopoLGCAD.RestSystemVars(); return; } if (pNombreArchivo) { acad_free(pNombreArchivo); } acutPrintf(_T("\n%d Ordenadas Importadas."), NumeroVertHU); } /*------------------------------------------------------------------*/ void CPLEDERHidrogramaUnitariosDlg::OnButtonImportarPulsos() { acutPrintf(_T("\nPLEDER: Importa datos de Pulsos.")); } /*------------------------------------------------------------------*/ void CPLEDERHidrogramaUnitariosDlg::OnBnClickedOk() { //Inicializa las variables de sistema. RecursosHU.InicializarVariables();
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxiii
if ( HU.EscorrentiaDirecta1(HU.pPrimerHU) != RTNORM) { RecursosHU.RestaurarVariables(); acdbFail(_T("\nError: Escorrentia directa")); return; } RecursosHU.RestaurarVariables(); CDialog::OnOK(); } /*------------------------------------------------------------------*/ PLEDERHidrologiaBufer.cpp #include "StdAfx.h" #include "PLEDERHidrologiaBufer.h" /*------------------------------------------------------------------*/ HidrogramaUnitarioBufer::HidrogramaUnitarioBufer() { Siguiente = NULL; } //Constructor que inicializa a CoorXX, CoordYY, ns y siguiente = NULL HidrogramaUnitarioBufer::HidrogramaUnitarioBufer(int nn, double HUU, double PULSOP) { Siguiente = NULL; n = nn; HU = HUU; PULSO = PULSOP; } //Destructor HidrogramaUnitarioBufer::~HidrogramaUnitarioBufer() {} // Obtiene una copia del atributo Siguiente. HidrogramaUnitarioBufer* HidrogramaUnitarioBufer::ObtenerSiguiente() { return Siguiente; } //Pone el atributo Siguiente a p void HidrogramaUnitarioBufer::PonerSiguiente(HidrogramaUnitarioBufer *p) { Siguiente = p; } PLEDERHidrologiaCalculos.cpp #include "StdAfx.h" #include "PLEDERHidrologiaCalculos.h" #include "PLEDERHidrologiaDatos.h" // objetos CPLEDERHidrologiaDatos HidrologiaDatos; CPLEDERHidrologiaCalculos::CPLEDERHidrologiaCalculos(void)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxiv
{ } CPLEDERHidrologiaCalculos::~CPLEDERHidrologiaCalculos(void) { } float CPLEDERHidrologiaCalculos::HietogramaIILA(int N, float a, float b, float k, float n, float dt, float var, float Tr, float* D, float* Pacum, float* Pincr, float* Palte) /*-------------------------------------------------------------------- Ingreso : N = Número de intervalos de tiempo. a = Parámetro regional IILA. b = Parámetro regional IILA. k = Parámetro regional IILA. n = Parámetro regional IILA. dt = Duración de la tormneta. var = Variación del tiempo. Tr = Período de retorno en años. D = Lista de duración o tiempo (min). Salida : Pacum = Lista de Precipitaciones acumuladas (mm).
Pincr = Lista de Precipitaciones incrementales (mm). Palte = Lista de precipitaciones alternales (mm) ->
Hietograma RTNORM si no se produce ningún error. Propósito : Calcula las precipitaciones acumulas, incrementales y alternas según la ecuación IILA SENAMHI-UNI --------------------------------------------------------------------*/ { int i,j; Pacum[0]= 0.0; //Condicion Inicial for (i =1; i <= N; i++ ) { D[i]=var*i; //Duracion en minutos if (dt <= 3) { Pacum[i]=a*(1+k*log10(Tr))* pow((D[i]/60+b),(n-1))*D[i]/60; } else { Pacum[i]=a*(1+k*log10(Tr))* pow((D[i]/60),n); } Pincr[i]=Pacum[i]-Pacum[i-1]; //Precipitación Incremental } //For i for (i =1; i <= N; i++ ) { if ( i<=N/2)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxv
{ j =N+1-2*i; Palte[i]=Pincr[j]; //Precipitacion Alterna } else { j =2*i-N; Palte[i]=Pincr[j]; //Precipitacion Alterna } //acutPrintf (_T("\n Palte[%d] %0.3f"), i , Palte[i]); } //For i return RTNORM; } float CPLEDERHidrologiaCalculos::HietogramaNRCS(float P24, float Ndt, int Tormenta, float* ND, float* TipoT, float* NPacum, float* NPincr) /*-------------------------------------------------------------------- Ingreso : P24 = Precipitación máxima de 24 horas. Ndt = Intervalo de tiempo de la lluvia (min) Tormenta = Tipo de tormenta 0 : Tipo I 1 : Tipo IA 2 : Tipo II 3 : Tipo III Salida : ND = Lista de duración o tiempo (min). TipoT = Lista del tipo de distribución (P/P24). NPacum = Lista de Precipitaciones acumuladas (mm). NPincr = Lista de Precipitaciones incrementales (mm). RTNORM si no se produce ningún error. Propósito : Calcula las precipitaciones acumulas, incrementales (Hietogramas) según el tipo de tormenta del NRCS. --------------------------------------------------------------------*/ { float N = 24/(Ndt/60); // Cantidad de elementos en la lista // Toma los datos segun el tipo de tormenta. if (HidrologiaDatos.TormentasNRCS(Tormenta, TipoT, N)!= RTNORM) { acdbFail(_T("\nPLEDER: !ERROR!\nHietogramaNRCS [TormentasNRCS]")); return RTERROR; } NPacum[0]= 0.0; //Condicion Inicial float dt = 24/N; for (int i =0; i <= N+1; i++ ) { ND[i+1]=dt*i; //Duración en minutos NPacum[i+1]=P24*TipoT[i+1];
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxvi
NPincr[i+1]=NPacum[i+1]-NPacum[i]; //Precipitación Incremental } //For i return RTNORM; } float CPLEDERHidrologiaCalculos::AbstraccionesHietogramaNRCS(int NP, int CN, float *Palt, float* Pacum, float* Ia, float* Fa, float* PexcesoAcum, float* Pexceso) /*-------------------------------------------------------------------- Ingreso : NP = Número de datos en la lista de precipitaciones. Palt = Precipitaciones alternas o acumuladas
(mm). CN = Curva Número Salida : Pacum = Lista de Precipitaciones acumuladas
(mm). Ia = Lista de Abstracciones Iniciales según
NRCS (mm). Fa = Lista de Abstracciones continuas según
NRCS (mm). PexcesoAcum = Lista de Exceso de lluvia acumulada en
(mm) = Pacum -(Ia+Fa). Pexceso = Lista de Exceso de lluvia (mm) o PULSOS
(incluyen ceros). RTNORM si no se produce ningún error. Propósito : Calcula las abstracciones según el NRCS y las precipitaciones en exceso o PULSOS de ingreso. --------------------------------------------------------------------*/ { int i; float Iai, S; S = (25400.0-254.0*CN)/CN; // Retención Potencial máxima (mm) Iai = 0.2*S; // Abstracción inicial constante (mm) Pacum[0]= 0.0; // Condiciones iniciales Palt[0] = 0.0; PexcesoAcum[0] = 0.0; for (i =1; i<= NP+1; i++ ) { // Lista Acumulada de la precipitación (mm) Pacum[i] = Pacum[i-1] + Palt[i]; // Lista de la abstración Inicial (mm) if (Pacum[i]<Iai) { Ia[i]=Pacum[i]; } else { Ia[i]=Iai; }
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxvii
//Lista de la abstración continuada (mm) if (Ia[i] == Iai) { Fa[i]=(S*(Pacum[i]-Ia[i]))/(Pacum[i]-Ia[i]+S); } else { Fa[i]=0.0; } // Lista de exceso de precipitación acumulada (mm) PexcesoAcum[i]= Pacum[i]-(Ia[i]+Fa[i]); //Lista de exceso de precipitación (mm) Pexceso[i] = PexcesoAcum[i]-PexcesoAcum[i-1]; } //for i return RTNORM; } float CPLEDERHidrologiaCalculos::PulsosP(int NP, int DT, int dt, float* Pexceso, float* Pulsos, int *nP) /*-------------------------------------------------------------------- Ingreso : NP = Número de datos en la lista de
precipitaciones. DT = Variación del tiempo para interpolar
los pulsos. dt = Variación del tiempo de las
precipitaciones en exceso. Pexceso = Lista de Exceso de lluvia (mm) o PULSOS
(incluyen ceros). Salida : Pulsos = Lista de Pulso ó Precipitación Efectiva
-> exceso de lluvia. nP = Número de pulsos. RTNORM si no se produce ningún error. Propósito : Calcula los pulsos directos de entrada a partir de las precipitaciones en exceso (Pexceso -> dato) realizando interpolaciones según el intervalo de tiempo asignado. C -> es la relación por el cual controla si se suma los valores (C>=1) o se realizan interpolaciones (C<1). --------------------------------------------------------------------*/ { int i, j, k, d, cont =0; // Contadores. float C = DT/dt, // Relación de variación de tiempo. PulsoSum; // Pulso adicional para acumular las sumas. j=1; k = 2; for (i=1; i<= NP/C ; i++) { PulsoSum = Pexceso[k]; for (j=1; j< C; j++) { PulsoSum = PulsoSum + Pexceso[k+1]; k++;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxviii
}// for j Pulsos[i]=PulsoSum; k++; //acutPrintf(_T("\nPulsos[%d]: %0.5f"),i, Pulsos[i]); cont++; // Contador del número de pulsos. }//for i *nP = cont; return RTNORM; } int CPLEDERHidrologiaCalculos::Convolucion(int nP, int nU, float *P, float *U, float *Q) /*-------------------------------------------------------------------- Ingreso : nP = Cantidad de Pulsos en la lista [P]. nU = Cantidad de ordenadas de la lista [U]. P = Lista de Pulso ó Precipitación Efectiva
-> exceso de lluvia. U = Lista de la función respuesta a un
pulso (HU) o los caudales por unidad de precipitación efectiva del Hidrograma Unitario
Salida : Q = Lista de Caudal de escorrentia directa (SALIDA)
RTNORM si no se produce ningún error. Propósito : Calcula los caudales de escorrentía directa mediante en método de convolución discreta de la ecuación 2.5.15. Q = suma(PxU) --------------------------------------------------------------------*/ { float Qsum; int n, m, nQ, M; M = nP; nQ = M + nU - 1; for(n =1; n<= nQ; n++) { Qsum = 0.0; for (m = max(1,n-nU+1); m <= min(n,M); m++ ) { Qsum = Qsum + P[m]*U[n-m+1]; } // For m Q[n] = Qsum; //acutPrintf (_T("\n Q[%d] %0.3f"), n , Q[n]); } //for n return RTNORM; } PLEDERHidrologiaDatos.cpp #include "StdAfx.h" #include "PLEDERHidrologiaDatos.h"
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxix
#include "PLEDERRecursosCad.h" #include "PLEDERHidrologiaBufer.h" #include "PLEDERHidrologiaCalculos.h" #include <iostream> #include <fstream> // Para exportar atributos #include <cstdlib> #include <new> /*------------------------------------------------------------------*/ //Creando objetos CPLEDERHidrologiaCalculos CalcHidrologia; /*------------------------------------------------------------------*/ CPLEDERHidrologiaDatos::CPLEDERHidrologiaDatos(void) { } CPLEDERHidrologiaDatos::~CPLEDERHidrologiaDatos(void) { delete [] P; delete [] U; delete [] Q; } int CPLEDERHidrologiaDatos::EscorrentiaDirecta1(HidrogramaUnitarioBufer *pPrimerHU) /*------------------------------------------------------------------- Ingreso : pPrimerHU = Puntero al primer elemento del
buffer(HidrogramaUnitarioBufer). Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula la escorrentía directa a partir del Hidrograma Unitario y pusos o escorrentia directa --------------------------------------------------------------------*/ { // Verificar los argumentos if (!pPrimerHU) { acdbFail(_T("\nPuntero Nulo de la importación")); return RTERROR; } // Conteo de los datos importados int nU = 0, // Número de ordenadas de los U. nP = 0; // Número de Pulsos P. HidrogramaUnitarioBufer *pHU; pPrimerHU = pPrimerHU->Siguiente; for (pHU = pPrimerHU; pHU != NULL; pHU = pHU->Siguiente) { nU++; /*Cuenta la columna de pulsos distintos de cero, ya que se el ingreso fue de relleno con ceros */ if (pHU->PULSO != 0)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxx
{ nP++; } } int nQ = nP+nU-1; //acutPrintf(_T("\n NºU: %d, NºP: %d"), nU, nP); P = new float[nP+1]; U = new float[nU+1]; Q = new float[nQ+1]; // Obtención de los datos [P] y [U] en listas int i = 1; for (pHU = pPrimerHU; pHU != NULL; pHU = pHU->Siguiente) { P[i] = pHU->PULSO; U[i] = pHU->HU; i++; acutPrintf (_T("\n P %0.3f, U %0.3f "), pHU->PULSO , pHU->HU); } // Captura en una lista (nVert) los números de Vértices para cada S.T. if ( CalcHidrologia.Convolucion(nP, nU, P, U, Q) != RTNORM) { acdbFail(_T("\nError [Convolucion]")); return RTERROR; } // Etiqueta de los resultados acutPrintf (_T("\nResultado de la Convolución Discreta: ")); for( i = 1; i<= nQ; i++) { acutPrintf (_T("\nQ[%d]: %0.3f"), i, Q[i]); } return RTNORM; } int CPLEDERHidrologiaDatos::ImportarHidrogramaUnitario(const TCHAR *pNombreArchivo, long *NumeroVertHU ) /*------------------------------------------------------------------- Ingreso : pNombreArchivo = Puntero a una zero terminated
string con el nombre del archivo. NumeroVertHU = Numero de vértices de las ordenadas del H.U. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Importar las ordenadas del Hidrograma Unitario, a partir de un archivo. Guarda los datos en el Buffer HidrogramaUnitarioBufer, para luego llamar desde cualquier función. -------------------------------------------------------------------*/ { std::ifstream infile; char *buffer = NULL; char *token = NULL;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxi
char seps[] = PUNFILESEP; int n; long np = 0; double x=0, y = 0; if (!pNombreArchivo) { acdbFail(_T("\nArgumento de función no válido [ImportarHidrogramaUnitario].")); return RTERROR; } acutPrintf(_T("\nLeyendo el fichero ascii ...\n")); // abrir el fichero para lectura infile.open(pNombreArchivo); if (infile.fail() != 0) { *NumeroVertHU = 0; acdbFail(_T("\nError de E/S al abrir el fichero [IImportarHidrogramaUnitario][open].")); return RTERROR; } // crear un buffer para la lectura del fichero buffer = (char*)acad_malloc(GETLINEMAXBUFF * sizeof(char)); if (!buffer) { *NumeroVertHU = 0; infile.close(); acdbFail(_T("\nError de asignación de memoria [Importar HU][buffer].")); return RTERROR; } // tomar primero el número de puntos que contiene el fichero // para poder valorar la longitud de la barra de progeso while (!infile.eof()) { infile.getline(buffer, GETLINEMAXBUFF, '\n'); if (infile.eof()) { // limpiar el flag eof infile.clear(); break; } np++; } // mover el puntero al principio del fichero infile.seekg(0, std::ios_base::beg); // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Insertando las ordenadas del HU: "), 0, (int)np); np = 0;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxii
// crear el buffer y añadir el primer Vértice como puntero try { pPrimerHU = new HidrogramaUnitarioBufer(); } catch(const std::bad_alloc&) { acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [Importar HU][pPrimerHU].")); return RTERROR; } HidrogramaUnitarioBufer *nHU, *nbprevious = pPrimerHU; // recorrer el fichero while (!infile.eof()) { // leer una línea del fichero infile.getline(buffer, GETLINEMAXBUFF, '\n'); if (infile.eof()) break; // separar los campos token = ::strtok(buffer, seps); if (!token) { *NumeroVertHU = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Hidrograma Unitario No válido [Importar HU]")); return RTERROR; } n = atoi(token); // Ordenada del HU token = ::strtok(NULL, seps); if (!token) { *NumeroVertHU = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Hidrograma Unitario No válido -n- [Importar HU]")); return RTERROR; } x = atof(token); // PULSOS token = ::strtok(NULL, seps); if (!token) {
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxiii
*NumeroVertHU = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Hidrograma Unitario No válido -n- [Importar HU]")); return RTERROR; } y = atof(token); int contador = 1; // añadir los vértices de las secciones transv. al buffer try { nHU = new HidrogramaUnitarioBufer(n, x, y); } catch(const std::bad_alloc&) { LiberarBufferHidrogramaUnitario(); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [Importar HU][nHU].")); return RTERROR; } nbprevious->Siguiente = nHU; nbprevious = nHU; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); } // while infile.close(); acad_free(buffer); acedRestoreStatusBar(); *NumeroVertHU = np; //Número de vértices totales return RTNORM; } float CPLEDERHidrologiaDatos::TormentasNRCS(int Tormenta, float *TipoT, float N) /*-------------------------------------------------------------------- Ingreso : Tormenta = Valor entero que coge el tipo de
tormenta 0 : Tipo I 1 : Tipo IA 2 : Tipo II 3 : Tipo III Salida : Tormenta Elegida. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Retorna la tormenta elegida -------------------------------------------------------------------*/
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxiv
{ // Distribución Tipo I
float TipoI[241]= {0.0,0.00174,0.00348,0.00522,0.00697,0.00871,0.01046,0.0122,0.01395,0.0157,0.01745,0.0192,0.02095,0.0227,0.02446,0.02621,0.02797,0.02972,0.03148,0.03324,0.035,0.03677,0.03858,0.04041,0.04227,0.04416,0.04608,0.04803,0.05001,0.05201,0.05405,0.05611,0.05821,0.06033,0.06248,0.06466,0.06687,0.06911,0.07138,0.07367,0.076,0.07835,0.0807,0.08307,0.08545,0.08784,0.09024,0.09265,0.09507,0.09751,0.09995,0.10241,0.10487,0.10735,0.10984,0.11234,0.11485,0.11737,0.1199,0.12245,0.125,0.12761,0.13034,0.13317,0.1361,0.13915,0.1423,0.14557,0.14894,0.15241,0.156,0.15966,0.16334,0.16706,0.17082,0.1746,0.17842,0.18226,0.18614,0.19006,0.194,0.19817,0.20275,0.20775,0.21317,0.219,0.22523,0.23185,0.23885,0.24623,0.254,0.26233,0.27139,0.28119,0.29173,0.303,0.31942,0.34542,0.38784,0.46316,0.515,0.5322,0.5476,0.5612,0.573,0.583,0.59188,0.60032,0.60832,0.61588,0.623,0.62982,0.63648,0.64298,0.64932,0.6555,0.66152,0.66738,0.67308,0.67862,0.684,0.68925,0.6944,0.69945,0.7044,0.70925,0.714,0.71865,0.7232,0.72765,0.732,0.73625,0.7404,0.74445,0.7484,0.75225,0.756,0.75965,0.7632,0.76665,0.77,0.77329,0.77656,0.77981,0.78304,0.78625,0.78944,0.79261,0.79576,0.79889,0.802,0.80509,0.80816,0.81121,0.81424,0.81725,0.82024,0.82321,0.82616,0.82909,0.832,0.83489,0.83776,0.84061,0.84344,0.84625,0.84904,0.85181,0.85456,0.85729,0.86,0.86269,0.86536,0.86801,0.87064,0.87325,0.87584,0.87841,0.88096,0.88349,0.886,0.88849,0.89096,0.89341,0.89584,0.89825,0.90064,0.90301,0.90536,0.90769,0.91,0.91229,0.91456,0.91681,0.91904,0.92125,0.92344,0.92561,0.92776,0.92989,0.932,0.93409,0.93616,0.93821,0.94024,0.94225,0.94424,0.94621,0.94816,0.95009,0.952,0.95389,0.95576,0.95761,0.95944,0.96125,0.96304,0.96481,0.96656,0.96829,0.97,0.97169,0.97336,0.97501,0.97664,0.97825,0.97984,0.98141,0.98296,0.98449,0.986,0.98749,0.98896,0.99041,0.99184,0.99325,0.99464,0.99601,0.99736,0.99869,1.0};
// Distribución Tipo IA
float TipoIA[241]= {0.0,0.00224,0.00432,0.00628,0.00816,0.01,0.01184,0.01372,0.01568,0.01776,0.02,0.02276,0.02568,0.02872,0.03184,0.035,0.03797,0.04095,0.04394,0.04695,0.05,0.05315,0.05633,0.05954,0.06276,0.066,0.0692,0.0724,0.0756,0.0788,0.082,0.08514,0.08829,0.09147,0.09471,0.098,0.10147,0.10502,0.10862,0.11229,0.116,0.11969,0.12342,0.12721,0.13107,0.135,0.13901,0.1431,0.14729,0.15159,0.156,0.16059,0.1653,0.17011,0.17501,0.18,0.18494,0.18999,0.19517,0.20049,0.206,0.21196,0.21808,0.22432,0.23064,0.237,0.24285,0.24878,0.2549,0.26127,0.268,0.27517,0.28287,0.29118,0.30019,0.31,0.33142,0.35469,0.37876,0.40255,0.425,0.43936,0.45168,0.46232,0.47164,0.48,0.48904,0.49752,0.50548,0.51296,0.52,0.52664,0.53292,0.53888,0.54456,0.55,0.55564,0.56116,0.56656,0.57184,0.577,0.58198,0.58685,0.59163,0.59635,0.601,0.60576,0.61044,0.61504,0.61956,0.624,0.62836,0.63264,0.63684,0.64096,0.645,0.64889,0.65272,0.65651,0.66026,0.664,0.66773,0.67148,0.67527,0.6791,0.683,0.68665,0.69027,0.69386,0.69744,0.701,0.70473,0.70838,0.71198,0.71551,0.719,0.72245,0.72586,0.72926,0.73263,0.736,0.73939,0.74277,0.74613,0.74948,0.75281,0.75613,0.75943,0.76271,0.76598,0.76924,0.77248,0.77571,0.77892,0.78211,0.78529,0.78845,0.7916,0.79474,0.79786,0.80096,0.80405,0.80712,0.81018,0.81322,0.81625,0.81926,0.82226,0.82524,0.82821,0.83116,0.8341,0.83702,0.83992,0.84281,0.84569,0.84855,0.8514,0.85423,0.85704,0.85984,0.86262,0.86539,0.86815,0.87089,0.87361,0.87632,0.87901,0.88169,0.88435,0.887,0.88963,0.89225,0.89485,0.89744,0.90001,0.90257,0.90511,0.90763,0.91014,0.91264,0.91512, 0.91759,0.92004,0.92247,0.92489,0.92729,0.92968,0.93206,0.93442,0.93676,0.93909,0.9414,0.9437,0.94598,0.94825,0.9505,0.95274,0.9
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxv
5496,0.95717,0.95936,0.96154,0.9637,0.96584,0.96797,0.97009,0.97219,0.97428,0.97635,0.9784,0.98044,0.98246,0.98447,0.98647,0.98845,0.99041,0.99236,0.99429,0.99621,0.99811,1.0};
// Distribución Tipo II
float TipoII[241]= {0.0,0.00101,0.00202,0.00305,0.00408,0.00513,0.00618,0.00725,0.00832,0.00941,0.0105,0.01161,0.01272,0.01385,0.01498,0.01613,0.01728,0.01845,0.01962,0.02081,0.022,0.02321,0.02442,0.02565,0.02688,0.02813,0.02938,0.03065,0.03192,0.03321,0.0345,0.03581,0.03712,0.03845,0.03978,0.04113,0.04248,0.04385,0.04522,0.04661,0.048,0.04941,0.05084,0.05229,0.05376,0.05525,0.05676,0.05829,0.05984,0.06141,0.063,0.06461,0.06624,0.06789,0.06956,0.07125,0.07296,0.07469,0.07644,0.07821,0.08,0.08181,0.08364,0.08549,0.08736,0.08925,0.09116,0.09309,0.09504,0.09701,0.099,0.10101,0.10304,0.10509,0.10716,0.10925,0.11136,0.11349,0.11564,0.11781,0.12,0.12225,0.1246,0.12705,0.1296,0.13225,0.135,0.13785,0.1408,0.14385,0.147,0.1502,0.1534,0.1566,0.1598,0.163,0.16628,0.16972,0.17332,0.17708,0.181,0.18512,0.18948,0.19408,0.19892,0.204,0.2094,0.2152,0.2214,0.228,0.235,0.24268,0.25132,0.26092,0.27148,0.283,0.30684,0.35436,0.43079,0.56786,0.663,0.68196,0.69864,0.71304,0.72516,0.735,0.74344,0.75136,0.75876,0.76564,0.772,0.77796,0.78364,0.78904,0.79416,0.799,0.8036,0.808,0.8122,0.8162,0.82,0.82367,0.82726,0.83079,0.83424,0.83763,0.84094,0.84419,0.84736,0.85047,0.8535,0.85647,0.85936,0.86219,0.86494,0.86763,0.87024,0.87279,0.87526,0.87767,0.88,0.88229,0.88455,0.88679,0.889,0.89119,0.89335,0.89549,0.8976,0.89969,0.90175,0.90379,0.9058,0.90779,0.90975,0.91169,0.9136,0.91549,0.91735,0.91919,0.921,0.92279,0.92455,0.92629,0.928,0.92969,0.93135,0.93299,0.9346,0.93619,0.93775,0.93929,0.9408,0.94229,0.94375,0.94519,0.9466,0.94799,0.94935,0.95069,0.952,0.9533,0.95459,0.95588,0.95716,0.95844,0.95971,0.96098,0.96224,0.9635,0.96475,0.966,0.96724,0.96848,0.96971,0.97094,0.97216,0.97338,0.97459,0.9758,0.977,0.9782,0.97939,0.98058,0.98176,0.98294,0.98411,0.98528,0.98644,0.9876,0.98875,0.9899,0.99104,0.99218,0.99331,0.99444,0.99556,0.99668,0.99779,0.9989,1.0};
// Distribución Tipo III
float TipoIII[241]= {0.0,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01,0.011,0.012,0.013,0.014,0.015,0.016,0.017,0.018,0.019,0.02,0.02101,0.02203,0.02307,0.02412,0.02519,0.02627,0.02737,0.02848,0.02961,0.03075,0.03191,0.03308,0.03427,0.03547,0.03669,0.03792,0.03917,0.04043,0.04171,0.043,0.04431,0.04563,0.04697,0.04832,0.04969,0.05107,0.05247,0.05388,0.05531,0.05675,0.05821,0.05968,0.06117,0.06267,0.06419,0.06572,0.06727,0.06883,0.07041,0.072,0.07363,0.0753,0.07703,0.0788,0.08063,0.0825,0.08443,0.0864,0.08843,0.0905,0.09263,0.0948,0.09703,0.0993,0.10163,0.104,0.10643,0.1089,0.11143,0.114,0.11666,0.11943,0.12232,0.12532,0.12844,0.13167,0.13502,0.13848,0.14206,0.14575,0.14956,0.15348,0.15752,0.16167,0.16594,0.17032,0.17482,0.17943,0.18416,0.189,0.19402,0.19928,0.20478,0.21052,0.2165,0.22272,0.22918,0.23588,0.24282,0.25,0.25776,0.26644,0.27604,0.28656,0.298,0.3143,0.3394,0.3733,0.416,0.5,0.584,0.6267,0.6606,0.6857,0.702,0.71344,0.72396,0.73356,0.74224,0.75,0.75718,0.76412,0.77082,0.77728,0.7835,0.78948,0.79522,0.80072,0.80598,0.811,0.81584,0.82057,0.82518,0.82968,0.83406,0.83833,0.84248,0.84652,0.85044,0.85425,0.85794,0.86152,0.86498,0.86833,0.87156,0.87468,0.87768,0.88057,0.88334,0.886,0.88858,0.8911,0.89358,0.896,0.89838,0.9007,0.90298,0.9052,0.90738,0.9095,0.91158,0.9136,0.91558,0.9175,0.91938,0.9212,0.92298,0.9247,0.92638,0.928,0.92959,0.93117,0.93273,0.93428,0.93581,0.93733,0.93883,0.94032,0.94179,0.94325,0.94469,0.94612,0.94753,0.94893,0.95031,0.95168,0
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxvi
.95303,0.95437,0.95569,0.957,0.95829,0.95958,0.96085,0.96211,0.96336,0.9646,0.96582,0.96704,0.96824,0.96944,0.97062,0.97179,0.97295,0.9741,0.97523,0.97636,0.97747,0.97858,0.97967,0.98075,0.98182,0.98288,0.98392,0.98496,0.98598,0.987,0.988,0.98899,0.98997,0.99094,0.99189,0.99284,0.99377,0.9947,0.99561,0.99651,0.9974,0.99828,0.99914,1.0};
int i, // Contador for j=0, // Contador temporal cont; // Valor entero para como contador. float dt; // Variación del tiempo. dt = 24/N; cont = dt*10; // Los datos del hietograma estan en relacion a 1/10 switch (Tormenta) { case 0: // Tormenta tipo I { for (i = 1; i <= N+1; i++ ) { TipoT[i] = TipoI[j]; j = j + cont; } break; } case 1: // Tormenta tipo IA { for (i = 1; i <= N+1; i++ ) { TipoT[i] = TipoIA[j]; j = j + cont; } break; } case 2: // Tormenta tipo II { for (i = 1; i <=N+1; i++ ) { TipoT[i] = TipoII[j]; j = j + cont; //acutPrintf (_T("\n TipoT[%d] %0.5f"), i , TipoT[i]); } break; } case 3: //Tormenta tipo III { for (i = 1; i <= N+1; i++ ) { TipoT[i] = TipoIII[j]; j = j + cont; } break; } default:
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxvii
acutPrintf(_T("\nFuera de Rango")); } //switch (Tormenta) return RTNORM; } float CPLEDERHidrologiaDatos::HidrogramaSinteticoNRCS(float Tp, float qp,float *t, float *q) /*-------------------------------------------------------------------- Ingreso : Tp = Tiempo de ocurrencia del pico (min) qp = Caudal pico HU (m3/s/mm) Salida : t = Lista de tiempos (min) q = Lista de caudales (m3/s/mm) RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Retorna los datos del tiempo (t) y caudal (q) del Hidrograma Unitario t = Tp* (t/Tp); q = qp*(q/qp). --------------------------------------------------------------------*/ {
float t_Tp[33] = {0.00,0.10,0.20,0.30,0.40,0.50,0.60,0.70,0.80,0.90,1.00,1.10,1.20,1.30,1.40,1.50,1.60,1.70,1.80,1.90,2.00,2.20,2.40,2.60,2.80,3.00,3.20,3.40,3.6,3.8,4,4.5,5}; float q_qp[33] = {0.00,0.030,0.100,0.190,0.310,0.470,0.660,0.820,0.930,0.990,1.000,0.990,0.930,0.860,0.780,0.680,0.560,0.460,0.390,0.330,0.280,0.207,0.147,0.107,0.077,0.055,0.040,0.029,0.021,0.015,0.011,0.005,0};
for(int i=1; i <= 33; i++) { t[i] = t_Tp[i-1] * Tp; q[i] = q_qp[i-1] * qp; } return RTNORM; } float CPLEDERHidrologiaDatos::HidrogramaSinteticoSnyder(float T ,float tR, float tpR, float tb, float QpR, float W50, float W75) /*-------------------------------------------------------------------- Ingreso : Tp = Tiempo de ocurrencia del pico (min) qp = Caudal pico HU (m3/s/mm) Salida : t = Lista de tiempos (min) q = Lista de caudales (m3/s/mm) RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Retorna los datos del tiempo (t) y caudal (q) del Hidrograma Unitario t = Tp* (t/Tp); q = qp*(q/qp). -------------------------------------------------------------------*/ { int i; float P = tR/2 +tpR, Q; // Tramo AB if ( T>=0 && T <= P-(1.0/3.0)*W50) {
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxviii
Q = (0.5*QpR/(P-(1.0/3.0)*W50))*T; Q = Q/10.0; // [ m³/(sxmm)] } // Tramo BC if ( T> P-(1.0/3.0)*W50 && T <= P-(1.0/3.0)*W75) { Q = 0.5*QpR + (0.75*QpR/(W50-W75))*(T-P+(1.0/3.0)*W50); Q = Q/10.0; // [ m³/(sxmm)] } // Tramo CD if ( T > P-(1.0/3.0)*W75 && T <= P) { Q = 0.75*QpR + (0.75*QpR/W75)*(T-P+(1.0/3.0)*W75); Q = Q/10.0; // [ m³/(sxmm)] } // Tramo DE if ( T > P && T <= P + (2.0/3.0)*W75) { Q = QpR - 3*QpR/(8*W75)*(T-P); Q = Q/10.0; // [ m³/(sxmm)] } // Tramo EF if ( T > P + (2.0/3.0)*W75 && T <= P + (2.0/3.0)*W50) { Q = 0.75*QpR - 3*QpR/(8*(W50-W75))*(T-P-(2.0/3.0)*W75); Q = Q/10.0; // [ m³/(sxmm)] } // Tramo FG if ( T > P + (2.0/3.0)*W50 && T <= tb) { Q = 0.50*QpR - (0.5*QpR/(tb-P-(2.0/3.0)*W50))*(T-P-(2.0/3.0)*W50); Q = Q/10.0; // [ m³/(sxmm)] } return Q; } void CPLEDERHidrologiaDatos::LiberarBufferHidrogramaUnitario() /*-------------------------------------------------------------------- Ingreso : Vacío. Salida : Vacío. Propósito : Libera el buffer en ristra HidrogramaUnitarioBufer al que apunta el miembro pPrimerHU. Llamar a esta función para liberar el buffer con las ordenasas del HU , obtenidos mediante una llamada a la función ImportarHidrogramaUnitario(). --------------------------------------------------------------------*/ { if (!pPrimerHU) return; HidrogramaUnitarioBufer *nHU = pPrimerHU; HidrogramaUnitarioBufer *Siguiente = NULL; // liberar la ristra while (Siguiente = nHU->Siguiente)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
clxxxix
{ delete nHU; nHU = Siguiente; } delete nHU; pPrimerHU = NULL; } PLEDERHietogramaIilaSenamhiDlg.cpp /*-------------------------------------------------------------------- PLEDERIilaSenamhiDlg.cpp: archivo de implementación Cuadro de diálogo CPLEDERIilaSenamhiDlg -> para obtener Hietogramas mediante el método IILA SENAMHI UNI -------------------------------------------------------------------*/ #include "stdafx.h" #include "resource.h" #include "PLEDERHietogramaIilaSenamhiDlg.h" #include "PLEDERHidrologiaDatos.h" #include "PLEDERRecursosCad.h" /*-----------------------------------------------------------------*/ //Creando objetos CRecursosCad RecursosIILA; /*-----------------------------------------------------------------*/ IMPLEMENT_DYNAMIC(CPLEDERIilaSenamhiDlg, CAdUiDialog) CPLEDERIilaSenamhiDlg::CPLEDERIilaSenamhiDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERIilaSenamhiDlg::IDD, pParent, hInstance) { m_a = _T("12.12"); m_k = _T("0.533"); m_n = _T("0.254"); m_duracion = _T("3.0"); m_tr = _T("100.0"); m_PX = _T("0.00"); m_PY = _T("0.00"); } CPLEDERIilaSenamhiDlg::~CPLEDERIilaSenamhiDlg() { } /*------------------------------------------------------------------*/ BEGIN_MESSAGE_MAP(CPLEDERIilaSenamhiDlg, CAdUiDialog) ON_EN_KILLFOCUS(IDC_EDIT_a, OnKillfocusEdit_a) ON_EN_KILLFOCUS(IDC_EDIT_k, OnKillfocusEdit_k) ON_EN_KILLFOCUS(IDC_EDIT_n, OnKillfocusEdit_n) ON_EN_KILLFOCUS(IDC_EDIT_dt, OnKillfocusEdit_duracion) ON_EN_KILLFOCUS(IDC_EDIT_Tr, OnKillfocusEdit_tr) //Funcion para los cambios en el ComboBox
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxc
//ON_CBN_SELCHANGE(IDC_COMB_b, OnKillfocusCombob) // Botones ON_BN_CLICKED(IDC_BUTTON_Punto, OnButtonPUNTO) ON_BN_CLICKED(IDOK, &CPLEDERIilaSenamhiDlg::OnBnClickedOk) END_MESSAGE_MAP() /*------------------------------------------------------------------*/ void CPLEDERIilaSenamhiDlg::DoDataExchange (CDataExchange *pDX) { CAdUiDialog::DoDataExchange (pDX) ; DDX_Control(pDX, IDC_EDIT_a, m_Edit_a); DDX_Control(pDX, IDC_EDIT_k, m_Edit_k); DDX_Control(pDX, IDC_EDIT_n, m_Edit_n); DDX_Control(pDX, IDC_EDIT_dt, m_Edit_duracion); DDX_Control(pDX, IDC_EDIT_Tr, m_Edit_tr); DDX_Control(pDX, IDC_EDIT_PX, m_Edit_PX); DDX_Control(pDX, IDC_EDIT_PY, m_Edit_PY); //Botones DDX_Control(pDX, IDC_BUTTON_Punto, m_PickButton_PUNTO); //ComboBox DDX_Control(pDX, IDC_COMB_b, m_Combo_b); DDX_Control(pDX, IDC_COMB_Var, m_Combo_Var); } /*------------------------------------------------------------------*/ // Controladores de mensajes de CALC_HIDRAULIC_DLG BOOL CPLEDERIilaSenamhiDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Edit_a.SetWindowText(m_a); m_Edit_a.SetRange(0, 1000.0); m_Edit_k.SetWindowText(m_k); m_Edit_k.SetRange(0, 1000); m_Edit_n.SetWindowText(m_n); m_Edit_n.SetRange(0, 1000); m_Edit_duracion.SetWindowText(m_duracion); m_Edit_duracion.SetRange(0, 24); m_Edit_tr.SetWindowText(m_tr); m_Edit_tr.SetRange(0, 100000.0); m_Edit_PX.SetWindowText(m_PX); m_Edit_PY.SetWindowText(m_PY); m_PickButton_PUNTO.AutoLoad(); m_Combo_b.SetCurSel(1); m_Combo_Var.SetCurSel(3);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxci
return TRUE; } void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_a() { m_Edit_a.Convert(); if (!m_Edit_a.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 1000.0")); m_Edit_a.SetFocus(); m_Edit_a.SetSel(0, -1); } CString str; m_Edit_a.GetWindowText(m_a); acdbRToS(::_wtof(m_a), 2, 3, str.GetBuffer(80)); m_Edit_a.SetWindowText(str); } void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_k() { m_Edit_k.Convert(); if (!m_Edit_k.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 1000.0")); m_Edit_k.SetFocus(); m_Edit_k.SetSel(0, -1); } CString str; m_Edit_k.GetWindowText(m_k); acdbRToS(::_wtof(m_k), 2, 3, str.GetBuffer(80)); m_Edit_k.SetWindowText(str); } void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_n() { m_Edit_n.Convert(); if (!m_Edit_n.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 1000.0")); m_Edit_n.SetFocus(); m_Edit_n.SetSel(0, -1); } CString str; m_Edit_n.GetWindowText(m_n); acdbRToS(::_wtof(m_n), 2, 3, str.GetBuffer(80)); m_Edit_n.SetWindowText(str); } void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_duracion() { m_Edit_duracion.Convert(); if (!m_Edit_duracion.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 24"));
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcii
m_Edit_duracion.SetFocus(); m_Edit_duracion.SetSel(0, -1); } CString str; m_Edit_duracion.GetWindowText(m_duracion); acdbRToS(::_wtof(m_duracion), 2, 3, str.GetBuffer(80)); m_Edit_duracion.SetWindowText(str); } void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_tr() { m_Edit_tr.Convert(); if (!m_Edit_tr.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 1000.0")); m_Edit_tr.SetFocus(); m_Edit_tr.SetSel(0, -1); } CString str; m_Edit_tr.GetWindowText(m_tr); acdbRToS(::_wtof(m_tr), 2, 3, str.GetBuffer(80)); m_Edit_tr.SetWindowText(str); } void CPLEDERIilaSenamhiDlg::OnButtonPUNTO() { //Clase que habilita CAD //AcAxDocLock docLock; CAcModuleResourceOverride resourceOverride; // Esconde el diálogo BeginEditorCommand(); ads_point p1; // Coge el Punto P1 if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla [Resultados IILA]"), p1) != RTNORM ) { acutPrintf(_T("\nError al ingresar el Punto")); // si no cancela el comando(incluyendo el diálogo) // CancelEditorCommand(); CompleteEditorCommand(); return; } CompleteEditorCommand(); m_PX.Format(_T("%g"), p1[X] ); m_Edit_PX.SetWindowText(m_PX); m_PY.Format(_T("%g"), p1[Y] ); m_Edit_PY.SetWindowText(m_PY); } void CPLEDERIilaSenamhiDlg::OnBnClickedOk() { // TODO : Add extra validation here m_Edit_a.GetWindowText(m_a);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxciii
m_Edit_k.GetWindowText(m_k); m_Edit_n.GetWindowText(m_n); m_Edit_duracion.GetWindowText(m_duracion); m_Edit_tr.GetWindowText(m_tr); m_Edit_PX.GetWindowText(m_PX); m_Edit_PY.GetWindowText(m_PY); int nIndex = m_Combo_b.GetCurSel(); m_Combo_b.GetLBText(nIndex,m_b); nIndex = m_Combo_Var.GetCurSel(); m_Combo_Var.GetLBText(nIndex,m_variacion); CDialog::OnOK(); } PLEDERHietogramaNrcsDlg.cpp /*-------------------------------------------------------------------- PLEDERNRCSDlg.cpp: archivo de implementación Cuadro de diálogo CPLEDERNrcsDlg -> para obtener Hietogramas mediante el método NRCS --------------------------------------------------------------------*/ #include "stdafx.h" #include "PLEDERHietogramaNrcsDlg.h" #include "PLEDERRecursosCad.h" #include "PLEDERHidrologiaCalculos.h" /*------------------------------------------------------------------*/ //Creando objetos CRecursosCad RecursosNRCS; CPLEDERHidrologiaCalculos HidrologiaNRCS; /*------------------------------------------------------------------*/ IMPLEMENT_DYNAMIC(CPLEDERNrcsDlg, CAdUiDialog) CPLEDERNrcsDlg::CPLEDERNrcsDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERNrcsDlg::IDD, pParent, hInstance) { m_P24 = _T("56.75"); m_NPX = _T("0.00"); m_NPY = _T("0.00"); } CPLEDERNrcsDlg::~CPLEDERNrcsDlg() { } BEGIN_MESSAGE_MAP(CPLEDERNrcsDlg, CAdUiDialog) ON_EN_KILLFOCUS(IDC_EDIT_P24, OnKillfocusEdit_P24)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxciv
// Botones ON_BN_CLICKED(IDC_BUTTON_Npunto, OnButtonNPUNTO) ON_BN_CLICKED(IDOK, &CPLEDERNrcsDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPLEDERNrcsDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange (pDX) ; DDX_Control(pDX, IDC_EDIT_P24, m_Edit_P24); DDX_Control(pDX, IDC_EDIT_NPX, m_Edit_NPX); DDX_Control(pDX, IDC_EDIT_NPY, m_Edit_NPY); //ComboBox DDX_Control(pDX, IDC_COMBO_Ndt, m_Combo_Ndt); DDX_Control(pDX, IDC_COMBO_Ntormenta, m_Combo_Tormenta); //Botones DDX_Control(pDX, IDC_BUTTON_Npunto, m_PickButton_NPUNTO); } BOOL CPLEDERNrcsDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Edit_P24.SetWindowText(m_P24); m_Edit_P24.SetRange(0, 10000.0); m_Edit_NPX.SetWindowText(m_NPX); m_Edit_NPY.SetWindowText(m_NPY); m_PickButton_NPUNTO.AutoLoad(); m_Combo_Ndt.SetCurSel(3); m_Combo_Tormenta.SetCurSel(2); return TRUE; } void CPLEDERNrcsDlg::OnKillfocusEdit_P24() { m_Edit_P24.Convert(); if (!m_Edit_P24.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 10000.0")); m_Edit_P24.SetFocus(); m_Edit_P24.SetSel(0, -1); } CString str; m_Edit_P24.GetWindowText(m_P24); acdbRToS(::_wtof(m_P24), 2, 3, str.GetBuffer(80)); m_Edit_P24.SetWindowText(str); } void CPLEDERNrcsDlg::OnButtonNPUNTO() { //Clase que habilita CAD
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcv
//AcAxDocLock docLock; CAcModuleResourceOverride resourceOverride; // Esconde el diálogo BeginEditorCommand(); ads_point p1; // Coge el Punto P1 if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla [Resultados NRCS]"), p1) != RTNORM ) { acutPrintf(_T("\nError al ingresar el Punto")); // si no cancela el comando(incluyendo el diálogo) // CancelEditorCommand(); CompleteEditorCommand(); return; } CompleteEditorCommand(); m_NPX.Format(_T("%g"), p1[X] ); m_Edit_NPX.SetWindowText(m_NPX); m_NPY.Format(_T("%g"), p1[Y] ); m_Edit_NPY.SetWindowText(m_NPY); } void CPLEDERNrcsDlg::OnBnClickedOk() { // TODO : Add extra validation here m_Edit_P24.GetWindowText(m_P24); m_Edit_NPX.GetWindowText(m_NPX); m_Edit_NPY.GetWindowText(m_NPY); int nIndexNdt = m_Combo_Ndt.GetCurSel(); m_Combo_Ndt.GetLBText(nIndexNdt,m_Ndt); m_Combo_Tormenta.GetLBText(nIndexNdt,m_Tipo); m_Tormenta = m_Combo_Tormenta.GetCurSel(); // Coge la posisión del combo Tormenta CDialog::OnOK(); } PLEDERHUNRCSDlg.cpp // PLEDERHUNRCSDlg.cpp: archivo de implementación // #include "stdafx.h" #include "PLEDERHUNRCSDlg.h" // Cuadro de diálogo de PLEDERHUNRCSDlg
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcvi
IMPLEMENT_DYNAMIC(CPLEDERHUNRCSDlg, CDialog) CPLEDERHUNRCSDlg::CPLEDERHUNRCSDlg(CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERHUNRCSDlg::IDD, pParent, hInstance) { m_TipoTc = 0; m_long = _T("103.38"); m_pend = _T("23.00"); m_tc = _T("42.24"); m_tlag1 = _T("25.35"); } CPLEDERHUNRCSDlg::~CPLEDERHUNRCSDlg() { } BEGIN_MESSAGE_MAP(CPLEDERHUNRCSDlg, CAdUiDialog) // Cajas de texto ON_EN_KILLFOCUS(IDC_EDIT_long, OnKillfocusEdit_long) ON_EN_KILLFOCUS(IDC_EDIT_pend, OnKillfocusEdit_pend) ON_EN_KILLFOCUS(IDC_EDIT_tc, OnKillfocusEdit_tc) // Botones ON_BN_CLICKED(IDC_BUTTON_Long, OnButtonLong) ON_BN_CLICKED(IDC_BUTTON_Pend, OnButtonPend) // Radios (cambios en los Radios) ON_BN_CLICKED(IDC_RADIO_Kirpich, OnRadioKirpich) ON_BN_CLICKED(IDC_RADIO_usuario, OnRadioUsuario) ON_BN_CLICKED(IDOK, &CPLEDERHUNRCSDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPLEDERHUNRCSDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_long, m_Edit_long); DDX_Control(pDX, IDC_EDIT_pend, m_Edit_pend); DDX_Control(pDX, IDC_EDIT_tc, m_Edit_tc); DDX_Control(pDX, IDC_EDIT_tlag1, m_Edit_tlag1); // Radio DDX_Radio(pDX, IDC_RADIO_Kirpich, m_TipoTc); // Botones (CAD) DDX_Control(pDX, IDC_BUTTON_Long, m_PickButton_Long); DDX_Control(pDX, IDC_BUTTON_Pend, m_PickButton_Pend); } BOOL CPLEDERHUNRCSDlg::OnInitDialog() { CDialog::OnInitDialog();
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcvii
// Activar radio Kirpich CButton *pTipoTc; pTipoTc = (CButton *)GetDlgItem(IDC_RADIO_Kirpich); pTipoTc->SetCheck(1); m_TipoTc = 0; // Inicializa Cajas de texto m_Edit_long.SetWindowText(m_long); m_Edit_pend.SetWindowText(m_pend); m_Edit_tc.SetWindowText(m_tc); m_Edit_tlag1.SetWindowText(m_tlag1); // Inicializa el boton tipo Cad m_PickButton_Long.AutoLoad(); m_PickButton_Pend.AutoLoad(); return TRUE; } void CPLEDERHUNRCSDlg::OnKillfocusEdit_long() { CString str; m_Edit_long.GetWindowText(m_long); acdbRToS(::_wtof(m_long), 2, 3, str.GetBuffer(80)); m_Edit_long.SetWindowText(str); // Calcula el Tiempo de Concentración onCalcularTc(); // Calcula el Tiempo de retardo (tlag) m_Edit_tc.GetWindowText(m_tc); float Tlag, Tc; Tc = _wtof(m_tc); Tlag = 0.6*Tc; m_tlag1.Format(_T("%g"), Tlag); m_Edit_tlag1.SetWindowText(m_tlag1); } void CPLEDERHUNRCSDlg::OnKillfocusEdit_pend() { CString str; m_Edit_pend.GetWindowText(m_pend); acdbRToS(::_wtof(m_pend), 2, 5, str.GetBuffer(80)); m_Edit_pend.SetWindowText(str); // Calcula el Tiempo de Concentración onCalcularTc(); // Calcula el Tiempo de retardo (tlag) m_Edit_tc.GetWindowText(m_tc); float Tlag, Tc; Tc = _wtof(m_tc); Tlag = 0.6*Tc;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcviii
m_tlag1.Format(_T("%g"), Tlag); m_Edit_tlag1.SetWindowText(m_tlag1); } void CPLEDERHUNRCSDlg::OnKillfocusEdit_tc() { // Calcula el Tiempo de retardo (tlag) m_Edit_tc.GetWindowText(m_tc); float Tlag, Tc; Tc = _wtof(m_tc); Tlag = 0.6*Tc; m_tlag1.Format(_T("%g"), Tlag); m_Edit_tlag1.SetWindowText(m_tlag1); } void CPLEDERHUNRCSDlg::OnRadioKirpich() { // Activa las casillas de la ventana m_Edit_long.EnableWindow(1); m_Edit_pend.EnableWindow(1); CStatic *pPend; pPend = (CStatic *)GetDlgItem(IDC_STATIC_pend); pPend->EnableWindow(1); CStatic *pLong; pLong = (CStatic *)GetDlgItem(IDC_STATIC_long); pLong->EnableWindow(1); CButton *pBLong; pBLong = (CButton *)GetDlgItem(IDC_BUTTON_Long); pBLong->EnableWindow(1); CButton *pBPend; pBPend = (CButton *)GetDlgItem(IDC_BUTTON_Pend); pBPend->EnableWindow(1); // Desactiva la caja de texto tc m_Edit_tc.EnableWindow(0); } void CPLEDERHUNRCSDlg::OnRadioUsuario() { // Desactiva las casillas de la ventana m_Edit_long.EnableWindow(0); m_Edit_pend.EnableWindow(0); CStatic *pPend; pPend = (CStatic *)GetDlgItem(IDC_STATIC_pend); pPend->EnableWindow(0); CStatic *pLong; pLong = (CStatic *)GetDlgItem(IDC_STATIC_long); pLong->EnableWindow(0);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cxcix
CButton *pBLong; pBLong = (CButton *)GetDlgItem(IDC_BUTTON_Long); pBLong->EnableWindow(0); CButton *pBPend; pBPend = (CButton *)GetDlgItem(IDC_BUTTON_Pend); pBPend->EnableWindow(0); // Activa la caja de texto tc m_Edit_tc.EnableWindow(1); } void CPLEDERHUNRCSDlg::OnButtonLong() { //Esconde el diálogo BeginEditorCommand(); int rc; double area; ads_point punto; ads_name nombrep; if (acedEntSel(_T("\nSelecione el curso principal de la cuenca [Polilinea]:\n"), nombrep , punto) != RTNORM) { acutPrintf(_T("\nPLEDER: !ERROR!\nal seleccionar la Polilinea")); CompleteEditorCommand(); return; } AcDbObjectId ID; AcDbEntity *pEnt; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { CompleteEditorCommand(); return acdbFail(_T("\nPLEDER: !ERROR!\nal tomar el ObjectId de la entidad [acdbGetObjectId].")); } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { CompleteEditorCommand(); return acdbFail(_T("\nPLEDER: !ERROR!\nal abrir el Objeto ")); } // chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) { pEnt->close(); CompleteEditorCommand(); return acdbFail(_T("\nTipo de entidad inesperada ")); } //Retorna al diálogo CompleteEditorCommand();
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cc
AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt; // chequear si la Polyline tiene elevación cero if (pPolyline->elevation() != 0) { pPolyline->close(); CompleteEditorCommand(); acutPrintf(_T("\nLa polyline no tiene elevación 0.")); } unsigned int numVerts; // Tomar el número de vértices de la polyline numVerts = pPolyline->numVerts(); if (numVerts <= 2) { pPolyline->close(); CompleteEditorCommand(); return acdbFail(_T("\nPLEDER: !ERROR!\nPolyline no válida ")); } AcGeLineSeg2d ls; AcGePoint2d start, end; ads_point v0, v1; unsigned int i; double Lc=0.00; //longitud de la cuenca v0[Z] = v1[Z] = 0; // recorrer los vértices y calcular la distancia for (i = 0; i < numVerts - 1; i++) { pPolyline->getLineSegAt(i, ls); start = ls.startPoint(); end = ls.endPoint(); v0[X] = start.x; v0[Y] = start.y; v1[X] = end.x; v1[Y] = end.y; Lc = Lc + acutDistance(v0 , v1); } pPolyline->close(); m_long.Format(_T("%g"),Lc/1000.0); //Conversion a km2 m_Edit_long.SetWindowText(m_long); } void CPLEDERHUNRCSDlg::OnButtonPend() { //Esconde el diálogo BeginEditorCommand(); ads_point p1, p2; //Coge el Primer Punto P1 if (acedGetPoint (NULL, _T("\nIngrese el primer Punto [cota menor]"), p1) != RTNORM ) {
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cci
acutPrintf(_T("\nPLEDER: !ERROR!\nal ingresar el Punto")); // si no cancela el comando(incluyendo el diálogo) //CancelEditorCommand(); CompleteEditorCommand(); return; } int contador =0; double angle, s, l, S =0.0, L=0.0 , ls=0.0; while (true) { // Cogen los puntos siguienes if (acedGetPoint(p1, _T("\nSiguiente punto: "), p2) != RTNORM) { // se canceló o pulsó enter // cancela el comando (incluyendo el diálogo) //CancelEditorCommand(); CompleteEditorCommand(); if(contador == 0) { S=0.0; } else { S=S*100.0; } m_pend.Format(_T("%g"), S ); m_Edit_pend.SetWindowText(m_pend); return; } contador++; // siguiente //Calculo de la pendiente del curso principal //empleando la ecuación de taylor y Schwarz s = abs((p1[Y]-p2[Y]))/abs((p2[X]-p1[X])); acutPrintf(_T("Pendiente %d: %0.2f%s"), contador, s*100.0, "%"); ls = (1.0/sqrt(s))+ ls; S = pow((contador/ls),2.0); p1[X]=p2[X]; p1[Y]=p2[Y]; p1[Z]=0.0; }//while } // Cálculo del tiempo de concentración Kirpich void CPLEDERHUNRCSDlg::onCalcularTc() { m_Edit_long.GetWindowText(m_long); m_Edit_pend.GetWindowText(m_pend); float L, S, Tc, exp1 =0.77, exp2 =0.385;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccii
L = _wtof(m_long); S = _wtof(m_pend); //Cálculo del tiempo de concentración Tc = 3.97*pow(L,exp1)/(pow(S, exp2)); m_tc.Format(_T("%g"), Tc); m_Edit_tc.SetWindowText(m_tc); } void CPLEDERHUNRCSDlg::onCalcularTlag() { m_Edit_long.GetWindowText(m_long); m_Edit_pend.GetWindowText(m_pend); float L, S, Tc, exp1 =0.77, exp2 =0.385; L = _wtof(m_long); S = _wtof(m_pend); //Cálculo del tiempo de concentración Tc = 3.97*pow(L,exp1)/(pow(S, exp2)); m_tc.Format(_T("%g"), Tc); m_Edit_tc.SetWindowText(m_tc); } void CPLEDERHUNRCSDlg::OnBnClickedOk() { // TODO : Add extra validation here m_Edit_long.GetWindowText(m_long); m_Edit_pend.GetWindowText(m_pend); m_Edit_tc.GetWindowText(m_tc); CDialog::OnOK(); } PLEDERHUSnyderDlg.cpp // PLEDERHUSNYDERDlg.cpp: archivo de implementación // #include "stdafx.h" #include "PLEDERHUSnyderDlg.h" // Cuadro de diálogo de CPLEDERHUSNYDERDlg IMPLEMENT_DYNAMIC(CPLEDERHUSNYDERDlg, CDialog) CPLEDERHUSNYDERDlg::CPLEDERHUSNYDERDlg(CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERHUSNYDERDlg::IDD, pParent, hInstance) { m_TipoCalc = 0; m_area = _T("3500.00");
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cciii
m_L = _T("150.00"); m_Lc = _T("75.00"); m_TR = _T("12.00"); m_TpR = _T("34.00"); m_Qp = _T("157.50"); m_Ct = _T("2.64"); m_tp = _T("32.51"); m_Cp = _T("0.56"); } CPLEDERHUSNYDERDlg::~CPLEDERHUSNYDERDlg() { } BEGIN_MESSAGE_MAP(CPLEDERHUSNYDERDlg, CAdUiDialog) // Cajas de texto ON_EN_KILLFOCUS(IDC_EDIT_SNa, OnKillfocusEdit_Area) ON_EN_KILLFOCUS(IDC_EDIT_SNl, OnKillfocusEdit_L) ON_EN_KILLFOCUS(IDC_EDIT_SNlc, OnKillfocusEdit_Lc) ON_EN_KILLFOCUS(IDC_EDIT_SNtr, OnKillfocusEdit_TR) ON_EN_KILLFOCUS(IDC_EDIT_SNtpr, OnKillfocusEdit_TpR) ON_EN_KILLFOCUS(IDC_EDIT_SNqp, OnKillfocusEdit_Qp) ON_EN_KILLFOCUS(IDC_EDIT_SNct, OnKillfocusEdit_Ct) ON_EN_KILLFOCUS(IDC_EDIT_SNtp, OnKillfocusEdit_tp) ON_EN_KILLFOCUS(IDC_EDIT_SNcp, OnKillfocusEdit_Cp) // Radios (cambios en los Radios) ON_BN_CLICKED(IDC_RADIO_SNcalcular, OnRadioCalcularC) ON_BN_CLICKED(IDC_RADIO_SNusuario, OnRadioUsuarioC) ON_BN_CLICKED(IDOK, &CPLEDERHUSNYDERDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPLEDERHUSNYDERDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_SNa, m_Edit_Area); DDX_Control(pDX, IDC_EDIT_SNl, m_Edit_L); DDX_Control(pDX, IDC_EDIT_SNlc, m_Edit_Lc); DDX_Control(pDX, IDC_EDIT_SNtr, m_Edit_TR); DDX_Control(pDX, IDC_EDIT_SNtpr, m_Edit_TpR); DDX_Control(pDX, IDC_EDIT_SNqp, m_Edit_Qp); DDX_Control(pDX, IDC_EDIT_SNct, m_Edit_Ct); DDX_Control(pDX, IDC_EDIT_SNtp, m_Edit_tp); DDX_Control(pDX, IDC_EDIT_SNcp, m_Edit_Cp); // Radio DDX_Radio(pDX, IDC_RADIO_SNcalcular, m_TipoCalc); } BOOL CPLEDERHUSNYDERDlg::OnInitDialog() { CDialog::OnInitDialog(); // Activar radio Kirpich CButton *pTipoCalc;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
cciv
pTipoCalc = (CButton *)GetDlgItem(IDC_RADIO_SNcalcular); pTipoCalc->SetCheck(1); m_TipoCalc = 0; // Inicializa Cajas de texto m_Edit_Area.SetWindowText(m_area); m_Edit_L.SetWindowText(m_L); m_Edit_Lc.SetWindowText(m_Lc); m_Edit_TR.SetWindowText(m_TR); m_Edit_TpR.SetWindowText(m_TpR); m_Edit_Qp.SetWindowText(m_Qp); m_Edit_Ct.SetWindowText(m_Ct); m_Edit_tp.SetWindowText(m_tp); m_Edit_Cp.SetWindowText(m_Cp); m_Edit_Cp.SetRange(0.1, 1); return TRUE; } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Area() { CString str; m_Edit_Area.GetWindowText(m_area); acdbRToS(::_wtof(m_area), 2, 3, str.GetBuffer(80)); m_Edit_Area.SetWindowText(str); // Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_L() { CString str; m_Edit_L.GetWindowText(m_L); acdbRToS(::_wtof(m_L), 2, 3, str.GetBuffer(80)); m_Edit_L.SetWindowText(str); // Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Lc() { CString str; m_Edit_Lc.GetWindowText(m_Lc); acdbRToS(::_wtof(m_Lc), 2, 3, str.GetBuffer(80)); m_Edit_Lc.SetWindowText(str); // Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_TR() { CString str; m_Edit_TR.GetWindowText(m_TR); acdbRToS(::_wtof(m_TR), 2, 3, str.GetBuffer(80)); m_Edit_TR.SetWindowText(str);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccv
// Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_TpR() { CString str; m_Edit_TpR.GetWindowText(m_TpR); acdbRToS(::_wtof(m_TpR), 2, 3, str.GetBuffer(80)); m_Edit_TpR.SetWindowText(str); // Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Qp() { CString str; m_Edit_Qp.GetWindowText(m_Qp); acdbRToS(::_wtof(m_Qp), 2, 3, str.GetBuffer(80)); m_Edit_Qp.SetWindowText(str); // Calcula los Coeficientes Ct y Cp onCalcularCtCp(); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Ct() { CString str; m_Edit_Ct.GetWindowText(m_Ct); acdbRToS(::_wtof(m_Ct), 2, 3, str.GetBuffer(80)); m_Edit_Ct.SetWindowText(str); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_tp() { CString str; m_Edit_tp.GetWindowText(m_tp); acdbRToS(::_wtof(m_tp), 2, 3, str.GetBuffer(80)); m_Edit_tp.SetWindowText(str); } void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Cp() { m_Edit_Cp.Convert(); if (!m_Edit_Cp.Validate()) { ::AfxMessageBox(_T("Coeficiente Cp no Válido, \nrango = 0.1 @ 1")); m_Edit_Cp.SetFocus(); m_Edit_Cp.SetSel(0, -1); } CString str; m_Edit_Cp.GetWindowText(m_Cp); acdbRToS(::_wtof(m_Cp), 2, 3, str.GetBuffer(80));
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccvi
m_Edit_Cp.SetWindowText(str); } // Cálculo del tiempo de concentración Kirpich void CPLEDERHUSNYDERDlg::onCalcularCtCp() { m_Edit_Area.GetWindowText(m_area); m_Edit_L.GetWindowText(m_L); m_Edit_Lc.GetWindowText(m_Lc); m_Edit_TR.GetWindowText(m_TR); m_Edit_TpR.GetWindowText(m_TpR); m_Edit_Qp.GetWindowText(m_Qp); float A, L, Lc, tR, tpR, Qp, Ct, Cp, exp1 = 0.30; float qp, tp, tr, qpR; A = _wtof(m_area); L = _wtof(m_L); Lc = _wtof(m_Lc); tR = _wtof(m_TR); tpR = _wtof(m_TpR); Qp = _wtof(m_Qp); qp = Qp/A; if (tpR == 5.5*tR) { tr = tR; tp = tpR; Ct = tp/(0.75*pow(L*Lc,exp1)); qpR = qp; Cp = qpR*tpR/2.75; } else { tr = (tpR - 0.25*tR)/5.25; tp = 5.5*tr; Ct = tp/(0.75*pow(L*Lc,exp1)); qpR = qp; Cp = qpR*tpR/2.75; } m_Ct.Format(_T("%g"), Ct); m_Edit_Ct.SetWindowText(m_Ct); m_tp.Format(_T("%g"), tp); m_Edit_tp.SetWindowText(m_tp); m_Cp.Format(_T("%g"), Cp);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccvii
m_Edit_Cp.SetWindowText(m_Cp); } void CPLEDERHUSNYDERDlg::onMensajesCp() { float Cp = _wtof(m_Cp); if ( Cp < 0.1 | Cp > 1 ) { ::AfxMessageBox(_T("coefieinte Cp no Válido, \nrango = 0.1 @ 1")); } } void CPLEDERHUSNYDERDlg::OnRadioCalcularC() { // Activa las casillas de la ventana m_Edit_Area.EnableWindow(1); m_Edit_L.EnableWindow(1); m_Edit_Lc.EnableWindow(1); m_Edit_TR.EnableWindow(1); m_Edit_TpR.EnableWindow(1); m_Edit_Qp.EnableWindow(1); // Desactiva la caja de texto tc m_Edit_Ct.EnableWindow(0); m_Edit_tp.EnableWindow(0); m_Edit_Cp.EnableWindow(0); } void CPLEDERHUSNYDERDlg::OnRadioUsuarioC() { // Activa las casillas de la ventana m_Edit_Area.EnableWindow(0); m_Edit_L.EnableWindow(0); m_Edit_Lc.EnableWindow(0); m_Edit_TR.EnableWindow(0); m_Edit_TpR.EnableWindow(0); m_Edit_Qp.EnableWindow(0); // Desactiva la caja de texto tc m_Edit_Ct.EnableWindow(0); m_Edit_tp.EnableWindow(1); m_Edit_Cp.EnableWindow(1); } void CPLEDERHUSNYDERDlg::OnBnClickedOk() { // TODO : Add extra validation here m_Edit_Ct.GetWindowText(m_Ct); m_Edit_Cp.GetWindowText(m_Cp); CDialog::OnOK(); m_Edit_Cp.GetWindowText(m_Cp); float Cp = _wtof(m_Cp);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccviii
if ( Cp < 0.1 | Cp > 1 ) { ::AfxMessageBox(_T("Verifique el Coeficiente Cp, \nrango = 0.1 @ 1")); } } PLEDERLluviaEscorrentiaDlg.cpp /*-------------------------------------------------------------------- PLEDERLluviaEscorrentiaDlg.cpp: archivo de implementación Cuadro de diálogo CPLEDERLluviaEscorrentiaDlg -> Calcula la transformación de la lluvia escorrentía (hietogramas -> Hidrogramas) -------------------------------------------------------------------*/ #include "stdafx.h" #include "PLEDERLluviaEscorrentiaDlg.h" #include "PLEDERRecursosCad.h" #include "PLEDERHidrologiaCalculos.h" #include "PLEDERHUNRCSDlg.h" #include "PLEDERHUSnyderDlg.h" #include "PLEDERHidrologiaDatos.h" #include "PLEDERCurvaNumeroDlg.h" #include "PLEDERHietogramaNrcsDlg.h" #include "PLEDERHietogramaIilaSenamhiDlg.h" /*------------------------------------------------------------------*/ //Creando objetos CRecursosCad RecursosLLES; CPLEDERHidrologiaCalculos HidrologiaLLES; /*------------------------------------------------------------------*/ IMPLEMENT_DYNAMIC(CPLEDERLluviaEscorrentiaDlg, CAdUiDialog) CPLEDERLluviaEscorrentiaDlg::CPLEDERLluviaEscorrentiaDlg(CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERLluviaEscorrentiaDlg::IDD, pParent, hInstance) { m_area = _T("1810.34"); m_qb = _T("0.00"); m_cn = _T("73"); m_ppx = _T("0.0"); m_ppy = _T("0.0"); computadoMM = false; computadoHU = false; } CPLEDERLluviaEscorrentiaDlg::~CPLEDERLluviaEscorrentiaDlg() { } BEGIN_MESSAGE_MAP(CPLEDERLluviaEscorrentiaDlg, CAdUiDialog)
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccix
// Cajas de Texto //ON_EN_KILLFOCUS(IDC_EDIT_area, OnKillfocusEdit_AREA) //ON_EN_KILLFOCUS(IDC_EDIT_qb, OnKillfocusEdit_QB) ON_EN_KILLFOCUS(IDC_EDIT_cn, OnKillfocusEdit_CN) // Combo Box ON_CBN_SELCHANGE(IDC_COMBO_hus, OnKillfocusComboHUS) ON_CBN_SELCHANGE(IDC_COMBO_mm, OnKillfocusComboMM) ON_CBN_SELCHANGE(IDC_COMBO_intert, OnKillfocusComboINTERT) // Botones incluidos cad ON_BN_CLICKED(IDC_BUTTON_area, OnButtonAREA) ON_BN_CLICKED(IDC_BUTTON_PPunto, OnButtonPPUNTO) ON_BN_CLICKED(IDC_BUTTON_cn, OnCALCCurvaNumero) ON_BN_CLICKED(IDC_BUTTON_hus, OnCALCHidrogramaUnitario) ON_BN_CLICKED(IDC_BUTTON_mm, OnCALCPrecipitaciones) ON_BN_CLICKED(IDOK, &CPLEDERLluviaEscorrentiaDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPLEDERLluviaEscorrentiaDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_area, m_Edit_AREA); DDX_Control(pDX, IDC_EDIT_qb, m_Edit_QB); DDX_Control(pDX, IDC_EDIT_cn, m_Edit_CN); DDX_Control(pDX, IDC_EDIT_PPX, m_Edit_PPX); DDX_Control(pDX, IDC_EDIT_PPY, m_Edit_PPY); //ComboBox. DDX_Control(pDX, IDC_COMBO_hus, m_Combo_HUS); DDX_Control(pDX, IDC_COMBO_mm, m_Combo_MM); DDX_Control(pDX, IDC_COMBO_intert, m_Combo_INTERT); // Botones (Sólo CAD) DDX_Control(pDX, IDC_BUTTON_area, m_PickButton_AREA); DDX_Control(pDX, IDC_BUTTON_PPunto, m_PickButton_PPUNTO); // Botones (Diálogo) DDX_Control(pDX, IDC_BUTTON_hus, m_Button_HUS); } BOOL CPLEDERLluviaEscorrentiaDlg::OnInitDialog() { CDialog::OnInitDialog(); // Inicializa Cajas de texto m_Edit_AREA.SetWindowText(m_area); m_Edit_QB.SetWindowText(m_qb); m_Edit_CN.SetWindowText(m_cn); m_Edit_CN.SetRange(1, 100);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccx
m_Edit_PPX.SetWindowText(m_ppx); m_Edit_PPY.SetWindowText(m_ppy); // Inicializa Bombo box m_Combo_HUS.SetCurSel(0); m_Combo_MM.SetCurSel(0); m_Combo_INTERT.SetCurSel(3); // Inicializa el boton tipo Cad m_PickButton_AREA.AutoLoad(); m_PickButton_PPUNTO.AutoLoad(); return TRUE; } void CPLEDERLluviaEscorrentiaDlg::OnKillfocusEdit_CN() { m_Edit_CN.Convert(); if (!m_Edit_CN.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 100.0")); m_Edit_CN.SetFocus(); m_Edit_CN.SetSel(0, -1); } CString str; m_Edit_CN.GetWindowText(m_cn); acdbRToS(::_wtof(m_cn), 2, 0, str.GetBuffer(80)); m_Edit_CN.SetWindowText(str); } void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboHUS() { } void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboMM() { } void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboINTERT() { } void CPLEDERLluviaEscorrentiaDlg::OnButtonAREA() { //Esconde el diálogo BeginEditorCommand(); int rc;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxi
double area; ads_point punto; ads_name nombrep; if (acedEntSel(_T("\nSelecione La Cuenca [Polilinea]:\n"), nombrep , punto) != RTNORM) { acutPrintf(_T("\nError al seleccionar la Polilinea")); CompleteEditorCommand(); return; } AcDbObjectId ID; AcDbEntity *pEnt; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { CompleteEditorCommand(); return acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { CompleteEditorCommand(); return acdbFail(_T("\nError al abrir el Objeto ")); } // chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) { pEnt->close(); CompleteEditorCommand(); return acdbFail(_T("\nTipo de entidad inesperada ")); } //Retorna al diálogo CompleteEditorCommand(); AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt; pPolyline->getArea(area); pPolyline->close(); m_area.Format(_T("%g"),area/1000000.0);//Conversión a km2 m_Edit_AREA.SetWindowText(m_area); } void CPLEDERLluviaEscorrentiaDlg::OnButtonPPUNTO() { //Clase que habilita CAD //AcAxDocLock docLock; CAcModuleResourceOverride resourceOverride; // Esconde el diálogo BeginEditorCommand(); ads_point p1;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxii
// Coge el Punto P1 if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla [Resultados PLEDER]"), p1) != RTNORM ) { acutPrintf(_T("\nError al ingresar el Punto")); // si no cancela el comando(incluyendo el diálogo) // CancelEditorCommand(); CompleteEditorCommand(); return; } CompleteEditorCommand(); m_ppx.Format(_T("%g"), p1[X] ); m_Edit_PPX.SetWindowText(m_ppx); m_ppy.Format(_T("%g"), p1[Y] ); m_Edit_PPY.SetWindowText(m_ppy); } void CPLEDERLluviaEscorrentiaDlg::OnCALCCurvaNumero() { //Declaracion de Objetos diálogos CPLEDERCurvaNumeroDlg dlgCNC(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgCNC.DoModal() != IDOK) { acutPrintf(_T("\nPLEDER: Se Canceló la Operación")); return; } m_Edit_CN.SetWindowText(dlgCNC.m_cnc); } void CPLEDERLluviaEscorrentiaDlg::OnCALCHidrogramaUnitario() { m_hus = m_Combo_HUS.GetCurSel(); // Coge la posición del combo hus switch (m_hus) { case 0: // HUS NRCS { //Declaracion de Objetos diálogos CPLEDERHUNRCSDlg dlgHUNRCS(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgHUNRCS.DoModal() != IDOK) { acutPrintf(_T("\nPLEDER: Se Canceló la Operación[HUS NRCS]")); return; } Tretardo = _wtof(dlgHUNRCS.m_tlag1); computadoHU = true; break; }
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxiii
case 1: // HUS Snyder { //Declaracion de Objetos diálogos CPLEDERHUSNYDERDlg dlgHUSN(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgHUSN.DoModal() != IDOK) { acutPrintf(_T("\nPLEDER: Se Canceló la Operación[HUS SNYDER]")); return; } tp = _wtof(dlgHUSN.m_tp); Cp = _wtof(dlgHUSN.m_Cp); computadoHU = true; break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (m_hus) } void CPLEDERLluviaEscorrentiaDlg::OnCALCPrecipitaciones() { pNP = 0; m_mm = m_Combo_MM.GetCurSel(); // Coge la posición del combo mm switch (m_mm) { case 0: // Tormenta NRCS { CPLEDERNrcsDlg dlgNRCS(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgNRCS.DoModal() != IDOK) { pNP = 0; // Una forma de saber si se calculó o no acutPrintf(_T("\nPLEDER: Se Canceló la Operación")); return; } // Variables Hietograma NRCS float P24, // Precipitación máxima de 24 horas. Ndt, // Intervalo de tiempo de la lluvia (min) PX, // Punto de referencia X. PY; // Punto de referencia Y. int Tormenta; // Tipo de tormenta // 0 : Tipo I // 1 : Tipo IA // 2 : Tipo II // 3 : Tipo III //Coge las variables del diálogo IILA P24 = _wtof(dlgNRCS.m_P24); Ndt = _wtof(dlgNRCS.m_Ndt); Tormenta =dlgNRCS.m_Tormenta; PX =_wtof(dlgNRCS.m_NPX);
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxiv
PY =_wtof(dlgNRCS.m_NPY); // Variables para los reesultados. Max = 241 valores para Ndt 10 minutos. float *ND= new float[241]; // Lista de duración o tiempo (min). float *TipoT = new float[241];// Lista de la
distribución de la tormenta elegida float *NPacum = new float[241]; // Lista de Precipitaciones acumuladas (mm). float *NPincr = new float[241]; // Lista de
Precipitaciones incrementales (mm). // hietogramas mediante la distribución NRCS if ( HidrologiaLLES.HietogramaNRCS(P24, Ndt, Tormenta, ND, TipoT, NPacum, NPincr)!= RTNORM) { acdbFail(_T("\nError: HietogramaNRCS")); return; } // Traspasa los resultados a la variable global //PaltAcum[0] = 0.0; PaltAcum[1] = 0.0; for (int i =1; i <= 24/(Ndt/60)+1; i++ ) {
Palternaincremental[i] = NPincr[i]; // Precipitación alterna PaltAcum[i+1] = PaltAcum[i]+ NPincr[i+1]; // Precipitación alterna acumulada
}// For i
pNP = 24/(Ndt/60); // número de elementos de la lista de precipitaciones
Duracion = Ndt; computadoMM = true; delete [] ND; delete [] TipoT; delete [] NPacum; delete [] NPincr; break; } case 1: // IILA { CPLEDERIilaSenamhiDlg dlgIILA(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgIILA.DoModal() != IDOK) { pNP = 0; // Una forma de saber si se calculó o no acutPrintf(_T("\nPLEDER: Se Canceló la Operación")); return; } //Variables Parámetros regionales
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxv
float a, //Parámetro regional k, //Parámetro regional b, //Parámetro regional: 0.5 horas Costa //: 0.4 horas Sierra //: 0.2 horas Costa Norte y selava n, //Parámetro regional dt, //Duración de la lluvia (hr) var, //Variación (min) Tr, //Periodo de retorno (años) PX, //Punto de referencia X. PY; //Punto de referencia Y. //Coge las variables del diálogo IILA a = _wtof(dlgIILA.m_a); k = _wtof(dlgIILA.m_k); b = _wtof(dlgIILA.m_b); n = _wtof(dlgIILA.m_n); dt = _wtof(dlgIILA.m_duracion); var =_wtof(dlgIILA.m_variacion); Tr =_wtof(dlgIILA.m_tr); PX =_wtof(dlgIILA.m_PX); PY =_wtof(dlgIILA.m_PY); int N =dt*60/var; // Número de intervalos de tiempo. float *D= new float[N+1];// Lista de duración o tiempo (min). float *Pacum = new float[N+1];// Lista de
Precipitaciones acumuladas (mm). float *Pincr = new float[N+1];// Lista de
Precipitaciones incrementales (mm). float *Palte = new float[N+1];// Lista de
precipitaciones alternales (mm) -> Hietograma //Precipitaciones Totales mediante el metodo de IILA SENAMHI UNI if ( HidrologiaLLES.HietogramaIILA(N,a,b,k,n,dt,var,Tr, D, Pacum, Pincr, Palte)!= RTNORM) { acdbFail(_T("\nError: HietogramaIILA")); return; } PaltAcum[1] = 0.0; Palternaincremental[1] = 0.0; // Traspasa los resultados a la variable global for (int i =1; i <= N+1; i++ ) { Palternaincremental[i+1] = Palte[i]; PaltAcum[i+1] = PaltAcum[i]+ Palternaincremental[i+1]; // Precipitación alterna acumulada }// For i pNP = N;// número de elementos de la lista de precipitaciones Duracion = var; computadoMM = true;
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxvi
delete [] D; delete [] Pacum; delete [] Pincr; delete [] Palte; break; } case 2: // Especificado por el usuario { break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (m_mm) } void CPLEDERLluviaEscorrentiaDlg::OnBnClickedOk() { // Coge los valores despues de pulsar OK // Cajas de texto m_Edit_AREA.GetWindowText(m_area); m_Edit_QB.GetWindowText(m_qb); m_Edit_CN.GetWindowText(m_cn); m_Edit_PPX.GetWindowText(m_ppx); m_Edit_PPY.GetWindowText(m_ppy); // Combo Box , Coge la posisión de los combos m_hus = m_Combo_HUS.GetCurSel(); m_mm = m_Combo_MM.GetCurSel(); // Coge el valor como un string int nIndexNdt = m_Combo_INTERT.GetCurSel(); m_Combo_INTERT.GetLBText(nIndexNdt,m_intert); CDialog::OnOK(); }
Apendice A. HIDROLOGIA CODIGO FUENTE C++
ccxvii
Apendice B
HIDRAULICA CODIGO FUENTE
C++
EL componente Hidraulico se organiza en 09 librerıas con multiples funciones y 03 ven-
tanas graficas
ccxviii
ARCHIVOS DE CABECERA: PLEDERFlujoPermanente.h #pragma once //class polilineabuffer; class CrossSectionsBufer; class FGVResultadosBufer; class CPLEDERFlujoPermanente { public: CPLEDERFlujoPermanente(void); ~CPLEDERFlujoPermanente(void); public: //Cálculo del Flujo G. V. en estado subrítico. int FGVFlujoSubcritico(float Q, float h); //Cálculo del Flujo G. V. en estado supercrítico. int FGVFlujoSupercritico(float Q, float h); // Cálculo mediante el método de la Bisección
int FGVBiseccionMethod(double Zlower, double Zupper, AcGePoint3dArray Vertices,long BL, long BR, double nLF, double nMC, double nRF, double LLF, double LMC, double LRF, double CC, double CE,double Betai, double Qi, double Ai, double Zsi, double Ki, double *RHidraulicos);
// Obtiene la conductividad laterales y centrales
int FGVGetConveyanceK(double ALF, double AMC, double ARF, double PLF, double PMC, double PRF, double nLF, double nMC, double nRF, double *KLF, double *KMC, double *KRF, double *K);
// Factor de correción Beta
int FGVGetCorrectionFactorBeta(double ALF, double AMC, double ARF, double KLF, double KMC, double KRF, double *Betai);
// Obtiene la longitud ponderada del tramo i-i+1
int FGVGetLenghtDeltaX(double LLF, double LMC, double LRF, double ALF, double AMC, double ARF, double *dX);
// Obtiene la pérdida de fricción en el tramo i-i+1 (hf12)
int FGVGetFrictionLosshf(double dX, double Qi1, double Qi, double Ki, double Ki1, double *hfi12);
// Función F del Flujo Gradualmente Variado
float FGVFuncionF(double Bi1, double Bi, double Qi1, double Qi, double Ai1, double Ai, double Zsi1, double Zsi, double hfi12, double hci12);
// Dibuja los niveles de la superficie libre en las secciones transversales. int FGVPlotLevelFreeSurface(double Zsi, double IdST, double Q, double h, AcGePoint2dArray& CSPoligon, double *TopWith);
// Libera el burfer de los resultados
void FreeAllFGVResultadosBufer(FGVResultadosBufer *theFirstResult);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxix
public: //struct CrossSection* m_pSections; // buffer con las secciones transv. struct Vertex* m_pSections; // buffer con las secciones transv.
long m_Sections_len; int m_MetodoSf; //
Método para calcular la pendiente de fricción float m_htexto; bool computado; public: //FGVResultadosBufer* m_theFirstR; }; PLEDERFlujoPermanenteDlg.h #pragma once #include "resource.h" // Cuadro de diálogo de CPLEDERFlujoPermanenteDlg class CPLEDERFlujoPermanenteDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERFlujoPermanenteDlg) public:
CPLEDERFlujoPermanenteDlg(CWnd* pParent = NULL); // Constructor estándar
virtual ~CPLEDERFlujoPermanenteDlg();
// Datos del cuadro de diálogo enum { IDD = IDD_HIDRA_CALC1D }; // Cajas de texto CAcUiNumericEdit m_Edit_Ydowstream; CString m_Ydowstream; CAcUiNumericEdit m_Edit_Yupstream; CString m_Yupstream; CAcUiNumericEdit m_Edit_Caudal; CString m_Caudal; int m_TipoFlujo; protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; // Radio (Cuando existan cambios en el radio) afx_msg void OnRadioFlujoSubcritico(); afx_msg void OnRadioFlujoSupercritico(); afx_msg void OnRadioFlujoMixto(); // Cajas de texto
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxx
public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); DECLARE_MESSAGE_MAP() }; PLEDERHidraB#pragma once // Estructura para calcular Socavaciones struct SocavacionST { double IdST; // Id
int Material, // Tipo de material, Cohesivo = 0, No Cohesivo = 1.
CoefProb; // Coeficiente de probabilidad de gasto. double CoefMaterial;// Peso específico ó diámetro medio del material de fondo. }; // Estructura para datos Socavaciones hidráulicas. struct Socavacion { int nV; // Número de vértices calculados. double IdST, // Id Zs, // Cota Tirante. At, // Area Total. Pt, // Perímetro Total. Q; // Descarga del flujo. AcGePoint3d GVerticeFlow[MAX_VERTICES]; // Vértices de la sección hidráulica (mojada). }; // Estructura para los perfiles struct Perfiles { double IdST, // Id h, // Tirante. Zs, // Cota Tirante. At, // Area Total. Q, // Descarga del flujo. LMC; // Length main channel }; // Estructura para los resultados struct Resultados { double IdST, // Id h, // Tirante. Zs, // Cota Tirante. Beta, // Coeciente de corrección. ALF, // Area llanura Izquierda. AMC, // Area Canal central. ARF, // Area llanura derecha. PLF, // Perímetro llanura izquierdo. PMC, // Perímetro canal central.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxi
PRF, // Perímetro llanura derecho KLF, // Conductividad llanura izquierdo. KMC, // Conductividad canal central. KRF, // Conductividad llanura derecho Q, // Descarga del flujo. hf12, // Pérdida por fircción. hc12, // Pérdida local. TopW; // Espejo de Agua. }; // Estructura para las secciones transversales struct Vertex { double HminG, // Vértice mínimo global. HminL; // Vértice mínimo Local. double IdST; // ID sección transversal long nVST; // Número de vértices de la sección transversal double LL, // Longitud izquierdo. LC, // Longitud central. LR, // Longitud derecho. nL, //Coeficiente de manning banco izquierdo. nC, // Coeficiente de manning canal central. nR, // Coeficiente de manning banco derecho CC, // Coeficiente de contracción. CE; // Coeficiente de expansión. long BL, // Límite banco izquierdo. BR; // Límite banco derecho. AcGePoint3d Vertice[MAX_VERTICES]; }; //Clase CrossSectionsBufer: Bufer para secciones transversales class CrossSectionsBufer { public: CrossSectionsBufer(); //Constructor por defecto, pone Siguiente = NULL; CrossSectionsBufer(AcGePoint2d P1, double X1, double Y1, double IdST, long nVST, AcGePoint2dArray Vertice, double HminG, double HminL, double LL, double LC, double LR, double NL, double NC, double NR, long BL, long BR, double CC, double CE); virtual ~CrossSectionsBufer(); // Destructor public: CrossSectionsBufer *nbnext; // siguiente AcGePoint2d m_P1; // Punto de referecia para los vértices locales. double m_X1, // Distancia de referencia en X. m_Y1, // Cota de referencia en Y. m_HminG, // Vértice mínimo global. m_HminL; // Vértice mínimo Local.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxii
double m_IdST; // ID sección transversal long m_nVST; // Número de vértices de la
sección transversal double m_LL, // Longitud izquierdo. m_LC, // Longitud central. m_LR, // Longitud derecho. m_NL, // Coeficiente de manning banco izquierdo. m_NC, // Coeficiente de manning canal central. m_NR, // Coeficiente de manning banco derecho m_CC, // Coeficiente de contracción. m_CE; // Coeficiente de expansión. long m_BL, // Límite banco izquierdo. m_BR; // Límite banco derecho. AcGePoint3d m_GlobalVertice[MAX_VERTICES]; // Vértices de las secciones transversales globales AcGePoint3d m_LocalVertice[MAX_VERTICES]; // Vértices de las secciones transversales locales }; //Clase CrossSectionsSocavacionBufer: Bufer para Socavaciones class CrossSectionsSocavacionBufer { public: CrossSectionsSocavacionBufer(); //Constructor por defecto, pone Siguiente = NULL; CrossSectionsSocavacionBufer(double IdST, int Material, int CoefProb, double CoefMaterial); virtual ~CrossSectionsSocavacionBufer(); // Destructor public: CrossSectionsSocavacionBufer *nbnext; // siguiente // Parámetros para socavación int m_Material, // Tipo de material, Cohesivo = 0,
No Cohesivo = 1. m_CoefProb; // Coeficiente de probabilidad de gasto. double m_CoefMaterial; // Peso específico ó diámetro medio del
material de fondo. double m_IdST; // ID sección transversal }; //Clase FGVResultadosBufer: Bufer para los resultados del flujo class FGVResultadosBufer { public: FGVResultadosBufer (); //Constructor por defecto, pone Siguiente = NULL;
FGVResultadosBufer (int nV,AcGePoint2dArray Vertice, double IdST, double h, double Zs, double Beta, double ALF, double AMC,double ARF, double PLF, double PMC, double PRF, double KLF,
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxiii
double KMC,double KRF, double Q, double hf12, double hc12, double TopW, double LMC);
virtual ~FGVResultadosBufer(); // Destructor public: FGVResultadosBufer *pRnext; // siguiente public: double m_IdST; // Id int m_nV; double m_h, // Tirante. m_Zs, // Cota Tirante. m_Beta, // Coeciente de corrección. m_ALF, // Area llanura Izquierda. m_AMC, // Area Canal central. m_ARF, // Area llanura derecha. m_PLF, // Perímetro llanura izquierdo. m_PMC, // Perímetro canal central. m_PRF, // Perímetro llanura derecho m_KLF, // Conductividad llanura izquierdo. m_KMC, // Conductividad canal central. m_KRF, // Conductividad llanura derecho m_Q, // Descarga del flujo. m_hf12, // Pérdida por fircción. m_hc12, // Pérdida local. m_TopW, // Espejo de Agua. m_LMC; // Longitud del canal central. AcGePoint3d m_ResultVertice[MAX_VERTICES]; // Vértices de las secciones transversales resultados }; //Clase SeccionesBufer: Bufer para seciones transversales desde importacion Excel class SeccionesBufer { public: SeccionesBufer ();//Constructor por defecto, pone Siguiente = NULL;
SeccionesBufer (int nss, double CoordX, double CoordY, double manning);
public: SeccionesBufer *ObtenerSiguiente(); // Obtener siguiente void PonerSiguiente(SeccionesBufer *p);// Poner siguiente virtual ~SeccionesBufer(); // Destructor public: SeccionesBufer *Siguiente;// Puntero a SeccionesBufer Siguiente int ns; // Número de secciones double CoordX, CoordY , manning; // Cordenadas X y Y, manning };
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxiv
class PerfilesBufer { public: PerfilesBufer(); //Constructor por defecto PerfilesBufer(int nST, ads_point v0, ads_point v1); virtual ~PerfilesBufer(); // Destructor public: PerfilesBufer *SiguienteP;// Puntero a SeccionesBufer Siguiente float nST; ads_point start; // inicio ads_point end; // final }; uffer.h PLEDERHidraSecTrasnv.h #pragma once #define PUNFILEEXT _T("st;sec;abia;txt") // Extensiones para el fichero de Secciones Transversales #define DCEXP 3 // Decimales para las Secciones Trasnversales exportados #define GETLINEMAXBUFF 1024 // 1 kB Tamaño de buffer de lectura líneas de ficheros #define PUNFILESEP" ,\t\n" // Separador de campos en el fichero de Secciones Trasnversales //class polilineabuffer; class SeccionesBufer; //Clase HidraSecTrasnv class HidraSecTrasnv { public: HidraSecTrasnv(void); public: ~HidraSecTrasnv(void); public: // Retorna EL Número de Vértices de una polilinea int NumeroVerticesPolilinea(ads_name nombrep, long *nVST);
// Almacena las coordenadas de una polilinea (ST) en la consola en coordenadas locales int LeerVerticesPolilineaConsola(ads_name nombrep, ads_point p1,double X1, double Y1, int contador);
// Almacena las coordenadas de una polilinea (ST) en listas en coordenadas locales int LeerVerticesPolilineaLista(ads_name nombrep, ads_point p1,double X1, double Y1, double* CX, double* CY);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxv
// Almacena las coordenadas de una polilinea (ST) en listas sin alteraciones de coordenadas int LeerVerticesPolilinea(ads_name nombrep, double* CX, double* CY);
// Importar las Secciones Transversales desde un archivo
int ImportarSeccionesTransversales(const TCHAR *pNombreArchivo,long *NumeroVertST);
// Obtiene los datos del buffer SeccionesBufer int ObtenerSeccionesTransversales(); //Libera el buffer en ristra SeccionesBufer void LiberarBufferSeccionesTransv(); public: SeccionesBufer* pPrimerST; //Puntero primer elemento ST. a la clase SeccionesBufer. }; PLEDERRecursosSuperficieLibre.h #pragma once #include "PLEDERSuperficieLibre.h" class CRecursosSuperficieLibre { public: CRecursosSuperficieLibre(void); public: ~CRecursosSuperficieLibre(void); public: // Calcula el números de vértices para cada Sección Transversal.
int NumeroVerticesCadaST(float *V, int n, int nST, float *nVert);
// Calcula los Vértices Máximos y Mínimos.
int VerticesMaximosMinimos(float *CY, int nST, float *nVert, float *Vmin, float *Vmax);
// Pediente Motriz I12(Sfm)
double PendienteMotrizSfm(float K1,float K2, float Q, float nn, int MetodoSfm);
float CRecursosSuperficieLibre::NumeroFroude(float Q, float A, float dA );
public: // Calcula el Area y el Perímetro.
int AreaPerimetro(int inicio, int fin, float CotaTirante, float *CX, float *CY, double *Area, double *Perimetro);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxvi
// Calcula el Area , Perímetro, Derivada del Area y Derivada del Perímetro.
int AreaPerimetroDerivadas(int inicio, int fin, float CotaTirante, float *CX, float *CY, double *Area, double *Perimetro,double *dArea, double *dPerimetro);
}; PLEDERResutadosDlg.h #pragma once //--------------------------------------------------------------------class FGVResultadosBufer; #include "adui.h" #include "PLEDERReportCtrl.h" #include "resource.h" //-------------------------------------------------------------------- class CPLEDERResutadosDlg : public CAdUiDialog { DECLARE_DYNAMIC (CPLEDERResutadosDlg) public: static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam); CPLEDERResutadosDlg (CWnd *pParent =NULL, HINSTANCE hInstance =NULL) ; virtual ~CPLEDERResutadosDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRA_RESULT} ; // DAtos Tabla CReportCtrl m_wndListR; BOOL m_bFullRow; BOOL m_bGridLines; BOOL m_bCheckboxes; // Cajas de texto CAcUiNumericEdit m_Edit_Rx; CString m_Rx; CAcUiNumericEdit m_Edit_Ry; CString m_Ry; // Botones (Sólo CAD) CAcUiPickButton m_PickButton_RPunto; protected: virtual void DoDataExchange (CDataExchange *pDX) ; afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnButtonRPunto(); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedOk(); public: FGVResultadosBufer* m_theFirstR; struct Resultados* m_pRHidraulicos; // Struct buffer para los resultados.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxvii
long m_Result_len; DECLARE_MESSAGE_MAP() //-------------------------------------------------------------------- // Funciones extras para los resultados public: // Libera los datos de los niveles calculados void FreeAllResultBufs(); // Adquirir o tomar los niveles calculados int AcquireLevelFreeSurface(long *numberL); // Eliminar los niveles calculados int DeleteLevelFreeSurface(bool prompt); } ; PLEDERSeccionesTransversales.h #pragma once class CrossSectionsBufer; class CrossSectionsSocavacionBufer; class CPLEDERSeccionesTransversales { public: CPLEDERSeccionesTransversales(void); ~CPLEDERSeccionesTransversales(void); public: // Libera los datos de las secciones transversales void FreeAllCrossSectionsBufs(); // Libera los datos de las socavaciones void FreeAllCrossSectionsSocavacionBufs(); // Adquirir o tomar las secciones transversales int AcquireCrossSections(long *numberof); // Adquirir o tomar las secciones transversales con socavaciones int AcquireCrossSectionsSocavacion(long *numberof); // Busca en forma ordenada, la primera S.T. int GetFirstNumberCrossSections(long *nfirst); // Busca el último número ST. int GetLastNumberCrossSections(long *nlast); // Contabiliza el número de las S.T. int GetNumberofCrossSections(long *numberof); // Obtiene los atributos de la S.T. int GetCrossSectionsAttributes(); // Encuadra la S.T. a paritr de su ID int ZoomCrossSections(double IdnST); // Obtiene los atributos de la S.T. a partir de su ID
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxviii
int GetIdCrossSectionsAttributes(double IdST, long *nVST, AcGePoint2dArray& LvertexArray,AcGePoint2dArray& GvertexArray, double *LL, double *LC, double *LR, double *NL,double *NC, double *NR, long *BL, long *BR, double *CC, double *CE);
// Obtiene los atributos de la S.T. a partir de su ID
int GetIdCrossSectionsAttributesSocavacion(double IdST, int *Material, int *CoefProb, double *CoefMaterial);
// Obtiene el vértice mínino int GetMinVertice(double *VerticeY, long nVert, double *Hmin);
// Obtener las áreas-perímetros laterales y área-perímetro central. int GetAreaPerimeter(double CotaTirante, AcGePoint3dArray LvertexArray,long BL, long BR, double *ALF , double *AMC, double *ARF,double *PLF, double *PMC, double *PRF, double *A, double *P);
int GetAreaPoligon(AcGePoint2dArray VerticesPoligon, double *Area);
public: CrossSectionsBufer* m_theFirstST; CrossSectionsSocavacionBufer* m_theFirstSOC; double m_STTextHeight; double m_STDiameter; }; PLEDERSeccionesTransversalesDlg.h #pragma once #include "PLEDERReportCtrl.h" #include "PLEDERSeccionesTransversales.h" #include "resource.h" // Cuadro de diálogo de CPLEDERSeccionesTransversalesDlg class CPLEDERSeccionesTransversalesDlg : public CAdUiDialog { DECLARE_DYNAMIC(CPLEDERSeccionesTransversalesDlg) public: static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam);
CPLEDERSeccionesTransversalesDlg(CWnd* pParent = NULL); // Constructor estándar
virtual ~CPLEDERSeccionesTransversalesDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_HIDRA_ST }; // DAtos Tabla CReportCtrl m_wndList; BOOL m_bFullRow; BOOL m_bGridLines;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxix
BOOL m_bCheckboxes; // Cajas de texto CAcUiNumericEdit m_Edit_LI; CString m_LI; CAcUiNumericEdit m_Edit_LC; CString m_LC; CAcUiNumericEdit m_Edit_LD; CString m_LD; CAcUiNumericEdit m_Edit_BI; CString m_BI; CAcUiNumericEdit m_Edit_BD; CString m_BD; CAcUiNumericEdit m_Edit_NI; CString m_NI; CAcUiNumericEdit m_Edit_NC; CString m_NC; CAcUiNumericEdit m_Edit_ND; CString m_ND; CAcUiNumericEdit m_Edit_CC; CString m_CC; CAcUiNumericEdit m_Edit_CE; CString m_CE; // Combo Box CComboBox m_Combo_ST; CString m_Id_ST; double m_IdST; // Botones (Sólo CAD) CAcUiPickButton m_PickButton_ST; CAcUiPickButton m_PickButton_LI; CAcUiPickButton m_PickButton_LC; CAcUiPickButton m_PickButton_LD; CAcUiPickButton m_PickButton_BI; CAcUiPickButton m_PickButton_BD; // Botones (Dialogo general) protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnKillfocusEdit_BI(); afx_msg void OnKillfocusEdit_BD(); afx_msg void OnKillfocusEdit_CC();
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxx
afx_msg void OnKillfocusEdit_CE(); // Combo Box (Cuando existan cambios en el combo) afx_msg void OnKillfocusComboST(); // Botones (Sólo CAD) afx_msg void OnButtonST(); afx_msg void OnButtonLI(); afx_msg void OnButtonLC(); afx_msg void OnButtonLD(); afx_msg void OnButtonBI(); afx_msg void OnButtonBD(); // Botones afx_msg void OnCommandAPLICAR(); // Botones Menú afx_msg void OnCommandSTN(); public: virtual BOOL OnInitDialog(); public: double OnButtonDistancia(); public: struct Vertex* m_pSections;// buffer con las secciones transv. long m_Sections_len; // Variables Socavación Adesk::Int32 m_Material, // Tipo de material, Cohesivo = 0, No Cohesivo = 1.
m_CoefProb; // Ubicación en la lista (combo) coeficiente de probabilidad de gasto.
double m_CoefMaterial; // Peso específico ó diámetro medio del material de fondo. DECLARE_MESSAGE_MAP() }; /*------------------------------------------------------------------*/ // Cuadro de diálogo de CPLEDERST1Dlg class CPLEDERST1Dlg : public CDialog { DECLARE_DYNAMIC(CPLEDERST1Dlg) public: CPLEDERST1Dlg(CWnd* pParent = NULL); // Constructor estándar virtual ~CPLEDERST1Dlg();
// Datos del cuadro de diálogo enum { IDD = IDD_HIDRA_NST }; // Cajas de texto CAcUiNumericEdit m_Edit_NST;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxi
CString m_NST; protected:
virtual void DoDataExchange(CDataExchange* pDX); // Compatibilidad con DDX/DDV
public: afx_msg void OnBnClickedOk(); DECLARE_MESSAGE_MAP() };
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxii
ARCHIVOS Cpp:
PLEDERFlujoPermanente.cpp #include "StdAfx.h" #include "PLEDERFlujoPermanente.h" #include "PLEDERSeccionesTransversales.h" #include "PLEDERHidraBuffer.h" #include "PLEDERRecursosCad.h" CPLEDERSeccionesTransversales CST; CRecursosCad RecursosFGV; CPLEDERFlujoPermanente::CPLEDERFlujoPermanente(void) { m_MetodoSf = 0; // Por defecto, método de la media aritmética. m_htexto = 0.50; } CPLEDERFlujoPermanente::~CPLEDERFlujoPermanente(void) { } int CPLEDERFlujoPermanente::FGVFlujoSubcritico(float Q, float h) /*-------------------------------------------------------------------- Ingreso : Q = Descarga del flujo a transitar.
h = Tirante Inicial de las secciones transversales.
Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula los miveles de la superficie libre mediante el fluijo subcrítico. Observación: Los resultado los alamceno en una matriz cuya notación es como sigue: RHidraulicos[0] = HminL RHidraulicos[1] = Zsi1 -> Tirante del agua calculado. RHidraulicos[2] = Betai1. RHidraulicos[3] = ALF. RHidraulicos[4] = AMC. RHidraulicos[5] = ARF. RHidraulicos[6] = PLF. RHidraulicos[7] = PMC. RHidraulicos[8] = PRF. RHidraulicos[9] = KLF. RHidraulicos[10] = KMC. RHidraulicos[11] = KRF. RHidraulicos[12] = Qi. RHidraulicos[13] = hfi12. RHidraulicos[14] = hci12. --------------------------------------------------------------------*/ {
double Ai, ALF, AMC, ARF, Pi, PLF, PMC, PRF, Ki, KLF, KMC, KRF, Betai, Qi; double Ai1, Pi1, Ki1, Betai1, Qi1, hfi12, hci12, Zlower, Zupper, Zsi, Zsi1;
double nL, nC, nR, LL, LC, LR, CC, CE; long BL, BR; int i, j; double RHidraulicos[16], TextHight = 0.16, TopWith; AcGePoint3dArray Vertices;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxiii
AcGePoint3d Vertex; AcGePoint2dArray Poligon; // Poligono de la S.T. // Cálculos en la primera sección transversal (Dowstream) Qi = Q; for (i = 0; i < (m_pSections + m_Sections_len-1)->nVST ; i++) { // Vértices Vertex[X] = (m_pSections + m_Sections_len-1)->Vertice[i].x; Vertex[Y] = (m_pSections + m_Sections_len-1)->Vertice[i].y; Vertices.append(Vertex); } BL = (m_pSections + m_Sections_len-1)->BL; BR = (m_pSections + m_Sections_len-1)->BR; nL = (m_pSections + m_Sections_len-1)->nL; nC = (m_pSections + m_Sections_len-1)->nC; nR = (m_pSections + m_Sections_len-1)->nR;
Zsi = (m_pSections + m_Sections_len-1)->HminL +h; // Cota del tirante CST.GetAreaPerimeter(Zsi, Vertices, BL, BR, &ALF, &AMC, &ARF, &PLF, &PMC, &PRF, &Ai, &Pi);
// Cálculo de K laterales y central
FGVGetConveyanceK(ALF, AMC, ARF, PLF, PMC, PRF,nL, nC, nR, &KLF, &KMC, &KRF , &Ki);
// Cálculo del Coeficiente de Corrección (Betai)
FGVGetCorrectionFactorBeta(ALF, AMC, ARF, KLF, KMC, KRF, &Betai);
acutPrintf(_T("\nZsi = %0.3f"),Zsi); Poligon.removeAll();
FGVPlotLevelFreeSurface(Zsi, (m_pSections + m_Sections_len-1)->IdST , Q, Zsi - (m_pSections + m_Sections_len-1)->HminL, Poligon, &TopWith);
acutPrintf(_T("\nSeccion = %0.3f"),(m_pSections + m_Sections_len-1)->IdST);
// Guardo los valores en la matriz RHidraulicos[0] = (m_pSections + m_Sections_len-1)->HminL; RHidraulicos[1] = Zsi; RHidraulicos[2] = Betai; RHidraulicos[3] = ALF; RHidraulicos[4] = AMC; RHidraulicos[5] = ARF; RHidraulicos[6] = PLF; RHidraulicos[7] = PMC; RHidraulicos[8] = PRF; RHidraulicos[9] = KLF; RHidraulicos[10]= KMC; RHidraulicos[11]= KRF; RHidraulicos[12]= Qi; RHidraulicos[13]= 0.0; // Pérdida por fircción. RHidraulicos[14]= 0.0; // Pérdida local. RHidraulicos[15]= TopWith; // Espejo del Agua LC = (m_pSections + m_Sections_len-1)->LC;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxiv
// Crea la entidad personalizada PLEDERHydraulicResult desde ObjectDBX
CPLEDERHydraulicResult *pResultados; // crear la nueva entidad try {
pResultados = new CPLEDERHydraulicResult((m_pSections + m_Sections_len-1)->IdST, Poligon, RHidraulicos,LC, TextHight);
} catch(const std::bad_alloc&) { acdbFail(_T("\nError de asignación de memoria.")); return RTERROR; } AcDbObjectId ID; // añadirla a la base de datos de AutoCAD
if (RecursosFGV.AñadirEntidadBlockTableRecord((AcDbEntity*)pResultados, ID) != Acad::eOk)
{ if (pResultados) { delete pResultados; }
acdbFail(_T("\nError al añadir la entidad a la Base de Datos [AñadirEntidadBlockTableRecord]."));
return RTERROR; } // Restaurando los valores ALF = AMC = ARF = PLF = PMC = PRF = KLF = KMC = KRF =0.0; // Iterar en las siguientes secciones transversales. for (j = m_Sections_len - 2; j >= 0; j--) { Vertices.removeAll();
acutPrintf(_T("\nID Sección transversal Nº: %0.3f"),(m_pSections + j)->IdST);
for (i = 0; i < (m_pSections + j)->nVST; i++) { // Vértices Vertex[X] = (m_pSections + j)->Vertice[i].x; Vertex[Y] = (m_pSections + j)->Vertice[i].y; Vertices.append(Vertex); } // for i Zlower = (m_pSections + j)->HminL; // Cota mínima. Zupper = Zsi + 5; // Corregir BL = (m_pSections + j)->BL; BR = (m_pSections + j)->BR; nL = (m_pSections + j)->nL; nC = (m_pSections + j)->nC; nR = (m_pSections + j)->nR; LL = (m_pSections + j)->LL; LC = (m_pSections + j)->LC; LR = (m_pSections + j)->LR; CC = (m_pSections + j)->CC; CE = (m_pSections + j)->CE;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxv
RHidraulicos[0] = Zlower; FGVBiseccionMethod(Zlower, Zupper, Vertices, BL, BR, nL, nC, nR, LL, LC, LR, CC, CE, Betai, Qi,Ai, Zsi, Ki, RHidraulicos);
// Reasigna los nuevos valores, para las sigueintes iteraciones.
Betai = RHidraulicos[2]; // Betai1 Ai = RHidraulicos[3]+ RHidraulicos[4]+ RHidraulicos[5]; // ALF+AMC+ARF
Zsi = RHidraulicos[1]; // Zsi1; Ki = RHidraulicos[9]+ RHidraulicos[10]+ RHidraulicos[11];// KLF+KMC+KRF
acutPrintf(_T("\nZsi = %0.3f"),Zsi);
Poligon.removeAll(); // Eliminar todos lo datos de esta natriz
// Captura los vértices de la secciones transversal calculado FGVPlotLevelFreeSurface(Zsi, (m_pSections + j)->IdST, Q , Zsi-(m_pSections + j)->HminL, Poligon, &TopWith);
RHidraulicos[15]= TopWith; // Espejo del Agua
// Crea la entidad personalizada PLEDERHydraulicResult desde ObjectDBX
CPLEDERHydraulicResult *pResultados; // crear la nueva entidad try {
pResultados = new CPLEDERHydraulicResult((m_pSections + j)->IdST, Poligon, RHidraulicos,LC, TextHight);
} catch(const std::bad_alloc&) { acdbFail(_T("\nError de asignación de memoria.")); return RTERROR; } AcDbObjectId ID; // añadirla a la base de datos de AutoCAD
if (RecursosFGV.AñadirEntidadBlockTableRecord((AcDbEntity*)pResultados, ID) != Acad::eOk)
{ if (pResultados) { delete pResultados; }
acdbFail(_T("\nError al añadir la entidad a la Base de Datos [AñadirEntidadBlockTableRecord]."));
return RTERROR; } } // for j
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxvi
return RTNORM; } int CPLEDERFlujoPermanente::FGVFlujoSupercritico(float Q, float h) /*-------------------------------------------------------------------- Ingreso : Q = Descarga del flujo a transitar. h = Tirante Inicial de las secciones transversales. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula los miveles de la superficie libre mediante el fluijo supercrítico. Observación: Los resultado los alamceno en una matriz cuya notación es como sigue: RHidraulicos[0] = HminL RHidraulicos[1] = Zsi1 -> Tirante del agua calculado. RHidraulicos[2] = Betai1. RHidraulicos[3] = ALF. RHidraulicos[4] = AMC. RHidraulicos[5] = ARF. RHidraulicos[6] = PLF. RHidraulicos[7] = PMC. RHidraulicos[8] = PRF. RHidraulicos[9] = KLF. RHidraulicos[10] = KMC. RHidraulicos[11] = KRF. RHidraulicos[12] = Qi. RHidraulicos[13] = hfi12. RHidraulicos[14] = hci12. --------------------------------------------------------------------*/ {
double Ai, ALF, AMC, ARF, Pi, PLF, PMC, PRF, Ki, KLF, KMC, KRF, Betai, Qi;
double Ai1, Pi1, Ki1, Betai1, Qi1, hfi12, hci12, Zlower, upper, Zsi, Zsi1;
double nL, nC, nR, LL, LC, LR, CC, CE; long BL, BR; int i, j; double RHidraulicos[16], TextHight = 0.16, TopWith; AcGePoint3dArray Vertices; AcGePoint3d Vertex; AcGePoint2dArray Poligon; // Poligono de la S.T. // Cálculos en la primera sección transversal (Upstream) Qi = Q; for (i = 0; i < (m_pSections + m_Sections_len-1)->nVST ; i++) { // Vértices Vertex[X] = m_pSections->Vertice[i].x; Vertex[Y] = m_pSections->Vertice[i].y; Vertices.append(Vertex); } BL = m_pSections->BL; BR = m_pSections->BR; nL = m_pSections->nL; nC = m_pSections->nC; nR = m_pSections->nR;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxvii
Zsi = m_pSections->HminL +h; // Cota del tirante
CST.GetAreaPerimeter(Zsi, Vertices, BL, BR, &ALF, &AMC, &ARF, &PLF, &PMC, &PRF, &Ai, &Pi);
// Cálculo de K laterales y central
FGVGetConveyanceK(ALF, AMC, ARF, PLF, PMC, PRF,nL, nC, nR, &KLF, &KMC, &KRF , &Ki);
// Cálculo del Coeficiente de Corrección (Betai)
FGVGetCorrectionFactorBeta(ALF, AMC, ARF, KLF, KMC, KRF, &Betai);
acutPrintf(_T("\nZsi = %0.3f"),Zsi); Poligon.removeAll();
FGVPlotLevelFreeSurface(Zsi, m_pSections->IdST , Q, Zsi - m_pSections->HminL, Poligon, &TopWith);
acutPrintf(_T("\nSeccion = %0.3f"),m_pSections->IdST); // Guardo los valores en la matriz RHidraulicos[0] = m_pSections->HminL; RHidraulicos[1] = Zsi; RHidraulicos[2] = Betai; RHidraulicos[3] = ALF; RHidraulicos[4] = AMC; RHidraulicos[5] = ARF; RHidraulicos[6] = PLF; RHidraulicos[7] = PMC; RHidraulicos[8] = PRF; RHidraulicos[9] = KLF; RHidraulicos[10]= KMC; RHidraulicos[11]= KRF; RHidraulicos[12]= Qi; RHidraulicos[13]= 0.0; // Pérdida por fircción. RHidraulicos[14]= 0.0; // Pérdida local. RHidraulicos[15]= TopWith; // Espejo del Agua LC = m_pSections->LC;
// Crea la entidad personalizada PLEDERHydraulicResult desde ObjectDBX
CPLEDERHydraulicResult *pResultados; // crear la nueva entidad try { pResultados = new CPLEDERHydraulicResult(m_pSections->IdST, Poligon, RHidraulicos,LC, TextHight); } catch(const std::bad_alloc&) { acdbFail(_T("\nError de asignación de memoria.")); return RTERROR; } AcDbObjectId ID; // añadirla a la base de datos de AutoCAD
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxviii
if (RecursosFGV.AñadirEntidadBlockTableRecord((AcDbEntity*)pResultados, ID) != Acad::eOk) { if (pResultados) { delete pResultados; } acdbFail(_T("\nError al añadir la entidad a la Base de Datos [AñadirEntidadBlockTableRecord].")); return RTERROR; } // Restaurando los valores ALF = AMC = ARF = PLF = PMC = PRF = KLF = KMC = KRF =0.0; // Iterar en las siguientes secciones tranversales. for (j = 1; j < m_Sections_len; j++) { Vertices.removeAll(); acutPrintf(_T("\nID Sección transversal Nº: %0.3f"),(m_pSections + j)->IdST); for (i = 0; i < (m_pSections + j)->nVST; i++) { // Vértices Vertex[X] = (m_pSections + j)->Vertice[i].x; Vertex[Y] = (m_pSections + j)->Vertice[i].y; Vertices.append(Vertex); } // for i Zlower = (m_pSections + j)->HminL; // Cota mínima. Zupper = Zsi + 5; // Corregir BL = (m_pSections + j)->BL; BR = (m_pSections + j)->BR; nL = (m_pSections + j)->nL; nC = (m_pSections + j)->nC; nR = (m_pSections + j)->nR; LL = (m_pSections + j)->LL; LC = (m_pSections + j)->LC; LR = (m_pSections + j)->LR; CC = (m_pSections + j)->CC; CE = (m_pSections + j)->CE; RHidraulicos[0] = Zlower; FGVBiseccionMethod(Zlower, Zupper, Vertices, BL, BR, nL, nC, nR, LL, LC, LR, CC, CE, Betai, Qi, Ai, Zsi, Ki, RHidraulicos);
// Reasigna los nuevos valores, para las sigueintes iteraciones.
Betai = RHidraulicos[2]; // Betai1 Ai = RHidraulicos[3]+ RHidraulicos[4]+ RHidraulicos[5]; // ALF+AMC+ARF
Zsi = RHidraulicos[1]; // Zsi1; Ki = RHidraulicos[9]+ RHidraulicos[10]+ RHidraulicos[11];// KLF+KMC+KRF
acutPrintf(_T("\nZsi = %0.3f"),Zsi);
Poligon.removeAll(); // Eliminar todos lo datos de esta natriz
// Captura los vértices de la secciones transversal calculado
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxxxix
FGVPlotLevelFreeSurface(Zsi, (m_pSections + j)->IdST, Q , Zsi-(m_pSections + j)->HminL, Poligon, &TopWith);
RHidraulicos[15]= TopWith; // Espejo del Agua
// Crea la entidad personalizada PLEDERHydraulicResult desde ObjectDBX
CPLEDERHydraulicResult *pResultados; // crear la nueva entidad try {
pResultados = new CPLEDERHydraulicResult((m_pSections + j)->IdST, Poligon, RHidraulicos,LC, TextHight);
} catch(const std::bad_alloc&) { acdbFail(_T("\nError de asignación de memoria.")); return RTERROR; } AcDbObjectId ID; // añadirla a la base de datos de AutoCAD
if (RecursosFGV.AñadirEntidadBlockTableRecord((AcDbEntity*)pResultados, ID) != Acad::eOk)
{ if (pResultados) { delete pResultados; } acdbFail(_T("\nError al añadir la entidad a la Base de Datos [AñadirEntidadBlockTableRecord].")); return RTERROR; } } // for j return RTNORM; } int CPLEDERFlujoPermanente::FGVBiseccionMethod(double Zlower, double Zupper, AcGePoint3dArray Vertices,long BL, long BR, double nLF, double nMC, double nRF, double LLF, double LMC, double LRF, double CC, double CE, double Betai, double Qi, double Ai, double Zsi, double Ki, double *RHidraulicos) /*-------------------------------------------------------------------- Ingreso : Zlower = Extremo valor inferior ( Nivel mínimo del agua) Zupper = Extremo valor superior Salida : RHidraulicos[0] = HminL RHidraulicos[1] = Zsi1 -> Tirante del agua calculado. RHidraulicos[2] = Betai1. RHidraulicos[3] = ALF. RHidraulicos[4] = AMC.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxl
RHidraulicos[5] = ARF. RHidraulicos[6] = PLF. RHidraulicos[7] = PMC. RHidraulicos[8] = PRF. RHidraulicos[9] = KLF. RHidraulicos[10] = KMC. RHidraulicos[11] = KRF. RHidraulicos[12] = Qi. RHidraulicos[13] = hfi12. RHidraulicos[14] = hci12. RHidraulicos[14] = TopWith. Propósito : Calcula El nivel del agua mediante el método de Bisección. --------------------------------------------------------------------*/ { double Zmiddle, // Cota promedio entre ambos cotas estremas de ingreso. Flower, // Cota inferior (siempre inicia desde la cota mínima o thalweg) Fmiddle, // Función que se evalúa con la cota promedio. Fupper, // Función que se evalúa con la cota superior hfi12, // Pérdida por fricción hci12, // Pérdida local Qi1, dX; double ALF, AMC, ARF, Ai1, PLF, PMC, PRF, Pi1, KLF, KMC, KRF, Ki1, Betai1; double Zsi1; Qi1 = Qi; // para este caso bool NOencontrado = true; int cont = 0; while(NOencontrado) { cont++; //acutPrintf(_T("\nIteracion en Biseccion = %d"),cont); Zmiddle = (Zlower + Zupper)/2;
CST.GetAreaPerimeter(Zmiddle, Vertices, BL, BR, &ALF, &AMC,&ARF, &PLF, &PMC, &PRF , &Ai1, &Pi1); FGVGetConveyanceK(ALF, AMC, ARF, PLF, PMC, PRF, nLF, nMC, nRF, &KLF, &KMC, &KRF , &Ki1); FGVGetCorrectionFactorBeta(ALF, AMC, ARF, KLF, KMC, KRF, &Betai1);
FGVGetLenghtDeltaX(LLF, LMC, LRF, ALF, AMC, ARF, &dX); FGVGetFrictionLosshf(dX, Qi1, Qi, Ki, Ki1, &hfi12); hci12 = 0.0; // Por el momento.
Fmiddle = FGVFuncionF(Betai1, Betai, Qi1, Qi, Ai1, Ai, Zmiddle, Zsi, hfi12, hci12);
// Primera verificación if (abs(Fmiddle) < TOL) { Zsi1 = Zmiddle;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxli
NOencontrado = false; acutPrintf(_T("\nLo encontre en 01, en %d iteraciones"), cont);
} // Preparando para la siguiente iteración
Flower = FGVFuncionF(Betai1, Betai, Qi1, Qi, Ai1, Ai, Zlower , Zsi, hfi12, hci12); Fupper = FGVFuncionF(Betai1, Betai, Qi1, Qi, Ai1, Ai, Zupper , Zsi, hfi12, hci12);
if( Fmiddle*Flower < 0.0) { Zupper = Zmiddle; } else { Zlower = Zmiddle; } // Segunda verificación if (abs(Zupper - Zlower) < TOL) { Zsi1 = (Zupper + Zlower)/2; NOencontrado = false; acutPrintf(_T("\nLo encontre en 02, en %d iteraciones"), cont); } } // While // Guardando los resultados en la matriz definida RHidraulicos[1] = Zsi1; RHidraulicos[2] = Betai1; RHidraulicos[3] = ALF; RHidraulicos[4] = AMC; RHidraulicos[5] = ARF; RHidraulicos[6] = PLF; RHidraulicos[7] = PMC; RHidraulicos[8] = PRF; RHidraulicos[9] = KLF; RHidraulicos[10]= KMC; RHidraulicos[11]= KRF; RHidraulicos[12]= Qi; RHidraulicos[13]= hfi12; RHidraulicos[14]= hci12; return RTNORM; } int CPLEDERFlujoPermanente::FGVGetConveyanceK(double ALF, double AMC, double ARF, double PLF, double PMC, double PRF, double nLF, double nMC, double nRF, double *KLF, double *KMC, double *KRF, double *K) /*-------------------------------------------------------------------- Ingreso : ALF = Area Left Floodplain. AMC = Area Main Channel. ARF = Area Right Floodplain. PLF = Perímetro Left Floodplain. PMC = Perímetro Main Channel. PRF = Perímetro Right Floodplain. nLF = Manning Left.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlii
nMC = Manning Center. nRF = Manning Right. Salida : KLF = Conductividad Left Floodplain. KMC = Conductividad Main Channel. KRF = Conductividad Right Floodplain. K = Conductividad Total RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula la conductividad --------------------------------------------------------------------*/ { double exp53 = 5.0/3.0, exp23 = 2.0/3.0; *KLF = 0.0; *KMC = 0.0; *KRF = 0.0; // Cálculo de la Conductividad KLF (Izquierdo) if (PLF != 0.0) { *KLF = pow(ALF,exp53)/ (nLF * pow(PLF,exp23)); } // Cálculo de la Conductividad KMC (Principal) if (PMC != 0.0) { *KMC = pow(AMC,exp53)/ (nMC * pow(PMC,exp23)); } // Cálculo de la Conductividad KRF (Derecha) if (PRF != 0.0) { *KRF = pow(ARF,exp53)/ (nRF * pow(PRF,exp23)); } // Conductividad Total (K) *K = *KLF + *KMC + *KRF; return RTNORM; } int CPLEDERFlujoPermanente::FGVGetCorrectionFactorBeta(double ALF, double AMC, double ARF, double KLF, double KMC, double KRF, double *Betai) /*-------------------------------------------------------------------- Ingreso : ALF = Area Left Floodplain. AMC = Area Main Channel. ARF = Area Right Floodplain. KLF = Conductividad Left Floodplain. KMC = Conductividad Main Channel. KRF = Conductividad Right Floodplain. Salida : Betai = Factor decorreción Beta (ver la teoría) RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula El factor de correción Beta --------------------------------------------------------------------*/ { double BetaLF = 0.0, BetaMC = 0.0, BetaRF = 0.0, Ai = ALF + AMC + ARF, Ki = KLF + KMC + KRF;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxliii
// (Izquierdo) if (ALF != 0.0) { BetaLF = pow(KLF,3.0) / pow(ALF,2.0); } // (Principal) if (AMC != 0.0) { BetaMC = pow(KMC,3.0) / pow(AMC,2.0); } // (Derecha) if (ARF != 0.0) { BetaRF = pow(KRF,3.0) / pow(ARF,2.0); } *Betai = pow(Ai,2.0)/pow(Ki,3.0) * (BetaLF + BetaMC + BetaRF); return RTNORM; } int CPLEDERFlujoPermanente::FGVGetLenghtDeltaX(double LLF, double LMC, double LRF, double ALF, double AMC, double ARF, double *dX) /*-------------------------------------------------------------------- Ingreso : LLF = Longitud del banco izquierdo (Left bank length ). LMC = Longitud del canal central (Main Channel length). LRF = Longitud del banco derecho (Right banl length) ALF = Area Left Floodplain. AMC = Area Main Channel. ARF = Area Right Floodplain. Salida : dX = Es la distancia ponderada de la sección transversal RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula la distancia ponderada entre una sección transversal. Promedia bajo el area de cada tramo (tres tramos) bajo el área total del flujo. --------------------------------------------------------------------*/ { *dX = (LLF*ALF + LMC*AMC + LRF*ARF) /(ALF + AMC + ARF); return RTNORM; } int CPLEDERFlujoPermanente::FGVGetFrictionLosshf(double dX, double Qi1, double Qi, double Ki, double Ki1, double *hfi12) /*-------------------------------------------------------------------- Ingreso : dX = Longitud ponderado para el tramo. Qi1 = Descarga del flujo en la estación i+1. Qi = Descarga del flujo en la estación i.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxliv
Ki1 = Factor de conductividad en la estación i+1. Ki = Factor de conductividad en la estación i. Salida : hfi12 = La pérdida de fricción calculado para este tramo. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula la pérdida de fricción en el tramo i-i+1 (hf12) --------------------------------------------------------------------*/ { switch (m_MetodoSf) { case 0: // Media Aritmética. { *hfi12 = 0.5*dX*( Qi1*abs(Qi1)/(Ki1*Ki1) + Qi*abs(Qi)/(Ki*Ki)); break; } case 1: // Media Armónica. { *hfi12 = 2.0*dX/(Ki1*Ki1 /(Qi1*abs(Qi1)) + Ki*Ki /(Qi*abs(Qi))); break; } case 2: // Ecuación de Factor de transporte Medio. { *hfi12 = dX*pow((Qi1 + Qi)/(Ki1 + Ki),2.0); break; } case 3: // Media Geométrica. { *hfi12 = dX *pow( Qi1*abs(Qi1)*Qi*abs(Qi)/(Ki1*Ki1 + Ki*Ki),0.5); break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (m_MetodoSf)) return RTNORM; } float CPLEDERFlujoPermanente::FGVFuncionF(double Bi1, double Bi, double Qi1, double Qi, double Ai1, double Ai, double Zsi1, double Zsi, double hfi12, double hci12) /*-------------------------------------------------------------------- Ingreso : Bi1 = Factor de Correción Beta en la estación i+1. Bi = Factor de Correción Beta en la estación i. Qi1 = Descarga del flujo en la estación i+1. Qi = Descarga del flujo en la estación i Ai1 = Area de la sección transversal en la estación i+1. Ai =Area de la sección transv. en la estación i.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlv
Zi1 = Cota del nivel de agua en la estación i+1. (valor a encontrar) Zi = Cota del nivel de agua en la estación i. hfi12 = Pérdida por fricción en el tramo i+1/2. hci12 = Pérdida Local en el tramo i+1/2. Salida : F = Función del Flujo gradualmente variado. Propósito : Calcula la función F para la iteración utilizando el método de Bisección. --------------------------------------------------------------------*/ { double F;
F = Bi1*Qi1*Qi1/(2*g*Ai1*Ai1) - Bi*Qi*Qi/(2*g*Ai*Ai) + Zsi1 -Zsi + hfi12 + hci12;
return F; } int CPLEDERFlujoPermanente::FGVPlotLevelFreeSurface(double Zsi, double IdST, double Q, double h, AcGePoint2dArray& CSPoligon, double *TopWith) /*-------------------------------------------------------------------- Ingreso : Zis = Cota del nivel de agua en la estación i. IdST = Id de la sección transversal Q = Descarga del flujo (m3/s) h = Tirante (m) Salida : CSPoligon = Array para almacenar los datos del poligono o sección hidráulico. TopWith = Espejo de agua RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Dibuja los niveles de la superficie libre de las secciones transversales --------------------------------------------------------------------*/ { // Inicializa las variables de sistema. RecursosFGV.InicializarVariables(); // crear las capas del proyecto if (RecursosFGV.PlederCapas() != RTNORM) { RecursosFGV.RestaurarVariables(); return RTERROR; } double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE; long BL, BR, nVST; double CxL, CxG, CyG, Tw =0.0; TCHAR str[100] , strQ[100], strh[100]; AcGePoint2dArray GlobalVertices; AcGePoint2dArray LocalVertices; ads_point p1, p2, p3; p1[Z] = p2[Z] = p3[Z]= 0.0; // Coger los atributos de la S.T. desde su id CST.GetIdCrossSectionsAttributes(IdST, &nVST, LocalVertices, GlobalVertices, &LL, &LC, &LR, &NL, &NC, &NR, &BL, &BR, &CC, &CE); int j,k;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlvi
AcGePoint2dArray LVertices; // Variable local para reasignar los vértices. AcGePoint2dArray GVertices; // Variable Global para reasignar los vértices. AcGePoint2d Vertex; // Traslada los valores hacia la nueva lista YY, XX for (k = 0; k < LocalVertices.length(); k++) { Vertex[X] = LocalVertices[k].x; Vertex[Y] = LocalVertices[k].y; LVertices.append(Vertex); Vertex[X] = GlobalVertices[k].x; Vertex[Y] = GlobalVertices[k].y; GVertices.append(Vertex); } bool InundIzquierdo = false; // Por defecto NO Existe Inundación bool InundDerecho = false; // Por defecto NO Existe Inundación
// Son condiciones para agregar vértices si el tirante es mayor a los
// vértices de las S. T. (casos de inundaciones) // Inundación Margen Izquierda? if (Zsi > LocalVertices[0].y) { LVertices.removeAll(); GVertices.removeAll(); Vertex[X] = LocalVertices[0].x; Vertex[Y] = Zsi; LVertices.append(Vertex); Vertex[X] = GlobalVertices[0].x;
Vertex[Y] = GlobalVertices[0].y + (Zsi - LocalVertices[0].y);
GVertices.append(Vertex); for (k =0; k < LocalVertices.length(); k++) { Vertex[X] = LocalVertices[k].x; Vertex[Y] = LocalVertices[k].y; LVertices.append(Vertex); Vertex[X] = GlobalVertices[k].x; Vertex[Y] = GlobalVertices[k].y; GVertices.append(Vertex); } InundIzquierdo = true; } // Inundación Margen Derecha?
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlvii
if (Zsi > LocalVertices[LocalVertices.length()-1].y) { Vertex[X] = LocalVertices[LocalVertices.length()-1].x; Vertex[Y] = Zsi; LVertices.append(Vertex); Vertex[X] = GlobalVertices[GlobalVertices.length()-1].x;
Vertex[Y] = GlobalVertices[GlobalVertices.length()-1].y + (Zsi - LocalVertices[0].y);
GVertices.append(Vertex); InundDerecho = true; } // Buscar los vértices (interpolando) recorrido con el mismo m étodo para el área // Inicio del recorrido de los vértices. for (int j = 0; j < LVertices.length()-1; j++) { // Condición para el extremo izquierdo if ((Zsi <= LVertices[j].y) && (Zsi >= LVertices[j+1].y)) { // Coordenada X En el extremo izquierdo CxL = LVertices[j+1].x - ((LVertices[j+1].x - LVertices[j].x )/(LVertices[j].y - LVertices[j+1].y))*(Zsi - LVertices[j+1].y); // Interpolación simple. if(InundIzquierdo) { CyG = GVertices[0].y; CxG = GVertices[0].x; } else { CyG = GVertices[j+1].y + ((GVertices[j].y - GVertices[j+1].y)/(LVertices[j].y - LVertices[j+1].y))*(Zsi- LVertices[j+1].y); CxG = GVertices[j+1].x + ((GVertices[j].x - GVertices[j+1].x)/(LVertices[j].x - LVertices[j+1].x))*(CxL- LVertices[j+1].x); } Vertex[X] = p1[X] = CxG; Vertex[Y] = p1[Y] = CyG; CSPoligon.append(Vertex); bool condicion = true; while (condicion) { j++; // Condición para los trapecios. //if (LVertices[j+1].y <= Zsi) //{ Vertex[X] = GVertices[j].x; Vertex[Y] = GVertices[j].y; CSPoligon.append(Vertex); //}
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlviii
// Condición para el extremo derecho. if (LVertices[j+1].y >= Zsi) { // Coordenada X En el extremo derecho CxL = LVertices[j].x + ((LVertices[j+1].x - LVertices[j].x )/(LVertices[j+1].y - LVertices[j].y))*(Zsi - LVertices[j].y); // Interpolación simple. if(InundDerecho) { CxG = GVertices[GVertices.length()-1].x; } else { CxG = GVertices[j].x + ((GVertices[j+1].x - GVertices[j].x)/(LVertices[j+1].x - LVertices[j].x))*(CxL- LVertices[j].x); } Vertex[X] = p2[X] = CxG; Vertex[Y] = p2[Y] = p1[Y]; CSPoligon.append(Vertex); } if (LVertices[j+1].y < Zsi) {condicion = true; } else {condicion = false;} }//While //RecursosFGV.DibujarLinea(p1,p2,PLEDER_CAPA_NIVELES); //calcula el ancho o espejo de agua Tw = Tw + acutDistance(p1,p2); // Inserta el texto (caudal) p3[X] = (p1[X] + p2[X])/2; p3[Y] = p1[Y] + m_htexto/1.5; acdbRToS(Q, 2, 2, strQ); //Concatena el texto con 2 decimales. acdbRToS(h, 2, 2, strh); _stprintf(str, _T("h:%s%s, Q:%s%s" ), strh, _T("m"), strQ, _T("m3/s")); //RecursosFGV.DibujarTexto(p3, PLEDER_CAPA_NIVELES_TX, str, m_htexto, false, 1); } //if }//For j *TopWith = Tw; RecursosFGV.RestaurarVariables(); return RTNORM; } void CPLEDERFlujoPermanente::FreeAllFGVResultadosBufer(FGVResultadosBufer *theFirstResult)
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxlix
/*-------------------------------------------------------------------- Ingreso : theFirstResult = puntero al primer elemento del buffer. Salida : Vacío. Propósito : Llamar a esta función para liberar un buffer FGVResultadosBufer --------------------------------------------------------------------*/ { if (!theFirstResult) return; FGVResultadosBufer *pResult = theFirstResult; FGVResultadosBufer *pResulNext = NULL; // liberar la ristra while (pResulNext = pResult->pRnext) { delete pResult; pResult = pResulNext; } delete pResult; theFirstResult = NULL; } PLEDERFlujoPermanenteDlg.cpp // PLEDERFlujoPermanenteDlg.cpp: archivo de implementación // #include "stdafx.h" #include "PLEDERFlujoPermanenteDlg.h" // Cuadro de diálogo de CPLEDERFlujoPermatenteDlg IMPLEMENT_DYNAMIC(CPLEDERFlujoPermanenteDlg, CDialog) CPLEDERFlujoPermanenteDlg::CPLEDERFlujoPermanenteDlg(CWnd* pParent /*=NULL*/) : CAdUiDialog(CPLEDERFlujoPermanenteDlg::IDD, pParent) { m_TipoFlujo = 0; m_Ydowstream = _T("1.25"); m_Yupstream = _T("1.30"); m_Caudal = _T("100.00"); } CPLEDERFlujoPermanenteDlg::~CPLEDERFlujoPermanenteDlg() { } void CPLEDERFlujoPermanenteDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_TDOW, m_Edit_Ydowstream); DDX_Control(pDX, IDC_EDIT_TUPS, m_Edit_Yupstream); DDX_Control(pDX, IDC_EDIT_CAUDAL, m_Edit_Caudal);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccl
// Radio DDX_Radio(pDX, IDC_RADIO_FSUB, m_TipoFlujo); } BEGIN_MESSAGE_MAP(CPLEDERFlujoPermanenteDlg, CAdUiDialog) // Radios (cambios en los Radios) ON_BN_CLICKED(IDC_RADIO_FSUB, OnRadioFlujoSubcritico) ON_BN_CLICKED(IDC_RADIO_FSUP, OnRadioFlujoSupercritico) ON_BN_CLICKED(IDC_RADIO_FMIX, OnRadioFlujoMixto) ON_BN_CLICKED(IDOK, &CPLEDERFlujoPermanenteDlg::OnBnClickedOk) END_MESSAGE_MAP() // Controladores de mensajes de CPLEDERFlujoPermanenteDlg BOOL CPLEDERFlujoPermanenteDlg::OnInitDialog() { CDialog::OnInitDialog(); // Activar radio Fjujo Supcrítico CButton *pTipoFlujo; pTipoFlujo = (CButton *)GetDlgItem(IDC_RADIO_FSUB); pTipoFlujo->SetCheck(1); // Activa y desactiva para f. Sub por defecto m_Edit_Ydowstream.EnableWindow(1); m_Edit_Yupstream.EnableWindow(0); m_TipoFlujo = 0; // Inicializa Cajas de texto m_Edit_Ydowstream.SetWindowText(m_Ydowstream); m_Edit_Yupstream.SetWindowText(m_Yupstream); m_Edit_Caudal.SetWindowText(m_Caudal); return TRUE; } void CPLEDERFlujoPermanenteDlg::OnRadioFlujoSubcritico() { // Activa y desactiva las casillas de la ventana m_Edit_Ydowstream.EnableWindow(1); m_Edit_Yupstream.EnableWindow(0); m_TipoFlujo = 0; } void CPLEDERFlujoPermanenteDlg::OnRadioFlujoSupercritico() { // Activa las casillas de la ventana m_Edit_Ydowstream.EnableWindow(0); m_Edit_Yupstream.EnableWindow(1); m_TipoFlujo = 1; } void CPLEDERFlujoPermanenteDlg::OnRadioFlujoMixto() { // Activa las casillas de la ventana m_Edit_Ydowstream.EnableWindow(1); m_Edit_Yupstream.EnableWindow(1); m_TipoFlujo = 2; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccli
void CPLEDERFlujoPermanenteDlg::OnBnClickedOk() { // TODO : Add extra validation here m_Edit_Ydowstream.GetWindowText(m_Ydowstream); m_Edit_Yupstream.GetWindowText(m_Yupstream); m_Edit_Caudal.GetWindowText(m_Caudal); CDialog::OnOK(); } PLEDERHidraBuffer.cpp #include "StdAfx.h" #include "PLEDERHidraBuffer.h" /*Clase CrossSectionsBufer: Bufer para seciones transversales que se desaloja mediante la función FreeAllCrossSections()*/ CrossSectionsBufer::CrossSectionsBufer() { nbnext = NULL; m_IdST = 0; m_nVST = 0; } CrossSectionsBufer::CrossSectionsBufer(AcGePoint2d P1, double X1, double Y1, double IdST, long nVST, AcGePoint2dArray Vertice, double HminG, double HminL, double LL, double LC, double LR, double NL, double NC, double NR, long BL, long BR, double CC, double CE) { nbnext = NULL; m_P1[X] = P1[X]; m_P1[Y] = P1[Y]; m_X1 = X1; m_Y1 = Y1; m_HminG = HminG; m_HminL = HminL; m_IdST = IdST; m_nVST = nVST; m_LL = LL; m_LC = LC; m_LR = LR; m_NL = NL; m_NC = NC; m_NR = NR; m_BL = BL; m_BR = BR; m_CC = CC; m_CE = CE; // Vértices globales
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclii
for(int i=0; i <m_nVST; i++) { m_GlobalVertice[i].x = Vertice[i].x; m_GlobalVertice[i].y = Vertice[i].y; m_GlobalVertice[i].z = 0.0; } ads_point v1; // Vértices locales for(int i=0; i <m_nVST; i++) {
v1[X]= X1 + (m_GlobalVertice[i].x - P1[X]); // Suma la posición inicial X + la distancia X v1[Y]= Y1 - (P1[Y] - m_GlobalVertice[i].y); // Resta la posición inicial Y - la distancia Y
m_LocalVertice[i].x = v1[X]; m_LocalVertice[i].y = v1[Y]; m_LocalVertice[i].z = 0.0; X1 = v1[X]; Y1 = v1[Y]; P1[X]= m_GlobalVertice[i].x; P1[Y]= m_GlobalVertice[i].y; } } CrossSectionsBufer::~CrossSectionsBufer() { } //------------------------------------------------------------------- /*Clase CrossSectionsSocavacionBufer: Bufer para seciones transversales que se desaloja mediante la función FreeAllCrossSectionsSocavacion()*/ CrossSectionsSocavacionBufer::CrossSectionsSocavacionBufer() { nbnext = NULL; } CrossSectionsSocavacionBufer::CrossSectionsSocavacionBufer(double IdST, int Material, int CoefProb, double CoefMaterial) { nbnext = NULL; m_IdST = IdST; m_Material = Material; m_CoefMaterial = CoefMaterial; m_CoefProb = CoefProb; } CrossSectionsSocavacionBufer::~CrossSectionsSocavacionBufer() { }
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccliii
//------------------------------------------------------------------- /*Clase FGVResultadosBufer: Bufer los resultados que se desaloja mediante la función FreeAllResultados()*/ FGVResultadosBufer::FGVResultadosBufer() { pRnext = NULL; } FGVResultadosBufer::FGVResultadosBufer(int nV, AcGePoint2dArray Vertice, double IdST, double h, double Zs, double Beta, double ALF, double AMC, double ARF, double PLF, double PMC, double PRF, double KLF, double KMC, double KRF, double Q, double hf12, double hc12, double TopW, double LMC) { pRnext = NULL; m_IdST = IdST; m_nV = nV; m_h = h; // Tirante. m_Zs = Zs; // Cota Tirante. m_Beta = Beta; // Coeciente de corrección. m_ALF = ALF; // Area llanura Izquierda. m_AMC = AMC; // Area Canal central. m_ARF = ARF; // Area llanura derecha. m_PLF = PLF; // Perímetro llanura izquierdo. m_PMC = PMC; // Perímetro canal central. m_PRF = PRF; // Perímetro llanura derecho m_KLF = KLF; // Conductividad llanura izquierdo. m_KMC = KMC; // Conductividad canal central. m_KRF = KRF; // Conductividad llanura derecho m_Q = Q ; // Descarga del flujo. m_hf12 = hf12; // Pérdida por fircción. m_hc12 = hc12; // Pérdida local. m_TopW = TopW; // Espejo de agua m_LMC = LMC; // Longitud del canal central. // Vértices Calculados for(int i = 0; i < m_nV; i++) { m_ResultVertice[i].x = Vertice[i].x; m_ResultVertice[i].y = Vertice[i].y; m_ResultVertice[i].z = 0.0; //acutPrintf(_T("\nm_ResultVertice[%d], X = %0.3f , Y = %0.3f"), i, m_ResultVertice[i].x, m_ResultVertice[i].y ); } } // Destructor FGVResultadosBufer::~FGVResultadosBufer() { } //------------------------------------------------------------------- SeccionesBufer::SeccionesBufer() {
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccliv
Siguiente = NULL; } //Constructor que inicializa a CoorXX, CoordYY, ns y siguiente = NULL SeccionesBufer::SeccionesBufer(int nss, double CoordXX, double CoordYY, double Coefmanning) { Siguiente = NULL; ns = nss; CoordX = CoordXX; CoordY = CoordYY; manning = Coefmanning; } //Destructor SeccionesBufer::~SeccionesBufer() {} // Obtiene una copia del atributo Siguiente. SeccionesBufer* SeccionesBufer::ObtenerSiguiente() { return Siguiente; } //Pone el atributo Siguiente a p void SeccionesBufer::PonerSiguiente(SeccionesBufer *p) { Siguiente = p; } PerfilesBufer::PerfilesBufer() { SiguienteP = NULL; } PerfilesBufer::PerfilesBufer(int nST, ads_point v0, ads_point v1) { SiguienteP = NULL; start[X] = v0[X]; start[Y] = v0[Y]; start[Z] = v0[Z]; end[X] = v1[X]; end[Y] = v1[Y]; end[Z] = v1[Z]; } PerfilesBufer::~PerfilesBufer() { } PLEDERHidraSecTrasnv.cpp #include "StdAfx.h" #include "PLEDERHidraSecTrasnv.h" #include "PLEDERHidraBuffer.h" #include "PLEDERRecursosCad.h"
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclv
#include <iostream> #include <fstream> // Para exportar atributos #include <cstdlib> #include <new> //Constructor HidraSecTrasnv::HidraSecTrasnv(void) { // inicializar la clase pPrimerST = NULL; } //Destructor HidraSecTrasnv::~HidraSecTrasnv(void) { LiberarBufferSeccionesTransv(); } int HidraSecTrasnv::NumeroVerticesPolilinea(ads_name nombrep, long *nVST) /*--------------------------------------------------------------------------------------- Ingreso : nombrep = Nombre de la entidad polyline. Salida : Número de Vértices de una polilinea. RTCAN si la entidad no es una polyline o RTERROR en otro caso. Propósito : Retorna EL Número de Vértices de una polilinea ---------------------------------------------------------------------------------------*/ { unsigned int k, numVerts; AcDbObjectId ID; AcDbEntity *pEnt; *nVST = 0; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { acdbFail(_T("\nError al abrir el Objeto ")); return RTERROR; } // chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) { pEnt->close(); acdbFail(_T("\nTipo de entidad inesperada ")); return RTCAN; } AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclvi
*nVST = pPolyline->numVerts(); // Toma el número de vértices de la polyline pPolyline->close(); return RTNORM; } int HidraSecTrasnv::LeerVerticesPolilineaConsola(ads_name nombrep, ads_point p1, double X1, double Y1, int contador) /*--------------------------------------------------------------------------------------- Ingreso : nombrep = Nombre de la entidad polyline. p1 = Punto de referencia para relacionar las coordenadas. X1 = Distancia X de la ST Y1 = Cota de la ST, contador = Para el conteo de número de secciones transversales (ST). para este caso no se da uso. Salida : RTNORM si no se produce ningún error. RTCAN si la entidad no es una polyline o RTERROR en otro caso. Propósito : Almacena las coordenadas de una polilinea (ST) en la consola con con transformaciones de coordenadas locales. ---------------------------------------------------------------------------------------*/ { ads_point v1, v2 ; v2[Z] = 0.0; AcGePoint2d pt ; unsigned int k, numVerts; long numof = 0; TCHAR str[256], str2[256]; double htexto = 0.2; double radio = 0.2; AcDbObjectId ID; AcDbEntity *pEnt; CRecursosCad Cad; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { acdbFail(_T("\nError al abrir el Objeto ")); return RTERROR; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclvii
// chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) { pEnt->close(); acdbFail(_T("\nTipo de entidad inesperada ")); return RTCAN; } AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt; // chequear si la Polyline tiene elevación cero if (pPolyline->elevation() != 0) { pPolyline->close(); acutPrintf(_T("\nLa polyline no tiene elevación 0.")); return RTCAN; } numVerts = pPolyline->numVerts(); // Toma el número de vértices de la polyline if (numVerts <= 2) { pPolyline->close(); acdbFail(_T("\nPolyline no válida ")); return RTERROR; } //Accede a los vértices de la polilinea for (k = 0; k < numVerts; k++) { // Coge la coordenada en el punto pt pPolyline->getPointAt(k,pt) ; v1[X]= X1 + (pt[X] - p1[X]); // Suma la posición inicial X + la distancia X v1[Y]= Y1 - (p1[Y] - pt[Y]); // Resta la posición inicial Y - la distancia Y Cad.DibujarCirculos(pt[X], pt[Y], 0.00, PLEDER_CAPA_VERTICES, radio); v2[X]=pt[X]; v2[Y]=pt[Y]+ radio + htexto/2; //Configura el punto a ser insertado el texto acdbRToS(k+1, 2, 0, str); //Concatena el texto con 0 decimales Cad.DibujarTexto(v2, PLEDER_CAPA_VERTICES_TX, str, htexto, false, 1); acutPrintf (_T("\n%d %0.3f %0.3f"), k+1, v1[X], v1[Y] ); X1= v1[X]; Y1= v1[Y]; p1[X]= pt[X]; p1[Y]= pt[Y]; numof++;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclviii
} // for k pPolyline->close(); return RTNORM; } int HidraSecTrasnv::LeerVerticesPolilineaLista(ads_name nombrep, ads_point p1, double X1, double Y1, double* CX, double* CY) /*-------------------------------------------------------------------- Ingreso : nombrep = Nombre de la entidad polyline. p1 = Punto de referencia para relacionar las coordenadas. X1 = Distancia X de la ST Y1 = Cota de la ST, Salida : CX = Lista de las coordenadas X CY = Lista de las coordenadas Y RTNORM si no se produce ningún error. RTCAN si la entidad no es una polyline o RTERROR en otro caso. Propósito : Almacena las coordenadas de una polilinea (ST) en listas con transformaciones de coordenadas locales. -------------------------------------------------------------------*/ { ads_point v1, v2 ; v2[Z] = 0.0; AcGePoint2d pt ; unsigned int k, numVerts; long numof = 0; TCHAR str[256], str2[256]; double htexto = 0.2; double radio = 0.2; AcDbObjectId ID; AcDbEntity *pEnt; CRecursosCad Cad; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { acdbFail(_T("\nError al abrir el Objeto ")); return RTERROR; } // chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) {
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclix
pEnt->close(); acdbFail(_T("\nTipo de entidad inesperada ")); return RTCAN; } AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt; // chequear si la Polyline tiene elevación cero if (pPolyline->elevation() != 0) { pPolyline->close(); acutPrintf(_T("\nLa polyline no tiene elevación 0.")); return RTCAN; } numVerts = pPolyline->numVerts(); // Toma el número de vértices de la polyline if (numVerts <= 2) { pPolyline->close(); acdbFail(_T("\nPolyline no válida ")); return RTERROR; } //Accede a los vértices de la polilinea for (k = 0; k < numVerts; k++) { // Coge la coordenada en el punto pt pPolyline->getPointAt(k,pt) ;
v1[X]= X1 + (pt[X] - p1[X]); // Suma la posición inicial X + la distancia X v1[Y]= Y1 - (p1[Y] - pt[Y]); // Resta la posición inicial Y - la distancia Y
Cad.DibujarCirculos(pt[X], pt[Y], 0.00, PLEDER_CAPA_VERTICES, radio); v2[X]=pt[X];
v2[Y]=pt[Y]+ radio + htexto/2; //Configura el punto a ser insertado el texto acdbRToS(k+1, 2, 0, str); //Concatena el texto con 0 decimales
Cad.DibujarTexto(v2, PLEDER_CAPA_VERTICES_TX, str, htexto, false, 1); //acutPrintf (_T("\n%d %0.3f %0.3f"), k+1, v1[X], v1[Y] ); CX[k+1] = v1[X]; CY[k+1] = v1[Y]; X1= v1[X]; Y1= v1[Y]; p1[X]= pt[X]; p1[Y]= pt[Y]; numof++; } // for k
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclx
pPolyline->close(); return RTNORM; } int HidraSecTrasnv::LeerVerticesPolilinea(ads_name nombrep, double* CX, double* CY) /*-------------------------------------------------------------------- Ingreso : nombrep = Nombre de la entidad polyline. p1 = Punto de referencia para relacionar las coordenadas. Salida : CX = Lista de las coordenadas X CY = Lista de las coordenadas Y RTNORM si no se produce ningún error. RTCAN si la entidad no es una polyline o RTERROR en otro caso. Propósito : Almacena las coordenadas de una polilinea (ST) en listas sin transformaciones de coordenadas. --------------------------------------------------------------------*/ { ads_point v1, v2 ; v2[Z] = 0.0; AcGePoint2d pt ; unsigned int k, numVerts; AcDbObjectId ID; AcDbEntity *pEnt; CRecursosCad Cad; // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, nombrep) != Acad::eOk) { acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pEnt, ID, AcDb::kForRead) != Acad::eOk) { acdbFail(_T("\nError al abrir el Objeto ")); return RTERROR; } // chequear el tipo de objeto if (pEnt->isKindOf(AcDbPolyline::desc()) != Adesk::kTrue) { pEnt->close(); acdbFail(_T("\nTipo de entidad inesperada ")); return RTCAN; } AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt; // chequear si la Polyline tiene elevación cero if (pPolyline->elevation() != 0) { pPolyline->close();
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxi
acutPrintf(_T("\nLa polyline no tiene elevación 0.")); return RTCAN; }
numVerts = pPolyline->numVerts(); // Toma el número de vértices de la polyline
if (numVerts <= 2) { pPolyline->close(); acdbFail(_T("\nPolyline no válida ")); return RTERROR; } //Accede a los vértices de la polilinea for (k = 0; k < numVerts; k++) { // Coge la coordenada en el punto pt pPolyline->getPointAt(k,pt) ; CX[k+1] = pt[X]; CY[k+1] = pt[Y]; } // for k pPolyline->close(); return RTNORM; } int HidraSecTrasnv::ImportarSeccionesTransversales(const TCHAR *pNombreArchivo, long *NumeroVertST ) /*-------------------------------------------------------------------Ingreso : pNombreArchivo = Puntero a una zero terminated string con el nombre del archivo. NumeroVertST = Numero de vértices de las secciones transversales. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Importar las Secciones Transversales desde un archivo. Guarda los datos en el Buffer SeccionesBufer, para luego llamar desde cualquier función. --------------------------------------------------------------------*/ { std::ifstream infile; char *buffer = NULL; char *token = NULL; char seps[] = PUNFILESEP; int n; long np = 0; double x=0, y=0, manning=0; if (!pNombreArchivo) { acdbFail(_T("\nArgumento de función no válido [ImportarSeccionesTransversales].")); return RTERROR; } acutPrintf(_T("\nLeyendo el fichero ascii ...\n"));
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxii
// abrir el fichero para lectura infile.open(pNombreArchivo); if (infile.fail() != 0) { *NumeroVertST = 0; acdbFail(_T("\nError de E/S al abrir el fichero [ImportarSeccionesTransversales][open].")); return RTERROR; } // crear un buffer para la lectura del fichero buffer = (char*)acad_malloc(GETLINEMAXBUFF * sizeof(char)); if (!buffer) { *NumeroVertST = 0; infile.close(); acdbFail(_T("\nError de asignación de memoria [Importar ST][buffer].")); return RTERROR; } // tomar primero el número de puntos que contiene el fichero // para poder valorar la longitud de la barra de progeso while (!infile.eof()) { infile.getline(buffer, GETLINEMAXBUFF, '\n'); if (infile.eof()) { // limpiar el flag eof infile.clear(); break; } np++; } // mover el puntero al principio del fichero infile.seekg(0, std::ios_base::beg); // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Insertando las secciones transversales: "), 0, (int)np); np = 0; // crear el buffer y añadir el primer Vértice como puntero try { pPrimerST = new SeccionesBufer(); } catch(const std::bad_alloc&) { acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [Importar ST][pPrimerST].")); return RTERROR; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxiii
SeccionesBufer *nST, *nbprevious = pPrimerST; // recorrer el fichero while (!infile.eof()) { // leer una línea del fichero infile.getline(buffer, GETLINEMAXBUFF, '\n'); if (infile.eof()) break; // separar los campos token = ::strtok(buffer, seps); if (!token) { *NumeroVertST = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Secciones Trasnv. No válido [Importar ST]")); return RTERROR; } n = atoi(token); // Coordenada x token = ::strtok(NULL, seps); if (!token) { *NumeroVertST = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Secciones Trasnv. No válido -n- [Importar ST]")); return RTERROR; } x = atof(token); // Coordenada y o Cota token = ::strtok(NULL, seps); if (!token) { *NumeroVertST = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Secciones Trasnv. No válido -x- [Importar ST]")); return RTERROR; } y = atof(token); // Coeficiente de Manning token = ::strtok(NULL, seps); if (!token)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxiv
{ *NumeroVertST = np; infile.close(); acad_free(buffer); acedRestoreStatusBar(); acdbFail(_T("\nFichero de Secciones Trasnv. No válido -manning- [Importar ST]")); return RTERROR; } manning = atof(token); int contador = 1; // añadir los vértices de las secciones transv. al buffer try { nST = new SeccionesBufer(n, x, y, manning); } catch(const std::bad_alloc&) { LiberarBufferSeccionesTransv(); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [Importar ST][nST].")); return RTERROR; } nbprevious->Siguiente = nST; nbprevious = nST; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); } // while infile.close(); acad_free(buffer); acedRestoreStatusBar(); *NumeroVertST = np; //Número de vértices totales return RTNORM; } int HidraSecTrasnv::ObtenerSeccionesTransversales() /*-------------------------------------------------------------------- Ingreso : Vacío. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Capta los datos del buffer SeccionesBufer, obtenidos al importar los datos de las secciones transversales. --------------------------------------------------------------------*/ { //Chequear los argumentos if (!pPrimerST) { acdbFail(_T("\nPuntero Nulo de la importación"));
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxv
return RTERROR; } SeccionesBufer *pSeccTrasv; pPrimerST = pPrimerST->Siguiente; for (pSeccTrasv = pPrimerST; pSeccTrasv != NULL; pSeccTrasv = pSeccTrasv->Siguiente) { acutPrintf (_T("\n%d,%0.3f, %0.3f, %0.3f "), pSeccTrasv->ns , pSeccTrasv->CoordX, pSeccTrasv->CoordY, pSeccTrasv->manning); } return RTNORM; } void HidraSecTrasnv::LiberarBufferSeccionesTransv() /*------------------------------------------------------------------- Ingreso : Vacío. Salida : Vacío. Propósito : Libera el buffer en ristra SeccionesBufer al que apunta el miembro pPrimerST. Llamar a esta función para liberar el buffer con los vértives de las secciones transversales obtenidos mediante una llamada a la función ImportarSeccionesTransversales(). --------------------------------------------------------------------*/ { if (!pPrimerST) return; SeccionesBufer *nST = pPrimerST; SeccionesBufer *Siguiente = NULL; // liberar la ristra while (Siguiente = nST->Siguiente) { delete nST; nST = Siguiente; } delete nST; pPrimerST = NULL; } PLEDERRecursosSuperficieLibre.cpp #include "StdAfx.h" #include "PLEDERRecursosSuperficieLibre.h" CRecursosSuperficieLibre::CRecursosSuperficieLibre(void) { } CRecursosSuperficieLibre::~CRecursosSuperficieLibre(void) { } int CRecursosSuperficieLibre::NumeroVerticesCadaST(float *V, int n, int nST, float *nVert)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxvi
/*-------------------------------------------------------------------- Ingreso : V = Lista de Vértices de las S. T. Totales n = Número de vértices de las secciones transversales. nST = Número de Secciones Transversales. nVert = Lista de Números de los Vértices de las Secciones
Transversales. Ingresa vacío, para luego ser almacenado (leer Propósito).
Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula los números de los Vértices para cada Secciones Transversales y los almacena en una lista (nVert) de dimensiones nST. -------------------------------------------------------------------*/ { int i, cont = 1, contador = 1; for( i = 2; i < n; i++) { if (V[i] ==1) { nVert[contador]= cont; contador++; cont = 0; } cont++; } //For i nVert[nST] = V[n]; // Lista que contiene los números de vértices. return RTNORM; } int CRecursosSuperficieLibre::VerticesMaximosMinimos(float *ListaC, int nST, float *nVert, float *Vminimo, float *Vmaximo) /*-------------------------------------------------------------------- Ingreso : ListaC= Lista de Coordenadas de las S. T. Totales nST = Número de Secciones Transversales. nVert = Lista de Números de los Vértices de las Secciones Transversales. Vmin = Lista de Los Vértices Mínimos de las S. T. Vmax = Lista de Los Vértices Máximos de las S. T. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Busca los Vértices Mínimos y Máximos de una lista. Los almacena en las listas Vmin[] y Vmax[], de dimensión nST. --------------------------------------------------------------------*/ { int i, j, inicio = 1, // Principio para la interación. fin = nVert[1]; // Final de la iteración. float Mayor, Menor; for (i = 1; i <= nST; i++) { inicio = inicio; fin = fin; Mayor = ListaC[inicio]; Menor = ListaC[inicio]; for (j = (inicio +1); j <= fin; j++)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxvii
{ if ( Menor > ListaC[j]) { Menor = ListaC[j]; } if(Mayor < ListaC[j]) { Mayor = ListaC[j]; } Vminimo[i] = Menor;// Lista que contiene los vértices mínimos. Vmaximo[i] = Mayor; // Lista que contiene los vértices máximos. }//For j inicio = inicio + nVert[i]; if (i < nST)// Prevee que en la última iteración tome un valor NULO { fin = fin + nVert[i+1]; } }//For i return RTNORM; } double CRecursosSuperficieLibre::PendienteMotrizSfm(float K1,float K2, float Q, float nn, int MetodoSfm) /*-------------------------------------------------------------------- Ingreso : K1 = Factor de Transporte en la primera sección de análisis. K2 = Factor de Transporte en la segunda sección de análisis. Q = Caudal del flujo. nn = Coeficiente de Manning. MetodoSfm = Método a usar Salida : Sfm = Pendiente Motriz. Propósito : Calcula la Pendiente Motriz entre dos secciones transversales por los para los cuatro métodos. --------------------------------------------------------------------*/ { double Sfm, I1, I2; I1 = pow(Q/K1,2); I2 = pow(Q/K2,2); switch (MetodoSfm) { case 1: // Ecuación de Factor de transporte Medio. { Sfm = pow(((Q+Q)/(K1+K2)),2); break; } case 2: // Media Aritmética. { Sfm = (I1+I2)/2;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxviii
break; } case 3: // Media Geométrica. { Sfm = sqrt(I1*I2); break; } case 4: // Media Armónica. { Sfm = 2*I1*I2/(I1+I2); break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (MetodoSfm) return Sfm; } float CRecursosSuperficieLibre::NumeroFroude(float Q, float A, float dA ) /*-------------------------------------------------------------------- Ingreso : Q = Caudal del flujo. A = Área Transversal de la sección. dA = Derivada del Área Transversal de la sección. Salida : NF = Número de Froude. Propósito : Calcula el Número de Froude --------------------------------------------------------------------*/ { float NF; NF = (Q*Q / g*A*A*A)*dA; return NF; } int CRecursosSuperficieLibre::AreaPerimetro(int inicio, int fin, float CotaTirante, float *CX, float *CY, double *Area, double *Perimetro) /*-------------------------------------------------------------------- Ingreso : inicio = Principio para la interación. fin = Final de la iteración. CotaTirante = Cota del tirante de la sección transversal.
Dato importante para determinar el área y el perímetro de la S.T.
CX = Datos de las Distancicias (eje X). CY = Datos de las cotas (eje Y). Salida : Area = Área Transversal para un tirante que se ingresó (CotaTirante). Perímetro = Perímetro Transversal para un tirante que se ingresó (CotaTirante). RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula el Área y el Perímetro de una sección transversal a partir de una cota tirante. -------------------------------------------------------------------*/
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxix
{ int j,k; float Xi, Xd; double Ai = 0, // Área en la sección Izquierda. At = 0, // Área en los trapecios. Ad = 0, // Área en la sección derecha. Pi = 0, // Perímetro en la sección Izquierda. Pt = 0, // Perímetro en los trapecios. Pd = 0; // Perímetro en la sección derecha.
float YY[1000]; // Variable local para reasignar las coordenadas en Y
float XX[1000]; // Variable local para reasignar las coordenadas en X
int star = 1, end, cont; end = fin - inicio + 1; // Traslada los valores hacia la nueva lista YY , XX cont = inicio; for (k = star; k <= end; k++) { YY[k] = CY[cont]; XX[k] = CX[cont]; cont++; } bool InundIzquierdo = false; // Por defecto NO Existe Inundación bool InundDerecho = false; // Por defecto NO Existe Inundación // Son condiciones para agregar vértices si el tirante es mayor a los // vértices de las S. T. (casos de inundaciones) // Inundación Margen Izquierda? if (CotaTirante > CY[inicio]) { YY[1] = CotaTirante; XX[1] = CX[inicio]; cont = 2; for (k =inicio; k <= fin; k++) { YY[cont] = CY[k]; XX[cont] = CX[k]; cont++; } end++; InundIzquierdo = true; } // Inundación Margen Derecha? if (CotaTirante > CY[fin]) { YY[end+1] = CotaTirante; XX[end+1] = CX[fin]; //acutPrintf(_T("\nNuevos Valores de Y: %0.3f"), Y[k-1]); end++;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxx
InundDerecho = true; } // Inicio del recorrido de los vértices. for (j = star; j <= (end - 1); j++) { // Condición para calcular en el triángulo izquierdo if ((CotaTirante <= YY[j]) && (CotaTirante >= YY[j+1])) { // Cálculo: Area del triángulo izquierdo Ai = Ai + pow((CotaTirante-YY[j+1]),2)*(XX[j+1]-XX[j])/(2.0*(YY[j]-YY[j+1])); // Cálculo: Perímetro del triángulo izquierdo Pi = Pi + sqrt(pow((CotaTirante - YY[j+1]),2)+ pow((CotaTirante-YY[j+1])*(XX[j+1]-XX[j])/(YY[j]-YY[j+1]),2)); bool condicion = true; while (condicion) { j++; // Condición para calcular en los trapecios. if (YY[j+1] <= CotaTirante) { // Cálculo: Area del trapecio At= At + ((2.0*CotaTirante - YY[j]- YY[j+1])/2.0)*(XX[j+1]-XX[j]); // Cálculo: Perímetro del trapecio Pt = Pt + sqrt(pow((XX[j+1]- XX[j]),2) + pow((YY[j+1] - YY[j]),2)); } // Condición para calcular en el triángulo derecho. if (YY[j+1] >= CotaTirante) { // Cálculo: Area del triángulo derecho. Ad = Ad + pow((CotaTirante-YY[j]),2)*(XX[j+1]-XX[j])/(2.0*(YY[j+1]-YY[j])); //acutPrintf(_T("\nValores de Area Derecha: %0.6f"), Ad); // Cálculo: Perímetro del triángulo derecho. Pd = Pd + sqrt(pow((CotaTirante - YY[j]),2)+ pow((CotaTirante-YY[j])*(XX[j+1]-XX[j])/(YY[j+1]-YY[j]),2)); } if (YY[j+1] < CotaTirante) { condicion = true; } else { condicion = false; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxi
}//While } //if }//For j *Area = Ai + At + Ad; // Area Total *Perimetro = Pi + Pt + Pd; // Perímetro Total return RTNORM; } int CRecursosSuperficieLibre::AreaPerimetroDerivadas(int inicio, int fin, float CotaTirante, float *CX, float *CY, double *Area, double *Perimetro, double *dArea, double *dPerimetro) /*-------------------------------------------------------------------- Ingreso : inicio = Principio para la interación. fin = Final de la iteración. CotaTirante = Cota del tirante de la sección transversal. Dato importante para determinar el área y el perímetro de la S.T. CX = Datos de las Distancicias (eje X). CY = Datos de las cotas (eje Y). Salida : Area = Área Transversal para un tirante que se ingresó (CotaTirante). dArea = Derivada del Área Transversal. Perímetro = Perímetro Transversal para un tirante que se ingresó (CotaTirante). dPerímetro = Derivada del Perímetro Transversal. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula el Área,el Perímetro, la derivada del área y la derivada del perímetro de una sección transversal a partir de una cota tirante. --------------------------------------------------------------------*/ { int j,k; float Xi, Xd; double Ai = 0, // Área en la sección Izquierda. At = 0, // Área en los trapecios. Ad = 0, // Área en la sección derecha. dAi = 0, // Derivada del Área en la sección Izquierda. dAt = 0, // Derivada del Área en los trapecios. dAd = 0, // Derivada del Área en la sección derecha. Pi = 0, // Perímetro en la sección Izquierda. Pt = 0, // Perímetro en los trapecios. Pd = 0, // Perímetro en la sección derecha. dPi = 0, // Derivada del Perímetro en la sección Izquierda.
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxii
dPt = 0, // Derivada del Perímetro en los trapecios.
dPd = 0; // Derivada del Perímetro en la sección derecha.
float YY[1000]; // Variable local para reasignar las
coordenadas en Y float XX[1000]; // Variable local para reasignar las
coordenadas en X int star = 1, end, cont; end = fin - inicio + 1; // Traslada los valores hacia la nueva lista YY , XX cont = inicio; for (k = star; k <= end; k++) { YY[k] = CY[cont]; XX[k] = CX[cont]; cont++; //acutPrintf(_T("\nNuevos Valores de Y: %0.3f"), Y[k-1]); } bool InundIzquierdo = false; // Por defecto NO Existe Inundación bool InundDerecho = false; // Por defecto NO Existe Inundación
// Son condiciones para agregar vértices si el tirante es mayor a los
// vértices de las S. T. (casos de inundaciones) // Inundación Margen Izquierda? if (CotaTirante > CY[inicio]) { YY[1] = CotaTirante; XX[1] = CX[inicio]; cont = 2; for (k =inicio; k <= fin; k++) { YY[cont] = CY[k]; XX[cont] = CX[k]; cont++; } end++; InundIzquierdo = true; } // Inundación Margen Derecha? if (CotaTirante > CY[fin]) { YY[end+1] = CotaTirante; XX[end+1] = CX[fin]; //acutPrintf(_T("\nNuevos Valores de Y: %0.3f"), Y[k-1]); end++; InundDerecho = true; } // Inicio del recorrido de los vértices. for (j = star; j <= (end - 1); j++) { // Condición para calcular en el triángulo izquierdo if ((CotaTirante <= YY[j]) && (CotaTirante >= YY[j+1]))
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxiii
{ // Interpolación para el triágulo izquierdo 'Xi' //Xi = XX[j+1] -(XX[j+1]-XX[j])*(CotaTirante-YY[j+1])/(YY[j]-YY[j+1]); // Cálculo: Area del triángulo izquierdo Ai = Ai + pow((CotaTirante-YY[j+1]),2)*(XX[j+1]-XX[j])/(2.0*(YY[j]-YY[j+1])); //acutPrintf(_T("\nValores de Area Izquierdo: %0.6f"), Ai); // Cálculo: Derivada del Area con respecto a Y del triángulo izquierdo dAi = dAi + 2.0*Ai/(CotaTirante - YY[j+1]); // Cálculo: Perímetro del triángulo izquierdo Pi = Pi + sqrt(pow((CotaTirante - YY[j+1]),2)+ pow((CotaTirante-YY[j+1])*(XX[j+1]-XX[j])/(YY[j]-YY[j+1]),2)); // Cálculo: Derivada del Perímetro con respecto a Y del triángulo izquierdo dPi = dPi + Pi/(CotaTirante - YY[j+1]); bool condicion = true; while (condicion) { j++; // Condición para calcular en los trapecios. if (YY[j+1] <= CotaTirante) { // Cálculo: Area del trapecio At= At + ((2.0*CotaTirante - YY[j]- YY[j+1])/2.0)*(XX[j+1]-XX[j]); //acutPrintf(_T("\nValores de Area Trapecio: %0.6f"), At); // Cálculo: Derivada del Area con respecto a Y de los trapecios dAt = dAt + XX[j+1] - XX[j]; // Cálculo: Perímetro del trapecio Pt = Pt + sqrt(pow((XX[j+1]- XX[j]),2) + pow((YY[j+1] - YY[j]),2)); } // Condición para calcular en el triángulo derecho. if (YY[j+1] >= CotaTirante) { // Interpolación para el triágulo derecho 'Xd' //Xd = XX[j] +(XX[j+1]- XX[j])*(CotaTirante - YY[j])/(YY[j+1]-YY[j]); // Interpolación de segmento derecho // |(Xi+1 - Xi)(Y - Yi) | // X = |---------------------| + Xi / | (Yi+1 - Yi) |
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxiv
// Cálculo: Area del triángulo derecho. Ad = Ad + pow((CotaTirante-YY[j]),2)*(XX[j+1]-XX[j])/(2.0*(YY[j+1]-YY[j])); //acutPrintf(_T("\nValores de Area Derecha: %0.6f"), Ad); // Cálculo: Derivada del Area con respecto a Y del triángulo derecho dAd = dAd + 2.0*Ad/(CotaTirante - YY[j]); // Cálculo: Perímetro del triángulo derecho. Pd = Pd + sqrt(pow((CotaTirante - YY[j]),2)+ pow((CotaTirante-YY[j])*(XX[j+1]-XX[j])/(YY[j+1]-YY[j]),2)); // Cálculo: Derivada del Perimetro con respecto a Y del triángulo derecho dPd = dPd + Pd/(CotaTirante - YY[j]); } if (YY[j+1] < CotaTirante) { condicion = true; } else { condicion = false; } }//While } //if }//For j *Area = Ai + At + Ad; // Area Total *dArea = dAi + dAt + dAd; // Derivada del Area Total *Perimetro = Pi + Pt + Pd; // Perímetro Total *dPerimetro = dPi + dPt + dPd; // Derivada del Perímetro Total return RTNORM; } PLEDERResutadosDlg.cpp #include "StdAfx.h" #include "resource.h" #include "PLEDERResutadosDlg.h" #include "PLEDERHidraBuffer.h" #include "PLEDERRecursosCad.h" #include "axlock.h" // Tabla CRecursosCad RecursosR; //-------------------------------------------------------------------- IMPLEMENT_DYNAMIC (CPLEDERResutadosDlg, CAdUiDialog) //-------------------------------------------------------------------- CPLEDERResutadosDlg::CPLEDERResutadosDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxv
: CAdUiDialog (CPLEDERResutadosDlg::IDD, pParent, hInstance) { m_bFullRow = TRUE; m_bGridLines = TRUE; m_bCheckboxes = TRUE; m_Rx = _T("0.00"); m_Ry = _T("0.00"); } CPLEDERResutadosDlg::~CPLEDERResutadosDlg() { } //-------------------------------------------------------------------- void CPLEDERResutadosDlg::DoDataExchange (CDataExchange *pDX) { CAdUiDialog::DoDataExchange (pDX) ; // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_Rx, m_Edit_Rx); DDX_Control(pDX, IDC_EDIT_Ry, m_Edit_Ry); // List DDX_Control(pDX, IDC_LIST_RESULTADOS, m_wndListR); // Botones (Sólo CAD) DDX_Control(pDX, IDC_BUTTON_RPunto, m_PickButton_RPunto); } LRESULT CPLEDERResutadosDlg::OnAcadKeepFocus (WPARAM, LPARAM) { return (TRUE); } BEGIN_MESSAGE_MAP(CPLEDERResutadosDlg, CAdUiDialog) ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus) // Botones incluidos cad ON_BN_CLICKED(IDC_BUTTON_RPunto, OnButtonRPunto) ON_BN_CLICKED(IDOK, &CPLEDERResutadosDlg::OnBnClickedOk) END_MESSAGE_MAP() BOOL CPLEDERResutadosDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Edit_Rx.SetWindowText(m_Rx); m_Edit_Ry.SetWindowText(m_Ry); m_PickButton_RPunto.AutoLoad(); // Insertando las grillas m_wndListR.SetHeadings(_T("ID, 50; Caudal(m3/s), 90; Tirante(m), 80; Cota Tirante(m), 100; Area Total(m2), 90; ALF(m2), 80; AMC(m2), 80; ARF(m2), 80; Perímetro(m), 100; Velocidad(m/s), 100; Nº Froude , 100; Espejo(m), 90; K , 80; Beta , 80; Hf (m/m), 80; hc,80 ")); for (int i = 0; i < 500; i++)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxvi
{ m_wndListR.InsertItem(0, _T(""), _T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T("")); } m_wndListR.SetGridLines(TRUE); //m_wndListR.SetCheckboxes(TRUE); // Borra todo los datos de la grilla. m_wndListR.DeleteAllItems(ItemdataProc, (LPARAM)this); double Kt, At, Pt, Vm, Fr; TCHAR strId[10], strQ[10], strh[10], strZs[10], strA[10], strALF[10], strAMC[10], strARF[10], strP[10], strPLF[10], strPMC[10], strPRF[10], strV[10], strF[10], strT[10], strK[10], strKLF[10], strKMC[10], strKRF[10], strBeta[10], strhf12[10], strhc12[10]; // Inserta los resultado en la grilla for (int i=0; i< m_Result_len; i++) { At = (m_pRHidraulicos + i)->ALF +(m_pRHidraulicos + i)->AMC + (m_pRHidraulicos + i)->ARF; Pt = (m_pRHidraulicos + i)->PLF +(m_pRHidraulicos + i)->PMC + (m_pRHidraulicos + i)->PRF; Kt = (m_pRHidraulicos + i)->KLF +(m_pRHidraulicos + i)->KMC + (m_pRHidraulicos + i)->KRF; // Cálculo de la velocidad media Vm = ((m_pRHidraulicos + i)->Q) / At; // Cálculo del Número de Froude Fr = Vm/ pow(g*(m_pRHidraulicos + i)->h , 0.5); acdbRToS((m_pRHidraulicos + i)->IdST , 2, 3, strId); acdbRToS((m_pRHidraulicos + i)->Q , 2, 3, strQ); acdbRToS((m_pRHidraulicos + i)->h , 2, 3, strh); acdbRToS((m_pRHidraulicos + i)->Zs , 2, 3, strZs); acdbRToS(At , 2, 3, strA); acdbRToS((m_pRHidraulicos + i)->ALF , 2, 3, strALF); acdbRToS((m_pRHidraulicos + i)->AMC , 2, 3, strAMC); acdbRToS((m_pRHidraulicos + i)->ARF , 2, 3, strARF); acdbRToS(Pt , 2, 3, strP); acdbRToS(Vm , 2, 3, strV); acdbRToS(Fr , 2, 3, strF); acdbRToS((m_pRHidraulicos + i)->TopW , 2, 3, strT); acdbRToS(Kt , 2, 3, strK); //acdbRToS((m_pRHidraulicos + i)->KLF , 2, 3, strKLF); //acdbRToS((m_pRHidraulicos + i)->KMC , 2, 3, strKMC);
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxvii
//acdbRToS((m_pRHidraulicos + i)->KRF , 2, 3, strKRF); acdbRToS((m_pRHidraulicos + i)->Beta , 2, 3, strBeta); acdbRToS((m_pRHidraulicos + i)->hf12 , 2, 5, strhf12); acdbRToS((m_pRHidraulicos + i)->hc12 , 2, 3, strhc12); m_wndListR.InsertItem( m_Result_len, strId, strQ, strh, strZs, strA, strALF, strAMC, strARF, strP, strV, strF, strT, strK, strBeta, strhf12, strhc12); } return TRUE; } void CPLEDERResutadosDlg::OnButtonRPunto() { //Clase que habilita CAD //AcAxDocLock docLock; CAcModuleResourceOverride resourceOverride; // Esconde el diálogo BeginEditorCommand(); ads_point p1; // Coge el Punto P1 if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla [Resultados PLEDER]"), p1) != RTNORM ) { acutPrintf(_T("\nError al ingresar el Punto")); // si no cancela el comando(incluyendo el diálogo) // CancelEditorCommand(); CompleteEditorCommand(); return; } CompleteEditorCommand(); m_Rx.Format(_T("%g"), p1[X] ); m_Edit_Rx.SetWindowText(m_Rx); m_Ry.Format(_T("%g"), p1[Y] ); m_Edit_Ry.SetWindowText(m_Ry); } BOOL CPLEDERResutadosDlg::ItemdataProc(DWORD dwData, LPARAM lParam) { // TODO: Process your item data here // Please return TRUE to proceed the deletion, return FALSE to abort. return TRUE; } void CPLEDERResutadosDlg::OnBnClickedOk() { // Coge los valores despues de pulsar OK
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxviii
// Cajas de texto m_Edit_Rx.GetWindowText(m_Rx); m_Edit_Ry.GetWindowText(m_Ry); CDialog::OnOK(); RecursosR.T_pRHidraulicos = m_pRHidraulicos;
//...............RESULTADOS TABLA..........................................
float PX, PY; PX =_wtof(m_Rx); PY =_wtof(m_Ry); ads_point p1; p1[X] = PX; p1[Y] = PY; p1[Z] = 0.0; //Clase que habilita CAD AcAxDocLock docLock; CString strTableStyle = _T("Standard"); strTableStyle.ReleaseBuffer(); CString strNameBlock = _T("RESULTADOS HIDRAULICOS"); strNameBlock.ReleaseBuffer(); // Para almacenar los datos de la tabla RowData *pRwData = new RowData(); if (Acad::eOk == RecursosR.GenerarTablaHidraulicodesdeBlock((TCHAR *)strNameBlock.GetBuffer(), pRwData, m_Result_len)) { // Crear la tabla AcDbTable *pTbl = NULL; // Notar que la primera, segunda columna contiene datos para los títulos y cabecera // Aquí usa la tercera fila para la correcta longitud de la columna. if(Acad::eOk == RecursosR.CrearTabla(pTbl,(TCHAR *)strTableStyle.GetBuffer(),pRwData->at(2)->length(),pRwData->length())) { // Habilitar la tabla con datos RecursosR.HabilitarTabla(pTbl, pRwData); // Agrega el Object Table hacia el Model Space del actual dibujo. if(Acad::eOk == RecursosR.AgregarEnDwg(acdbHostApplicationServices()->workingDatabase(),pTbl)) { // Unir las Celdas //mergeCellsForTitleAndHeader(pTbl,pBlkName); // Ajustar las columnas. RecursosR.AjustarAnchoColumna(pTbl,200); // 200 - valor arbitrario limite superior.
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxix
// Ajustar las filas. RecursosR.AjustarAlturaFila(pTbl,50); // 50 - valor arbitrario limite superior.
pTbl->setPosition(AcGePoint3d(p1[X], p1[Y], p1[Z])); // Cierra la tabla pTbl->close(); } //if else {
// Limpiar, si pTbl no es agregado al model space
delete pTbl; } } //if else { acutPrintf(_T("\nNo se pudo crear la tabla")); } } //if acedRestoreStatusBar(); } //-------------------------------------------------------------------- // Funciones extras para los resultados void CPLEDERResutadosDlg::FreeAllResultBufs() /*-------------------------------------------------------------------- Ingreso : theFirstResult = puntero al primer elemento del buffer. Salida : Vacío. Propósito : Llamar a esta función para liberar un buffer FGVResultadosBufer --------------------------------------------------------------------*/ { if (!m_theFirstR) return; FGVResultadosBufer *pResult = m_theFirstR; FGVResultadosBufer *pResulNext = NULL; // liberar la ristra while (pResulNext = pResult->pRnext) { delete pResult; pResult = pResulNext; } delete pResult; m_theFirstR = NULL; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxx
int CPLEDERResutadosDlg::AcquireLevelFreeSurface(long *numberL) /*-------------------------------------------------------------------- Ingreso : numberof = Puntero a Long para sobreescribir el Resultado Salida : numberof = Representa el número de Secciones Transversales que se encontraron. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Lee el conjunto de Secciones transversales definidas en el drawing. Llamar a esta función para obtener el puntero al buffer CrossSectionsBuf con la nube de S.T. El buffer quedará apuntado por el miembro m_theFirstST. Para desalojar el buffer se deberá llamar a la función FreeAllCrossSectionsBufs(). Las S.T. que se añadan al buffer no estarán ordenados por su número de orden. Se toman las S.T. en bruto. -------------------------------------------------------------------*/ { FreeAllResultBufs(); struct resbuf *filter; // resbufs // preparar el filtro para los niveles calculados filter = acutBuildList( RTDXF0, _T("PLEDERHydraulicResult"), 8, PLEDER_CAPA_NIVELES, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [AcquireLevelFreeSurface][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { //acutPrintf(_T("\nNo hay Niveles calculados en el drawing")); *numberL = 0; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [AcquireLevelFreeSurface][acedSSLength].")); return RTERROR; } CPLEDERHydraulicResult *pResult; ads_name ename; AcDbObjectId ID;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxi
long nL = 0; AcGePoint2d P1; // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Adquiriendo los niveles calculados: "), 0, (int)sslen); // tomar el nombre de la primera entidad if (acedSSName(ss, 0, ename) != RTNORM) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERHydraulicResult [AcquireLevelFreeSurface][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pResult, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } Adesk::Int32 nV; double IdST; // Id double h, // Tirante. Zs, // Cota Tirante. Beta, // Coeciente de corrección. ALF, // Area llanura Izquierda. AMC, // Area Canal central. ARF, // Area llanura derecha. PLF, // Perímetro llanura izquierdo. PMC, // Perímetro canal central. PRF, // Perímetro llanura derecho KLF, // Conductividad llanura izquierdo. KMC, // Conductividad canal central. KRF, // Conductividad llanura derecho Q, // Descarga del flujo. hf12, // Pérdida por fircción. hc12, // Pérdida local. TopW, // Espejo de agua LMC; // Longitud del canal central
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxii
// tomar las propiedades pResult->IdCrossSections(IdST); pResult->NumberVertex(nV); pResult->Depth(h); pResult->WaterElevation(Zs); pResult->BetaCoeficient(Beta); pResult->LeftArea(ALF); pResult->MainArea(AMC); pResult->RightArea(ARF); pResult->LeftPerimeter(PLF); pResult->MainPerimeter(PMC); pResult->RightPerimeter(PRF); pResult->LeftConveyance(KLF); pResult->MainConveyance(KMC); pResult->RightConveyance(KRF); pResult->WaterFlow(Q); pResult->FrictionLess(hf12); pResult->LocalLess(hc12); pResult->TopWidth(TopW); pResult->LengthMainChannel(LMC); AcGePoint2dArray vertexArray; AcGePoint2d vertex; //for(int i =0; i< pResult->m_nV; i++) for(int i =0; i< nV; i++) { vertex[X] = pResult->m_GVerts[i].x; vertex[Y] = pResult->m_GVerts[i].y; vertexArray.append(vertex); } pResult->close(); // crear el buffer y añade la primera sección transversal try { m_theFirstR = new FGVResultadosBufer(nV, vertexArray, IdST, h, Zs, Beta, ALF, AMC, ARF, PLF, PMC, PRF, KLF, KMC, KRF, Q, hf12, hc12, TopW, LMC); } catch(const std::bad_alloc&) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][m_theFirstNode].")); return RTERROR; } FGVResultadosBufer *nR, *nRprevious = m_theFirstR; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)nL++);
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxiii
vertexArray.removeAll(); // recorrer el ss for (int i = 1; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); FreeAllResultBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad PLEDERCrossSections [AcquireCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); FreeAllResultBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad PLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pResult, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); FreeAllResultBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto PLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } // tomar las propiedades pResult->IdCrossSections(IdST); pResult->NumberVertex(nV); pResult->Depth(h); pResult->WaterElevation(Zs); pResult->BetaCoeficient(Beta); pResult->LeftArea(ALF); pResult->MainArea(AMC); pResult->RightArea(ARF); pResult->LeftPerimeter(PLF); pResult->MainPerimeter(PMC); pResult->RightPerimeter(PRF); pResult->LeftConveyance(KLF); pResult->MainConveyance(KMC); pResult->RightConveyance(KRF); pResult->WaterFlow(Q); pResult->FrictionLess(hf12); pResult->LocalLess(hc12); pResult->TopWidth(TopW); pResult->LengthMainChannel(LMC);
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxiv
for(int i =0; i< nV; i++) { vertex[X] = pResult->m_GVerts[i].x; vertex[Y] = pResult->m_GVerts[i].y; vertexArray.append(vertex); } pResult->close(); // añadir las secciones transversales al buffer try { nR = new FGVResultadosBufer(nV, vertexArray, IdST, h, Zs, Beta, ALF, AMC, ARF, PLF, PMC, PRF, KLF, KMC, KRF, Q, hf12, hc12, TopW, LMC); } catch(const std::bad_alloc&) { acedSSFree(ss); FreeAllResultBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][nb].")); return RTERROR; } nRprevious->pRnext = nR; nRprevious = nR; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)nL++); vertexArray.removeAll(); } // for i acedSSFree(ss); acedRestoreStatusBar(); *numberL = nL; return RTNORM; } // Adquirir o tomar los niveles calculados int CPLEDERResutadosDlg::DeleteLevelFreeSurface(bool prompt) /*-------------------------------------------------------------------- Ingreso : prompt = si es verdadero solicita confimación. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Elimina los niveles calculados --------------------------------------------------------------------*/ { TCHAR result[131]; // si procede preguntar al usuario si desea eliminar los niveles if (prompt) {
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxv
acedInitGet(RSG_NONULL, _T("S N")); if (acedGetKword(_T("\n¿Seguro que desea eliminar los niveles S/N? : "), result) == RTCAN) return RTCAN; if ((result[0] == 'n') || (result[0] == 'N')) return RTCAN; } struct resbuf *filter; // resbufs // preparar el filtro para seleccionar los niveles filter = acutBuildList( RTDXF0, _T("PLEDERHydraulicResult"), 8, PLEDER_CAPA_NIVELES, 0); if (!filter) { acdbFail(_T("\nError al construir el filtro [DeleteLevelFreeSurface][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar los niveles definidos if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay niveles en el drawing acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [acedSSLength].")); return RTERROR; } CPLEDERHydraulicResult *pResult; ads_name ename; AcDbObjectId ID; long n, np, progress = 0; np = 100; // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Eliminando los niveles: "), 0, (int)np); // recorrer el ss
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxvi
for (int i = 0; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidas [acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad [acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pResult, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto [acdbOpenObject].")); return RTERROR; } pResult->close(); // borrar la entidad acdbEntDel(ename); // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)progress++); } // for i acedSetStatusBarProgressMeterPos((int)np); acedSSFree(ss); acedRestoreStatusBar(); return RTNORM; } PLEDERSeccionesTransversales.cpp #include "StdAfx.h" #include "PLEDERSeccionesTransversales.h" #include "PLEDERRecursosCad.h" #include "PLEDERHidraBuffer.h" CPLEDERSeccionesTransversales::CPLEDERSeccionesTransversales(void)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxvii
{ // inicializar la clase m_theFirstST = NULL; m_theFirstSOC = NULL; m_STTextHeight = 0.20; m_STDiameter = 0.20; } CPLEDERSeccionesTransversales::~CPLEDERSeccionesTransversales(void) { FreeAllCrossSectionsBufs(); FreeAllCrossSectionsSocavacionBufs(); } void CPLEDERSeccionesTransversales::FreeAllCrossSectionsBufs() /*-------------------------------------------------------------------- Ingreso : Vacío. Salida : Vacío. Propósito : Libera el buffer en ristra CrossSectionsBuf al que apunta el miembro m_theFirstST. Llamar a esta función para liberar el buffer con las S.T. obtenidas mediante una llamada a la función AcquireCrossSections(). -------------------------------------------------------------------*/ { if (!m_theFirstST) return; CrossSectionsBufer *nb = m_theFirstST; CrossSectionsBufer *nbnext = NULL; // liberar la ristra while (nbnext = nb->nbnext) { delete nb; nb = nbnext; } delete nb; m_theFirstST = NULL; } void CPLEDERSeccionesTransversales::FreeAllCrossSectionsSocavacionBufs() /*-------------------------------------------------------------------- Ingreso : Vacío. Salida : Vacío. Propósito : Libera el buffer en ristra CrossSectionsSocavacionBuf al que apunta el miembro m_theFirstSOC. Llamar a esta función para liberar el buffer con las S.T. obtenidas mediante una llamada a la función AcquireCrossSectionsSocavacion(). --------------------------------------------------------------------*/ { if (!m_theFirstSOC) return; CrossSectionsSocavacionBufer *nb = m_theFirstSOC; CrossSectionsSocavacionBufer *nbnext = NULL;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxviii
// liberar la ristra while (nbnext = nb->nbnext) { delete nb; nb = nbnext; } delete nb; m_theFirstSOC = NULL; } int CPLEDERSeccionesTransversales::AcquireCrossSections(long *numberof) /*-------------------------------------------------------------------- Ingreso : numberof = Puntero a Long para sobreescribir el resultado Salida : numberof = Representa el número de Secciones Transversales que se encontraron. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Lee el conjunto de Secciones transversales definidas en el drawing. Llamar a esta función para obtener el puntero al buffer CrossSectionsBuf con la nube de S.T. El buffer quedará apuntado por el miembro m_theFirstST. Para desalojar el buffer se deberá llamar a la función FreeAllCrossSectionsBufs(). Las S.T. que se añadan al buffer no estarán ordenados por su número de orden. Se toman las S.T. en bruto. -------------------------------------------------------------------*/ { FreeAllCrossSectionsBufs(); struct resbuf *filter; // resbufs // preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [AcquireCrossSections][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay Secciones Transv. en el drawing *numberof = 0; acutRelRb(filter); return RTNORM; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cclxxxix
acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [AcquireCrossSections][acedSSLength].")); return RTERROR; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; long nVST, np = 0; double IdST; AcGePoint2d P1; double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE, HminG, HminL; long BL, BR; // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Adquiriendo las secciones transverales: "), 0, (int)sslen); // tomar el nombre de la primera entidad if (acedSSName(ss, 0, ename) != RTNORM) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [AcquireCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } // tomar las propiedades pSecciones->ReferencePoint(P1); pSecciones->ReferenceX(X1); pSecciones->ReferenceY(Y1);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxc
pSecciones->MinVerticeGlobal(HminG); pSecciones->MinVerticeLocal(HminL); pSecciones->IdCrossSections(IdST); pSecciones->nVST(nVST); pSecciones->LengthLeft(LL); pSecciones->LengthCenter(LC); pSecciones->LengthRight(LR); pSecciones->ManningLeft(NL); pSecciones->ManningCenter(NC); pSecciones->ManningRight(NR); pSecciones->BankLeft(BL); pSecciones->BankRight(BR); pSecciones->CoeficentCont(CC); pSecciones->CoeficentExp(CE); AcGePoint2dArray vertexArray; AcGePoint2d vertex; for(int i =0; i<nVST; i++) { vertex[X] = pSecciones->pVerts[i].x; vertex[Y] = pSecciones->pVerts[i].y; vertexArray.append(vertex); } pSecciones->close(); // crear el buffer y añade la primera sección transversal try { m_theFirstST = new CrossSectionsBufer(P1, X1, Y1, IdST, nVST, vertexArray, HminG, HminL, LL, LC, LR, NL, NC, NR, BL, BR, CC, CE); } catch(const std::bad_alloc&) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][m_theFirstNode].")); return RTERROR; } CrossSectionsBufer *nb, *nbprevious = m_theFirstST; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); vertexArray.removeAll(); // recorrer el ss for (int i = 1; i < sslen; i++)
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxci
{ // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); FreeAllCrossSectionsBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad PLEDERCrossSections [AcquireCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); FreeAllCrossSectionsBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad PLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); FreeAllCrossSectionsBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto PLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } // tomar las propiedades pSecciones->ReferencePoint(P1); pSecciones->ReferenceX(X1); pSecciones->ReferenceY(Y1); pSecciones->MinVerticeGlobal(HminG); pSecciones->MinVerticeLocal(HminL); pSecciones->IdCrossSections(IdST); pSecciones->nVST(nVST); pSecciones->LengthLeft(LL); pSecciones->LengthCenter(LC); pSecciones->LengthRight(LR); pSecciones->ManningLeft(NL); pSecciones->ManningCenter(NC); pSecciones->ManningRight(NR); pSecciones->BankLeft(BL); pSecciones->BankRight(BR); pSecciones->CoeficentCont(CC); pSecciones->CoeficentExp(CE);
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcii
for(int j =0; j<nVST; j++) { vertex[X] = pSecciones->pVerts[j].x; vertex[Y] = pSecciones->pVerts[j].y; vertexArray.append(vertex); } pSecciones->close(); // añadir las secciones transversales al buffer try { nb = new CrossSectionsBufer(P1, X1, Y1, IdST, nVST, vertexArray, HminG, HminL, LL, LC, LR, NL, NC, NR, BL, BR, CC, CE); } catch(const std::bad_alloc&) { acedSSFree(ss); FreeAllCrossSectionsBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][nb].")); return RTERROR; } nbprevious->nbnext = nb; nbprevious = nb; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); vertexArray.removeAll(); } // for i acedSSFree(ss); acedRestoreStatusBar(); *numberof = np; return RTNORM; } int CPLEDERSeccionesTransversales::AcquireCrossSectionsSocavacion(long *numberof) /*-------------------------------------------------------------------- Ingreso : numberof = Puntero a Long para sobreescribir el resultado Salida : numberof = Representa el número de Secciones Transversales que se encontraron. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Lee el conjunto de Secciones transversales definidas en el drawing. Llamar a esta función para obtener el puntero al buffer CrossSectionsBuf con la nube de S.T. El buffer quedará apuntado por el miembro m_theFirstST. Para desalojar el buffer se deberá llamar a la función FreeAllCrossSectionsBufs(). Las S.T. que se añadan al buffer no estarán ordenados por su número de orden. Se toman las S.T. en bruto. -------------------------------------------------------------------*/ {
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxciii
FreeAllCrossSectionsSocavacionBufs(); struct resbuf *filter; // resbufs // preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [AcquireCrossSections][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay Secciones Transv. en el drawing *numberof = 0; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [AcquireCrossSections][acedSSLength].")); return RTERROR; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; long nVST, np = 0; double IdST; Adesk::Int32 Material, CoefProb; double CoefMaterial; // colocar una barra de progreso acedSetStatusBarProgressMeter(_T("Adquiriendo las secciones transverales: "), 0, (int)sslen); // tomar el nombre de la primera entidad if (acedSSName(ss, 0, ename) != RTNORM) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [AcquireCrossSections][acedSSName]."));
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxciv
return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } // tomar las propiedades pSecciones->IdCrossSections(IdST); pSecciones->TipoMaterial(Material); pSecciones->CoeficienteProb(CoefProb); pSecciones->CoeficienteMaterial(CoefMaterial); pSecciones->close(); // crear el buffer y añade la primera sección transversal try { m_theFirstSOC = new CrossSectionsSocavacionBufer(IdST, Material, CoefProb , CoefMaterial); } catch(const std::bad_alloc&) { acedSSFree(ss); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][m_theFirstNode].")); return RTERROR; } CrossSectionsSocavacionBufer *nb, *nbprevious = m_theFirstSOC; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); // recorrer el ss for (int i = 1; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); FreeAllCrossSectionsSocavacionBufs();
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcv
acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el nombre de la entidad PLEDERCrossSections [AcquireCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); FreeAllCrossSectionsSocavacionBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al tomar el ObjectId de la entidad PLEDERCrossSections [AcquireCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); FreeAllCrossSectionsSocavacionBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError al abrir el Objeto PLEDERCrossSections [AcquireCrossSections][acdbOpenObject].")); return RTERROR; } // tomar las propiedades pSecciones->IdCrossSections(IdST); pSecciones->TipoMaterial(Material); pSecciones->CoeficienteProb(CoefProb); pSecciones->CoeficienteMaterial(CoefMaterial); pSecciones->close(); // añadir las secciones transversales al buffer try { nb = new CrossSectionsSocavacionBufer(IdST, Material, CoefProb, CoefMaterial); } catch(const std::bad_alloc&) { acedSSFree(ss); FreeAllCrossSectionsSocavacionBufs(); acedRestoreStatusBar(); acdbFail(_T("\nError de asignación de memoria [AcquireCrossSections][nb].")); return RTERROR; } nbprevious->nbnext = nb; nbprevious = nb; // actualizar la barra de progreso acedSetStatusBarProgressMeterPos((int)np++); } // for i
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcvi
acedSSFree(ss); acedRestoreStatusBar(); *numberof = np; return RTNORM; } int CPLEDERSeccionesTransversales::GetFirstNumberCrossSections(long *nfirst) /*-------------------------------------------------------------------- Ingreso : nfirst = Puntero a Long para sobreescribir el resultado Salida : nfirst = número de orden de la primera S.T. Si no hay Secciones Transv. definidos tomará el valor de cero. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Busca el número de orden el último nombre de la S.T. en el Drawing. Nos podríamos basar en el buffer, pero para asegurar la búsqueda nos basaremos en el drawing, ya que el buffer puede no estar actualizado -------------------------------------------------------------------*/ { struct resbuf *filter; // resbufs // preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [GetFirstNumberCrossSections][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("X"), NULL, NULL, filter, ss)!= RTNORM) { acdbFail(_T("\nNo hay Secciones Transversales definifos en el drawinG")); *nfirst = 0; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [GetFirstNumberCrossSections][acedSSLength].")); return RTERROR;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcvii
} CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; long np = 0; double n; // tomar la última sección transversal if (GetLastNumberCrossSections(&np) != RTNORM) { acedSSFree(ss); return RTERROR; } // recorrer el ss for (int i = 0; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [GetFirstNumberCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [GetFirstNumberCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [GetFirstNumberCrossSections][acdbOpenObject].")); return RTERROR; } // tomar el número de orden pSecciones->IdCrossSections(n); pSecciones->close(); // chequearlo if (n > np) np = n; } // for i acedSSFree(ss); *nfirst = np;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcviii
return RTNORM; } int CPLEDERSeccionesTransversales::GetLastNumberCrossSections(long *nlast) /*-------------------------------------------------------------------- Ingreso : nlast= Puntero a Long para sobreescribir el resultado Salida : nlast= número de orden del último S.T. Si no hay Secciones Transv. definidos tomará el valor de cero. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Busca el número de orden el último nombre de la S.T. en el Drawing. -------------------------------------------------------------------*/ { struct resbuf *filter; // resbufs // preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [GetLastNumberCrossSections][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar los puntos definidos if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay Secciones Transversales definifos en el drawing *nlast = 0; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [GetLastNumberCrossSections][acedSSLength].")); return RTERROR; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; long np = 0; double n;
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccxcix
// recorrer el ss for (int i = 0; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [GetLastNumberCrossSections][acedSSName].")); return RTERROR; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [GetLastNumberCrossSections][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [GetLastNumberCrossSections][acdbOpenObject].")); return RTERROR; } // tomar el número de orden pSecciones->IdCrossSections(n); pSecciones->close(); // chequearlo if (n > np) np = n; } // for i acedSSFree(ss); *nlast = np; return RTNORM; } int CPLEDERSeccionesTransversales::GetNumberofCrossSections(long *numberof) /*-------------------------------------------------------------------- Ingreso : numberof = Puntero a Long para sobreescribir el resultado Salida : numberof = (Out) el número de secciones transversales que se encontraron. RTNORM si no se produce ningún error. RTERROR en otro caso.
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccc
Propósito : Contabiliza el número de Secciones Transversales en el Drawing. Nos podríamos basar en el buffer, pero para asegurar la búsqueda nos basaremos en el Drawing,ya que el buffer puede no estar actualizado. -------------------------------------------------------------------*/ { struct resbuf *filter; // resbufs
// preparar el filtro para seleccionar las secciones transversales.
filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [GetNumberofCrossSections][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidos if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay secciones transversales definifos en el drawing *numberof = 0; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [GetNumberofCrossSections][acedSSLength].")); return RTERROR; } acedSSFree(ss); *numberof = sslen; return RTNORM; } int CPLEDERSeccionesTransversales::GetCrossSectionsAttributes() /*-------------------------------------------------------------------- Ingreso : vacío Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Obtiene el valor del diámetro de los círculos y la altura del texto de las entidades Secciones transversales. Los valores son alojados en las variables miembro m_STDiameter y m_STTextHeight. -------------------------------------------------------------------*/
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccci
{ struct resbuf *filter; // resbufs // preparar el filtro para seleccionar las secciones transversales. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (filter == NULL) { acdbFail(_T("\nError al construir el filtro [GetCrossSectionsAttributes][acutBuildList].")); return RTERROR; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidos if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { // no hay secciones transversales definifos en el drawing m_STTextHeight = 0.2; m_STDiameter = 0.2; acutRelRb(filter); return RTNORM; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [GetCrossSectionsAttributes][acedSSLength].")); return RTERROR; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; // tomar el valor de los atributos de la primera S.T. // tomar el nombre de la entidad if (acedSSName(ss, 0, ename) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [GetCrossSectionsAttributes][acedSSName].")); return RTERROR; } acedSSFree(ss); // cambiar el nombre por el ObjectId
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccii
if (acdbGetObjectId(ID, ename) != Acad::eOk) { acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [GetCrossSectionsAttributes][acdbGetObjectId].")); return RTERROR; } // abrir el objeto para lectura if (acdbOpenObject(pSecciones, ID, AcDb::kForRead) != Acad::eOk) { acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [GetCrossSectionsAttributes][acdbOpenObject].")); return RTERROR; } // tomar el Diámetro if (pSecciones->diameter(m_STDiameter) != Acad::eOk) { pSecciones->close(); acdbFail(_T("\nError al tomar los atributos del nodo [GetCrossSectionsAttributes].")); return RTERROR; } // tomar la altura del texto if (pSecciones->textHeight(m_STTextHeight) != Acad::eOk) { pSecciones->close(); acdbFail(_T("\nError al tomar los atributos del nodo [GetCrossSectionsAttributes].")); return RTERROR; } pSecciones->close(); return RTNORM; } int CPLEDERSeccionesTransversales::ZoomCrossSections(double IdnST) /*-------------------------------------------------------------------- Ingreso : IdnST: Nombre o Id de la sección trasnversal Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Realiza un encuadre o zoom de la sección transversal solicitada. -------------------------------------------------------------------*/ { long numof; // Adquirir las secciones transverales if (AcquireCrossSections(&numof) != RTNORM) { acutPrintf(_T("\nERROR PLEDER: [AcquireCrossSections]")); return RTERROR; } if (!m_theFirstST) { acutPrintf(_T("\nERROR PLEDER: No hay secciones transversales definidos."));
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccciii
return RTERROR; } CrossSectionsBufer *nb; bool encontrado; encontrado = false; // Buscar la sección transversal for (nb = m_theFirstST; nb != NULL; nb = nb->nbnext) { if (nb->m_IdST == IdnST) { encontrado = true; break; } } if (!encontrado) { acutPrintf(_T("\nPLEDER ERROR: Sección transveral no encontrado.")); FreeAllCrossSectionsBufs(); return RTERROR; } // Encuadrar la seción transversal en una ventana +- 2 metros ads_point p1, p2; p1[X] = (nb->m_GlobalVertice[0].x - 5); p1[Y] = (nb->m_GlobalVertice[0].y + 2); p2[X] = (nb->m_GlobalVertice[nb->m_nVST-1].x + 5); p2[Y] = nb->m_HminG -2; // Punto mínimo. struct resbuf *rb; // Invocar el comando zoom window rb = acutBuildList ( RTSTR, _T("_zoom"), RTSTR, _T("_w"), RTPOINT, p1, RTPOINT, p2, 0); if (rb != NULL) { acedCmd(rb); acutRelRb(rb); } FreeAllCrossSectionsBufs(); return RTNORM; } int CPLEDERSeccionesTransversales::GetIdCrossSectionsAttributes(double IdST, long *nVST, AcGePoint2dArray& LvertexArray, AcGePoint2dArray& GvertexArray, double *LL, double *LC, double *LR,
Apendice B. HIDRAULICA CODIGO FUENTE C++
ccciv
double *NL,double *NC, double *NR, long *BL, long *BR, double *CC, double *CE) /*-------------------------------------------------------------------- Ingreso : IdnST: Nombre o Id de la sección transversal Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Recepciona los atributos de la sección transversal desde su ID --------------------------------------------------------------------*/ { long numof; // Adquirir las secciones transverales if (AcquireCrossSections(&numof) != RTNORM) { acutPrintf(_T("\nERROR PLEDER:[AcquireCrossSections]")); return RTERROR; } if (!m_theFirstST) { acutPrintf(_T("\nERROR PLEDER: No hay secciones transversales definidos.")); return RTERROR; } CrossSectionsBufer *nb; bool encontrado; encontrado = false; // Buscar la sección transversal for (nb = m_theFirstST; nb != NULL; nb = nb->nbnext) { if (nb->m_IdST == IdST) { encontrado = true; break; } } if (!encontrado) { acutPrintf(_T("\nPLEDER ERROR: Sección Transversal no encontrado.")); FreeAllCrossSectionsBufs(); return RTERROR; } // Guarda los atributos de la sección transversal de la posición encontrada (nb) *nVST = nb->m_nVST; *LL = nb->m_LL; *LC = nb->m_LC; *LR = nb->m_LR; *NL = nb->m_NL; *NC = nb->m_NC;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccv
*NR = nb->m_NR; *BL = nb->m_BL; *BR = nb->m_BR; *CC = nb->m_CC; *CE = nb->m_CE; AcGePoint2d vertex; // Guardar los vértices for(int i =0; i < *nVST; i++) { // Vértices globales vertex[X] = nb->m_GlobalVertice[i].x; vertex[Y] = nb->m_GlobalVertice[i].y; GvertexArray.append(vertex); // Vértices locales vertex[X] = nb->m_LocalVertice[i].x; vertex[Y] = nb->m_LocalVertice[i].y; LvertexArray.append(vertex); } FreeAllCrossSectionsBufs(); return RTNORM; } int CPLEDERSeccionesTransversales::GetIdCrossSectionsAttributesSocavacion(double IdST, int *Material, int *CoefProb, double *CoefMaterial) /*-------------------------------------------------------------------- Ingreso : IdnST: Nombre o Id de la sección transversal Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Recepciona los atributos de la sección transversal desde su ID -------------------------------------------------------------------*/ { long numof; // Adquirir las secciones transverales if (AcquireCrossSectionsSocavacion(&numof) != RTNORM) { acutPrintf(_T("\nERROR PLEDER:[AcquireCrossSectionsSocavacion]")); return RTERROR; } if (!m_theFirstSOC) { acutPrintf(_T("\nERROR PLEDER: No hay secciones transversales definidos.")); return RTERROR; } CrossSectionsSocavacionBufer *nb; bool encontrado = false;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccvi
// Buscar la sección transversal for (nb = m_theFirstSOC; nb != NULL; nb = nb->nbnext) { if (nb->m_IdST == IdST) { encontrado = true; break; } } if (!encontrado) { acutPrintf(_T("\nPLEDER ERROR: Sección Transversal no encontrado.")); FreeAllCrossSectionsSocavacionBufs(); return RTERROR; } // Guarda los atributos de la sección transversal de la posición encontrada (nb) *Material = nb->m_Material; *CoefProb = nb->m_CoefProb; *CoefMaterial = nb->m_CoefMaterial; FreeAllCrossSectionsSocavacionBufs(); return RTNORM; } int CPLEDERSeccionesTransversales::GetMinVertice(double *VerticeY, long nVert, double *Hmin) /*-------------------------------------------------------------------- Ingreso : VerticeY = Lista de Coordenadas de las S. T. Totales nVert = Lista de Números de los Vértices de las Secciones Transversales. Hmin = Lista de Los Vértices Mínimos de las S. T. Salida : RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Busca los Vértices Mínimos y Máximos de una lista. -------------------------------------------------------------------*/ { int j; float Mayor, Menor; Mayor = VerticeY[1]; Menor = VerticeY[1]; for (j = 1; j <= nVert; j++) { if ( Menor > VerticeY[j]) { Menor = VerticeY[j]; } if(Mayor < VerticeY[j]) { Mayor = VerticeY[j]; } *Hmin = Menor; // vértice mínimo. //Hmax = Mayor; //
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccvii
}//For j return RTNORM; } int CPLEDERSeccionesTransversales::GetAreaPerimeter(double CotaTirante, AcGePoint3dArray LvertexArray, long BL, long BR, double *ALF , double *AMC, double *ARF, double *PLF, double *PMC, double *PRF, double *A, double *P) /*-------------------------------------------------------------------- Ingreso : CotaTirante = Cota del tirante de la sección transversal. Dato importante para determinar el área y el perímetro de la S.T. LvertexArray = Vértices de la sección transversal (X, Y, Manning) Salida : Area = Área Transversal para un tirante que se ingresó (CotaTirante). Perímetro = Perímetro Transversal para un tirante que se ingresó (CotaTirante). K = Factor de transportabilidad.
Beta = Factor de correción. RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula el Área y el Perímetro de una sección transversal a partir de una cota tirante. --------------------------------------------------------------------*/ { int j,k; double Ai = 0.0, At = 0.0, Ad = 0.0, // Áreas : Izquierda, trapecios, y derecha. Pi = 0.0, Pt = 0.0, Pd = 0.0; // Perímetros : Izquierda, trapecios y derecha. *ALF= 0.0, *AMC= 0.0, *ARF= 0.0, // Areas: Left, Central y Right. *PLF= 0.0, *PMC= 0.0, *PRF= 0.0; // Perimentro: Left, Central y Right. AcGePoint3dArray Vertices; // Variable local para reasignar los vértices. AcGePoint3d Vertex; // Traslada los valores hacia la nueva lista YY , XX for (k = 0; k < LvertexArray.length(); k++) { Vertex[X] = LvertexArray[k].x; Vertex[Y] = LvertexArray[k].y; Vertex[Z] = LvertexArray[k].z; Vertices.append(Vertex); } bool InundIzquierdo = false; // Por defecto NO Existe Inundación bool InundDerecho = false; // Por defecto NO Existe Inundación
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccviii
// Inundación Margen Izquierda? if (CotaTirante > LvertexArray[0].y) { Vertices.removeAll(); Vertex[X] = LvertexArray[0].x; Vertex[Y] = CotaTirante; Vertex[Z] = LvertexArray[0].z; Vertices.append(Vertex); for (k =0; k < LvertexArray.length(); k++) { Vertex[X] = LvertexArray[k].x; Vertex[Y] = LvertexArray[k].y; Vertex[Z] = LvertexArray[k].z; Vertices.append(Vertex); } InundIzquierdo = true; } // Inundación Margen Derecha? if (CotaTirante > LvertexArray[LvertexArray.length()-1].y) { Vertex[X] = LvertexArray[LvertexArray.length()-1].x; Vertex[Y] = CotaTirante; Vertex[Z] = LvertexArray[LvertexArray.length()-1].z; Vertices.append(Vertex); InundDerecho = true; } // Inicio del recorrido de los vértices. for (j = 0; j < Vertices.length()-1; j++) { // Condición para calcular en el triángulo izquierdo if ((CotaTirante <= Vertices[j].y) && (CotaTirante >= Vertices[j+1].y)) { // Cálculo: Area del triángulo izquierdo Ai = Ai + pow((CotaTirante-Vertices[j+1].y),2)*(Vertices[j+1].x-Vertices[j].x)/(2.0*(Vertices[j].y-Vertices[j+1].y)); // Cálculo: Perímetro del triángulo izquierdo Pi = Pi + sqrt(pow((CotaTirante - Vertices[j+1].y),2)+ pow((CotaTirante-Vertices[j+1].y)*(Vertices[j+1].x-Vertices[j].x)/(Vertices[j].y-Vertices[j+1].y),2)); // Condiciones para las áreas y perímetros en los bancos y central if (j+1 < BL) { *ALF = *ALF + Ai + At + Ad; *PLF = *PLF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BL && j+1 < BR) {
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccix
*AMC = *AMC + Ai + At + Ad; *PMC = *PMC + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BR ) { *ARF = *ARF + Ai + At + Ad; *PRF = *PRF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } bool condicion = true; while (condicion) { j++; // Condición para calcular en los trapecios. if (Vertices[j+1].y <= CotaTirante) { // Cálculo: Area del trapecio At= At + ((2.0*CotaTirante - Vertices[j].y- Vertices[j+1].y)/2.0)*(Vertices[j+1].x-Vertices[j].x); // Cálculo: Perímetro del trapecio Pt = Pt + sqrt(pow((Vertices[j+1].x- Vertices[j].x),2) + pow((Vertices[j+1].y - Vertices[j].y),2)); // Condiciones para las áreas y perímetros en los bancos y central if (j+1 < BL) { *ALF = *ALF + Ai + At + Ad; *PLF = *PLF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BL && j+1 < BR) { *AMC = *AMC + Ai + At + Ad; *PMC = *PMC + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BR ) { *ARF = *ARF + Ai + At + Ad; *PRF = *PRF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } } // Condición para calcular en el triángulo derecho. if (Vertices[j+1].y >= CotaTirante) { // Cálculo: Area del triángulo derecho. Ad = Ad + pow((CotaTirante-Vertices[j].y),2)*(Vertices[j+1].x-Vertices[j].x)/(2.0*(Vertices[j+1].y-Vertices[j].y));
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccx
//acutPrintf(_T("\nValores de Area Derecha: %0.6f"), Ad); // Cálculo: Perímetro del triángulo derecho. Pd = Pd + sqrt(pow((CotaTirante - Vertices[j].y),2)+ pow((CotaTirante-Vertices[j].y)*(Vertices[j+1].x-Vertices[j].x)/(Vertices[j+1].y-Vertices[j].y),2)); // Condiciones para las áreas y perímetros en los bancos y central if (j+1 < BL) { *ALF = *ALF + Ai + At + Ad; *PLF = *PLF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BL && j+1 < BR) { *AMC = *AMC + Ai + At + Ad; *PMC = *PMC + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } if (j+1 >= BR ) { *ARF = *ARF + Ai + At + Ad; *PRF = *PRF + Pi + Pt + Pd; Ai = 0.0; At = 0.0; Ad = 0.0; Pi = 0.0; Pt = 0.0; Pd = 0.0; } } if (Vertices[j+1].y < CotaTirante) { condicion = true; } else { condicion = false; } }//While } //if }//For j // Area y perímetro total (A,P) *A = *ALF + *AMC + *ARF; *P = *PLF + *PMC + *PRF; return RTNORM; } int CPLEDERSeccionesTransversales::GetAreaPoligon(AcGePoint2dArray VPoligon, double *Area) /*-------------------------------------------------------------------- Ingreso : VPoligon = Vértices de un poligono Salida : Area = Área Transversal de un polígono RTNORM si no se produce ningún error. RTERROR en otro caso. Propósito : Calcula el Área de un polígono --------------------------------------------------------------------*/
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxi
{ *Area = 0.0; long N = VPoligon.length(); for(int i = 0; i < N -1; i++) { *Area = *Area + VPoligon[i].x * VPoligon[i+1].y - VPoligon[i].y * VPoligon[i+1].x; } *Area = 0.5* (*Area + VPoligon[N-1].x * VPoligon[0].y - VPoligon[N-1].y * VPoligon[0].x); acutPrintf(_T("\n El area es= %0.3f "), *Area); return RTNORM; } PLEDERSeccionesTransversalesDlg.cpp // PLEDERSeccionesTransversalesDlg.cpp: archivo de implementación // #include "stdafx.h" #include "PLEDERSeccionesTransversales.h" #include "PLEDERSeccionesTransversalesDlg.h" #include "PLEDERHidraBuffer.h" #include "PLEDERRecursosCad.h" #include "PLEDERHidraSecTrasnv.h" //Objetos PLEDER CRecursosCad RecursosST; CPLEDERSeccionesTransversales CS; HidraSecTrasnv GeometriaST; // Cuadro de diálogo de CPLEDERSeccionesTransversalesDlg IMPLEMENT_DYNAMIC(CPLEDERSeccionesTransversalesDlg, CAdUiDialog) CPLEDERSeccionesTransversalesDlg::CPLEDERSeccionesTransversalesDlg(CWnd* pParent /*=NULL*/) : CAdUiDialog(CPLEDERSeccionesTransversalesDlg::IDD, pParent) { m_bFullRow = TRUE; m_bGridLines = TRUE; m_bCheckboxes = TRUE; m_LI = _T("20.00"); m_LC = _T("20.00"); m_LD = _T("20.00"); m_BI = _T("1"); m_BD = _T(""); m_NI = _T("0.025"); m_NC = _T("0.017"); m_ND = _T("0.025");
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxii
m_CC = _T("0.1"); m_CE = _T("0.3"); m_Material = 1; // Tipo de material, Cohesivo = 0, No Cohesivo = 1. m_CoefProb = 6; // Coeficiente de probabilidad de gasto. (Ubicación) m_CoefMaterial = 0.0; // Peso específico ó diámetro medio del material de fondo. } CPLEDERSeccionesTransversalesDlg::~CPLEDERSeccionesTransversalesDlg() { } void CPLEDERSeccionesTransversalesDlg::DoDataExchange(CDataExchange* pDX) { CAdUiDialog::DoDataExchange(pDX); // List DDX_Control(pDX, IDC_LIST1, m_wndList); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_LI, m_Edit_LI); DDX_Control(pDX, IDC_EDIT_LC, m_Edit_LC); DDX_Control(pDX, IDC_EDIT_LD, m_Edit_LD); DDX_Control(pDX, IDC_EDIT_BI, m_Edit_BI); DDX_Control(pDX, IDC_EDIT_BD, m_Edit_BD); DDX_Control(pDX, IDC_EDIT_NI, m_Edit_NI); DDX_Control(pDX, IDC_EDIT_NC, m_Edit_NC); DDX_Control(pDX, IDC_EDIT_ND, m_Edit_ND); DDX_Control(pDX, IDC_EDIT_CC, m_Edit_CC); DDX_Control(pDX, IDC_EDIT_CE, m_Edit_CE); //ComboBox. DDX_Control(pDX, IDC_COMBO_ST, m_Combo_ST); // Botones (CAD) DDX_Control(pDX, IDC_BUTTON_ST, m_PickButton_ST); DDX_Control(pDX, IDC_BUTTON_LI, m_PickButton_LI); DDX_Control(pDX, IDC_BUTTON_LC, m_PickButton_LC); DDX_Control(pDX, IDC_BUTTON_LD, m_PickButton_LD); DDX_Control(pDX, IDC_BUTTON_BI, m_PickButton_BI); DDX_Control(pDX, IDC_BUTTON_BD, m_PickButton_BD); // Botones Menú //DDX_Control(pDX, IDR_MENU_ST, OnCommandSTN); } BEGIN_MESSAGE_MAP(CPLEDERSeccionesTransversalesDlg, CAdUiDialog) ON_EN_KILLFOCUS(IDC_EDIT_BI, OnKillfocusEdit_BI) ON_EN_KILLFOCUS(IDC_EDIT_BD, OnKillfocusEdit_BD)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxiii
ON_EN_KILLFOCUS(IDC_EDIT_CC, OnKillfocusEdit_CC) ON_EN_KILLFOCUS(IDC_EDIT_CE, OnKillfocusEdit_CE) // Combo Box ON_CBN_SELCHANGE(IDC_COMBO_ST, OnKillfocusComboST) // Botones incluidos cad ON_BN_CLICKED(IDC_BUTTON_ST, OnButtonST) ON_BN_CLICKED(IDC_BUTTON_LI, OnButtonLI) ON_BN_CLICKED(IDC_BUTTON_LC, OnButtonLC) ON_BN_CLICKED(IDC_BUTTON_LD, OnButtonLD) ON_BN_CLICKED(IDC_BUTTON_BI, OnButtonBI) ON_BN_CLICKED(IDC_BUTTON_BD, OnButtonBD) // Botones ON_BN_CLICKED(IDC_BUTTON_APLICAR, OnCommandAPLICAR) // Botones, incluido del menú ON_COMMAND(ID_ST_NUEVO, OnCommandSTN) //ON_BN_CLICKED(IDOK, &CPLEDERLluviaEscorrentiaDlg::OnBnClickedOk) END_MESSAGE_MAP() // Controladores de mensajes de CPLEDERSeccionesTransversalesDlg BOOL CPLEDERSeccionesTransversalesDlg::OnInitDialog() { CDialog::OnInitDialog(); // Insertando las grillas m_wndList.SetHeadings(_T("Nº, 30; Estación, 80; Elevación, 80")); for (int i = 0; i < 500; i++) { m_wndList.InsertItem(0, _T(""), _T(""),_T("")); } m_wndList.SetGridLines(TRUE); //m_wndList.SetCheckboxes(TRUE); // Inicializa Cajas de texto m_Edit_LI.SetWindowText(m_LI); m_Edit_LC.SetWindowText(m_LC); m_Edit_LD.SetWindowText(m_LD); m_Edit_BI.SetWindowText(m_BI); m_Edit_BI.SetRange(1, MAX_VERTICES); m_Edit_BD.SetWindowText(m_BD); m_Edit_BD.SetRange(1, MAX_VERTICES); m_Edit_NI.SetWindowText(m_NI); m_Edit_NC.SetWindowText(m_NC); m_Edit_ND.SetWindowText(m_ND); m_Edit_CC.SetWindowText(m_CC); m_Edit_CC.SetRange(0, 1);
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxiv
m_Edit_CE.SetWindowText(m_CE); m_Edit_CE.SetRange(0, 1); // Inicializa Bombo box //m_Combo_ST.SetCurSel(0); // Inicializa el boton tipo Cad m_PickButton_ST.AutoLoad(); m_PickButton_LI.AutoLoad(); m_PickButton_LC.AutoLoad(); m_PickButton_LD.AutoLoad(); m_PickButton_BI.AutoLoad(); m_PickButton_BD.AutoLoad(); if (!m_pSections) { // Sin secciones transversales return TRUE; } long i; CString str_IdST; // Cargar los valores a la ventana for (i = 0; i < m_Sections_len; i++) { // Preparar las cadenas acdbRToS((m_pSections + i)->IdST, 2, 2, str_IdST.GetBuffer(80)); // Insertar el Id de la S.T. al combo de la ventana m_Combo_ST.AddString(str_IdST); m_Combo_ST.SetCurSel(i); } // Verificar si existe S.T. en el Drawing if (m_Sections_len <= 0) { acutPrintf(_T("\nNo Existen Secciones Transversales definidos.")); return TRUE; } // Llama a los atributos de la S.T. OnKillfocusComboST(); return TRUE; } void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_BI() { m_Edit_BI.Convert(); if (!m_Edit_BI.Validate()) { ::AfxMessageBox(_T("Entrada no válida, Fuera de rango")); m_Edit_BI.SetFocus(); m_Edit_BI.SetSel(0, -1); }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxv
CString str; m_Edit_BI.GetWindowText(m_BI); acdbRToS(::_wtof(m_BI), 2, 0, str.GetBuffer(80)); m_Edit_BI.SetWindowText(str); } void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_BD() { m_Edit_BD.Convert(); if (!m_Edit_BD.Validate()) { ::AfxMessageBox(_T("Entrada no válida, Fuera de rango")); m_Edit_BD.SetFocus(); m_Edit_BD.SetSel(0, -1); } CString str; m_Edit_BD.GetWindowText(m_BD); acdbRToS(::_wtof(m_BD), 2, 0, str.GetBuffer(80)); m_Edit_BD.SetWindowText(str); } void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_CC() { m_Edit_CC.Convert(); if (!m_Edit_CC.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 0 @ 1")); m_Edit_CC.SetFocus(); m_Edit_CC.SetSel(0, -1); } CString str; m_Edit_CC.GetWindowText(m_CC); acdbRToS(::_wtof(m_CC), 2, 2, str.GetBuffer(80)); m_Edit_CC.SetWindowText(str); } void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_CE() { m_Edit_CE.Convert(); if (!m_Edit_CE.Validate()) { ::AfxMessageBox(_T("Entrada no válida, rango = 0 @ 1")); m_Edit_CE.SetFocus(); m_Edit_CE.SetSel(0, -1); } CString str; m_Edit_CE.GetWindowText(m_CE); acdbRToS(::_wtof(m_CE), 2, 2, str.GetBuffer(80)); m_Edit_CE.SetWindowText(str); } void CPLEDERSeccionesTransversalesDlg::OnKillfocusComboST() { double Id_ST; // Obtener el valor del combo seleccionado int nIndex = m_Combo_ST.GetCurSel(); m_Combo_ST.GetLBText(nIndex,m_Id_ST); Id_ST = _wtof(m_Id_ST); double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE; long BL, BR, nVST;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxvi
AcGePoint2dArray GlobalVertices; AcGePoint2dArray LocalVertices; // Coger los atributos de la S.T. desde su id CS.GetIdCrossSectionsAttributes(Id_ST, &nVST, LocalVertices, GlobalVertices, &LL, &LC, &LR, &NL, &NC, &NR, &BL, &BR, &CC, &CE); // Borra todo los datos de la grilla. m_wndList.DeleteAllItems(ItemdataProc, (LPARAM)this); TCHAR strN[100]; TCHAR strX[100]; TCHAR strY[100]; // Inserta los valores de los vértices en la grilla for (int i=0; i< nVST; i++) { acdbRToS(i+1 , 2, 0, strN); acdbRToS(LocalVertices[i].x , 2, 3, strX); acdbRToS(LocalVertices[i].y , 2, 3, strY); m_wndList.InsertItem(nVST, strN, strX, strY); } // Inserta los valores de la S.T. en la ventana m_LI.Format(_T("%g"), LL ); m_Edit_LI.SetWindowText(m_LI); m_LC.Format(_T("%g"), LC ); m_Edit_LC.SetWindowText(m_LC); m_LD.Format(_T("%g"), LR ); m_Edit_LD.SetWindowText(m_LD); m_NI.Format(_T("%g"), NL ); m_Edit_NI.SetWindowText(m_NI); m_NC.Format(_T("%g"), NC ); m_Edit_NC.SetWindowText(m_NC); m_ND.Format(_T("%g"), NR ); m_Edit_ND.SetWindowText(m_ND); m_BI.Format(_T("%d"), BL ); m_Edit_BI.SetWindowText(m_BI); m_BD.Format(_T("%d"), BR ); m_Edit_BD.SetWindowText(m_BD); m_CC.Format(_T("%g"), CC ); m_Edit_CC.SetWindowText(m_CC); m_CE.Format(_T("%g"), CE ); m_Edit_CE.SetWindowText(m_CE); // Realizar un Zoom a la sección transversal CS.ZoomCrossSections(Id_ST); } void CPLEDERSeccionesTransversalesDlg::OnButtonST() { if(m_Combo_ST.GetCount() == 0) { ::AfxMessageBox(_T("PLEDER ERROR: \n Ingresar Una Nueva sección")); return; } //Esconde el diálogo BeginEditorCommand(); // Coge el valor del combo para asignar el nombre de la S.T. int nIndex = m_Combo_ST.GetCurSel(); m_Combo_ST.GetLBText(nIndex,m_Id_ST); m_IdST = _wtof(m_Id_ST);
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxvii
// Coge los atributos de los textos de la ventana. double LI, // Longitud izquierdo. LC, // Longitud central. LD, // Longitud derecho. NI, // Coeficiente de manning Banco izquierdo. NC, // Coeficiente de manning canal central. ND, // Coeficiente de manning Banco derecho CC, // Coeficiente de contracción. CE; // Coeficiente de expansión. Adesk::Int32 BI, // Límite banco izquierdo. BD; // límite banco derecho. m_Edit_LI.GetWindowTextW(m_LI); LI = _wtof(m_LI); m_Edit_LD.GetWindowTextW(m_LD); LD = _wtof(m_LD); m_Edit_LC.GetWindowTextW(m_LC); LC = _wtof(m_LC); m_Edit_NI.GetWindowTextW(m_NI); NI = _wtof(m_NI); m_Edit_NC.GetWindowTextW(m_NC); NC = _wtof(m_NC); m_Edit_ND.GetWindowTextW(m_ND); ND = _wtof(m_ND); m_Edit_CC.GetWindowTextW(m_CC); CC = _wtof(m_CC); m_Edit_CE.GetWindowTextW(m_CE); CE = _wtof(m_CE); m_Edit_BI.GetWindowTextW(m_BI); BI = _wtof(m_BI); m_Edit_BD.GetWindowTextW(m_BD); BD = _wtof(m_BD); ads_point punto, p1; ads_name nombrep; int retval, valor1, valor2; double X1, Y1, area, elevacion; double Diametro = 0.2; double AlturaTexto = 0.2; //Inicializa las variables de sistema. RecursosST.InicializarVariables(); // crear las capas del proyecto if (RecursosST.PlederCapas() != RTNORM) { RecursosST.RestaurarVariables(); CompleteEditorCommand(); return; } // Selecciona la polilinea if (acedEntSel(_T("\nSeleccionar Polilinea: "), nombrep, punto) != RTNORM) { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al seleccionar la Polilinea"));
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxviii
CompleteEditorCommand(); return; } // Llama al punto de referencia en la seccion transversal if (acedGetPoint (NULL, _T("\nIngrese un Punto de Referencia"), p1) != RTNORM ) { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto")); CompleteEditorCommand(); return; } acedInitGet (RSG_NONULL | RSG_NOZERO, _T("")); // Ingreso del valor Distancia X valor1 = acedGetReal( _T("\nDistancia X: " ), &X1); switch (valor1) { case RTCAN: //Pulsó ESC { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto X")); CompleteEditorCommand(); return; } case RTNONE: //Pulsó solamente ENTER { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto X")); CompleteEditorCommand(); return; } case RTKWORD: //Ingresó un texto { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto X")); CompleteEditorCommand(); return; } case RTNORM: //Pulsó valor correcto break; default: return; }//switch (valor1) // Ingreso del valor Cota Y valor2 = acedGetReal(_T("\nCota Y: " ), &Y1); switch (valor2) { case RTCAN: //Pulsó ESC { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto Y")); CompleteEditorCommand(); return; } case RTNONE: //Pulsó solamente ENTER {
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxix
RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto Y")); CompleteEditorCommand(); return; } case RTKWORD: //Ingresó un texto { RecursosST.RestaurarVariables(); acutPrintf(_T("\nError al ingresar el Punto Y")); CompleteEditorCommand(); return; } case RTNORM: //Pulsó valor correcto break; default: return; } //switch (valor2) long nVST = 0; if ( GeometriaST.NumeroVerticesPolilinea(nombrep, &nVST) != RTNORM) { acdbFail(_T("\nError [NumeroVerticesPolilinea()]")); CompleteEditorCommand(); return; } // Inserta a la caja texto en la valor de nVST m_BD.Format(_T("%d"), nVST ); m_Edit_BD.SetWindowText(m_BD); BD = nVST; double *CX= new double[nVST+1]; // Lista de Coordenadas X (Estación) double *CY= new double[nVST+1]; // Lista de Coordenadas Y (Elevación) if ( GeometriaST.LeerVerticesPolilinea(nombrep, CX, CY) != RTNORM) { acdbFail(_T("\nError [NumeroVerticesPolilinea()]")); CompleteEditorCommand(); return; } double HminG = 0, HminL; // Vértice mínimo global if (CS.GetMinVertice(CY, nVST, &HminG)!= RTNORM) { acdbFail(_T("\nError [GetMinVertice]")); CompleteEditorCommand(); return; } // Vértice mínimo local HminL = Y1-(p1[Y] - HminG); // Crea la entidad personalizada PLEDERCrossSections desde ObjectDBX
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxx
CPLEDERCrossSections *pPolilinea; // crear la nueva entidad try { pPolilinea = new CPLEDERCrossSections(p1, X1, Y1, m_IdST, nVST, CX, CY, HminG, HminL, Diametro, AlturaTexto, LI, LC, LD, NI, NC, ND, BI, BD, CC, CE, m_Material, m_CoefProb, m_CoefMaterial); } catch(const std::bad_alloc&) { acdbFail(_T("\nError de asignación de memoria [pPolilinea].")); return ; } AcDbObjectId ID; // añadirla a la base de datos de AutoCAD if (RecursosST.AñadirEntidadBlockTableRecord((AcDbEntity*)pPolilinea, ID) != Acad::eOk) { if (pPolilinea) { delete pPolilinea; } acdbFail(_T("\nError al añadir la entidad a la Base de Datos [AñadirEntidadBlockTableRecord].")); return ; } //Alimenta los datos a la grilla. TCHAR strN[100]; TCHAR strX[100]; TCHAR strY[100]; // Borra todo los datos de la grilla. m_wndList.DeleteAllItems(ItemdataProc, (LPARAM)this); ads_point v1; for (int i = 1; i<= nVST; i++) { v1[X]= X1 + (CX[i] - p1[X]); // Suma la posición inicial X + la distancia X v1[Y]= Y1 - (p1[Y] - CY[i]); // Resta la posición inicial Y - la distancia Y acdbRToS(i , 2, 0, strN); acdbRToS(v1[X], 2, 3, strX); acdbRToS(v1[Y], 2, 3, strY); m_wndList.InsertItem(nVST, strN,strX,strY); X1= v1[X]; Y1= v1[Y]; p1[X]= CX[i]; p1[Y]= CY[i]; }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxi
RecursosST.RestaurarVariables(); //Restaura las variables de sistema //Retorna al diálogo CompleteEditorCommand(); delete [] CX; delete [] CY; } void CPLEDERSeccionesTransversalesDlg::OnButtonLI() { double L = OnButtonDistancia(); m_LI.Format(_T("%g"), L ); m_Edit_LI.SetWindowText(m_LI); } void CPLEDERSeccionesTransversalesDlg::OnButtonLC() { double L = OnButtonDistancia(); m_LC.Format(_T("%g"), L ); m_Edit_LC.SetWindowText(m_LC); } void CPLEDERSeccionesTransversalesDlg::OnButtonLD() { double L = OnButtonDistancia(); m_LD.Format(_T("%g"), L ); m_Edit_LD.SetWindowText(m_LD); } void CPLEDERSeccionesTransversalesDlg::OnButtonBI() { double Id_ST; // Obtener el valor del combo seleccionado int nIndex = m_Combo_ST.GetCurSel(); m_Combo_ST.GetLBText(nIndex,m_Id_ST); Id_ST = _wtof(m_Id_ST); double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE; long BL, BR; AcGePoint2dArray GlobalVertices; AcGePoint2dArray LocalVertices; long nVST; // Coger los atributos de la S.T. desde su id CS.GetIdCrossSectionsAttributes(Id_ST, &nVST, LocalVertices, GlobalVertices, &LL, &LC, &LR, &NL, &NC, &NR, &BL, &BR, &CC, &CE); //Esconde el diálogo BeginEditorCommand(); int nV; acedInitGet(RSG_NONULL, NULL); // Solicitar el número de Vértice
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxii
if (acedGetInt(_T("\nVértice del banco izquierdo: "), &nV) != RTNORM) { CompleteEditorCommand(); return; } // No se permite nV = 0 if (nV <= 0) { ::AfxMessageBox(_T("\nEntrada no válida.")); CompleteEditorCommand(); return; } // Verifica si esta dentro del rango de vértices if (nV > nVST) { ::AfxMessageBox(_T("\nEntrada no válida. \nFuera de rango")); CompleteEditorCommand(); return; } // Si todo es correcto CompleteEditorCommand(); m_BI.Format(_T("%d"), nV ); m_Edit_BI.SetWindowText(m_BI); } void CPLEDERSeccionesTransversalesDlg::OnButtonBD() { double Id_ST; // Obtener el valor del combo seleccionado int nIndex = m_Combo_ST.GetCurSel(); m_Combo_ST.GetLBText(nIndex,m_Id_ST); Id_ST = _wtof(m_Id_ST); double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE; long BL, BR; AcGePoint2dArray GlobalVertices; AcGePoint2dArray LocalVertices; long nVST; // Coger los atributos de la S.T. desde su id CS.GetIdCrossSectionsAttributes(Id_ST, &nVST, LocalVertices, GlobalVertices, &LL, &LC, &LR, &NL, &NC, &NR, &BL, &BR, &CC, &CE); //Esconde el diálogo BeginEditorCommand(); int nVD; acedInitGet(RSG_NONULL, NULL); // Solicitar el número de Vértice if (acedGetInt(_T("\nVértice del banco derecho: "), &nVD) != RTNORM)
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxiii
{ CompleteEditorCommand(); return; } // No se permite nVD = 0 if (nVD <= 0) { ::AfxMessageBox(_T("\nEntrada no válida.")); CompleteEditorCommand(); return; } // Verifica si está dentro del rango de vértices if (nVD > nVST) { ::AfxMessageBox(_T("\nEntrada no válida. \nFuera de rango")); CompleteEditorCommand(); return; } // Verifica si el nV (derecho) > nV (izquierdo) m_Edit_BI.GetWindowText(m_BI); if( _wtof(m_BI) >= nVD) { ::AfxMessageBox(_T("\nEntrada no válida. \nNº de vértice Izq. > Nº de vértice Der.)")); CompleteEditorCommand(); return; } // Si todo es correcto CompleteEditorCommand(); m_BD.Format(_T("%d"), nVD ); m_Edit_BD.SetWindowText(m_BD); } // Nueva Sección Transversal void CPLEDERSeccionesTransversalesDlg::OnCommandSTN() { //Declaracion de Objetos diálogos CPLEDERST1Dlg dlgSTN(CWnd::FromHandle(adsw_acadMainWnd())); if (dlgSTN.DoModal() != IDOK) { acutPrintf(_T("\nPLEDER: Se Canceló la Operación")); return; } double IdST, iST; IdST = _wtof(dlgSTN.m_NST); for(int i = 0; i < m_Combo_ST.GetCount(); i++) { m_Combo_ST.GetLBText(i,m_Id_ST); iST = _wtof(m_Id_ST); // Verifica si hay duplicidad
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxiv
if (IdST == iST) { ::AfxMessageBox(_T("PLEDER ERROR: \nNo se permite duplicar")); acutPrintf(_T("\nNo se permite duplicar")); return; } } m_Combo_ST.AddString(dlgSTN.m_NST); int pos = 0; // Buscar la posicion para la seleción actual for(int i = 0; i < m_Combo_ST.GetCount(); i++) { m_Combo_ST.GetLBText(i,m_Id_ST); iST = _wtof(m_Id_ST); if (IdST == iST) { break;} pos++; } m_Combo_ST.SetCurSel(pos); // Borra todo los datos de la grilla. m_wndList.DeleteAllItems(ItemdataProc, (LPARAM)this); } double CPLEDERSeccionesTransversalesDlg::OnButtonDistancia() /*-------------------------------------------------------------------- Ingreso : Vacío. Salida : Vacío Propósito : Calcula la distancia entre varios puntos --------------------------------------------------------------------*/ { //Esconde el diálogo BeginEditorCommand(); ads_point p1, p2; int contador =0; double L=0.0 , ls=0.0; //Coge el Primer Punto P1 if (acedGetPoint (NULL, _T("\nIngrese el primer Punto [cota menor]"), p1) != RTNORM ) { acutPrintf(_T("\nPLEDER: !ERROR!\nal ingresar el Punto")); CompleteEditorCommand(); return RTERROR; } while (true) { // Cogen los puntos siguienes if (acedGetPoint(p1, _T("\nSiguiente punto: "), p2) != RTNORM) { CompleteEditorCommand(); return L; } contador++; // siguiente ls = acutDistance(p1,p2); L = L + ls;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxv
acutPrintf(_T("\nDistancia %d: %0.3f"), contador, ls); p1[X]=p2[X]; p1[Y]=p2[Y]; p1[Z]=0.0; }//while return RTNORM; } void CPLEDERSeccionesTransversalesDlg::OnCommandAPLICAR() { // Coge los atributos de los textos de la ventana. Double LL, // Longitud izquierdo. LC, // Longitud central. LR, // Longitud derecho. NL, // Coeficiente de manning Banco izquierdo. NC, // Coeficiente de manning canal central. NR, // Coeficiente de manning Banco derecho CC, // Coeficiente de contracción. CE; // Coeficiente de expansión. Adesk::Int32 BL, // Límite banco izquierdo. BR; // Límite banco derecho. double IdST; // Id Seccion Transversal // Obtener los valores de las cajas de texto m_Edit_LI.GetWindowTextW(m_LI); LL = _wtof(m_LI); m_Edit_LC.GetWindowTextW(m_LC); LC = _wtof(m_LC); m_Edit_LD.GetWindowTextW(m_LD); LR = _wtof(m_LD); m_Edit_NI.GetWindowTextW(m_NI); NL = _wtof(m_NI); m_Edit_NC.GetWindowTextW(m_NC); NC = _wtof(m_NC); m_Edit_ND.GetWindowTextW(m_ND); NR = _wtof(m_ND); m_Edit_CC.GetWindowTextW(m_CC); CC = _wtof(m_CC); m_Edit_CE.GetWindowTextW(m_CE); CE = _wtof(m_CE); m_Edit_BI.GetWindowTextW(m_BI); BL = _wtof(m_BI); m_Edit_BD.GetWindowTextW(m_BD); BR = _wtof(m_BD); if(BL >= BR) { ::AfxMessageBox(_T("PLEDER ERROR: \nVértices del banco izquierdo >= al derecho")); //acutPrintf(_T("\n....La Aplicación de datos no fue exitosa....")); return; } // Obtener el valor del combo seleccionado int nIndex = m_Combo_ST.GetCurSel(); m_Combo_ST.GetLBText(nIndex,m_Id_ST); IdST = _wtof(m_Id_ST); struct resbuf *filter; // resbufs // Preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (!filter) {
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxvi
acdbFail(_T("\nError al construir el filtro [acutBuildList].")); return ; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { acutPrintf(_T("\nNo hay secciones transversales definidas en el drawing")); acutRelRb(filter); return; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [acedSSLength].")); return; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID; // recorrer el ss for (int i = 0; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [acedSSName].")); return; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [acdbGetObjectId].")); return; } // abrir el objeto para escritura if (acdbOpenObject(pSecciones, ID, /*AcDb::kForRead*/ AcDb::kForWrite) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [acdbOpenObject].")); return ;
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxvii
} // chequear el tipo de objeto if (pSecciones->isKindOf(CPLEDERCrossSections::desc()) != Adesk::kTrue) { pSecciones->close(); acedSSFree(ss); acdbFail(_T("\nError Objeto CPLEDERCrossSections ")); return; } double Id_Seccion; // Tomar el ID para comparar pSecciones->IdCrossSections(Id_Seccion); // Si procede, actualizar los datos de la S.T. if (Id_Seccion == IdST) { pSecciones->SetLengthLeft(LL); pSecciones->SetLengthCenter(LC); pSecciones->SetLengthRight(LR); pSecciones->SetManningLeft(NL); pSecciones->SetManningCenter(NC); pSecciones->SetManningRight(NR); pSecciones->SetBankLeft(BL); pSecciones->SetBankRight(BR); pSecciones->SetCoeficentCont(CC); pSecciones->SetCoeficentExp(CE); }// if pSecciones->close(); } // for i acedSSFree(ss); acutPrintf(_T("\n....Datos modificados en forma Exitosa....")); return; } BOOL CPLEDERSeccionesTransversalesDlg::ItemdataProc(DWORD dwData, LPARAM lParam) { // TODO: Process your item data here // Please return TRUE to proceed the deletion, return FALSE to abort. return TRUE; } /*----------------------------------------------------------------- ------------------------------------------------------------------*/ // PLEDERST1Dlg.cpp: archivo de implementación // Cuadro de diálogo de CPLEDERST1Dlg
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxviii
IMPLEMENT_DYNAMIC(CPLEDERST1Dlg, CDialog) CPLEDERST1Dlg::CPLEDERST1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CPLEDERST1Dlg::IDD, pParent) { m_Edit_NST.SetFocus(); //m_Edit_NST.SetSel(0, -1); } CPLEDERST1Dlg::~CPLEDERST1Dlg() { } void CPLEDERST1Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_NST, m_Edit_NST); } BEGIN_MESSAGE_MAP(CPLEDERST1Dlg, CDialog) ON_BN_CLICKED(IDOK, &CPLEDERST1Dlg::OnBnClickedOk) END_MESSAGE_MAP() // Controladores de mensajes de CPLEDERST1Dlg void CPLEDERST1Dlg::OnBnClickedOk() { // Coge los valores despues de pulsar OK // Cajas de texto m_Edit_NST.GetWindowText(m_NST); CDialog::OnOK(); //algo.EnableWindow( FALSE ); }
Apendice B. HIDRAULICA CODIGO FUENTE C++
cccxxix
Apendice C
HIDRAULICA FLUVIAL CODIGO
FUENTE C++
EL componente Hidraulica Fluvial se organiza en 02 librerıas con multiples funciones y
01 ventana grafica
cccxxx
ARCHIVOS DE CABECERA: PLEDERSocavacionGeneral.h #pragma once class CPLEDERSocavacionGeneral { public: CPLEDERSocavacionGeneral(void); ~CPLEDERSocavacionGeneral(void); public: // Cálculo de los datos para el coeficiente X.
int SGDatosMaterial(int Material, float *DatosMaterialX, float *DatosMaterialY);
// Cálculo de la variable X. int SGCoeficienteX(int Material, float CoefMaterial, float *X);
// Cálculo del tirante medio H0 encada vértice de la sección transversal int SGVerticesH0(AcGePoint2dArray Vertices, AcGePoint2dArray& VerticesH0);
// Cálculo de la socavación mediante el método de Lischtvan-Lebeviev. int SGLischtvanLebeviev(float Q, float A, float P, AcGePoint2dArray VerticesH0, int Material, int CoefProb, float CoefMaterial, float X, AcGePoint2dArray& VerticesSoc);
}; PLEDERSocavacionGeneralDlg.h //-------------------------------------------------------------------- //----- PLEDERSocavacionGeneralDlg.h : Declaration of the CPLEDERSocavacionGeneralDlg //-------------------------------------------------------------------- #pragma once //-------------------------------------------------------------------- class FGVResultadosBufer; #include "adui.h" #include "PLEDERReportCtrl.h" #include "resource.h" //-------------------------------------------------------------------- class CPLEDERSocavacionGeneralDlg : public CAdUiDialog { DECLARE_DYNAMIC (CPLEDERSocavacionGeneralDlg) public: static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam); CPLEDERSocavacionGeneralDlg (CWnd *pParent =NULL, HINSTANCE hInstance =NULL) ; virtual ~CPLEDERSocavacionGeneralDlg();
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxi
enum { IDD = IDD_HFLUVIAL_SOC} ; // Cajas de texto CAcUiNumericEdit m_Edit_SOCPes; CString m_SOCPes; CAcUiNumericEdit m_Edit_SOCDm; CString m_SOCDm; CAcUiNumericEdit m_Edit_SOCCoef; CString m_SOCCoef; // Combo Box CComboBox m_Combo_SOCId; CString m_SOCId; double m_STSOCId; CComboBox m_Combo_SOCProbg; CString m_SOCProbg; // Radio CButton m_Button_MaterialNoCoh; CButton m_Button_MaterialCoh; int m_Material; protected: virtual void DoDataExchange (CDataExchange *pDX) ; afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ; afx_msg void OnButtonTRPunto(); afx_msg void OnKillfocusEdit_SOCPes(); afx_msg void OnKillfocusEdit_SOCDm(); // Radio (Cuando existan cambios en el radio) afx_msg void OnRadioMaterialCohesivo(); afx_msg void OnRadioMaterialNoCohesivo(); // Para los combos afx_msg void OnKillfocusComboSOCId(); afx_msg void OnKillfocusComboSOCProbg(); // Botones afx_msg void OnCommandSOCAPLICAR(); public: virtual BOOL OnInitDialog(); public: FGVResultadosBufer* m_theFirstT; struct Socavacion* m_pSocavacion; // Struct buffer para los resultados. long m_Socavacion_len; DECLARE_MESSAGE_MAP() afx_msg void OnEnChangeEditSoccoef(); };
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxii
ARCHIVOS Cpp:
PLEDERSocavacionGeneral.cpp #include "StdAfx.h" #include "PLEDERSocavacionGeneral.h" #include "PLEDERMetodosNumericos.h" CMetodosNumericos CN; CPLEDERSocavacionGeneral::CPLEDERSocavacionGeneral(void) { } CPLEDERSocavacionGeneral::~CPLEDERSocavacionGeneral(void) { } int CPLEDERSocavacionGeneral::SGDatosMaterial(int Material, float *DatosMaterialX, float *DatosMaterialY) /*-------------------------------------------------------------------- Ingreso : Material = Tipo de material del lecho 1 -> No cohesivo. 0 -> Cohesivo. Salida : DatosMaterialX = Recibe en una lista los valores de las coordenadas X. Dependiendo del tipo del material. DatosMaterialX = Recibe en una lista los valores de las coordenadas Y. Dependiendo del tipo del material. Propósito : Prepara los datos en listas, dependiendo del tipo de material del lecho .------------------------------------------------------------------ */ { int i; float Coh_X[26] =
{0.80,0.83,0.86,0.88,0.90,0.93,0.96,0.98,1.00,1.04,1.08,1.12,1.16,1.20,1.24,1.28,1.34,1.40,1.46,1.52,1.58,1.64,1.71,1.80,1.89,2.00}; float Coh_Y[26] = {0.52,0.51,0.50,0.49,0.48,0.47,0.46,0.45,0.44,0.43,0.42,0.41,0.40,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.31,0.30,0.29,0.28,0.27}; float NoCoh_X[25] = {0.05,0.15,0.50,1.00,1.50,2.50,4.00,6.00,8.00,10.00,15.00,20.00,25.00,40.00,60.00,90.00,140.00,190.00,250.00,310.00,370.00,450.00,570.00,750.00,1000.00}; float NoCoh_Y[25] = {0.43,0.42,0.41,0.40,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.31,0.30,0.29,0.28,0.27,0.26,0.25,0.24,0.23,0.22,0.21,0.20,0.19};
if(Material == 1) // material no Cohesivo. { for (i=1; i<= 25; i++) { DatosMaterialX[i] = NoCoh_X[i-1]; DatosMaterialY[i] = NoCoh_Y[i-1]; } } // if 1
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxiii
if(Material == 0) // material Cohesivo. { for (i=1; i<= 26; i++) { DatosMaterialX[i] = Coh_X[i-1]; DatosMaterialY[i] = Coh_Y[i-1]; } } // if 0 return RTNORM; } int CPLEDERSocavacionGeneral::SGCoeficienteX(int Material, float CoefMaterial, float *X) /*-------------------------------------------------------------------- Ingreso : Material = Tipo de material del lecho. 1 -> No cohesivo. 0 -> Cohesivo. CoefMaterial = Coeficiente o dato del material del lecho. Salida : X = Valor interpolado linealmente, según la tabla que se expone en la teoría (Capítulo V) Propósito : Calcula el coeficiente X, necesario para la fórmula de la socavación. -------------------------------------------------------------------*/ { int i; float Y; float *DatosMaterialX = new float[28]; float *DatosMaterialY = new float[28]; if(Material == 1) // Material No Cohesivo. { if(CoefMaterial > 0.0 & CoefMaterial < 0.05) // mm { // Se ajusta a un sólo valor = 0.43 *X = 0.43; } if(CoefMaterial >= 0.05 & CoefMaterial <= 1000.0) // mm {
// Recibe los datos del material para una interpolación, SGDatosMaterial(Material, DatosMaterialX, DatosMaterialY);
// Interpolaciones lineales.
*X = CN.InterpolacionLineal(25,DatosMaterialY,DatosMaterialX, CoefMaterial);
} if(CoefMaterial > 1000.0) // mm { // Para R2 = 0.99 (polinómica)
*X = 0.00000013*CoefMaterial*CoefMaterial - 0.00024369*CoefMaterial + 0.30353418;
} } // if 1
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxiv
if(Material == 0) // Material Cohesivo. { if(CoefMaterial > 0.0 & CoefMaterial < 0.80) // Ton/m3 {
// Para R2 = 0.99 (polinómica) y = -0.097311x3 + 0.538865x2 - 1.113115x + 1.116961 *X = -0.097311*CoefMaterial*CoefMaterial*CoefMaterial + 0.538865*CoefMaterial*CoefMaterial - 1.113115*CoefMaterial + 1.116961;
} if(CoefMaterial >= 0.80 & CoefMaterial <= 2.00) // Ton/m3 {
// Recibe los datos del material para una interpolación, SGDatosMaterial(Material, DatosMaterialX, DatosMaterialY);
// Interpolaciones lineales.
*X = CN.InterpolacionLineal(25,DatosMaterialY,DatosMaterialX, CoefMaterial);
} if(CoefMaterial > 2.0) // Ton/m3 {
// Para R2 = 0.99 (polinómica) y = -0.097311x3 + 0.538865x2 - 1.113115x + 1.116961 *X = -0.097311*CoefMaterial*CoefMaterial*CoefMaterial + 0.538865*CoefMaterial*CoefMaterial - 1.113115*CoefMaterial+ 1.116961;
} } // if 0 delete [] DatosMaterialX; delete [] DatosMaterialY; return RTNORM; } int CPLEDERSocavacionGeneral::SGVerticesH0(AcGePoint2dArray Vertices, AcGePoint2dArray& VerticesH0) { int k; AcGePoint2d Vertex; // Calculo de los tirantes medios (H0) for (k = 0; k < Vertices.length()-1; k++) {
Vertex[X] = (2*Vertices[0].y - Vertices[k].y - Vertices[k+1].y )/2.0;
Vertex[Y] = 0.0; VerticesH0.append(Vertex); //acutPrintf(_T("\nH0[%d]: %0.3f"), k, VerticesH0[k].x ); } return RTNORM; }
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxv
int CPLEDERSocavacionGeneral::SGLischtvanLebeviev(float Q, float A, float P, AcGePoint2dArray VerticesH0, int Material, int CoefProb, float CoefMaterial, float X,AcGePoint2dArray& VerticesSoc) /*------------------------------------------------------------------- Ingreso : Q = Caudal del flujo (m3/s) A = Area del flujo calculado en la sección transversal.
P = Perímetro del flujo calculado en la sección transversal.
VerticesH0;= Vértices de H0 = (Hj+ Hj+1)/2 Material = Tipo de material del lecho. 1 -> No cohesivo. 0 -> Cohesivo. CoefProb = Coeficiente de probabilidad de ocurrencia del flujo. CoefMaterial= Coeficiente o dato del material del lecho. X = Valor interpolado linealmente, según la tabla Salida : Propósito : Calcula la altura de la socavación general en la sección transversal. --------------------------------------------------------------------*/ {
float v, // Coeficiente de probabilidad de gasto
Exp23 = 2.0/3.0, Exp53 = 5.0/3.0, ExpMatNc= 0.28, ExpMatC = 1.18, Exp1X = 1.0/(1.0+X); int k; AcGePoint2d Vertex; switch (CoefProb) { case 0: { v = 0.77; break; } case 1: { v = 0.82; break; } case 2: { v = 0.86; break; } case 3: { v = 0.90; break; } case 4:
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxvi
{ v = 0.94; break; } case 5: { v = 0.97; break; } case 6: { v = 1.00; break; } case 7: { v = 1.03; break; } case 8: { v = 1.05; break; } case 9: { v = 1.07; break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (CoefProb) float H0, Hs; if (Material == 1) // Fórmula para un lecho No Cohesivo { for (k = 0; k < VerticesH0.length(); k++) { H0 = VerticesH0[k].x; Hs = Q*pow(P,Exp23)*pow(H0, Exp53)/ (0.68*v*pow(A,Exp53)*pow(CoefMaterial,ExpMatNc)); Hs = pow(Hs,Exp1X); Vertex[X] = 0.0; Vertex[Y] = Hs; VerticesSoc.append(Vertex); } // for k } //if if (Material == 0) // Fórmula para lecho Cohesivo { for (k = 0; k < VerticesH0.length(); k++) {
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxvii
H0 = VerticesH0[k].x; Hs = Q*pow(P,Exp23)*pow(H0,Exp53)/ (0.60*v*pow(A,Exp53)*pow(CoefMaterial,ExpMatC)); Hs = pow(Hs,Exp1X); Vertex[X] = 0.0; Vertex[Y] = Hs; VerticesSoc.append(Vertex); } // For k } // if return RTNORM; } PLEDERSocavacionGeneralDlg.cpp //-------------------------------------------------------------------- //----- PLEDERTranSediFormaFondoDlg.cpp : Implementation of CPLEDERTranSediFormaFondoDlg //-------------------------------------------------------------------- #include "StdAfx.h" #include "resource.h" #include "PLEDERSocavacionGeneralDlg.h" #include "PLEDERSeccionesTransversales.h" #include "PLEDERHidraBuffer.h" #include "PLEDERRecursosCad.h" #include "axlock.h" // Tabla CRecursosCad RSOC; CPLEDERSeccionesTransversales STSOC; //----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC (CPLEDERSocavacionGeneralDlg, CAdUiDialog) BEGIN_MESSAGE_MAP(CPLEDERSocavacionGeneralDlg, CAdUiDialog) ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus) ON_EN_KILLFOCUS(IDC_EDIT_SOCPes, OnKillfocusEdit_SOCPes) ON_EN_KILLFOCUS(IDC_EDIT_SOCDm, OnKillfocusEdit_SOCDm) // Botones incluidos cad ON_BN_CLICKED(IDC_BUTTON_SOCApl, OnCommandSOCAPLICAR) // Radios (cambios en los Radios) ON_BN_CLICKED(IDC_RADIO_SOCCoh, OnRadioMaterialCohesivo) ON_BN_CLICKED(IDC_RADIO_SOCNocoh, OnRadioMaterialNoCohesivo) // Combo Box ON_CBN_SELCHANGE(IDC_COMBO_SOCId, OnKillfocusComboSOCId) ON_CBN_SELCHANGE(IDC_COMBO_SOCProbg, OnKillfocusComboSOCProbg) ON_EN_CHANGE(IDC_EDIT_SOCCoef, &CPLEDERSocavacionGeneralDlg::OnEnChangeEditSoccoef) END_MESSAGE_MAP() //--------------------------------------------------------------------
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxviii
CPLEDERSocavacionGeneralDlg::CPLEDERSocavacionGeneralDlg (CWnd *pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog (CPLEDERSocavacionGeneralDlg::IDD, pParent, hInstance) { m_Material = 0; m_SOCPes = _T("0.0"); m_SOCDm = _T("0.0"); m_SOCCoef = _T("1.00"); } CPLEDERSocavacionGeneralDlg::~CPLEDERSocavacionGeneralDlg() { } //-------------------------------------------------------------------- void CPLEDERSocavacionGeneralDlg::DoDataExchange (CDataExchange *pDX) { CAdUiDialog::DoDataExchange (pDX) ; // Cajas de Texto. DDX_Control(pDX, IDC_EDIT_SOCPes, m_Edit_SOCPes); DDX_Control(pDX, IDC_EDIT_SOCDm, m_Edit_SOCDm); DDX_Control(pDX, IDC_EDIT_SOCCoef, m_Edit_SOCCoef); // Radio DDX_Control(pDX, IDC_RADIO_SOCNocoh, m_Button_MaterialNoCoh); DDX_Control(pDX, IDC_RADIO_SOCCoh, m_Button_MaterialCoh); //DDX_Radio(pDX, IDC_RADIO_SOCNocoh, m_Material); //ComboBox DDX_Control(pDX, IDC_COMBO_SOCId, m_Combo_SOCId); DDX_Control(pDX, IDC_COMBO_SOCProbg, m_Combo_SOCProbg); } //-------------------------------------------------------------------- //----- Needed for modeless dialogs to keep focus. //----- Return FALSE to not keep the focus, return TRUE to keep the focus LRESULT CPLEDERSocavacionGeneralDlg::OnAcadKeepFocus (WPARAM, LPARAM) { return (TRUE) ; } BOOL CPLEDERSocavacionGeneralDlg::OnInitDialog() { CDialog::OnInitDialog(); // Inicializar cajas de texto m_Edit_SOCPes.SetWindowText(m_SOCPes); m_Edit_SOCPes.SetRange(0,100); m_Edit_SOCDm.SetWindowText(m_SOCDm); m_Edit_SOCDm.SetRange(0,10000); m_Edit_SOCCoef.SetWindowText(m_SOCCoef); // Activar radio Material No Cohesivo m_Button_MaterialNoCoh.SetCheck(1); // Activa y desactiva para material Cohesivo. m_Edit_SOCPes.EnableWindow(0);
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxxxix
m_Edit_SOCDm.EnableWindow(1); m_Material = 1; // Por defecto en la posición 6 (1%) m_Combo_SOCProbg.SetCurSel(6); // Cargar los Ids de las secciones transversales. if (!m_pSocavacion) { // Sin secciones transversales return TRUE; } long i; CString str_IdST; // Cargar los valores a la ventana for (i = 0; i < m_Socavacion_len; i++) { // Preparar las cadenas acdbRToS((m_pSocavacion + i)->IdST, 2, 3, str_IdST.GetBuffer(80)); // Insertar el Id de la S.T. al combo de la ventana m_Combo_SOCId.AddString(str_IdST); m_Combo_SOCId.SetCurSel(i); } // Verificar si existe S.T. en el Drawing if (m_Socavacion_len <= 0) { acutPrintf(_T("\nNo Existen Secciones Transversales definidos.")); return TRUE; } // Llama a los atributos de la S.T. OnKillfocusComboSOCId(); return TRUE; } void CPLEDERSocavacionGeneralDlg::OnKillfocusEdit_SOCPes() { m_Edit_SOCPes.Convert(); if (!m_Edit_SOCPes.Validate()) { ::AfxMessageBox(_T("Entrada no válida, Fuera de rango")); m_Edit_SOCPes.SetFocus(); m_Edit_SOCPes.SetSel(0, -1); } CString str; m_Edit_SOCPes.GetWindowText(m_SOCPes); acdbRToS(::_wtof(m_SOCPes), 2, 3, str.GetBuffer(80)); m_Edit_SOCPes.SetWindowText(str); } void CPLEDERSocavacionGeneralDlg::OnKillfocusEdit_SOCDm() { m_Edit_SOCDm.Convert();
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxl
if (!m_Edit_SOCDm.Validate()) { ::AfxMessageBox(_T("Entrada no válida, Fuera de rango")); m_Edit_SOCDm.SetFocus(); m_Edit_SOCDm.SetSel(0, -1); } CString str; m_Edit_SOCDm.GetWindowText(m_SOCDm); acdbRToS(::_wtof(m_SOCDm), 2, 3, str.GetBuffer(80)); m_Edit_SOCDm.SetWindowText(str); } void CPLEDERSocavacionGeneralDlg::OnRadioMaterialCohesivo() { // Activa y desactiva las casillas de la ventana m_Edit_SOCPes.EnableWindow(1); m_Edit_SOCDm.EnableWindow(0); m_Material = 0; } void CPLEDERSocavacionGeneralDlg::OnRadioMaterialNoCohesivo() { // Activa las casillas de la ventana m_Edit_SOCPes.EnableWindow(0); m_Edit_SOCDm.EnableWindow(1); m_Material = 1; } void CPLEDERSocavacionGeneralDlg::OnEnChangeEditSoccoef() { // TODO: Si éste es un control RICHEDIT, el control no
// enviará esta notificación a menos que se invalide CAdUiDialog::OnInitDialog()
// función y llamada CRichEditCtrl().SetEventMask() // con el marcador ENM_CHANGE ORed en la máscara. // TODO: Agregue aquí el controlador de notificación de controles } void CPLEDERSocavacionGeneralDlg::OnCommandSOCAPLICAR() { // Parámetros para socavación int Material, // Tipo de material, Cohesivo = 0, No
Cohesivo = 1. CoefProb; // Coeficiente de probabilidad de gasto.
double CoefMaterial; // Peso específico ó diámetro medio del material de fondo. double IdST; // id Seccion Transversal // Obtener el valor del combo seleccionado int nIndex = m_Combo_SOCId.GetCurSel(); m_Combo_SOCId.GetLBText(nIndex,m_SOCId); IdST = _wtof(m_SOCId); CoefProb = m_Combo_SOCProbg.GetCurSel(); // Obtener los atributos de la ventana Material = m_Material;
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxli
if(Material == 1) // Material No cohesivo { m_Edit_SOCDm.GetWindowTextW(m_SOCDm); CoefMaterial = _wtof(m_SOCDm); } else // Material cohesivo { m_Edit_SOCPes.GetWindowTextW(m_SOCPes); CoefMaterial = _wtof(m_SOCPes); } // Verificando los datos correctos if(CoefMaterial <= 0.0) { acutPrintf(_T("\nLos datos de la seccion: %0.3f, no fueron cargados correctamente"), IdST ); return; } struct resbuf *filter; // resbufs // Preparar el filtro para seleccionar las S.T. filter = acutBuildList( RTDXF0, _T("CPLEDERCrossSections"), 8, PLEDER_CAPA_SECCIONTRANSVERSAL, 0); if (!filter) { acdbFail(_T("\nError al construir el filtro [acutBuildList].")); return ; } ads_name ss; // ss long sslen = 0; // longitud del ss // seleccionar las secciones transversales definidas if (acedSSGet(_T("_X"), NULL, NULL, filter, ss) != RTNORM) { acutPrintf(_T("\nNo hay secciones transversales definidas en el drawing")); acutRelRb(filter); return; } acutRelRb(filter); // tomar la longitud del ss if (acedSSLength(ss, &sslen) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar la longitud del conjunto de selección [acedSSLength].")); return; } CPLEDERCrossSections *pSecciones; ads_name ename; AcDbObjectId ID;
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxlii
// recorrer el ss for (int i = 0; i < sslen; i++) { // tomar el nombre de la entidad if (acedSSName(ss, i, ename) != RTNORM) { acedSSFree(ss); acdbFail(_T("\nError al tomar el nombre de la entidad CPLEDERCrossSections [acedSSName].")); return; } // cambiar el nombre por el ObjectId if (acdbGetObjectId(ID, ename) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al tomar el ObjectId de la entidad CPLEDERCrossSections [acdbGetObjectId].")); return; } // abrir el objeto para escritura if (acdbOpenObject(pSecciones, ID, /*AcDb::kForRead*/ AcDb::kForWrite) != Acad::eOk) { acedSSFree(ss); acdbFail(_T("\nError al abrir el Objeto CPLEDERCrossSections [acdbOpenObject].")); return ; } // chequear el tipo de objeto if (pSecciones->isKindOf(CPLEDERCrossSections::desc()) != Adesk::kTrue) { pSecciones->close(); acedSSFree(ss); acdbFail(_T("\nError Objeto CPLEDERCrossSections ")); return; } double Id_Seccion; // Tomar el ID para comparar pSecciones->IdCrossSections(Id_Seccion); // Si procede, actualizar los datos de la S.T. if (Id_Seccion == IdST) { pSecciones->SetTipoMaterial(Material); pSecciones->SetCoeficienteProb(CoefProb); pSecciones->SetCoeficienteMaterial(CoefMaterial); }// if pSecciones->close(); } // for i acedSSFree(ss); acutPrintf(_T("\n....Datos modificados en forma Exitosa....")); return; }
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxliii
void CPLEDERSocavacionGeneralDlg::OnKillfocusComboSOCId() { double Id_ST; // Obtener el valor del combo seleccionado int nIndex = m_Combo_SOCId.GetCurSel(); m_Combo_SOCId.GetLBText(nIndex,m_SOCId); Id_ST = _wtof(m_SOCId); // Realizar un Zoom a la sección transversal STSOC.ZoomCrossSections(Id_ST); int Material, // Tipo de material, Cohesivo = 0,
No Cohesivo = 1. CoefProb; // Coeficiente de probabilidad de gasto. (Posición del combo) double CoefMaterial; // Peso específico ó diámetro medio del material de fondo. if (STSOC.GetIdCrossSectionsAttributesSocavacion(Id_ST, &Material, &CoefProb, &CoefMaterial) != RTNORM) { acutPrintf(_T("\nERROR PLEDER:[GetIdCrossSectionsAttributesSocavacion]")); return; } // Inserta el valor del material en la ventana if(Material == 1) // Material No cohesivo { // Activar radio m_Button_MaterialNoCoh.SetCheck(1); m_Button_MaterialCoh.SetCheck(0); // Activa y desactiva las casillas de la ventana m_Edit_SOCPes.EnableWindow(0); m_Edit_SOCDm.EnableWindow(1); m_SOCDm.Format(_T("%g"), CoefMaterial); m_Edit_SOCDm.SetWindowText(m_SOCDm); } else // Material cohesivo { // Activar radio m_Button_MaterialNoCoh.SetCheck(0); m_Button_MaterialCoh.SetCheck(1); // Activa y desactiva las casillas de la ventana m_Edit_SOCPes.EnableWindow(1); m_Edit_SOCDm.EnableWindow(0); m_SOCPes.Format(_T("%g"), CoefMaterial); m_Edit_SOCPes.SetWindowText(m_SOCPes); } // Activa el combo, en la posición indicada. m_Combo_SOCProbg.SetCurSel(CoefProb); OnKillfocusComboSOCProbg(); } void CPLEDERSocavacionGeneralDlg::OnKillfocusComboSOCProbg() { switch (m_Combo_SOCProbg.GetCurSel()) {
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxliv
case 0: { m_Edit_SOCCoef.SetWindowText(_T("0.77")); break; } case 1: { m_Edit_SOCCoef.SetWindowText(_T("0.82")); break; } case 2: { m_Edit_SOCCoef.SetWindowText(_T("0.86")); break; } case 3: { m_Edit_SOCCoef.SetWindowText(_T("0.90")); break; } case 4: { m_Edit_SOCCoef.SetWindowText(_T("0.94")); break; } case 5: { m_Edit_SOCCoef.SetWindowText(_T("0.97")); break; } case 6: { m_Edit_SOCCoef.SetWindowText(_T("1.00")); break; } case 7: { m_Edit_SOCCoef.SetWindowText(_T("1.03")); break; } case 8: { m_Edit_SOCCoef.SetWindowText(_T("1.05")); break; } case 9: { m_Edit_SOCCoef.SetWindowText(_T("1.07")); break; } default: acutPrintf(_T("\nFuera de Rango")); } //switch (m_Combo_SOCProbg.GetCurSel()) }
Apendice C. HIDRAULICA FLUVIAL CODIGO FUENTE C++
cccxlv
Apendice D
RESULTADOS DEL PROGRAMA
Cuadro D.1: Coordenadas hidrograma TR = 50 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
0 0.000 830 57.605.000
10 0.052 840 56.334
20 0.379 850 54.912
30 1.289 860 53.328
40 3.242 870 51.546
50 6.727 880 49.576
60 11.577 890 47.44
70 18.078 900 45.169
80 26.022 910 42.795
90 35.761 920 40.367
100 47.589 930 37.908
110 61.651 940 35.478
120 77.933 950 33.07
(sigue en la pagina siguiente)
cccxlvi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.1: Continuacion de la tabla Coordenadas hi-
drograma TR = 50 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
130 95.729 960 30.698
140 114.508 970 28.382
150 133.167 980 26.160
160 151.154 990 24.039
170 168.116 1000 22.023
180 183.685 1010 20.116
190 197.508 1020 18.318
200 209.631 1030 16.652
210 219.584 1040 15.121
220 227.751 1050 13.744
230 233.851 1060 12.510
240 237.903 1070 11.404
250 239.997 1080 10.402
260 240.694 1090 9.491
270 239.867 1100 8.659
280 237.561 1110 7.903
290 233.693 1120 7.213
300 228.224 1130 6.582
310 221.655 1140 6.000
320 214.426 1150 5.465
330 207.160 1160 4.977
340 200.063 1170 4.530
(sigue en la pagina siguiente)
cccxlvii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.1: Continuacion de la tabla Coordenadas hi-
drograma TR = 50 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
350 193.204 1180 4.122
360 186.441 1190 3.753
370 179.850 1200 3.419
380 173.505 1210 3.113
390 167.59 1220 2.831
400 162.017 1230 2.576
410 156.773 1240 2.342
420 151.649 1250 2.129
430 146.678 1260 1.934
440 141.917 1270 1.758
450 137.373 1280 1.597
460 133.049 1290 1.45
470 128.985 1300 1.317
480 125.160 1310 1.196
490 121.450 1320 1.086
500 117.898 1330 0.984
510 114.523 1340 0.893
520 111.299 1350 0.809
530 108.211 1360 0.732
540 105.260 1370 0.662
550 102.444 1380 0.599
560 99.720 1390 0.540
(sigue en la pagina siguiente)
cccxlviii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.1: Continuacion de la tabla Coordenadas hi-
drograma TR = 50 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
570 97.109 1400 0.487
580 94.623 1410 0.439
590 92.246 1420 0.395
600 89.947 1430 0.355
610 87.736 1440 0.319
620 85.620 1450 0.286
630 83.583 1460 0.255
640 81.632 1470 0.228
650 79.769 1480 0.202
660 77.987 1490 0.179
670 76.275 1500 0.157
680 74.647 1510 0.137
690 73.106 1520 0.118
700 71.648 1530 0.101
710 70.272 1540 0.085
720 68.975 1550 0.071
730 67.758 1560 0.058
740 66.612 1570 0.046
750 65.544 1580 0.036
760 64.550 1590 0.028
770 63.621 1600 0.020
780 62.706 1610 0.014
(sigue en la pagina siguiente)
cccxlix
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.1: Continuacion de la tabla Coordenadas hi-
drograma TR = 50 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
790 61.793 1620 0.009
800 60.840 1630 0.005
810 59.836 1640 0.002
820 58.766 1650 0.00
(Fin de la tabla)
Cuadro D.2: Coordenadas hidrograma TR = 100 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
0 0.000 840 72.931
10 0.007 850 71.284
20 0.223 860 69.450
30 0.972 870 67.414
40 2.766 880 65.130
50 6.202 890 62.611
60 11.903 900 59.887
70 19.653 910 56.995
80 29.816 920 53.981
90 42.190 930 50.905
100 57.210 940 47.794
110 75.301 950 44.723
120 96.525 960 41.683
(sigue en la pagina siguiente)
cccl
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.2: Continuacion de la tabla Coordenadas hi-
drograma TR = 100 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
130 120.681 970 38.689
140 146.671 980 35.767
150 173.676 990 32.965
160 200.117 1000 30.29
170 225.280 1010 27.749
180 248.604 1020 25.345
190 269.689 1030 23.079
200 288.119 1040 20.979
210 303.981 1050 19.050
220 316.610 1060 17.315
230 326.597 1070 15.761
240 333.632 1080 14.367
250 337.786 1090 13.105
260 339.232 1100 11.956
270 338.679 1110 10.907
280 335.974 1120 9.955
290 331.147 1130 9.085
300 324.176 1140 8.291
310 315.106 1150 7.557
320 304.711 1160 6.883
330 293.614 1170 6.268
340 282.652 1180 5.705
(sigue en la pagina siguiente)
cccli
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.2: Continuacion de la tabla Coordenadas hi-
drograma TR = 100 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
350 272.056 1190 5.191
360 261.912 1200 4.726
370 252.005 1210 4.306
380 242.447 1220 3.920
390 233.303 1230 3.565
400 224.790 1240 3.243
410 216.787 1250 2.949
420 209.268 1260 2.680
430 201.941 1270 2.435
440 194.849 1280 2.214
450 188.096 1290 2.011
460 181.680 1300 1.825
470 175.588 1310 1.658
480 169.879 1320 1.506
490 164.522 1330 1.366
500 159.343 1340 1.239
510 154.390 1350 1.124
520 149.702 1360 1.018
530 145.237 1370 0.921
540 140.968 1380 0.833
550 136.900 1390 0.753
560 133.033 1400 0.680
(sigue en la pagina siguiente)
ccclii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.2: Continuacion de la tabla Coordenadas hi-
drograma TR = 100 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
570 129.306 1410 0.613
580 125.740 1420 0.552
590 122.356 1430 0.497
600 119.130 1440 0.447
610 116.017 1450 0.401
620 113.029 1460 0.359
630 110.178 1470 0.321
640 107.438 1480 0.286
650 104.817 1490 0.254
660 102.320 1500 0.225
670 99.935 1510 0.197
680 97.647 1520 0.172
690 95.473 1530 0.148
700 93.419 1540 0.126
710 91.479 1550 0.107
720 89.648 1560 0.089
730 87.925 1570 0.073
740 86.311 1580 0.058
750 84.794 1590 0.046
760 83.379 1600 0.035
770 82.063 1610 0.025
780 80.831 1620 0.017
(sigue en la pagina siguiente)
cccliii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.2: Continuacion de la tabla Coordenadas hi-
drograma TR = 100 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
790 79.619 1630 0.011
800 78.411 1640 0.006
810 77.155 1650 0.002
820 75.838 1660 0.000
830 74.441
(Fin de la tabla)
Cuadro D.3: Coordenadas hidrograma TR = 200 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
0 0.000 840 88.784
10 0.076 850 86.743
20 0.574 860 84.477
30 1.962 870 81.967
40 4.943 880 79.159
50 10.246 890 76.068
60 18.657 900 72.731
70 29.893 910 69.197
80 44.441 920 65.520
90 62.073 930 61.773
100 83.334 940 57.990
110 108.728 950 54.257
(sigue en la pagina siguiente)
cccliv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.3: Continuacion de la tabla Coordenadas hi-
drograma TR = 200 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
120 138.167 960 50.564
130 171.228 970 46.929
140 206.377 980 43.382
150 242.462 990 39.980
160 277.426 1000 36.735
170 310.335 1010 33.651
180 340.464 1020 30.736
190 367.389 1030 27.988
200 390.620 1040 25.441
210 410.264 1050 23.101
220 425.492 1060 20.997
230 437.138 1070 19.112
240 444.861 1080 17.422
250 448.802 1090 15.890
260 449.191 1100 14.497
270 446.913 1110 13.225
280 441.775 1120 12.070
290 433.832 1130 11.016
300 423.153 1140 10.052
310 409.895 1150 9.162
320 395.123 1160 8.345
330 379.643 1170 7.599
(sigue en la pagina siguiente)
ccclv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.3: Continuacion de la tabla Coordenadas hi-
drograma TR = 200 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
340 364.507 1180 6.916
350 349.978 1190 6.293
360 336.15 1200 5.729
370 322.744 1210 5.220
380 309.887 1220 4.751
390 297.631 1230 4.322
400 286.232 1240 3.931
410 275.532 1250 3.575
420 265.486 1260 3.248
430 255.712 1270 2.951
440 246.283 1280 2.683
450 237.338 1290 2.437
460 228.859 1300 2.212
470 220.825 1310 2.009
480 213.313 1320 1.825
490 206.277 1330 1.656
500 199.487 1340 1.501
510 193.004 1350 1.362
520 186.884 1360 1.233
530 181.065 1370 1.116
540 175.510 1380 1.009
550 170.230 1390 0.913
(sigue en la pagina siguiente)
ccclvi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.3: Continuacion de la tabla Coordenadas hi-
drograma TR = 200 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
560 165.225 1400 0.824
570 160.409 1410 0.742
580 155.813 1420 0.669
590 151.461 1430 0.602
600 147.319 1440 0.541
610 143.328 1450 0.485
620 139.505 1460 0.435
630 135.865 1470 0.389
640 132.371 1480 0.346
650 129.032 1490 0.308
660 125.857 1500 0.272
670 122.827 1510 0.239
680 119.923 1520 0.208
690 117.167 1530 0.179
700 114.567 1540 0.153
710 112.112 1550 0.129
720 109.797 1560 0.107
730 107.622 1570 0.088
740 105.587 1580 0.071
750 103.675 1590 0.055
760 101.892 1600 0.042
770 100.233 1610 0.031
(sigue en la pagina siguiente)
ccclvii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.3: Continuacion de la tabla Coordenadas hi-
drograma TR = 200 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
780 98.679 1620 0.021
790 97.151 1630 0.013
800 95.631 1640 0.007
810 94.053 1650 0.003
820 92.405 1660 0.001
830 90.661
(Fin de la tabla)
Cuadro D.4: Coordenadas hidrograma TR = 500 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
0 0.000 840 112.708
10 0.002 850 110.322
20 0.277 860 107.737
30 1.317 870 104.876
40 3.870 880 101.716
50 8.838 890 98.190
60 17.143 900 94.315
70 29.816 910 90.142
80 46.456 920 85.734
90 67.794 930 81.156
100 93.489 940 76.499
(sigue en la pagina siguiente)
ccclviii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.4: Continuacion de la tabla Coordenadas hi-
drograma TR = 500 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
110 124.302 950 71.801
120 160.724 960 67.172
130 202.402 970 62.594
140 248.566 980 58.089
150 297.059 990 53.695
160 346.221 1000 49.482
170 393.389 1010 45.463
180 437.220 1020 41.646
190 476.885 1030 38.037
200 511.901 1040 34.635
210 541.683 1050 31.483
220 566.321 1060 28.587
230 584.842 1070 25.983
240 598.431 1080 23.650
250 606.703 1090 21.558
260 609.916 1100 19.663
270 608.331 1110 17.938
280 603.121 1120 16.364
290 594.002 1130 14.935
300 581.142 1140 13.629
310 564.757 1150 12.437
320 545.201 1160 11.336
(sigue en la pagina siguiente)
ccclix
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.4: Continuacion de la tabla Coordenadas hi-
drograma TR = 500 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
330 523.924 1170 10.324
340 501.983 1180 9.401
350 480.705 1190 8.557
360 460.417 1200 7.786
370 441.207 1210 7.087
380 422.719 1220 6.458
390 405.074 1230 5.877
400 388.300 1240 5.346
410 372.718 1250 4.863
420 358.110 1260 4.422
430 344.395 1270 4.018
440 331.075 1280 3.650
450 318.281 1290 3.318
460 306.183 1300 3.014
470 294.736 1310 2.736
480 283.915 1320 2.485
490 273.818 1330 2.257
500 264.375 1340 2.048
510 255.272 1350 1.857
520 246.608 1360 1.684
530 238.443 1370 1.525
540 230.692 1380 1.380
(sigue en la pagina siguiente)
ccclx
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.4: Continuacion de la tabla Coordenadas hi-
drograma TR = 500 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
550 223.304 1390 1.248
560 216.303 1400 1.128
570 209.684 1410 1.018
580 203.324 1420 0.918
590 197.270 1430 0.827
600 191.550 1440 0.744
610 186.114 1450 0.669
620 180.885 1460 0.600
630 175.886 1470 0.538
640 171.136 1480 0.481
650 166.581 1490 0.428
660 162.235 1500 0.381
670 158.108 1510 0.336
680 154.175 1520 0.295
690 150.408 1530 0.257
700 146.837 1540 0.222
710 143.473 1550 0.189
720 140.300 1560 0.159
730 137.311 1570 0.133
740 134.506 1580 0.109
750 131.885 1590 0.087
760 129.423 1600 0.068
(sigue en la pagina siguiente)
ccclxi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.4: Continuacion de la tabla Coordenadas hi-
drograma TR = 500 anos
Duracion (min) Q total (m3/s) Duracion (min) Q total (m3/s)
770 127.128 1610 0.052
780 124.991 1620 0.038
790 122.988 1630 0.026
800 121.020 1640 0.016
810 119.063 1650 0.009
820 117.039 1660 0.004
830 114.931 1670 0.001
(Fin de la tabla)
Cuadro D.5: Resultados parametros hidraulicos TR = 50
anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
1 240.69 2971.691 35.645 20.133 6.752 1.33 16.653
2 240.69 2971.074 34.848 20.354 6.907 1.555 17.268
3 240.69 2972.111 58.332 29.553 4.126 0.754 35.272
4 240.69 2972.694 101.202 45.492 2.378 0.398 37.882
5 240.69 2970.189 31.792 23.108 7.571 1.657 20.926
6 240.69 2971.574 83.349 38.843 2.888 0.492 33.108
7 240.69 2969.627 34.53 23.986 6.971 1.779 21.733
8 240.69 2969.325 35.701 23.921 6.742 1.431 22.049
9 240.69 2971.118 95.874 38.898 2.51 0.398 32.936
(sigue en la pagina siguiente)
ccclxii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
10 240.69 2971.165 101.04 41.111 2.382 0.376 36.091
11 240.69 2968.727 32.301 22.286 7.451 1.844 20.682
12 240.69 2968.723 37.296 25.325 6.453 1.599 23.843
13 240.69 2968.708 42.705 26.662 5.636 1.106 24.523
14 240.69 2968.119 36.628 26.865 6.571 1.463 25.921
15 240.69 2969.294 82.557 31.765 2.915 0.518 29.985
16 240.69 2967.408 36.003 24.831 6.685 1.394 24.189
17 240.69 2969.447 97.741 37.378 2.463 0.376 35.32
18 240.69 2969.406 94.376 39.959 2.55 0.391 37.722
19 240.69 2969.375 87.588 35.585 2.748 0.381 32.367
20 240.69 2969.14 73.191 27.95 3.289 0.466 24.429
21 240.69 2967.831 41.464 19.179 5.805 0.955 15.555
22 240.69 2966.601 54.955 24.51 4.38 0.743 22.578
23 240.69 2965.141 45.527 28.271 5.287 1.171 27.446
24 240.69 2966.379 93.467 31.266 2.575 0.396 27.676
25 240.69 2966.273 80.369 28.997 2.995 0.466 22.521
26 240.69 2963.511 29.868 16.506 8.058 1.644 13.661
27 240.69 2965.86 79.178 27.029 3.04 0.443 21.594
28 240.69 2962.61 28.492 17.053 8.447 1.69 14.308
29 240.69 2965.257 79.95 25.051 3.011 0.422 19.941
30 240.69 2961.762 26.873 16.991 8.957 2.193 14.559
31 240.69 2961.864 36.064 18.556 6.674 1.273 16.164
(sigue en la pagina siguiente)
ccclxiii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
32 240.69 2961.536 37.109 18.774 6.486 1.207 16.609
33 240.69 2961.442 40.877 19.784 5.888 1.114 17.402
34 240.69 2961.191 40.701 18.911 5.914 0.996 16.343
35 240.69 2962.188 82.727 33.607 2.909 0.433 29.928
36 240.69 2959.703 31.652 21.212 7.604 1.672 19.55
37 240.69 2961.033 70.602 36.291 3.409 0.587 35.937
38 240.69 2959.258 35.39 22.888 6.801 1.683 21.48
39 240.69 2959.253 41.397 25.19 5.814 1.138 43.862
40 240.69 2958.688 38.641 23.678 6.229 1.374 22.38
41 240.69 2959.972 78.325 40.091 3.073 0.469 35.542
42 240.69 2959.193 45.147 20.169 5.331 0.897 16.837
43 240.69 2957.793 40.275 24.296 5.976 1.287 23.199
44 240.69 2959.394 105.062 36.402 2.291 0.375 32.852
45 240.69 2959.389 108.849 38.236 2.211 0.322 33.454
46 240.69 2956.355 29.186 23.937 8.247 1.984 22.545
47 240.69 2956.64 41.236 24.795 5.837 1.303 22.658
48 240.69 2957.782 72.929 26.939 3.3 0.515 24.007
49 240.69 2956.276 37.283 20.989 6.456 1.258 19.824
50 240.69 2955.749 36.101 21.931 6.667 1.45 20.631
51 240.69 2957.217 77.161 28.24 3.119 0.523 25.344
52 240.69 2957.353 93.682 34.95 2.569 0.423 32.609
53 240.69 2957.376 99.914 35.244 2.409 0.352 32.883
(sigue en la pagina siguiente)
ccclxiv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
54 240.69 2954.858 31.561 19.237 7.626 1.738 17.589
55 240.69 2955.745 51.371 24.61 4.685 0.763 21.494
56 240.69 2954.595 43.196 28.408 5.572 1.083 27.147
57 240.69 2954.093 37.679 26.607 6.388 1.376 25.531
58 240.69 2955.687 78.832 29.317 3.053 0.501 26.399
59 240.69 2953.486 32.514 24.896 7.403 1.874 24.175
60 240.69 2953.259 34.833 24.198 6.91 1.435 23.478
61 240.69 2955.349 91.238 30.07 2.638 0.399 26.808
62 240.69 2955.413 99.505 28.713 2.419 0.329 23.037
63 240.69 2955.347 89.271 31.189 2.696 0.369 25.447
64 240.69 2953.285 35.414 28.569 6.796 1.036 37.963
65 240.69 2952.675 30.435 15.621 7.908 1.299 10.665
66 240.69 2953.974 62.018 36.252 3.881 0.55 29.78
67 240.69 2951.19 27.954 17.303 8.61 1.815 14.974
68 240.69 2953.073 74.809 25.336 3.217 0.452 20.097
69 240.69 2952.956 66.697 26.844 3.609 0.512 23.629
70 240.69 2953.116 81.662 34.305 2.947 0.412 31.667
71 240.69 2950.45 29.959 18.67 8.034 1.605 17.545
72 240.69 2953.113 114.584 37.902 2.101 0.294 35.491
73 240.69 2949.656 28.591 19.605 8.418 1.702 18.544
74 240.69 2952.143 97.985 32.007 2.456 0.351 27.617
75 240.69 2952.063 98.144 33.166 2.452 0.354 28.131
(sigue en la pagina siguiente)
ccclxv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
76 240.69 2949.432 30.709 19.025 7.838 1.661 17.687
77 240.69 2951.247 70.532 26.021 3.413 0.483 23.406
78 240.69 2949.39 33.685 16.512 7.145 1.27 14.028
79 240.69 2949.773 48.018 20.325 5.013 0.842 17.719
80 240.69 2948.387 35.346 19.099 6.809 1.457 17.184
81 240.69 2950.067 69.216 25.042 3.477 0.501 20.991
82 240.69 2947.901 32.134 16.926 7.49 1.445 14.255
83 240.69 2947.47 32.891 17.799 7.318 1.538 15.538
84 240.69 2949.398 80.27 30.764 2.998 0.418 27.277
85 240.69 2949.565 103.449 36.83 2.327 0.32 32.25
86 240.69 2949.662 117.682 35.954 2.045 0.278 31.564
87 240.69 2945.417 25.199 16.149 9.552 2.03 13.674
88 240.69 2947.188 58.284 21.742 4.13 0.588 16.096
89 240.69 2944.605 28.728 16.312 8.378 1.442 13.134
90 240.69 2945.346 39.491 17.364 6.095 0.951 13.605
91 240.69 2944.532 38.774 21.322 6.208 1.08 19.946
92 240.69 2945.151 55.589 23.405 4.33 0.692 21.141
93 240.69 2944.143 50.041 21.215 4.81 0.77 18.668
94 240.69 2943.125 43.924 20.581 5.48 1.016 18.544
95 240.69 2943.067 50.052 20.157 4.809 0.777 16.306
96 240.69 2941.974 52.45 21.956 4.589 0.834 18.668
97 240.69 2940.062 41.141 20.758 5.85 1.097 17.953
(sigue en la pagina siguiente)
ccclxvi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
98 240.69 2939.898 49.988 21.93 4.815 0.795 19.29
99 240.69 2938.635 46.809 23.568 5.142 1.044 21.847
100 240.69 2937.761 43.339 23.695 5.554 1.1 22.254
101 240.69 2937.096 39.138 22.803 6.15 1.325 21.606
102 240.69 2938.689 100.21 37.138 2.402 0.394 34.44
103 240.69 2938.834 130.319 41.017 1.847 0.265 36.949
104 240.69 2936.532 33.939 17.944 7.092 1.188 13.674
105 240.69 2935.166 34.456 16.99 6.986 1.234 14.394
106 240.69 2935.613 56.24 31.952 4.28 0.709 28.339
107 240.69 2934.328 53.457 24.915 4.502 0.776 23.259
108 240.69 2932.757 40.73 22.464 5.909 1.116 20.951
109 240.69 2932.523 45.69 24.631 5.268 1.038 22.114
110 240.69 2931.897 39.577 22.819 6.082 1.374 21.191
111 240.69 2932.895 65.445 32.83 3.678 0.587 29.759
112 240.69 2931.892 48.063 31.692 5.008 0.924 29.524
113 240.69 2931.881 56.166 34.609 4.285 0.792 32.61
114 240.69 2931.853 60.348 33.829 3.988 0.64 31.009
115 240.69 2930.808 52.325 31.798 4.6 0.861 30.012
116 240.69 2930.658 86.159 36.193 2.794 0.537 32.67
117 240.69 2930.847 114.987 39.829 2.093 0.336 35.549
118 240.69 2928.601 34.213 28.969 7.035 1.722 27.722
119 240.69 2928.709 49.088 29.784 4.903 0.934 28.275
(sigue en la pagina siguiente)
ccclxvii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.5: Continuacion de la tabla parametros hidrau-
licos TR = 50 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
120 240.69 2928.395 59.788 35.19 4.026 0.814 33.719
121 240.69 2927.556 46.248 35.251 5.204 1.291 34.58
122 240.69 2927.528 55.414 38.667 4.344 1.086 37.851
123 240.69 2927.419 61.383 40.272 3.921 0.789 39.406
124 240.69 2926.62 47.626 33.143 5.054 1.23 32.024
125 240.69 2926.788 60.527 34.073 3.977 0.747 30.648
(Fin de la tabla)
Cuadro D.6: Resultados parametros hidraulicos TR = 100
anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
1 339.23 2973.042 66.33 35.22 5.114 0.819 29.703
2 339.23 2972.023 52.4 25.699 6.474 1.201 21.468
3 339.23 2971.959 54.836 26.327 6.186 1.16 21.525
4 339.23 2971.789 67.909 39.74 4.995 0.966 34.336
5 339.23 2971.335 64.743 35.995 5.24 0.925 31.634
6 339.23 2971.792 90.596 39.701 3.744 0.619 33.471
7 339.23 2970.202 49.233 33.314 6.89 1.504 30.032
8 339.23 2971.624 104.383 40.856 3.25 0.486 34.123
9 339.23 2969.468 45.848 25.622 7.399 1.523 23.19
10 339.23 2971.688 120.167 43.271 2.823 0.419 37.075
(sigue en la pagina siguiente)
ccclxviii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
11 339.23 2969.37 45.775 23.724 7.411 1.557 21.252
12 339.23 2971.296 108.622 35.816 3.123 0.485 28.745
13 339.23 2971.432 125.638 41.691 2.7 0.372 34.479
14 339.23 2971.558 152.433 43.598 2.225 0.303 36.833
15 339.23 2971.564 164.8 44.695 2.058 0.28 40
16 339.23 2971.573 185.169 47.002 1.832 0.229 40
17 339.23 2971.604 182.007 47.078 1.864 0.233 40
18 339.23 2971.591 181.327 48.139 1.871 0.234 39.941
19 339.23 2971.577 173.8 48.562 1.952 0.227 39.714
20 339.23 2971.494 156.071 47.734 2.174 0.255 40
21 339.23 2967.829 41.433 19.171 8.187 1.347 15.548
22 339.23 2966.597 54.866 24.494 6.183 1.05 22.564
23 339.23 2967.49 117.825 36.25 2.879 0.437 33.252
24 339.23 2964.359 39.575 26.226 8.572 1.806 25.037
25 339.23 2966.254 79.931 28.836 4.244 0.662 22.401
26 339.23 2965.062 52.156 19.976 6.504 1.038 15.073
27 339.23 2964.063 45.794 19.672 7.408 1.365 15.782
28 339.23 2964.067 50.336 21.482 6.739 1.075 16.825
29 339.23 2963.074 41.337 19.062 8.207 1.51 16.1
30 339.23 2963.094 47.604 20.437 7.126 1.307 16.662
31 339.23 2963.149 58.416 22.336 5.807 0.917 18.876
32 339.23 2962.238 49.136 20.584 6.904 1.155 17.684
(sigue en la pagina siguiente)
ccclxix
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
33 339.23 2963.313 88.641 36.102 3.827 0.563 30.485
34 339.23 2961.618 47.837 20.081 7.091 1.129 17.092
35 339.23 2963.326 117.187 37.215 2.895 0.386 30.619
36 339.23 2960.149 40.441 22.152 8.388 1.675 19.812
37 339.23 2962.819 133.342 44.513 2.544 0.355 37.017
38 339.23 2962.923 160.24 47.289 2.117 0.293 36.015
39 339.23 2959.074 37.375 23.354 9.076 1.84 22.088
40 339.23 2961.517 141.772 47.726 2.393 0.344 40
41 339.23 2961.415 133.517 47.919 2.541 0.336 40
42 339.23 2959.406 49.087 24.726 6.911 1.13 21.236
43 339.23 2958.219 50.393 25.659 6.732 1.326 24.261
44 339.23 2957.597 48.013 32.134 7.065 1.594 31.303
45 339.23 2958.609 83.291 36.147 4.073 0.649 32.15
46 339.23 2958.74 85.764 31.021 3.955 0.62 26.532
47 339.23 2956.844 45.872 25.281 7.395 1.574 22.885
48 339.23 2958.596 93.364 31.226 3.633 0.519 27.555
49 339.23 2958.544 89.36 29.954 3.796 0.545 27.251
50 339.23 2956.021 41.78 22.632 8.119 1.664 21.072
51 339.23 2958.307 109.226 38.389 3.106 0.457 34.274
52 339.23 2958.431 130.778 40.233 2.594 0.377 36.103
53 339.23 2958.442 137.865 41.95 2.461 0.325 37.938
54 339.23 2955.35 40.51 20.78 8.374 1.707 18.755
(sigue en la pagina siguiente)
ccclxx
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
55 339.23 2957.715 102.887 37.217 3.297 0.436 33.357
56 339.23 2954.406 38.13 27.723 8.897 1.793 26.62
57 339.23 2956.938 117.967 35.968 2.876 0.409 31.73
58 339.23 2954.287 43.003 25.965 7.889 1.629 24.782
59 339.23 2956.461 109.719 31.949 3.092 0.462 27.544
60 339.23 2956.583 127.33 35.313 2.664 0.357 30.697
61 339.23 2956.586 125.133 32.809 2.711 0.363 27.88
62 339.23 2956.607 128.702 34.999 2.636 0.325 27.883
63 339.23 2956.565 121.482 38.039 2.792 0.345 29.368
64 339.23 2953.718 46.742 34.173 7.257 1.055 27.246
65 339.23 2953.54 41.701 28.892 8.135 1.205 37.253
66 339.23 2953.184 45.53 19.145 7.451 1.149 13.83
67 339.23 2952.472 48.685 20.935 6.968 1.177 16.843
68 339.23 2953.433 82.533 29.235 4.11 0.558 23.425
69 339.23 2952.522 56.803 24.758 5.972 0.887 21.762
70 339.23 2952.148 56.447 24.588 6.01 0.931 22.212
71 339.23 2951.401 48.683 23.686 6.968 1.189 21.715
72 339.23 2950.907 47.372 25.064 7.161 1.318 23.869
73 339.23 2950.927 59.61 30.254 5.691 0.936 28.699
74 339.23 2952.206 99.743 32.148 3.401 0.483 27.661
75 339.23 2951.997 96.283 33.019 3.523 0.512 28.084
76 339.23 2952.11 93.478 31.305 3.629 0.521 28.547
(sigue en la pagina siguiente)
ccclxxi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
77 339.23 2951.945 87.739 28.87 3.866 0.513 25.86
78 339.23 2950.323 47.612 19.112 7.125 1.115 15.83
79 339.23 2952.26 102.329 31.982 3.315 0.429 27.85
80 339.23 2948.429 36.076 19.204 9.403 1.993 17.245
81 339.23 2950.236 72.844 25.92 4.657 0.66 21.779
82 339.23 2949.21 52.445 21.709 6.468 1.026 17.941
83 339.23 2948.26 45.722 19.917 7.419 1.346 16.941
84 339.23 2948.426 56.938 23.641 5.958 0.921 20.607
85 339.23 2947.691 50.915 24.366 6.663 1.132 21.65
86 339.23 2947.232 49.707 24.934 6.825 1.244 22.189
87 339.23 2947.351 54.398 22.046 6.236 0.973 17.698
88 339.23 2946.541 48.223 19.913 7.035 1.073 14.98
89 339.23 2945.922 46.214 18.964 7.34 1.074 13.419
90 339.23 2945.683 44.122 18.082 7.688 1.154 13.848
91 339.23 2945.207 52.714 23.302 6.435 1.022 21.374
92 339.23 2945.409 61.185 24.677 5.544 0.859 22.269
93 339.23 2944.658 60.14 23.246 5.641 0.849 20.391
94 339.23 2944.156 64.654 24.386 5.247 0.838 21.679
95 339.23 2943.153 51.457 20.411 6.592 1.054 16.486
96 339.23 2942.145 55.673 22.397 6.093 1.078 18.933
97 339.23 2940.405 47.385 21.64 7.159 1.269 18.467
98 339.23 2940.812 69.219 30.122 4.901 0.726 26.725
(sigue en la pagina siguiente)
ccclxxii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
99 339.23 2940.464 91.327 34.227 3.714 0.572 30.411
100 339.23 2937.594 39.666 23.119 8.552 1.75 21.797
101 339.23 2939.897 120.758 39.782 2.809 0.401 35.682
102 339.23 2940.031 147.878 42.391 2.294 0.323 36.632
103 339.23 2940.146 179.767 45.598 1.887 0.241 38.398
104 339.23 2937.091 41.98 21.774 8.081 1.26 46.087
105 339.23 2936.284 51.395 20.158 6.6 1.006 16.39
106 339.23 2935.669 57.845 32.132 5.865 0.964 28.376
107 339.23 2936.955 131.495 39.97 2.58 0.335 33.109
108 339.23 2932.433 34.067 21.378 9.958 1.997 20.11
109 339.23 2935.038 118.904 43.288 2.853 0.402 80
110 339.23 2931.907 39.778 22.846 8.528 1.922 21.211
111 339.23 2932.933 66.573 32.937 5.096 0.81 29.817
112 339.23 2931.967 50.305 31.94 6.743 1.229 29.679
113 339.23 2932.083 62.808 35.382 5.401 0.966 33.143
114 339.23 2932.392 77.348 35.589 4.386 0.661 32.105
115 339.23 2931.885 85.463 34.714 3.969 0.635 31.502
116 339.23 2930.873 93.208 36.756 3.64 0.674 32.943
117 339.23 2928.831 46.158 34.344 7.349 1.688 32.726
118 339.23 2929.629 63.087 31.252 5.377 1.039 28.442
119 339.23 2929.181 62.569 31.047 5.422 0.956 28.91
120 339.23 2929.652 103.048 38.31 3.292 0.543 35.092
(sigue en la pagina siguiente)
ccclxxiii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.6: Continuacion de la tabla parametros hidrau-
licos TR = 100 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
121 339.23 2927.61 48.136 35.489 7.047 1.72 34.755
122 339.23 2927.746 63.737 39.619 5.322 1.25 38.552
123 339.23 2928.29 96.216 43.397 3.526 0.611 40
124 339.23 2926.668 49.15 33.367 6.902 1.657 32.145
125 339.23 2926.978 66.42 35.207 5.107 0.929 31.378
(Fin de la tabla)
Cuadro D.7: Resultados parametros hidraulicos TR = 200
anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
1 449.19 2976.109 186.375 54.084 2.41 0.29 39.788
2 449.19 2971.686 45.608 22.762 9.849 1.941 18.817
3 449.19 2974.559 149.519 50.818 3.004 0.409 38.445
4 449.19 2971.285 51.374 35.175 8.744 1.873 41.539
5 449.19 2972.955 123.434 46.667 3.639 0.525 38.412
6 449.19 2973.169 139.959 47.349 3.209 0.453 37.701
7 449.19 2973.234 146.753 48.369 3.061 0.43 37.494
8 449.19 2973.344 167.409 49.005 2.683 0.342 38.265
9 449.19 2969.605 49.18 27.928 9.134 1.829 25.363
10 449.19 2972.237 140.806 45.539 3.19 0.448 38.107
11 449.19 2970.025 60.515 30.104 7.423 1.377 26.921
(sigue en la pagina siguiente )
ccclxxiv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
12 449.19 2969.965 70.521 31.801 6.37 1.194 28.511
13 449.19 2969.805 73.324 34.604 6.126 1.011 31.532
14 449.19 2971.044 133.67 41.818 3.36 0.481 36.284
15 449.19 2968.558 61.158 29.426 7.345 1.484 28.169
16 449.19 2971.05 164.234 45.432 2.735 0.357 40
17 449.19 2971.129 163.014 45.654 2.756 0.357 40
18 449.19 2971.096 161.552 46.654 2.78 0.361 39.941
19 449.19 2971.058 153.175 47.004 2.933 0.354 39.714
20 449.19 2970.746 126.152 45.49 3.561 0.44 40
21 449.19 2969.877 83.894 34.864 5.354 0.709 30.06
22 449.19 2966.816 59.903 25.428 7.499 1.236 23.388
23 449.19 2965.571 57.57 29.654 7.803 1.573 28.494
24 449.19 2968.102 143.27 36.361 3.135 0.407 30.824
25 449.19 2968.038 132.928 45.502 3.379 0.441 34.991
26 449.19 2965.217 54.504 20.323 8.241 1.291 15.214
27 449.19 2964.374 50.728 20.356 8.855 1.554 16.04
28 449.19 2964.894 65.339 24.825 6.875 0.999 19.56
29 449.19 2964.728 69.862 23.111 6.43 0.951 18.416
30 449.19 2964.394 71.585 24.889 6.275 0.963 20.226
31 449.19 2963.727 69.72 24.165 6.443 0.953 20.292
32 449.19 2963.392 75.411 30.58 5.957 0.868 27.13
33 449.19 2963.191 84.955 35.69 5.287 0.787 30.366
(sigue en la pagina siguiente )
ccclxxv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
34 449.19 2962.79 79.386 36.208 5.658 0.793 30.63
35 449.19 2962.987 106.852 36.142 4.204 0.578 30.413
36 449.19 2963.177 124.737 40.243 3.601 0.487 33.113
37 449.19 2963.366 154.063 47.383 2.916 0.387 38.707
38 449.19 2963.491 180.721 48.995 2.486 0.327 36.015
39 449.19 2963.571 199.61 51.736 2.25 0.272 37.18
40 449.19 2963.656 227.326 54.142 1.976 0.237 40
41 449.19 2963.608 221.238 54.498 2.03 0.229 40
42 449.19 2959.342 47.79 22.895 9.399 1.55 19.444
43 449.19 2958.092 47.316 25.251 9.493 1.918 23.943
44 449.19 2960.588 146.079 40.548 3.075 0.439 35.805
45 449.19 2960.55 148.835 41.413 3.018 0.395 35.477
46 449.19 2960.491 135.217 36.196 3.322 0.437 30.264
47 449.19 2960.607 148.065 44.278 3.034 0.395 80
48 449.19 2960.664 164.093 47.596 2.737 0.329 40
49 449.19 2960.652 166.058 47.487 2.705 0.325 40
50 449.19 2956.176 45.064 23.031 9.968 1.98 21.323
51 449.19 2958.926 131.642 42.636 3.412 0.472 37.194
52 449.19 2956 53.279 28.563 8.431 1.735 27.057
53 449.19 2958.221 129.589 40.598 3.466 0.467 37.054
54 449.19 2958.378 132.073 41.086 3.401 0.464 36.156
55 449.19 2958.234 121.089 41.487 3.71 0.471 41.281
(sigue en la pagina siguiente )
ccclxxvi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
56 449.19 2958.682 179.563 45.357 2.502 0.307 40
57 449.19 2958.675 176.738 41.7 2.542 0.312 35.34
58 449.19 2958.639 166.284 40.121 2.701 0.332 33.571
59 449.19 2958.714 183.076 41.375 2.454 0.3 34.352
60 449.19 2958.77 202.518 43.826 2.218 0.252 36.024
61 449.19 2958.772 203.284 46.773 2.21 0.251 38.622
62 449.19 2958.774 207.988 49.391 2.16 0.231 39.416
63 449.19 2958.78 208.559 55.131 2.154 0.231 40
64 449.19 2953.78 48.455 34.428 9.27 1.339 27.36
65 449.19 2953.665 45.005 34.275 9.981 1.459 27.429
66 449.19 2953.435 49.058 19.912 9.156 1.372 14.294
67 449.19 2952.974 57.348 22.277 7.833 1.239 17.684
68 449.19 2954.771 120.583 40.344 3.725 0.454 31.857
69 449.19 2952.613 58.817 25.269 7.637 1.123 22.234
70 449.19 2952.331 60.61 25.702 7.411 1.124 23.258
71 449.19 2951.767 56.915 25.39 7.892 1.281 23.244
72 449.19 2953.219 118.363 38.224 3.795 0.525 35.679
73 449.19 2953.189 128.768 36.757 3.488 0.454 32.296
74 449.19 2953.489 135.779 34.986 3.308 0.42 28.542
75 449.19 2953.303 133.617 36.05 3.362 0.433 29.196
76 449.19 2953.463 134.784 35.795 3.333 0.424 31.675
77 449.19 2953.402 129.156 34.84 3.478 0.413 30.965
(sigue en la pagina siguiente )
ccclxxvii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
78 449.19 2950.787 55.203 20.604 8.137 1.208 16.98
79 449.19 2950.413 60.123 23.054 7.471 1.157 20.116
80 449.19 2952.502 136.1 37.222 3.3 0.419 32.836
81 449.19 2952.379 130.639 37.535 3.438 0.409 32.082
82 449.19 2949.143 51.253 21.352 8.764 1.402 17.615
83 449.19 2950.781 103.377 34.286 4.345 0.585 29.776
84 449.19 2948.184 52.184 21.713 8.608 1.37 18.79
85 449.19 2949.892 114.047 37.978 3.939 0.525 32.621
86 449.19 2950.248 137.622 42.272 3.264 0.422 36.658
87 449.19 2947.388 55.063 22.186 8.158 1.267 17.814
88 449.19 2946.616 49.35 20.125 9.102 1.377 15.109
89 449.19 2946.072 48.228 19.266 9.314 1.342 13.451
90 449.19 2945.983 48.305 18.719 9.299 1.352 14.062
91 449.19 2945.806 65.91 25.156 6.815 1.01 22.747
92 449.19 2945.452 62.142 24.888 7.228 1.114 22.456
93 449.19 2944.744 61.898 23.559 7.257 1.082 20.652
94 449.19 2944.328 68.412 25.023 6.566 1.027 22.207
95 449.19 2943.495 57.228 21.424 7.849 1.204 17.207
96 449.19 2942.83 69.006 24.159 6.509 1.047 19.992
97 449.19 2941.775 75.619 30.652 5.94 0.883 26.201
98 449.19 2941.389 86.428 34.903 5.197 0.726 30.574
99 449.19 2941.619 126.947 38.005 3.538 0.484 31.32
(sigue en la pagina siguiente )
ccclxxviii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
100 449.19 2941.959 172.648 43.076 2.602 0.319 34.728
101 449.19 2942.041 201.439 48.504 2.23 0.266 39.561
102 449.19 2942.127 228.582 50.752 1.965 0.233 40
103 449.19 2942.17 259.558 52.378 1.731 0.192 40
104 449.19 2937.17 43.386 23.93 10.353 1.6 47.434
105 449.19 2936.443 54.105 21.811 8.302 1.244 17.953
106 449.19 2935.988 66.91 33.147 6.713 1.06 28.581
107 449.19 2935.077 72.182 30.513 6.223 0.972 32.46
108 449.19 2934.257 75.519 28.833 5.948 0.91 26.42
109 449.19 2933.616 72.986 30.683 6.154 1.019 27.351
110 449.19 2934.812 128.369 38.991 3.499 0.504 33.537
111 449.19 2933.138 72.719 33.559 6.177 0.958 30.179
112 449.19 2932.377 62.652 33.322 7.17 1.227 30.56
113 449.19 2933.176 99.995 38.437 4.492 0.694 34.76
114 449.19 2932.181 70.633 34.901 6.359 0.981 31.677
115 449.19 2931.464 72.32 33.575 6.211 1.05 30.919
116 449.19 2930.03 65.912 34.551 6.815 1.49 31.872
117 449.19 2931.428 135.883 41.41 3.306 0.496 36.363
118 449.19 2929.872 70.018 31.791 6.415 1.188 28.612
119 449.19 2929.829 81.581 32.782 5.506 0.887 29.783
120 449.19 2928.759 72.154 36.095 6.225 1.175 34.117
121 449.19 2928.528 80.939 38.274 5.55 1.093 36.331
(sigue en la pagina siguiente )
ccclxxix
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.7: Continuacion de la tabla parametros hidrau-
licos TR = 200 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
122 449.19 2927.911 70.125 40.338 6.406 1.442 39.082
123 449.19 2928.949 122.546 45.372 3.665 0.582 40
124 449.19 2927.033 61.052 35.092 7.357 1.608 33.07
125 449.19 2928.438 116.323 43.919 3.862 0.579 36.983
(Fin de la tabla)
Cuadro D.8: Resultados parametros hidraulicos TR = 500
anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
1 609.92 2973.869 97.25 47.364 6.272 0.913 39.788
2 609.92 2973.677 110.277 46.841 5.531 0.822 39.116
3 609.92 2973.294 100.866 47.021 6.047 0.939 38.445
4 609.92 2973.736 140.678 48.618 4.336 0.64 37.882
5 609.92 2971.748 78.357 39.552 7.784 1.295 34.335
6 609.92 2972.892 129.515 46.517 4.709 0.684 37.701
7 609.92 2971.227 80.079 36.756 7.616 1.367 30.487
8 609.92 2971.503 100.283 40.221 6.082 0.922 33.75
9 609.92 2970.945 90.215 38.037 6.761 1.095 32.451
10 609.92 2972.418 147.756 46.289 4.128 0.57 38.449
11 609.92 2970.843 87.746 40.802 6.951 1.141 35.79
12 609.92 2970.706 91.682 34.032 6.653 1.113 28.623
(sigue en la pagina siguiente)
ccclxxx
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
13 609.92 2971.78 137.925 43.97 4.422 0.591 36.021
14 609.92 2972.156 175.43 48.473 3.477 0.45 40
15 609.92 2972.189 189.826 46.572 3.213 0.414 40
16 609.92 2972.192 209.946 48.86 2.905 0.347 40
17 609.92 2972.283 209.158 49.115 2.916 0.347 40
18 609.92 2972.247 207.511 50.106 2.939 0.35 39.941
19 609.92 2972.209 198.88 50.456 3.067 0.343 39.714
20 609.92 2969.719 88.234 31.616 6.913 0.928 27.745
21 609.92 2970.376 100.208 40.074 6.087 0.773 34.874
22 609.92 2967.481 76.266 28.163 7.997 1.215 25.768
23 609.92 2969.847 202.644 45.997 3.01 0.369 40
24 609.92 2969.971 214.766 50.118 2.84 0.322 40
25 609.92 2969.961 206.841 56.018 2.949 0.335 40
26 609.92 2965.808 63.67 21.751 9.579 1.404 15.962
27 609.92 2968.719 158.075 42.233 3.858 0.445 30.896
28 609.92 2964.983 67.089 25.2 9.091 1.309 19.87
29 609.92 2964.905 73.154 23.547 8.338 1.21 18.667
30 609.92 2964.749 78.937 26.093 7.727 1.14 21.185
31 609.92 2964.437 85.384 28.82 7.143 0.984 24.57
32 609.92 2964.812 119.045 37.969 5.123 0.656 32.169
33 609.92 2965.408 154.683 43.227 3.943 0.482 32.537
34 609.92 2962.465 69.499 35.023 8.776 1.27 30.206
(sigue en la pagina siguiente)
ccclxxxi
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
35 609.92 2962.337 87.208 34.081 6.994 1.025 30.019
36 609.92 2962.082 89.591 35.711 6.808 1.026 31.043
37 609.92 2961.571 88.947 39.23 6.857 1.098 34.559
38 609.92 2963.201 170.267 48.124 3.582 0.483 36.015
39 609.92 2963.403 193.367 51.233 3.154 0.386 37.18
40 609.92 2963.589 224.656 53.942 2.715 0.328 40
41 609.92 2963.487 216.4 54.135 2.818 0.32 40
42 609.92 2960.579 83.965 38.328 7.264 1.039 33.834
43 609.92 2960.565 116.887 35.776 5.218 0.747 32.424
44 609.92 2960.538 144.262 40.372 4.228 0.607 35.679
45 609.92 2960.437 144.857 41.095 4.211 0.556 35.267
46 609.92 2958.476 78.884 29.536 7.732 1.253 25.281
47 609.92 2959.949 126.323 35.593 4.828 0.666 30.697
48 609.92 2960.206 145.781 45.67 4.184 0.52 80
49 609.92 2958.057 76.823 26.96 7.939 1.2 24.454
50 609.92 2957.522 75.51 27.3 8.077 1.301 24.464
51 609.92 2959.07 137.008 43.279 4.452 0.607 37.519
52 609.92 2959.419 168.873 46.558 3.612 0.478 40
53 609.92 2956.67 77.851 31.626 7.834 1.239 29.594
54 609.92 2958.465 135.399 45.226 4.505 0.61 40
55 609.92 2958.079 115.54 39.612 5.279 0.678 35.537
56 609.92 2959.039 193.826 46.426 3.147 0.376 40
(sigue en la pagina siguiente)
ccclxxxii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
57 609.92 2959.015 188.813 42.502 3.23 0.387 35.653
58 609.92 2958.948 176.709 40.795 3.452 0.415 33.762
59 609.92 2959.078 195.615 42.161 3.118 0.372 34.566
60 609.92 2959.171 216.989 44.645 2.811 0.312 36.142
61 609.92 2959.177 218.979 47.662 2.785 0.309 38.887
62 609.92 2959.179 224.006 50.309 2.723 0.285 39.732
63 609.92 2959.194 225.092 56.371 2.71 0.284 40
64 609.92 2954.194 59.919 36.114 10.179 1.412 28.113
65 609.92 2954.492 68.273 37.583 8.934 1.206 28.863
66 609.92 2955.088 96.312 40.774 6.333 0.813 31.785
67 609.92 2956.28 147.8 46.496 4.127 0.485 35.411
68 609.92 2956.703 184.68 53.162 3.303 0.355 40
69 609.92 2952.863 64.514 26.52 9.454 1.355 23.365
70 609.92 2952.83 73.139 30.525 8.339 1.199 27.941
71 609.92 2952.764 82.675 32.928 7.377 1.068 30.366
72 609.92 2954.023 148.279 41.906 4.113 0.531 38.372
73 609.92 2953.841 150.163 38.593 4.062 0.502 33.284
74 609.92 2954.249 157.677 36.669 3.868 0.464 29.064
75 609.92 2953.949 152.709 37.648 3.994 0.489 29.895
76 609.92 2954.243 159.86 37.835 3.815 0.458 32.665
77 609.92 2951.646 80.154 27.646 7.609 1.037 24.804
78 609.92 2952.132 80.387 25.016 7.587 0.991 20.462
(sigue en la pagina siguiente)
ccclxxxiii
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
79 609.92 2953.104 127.205 35.694 4.795 0.581 31.142
80 609.92 2953.68 176.314 40.773 3.459 0.403 35.484
81 609.92 2953.499 168.111 41.073 3.628 0.401 34.822
82 609.92 2950.078 69.8 26.163 8.738 1.258 21.953
83 609.92 2949.997 81.799 29.102 7.456 1.083 25.017
84 609.92 2951.215 137.158 39.726 4.447 0.535 33.17
85 609.92 2951.772 183.146 49.922 3.33 0.385 40
86 609.92 2951.873 201.926 50.077 3.021 0.347 40
87 609.92 2951.633 174.743 48.671 3.49 0.383 40
88 609.92 2946.633 49.607 20.173 12.295 1.857 15.138
89 609.92 2946.106 48.697 19.943 12.525 1.799 14.073
90 609.92 2946.051 49.261 18.863 12.381 1.788 14.11
91 609.92 2945.942 69.035 25.79 8.835 1.29 23.295
92 609.92 2945.724 68.401 26.227 8.917 1.333 23.644
93 609.92 2948.329 166.587 42.838 3.661 0.409 33.696
94 609.92 2948.46 189.448 42.77 3.219 0.357 32.306
95 609.92 2943.46 56.621 21.319 10.772 1.659 17.133
96 609.92 2942.76 67.596 23.977 9.023 1.464 19.883
97 609.92 2941.633 71.975 29.686 8.474 1.279 25.302
98 609.92 2941.106 77.802 34.003 7.839 1.126 30.396
99 609.92 2941.053 109.353 36.143 5.578 0.805 30.858
100 609.92 2940.945 137.884 39.737 4.423 0.587 33.893
(sigue en la pagina siguiente)
ccclxxxiv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
101 609.92 2941.314 173.14 45.545 3.523 0.444 38.246
102 609.92 2941.492 203.275 48.45 3 0.373 39.397
103 609.92 2941.686 240.178 50.924 2.539 0.291 40
104 609.92 2941.45 205.149 56.747 2.973 0.325 40
105 609.92 2936.45 54.233 22.011 11.246 1.683 18.148
106 609.92 2936.002 67.317 33.193 9.06 1.428 28.59
107 609.92 2935.106 72.988 31.018 8.356 1.301 32.823
108 609.92 2934.314 77.031 29.157 7.918 1.203 26.723
109 609.92 2933.73 76.113 31.301 8.013 1.307 27.871
110 609.92 2935.116 138.639 40.545 4.399 0.615 34.709
111 609.92 2934.492 115.565 38.131 5.278 0.713 33.098
112 609.92 2935.086 153.312 42.455 3.978 0.511 36.385
113 609.92 2935.339 179.518 45.425 3.398 0.427 39.058
114 609.92 2932.248 72.763 35.12 8.382 1.283 31.813
115 609.92 2931.598 76.48 33.938 7.975 1.324 31.105
116 609.92 2930.299 74.509 35.253 8.186 1.687 32.213
117 609.92 2932.501 175.553 44.022 3.474 0.469 37.453
118 609.92 2930.336 83.358 32.821 7.317 1.26 28.936
119 609.92 2929.755 79.404 32.586 7.681 1.249 29.684
120 609.92 2931.184 158.102 42.111 3.858 0.536 36.766
121 609.92 2928.356 74.733 37.848 8.161 1.662 36.142
122 609.92 2930.732 182.649 48.464 3.339 0.485 40
(sigue en la pagina siguiente)
ccclxxxv
Apendice D. RESULTADOS DEL PROGRAMA
Cuadro D.8: Continuacion de la tabla parametros hidrau-
licos TR = 500 anos
Sta Q (m3/s) Elev (m) Area(m2) Perım (m) V(m/s) Froude Ancho (m)
123 609.92 2930.857 198.862 51.096 3.067 0.401 40
124 609.92 2927.198 66.543 35.871 9.166 1.93 33.488
125 609.92 2929.098 141.768 48.547 4.302 0.602 40
(Fin de la tabla)
ccclxxxvi
Apendice E
PLANOS
Los planos corresponden a:
Componente hidrologico
Plano Cartografico del cuenca
Plano Red Topologico de la cuenca
Plano Altitudinal de la cuenca.
Plano perfil longitudinal del cauce principal
Componente hidraulico
Planos planta y secciones transversales del rıo Huallaga.
ccclxxxvii