TESIS PLEDR

388
Universidad Nacional San Crist ´ obal 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 Simulaci´on de Defensas Ribere˜ nas con ObjectARX C++ Presentado por : Ayala Bizarro, Iv´ an Arturo Ayacucho Per ´ u 2009

Transcript of TESIS PLEDR

Page 1: 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

Page 2: TESIS PLEDR

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

[email protected]

Escuela Profesional de Ingenierıa Civil

Universidad Nacional San Cristobal de Huamanga

Ayacucho, Agosto de 2009.

i

Page 3: TESIS PLEDR

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

Page 4: TESIS PLEDR

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

Page 5: TESIS PLEDR

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.

Page 6: TESIS PLEDR

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

Page 7: TESIS PLEDR

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.

Page 8: TESIS PLEDR

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

Page 9: TESIS PLEDR

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

Page 10: TESIS PLEDR

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

Page 11: TESIS PLEDR

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

Page 12: TESIS PLEDR

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

Page 13: TESIS PLEDR

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

Page 14: TESIS PLEDR

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

Page 15: TESIS PLEDR

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

Page 16: TESIS PLEDR

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

Page 17: TESIS PLEDR

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

Page 18: TESIS PLEDR

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

Page 19: TESIS PLEDR

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

Page 20: TESIS PLEDR

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

Page 21: TESIS PLEDR

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

Page 22: TESIS PLEDR

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

Page 23: TESIS PLEDR

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

Page 24: TESIS PLEDR

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

Page 25: TESIS PLEDR

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

Page 26: TESIS PLEDR

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

Page 27: TESIS PLEDR

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

Page 28: TESIS PLEDR

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

Page 29: TESIS PLEDR

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

Page 30: TESIS PLEDR

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

Page 31: TESIS PLEDR

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

Page 32: TESIS PLEDR

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

Page 33: TESIS PLEDR

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

Page 34: TESIS PLEDR

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

Page 35: TESIS PLEDR

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

Page 36: TESIS PLEDR

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

Page 37: TESIS PLEDR

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

Page 38: TESIS PLEDR

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

Page 39: TESIS PLEDR

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

Page 40: TESIS PLEDR

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

Page 41: TESIS PLEDR

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

Page 42: TESIS PLEDR

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

Page 43: TESIS PLEDR

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

Page 44: TESIS PLEDR

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

Page 45: TESIS PLEDR

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

Page 46: TESIS PLEDR

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

Page 47: TESIS PLEDR

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

Page 48: TESIS PLEDR

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

Page 49: TESIS PLEDR

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

Page 50: TESIS PLEDR

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

Page 51: TESIS PLEDR

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

Page 52: TESIS PLEDR

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

Page 53: TESIS PLEDR

2.6. Diagramas de Flujo

       

            

      

          V  

  

            F 

  

  

 

                   

Hietogram

a IILA 

SENAMHI 

Hietogram

a NRC

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

,

á,

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

Page 54: TESIS PLEDR

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

Page 55: TESIS PLEDR

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

Page 56: TESIS PLEDR

2.6. Diagramas de Flujo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  HIDROGRAMA UNITARIO 

SINTÉTICO NRCS

Tlag, DT, dt 

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

Page 57: TESIS PLEDR

2.6. Diagramas de Flujo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INICIO  HIDROGRAMA UNITARIO 

SINTÉTICO SNYDER

, , , ,

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

Page 58: TESIS PLEDR

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

Page 59: TESIS PLEDR

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

Page 60: TESIS PLEDR

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

Page 61: TESIS PLEDR

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

Page 62: TESIS PLEDR

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

Page 63: TESIS PLEDR

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

Page 64: TESIS PLEDR

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

Page 65: TESIS PLEDR

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

Page 66: TESIS PLEDR

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

+ 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

Page 67: TESIS PLEDR

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

Page 68: TESIS PLEDR

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

Page 69: TESIS PLEDR

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

Page 70: TESIS PLEDR

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

Page 71: TESIS PLEDR

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

Page 72: TESIS PLEDR

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

Page 73: TESIS PLEDR

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

Page 74: TESIS PLEDR

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

Page 75: TESIS PLEDR

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

Page 76: TESIS PLEDR

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

Page 77: TESIS PLEDR

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

Page 78: TESIS PLEDR

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

Page 79: TESIS PLEDR

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

Page 80: TESIS PLEDR

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

Page 81: TESIS PLEDR

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

Page 82: TESIS PLEDR

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

Page 83: TESIS PLEDR

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

Page 84: TESIS PLEDR

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

Page 85: TESIS PLEDR

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

Page 86: TESIS PLEDR

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

Page 87: TESIS PLEDR

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

Page 88: TESIS PLEDR

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

Page 89: TESIS PLEDR

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

Page 90: TESIS PLEDR

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

Page 91: TESIS PLEDR

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

Page 92: TESIS PLEDR

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

Page 93: TESIS PLEDR

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

Page 94: TESIS PLEDR

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

Page 95: TESIS PLEDR

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

Page 96: TESIS PLEDR

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

Page 97: TESIS PLEDR

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

Page 98: TESIS PLEDR

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

Page 99: TESIS PLEDR

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

Page 100: TESIS PLEDR

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

Page 101: TESIS PLEDR

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

Page 102: TESIS PLEDR

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

Page 103: TESIS PLEDR

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

Page 104: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Page 105: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(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

Page 106: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Page 107: TESIS PLEDR

 

 

 

 

 

 

 

 

               

              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

Page 108: TESIS PLEDR

 

 

 

 

                  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

Page 109: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

   

   

 

 

 

 

 

   

   

 

 

 

 

 

(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

Page 110: TESIS PLEDR

 

 

 

 

 

 

   

   

 

 

 

 

 

   

   

 

 

 

 

 

 

 

 

 

 

(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

Page 111: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(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

Page 112: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(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

Page 113: TESIS PLEDR

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

Page 114: TESIS PLEDR

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

Page 115: TESIS PLEDR

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

Page 116: TESIS PLEDR

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

Page 117: TESIS PLEDR

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

Page 118: TESIS PLEDR

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

Page 119: TESIS PLEDR

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

Page 120: TESIS PLEDR

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

Page 121: TESIS PLEDR

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

Page 122: TESIS PLEDR

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

Page 123: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Page 124: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(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

Page 125: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Page 126: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 <NC < 0.05

0.43   

0.05 ≤ NC ≤ 1000

 X = Interpolación (NC)

F

F

V

V

 NC > 1000 

  1.30 10 NC 2.44 10 0.304

FV

... 2

5.4. Diagramas de flujo

cxxv

Page 127: TESIS PLEDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(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

Page 128: TESIS PLEDR

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

Page 129: TESIS PLEDR

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

Page 130: TESIS PLEDR

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

Page 131: TESIS PLEDR

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

Page 132: TESIS PLEDR

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

Page 133: TESIS PLEDR

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

Page 134: TESIS PLEDR

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

Page 135: TESIS PLEDR

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

Page 136: TESIS PLEDR

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

Page 137: TESIS PLEDR

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

Page 138: TESIS PLEDR

6.3. Calculos y Resultados Hidrologicos

Figura 6.20: Hidrograma TR = 50 anos

Figura 6.21: Hidrograma TR = 100 anos

cxxxvii

Page 139: TESIS PLEDR

6.3. Calculos y Resultados Hidrologicos

Figura 6.22: Hidrograma TR = 200 anos

Figura 6.23: Hidrograma TR = 500 anos

cxxxviii

Page 140: TESIS PLEDR

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

Page 141: TESIS PLEDR

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

Page 142: TESIS PLEDR

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

Page 143: TESIS PLEDR

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

Page 144: TESIS PLEDR

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

Page 145: TESIS PLEDR

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

Page 146: TESIS PLEDR

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

Page 147: TESIS PLEDR

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

Page 148: TESIS PLEDR

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

Page 149: TESIS PLEDR

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

Page 150: TESIS PLEDR

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

Page 151: TESIS PLEDR

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

Page 152: TESIS PLEDR

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

Page 153: TESIS PLEDR

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

Page 154: TESIS PLEDR

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

Page 155: TESIS PLEDR

Apendice A

HIDROLOGIA CODIGO FUENTE

C++

EL componente Hidrologico se organiza en 10 librerıas con multiples funciones y 07 ven-

tanas graficas

cliv

Page 156: TESIS PLEDR

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

Page 157: TESIS PLEDR

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

Page 158: TESIS PLEDR

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

Page 159: TESIS PLEDR

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

Page 160: TESIS PLEDR

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

Page 161: TESIS PLEDR

// 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

Page 162: TESIS PLEDR

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

Page 163: TESIS PLEDR

// 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

Page 164: TESIS PLEDR

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

Page 165: TESIS PLEDR

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

Page 166: TESIS PLEDR

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

Page 167: TESIS PLEDR

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

Page 168: TESIS PLEDR

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

Page 169: TESIS PLEDR

{ 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

Page 170: TESIS PLEDR

{ ::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

Page 171: TESIS PLEDR

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

Page 172: TESIS PLEDR

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

Page 173: TESIS PLEDR

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

Page 174: TESIS PLEDR

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

Page 175: TESIS PLEDR

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

Page 176: TESIS PLEDR

{ } 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

Page 177: TESIS PLEDR

{ 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

Page 178: TESIS PLEDR

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

Page 179: TESIS PLEDR

//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

Page 180: TESIS PLEDR

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

Page 181: TESIS PLEDR

#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

Page 182: TESIS PLEDR

{ 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

Page 183: TESIS PLEDR

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

Page 184: TESIS PLEDR

// 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

Page 185: TESIS PLEDR

*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

Page 186: TESIS PLEDR

{ // 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

Page 187: TESIS PLEDR

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

Page 188: TESIS PLEDR

.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

Page 189: TESIS PLEDR

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

Page 190: TESIS PLEDR

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

Page 191: TESIS PLEDR

{ 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

Page 192: TESIS PLEDR

//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

Page 193: TESIS PLEDR

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

Page 194: TESIS PLEDR

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

Page 195: TESIS PLEDR

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

Page 196: TESIS PLEDR

// 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

Page 197: TESIS PLEDR

//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

Page 198: TESIS PLEDR

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

Page 199: TESIS PLEDR

// 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

Page 200: TESIS PLEDR

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

Page 201: TESIS PLEDR

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

Page 202: TESIS PLEDR

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

Page 203: TESIS PLEDR

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

Page 204: TESIS PLEDR

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

Page 205: TESIS PLEDR

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

Page 206: TESIS PLEDR

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

Page 207: TESIS PLEDR

// 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

Page 208: TESIS PLEDR

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

Page 209: TESIS PLEDR

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

Page 210: TESIS PLEDR

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

Page 211: TESIS PLEDR

// 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

Page 212: TESIS PLEDR

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

Page 213: TESIS PLEDR

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

Page 214: TESIS PLEDR

// 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

Page 215: TESIS PLEDR

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

Page 216: TESIS PLEDR

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

Page 217: TESIS PLEDR

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

Page 218: TESIS PLEDR

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

Page 219: TESIS PLEDR

Apendice B

HIDRAULICA CODIGO FUENTE

C++

EL componente Hidraulico se organiza en 09 librerıas con multiples funciones y 03 ven-

tanas graficas

ccxviii

Page 220: TESIS PLEDR

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

Page 221: TESIS PLEDR

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

Page 222: TESIS PLEDR

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

Page 223: TESIS PLEDR

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

Page 224: TESIS PLEDR

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

Page 225: TESIS PLEDR

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

Page 226: TESIS PLEDR

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

Page 227: TESIS PLEDR

// 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

Page 228: TESIS PLEDR

// 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

Page 229: TESIS PLEDR

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

Page 230: TESIS PLEDR

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

Page 231: TESIS PLEDR

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

Page 232: TESIS PLEDR

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

Page 233: TESIS PLEDR

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

Page 234: TESIS PLEDR

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

Page 235: TESIS PLEDR

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

Page 236: TESIS PLEDR

// 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

Page 237: TESIS PLEDR

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

Page 238: TESIS PLEDR

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

Page 239: TESIS PLEDR

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

Page 240: TESIS PLEDR

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

Page 241: TESIS PLEDR

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

Page 242: TESIS PLEDR

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

Page 243: TESIS PLEDR

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

Page 244: TESIS PLEDR

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

Page 245: TESIS PLEDR

// (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

Page 246: TESIS PLEDR

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

Page 247: TESIS PLEDR

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

Page 248: TESIS PLEDR

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

Page 249: TESIS PLEDR

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

Page 250: TESIS PLEDR

// 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

Page 251: TESIS PLEDR

/*-------------------------------------------------------------------- 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

Page 252: TESIS PLEDR

// 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

Page 253: TESIS PLEDR

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

Page 254: TESIS PLEDR

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

Page 255: TESIS PLEDR

//------------------------------------------------------------------- /*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

Page 256: TESIS PLEDR

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

Page 257: TESIS PLEDR

#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

Page 258: TESIS PLEDR

*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

Page 259: TESIS PLEDR

// 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

Page 260: TESIS PLEDR

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

Page 261: TESIS PLEDR

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

Page 262: TESIS PLEDR

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

Page 263: TESIS PLEDR

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

Page 264: TESIS PLEDR

// 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

Page 265: TESIS PLEDR

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

Page 266: TESIS PLEDR

{ *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

Page 267: TESIS PLEDR

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

Page 268: TESIS PLEDR

/*-------------------------------------------------------------------- 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

Page 269: TESIS PLEDR

{ 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

Page 270: TESIS PLEDR

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

Page 271: TESIS PLEDR

{ 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

Page 272: TESIS PLEDR

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

Page 273: TESIS PLEDR

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

Page 274: TESIS PLEDR

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

Page 275: TESIS PLEDR

{ // 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

Page 276: TESIS PLEDR

// 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

Page 277: TESIS PLEDR

: 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

Page 278: TESIS PLEDR

{ 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

Page 279: TESIS PLEDR

//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

Page 280: TESIS PLEDR

// 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

Page 281: TESIS PLEDR

// 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

Page 282: TESIS PLEDR

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

Page 283: TESIS PLEDR

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

Page 284: TESIS PLEDR

// 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

Page 285: TESIS PLEDR

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

Page 286: TESIS PLEDR

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

Page 287: TESIS PLEDR

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

Page 288: TESIS PLEDR

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

Page 289: TESIS PLEDR

{ // 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

Page 290: TESIS PLEDR

// 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

Page 291: TESIS PLEDR

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

Page 292: TESIS PLEDR

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

Page 293: TESIS PLEDR

{ // 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

Page 294: TESIS PLEDR

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

Page 295: TESIS PLEDR

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

Page 296: TESIS PLEDR

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

Page 297: TESIS PLEDR

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

Page 298: TESIS PLEDR

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

Page 299: TESIS PLEDR

} 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

Page 300: TESIS PLEDR

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

Page 301: TESIS PLEDR

// 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

Page 302: TESIS PLEDR

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

Page 303: TESIS PLEDR

{ 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

Page 304: TESIS PLEDR

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

Page 305: TESIS PLEDR

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

Page 306: TESIS PLEDR

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

Page 307: TESIS PLEDR

*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

Page 308: TESIS PLEDR

// 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

Page 309: TESIS PLEDR

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

Page 310: TESIS PLEDR

// 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

Page 311: TESIS PLEDR

*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

Page 312: TESIS PLEDR

//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

Page 313: TESIS PLEDR

{ *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

Page 314: TESIS PLEDR

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

Page 315: TESIS PLEDR

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

Page 316: TESIS PLEDR

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

Page 317: TESIS PLEDR

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

Page 318: TESIS PLEDR

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

Page 319: TESIS PLEDR

// 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

Page 320: TESIS PLEDR

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

Page 321: TESIS PLEDR

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

Page 322: TESIS PLEDR

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

Page 323: TESIS PLEDR

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

Page 324: TESIS PLEDR

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

Page 325: TESIS PLEDR

{ 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

Page 326: TESIS PLEDR

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

Page 327: TESIS PLEDR

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

Page 328: TESIS PLEDR

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

Page 329: TESIS PLEDR

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

Page 330: TESIS PLEDR

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

Page 331: TESIS PLEDR

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

Page 332: TESIS PLEDR

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

Page 333: TESIS PLEDR

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

Page 334: TESIS PLEDR

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

Page 335: TESIS PLEDR

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

Page 336: TESIS PLEDR

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

Page 337: TESIS PLEDR

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

Page 338: TESIS PLEDR

{ 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

Page 339: TESIS PLEDR

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

Page 340: TESIS PLEDR

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

Page 341: TESIS PLEDR

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

Page 342: TESIS PLEDR

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

Page 343: TESIS PLEDR

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

Page 344: TESIS PLEDR

// 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

Page 345: TESIS PLEDR

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

Page 346: TESIS PLEDR

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

Page 347: TESIS PLEDR

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

Page 348: TESIS PLEDR

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

Page 349: TESIS PLEDR

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

Page 350: TESIS PLEDR

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

Page 351: TESIS PLEDR

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

Page 352: TESIS PLEDR

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

Page 353: TESIS PLEDR

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

Page 354: TESIS PLEDR

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

Page 355: TESIS PLEDR

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

Page 356: TESIS PLEDR

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

Page 357: TESIS PLEDR

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

Page 358: TESIS PLEDR

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

Page 359: TESIS PLEDR

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

Page 360: TESIS PLEDR

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

Page 361: TESIS PLEDR

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

Page 362: TESIS PLEDR

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

Page 363: TESIS PLEDR

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

Page 364: TESIS PLEDR

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

Page 365: TESIS PLEDR

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

Page 366: TESIS PLEDR

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

Page 367: TESIS PLEDR

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

Page 368: TESIS PLEDR

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

Page 369: TESIS PLEDR

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

Page 370: TESIS PLEDR

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

Page 371: TESIS PLEDR

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

Page 372: TESIS PLEDR

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

Page 373: TESIS PLEDR

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

Page 374: TESIS PLEDR

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

Page 375: TESIS PLEDR

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

Page 376: TESIS PLEDR

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

Page 377: TESIS PLEDR

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

Page 378: TESIS PLEDR

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

Page 379: TESIS PLEDR

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

Page 380: TESIS PLEDR

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

Page 381: TESIS PLEDR

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

Page 382: TESIS PLEDR

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

Page 383: TESIS PLEDR

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

Page 384: TESIS PLEDR

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

Page 385: TESIS PLEDR

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

Page 386: TESIS PLEDR

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

Page 387: TESIS PLEDR

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

Page 388: TESIS PLEDR

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